texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

branch master updated: Update in-source copy of Unicode::EastAsianWidth


From: Patrice Dumas
Subject: branch master updated: Update in-source copy of Unicode::EastAsianWidth to 12.0
Date: Sun, 12 Mar 2023 10:00:17 -0400

This is an automated email from the git hooks/post-receive script.

pertusus pushed a commit to branch master
in repository texinfo.

The following commit(s) were added to refs/heads/master by this push:
     new 1ba935d4be Update in-source copy of Unicode::EastAsianWidth to 12.0
1ba935d4be is described below

commit 1ba935d4be755bae67cf65145badacf70b70447c
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Sun Mar 12 15:00:04 2023 +0100

    Update in-source copy of Unicode::EastAsianWidth to 12.0
---
 ChangeLog                                          |    4 +
 tp/maintain/lib/Unicode-EastAsianWidth/Changes     |   28 +
 tp/maintain/lib/Unicode-EastAsianWidth/MANIFEST    |    8 +
 tp/maintain/lib/Unicode-EastAsianWidth/META.yml    |   39 +-
 tp/maintain/lib/Unicode-EastAsianWidth/Makefile.PL |   18 +-
 tp/maintain/lib/Unicode-EastAsianWidth/README      |   73 +-
 tp/maintain/lib/Unicode-EastAsianWidth/README.mkdn |   68 +
 tp/maintain/lib/Unicode-EastAsianWidth/SIGNATURE   |   59 +-
 .../Unicode-EastAsianWidth/inc/Module/Install.pm   |  574 ++++--
 .../inc/Module/Install/Base.pm                     |   65 +-
 .../inc/Module/Install/Can.pm                      |  109 +-
 .../inc/Module/Install/Fetch.pm                    |   12 +-
 .../inc/Module/Install/GithubMeta.pm               |   53 +
 .../inc/Module/Install/Makefile.pm                 |  293 ++-
 .../inc/Module/Install/ManifestSkip.pm             |   32 +
 .../inc/Module/Install/Metadata.pm                 |  904 ++++++---
 .../inc/Module/Install/Package.pm                  |  323 ++++
 .../inc/Module/Install/ReadmeFromPod.pm            |  184 ++
 .../inc/Module/Install/ReadmeMarkdownFromPod.pm    |   68 +
 .../inc/Module/Install/Win32.pm                    |   15 +-
 .../inc/Module/Install/WriteAll.pm                 |   80 +-
 .../Unicode-EastAsianWidth/inc/Module/Package.pm   |   71 +
 .../lib/Unicode-EastAsianWidth/inc/Pod/Markdown.pm | 1186 ++++++++++++
 .../lib/Unicode/EastAsianWidth.pm                  | 1931 ++++++++++++++++++--
 tp/maintain/lib/Unicode-EastAsianWidth/t/1-basic.t |    4 +-
 25 files changed, 5400 insertions(+), 801 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f04dd0e1d1..e1c66e9e2c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2023-03-12  Patrice Dumas  <pertusus@free.fr>
+
+       Update in-source copy of Unicode::EastAsianWidth to 12.0
+
 2023-03-12  Patrice Dumas  <pertusus@free.fr>
 
        * tp/Texinfo/Convert/HTML.pm (%default_special_element_info): change
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/Changes 
b/tp/maintain/lib/Unicode-EastAsianWidth/Changes
index 9136967ecf..9155881020 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/Changes
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/Changes
@@ -1,3 +1,31 @@
+[Changes for 12.0 - 2018-11-24]
+
+* Update to Unicode v12.0.0.
+
+[Changes for 1.40 - 2018-11-24]
+
+* Fix installation compatibility with Perl 5.26+.
+* Update to Unicode v11.0.0.
+
+[Changes for 1.33 - 2012-10-21]
+
+* Rebuild with up-to-date Module::Install 1.06; no functional changes.
+
+[Changes for 1.32 - 2012-05-13]
+
+* Correct unit tests for Perl 5.16+.
+
+[Changes for 1.31 - 2012-05-13]
+
+* Clarify that $EastAsianWidth needs to be set at BEGIN time in
+  POD and tests for Perl 5.16+; no functional changes.
+
+* LICENSING CHANGE: This compilation and all individual files in it
+  are now under the nullary CC0 1.0 Universal terms:
+
+  To the extent possible under law, 唐鳳 has waived all copyright and
+  related or neighboring rights to selfvars.
+
 [Changes for 1.30 - 2007-02-08]
 
 * Added miss-parsed lines of ranges in EastAsianWidth.txt, affecting
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/MANIFEST 
b/tp/maintain/lib/Unicode-EastAsianWidth/MANIFEST
index bce134cec3..0849f4df70 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/MANIFEST
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/MANIFEST
@@ -3,15 +3,23 @@ inc/Module/Install.pm
 inc/Module/Install/Base.pm
 inc/Module/Install/Can.pm
 inc/Module/Install/Fetch.pm
+inc/Module/Install/GithubMeta.pm
 inc/Module/Install/Makefile.pm
+inc/Module/Install/ManifestSkip.pm
 inc/Module/Install/Metadata.pm
+inc/Module/Install/Package.pm
+inc/Module/Install/ReadmeFromPod.pm
+inc/Module/Install/ReadmeMarkdownFromPod.pm
 inc/Module/Install/Win32.pm
 inc/Module/Install/WriteAll.pm
+inc/Module/Package.pm
+inc/Pod/Markdown.pm
 lib/Unicode/EastAsianWidth.pm
 Makefile.PL
 MANIFEST                       This list of files
 META.yml                       Module meta-data (added by MakeMaker)
 README
+README.mkdn
 SIGNATURE
 t/0-signature.t
 t/1-basic.t
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/META.yml 
b/tp/maintain/lib/Unicode-EastAsianWidth/META.yml
index e3e813cbb1..f44eda0142 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/META.yml
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/META.yml
@@ -1,22 +1,27 @@
---- 
-abstract: East Asian Width properties
-author: 
-  - Audrey Tang <cpan@audreyt.org>
+---
+abstract: 'East Asian Width properties'
+author:
+  - 'Audrey Tang <cpan@audreyt.org>'
+build_requires:
+  ExtUtils::MakeMaker: 6.59
+configure_requires:
+  ExtUtils::MakeMaker: 6.59
 distribution_type: module
-generated_by: Module::Install version 0.68
-license: mit
-meta-spec: 
-  url: http://module-build.sourceforge.net/META-spec-v1.3.html
-  version: 1.3
+dynamic_config: 1
+generated_by: 'Module::Install version 1.19'
+license: cc0
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.4.html
+  version: 1.4
+module_name: Unicode::EastAsianWidth
 name: Unicode-EastAsianWidth
-no_index: 
-  directory: 
+no_index:
+  directory:
     - inc
     - t
-provides: 
-  Unicode::EastAsianWidth: 
-    file: lib/Unicode/EastAsianWidth.pm
-    version: 1.30
-requires: 
+requires:
   perl: 5.6.0
-version: 1.30
+resources:
+  homepage: https://github.com/audreyt/Unicode-EastAsianWidth/
+  repository: git://github.com/audreyt/Unicode-EastAsianWidth.git
+version: '12.0'
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/Makefile.PL 
b/tp/maintain/lib/Unicode-EastAsianWidth/Makefile.PL
index 7e87b53bfa..bbac13ac87 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/Makefile.PL
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/Makefile.PL
@@ -1,18 +1,16 @@
-#!/usr/bin/perl
-
+#!/usr/bin/env perl
 use strict;
-use inc::Module::Install;
+use warnings;
 
-my $DefaultVersion  = 'v5.0.0';
-my $DefaultDate     = '2006-02-15';
+use lib 'inc/';
+use Module::Package 'Au:dry 1';
 
-_build_pm();
+license('cc0');
 
-name        'Unicode-EastAsianWidth';
-all_from    'lib/Unicode/EastAsianWidth.pm';
+my $DefaultVersion  = 'v12.0.0';
+my $DefaultDate     = '2019-01-21';
 
-auto_provides;
-sign; WriteAll;
+_build_pm();
 
 sub _build_pm {
     my $file;
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/README 
b/tp/maintain/lib/Unicode-EastAsianWidth/README
index b85c3d10c0..54803585c7 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/README
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/README
@@ -1,26 +1,25 @@
 NAME
     Unicode::EastAsianWidth - East Asian Width properties
 
-VERSION
-    This document describes version 1.10 of Unicode::EastAsianWidth,
-    released October 14, 2007.
-
 SYNOPSIS
         use Unicode::EastAsianWidth;
 
-        $_ = chr(0x2588); # FULL BLOCK, an ambiguous-width character
+        $_ = chr(0x2010); # HYPHEN, an ambiguous-width character
+
+        /\p{InEastAsianAmbiguous}/; # True
+        /\p{InFullwidth}/;          # False
 
-        /\p{InEastAsianAmbiguous}/; # true
-        /\p{InFullwidth}/;          # false
+    To mark ambiguous-width characters as InFullwidth:
 
-        {
-            local $Unicode::EastAsianWidth::EastAsian = 1;
-            /\p{InFullwidth}/;      # true; only works on perl 5.8+
-        }
+        BEGIN { $Unicode::EastAsianWidth::EastAsian = 1; }
+        use Unicode::EastAsianWidth;
+
+        $_ = chr(0x2010); # HYPHEN, an ambiguous-width character
+        /\p{InFullwidth}/;          # True
 
 DESCRIPTION
-    This module provide user-defined Unicode properties that deal with East
-    Asian characters' width status, as specified in
+    This module provide user-defined Unicode properties that deal with width
+    status of East Asian characters, as specified in
     <http://www.unicode.org/unicode/reports/tr11/>.
 
     It exports the following functions to the caller's scope, to be used by
@@ -34,44 +33,30 @@ DESCRIPTION
 
     *Ambiguous* characters are treated by default as part of "InHalfwidth",
     but you can modify this behaviour by assigning a true value to
-    $Unicode::EastAsianWidth::EastAsian.
-
-CAVEATS
-    Setting $Unicode::EastAsianWidth::EastAsian at run-time only works on
-    Perl version 5.8 or above. Perl 5.6 users must use a BEGIN block to set
-    it before the "use" statement:
+    $Unicode::EastAsianWidth::EastAsian at compile time within a "BEGIN"
+    block before loading this module:
 
-        BEGIN { $Unicode::EastAsianWidth::EastAsian = 1 }
+        BEGIN { $Unicode::EastAsianWidth::EastAsian = 1; }
         use Unicode::EastAsianWidth;
 
+    Setting $Unicode::EastAsianWidth::EastAsian at run-time used to work on
+    Perl versions between 5.8 and 5.14 due to an implementation detail, but
+    it will no longer work on Perl 5.16 and later versions, and hence is not
+    recommended.
+
 SEE ALSO
     perlunicode, <http://www.unicode.org/unicode/reports/tr11/>
 
 AUTHORS
     Audrey Tang <cpan@audreyt.org>
 
-COPYRIGHT
-    Copyright 2002, 2003, 2007 by Audrey Tang <cpan@audreyt.org>.
-
-    This software is released under the MIT license cited below.
-
-  The "MIT" License
-    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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+LICENSE
+    This work is under the CC0 1.0 Universal license.
+
+    To the extent possible under law, 唐鳳 has waived all copyright and
+    related or neighboring rights to Unicode-EastAsianWidth.
+
+    This work is published from Taiwan.
+
+    <http://creativecommons.org/publicdomain/zero/1.0>
 
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/README.mkdn 
b/tp/maintain/lib/Unicode-EastAsianWidth/README.mkdn
new file mode 100644
index 0000000000..4e9963a6d6
--- /dev/null
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/README.mkdn
@@ -0,0 +1,68 @@
+# NAME
+
+Unicode::EastAsianWidth - East Asian Width properties
+
+# SYNOPSIS
+
+    use Unicode::EastAsianWidth;
+
+    $_ = chr(0x2010); # HYPHEN, an ambiguous-width character
+
+    /\p{InEastAsianAmbiguous}/; # True
+    /\p{InFullwidth}/;          # False
+
+To mark ambiguous-width characters as InFullwidth:
+
+    BEGIN { $Unicode::EastAsianWidth::EastAsian = 1; }
+    use Unicode::EastAsianWidth;
+
+    $_ = chr(0x2010); # HYPHEN, an ambiguous-width character
+    /\p{InFullwidth}/;          # True
+
+# DESCRIPTION
+
+This module provide user-defined Unicode properties that deal with
+width status of East Asian characters, as specified in
+[http://www.unicode.org/unicode/reports/tr11/](http://www.unicode.org/unicode/reports/tr11/).
+
+It exports the following functions to the caller's scope, to be
+used by Perl's Unicode matching system: `InEastAsianFullwidth`,
+`InEastAsianHalfwidth`, `InEastAsianAmbiguous`, `InEastAsianNarrow`
+`InEastAsianWide`, `InEastAsianNeutral`.
+
+In accord to TR11 cited above, two additional context-sensitive properties
+are exported: `InFullwidth` (union of `Fullwidth` and `Wide`) and
+`InHalfwidth` (union of `Halfwidth`, `Narrow` and `Neutral`).
+
+_Ambiguous_ characters are treated by default as part of
+`InHalfwidth`, but you can modify this behaviour by assigning
+a true value to `$Unicode::EastAsianWidth::EastAsian` at compile time
+within a `BEGIN` block before loading this module:
+
+    BEGIN { $Unicode::EastAsianWidth::EastAsian = 1; }
+    use Unicode::EastAsianWidth;
+
+Setting `$Unicode::EastAsianWidth::EastAsian` at run-time used to
+work on Perl versions between 5.8 and 5.14 due to an implementation
+detail, but it will no longer work on Perl 5.16 and later versions,
+and hence is not recommended.
+
+# SEE ALSO
+
+[perlunicode](https://metacpan.org/pod/perlunicode),
+[http://www.unicode.org/unicode/reports/tr11/](http://www.unicode.org/unicode/reports/tr11/)
+
+# AUTHORS
+
+Audrey Tang <cpan@audreyt.org>
+
+# LICENSE
+
+This work is under the **CC0 1.0 Universal** license.
+
+To the extent possible under law, 唐鳳 has waived all copyright and related
+or neighboring rights to Unicode-EastAsianWidth.
+
+This work is published from Taiwan.
+
+[http://creativecommons.org/publicdomain/zero/1.0](http://creativecommons.org/publicdomain/zero/1.0)
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/SIGNATURE 
b/tp/maintain/lib/Unicode-EastAsianWidth/SIGNATURE
index 179cff3eb1..f57792e4c5 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/SIGNATURE
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/SIGNATURE
@@ -1,5 +1,5 @@
 This file contains message digests of all files listed in MANIFEST,
-signed via the Module::Signature module, version 0.55.
+signed via the Module::Signature module, version 0.82.
 
 To verify the content in this distribution, first make sure you have
 Module::Signature installed, then type:
@@ -12,28 +12,43 @@ the distribution may already have been compromised, and you 
should
 not run its Makefile.PL or Build.PL.
 
 -----BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
+Hash: SHA256
 
-SHA1 aaaba4c041295376ffff8b95315922f8157b46f6 Changes
-SHA1 8b1030f09754711d705c19bba6d284160f2eed74 MANIFEST
-SHA1 b3e0235b6b9b00ad8b3a486b32b8b5bf46846162 META.yml
-SHA1 d82aed2fe2d5e2fcaa6e98c84a5498ee1d2360dc Makefile.PL
-SHA1 a38eb3d89d252a5e07bb7a175a0428173b5483b9 README
-SHA1 7e2cfa1b9efe0d502ee57717649c90ba4bd28ba9 inc/Module/Install.pm
-SHA1 6e1392d80a0f239eecd5664f7f21f922cedb9329 inc/Module/Install/Base.pm
-SHA1 f69417fe831d9cc22a78f00a617afadceade4d81 inc/Module/Install/Can.pm
-SHA1 c61d02895330310048bf388881b5e2e064031561 inc/Module/Install/Fetch.pm
-SHA1 54fcbed19232ec959bb17cfb4410599afc7f0779 inc/Module/Install/Makefile.pm
-SHA1 7d3be9b158e37b2b2c22084740099955623b1d56 inc/Module/Install/Metadata.pm
-SHA1 0a8b66180229ba2f9deaea1fedd0aacf7a7ace6b inc/Module/Install/Win32.pm
-SHA1 d3352eb33fe43a5f3ead513f645224fe34d73bc9 inc/Module/Install/WriteAll.pm
-SHA1 fa70cb9ca3126c37c52a161d89a5399ae7c752e0 lib/Unicode/EastAsianWidth.pm
-SHA1 41afe2c04bb573b40e283e2b210ed70a47a3f8ba t/0-signature.t
-SHA1 5bbe3de2b00d4803e83d780d3494566dc936b941 t/1-basic.t
+SHA256 cc27c66733ed916e20e35fd4874ade3fcab89f661a1883575fa49f8b9da64983 Changes
+SHA256 40dc69d258885965f01620b8c76e3e0537b8e01f337386fbefb58c0e06325c2c 
MANIFEST
+SHA256 f81a035e6b2ac34012ff69cc787681c31b9f6565b26de5459f3827270e538321 
META.yml
+SHA256 3d648a03f5f451656a565009195112ab7e0c28e305fea21bfe1fd45f5c53d74e 
Makefile.PL
+SHA256 96adf85de9cdf573b8b55a7606c07c2373f70e16e04f31b8abe57d0ca433a7e1 README
+SHA256 158c303f185a8889d2745806781216fbd6c1cfc60123800afb2018026e8cb985 
README.mkdn
+SHA256 67d139199c03b8bf8447a5a62f0d0b6dc1bd5bf6dbe04de6d21998c577823ed6 
inc/Module/Install.pm
+SHA256 6ebcc53a161dd5dc0aae69e4704575f2b00181901d768a82e26722a309cfdbe4 
inc/Module/Install/Base.pm
+SHA256 d3f8c839d03fd21c197d05362dbb277cd7cadb15da6390d124b61e851f15146e 
inc/Module/Install/Can.pm
+SHA256 e9e72e18921c10c87bc4ea4c20af83e52015b9f5775d00ac64073042403717ca 
inc/Module/Install/Fetch.pm
+SHA256 908721854c32d0a71d1a9034b0f9a9aa1ea69758808fb9c4388fe582785ba491 
inc/Module/Install/GithubMeta.pm
+SHA256 a7a681bf2c9eee58a372cb642ffe42b0301d1200432ba8de9f7791cd1ecc9827 
inc/Module/Install/Makefile.pm
+SHA256 edd6aad6f03c666da6d7842b958254b42c1931628e1f8ba2cd9af7686e36ce54 
inc/Module/Install/ManifestSkip.pm
+SHA256 aa887fa65a5eb6bbd1805706ce298b3f3cd55b353ecfd37aa7d35ae419331a49 
inc/Module/Install/Metadata.pm
+SHA256 4f3968e504200c6456f6dd41d3cd24e5366a4848042dc2cb7c346c3165ef3e25 
inc/Module/Install/Package.pm
+SHA256 53825bc78e4c910b888160bc148c8bc211be58e02b99c8edcbf4854f95faa049 
inc/Module/Install/ReadmeFromPod.pm
+SHA256 9995feecad9735ac6205d348cbf5ea4af6d6ba6cbe72edb03ee69528cbc70bc6 
inc/Module/Install/ReadmeMarkdownFromPod.pm
+SHA256 26b166ff62aacdb55317d1659f160aa4935097eea9810ea980e6d747206b5dc0 
inc/Module/Install/Win32.pm
+SHA256 5f73a6851a91ea44e65b924f918743ad6e860620ad7a38a39d0295e0c5652a9f 
inc/Module/Install/WriteAll.pm
+SHA256 59d9db60b1bf7e664805b8c573df7a4009b975dd003046468817e44d04847940 
inc/Module/Package.pm
+SHA256 a96da44ed737f718d0be035319669d01173c4418cda3dcf5b520f48f998310f4 
inc/Pod/Markdown.pm
+SHA256 5b16b71e80fe2ade7d6d9c33a01b3735aac4be0c1f87146c585f433174212c4c 
lib/Unicode/EastAsianWidth.pm
+SHA256 6ba3a17d84124456a8c55f0b403861642458bca5f45caeed73055f309d65c3ac 
t/0-signature.t
+SHA256 5db7f4455a06b730962c5a51410fa27313b34129e65f8c05de41af27842663be 
t/1-basic.t
 -----BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.3 (Darwin)
 
-iD8DBQFHrEOQtLPdNzw1AaARAnk/AKCgduldcFW25n64Z9tNtMAWrK0frgCfQlSe
-JtXwxVxce0N08qNUIgo8HPs=
-=ULLQ
+iQGzBAEBCAAdFiEE8/4umVyeYRTFU5r09ePPSwnTf6gFAl1sw8AACgkQ9ePPSwnT
+f6jPYAv/V6WZKQJBWHWUcSBITsIU1cIKpqEAOJlvEGKrWkPPY9y9O0IQLG08pypw
+0RG6BZynPzT41127jkBzRoL+0i54qA6sdqmCTLEL9BzI1BueznI1UGXE5lG6Jsu6
+Z6YX1JdUdNl9Hyk1D6Z94JjZMu/P5BFSIaMwq3zLYt+ZfSSQMuKca3nCrNao1Ud8
+IQcfD3x3dQmtJBidPSMKDDbk1Y0lpInAAMwdFXS+Y+EkB+i0NbP5rMWAk+qTrdkg
+ip+s366eXyfpdRw2DGtactgg8D0WXJzZs/WQDJzMbgokegP9NsI5njZdrNcGUmSy
+PmPx4BSKM110oHS0sjj/yBD35LfNTNRJQsYI7QocnZSyktkdoP0eh427dSW3JMu9
+JzhChO/uM1UAdLSTe/Y9uWkjTnWWM7N4x9RD5IlyTvcBzhda5sqOnaJuyYOLrpK3
+fqf0chqLyFbX5OVfiqBO4WaGKhE6gisr0TI8GCG4lIvf4OzwU9ComgowoPs6Cv/V
+40tGY3BZ
+=Fkb+
 -----END PGP SIGNATURE-----
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install.pm
index 89a86534d2..7ba98c2872 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install.pm
@@ -17,163 +17,251 @@ package Module::Install;
 #     3. The ./inc/ version of Module::Install loads
 # }
 
-use 5.004;
+use 5.006;
 use strict 'vars';
+use Cwd        ();
+use File::Find ();
+use File::Path ();
 
-use vars qw{$VERSION};
+use vars qw{$VERSION $MAIN};
 BEGIN {
-    # All Module::Install core packages now require synchronised versions.
-    # This will be used to ensure we don't accidentally load old or
-    # different versions of modules.
-    # This is not enforced yet, but will be some time in the next few
-    # releases once we can make sure it won't clash with custom
-    # Module::Install extensions.
-    $VERSION = '0.68';
+       # All Module::Install core packages now require synchronised versions.
+       # This will be used to ensure we don't accidentally load old or
+       # different versions of modules.
+       # This is not enforced yet, but will be some time in the next few
+       # releases once we can make sure it won't clash with custom
+       # Module::Install extensions.
+       $VERSION = '1.19';
+
+       # Storage for the pseudo-singleton
+       $MAIN    = undef;
+
+       *inc::Module::Install::VERSION = *VERSION;
+       @inc::Module::Install::ISA     = __PACKAGE__;
+
 }
 
-# Whether or not inc::Module::Install is actually loaded, the
-# $INC{inc/Module/Install.pm} is what will still get set as long as
-# the caller loaded module this in the documented manner.
-# If not set, the caller may NOT have loaded the bundled version, and thus
-# they may not have a MI version that works with the Makefile.PL. This would
-# result in false errors or unexpected behaviour. And we don't want that.
-my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm';
-unless ( $INC{$file} ) {
-    die <<"END_DIE";
+sub import {
+       my $class = shift;
+       my $self  = $class->new(@_);
+       my $who   = $self->_caller;
+
+       #-------------------------------------------------------------
+       # all of the following checks should be included in import(),
+       # to allow "eval 'require Module::Install; 1' to test
+       # installation of Module::Install. (RT #51267)
+       #-------------------------------------------------------------
+
+       # Whether or not inc::Module::Install is actually loaded, the
+       # $INC{inc/Module/Install.pm} is what will still get set as long as
+       # the caller loaded module this in the documented manner.
+       # If not set, the caller may NOT have loaded the bundled version, and 
thus
+       # they may not have a MI version that works with the Makefile.PL. This 
would
+       # result in false errors or unexpected behaviour. And we don't want 
that.
+       my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm';
+       unless ( $INC{$file} ) { die <<"END_DIE" }
+
 Please invoke ${\__PACKAGE__} with:
 
-    use inc::${\__PACKAGE__};
+       use inc::${\__PACKAGE__};
 
 not:
 
-    use ${\__PACKAGE__};
+       use ${\__PACKAGE__};
 
 END_DIE
-}
 
-# If the script that is loading Module::Install is from the future,
-# then make will detect this and cause it to re-run over and over
-# again. This is bad. Rather than taking action to touch it (which
-# is unreliable on some platforms and requires write permissions)
-# for now we should catch this and refuse to run.
-if ( -f $0 and (stat($0))[9] > time ) {
-       die << "END_DIE";
-Your installer $0 has a modification time in the future.
+       # This reportedly fixes a rare Win32 UTC file time issue, but
+       # as this is a non-cross-platform XS module not in the core,
+       # we shouldn't really depend on it. See RT #24194 for detail.
+       # (Also, this module only supports Perl 5.6 and above).
+       eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006;
+
+       # If the script that is loading Module::Install is from the future,
+       # then make will detect this and cause it to re-run over and over
+       # again. This is bad. Rather than taking action to touch it (which
+       # is unreliable on some platforms and requires write permissions)
+       # for now we should catch this and refuse to run.
+       if ( -f $0 ) {
+               my $s = (stat($0))[9];
+
+               # If the modification time is only slightly in the future,
+               # sleep briefly to remove the problem.
+               my $a = $s - time;
+               if ( $a > 0 and $a < 5 ) { sleep 5 }
+
+               # Too far in the future, throw an error.
+               my $t = time;
+               if ( $s > $t ) { die <<"END_DIE" }
+
+Your installer $0 has a modification time in the future ($s > $t).
 
 This is known to create infinite loops in make.
 
 Please correct this, then run $0 again.
 
 END_DIE
-}
+       }
 
-use Cwd        ();
-use File::Find ();
-use File::Path ();
-use FindBin;
 
-*inc::Module::Install::VERSION = *VERSION;
-@inc::Module::Install::ISA     = __PACKAGE__;
+       # Build.PL was formerly supported, but no longer is due to excessive
+       # difficulty in implementing every single feature twice.
+       if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" }
 
-sub autoload {
-    my $self = shift;
-    my $who  = $self->_caller;
-    my $cwd  = Cwd::cwd();
-    my $sym  = "${who}::AUTOLOAD";
-    $sym->{$cwd} = sub {
-        my $pwd = Cwd::cwd();
-        if ( my $code = $sym->{$pwd} ) {
-            # delegate back to parent dirs
-            goto &$code unless $cwd eq $pwd;
-        }
-        $$sym =~ /([^:]+)$/ or die "Cannot autoload $who - $sym";
-        unshift @_, ($self, $1);
-        goto &{$self->can('call')} unless uc($1) eq $1;
-    };
+Module::Install no longer supports Build.PL.
+
+It was impossible to maintain duel backends, and has been deprecated.
+
+Please remove all Build.PL files and only use the Makefile.PL installer.
+
+END_DIE
+
+       #-------------------------------------------------------------
+
+       # To save some more typing in Module::Install installers, every...
+       # use inc::Module::Install
+       # ...also acts as an implicit use strict.
+       $^H |= strict::bits(qw(refs subs vars));
+
+       #-------------------------------------------------------------
+
+       unless ( -f $self->{file} ) {
+               foreach my $key (keys %INC) {
+                       delete $INC{$key} if $key =~ /Module\/Install/;
+               }
+
+               local $^W;
+               require "$self->{path}/$self->{dispatch}.pm";
+               File::Path::mkpath("$self->{prefix}/$self->{author}");
+               $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top 
=> $self );
+               $self->{admin}->init;
+               @_ = ($class, _self => $self);
+               goto &{"$self->{name}::import"};
+       }
+
+       local $^W;
+       *{"${who}::AUTOLOAD"} = $self->autoload;
+       $self->preload;
+
+       # Unregister loader and worker packages so subdirs can use them again
+       delete $INC{'inc/Module/Install.pm'};
+       delete $INC{'Module/Install.pm'};
+
+       # Save to the singleton
+       $MAIN = $self;
+
+       return 1;
 }
 
-sub import {
-    my $class = shift;
-    my $self  = $class->new(@_);
-    my $who   = $self->_caller;
-
-    unless ( -f $self->{file} ) {
-        require "$self->{path}/$self->{dispatch}.pm";
-        File::Path::mkpath("$self->{prefix}/$self->{author}");
-        $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => 
$self );
-        $self->{admin}->init;
-        @_ = ($class, _self => $self);
-        goto &{"$self->{name}::import"};
-    }
-
-    *{"${who}::AUTOLOAD"} = $self->autoload;
-    $self->preload;
-
-    # Unregister loader and worker packages so subdirs can use them again
-    delete $INC{"$self->{file}"};
-    delete $INC{"$self->{path}.pm"};
+sub autoload {
+       my $self = shift;
+       my $who  = $self->_caller;
+       my $cwd  = Cwd::getcwd();
+       my $sym  = "${who}::AUTOLOAD";
+       $sym->{$cwd} = sub {
+               my $pwd = Cwd::getcwd();
+               if ( my $code = $sym->{$pwd} ) {
+                       # Delegate back to parent dirs
+                       goto &$code unless $cwd eq $pwd;
+               }
+               unless ($$sym =~ s/([^:]+)$//) {
+                       # XXX: it looks like we can't retrieve the missing 
function
+                       # via $$sym (usually $main::AUTOLOAD) in this case.
+                       # I'm still wondering if we should slurp Makefile.PL to
+                       # get some context or not ...
+                       my ($package, $file, $line) = caller;
+                       die <<"EOT";
+Unknown function is found at $file line $line.
+Execution of $file aborted due to runtime errors.
+
+If you're a contributor to a project, you may need to install
+some Module::Install extensions from CPAN (or other repository).
+If you're a user of a module, please contact the author.
+EOT
+               }
+               my $method = $1;
+               if ( uc($method) eq $method ) {
+                       # Do nothing
+                       return;
+               } elsif ( $method =~ /^_/ and $self->can($method) ) {
+                       # Dispatch to the root M:I class
+                       return $self->$method(@_);
+               }
+
+               # Dispatch to the appropriate plugin
+               unshift @_, ( $self, $1 );
+               goto &{$self->can('call')};
+       };
 }
 
 sub preload {
-    my ($self) = @_;
-
-    unless ( $self->{extensions} ) {
-        $self->load_extensions(
-            "$self->{prefix}/$self->{path}", $self
-        );
-    }
-
-    my @exts = @{$self->{extensions}};
-    unless ( @exts ) {
-        my $admin = $self->{admin};
-        @exts = $admin->load_all_extensions;
-    }
-
-    my %seen;
-    foreach my $obj ( @exts ) {
-        while (my ($method, $glob) = each %{ref($obj) . '::'}) {
-            next unless $obj->can($method);
-            next if $method =~ /^_/;
-            next if $method eq uc($method);
-            $seen{$method}++;
-        }
-    }
-
-    my $who = $self->_caller;
-    foreach my $name ( sort keys %seen ) {
-        *{"${who}::$name"} = sub {
-            ${"${who}::AUTOLOAD"} = "${who}::$name";
-            goto &{"${who}::AUTOLOAD"};
-        };
-    }
+       my $self = shift;
+       unless ( $self->{extensions} ) {
+               $self->load_extensions(
+                       "$self->{prefix}/$self->{path}", $self
+               );
+       }
+
+       my @exts = @{$self->{extensions}};
+       unless ( @exts ) {
+               @exts = $self->{admin}->load_all_extensions;
+       }
+
+       my %seen;
+       foreach my $obj ( @exts ) {
+               while (my ($method, $glob) = each %{ref($obj) . '::'}) {
+                       next unless $obj->can($method);
+                       next if $method =~ /^_/;
+                       next if $method eq uc($method);
+                       $seen{$method}++;
+               }
+       }
+
+       my $who = $self->_caller;
+       foreach my $name ( sort keys %seen ) {
+               local $^W;
+               *{"${who}::$name"} = sub {
+                       ${"${who}::AUTOLOAD"} = "${who}::$name";
+                       goto &{"${who}::AUTOLOAD"};
+               };
+       }
 }
 
 sub new {
-    my ($class, %args) = @_;
-
-    # ignore the prefix on extension modules built from top level.
-    my $base_path = Cwd::abs_path($FindBin::Bin);
-    unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) {
-        delete $args{prefix};
-    }
-
-    return $args{_self} if $args{_self};
-
-    $args{dispatch} ||= 'Admin';
-    $args{prefix}   ||= 'inc';
-    $args{author}   ||= ($^O eq 'VMS' ? '_author' : '.author');
-    $args{bundle}   ||= 'inc/BUNDLES';
-    $args{base}     ||= $base_path;
-    $class =~ s/^\Q$args{prefix}\E:://;
-    $args{name}     ||= $class;
-    $args{version}  ||= $class->VERSION;
-    unless ( $args{path} ) {
-        $args{path}  = $args{name};
-        $args{path}  =~ s!::!/!g;
-    }
-    $args{file}     ||= "$args{base}/$args{prefix}/$args{path}.pm";
-
-    bless( \%args, $class );
+       my ($class, %args) = @_;
+
+       delete $INC{'FindBin.pm'};
+       {
+               # to suppress the redefine warning
+               local $SIG{__WARN__} = sub {};
+               require FindBin;
+       }
+
+       # ignore the prefix on extension modules built from top level.
+       my $base_path = Cwd::abs_path($FindBin::Bin);
+       unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) {
+               delete $args{prefix};
+       }
+       return $args{_self} if $args{_self};
+
+       $base_path = VMS::Filespec::unixify($base_path) if $^O eq 'VMS';
+
+       $args{dispatch} ||= 'Admin';
+       $args{prefix}   ||= 'inc';
+       $args{author}   ||= ($^O eq 'VMS' ? '_author' : '.author');
+       $args{bundle}   ||= 'inc/BUNDLES';
+       $args{base}     ||= $base_path;
+       $class =~ s/^\Q$args{prefix}\E:://;
+       $args{name}     ||= $class;
+       $args{version}  ||= $class->VERSION;
+       unless ( $args{path} ) {
+               $args{path}  = $args{name};
+               $args{path}  =~ s!::!/!g;
+       }
+       $args{file}     ||= "$args{base}/$args{prefix}/$args{path}.pm";
+       $args{wrote}      = 0;
+
+       bless( \%args, $class );
 }
 
 sub call {
@@ -184,98 +272,180 @@ sub call {
 }
 
 sub load {
-    my ($self, $method) = @_;
+       my ($self, $method) = @_;
 
-    $self->load_extensions(
-        "$self->{prefix}/$self->{path}", $self
-    ) unless $self->{extensions};
+       $self->load_extensions(
+               "$self->{prefix}/$self->{path}", $self
+       ) unless $self->{extensions};
 
-    foreach my $obj (@{$self->{extensions}}) {
-        return $obj if $obj->can($method);
-    }
+       foreach my $obj (@{$self->{extensions}}) {
+               return $obj if $obj->can($method);
+       }
 
-    my $admin = $self->{admin} or die <<"END_DIE";
+       my $admin = $self->{admin} or die <<"END_DIE";
 The '$method' method does not exist in the '$self->{prefix}' path!
 Please remove the '$self->{prefix}' directory and run $0 again to load it.
 END_DIE
 
-    my $obj = $admin->load($method, 1);
-    push @{$self->{extensions}}, $obj;
+       my $obj = $admin->load($method, 1);
+       push @{$self->{extensions}}, $obj;
 
-    $obj;
+       $obj;
 }
 
 sub load_extensions {
-    my ($self, $path, $top) = @_;
-
-    unless ( grep { lc $_ eq lc $self->{prefix} } @INC ) {
-        unshift @INC, $self->{prefix};
-    }
-
-    foreach my $rv ( $self->find_extensions($path) ) {
-        my ($file, $pkg) = @{$rv};
-        next if $self->{pathnames}{$pkg};
-
-        local $@;
-        my $new = eval { require $file; $pkg->can('new') };
-        unless ( $new ) {
-            warn $@ if $@;
-            next;
-        }
-        $self->{pathnames}{$pkg} = delete $INC{$file};
-        push @{$self->{extensions}}, &{$new}($pkg, _top => $top );
-    }
-
-    $self->{extensions} ||= [];
+       my ($self, $path, $top) = @_;
+
+       my $should_reload = 0;
+       unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) {
+               unshift @INC, $self->{prefix};
+               $should_reload = 1;
+       }
+
+       foreach my $rv ( $self->find_extensions($path) ) {
+               my ($file, $pkg) = @{$rv};
+               next if $self->{pathnames}{$pkg};
+
+               local $@;
+               my $new = eval { local $^W; require $file; $pkg->can('new') };
+               unless ( $new ) {
+                       warn $@ if $@;
+                       next;
+               }
+               $self->{pathnames}{$pkg} =
+                       $should_reload ? delete $INC{$file} : $INC{$file};
+               push @{$self->{extensions}}, &{$new}($pkg, _top => $top );
+       }
+
+       $self->{extensions} ||= [];
 }
 
 sub find_extensions {
-    my ($self, $path) = @_;
-
-    my @found;
-    File::Find::find( sub {
-        my $file = $File::Find::name;
-        return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is;
-        my $subpath = $1;
-        return if lc($subpath) eq lc($self->{dispatch});
-
-        $file = "$self->{path}/$subpath.pm";
-        my $pkg = "$self->{name}::$subpath";
-        $pkg =~ s!/!::!g;
-
-        # If we have a mixed-case package name, assume case has been preserved
-        # correctly.  Otherwise, root through the file to locate the 
case-preserved
-        # version of the package name.
-        if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) {
-            open PKGFILE, "<$subpath.pm" or die "find_extensions: Can't open 
$subpath.pm: $!";
-            my $in_pod = 0;
-            while ( <PKGFILE> ) {
-                $in_pod = 1 if /^=\w/;
-                $in_pod = 0 if /^=cut/;
-                next if ($in_pod || /^=cut/);  # skip pod text
-                next if /^\s*#/;               # and comments
-                if ( m/^\s*package\s+($pkg)\s*;/i ) {
-                    $pkg = $1;
-                    last;
-                }
-            }
-            close PKGFILE;
-        }
-
-        push @found, [ $file, $pkg ];
-    }, $path ) if -d $path;
-
-    @found;
+       my ($self, $path) = @_;
+
+       my @found;
+       File::Find::find( {no_chdir => 1, wanted => sub {
+               my $file = $File::Find::name;
+               return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is;
+               my $subpath = $1;
+               return if lc($subpath) eq lc($self->{dispatch});
+
+               $file = "$self->{path}/$subpath.pm";
+               my $pkg = "$self->{name}::$subpath";
+               $pkg =~ s!/!::!g;
+
+               # If we have a mixed-case package name, assume case has been 
preserved
+               # correctly.  Otherwise, root through the file to locate the 
case-preserved
+               # version of the package name.
+               if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) {
+                       my $content = Module::Install::_read($File::Find::name);
+                       my $in_pod  = 0;
+                       foreach ( split /\n/, $content ) {
+                               $in_pod = 1 if /^=\w/;
+                               $in_pod = 0 if /^=cut/;
+                               next if ($in_pod || /^=cut/);  # skip pod text
+                               next if /^\s*#/;               # and comments
+                               if ( m/^\s*package\s+($pkg)\s*;/i ) {
+                                       $pkg = $1;
+                                       last;
+                               }
+                       }
+               }
+
+               push @found, [ $file, $pkg ];
+       }}, $path ) if -d $path;
+
+       @found;
 }
 
+
+
+
+
+#####################################################################
+# Common Utility Functions
+
 sub _caller {
-    my $depth = 0;
-    my $call  = caller($depth);
-    while ( $call eq __PACKAGE__ ) {
-        $depth++;
-        $call = caller($depth);
-    }
-    return $call;
+       my $depth = 0;
+       my $call  = caller($depth);
+       while ( $call eq __PACKAGE__ ) {
+               $depth++;
+               $call = caller($depth);
+       }
+       return $call;
+}
+
+sub _read {
+       local *FH;
+       open( FH, '<', $_[0] ) or die "open($_[0]): $!";
+       binmode FH;
+       my $string = do { local $/; <FH> };
+       close FH or die "close($_[0]): $!";
+       return $string;
+}
+
+sub _readperl {
+       my $string = Module::Install::_read($_[0]);
+       $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg;
+       $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s;
+       $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg;
+       return $string;
+}
+
+sub _readpod {
+       my $string = Module::Install::_read($_[0]);
+       $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg;
+       return $string if $_[0] =~ /\.pod\z/;
+       $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg;
+       $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg;
+       $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg;
+       $string =~ s/^\n+//s;
+       return $string;
+}
+
+sub _write {
+       local *FH;
+       open( FH, '>', $_[0] ) or die "open($_[0]): $!";
+       binmode FH;
+       foreach ( 1 .. $#_ ) {
+               print FH $_[$_] or die "print($_[0]): $!";
+       }
+       close FH or die "close($_[0]): $!";
+}
+
+# _version is for processing module versions (eg, 1.03_05) not
+# Perl versions (eg, 5.8.1).
+sub _version {
+       my $s = shift || 0;
+       my $d =()= $s =~ /(\.)/g;
+       if ( $d >= 2 ) {
+               # Normalise multipart versions
+               $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg;
+       }
+       $s =~ s/^(\d+)\.?//;
+       my $l = $1 || 0;
+       my @v = map {
+               $_ . '0' x (3 - length $_)
+       } $s =~ /(\d{1,3})\D?/g;
+       $l = $l . '.' . join '', @v if @v;
+       return $l + 0;
+}
+
+sub _cmp {
+       _version($_[1]) <=> _version($_[2]);
+}
+
+# Cloned from Params::Util::_CLASS
+sub _CLASS {
+       (
+               defined $_[0]
+               and
+               ! ref $_[0]
+               and
+               $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s
+       ) ? $_[0] : undef;
 }
 
 1;
+
+# Copyright 2008 - 2012 Adam Kennedy.
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Base.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Base.pm
index 49dfde6b85..9fa42c2e40 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Base.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Base.pm
@@ -1,7 +1,11 @@
 #line 1
 package Module::Install::Base;
 
-$VERSION = '0.68';
+use strict 'vars';
+use vars qw{$VERSION};
+BEGIN {
+       $VERSION = '1.19';
+}
 
 # Suspend handler for "redefined" warnings
 BEGIN {
@@ -9,52 +13,61 @@ BEGIN {
        $SIG{__WARN__} = sub { $w };
 }
 
-### This is the ONLY module that shouldn't have strict on
-# use strict;
-
-#line 41
+#line 42
 
 sub new {
-    my ($class, %args) = @_;
-
-    foreach my $method ( qw(call load) ) {
-        *{"$class\::$method"} = sub {
-            shift()->_top->$method(@_);
-        } unless defined &{"$class\::$method"};
-    }
-
-    bless( \%args, $class );
+       my $class = shift;
+       unless ( defined &{"${class}::call"} ) {
+               *{"${class}::call"} = sub { shift->_top->call(@_) };
+       }
+       unless ( defined &{"${class}::load"} ) {
+               *{"${class}::load"} = sub { shift->_top->load(@_) };
+       }
+       bless { @_ }, $class;
 }
 
 #line 61
 
 sub AUTOLOAD {
-    my $self = shift;
-    local $@;
-    my $autoload = eval { $self->_top->autoload } or return;
-    goto &$autoload;
+       local $@;
+       my $func = eval { shift->_top->autoload } or return;
+       goto &$func;
 }
 
-#line 76
+#line 75
 
-sub _top { $_[0]->{_top} }
+sub _top {
+       $_[0]->{_top};
+}
 
-#line 89
+#line 90
 
 sub admin {
-    $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new;
+       $_[0]->_top->{admin}
+       or
+       Module::Install::Base::FakeAdmin->new;
 }
 
+#line 106
+
 sub is_admin {
-    $_[0]->admin->VERSION;
+       ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin');
 }
 
 sub DESTROY {}
 
 package Module::Install::Base::FakeAdmin;
 
-my $Fake;
-sub new { $Fake ||= bless(\@_, $_[0]) }
+use vars qw{$VERSION};
+BEGIN {
+       $VERSION = $Module::Install::Base::VERSION;
+}
+
+my $fake;
+
+sub new {
+       $fake ||= bless(\@_, $_[0]);
+}
 
 sub AUTOLOAD {}
 
@@ -67,4 +80,4 @@ BEGIN {
 
 1;
 
-#line 138
+#line 159
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Can.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Can.pm
index ec66fdb7df..d65c753872 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Can.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Can.pm
@@ -2,18 +2,15 @@
 package Module::Install::Can;
 
 use strict;
-use Module::Install::Base;
-use Config ();
-### This adds a 5.005 Perl version dependency.
-### This is a bug and will be fixed.
-use File::Spec ();
-use ExtUtils::MakeMaker ();
-
-use vars qw{$VERSION $ISCORE @ISA};
+use Config                ();
+use ExtUtils::MakeMaker   ();
+use Module::Install::Base ();
+
+use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-       $VERSION = '0.68';
+       $VERSION = '1.19';
+       @ISA     = 'Module::Install::Base';
        $ISCORE  = 1;
-       @ISA     = qw{Module::Install::Base};
 }
 
 # check if we can load some module
@@ -31,7 +28,7 @@ sub can_use {
        eval { require $mod; $pkg->VERSION($ver || 0); 1 };
 }
 
-# check if we can run some command
+# Check if we can run some command
 sub can_run {
        my ($self, $cmd) = @_;
 
@@ -39,16 +36,100 @@ sub can_run {
        return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
 
        for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
-               my $abs = File::Spec->catfile($dir, $_[1]);
+               next if $dir eq '';
+               require File::Spec;
+               my $abs = File::Spec->catfile($dir, $cmd);
                return $abs if (-x $abs or $abs = MM->maybe_command($abs));
        }
 
        return;
 }
 
-# can we locate a (the) C compiler
+# Can our C compiler environment build XS files
+sub can_xs {
+       my $self = shift;
+
+       # Ensure we have the CBuilder module
+       $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 );
+
+       # Do we have the configure_requires checker?
+       local $@;
+       eval "require ExtUtils::CBuilder;";
+       if ( $@ ) {
+               # They don't obey configure_requires, so it is
+               # someone old and delicate. Try to avoid hurting
+               # them by falling back to an older simpler test.
+               return $self->can_cc();
+       }
+
+       # Do we have a working C compiler
+       my $builder = ExtUtils::CBuilder->new(
+               quiet => 1,
+       );
+       unless ( $builder->have_compiler ) {
+               # No working C compiler
+               return 0;
+       }
+
+       # Write a C file representative of what XS becomes
+       require File::Temp;
+       my ( $FH, $tmpfile ) = File::Temp::tempfile(
+               "compilexs-XXXXX",
+               SUFFIX => '.c',
+       );
+       binmode $FH;
+       print $FH <<'END_C';
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+int main(int argc, char **argv) {
+    return 0;
+}
+
+int boot_sanexs() {
+    return 1;
+}
+
+END_C
+       close $FH;
+
+       # Can the C compiler access the same headers XS does
+       my @libs   = ();
+       my $object = undef;
+       eval {
+               local $^W = 0;
+               $object = $builder->compile(
+                       source => $tmpfile,
+               );
+               @libs = $builder->link(
+                       objects     => $object,
+                       module_name => 'sanexs',
+               );
+       };
+       my $result = $@ ? 0 : 1;
+
+       # Clean up all the build files
+       foreach ( $tmpfile, $object, @libs ) {
+               next unless defined $_;
+               1 while unlink;
+       }
+
+       return $result;
+}
+
+# Can we locate a (the) C compiler
 sub can_cc {
        my $self   = shift;
+
+       if ($^O eq 'VMS') {
+               require ExtUtils::CBuilder;
+               my $builder = ExtUtils::CBuilder->new(
+               quiet => 1,
+               );
+               return $builder->have_compiler;
+       }
+
        my @chunks = split(/ /, $Config::Config{cc}) or return;
 
        # $Config{cc} may contain args; try to find out the program part
@@ -79,4 +160,4 @@ if ( $^O eq 'cygwin' ) {
 
 __END__
 
-#line 157
+#line 245
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Fetch.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Fetch.pm
index e0dd6dbc3d..3072b083d4 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Fetch.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Fetch.pm
@@ -2,24 +2,24 @@
 package Module::Install::Fetch;
 
 use strict;
-use Module::Install::Base;
+use Module::Install::Base ();
 
-use vars qw{$VERSION $ISCORE @ISA};
+use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-       $VERSION = '0.68';
+       $VERSION = '1.19';
+       @ISA     = 'Module::Install::Base';
        $ISCORE  = 1;
-       @ISA     = qw{Module::Install::Base};
 }
 
 sub get_file {
     my ($self, %args) = @_;
-    my ($scheme, $host, $path, $file) = 
+    my ($scheme, $host, $path, $file) =
         $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
 
     if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) {
         $args{url} = $args{ftp_url}
             or (warn("LWP support unavailable!\n"), return);
-        ($scheme, $host, $path, $file) = 
+        ($scheme, $host, $path, $file) =
             $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
     }
 
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/GithubMeta.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/GithubMeta.pm
new file mode 100644
index 0000000000..1379e25d24
--- /dev/null
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/GithubMeta.pm
@@ -0,0 +1,53 @@
+#line 1
+package Module::Install::GithubMeta;
+
+use strict;
+use warnings;
+use Cwd;
+use base qw(Module::Install::Base);
+use vars qw($VERSION);
+
+$VERSION = '0.30';
+
+sub githubmeta {
+  my $self = shift;
+  return unless $Module::Install::AUTHOR;
+  return unless _under_git();
+  return unless $self->can_run('git');
+  my $remote = shift || 'origin';
+  local $ENV{LC_ALL}='C';
+  local $ENV{LANG}='C';
+  return unless my ($git_url) = `git remote show -n $remote` =~ /URL: (.*)$/m;
+  return unless $git_url =~ /github\.com/; # Not a Github repository
+  my $http_url = $git_url;
+  $git_url =~ s![\w\-]+\@([^:]+):!git://$1/!;
+  $http_url =~ s![\w\-]+\@([^:]+):!https://$1/!;
+  $http_url =~ s!\.git$!/!;
+  $self->repository( $git_url );
+  $self->homepage( $http_url ) unless $self->homepage();
+  return 1;
+}
+
+sub _under_git {
+  return 1 if -e '.git';
+  my $cwd = getcwd;
+  my $last = $cwd;
+  my $found = 0;
+  while (1) {
+    chdir '..' or last;
+    my $current = getcwd;
+    last if $last eq $current;
+    $last = $current;
+    if ( -e '.git' ) {
+       $found = 1;
+       last;
+    }
+  }
+  chdir $cwd;
+  return $found;
+}
+
+'Github';
+__END__
+
+#line 113
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Makefile.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Makefile.pm
index 17bd8a7a8c..13a4464d11 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Makefile.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Makefile.pm
@@ -2,14 +2,15 @@
 package Module::Install::Makefile;
 
 use strict 'vars';
-use Module::Install::Base;
-use ExtUtils::MakeMaker ();
+use ExtUtils::MakeMaker   ();
+use Module::Install::Base ();
+use Fcntl qw/:flock :seek/;
 
-use vars qw{$VERSION $ISCORE @ISA};
+use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-       $VERSION = '0.68';
+       $VERSION = '1.19';
+       @ISA     = 'Module::Install::Base';
        $ISCORE  = 1;
-       @ISA     = qw{Module::Install::Base};
 }
 
 sub Makefile { $_[0] }
@@ -25,8 +26,8 @@ sub prompt {
                die "Caught an potential prompt infinite loop 
($c[1]|$c[2]|$_[0])";
        }
 
-       # In automated testing, always use defaults
-       if ( $ENV{AUTOMATED_TESTING} and ! $ENV{PERL_MM_USE_DEFAULT} ) {
+       # In automated testing or non-interactive session, always use defaults
+       if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! 
$ENV{PERL_MM_USE_DEFAULT} ) {
                local $ENV{PERL_MM_USE_DEFAULT} = 1;
                goto &ExtUtils::MakeMaker::prompt;
        } else {
@@ -34,21 +35,112 @@ sub prompt {
        }
 }
 
+# Store a cleaned up version of the MakeMaker version,
+# since we need to behave differently in a variety of
+# ways based on the MM version.
+my $makemaker = eval $ExtUtils::MakeMaker::VERSION;
+
+# If we are passed a param, do a "newer than" comparison.
+# Otherwise, just return the MakeMaker version.
+sub makemaker {
+       ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0
+}
+
+# Ripped from ExtUtils::MakeMaker 6.56, and slightly modified
+# as we only need to know here whether the attribute is an array
+# or a hash or something else (which may or may not be appendable).
+my %makemaker_argtype = (
+ C                  => 'ARRAY',
+ CONFIG             => 'ARRAY',
+# CONFIGURE          => 'CODE', # ignore
+ DIR                => 'ARRAY',
+ DL_FUNCS           => 'HASH',
+ DL_VARS            => 'ARRAY',
+ EXCLUDE_EXT        => 'ARRAY',
+ EXE_FILES          => 'ARRAY',
+ FUNCLIST           => 'ARRAY',
+ H                  => 'ARRAY',
+ IMPORTS            => 'HASH',
+ INCLUDE_EXT        => 'ARRAY',
+ LIBS               => 'ARRAY', # ignore ''
+ MAN1PODS           => 'HASH',
+ MAN3PODS           => 'HASH',
+ META_ADD           => 'HASH',
+ META_MERGE         => 'HASH',
+ PL_FILES           => 'HASH',
+ PM                 => 'HASH',
+ PMLIBDIRS          => 'ARRAY',
+ PMLIBPARENTDIRS    => 'ARRAY',
+ PREREQ_PM          => 'HASH',
+ CONFIGURE_REQUIRES => 'HASH',
+ SKIP               => 'ARRAY',
+ TYPEMAPS           => 'ARRAY',
+ XS                 => 'HASH',
+# VERSION            => ['version',''],  # ignore
+# _KEEP_AFTER_FLUSH  => '',
+
+ clean      => 'HASH',
+ depend     => 'HASH',
+ dist       => 'HASH',
+ dynamic_lib=> 'HASH',
+ linkext    => 'HASH',
+ macro      => 'HASH',
+ postamble  => 'HASH',
+ realclean  => 'HASH',
+ test       => 'HASH',
+ tool_autosplit => 'HASH',
+
+ # special cases where you can use makemaker_append
+ CCFLAGS   => 'APPENDABLE',
+ DEFINE    => 'APPENDABLE',
+ INC       => 'APPENDABLE',
+ LDDLFLAGS => 'APPENDABLE',
+ LDFROM    => 'APPENDABLE',
+);
+
 sub makemaker_args {
-       my $self = shift;
-       my $args = ($self->{makemaker_args} ||= {});
-       %$args = ( %$args, @_ ) if @_;
-       $args;
+       my ($self, %new_args) = @_;
+       my $args = ( $self->{makemaker_args} ||= {} );
+       foreach my $key (keys %new_args) {
+               if ($makemaker_argtype{$key}) {
+                       if ($makemaker_argtype{$key} eq 'ARRAY') {
+                               $args->{$key} = [] unless defined $args->{$key};
+                               unless (ref $args->{$key} eq 'ARRAY') {
+                                       $args->{$key} = [$args->{$key}]
+                               }
+                               push @{$args->{$key}},
+                                       ref $new_args{$key} eq 'ARRAY'
+                                               ? @{$new_args{$key}}
+                                               : $new_args{$key};
+                       }
+                       elsif ($makemaker_argtype{$key} eq 'HASH') {
+                               $args->{$key} = {} unless defined $args->{$key};
+                               foreach my $skey (keys %{ $new_args{$key} }) {
+                                       $args->{$key}{$skey} = 
$new_args{$key}{$skey};
+                               }
+                       }
+                       elsif ($makemaker_argtype{$key} eq 'APPENDABLE') {
+                               $self->makemaker_append($key => 
$new_args{$key});
+                       }
+               }
+               else {
+                       if (defined $args->{$key}) {
+                               warn qq{MakeMaker attribute "$key" is 
overriden; use "makemaker_append" to append values\n};
+                       }
+                       $args->{$key} = $new_args{$key};
+               }
+       }
+       return $args;
 }
 
-# For mm args that take multiple space-seperated args,
+# For mm args that take multiple space-separated args,
 # append an argument to the current list.
 sub makemaker_append {
-       my $self = sShift;
+       my $self = shift;
        my $name = shift;
        my $args = $self->makemaker_args;
-       $args->{name} = defined $args->{$name}
-               ? join( ' ', $args->{name}, @_ )
+       $args->{$name} = defined $args->{$name}
+               ? join( ' ', $args->{$name}, @_ )
                : join( ' ', @_ );
 }
 
@@ -63,18 +155,18 @@ sub build_subdirs {
 sub clean_files {
        my $self  = shift;
        my $clean = $self->makemaker_args->{clean} ||= {};
-       %$clean = (
-               %$clean, 
-               FILES => join(' ', grep length, $clean->{FILES}, @_),
+         %$clean = (
+               %$clean,
+               FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), 
@_),
        );
 }
 
 sub realclean_files {
-       my $self  = shift;
+       my $self      = shift;
        my $realclean = $self->makemaker_args->{realclean} ||= {};
-       %$realclean = (
-               %$realclean, 
-               FILES => join(' ', grep length, $realclean->{FILES}, @_),
+         %$realclean = (
+               %$realclean,
+               FILES => join ' ', grep { length $_ } ($realclean->{FILES} || 
(), @_),
        );
 }
 
@@ -89,85 +181,173 @@ sub inc {
        $self->makemaker_args( INC => shift );
 }
 
-my %test_dir = ();
-
 sub _wanted_t {
-       /\.t$/ and -f $_ and $test_dir{$File::Find::dir} = 1;
 }
 
 sub tests_recursive {
        my $self = shift;
-       if ( $self->tests ) {
-               die "tests_recursive will not work if tests are already 
defined";
-       }
        my $dir = shift || 't';
        unless ( -d $dir ) {
                die "tests_recursive dir '$dir' does not exist";
        }
+       my %tests = map { $_ => 1 } split / /, ($self->tests || '');
        require File::Find;
-       %test_dir = ();
-       File::Find::find( \&_wanted_t, $dir );
-       $self->tests( join ' ', map { "$_/*.t" } sort keys %test_dir );
+       File::Find::find(
+        sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 },
+        $dir
+    );
+       $self->tests( join ' ', sort keys %tests );
 }
 
 sub write {
        my $self = shift;
        die "&Makefile->write() takes no arguments\n" if @_;
 
+       # Check the current Perl version
+       my $perl_version = $self->perl_version;
+       if ( $perl_version ) {
+               eval "use $perl_version; 1"
+                       or die "ERROR: perl: Version $] is installed, "
+                       . "but we need version >= $perl_version";
+       }
+
+       # Make sure we have a new enough MakeMaker
+       require ExtUtils::MakeMaker;
+
+       if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) {
+               # This previous attempted to inherit the version of
+               # ExtUtils::MakeMaker in use by the module author, but this
+               # was found to be untenable as some authors build releases
+               # using future dev versions of EU:MM that nobody else has.
+               # Instead, #toolchain suggests we use 6.59 which is the most
+               # stable version on CPAN at time of writing and is, to quote
+               # ribasushi, "not terminally fucked, > and tested enough".
+               # TODO: We will now need to maintain this over time to push
+               # the version up as new versions are released.
+               $self->build_requires(     'ExtUtils::MakeMaker' => 6.59 );
+               $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 );
+       } else {
+               # Allow legacy-compatibility with 5.005 by depending on the
+               # most recent EU:MM that supported 5.005.
+               $self->build_requires(     'ExtUtils::MakeMaker' => 6.36 );
+               $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 );
+       }
+
+       # Generate the MakeMaker params
        my $args = $self->makemaker_args;
        $args->{DISTNAME} = $self->name;
-       $args->{NAME}     = $self->module_name || $self->name || 
$self->determine_NAME($args);
-       $args->{VERSION}  = $self->version || $self->determine_VERSION($args);
+       $args->{NAME}     = $self->module_name || $self->name;
        $args->{NAME}     =~ s/-/::/g;
+       $args->{VERSION}  = $self->version or die <<'EOT';
+ERROR: Can't determine distribution version. Please specify it
+explicitly via 'version' in Makefile.PL, or set a valid $VERSION
+in a module, and provide its file path via 'version_from' (or
+'all_from' if you prefer) in Makefile.PL.
+EOT
+
        if ( $self->tests ) {
-               $args->{test} = { TESTS => $self->tests };
+               my @tests = split ' ', $self->tests;
+               my %seen;
+               $args->{test} = {
+                       TESTS => (join ' ', grep {!$seen{$_}++} @tests),
+               };
+    } elsif ( $Module::Install::ExtraTests::use_extratests ) {
+        # Module::Install::ExtraTests doesn't set $self->tests and does its 
own tests via harness.
+        # So, just ignore our xt tests here.
+       } elsif ( -d 'xt' and ($Module::Install::AUTHOR or 
$ENV{RELEASE_TESTING}) ) {
+               $args->{test} = {
+                       TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ 
t xt } ),
+               };
        }
-       if ($] >= 5.005) {
+       if ( $] >= 5.005 ) {
                $args->{ABSTRACT} = $self->abstract;
-               $args->{AUTHOR}   = $self->author;
+               $args->{AUTHOR}   = join ', ', @{$self->author || []};
        }
-       if ( eval($ExtUtils::MakeMaker::VERSION) >= 6.10 ) {
-               $args->{NO_META} = 1;
+       if ( $self->makemaker(6.10) ) {
+               $args->{NO_META}   = 1;
+               #$args->{NO_MYMETA} = 1;
        }
-       if ( eval($ExtUtils::MakeMaker::VERSION) > 6.17 and $self->sign ) {
+       if ( $self->makemaker(6.17) and $self->sign ) {
                $args->{SIGN} = 1;
        }
        unless ( $self->is_admin ) {
                delete $args->{SIGN};
        }
+       if ( $self->makemaker(6.31) and $self->license ) {
+               $args->{LICENSE} = $self->license;
+       }
 
-       # merge both kinds of requires into prereq_pm
        my $prereq = ($args->{PREREQ_PM} ||= {});
        %$prereq = ( %$prereq,
+               map { @$_ } # flatten [module => version]
                map { @$_ }
+               grep $_,
+               ($self->requires)
+       );
+
+       # Remove any reference to perl, PREREQ_PM doesn't support it
+       delete $args->{PREREQ_PM}->{perl};
+
+       # Merge both kinds of requires into BUILD_REQUIRES
+       my $build_prereq = ($args->{BUILD_REQUIRES} ||= {});
+       %$build_prereq = ( %$build_prereq,
+               map { @$_ } # flatten [module => version]
                map { @$_ }
                grep $_,
-               ($self->build_requires, $self->requires)
+               ($self->configure_requires, $self->build_requires)
        );
 
-       # merge both kinds of requires into prereq_pm
-       my $subdirs = ($args->{DIR} ||= []);
+       # Remove any reference to perl, BUILD_REQUIRES doesn't support it
+       delete $args->{BUILD_REQUIRES}->{perl};
+
+       # Delete bundled dists from prereq_pm, add it to Makefile DIR
+       my $subdirs = ($args->{DIR} || []);
        if ($self->bundles) {
+               my %processed;
                foreach my $bundle (@{ $self->bundles }) {
-                       my ($file, $dir) = @$bundle;
-                       push @$subdirs, $dir if -d $dir;
-                       delete $prereq->{$file};
+                       my ($mod_name, $dist_dir) = @$bundle;
+                       delete $prereq->{$mod_name};
+                       $dist_dir = File::Basename::basename($dist_dir); # dir 
for building this module
+                       if (not exists $processed{$dist_dir}) {
+                               if (-d $dist_dir) {
+                                       # List as sub-directory to be processed 
by make
+                                       push @$subdirs, $dist_dir;
+                               }
+                               # Else do nothing: the module is already 
present on the system
+                               $processed{$dist_dir} = undef;
+                       }
                }
        }
 
+       unless ( $self->makemaker('6.55_03') ) {
+               %$prereq = (%$prereq,%$build_prereq);
+               delete $args->{BUILD_REQUIRES};
+       }
+
        if ( my $perl_version = $self->perl_version ) {
                eval "use $perl_version; 1"
                        or die "ERROR: perl: Version $] is installed, "
                        . "but we need version >= $perl_version";
+
+               if ( $self->makemaker(6.48) ) {
+                       $args->{MIN_PERL_VERSION} = $perl_version;
+               }
        }
 
-       $args->{INSTALLDIRS} = $self->installdirs;
+       if ($self->installdirs) {
+               warn qq{old INSTALLDIRS (probably set by makemaker_args) is 
overriden by installdirs\n} if $args->{INSTALLDIRS};
+               $args->{INSTALLDIRS} = $self->installdirs;
+       }
 
-       my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_})} 
keys %$args;
+       my %args = map {
+               ( $_ => $args->{$_} ) } grep {defined($args->{$_} )
+       } keys %$args;
 
        my $user_preop = delete $args{dist}->{PREOP};
-       if (my $preop = $self->admin->preop($user_preop)) {
-               $args{dist} = $preop;
+       if ( my $preop = $self->admin->preop($user_preop) ) {
+               foreach my $key ( keys %$preop ) {
+                       $args{dist}->{$key} = $preop->{$key};
+               }
        }
 
        my $mm = ExtUtils::MakeMaker::WriteMakefile(%args);
@@ -180,7 +360,7 @@ sub fix_up_makefile {
        my $top_class     = ref($self->_top) || '';
        my $top_version   = $self->_top->VERSION || '';
 
-       my $preamble = $self->preamble 
+       my $preamble = $self->preamble
                ? "# Preamble by $top_class $top_version\n"
                        . $self->preamble
                : '';
@@ -188,9 +368,9 @@ sub fix_up_makefile {
                . ($self->postamble || '');
 
        local *MAKEFILE;
-       open MAKEFILE, "< $makefile_name" or die "fix_up_makefile: Couldn't 
open $makefile_name: $!";
+       open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't 
open $makefile_name: $!";
+       eval { flock MAKEFILE, LOCK_EX };
        my $makefile = do { local $/; <MAKEFILE> };
-       close MAKEFILE or die $!;
 
        $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /;
        $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g;
@@ -205,12 +385,13 @@ sub fix_up_makefile {
        #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m;
 
        # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as 
well.
-       $makefile =~ s/("?)-I\$\(PERL_LIB\)\1//g;
+       $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g;
 
        # XXX - This is currently unused; not sure if it breaks other MM-users
        # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg;
 
-       open  MAKEFILE, "> $makefile_name" or die "fix_up_makefile: Couldn't 
open $makefile_name: $!";
+       seek MAKEFILE, 0, SEEK_SET;
+       truncate MAKEFILE, 0;
        print MAKEFILE  "$preamble$makefile$postamble" or die $!;
        close MAKEFILE  or die $!;
 
@@ -234,4 +415,4 @@ sub postamble {
 
 __END__
 
-#line 363
+#line 544
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ManifestSkip.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ManifestSkip.pm
new file mode 100644
index 0000000000..87c9191f10
--- /dev/null
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ManifestSkip.pm
@@ -0,0 +1,32 @@
+#line 1
+use strict; use warnings;
+package Module::Install::ManifestSkip;
+our $VERSION = '0.24';
+
+use base 'Module::Install::Base';
+
+our $AUTHOR_ONLY = 1;
+
+my $skip_file = "MANIFEST.SKIP";
+
+sub manifest_skip {
+    my $self = shift;
+    return unless $self->is_admin;
+
+    require Module::Manifest::Skip;
+
+    print "Writing $skip_file\n";
+
+    open OUT, '>', $skip_file
+        or die "Can't open $skip_file for output: $!";;
+
+    print OUT Module::Manifest::Skip->new->text;
+
+    close OUT;
+
+    $self->clean_files('MANIFEST');
+    $self->clean_files($skip_file)
+        if grep /^clean$/, @_;
+}
+
+1;
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Metadata.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Metadata.pm
index f77d68ab2c..11bf9718f4 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Metadata.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Metadata.pm
@@ -2,335 +2,721 @@
 package Module::Install::Metadata;
 
 use strict 'vars';
-use Module::Install::Base;
+use Module::Install::Base ();
 
-use vars qw{$VERSION $ISCORE @ISA};
+use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-       $VERSION = '0.68';
+       $VERSION = '1.19';
+       @ISA     = 'Module::Install::Base';
        $ISCORE  = 1;
-       @ISA     = qw{Module::Install::Base};
 }
 
+my @boolean_keys = qw{
+       sign
+};
+
 my @scalar_keys = qw{
-    name module_name abstract author version license
-    distribution_type perl_version tests installdirs
+       name
+       module_name
+       abstract
+       version
+       distribution_type
+       tests
+       installdirs
 };
 
 my @tuple_keys = qw{
-    build_requires requires recommends bundles
+       configure_requires
+       build_requires
+       requires
+       recommends
+       bundles
+       resources
+};
+
+my @resource_keys = qw{
+       homepage
+       bugtracker
+       repository
+};
+
+my @array_keys = qw{
+       keywords
+       author
 };
 
-sub Meta            { shift        }
-sub Meta_ScalarKeys { @scalar_keys }
-sub Meta_TupleKeys  { @tuple_keys  }
-
-foreach my $key (@scalar_keys) {
-    *$key = sub {
-        my $self = shift;
-        return $self->{values}{$key} if defined wantarray and !@_;
-        $self->{values}{$key} = shift;
-        return $self;
-    };
-}
-
-foreach my $key (@tuple_keys) {
-    *$key = sub {
-        my $self = shift;
-        return $self->{values}{$key} unless @_;
-
-        my @rv;
-        while (@_) {
-            my $module = shift or last;
-            my $version = shift || 0;
-            if ( $module eq 'perl' ) {
-                $version =~ s{^(\d+)\.(\d+)\.(\d+)}
-                             {$1 + $2/1_000 + $3/1_000_000}e;
-                $self->perl_version($version);
-                next;
-            }
-            my $rv = [ $module, $version ];
-            push @rv, $rv;
-        }
-        push @{ $self->{values}{$key} }, @rv;
-        @rv;
-    };
-}
-
-# configure_requires is currently a null-op
-sub configure_requires { 1 }
+*authors = \&author;
+
+sub Meta              { shift          }
+sub Meta_BooleanKeys  { @boolean_keys  }
+sub Meta_ScalarKeys   { @scalar_keys   }
+sub Meta_TupleKeys    { @tuple_keys    }
+sub Meta_ResourceKeys { @resource_keys }
+sub Meta_ArrayKeys    { @array_keys    }
+
+foreach my $key ( @boolean_keys ) {
+       *$key = sub {
+               my $self = shift;
+               if ( defined wantarray and not @_ ) {
+                       return $self->{values}->{$key};
+               }
+               $self->{values}->{$key} = ( @_ ? $_[0] : 1 );
+               return $self;
+       };
+}
+
+foreach my $key ( @scalar_keys ) {
+       *$key = sub {
+               my $self = shift;
+               return $self->{values}->{$key} if defined wantarray and !@_;
+               $self->{values}->{$key} = shift;
+               return $self;
+       };
+}
+
+foreach my $key ( @array_keys ) {
+       *$key = sub {
+               my $self = shift;
+               return $self->{values}->{$key} if defined wantarray and !@_;
+               $self->{values}->{$key} ||= [];
+               push @{$self->{values}->{$key}}, @_;
+               return $self;
+       };
+}
+
+foreach my $key ( @resource_keys ) {
+       *$key = sub {
+               my $self = shift;
+               unless ( @_ ) {
+                       return () unless $self->{values}->{resources};
+                       return map  { $_->[1] }
+                              grep { $_->[0] eq $key }
+                              @{ $self->{values}->{resources} };
+               }
+               return $self->{values}->{resources}->{$key} unless @_;
+               my $uri = shift or die(
+                       "Did not provide a value to $key()"
+               );
+               $self->resources( $key => $uri );
+               return 1;
+       };
+}
+
+foreach my $key ( grep { $_ ne "resources" } @tuple_keys) {
+       *$key = sub {
+               my $self = shift;
+               return $self->{values}->{$key} unless @_;
+               my @added;
+               while ( @_ ) {
+                       my $module  = shift or last;
+                       my $version = shift || 0;
+                       push @added, [ $module, $version ];
+               }
+               push @{ $self->{values}->{$key} }, @added;
+               return map {@$_} @added;
+       };
+}
+
+# Resource handling
+my %lc_resource = map { $_ => 1 } qw{
+       homepage
+       license
+       bugtracker
+       repository
+};
+
+sub resources {
+       my $self = shift;
+       while ( @_ ) {
+               my $name  = shift or last;
+               my $value = shift or next;
+               if ( $name eq lc $name and ! $lc_resource{$name} ) {
+                       die("Unsupported reserved lowercase resource '$name'");
+               }
+               $self->{values}->{resources} ||= [];
+               push @{ $self->{values}->{resources} }, [ $name, $value ];
+       }
+       $self->{values}->{resources};
+}
 
 # Aliases for build_requires that will have alternative
 # meanings in some future version of META.yml.
-sub test_requires      { shift->build_requires(@_)  }
-sub install_requires   { shift->build_requires(@_)  }
+sub test_requires     { shift->build_requires(@_) }
+sub install_requires  { shift->build_requires(@_) }
 
 # Aliases for installdirs options
-sub install_as_core    { $_[0]->installdirs('perl')   }
-sub install_as_cpan    { $_[0]->installdirs('site')   }
-sub install_as_site    { $_[0]->installdirs('site')   }
-sub install_as_vendor  { $_[0]->installdirs('vendor') }
+sub install_as_core   { $_[0]->installdirs('perl')   }
+sub install_as_cpan   { $_[0]->installdirs('site')   }
+sub install_as_site   { $_[0]->installdirs('site')   }
+sub install_as_vendor { $_[0]->installdirs('vendor') }
 
-sub sign {
-    my $self = shift;
-    return $self->{'values'}{'sign'} if defined wantarray and ! @_;
-    $self->{'values'}{'sign'} = ( @_ ? $_[0] : 1 );
-    return $self;
+sub dynamic_config {
+       my $self  = shift;
+       my $value = @_ ? shift : 1;
+       if ( $self->{values}->{dynamic_config} ) {
+               # Once dynamic we never change to static, for safety
+               return 0;
+       }
+       $self->{values}->{dynamic_config} = $value ? 1 : 0;
+       return 1;
 }
 
-sub dynamic_config {
+# Convenience command
+sub static_config {
+       shift->dynamic_config(0);
+}
+
+sub perl_version {
        my $self = shift;
-       unless ( @_ ) {
-               warn "You MUST provide an explicit true/false value to 
dynamic_config, skipping\n";
-               return $self;
+       return $self->{values}->{perl_version} unless @_;
+       my $version = shift or die(
+               "Did not provide a value to perl_version()"
+       );
+
+       # Normalize the version
+       $version = $self->_perl_version($version);
+
+       # We don't support the really old versions
+       unless ( $version >= 5.005 ) {
+               die "Module::Install only supports 5.005 or newer (use 
ExtUtils::MakeMaker)\n";
        }
-       $self->{'values'}{'dynamic_config'} = $_[0] ? 1 : 0;
-       return $self;
+
+       $self->{values}->{perl_version} = $version;
 }
 
 sub all_from {
-    my ( $self, $file ) = @_;
-
-    unless ( defined($file) ) {
-        my $name = $self->name
-            or die "all_from called with no args without setting name() first";
-        $file = join('/', 'lib', split(/-/, $name)) . '.pm';
-        $file =~ s{.*/}{} unless -e $file;
-        die "all_from: cannot find $file from $name" unless -e $file;
-    }
+       my ( $self, $file ) = @_;
+
+       unless ( defined($file) ) {
+               my $name = $self->name or die(
+                       "all_from called with no args without setting name() 
first"
+               );
+               $file = join('/', 'lib', split(/-/, $name)) . '.pm';
+               $file =~ s{.*/}{} unless -e $file;
+               unless ( -e $file ) {
+                       die("all_from cannot find $file from $name");
+               }
+       }
+       unless ( -f $file ) {
+               die("The path '$file' does not exist, or is not a file");
+       }
 
-    $self->version_from($file)      unless $self->version;
-    $self->perl_version_from($file) unless $self->perl_version;
+       $self->{values}{all_from} = $file;
 
-    # The remaining probes read from POD sections; if the file
-    # has an accompanying .pod, use that instead
-    my $pod = $file;
-    if ( $pod =~ s/\.pm$/.pod/i and -e $pod ) {
-        $file = $pod;
-    }
+       # Some methods pull from POD instead of code.
+       # If there is a matching .pod, use that instead
+       my $pod = $file;
+       $pod =~ s/\.pm$/.pod/i;
+       $pod = $file unless -e $pod;
+
+       # Pull the different values
+       $self->name_from($file)         unless $self->name;
+       $self->version_from($file)      unless $self->version;
+       $self->perl_version_from($file) unless $self->perl_version;
+       $self->author_from($pod)        unless @{$self->author || []};
+       $self->license_from($pod)       unless $self->license;
+       $self->abstract_from($pod)      unless $self->abstract;
 
-    $self->author_from($file)   unless $self->author;
-    $self->license_from($file)  unless $self->license;
-    $self->abstract_from($file) unless $self->abstract;
+       return 1;
 }
 
 sub provides {
-    my $self     = shift;
-    my $provides = ( $self->{values}{provides} ||= {} );
-    %$provides = (%$provides, @_) if @_;
-    return $provides;
+       my $self     = shift;
+       my $provides = ( $self->{values}->{provides} ||= {} );
+       %$provides = (%$provides, @_) if @_;
+       return $provides;
 }
 
 sub auto_provides {
-    my $self = shift;
-    return $self unless $self->is_admin;
-
-    unless (-e 'MANIFEST') {
-        warn "Cannot deduce auto_provides without a MANIFEST, skipping\n";
-        return $self;
-    }
-
-    # Avoid spurious warnings as we are not checking manifest here.
-
-    local $SIG{__WARN__} = sub {1};
-    require ExtUtils::Manifest;
-    local *ExtUtils::Manifest::manicheck = sub { return };
-
-    require Module::Build;
-    my $build = Module::Build->new(
-        dist_name    => $self->name,
-        dist_version => $self->version,
-        license      => $self->license,
-    );
-    $self->provides(%{ $build->find_dist_packages || {} });
+       my $self = shift;
+       return $self unless $self->is_admin;
+       unless (-e 'MANIFEST') {
+               warn "Cannot deduce auto_provides without a MANIFEST, 
skipping\n";
+               return $self;
+       }
+       # Avoid spurious warnings as we are not checking manifest here.
+       local $SIG{__WARN__} = sub {1};
+       require ExtUtils::Manifest;
+       local *ExtUtils::Manifest::manicheck = sub { return };
+
+       require Module::Build;
+       my $build = Module::Build->new(
+               dist_name    => $self->name,
+               dist_version => $self->version,
+               license      => $self->license,
+       );
+       $self->provides( %{ $build->find_dist_packages || {} } );
 }
 
 sub feature {
-    my $self     = shift;
-    my $name     = shift;
-    my $features = ( $self->{values}{features} ||= [] );
-
-    my $mods;
-
-    if ( @_ == 1 and ref( $_[0] ) ) {
-        # The user used ->feature like ->features by passing in the second
-        # argument as a reference.  Accomodate for that.
-        $mods = $_[0];
-    } else {
-        $mods = \@_;
-    }
+       my $self     = shift;
+       my $name     = shift;
+       my $features = ( $self->{values}->{features} ||= [] );
+       my $mods;
+
+       if ( @_ == 1 and ref( $_[0] ) ) {
+               # The user used ->feature like ->features by passing in the 
second
+               # argument as a reference.  Accomodate for that.
+               $mods = $_[0];
+       } else {
+               $mods = \@_;
+       }
 
-    my $count = 0;
-    push @$features, (
-        $name => [
-            map {
-                ref($_) ? ( ref($_) eq 'HASH' ) ? %$_
-                                                : @$_
-                        : $_
-            } @$mods
-        ]
-    );
+       my $count = 0;
+       push @$features, (
+               $name => [
+                       map {
+                               ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_
+                       } @$mods
+               ]
+       );
 
-    return @$features;
+       return @$features;
 }
 
 sub features {
-    my $self = shift;
-    while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) {
-        $self->feature( $name, @$mods );
-    }
-    return $self->{values}->{features}
-       ? @{ $self->{values}->{features} }
-       : ();
+       my $self = shift;
+       while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) {
+               $self->feature( $name, @$mods );
+       }
+       return $self->{values}->{features}
+               ? @{ $self->{values}->{features} }
+               : ();
 }
 
 sub no_index {
-    my $self = shift;
-    my $type = shift;
-    push @{ $self->{values}{no_index}{$type} }, @_ if $type;
-    return $self->{values}{no_index};
+       my $self = shift;
+       my $type = shift;
+       push @{ $self->{values}->{no_index}->{$type} }, @_ if $type;
+       return $self->{values}->{no_index};
 }
 
 sub read {
-    my $self = shift;
-    $self->include_deps( 'YAML', 0 );
-
-    require YAML;
-    my $data = YAML::LoadFile('META.yml');
-
-    # Call methods explicitly in case user has already set some values.
-    while ( my ( $key, $value ) = each %$data ) {
-        next unless $self->can($key);
-        if ( ref $value eq 'HASH' ) {
-            while ( my ( $module, $version ) = each %$value ) {
-                $self->can($key)->($self, $module => $version );
-            }
-        }
-        else {
-            $self->can($key)->($self, $value);
-        }
-    }
-    return $self;
+       my $self = shift;
+       $self->include_deps( 'YAML::Tiny', 0 );
+
+       require YAML::Tiny;
+       my $data = YAML::Tiny::LoadFile('META.yml');
+
+       # Call methods explicitly in case user has already set some values.
+       while ( my ( $key, $value ) = each %$data ) {
+               next unless $self->can($key);
+               if ( ref $value eq 'HASH' ) {
+                       while ( my ( $module, $version ) = each %$value ) {
+                               $self->can($key)->($self, $module => $version );
+                       }
+               } else {
+                       $self->can($key)->($self, $value);
+               }
+       }
+       return $self;
 }
 
 sub write {
-    my $self = shift;
-    return $self unless $self->is_admin;
-    $self->admin->write_meta;
-    return $self;
+       my $self = shift;
+       return $self unless $self->is_admin;
+       $self->admin->write_meta;
+       return $self;
 }
 
 sub version_from {
-    my ( $self, $file ) = @_;
-    require ExtUtils::MM_Unix;
-    $self->version( ExtUtils::MM_Unix->parse_version($file) );
+       require ExtUtils::MM_Unix;
+       my ( $self, $file ) = @_;
+       $self->version( ExtUtils::MM_Unix->parse_version($file) );
+
+       # for version integrity check
+       $self->makemaker_args( VERSION_FROM => $file );
 }
 
 sub abstract_from {
-    my ( $self, $file ) = @_;
-    require ExtUtils::MM_Unix;
-    $self->abstract(
-        bless(
-            { DISTNAME => $self->name },
-            'ExtUtils::MM_Unix'
-        )->parse_abstract($file)
-     );
+       require ExtUtils::MM_Unix;
+       my ( $self, $file ) = @_;
+       $self->abstract(
+               bless(
+                       { DISTNAME => $self->name },
+                       'ExtUtils::MM_Unix'
+               )->parse_abstract($file)
+       );
 }
 
-sub _slurp {
-    my ( $self, $file ) = @_;
+# Add both distribution and module name
+sub name_from {
+       my ($self, $file) = @_;
+       if (
+               Module::Install::_read($file) =~ m/
+               ^ \s*
+               package \s*
+               ([\w:]+)
+               [\s|;]*
+               /ixms
+       ) {
+               my ($name, $module_name) = ($1, $1);
+               $name =~ s{::}{-}g;
+               $self->name($name);
+               unless ( $self->module_name ) {
+                       $self->module_name($module_name);
+               }
+       } else {
+               die("Cannot determine name from $file\n");
+       }
+}
 
-    local *FH;
-    open FH, "< $file" or die "Cannot open $file.pod: $!";
-    do { local $/; <FH> };
+sub _extract_perl_version {
+       if (
+               $_[0] =~ m/
+               ^\s*
+               (?:use|require) \s*
+               v?
+               ([\d_\.]+)
+               \s* ;
+               /ixms
+       ) {
+               my $perl_version = $1;
+               $perl_version =~ s{_}{}g;
+               return $perl_version;
+       } else {
+               return;
+       }
 }
 
 sub perl_version_from {
-    my ( $self, $file ) = @_;
-
-    if (
-        $self->_slurp($file) =~ m/
-        ^
-        use \s*
-        v?
-        ([\d_\.]+)
-        \s* ;
-    /ixms
-      )
-    {
-        my $v = $1;
-        $v =~ s{_}{}g;
-        $self->perl_version($1);
-    }
-    else {
-        warn "Cannot determine perl version info from $file\n";
-        return;
-    }
+       my $self = shift;
+       my $perl_version=_extract_perl_version(Module::Install::_read($_[0]));
+       if ($perl_version) {
+               $self->perl_version($perl_version);
+       } else {
+               warn "Cannot determine perl version info from $_[0]\n";
+               return;
+       }
 }
 
 sub author_from {
-    my ( $self, $file ) = @_;
-    my $content = $self->_slurp($file);
-    if ($content =~ m/
-        =head \d \s+ (?:authors?)\b \s*
-        ([^\n]*)
-        |
-        =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s*
-        .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s*
-        ([^\n]*)
-    /ixms) {
-        my $author = $1 || $2;
-        $author =~ s{E<lt>}{<}g;
-        $author =~ s{E<gt>}{>}g;
-        $self->author($author); 
-    }
-    else {
-        warn "Cannot determine author info from $file\n";
-    }
+       my $self    = shift;
+       my $content = Module::Install::_read($_[0]);
+       if ($content =~ m/
+               =head \d \s+ (?:authors?)\b \s*
+               ([^\n]*)
+               |
+               =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s*
+               .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s*
+               ([^\n]*)
+       /ixms) {
+               my $author = $1 || $2;
+
+               # XXX: ugly but should work anyway...
+               if (eval "require Pod::Escapes; 1") {
+                       # Pod::Escapes has a mapping table.
+                       # It's in core of perl >= 5.9.3, and should be installed
+                       # as one of the Pod::Simple's prereqs, which is a prereq
+                       # of Pod::Text 3.x (see also below).
+                       $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> }
+                       {
+                               defined $2
+                               ? chr($2)
+                               : defined 
$Pod::Escapes::Name2character_number{$1}
+                               ? chr($Pod::Escapes::Name2character_number{$1})
+                               : do {
+                                       warn "Unknown escape: E<$1>";
+                                       "E<$1>";
+                               };
+                       }gex;
+               }
+               elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) {
+                       # Pod::Text < 3.0 has yet another mapping table,
+                       # though the table name of 2.x and 1.x are different.
+                       # (1.x is in core of Perl < 5.6, 2.x is in core of
+                       # Perl < 5.9.3)
+                       my $mapping = ($Pod::Text::VERSION < 2)
+                               ? \%Pod::Text::HTML_Escapes
+                               : \%Pod::Text::ESCAPES;
+                       $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> }
+                       {
+                               defined $2
+                               ? chr($2)
+                               : defined $mapping->{$1}
+                               ? $mapping->{$1}
+                               : do {
+                                       warn "Unknown escape: E<$1>";
+                                       "E<$1>";
+                               };
+                       }gex;
+               }
+               else {
+                       $author =~ s{E<lt>}{<}g;
+                       $author =~ s{E<gt>}{>}g;
+               }
+               $self->author($author);
+       } else {
+               warn "Cannot determine author info from $_[0]\n";
+       }
 }
 
-sub license_from {
-    my ( $self, $file ) = @_;
-
-    if (
-        $self->_slurp($file) =~ m/
-        (
-            =head \d \s+
-            (?:licen[cs]e|licensing|copyright|legal)\b
-            .*?
-        )
-        (=head\\d.*|=cut.*|)
-        \z
-    /ixms
-      )
-    {
-        my $license_text = $1;
-        my @phrases      = (
-            'under the same (?:terms|license) as perl itself' => 'perl',       
 1,
-            'GNU public license'                              => 'gpl',        
 1,
-            'GNU lesser public license'                       => 'gpl',        
 1,
-            'BSD license'                                     => 'bsd',        
 1,
-            'Artistic license'                                => 'artistic',   
 1,
-            'GPL'                                             => 'gpl',        
 1,
-            'LGPL'                                            => 'lgpl',       
 1,
-            'BSD'                                             => 'bsd',        
 1,
-            'Artistic'                                        => 'artistic',   
 1,
-            'MIT'                                             => 'mit',        
 1,
-            'proprietary'                                     => 
'proprietary', 0,
-        );
-        while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) {
-            $pattern =~ s{\s+}{\\s+}g;
-            if ( $license_text =~ /\b$pattern\b/i ) {
-                if ( $osi and $license_text =~ /All rights reserved/i ) {
-                        warn "LEGAL WARNING: 'All rights reserved' may 
invalidate Open Source licenses. Consider removing it.";
+#Stolen from M::B
+my %license_urls = (
+    perl         => 'http://dev.perl.org/licenses/',
+    apache       => 'http://apache.org/licenses/LICENSE-2.0',
+    apache_1_1   => 'http://apache.org/licenses/LICENSE-1.1',
+    artistic     => 'http://opensource.org/licenses/artistic-license.php',
+    artistic_2   => 'http://opensource.org/licenses/artistic-license-2.0.php',
+    lgpl         => 'http://opensource.org/licenses/lgpl-license.php',
+    lgpl2        => 'http://opensource.org/licenses/lgpl-2.1.php',
+    lgpl3        => 'http://opensource.org/licenses/lgpl-3.0.html',
+    bsd          => 'http://opensource.org/licenses/bsd-license.php',
+    gpl          => 'http://opensource.org/licenses/gpl-license.php',
+    gpl2         => 'http://opensource.org/licenses/gpl-2.0.php',
+    gpl3         => 'http://opensource.org/licenses/gpl-3.0.html',
+    mit          => 'http://opensource.org/licenses/mit-license.php',
+    mozilla      => 'http://opensource.org/licenses/mozilla1.1.php',
+    open_source  => undef,
+    unrestricted => undef,
+    restrictive  => undef,
+    unknown      => undef,
+);
+
+sub license {
+       my $self = shift;
+       return $self->{values}->{license} unless @_;
+       my $license = shift or die(
+               'Did not provide a value to license()'
+       );
+       $license = __extract_license($license) || lc $license;
+       $self->{values}->{license} = $license;
+
+       # Automatically fill in license URLs
+       if ( $license_urls{$license} ) {
+               $self->resources( license => $license_urls{$license} );
+       }
+
+       return 1;
+}
+
+sub _extract_license {
+       my $pod = shift;
+       my $matched;
+       return __extract_license(
+               ($matched) = $pod =~ m/
+                       (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?)
+                       (=head \d.*|=cut.*|)\z
+               /xms
+       ) || __extract_license(
+               ($matched) = $pod =~ m/
+                       (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?)
+                       (=head \d.*|=cut.*|)\z
+               /xms
+       );
+}
+
+sub __extract_license {
+       my $license_text = shift or return;
+       my @phrases      = (
+               '(?:under )?the same (?:terms|license) as (?:perl|the perl 
(?:\d )?programming language)' => 'perl', 1,
+               '(?:under )?the terms of (?:perl|the perl programming language) 
itself' => 'perl', 1,
+               'Artistic and GPL'                   => 'perl',         1,
+               'GNU general public license'         => 'gpl',          1,
+               'GNU public license'                 => 'gpl',          1,
+               'GNU lesser general public license'  => 'lgpl',         1,
+               'GNU lesser public license'          => 'lgpl',         1,
+               'GNU library general public license' => 'lgpl',         1,
+               'GNU library public license'         => 'lgpl',         1,
+               'GNU Free Documentation license'     => 'unrestricted', 1,
+               'GNU Affero General Public License'  => 'open_source',  1,
+               '(?:Free)?BSD license'               => 'bsd',          1,
+               'Artistic license 2\.0'              => 'artistic_2',   1,
+               'Artistic license'                   => 'artistic',     1,
+               'Apache (?:Software )?license'       => 'apache',       1,
+               'GPL'                                => 'gpl',          1,
+               'LGPL'                               => 'lgpl',         1,
+               'BSD'                                => 'bsd',          1,
+               'Artistic'                           => 'artistic',     1,
+               'MIT'                                => 'mit',          1,
+               'Mozilla Public License'             => 'mozilla',      1,
+               'Q Public License'                   => 'open_source',  1,
+               'OpenSSL License'                    => 'unrestricted', 1,
+               'SSLeay License'                     => 'unrestricted', 1,
+               'zlib License'                       => 'open_source',  1,
+               'proprietary'                        => 'proprietary',  0,
+       );
+       while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) {
+               $pattern =~ s#\s+#\\s+#gs;
+               if ( $license_text =~ /\b$pattern\b/i ) {
+                       return $license;
                }
-                $self->license($license);
-                return 1;
-            }
-        }
+       }
+       return '';
+}
+
+sub license_from {
+       my $self = shift;
+       if (my $license=_extract_license(Module::Install::_read($_[0]))) {
+               $self->license($license);
+       } else {
+               warn "Cannot determine license info from $_[0]\n";
+               return 'unknown';
+       }
+}
+
+sub _extract_bugtracker {
+       my @links   = $_[0] =~ m#L<(
+        https?\Q://rt.cpan.org/\E[^>]+|
+        https?\Q://github.com/\E[\w_]+/[\w_]+/issues|
+        https?\Q://code.google.com/p/\E[\w_\-]+/issues/list
+        )>#gx;
+       my %links;
+       @links{@links}=();
+       @links=keys %links;
+       return @links;
+}
+
+sub bugtracker_from {
+       my $self    = shift;
+       my $content = Module::Install::_read($_[0]);
+       my @links   = _extract_bugtracker($content);
+       unless ( @links ) {
+               warn "Cannot determine bugtracker info from $_[0]\n";
+               return 0;
+       }
+       if ( @links > 1 ) {
+               warn "Found more than one bugtracker link in $_[0]\n";
+               return 0;
+       }
+
+       # Set the bugtracker
+       bugtracker( $links[0] );
+       return 1;
+}
+
+sub requires_from {
+       my $self     = shift;
+       my $content  = Module::Install::_readperl($_[0]);
+       my @requires = $content =~ 
m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg;
+       while ( @requires ) {
+               my $module  = shift @requires;
+               my $version = shift @requires;
+               $self->requires( $module => $version );
+       }
+}
+
+sub test_requires_from {
+       my $self     = shift;
+       my $content  = Module::Install::_readperl($_[0]);
+       my @requires = $content =~ 
m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg;
+       while ( @requires ) {
+               my $module  = shift @requires;
+               my $version = shift @requires;
+               $self->test_requires( $module => $version );
+       }
+}
+
+# Convert triple-part versions (eg, 5.6.1 or 5.8.9) to
+# numbers (eg, 5.006001 or 5.008009).
+# Also, convert double-part versions (eg, 5.8)
+sub _perl_version {
+       my $v = $_[-1];
+       $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e;
+       $v =~ 
s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 
0)/e;
+       $v =~ s/(\.\d\d\d)000$/$1/;
+       $v =~ s/_.+$//;
+       if ( ref($v) ) {
+               # Numify
+               $v = $v + 0;
+       }
+       return $v;
+}
+
+sub add_metadata {
+    my $self = shift;
+    my %hash = @_;
+    for my $key (keys %hash) {
+        warn "add_metadata: $key is not prefixed with 'x_'.\n" .
+             "Use appopriate function to add non-private metadata.\n" unless 
$key =~ /^x_/;
+        $self->{values}->{$key} = $hash{$key};
     }
+}
+
+
+######################################################################
+# MYMETA Support
+
+sub WriteMyMeta {
+       die "WriteMyMeta has been deprecated";
+}
+
+sub write_mymeta_yaml {
+       my $self = shift;
+
+       # We need YAML::Tiny to write the MYMETA.yml file
+       unless ( eval { require YAML::Tiny; 1; } ) {
+               return 1;
+       }
+
+       # Generate the data
+       my $meta = $self->_write_mymeta_data or return 1;
+
+       # Save as the MYMETA.yml file
+       print "Writing MYMETA.yml\n";
+       YAML::Tiny::DumpFile('MYMETA.yml', $meta);
+}
+
+sub write_mymeta_json {
+       my $self = shift;
+
+       # We need JSON to write the MYMETA.json file
+       unless ( eval { require JSON; 1; } ) {
+               return 1;
+       }
+
+       # Generate the data
+       my $meta = $self->_write_mymeta_data or return 1;
+
+       # Save as the MYMETA.yml file
+       print "Writing MYMETA.json\n";
+       Module::Install::_write(
+               'MYMETA.json',
+               JSON->new->pretty(1)->canonical->encode($meta),
+       );
+}
+
+sub _write_mymeta_data {
+       my $self = shift;
+
+       # If there's no existing META.yml there is nothing we can do
+       return undef unless -f 'META.yml';
+
+       # We need Parse::CPAN::Meta to load the file
+       unless ( eval { require Parse::CPAN::Meta; 1; } ) {
+               return undef;
+       }
+
+       # Merge the perl version into the dependencies
+       my $val  = $self->Meta->{values};
+       my $perl = delete $val->{perl_version};
+       if ( $perl ) {
+               $val->{requires} ||= [];
+               my $requires = $val->{requires};
+
+               # Canonize to three-dot version after Perl 5.6
+               if ( $perl >= 5.006 ) {
+                       $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, 
int($2||0), int($3||0))}e
+               }
+               unshift @$requires, [ perl => $perl ];
+       }
+
+       # Load the advisory META.yml file
+       my @yaml = Parse::CPAN::Meta::LoadFile('META.yml');
+       my $meta = $yaml[0];
+
+       # Overwrite the non-configure dependency hashes
+       delete $meta->{requires};
+       delete $meta->{build_requires};
+       delete $meta->{recommends};
+       if ( exists $val->{requires} ) {
+               $meta->{requires} = { map { @$_ } @{ $val->{requires} } };
+       }
+       if ( exists $val->{build_requires} ) {
+               $meta->{build_requires} = { map { @$_ } @{ 
$val->{build_requires} } };
+       }
 
-    warn "Cannot determine license info from $file\n";
-    return 'unknown';
+       return $meta;
 }
 
 1;
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Package.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Package.pm
new file mode 100644
index 0000000000..47d51780bb
--- /dev/null
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Package.pm
@@ -0,0 +1,323 @@
+#line 1
+##
+# name:      Module::Install::Package
+# abstract:  Module::Install support for Module::Package
+# author:    Ingy döt Net <ingy@cpan.org>
+# license:   perl
+# copyright: 2011
+# see:
+# - Module::Package
+
+# This module contains the Module::Package logic that must be available to
+# both the Author and the End User. Author-only logic goes in a
+# Module::Package::Plugin subclass.
+package Module::Install::Package;
+use strict;
+use Module::Install::Base;
+use vars qw'@ISA $VERSION';
+@ISA = 'Module::Install::Base';
+$VERSION = '0.30';
+
+#-----------------------------------------------------------------------------#
+# XXX BOOTBUGHACK
+# This is here to try to get us out of Module-Package-0.11 cpantesters hell...
+# Remove this when the situation has blown over.
+sub pkg {
+    *inc::Module::Package::VERSION = sub { $VERSION };
+    my $self = shift;
+    $self->module_package_internals_init($@);
+}
+
+#-----------------------------------------------------------------------------#
+# We allow the author to specify key/value options after the plugin. These
+# options need to be available both at author time and install time.
+#-----------------------------------------------------------------------------#
+# OO accessor for command line options:
+sub package_options {
+    @_>1?($_[0]->{package_options}=$_[1]):$_[0]->{package_options}}
+
+my $default_options = {
+    deps_list => 1,
+    install_bin => 1,
+    install_share => 1,
+    manifest_skip => 1,
+    requires_from => 1,
+};
+
+#-----------------------------------------------------------------------------#
+# Module::Install plugin directives. Use long, ugly names to not pollute the
+# Module::Install plugin namespace. These are only intended to be called from
+# Module::Package.
+#-----------------------------------------------------------------------------#
+
+# Module::Package starts off life as a normal call to this Module::Install
+# plugin directive:
+my $module_install_plugin;
+my $module_package_plugin;
+my $module_package_dist_plugin;
+# XXX ARGVHACK This @argv thing is a temporary fix for an ugly bug somewhere 
in the
+# Wikitext module usage.
+my @argv;
+sub module_package_internals_init {
+    my $self = $module_install_plugin = shift;
+    my ($plugin_spec, %options) = @_;
+    $self->package_options({%$default_options, %options});
+
+    if ($module_install_plugin->is_admin) {
+        $module_package_plugin = $self->_load_plugin($plugin_spec);
+        $module_package_plugin->mi($module_install_plugin);
+        $module_package_plugin->version_check($VERSION);
+    }
+    else {
+        $module_package_dist_plugin = $self->_load_dist_plugin($plugin_spec);
+        $module_package_dist_plugin->mi($module_install_plugin) if ref 
$module_package_dist_plugin;
+    }
+    # NOTE - This is the point in time where the body of Makefile.PL runs...
+    return;
+
+    sub INIT {
+        return unless $module_install_plugin;
+        return if $Module::Package::ERROR;
+        eval {
+            if ($module_install_plugin->is_admin) {
+                $module_package_plugin->initial();
+                $module_package_plugin->main();
+            }
+            else {
+                $module_install_plugin->_initial();
+                $module_package_dist_plugin->_initial() if ref 
$module_package_dist_plugin;
+                $module_install_plugin->_main();
+                $module_package_dist_plugin->_main() if ref 
$module_package_dist_plugin;
+            }
+        };
+        if ($@) {
+            $Module::Package::ERROR = $@;
+            die $@;
+        }
+        @argv = @ARGV; # XXX ARGVHACK
+    }
+
+    # If this Module::Install plugin was used (by Module::Package) then wrap
+    # up any loose ends. This will get called after Makefile.PL has completed.
+    sub END {
+        @ARGV = @argv; # XXX ARGVHACK
+        return unless $module_install_plugin;
+        return if $Module::Package::ERROR;
+        $module_package_plugin
+            ? do {
+                $module_package_plugin->final;
+                $module_package_plugin->replicate_module_package;
+            }
+            : do {
+                $module_install_plugin->_final;
+                $module_package_dist_plugin->_final() if ref 
$module_package_dist_plugin;
+            }
+    }
+}
+
+# Module::Package, Module::Install::Package and Module::Package::Plugin
+# must all have the same version. Seems wise.
+sub module_package_internals_version_check {
+    my ($self, $version) = @_;
+    return if $version < 0.1800001;   # XXX BOOTBUGHACK!!
+    die <<"..." unless $version == $VERSION;
+
+Error! Something has gone awry:
+    Module::Package version=$version is using 
+    Module::Install::Package version=$VERSION
+If you are the author of this module, try upgrading Module::Package.
+Otherwise, please notify the author of this error.
+
+...
+}
+
+# Find and load the author side plugin:
+sub _load_plugin {
+    my ($self, $spec, $namespace) = @_;
+    $spec ||= '';
+    $namespace ||= 'Module::Package';
+    my $version = '';
+    $Module::Package::plugin_version = 0;
+    if ($spec =~ s/\s+(\S+)\s*//) {
+        $version = $1;
+        $Module::Package::plugin_version = $version;
+    }
+    my ($module, $plugin) =
+        not($spec) ? ('Plugin', "Plugin::basic") :
+        ($spec =~ /^\w(\w|::)*$/) ? ($spec, $spec) :
+        ($spec =~ /^:(\w+)$/) ? ('Plugin', "Plugin::$1") :
+        ($spec =~ /^(\S*\w):(\w+)$/) ? ($1, "$1::$2") :
+        die "$spec is invalid";
+    $module = "${namespace}::${module}";
+    $plugin = "${namespace}::${plugin}";
+    eval "use $module $version (); 1" or die $@;
+    return $plugin->new();
+}
+
+# Find and load the user side plugin:
+sub _load_dist_plugin {
+    my ($self, $spec, $namespace) = @_;
+    $spec ||= '';
+    $namespace ||= 'Module::Package::Dist';
+    my $r = eval { $self->_load_plugin($spec, $namespace); };
+    return $r if ref $r;
+    return;
+}
+
+#-----------------------------------------------------------------------------#
+# These are the user side analogs to the author side plugin API calls.
+# Prefix with '_' to not pollute Module::Install plugin space.
+#-----------------------------------------------------------------------------#
+sub _initial {
+    my ($self) = @_;
+}
+
+sub _main {
+    my ($self) = @_;
+}
+
+# NOTE These must match Module::Package::Plugin::final.
+sub _final {
+    my ($self) = @_;
+    $self->_all_from;
+    $self->_requires_from;
+    $self->_install_bin;
+    $self->_install_share;
+    $self->_WriteAll;
+}
+
+#-----------------------------------------------------------------------------#
+# This section is where all the useful code bits go. These bits are needed by
+# both Author and User side runs.
+#-----------------------------------------------------------------------------#
+
+my $all_from = 0;
+sub _all_from {
+    my $self = shift;
+    return if $all_from++;
+    return if $self->name;
+    my $file = shift || "$main::PM" or die "all_from has no file";
+    $self->all_from($file);
+}
+
+my $requires_from = 0;
+sub _requires_from {
+    my $self = shift;
+    return if $requires_from++;
+    return unless $self->package_options->{requires_from};
+    my $file = shift || "$main::PM" or die "requires_from has no file";
+    $self->requires_from($main::PM)
+}
+
+my $install_bin = 0;
+sub _install_bin {
+    my $self = shift;
+    return if $install_bin++;
+    return unless $self->package_options->{install_bin};
+    return unless -d 'bin';
+    my @bin;
+    File::Find::find(sub {
+        return unless -f $_;
+        push @bin, $File::Find::name;
+    }, 'bin');
+    $self->install_script($_) for @bin;
+}
+
+my $install_share = 0;
+sub _install_share {
+    my $self = shift;
+    return if $install_share++;
+    return unless $self->package_options->{install_share};
+    return unless -d 'share';
+    $self->install_share;
+}
+
+my $WriteAll = 0;
+sub _WriteAll {
+    my $self = shift;
+    return if $WriteAll++;
+    $self->WriteAll(@_);
+}
+
+# Base package for Module::Package plugin distributed components.
+package Module::Package::Dist;
+
+sub new {
+    my ($class, %args) = @_;
+    bless \%args, $class;
+}
+
+sub mi {
+    @_ > 1 ? ($_[0]->{mi}=$_[1]) : $_[0]->{mi};
+}
+
+sub _initial {
+    my ($self) = @_;
+}
+
+sub _main {
+    my ($self) = @_;
+}
+
+sub _final {
+    my ($self) = @_;
+}
+
+1;
+
+#-----------------------------------------------------------------------------#
+# Take a guess at the primary .pm and .pod files for 'all_from', and friends.
+# Put them in global magical vars in the main:: namespace.
+#-----------------------------------------------------------------------------#
+package Module::Package::PM;
+use overload '""' => sub {
+    $_[0]->guess_pm unless @{$_[0]};
+    return $_[0]->[0];
+};
+sub set { $_[0]->[0] = $_[1] }
+sub guess_pm {
+    my $pm = '';
+    my $self = shift;
+    if (-e 'META.yml') {
+        open META, 'META.yml' or die "Can't open 'META.yml' for input:\n$!";
+        my $meta = do { local $/; <META> };
+        close META;
+        $meta =~ /^module_name: (\S+)$/m
+            or die "Can't get module_name from META.yml";
+        $pm = $1;
+        $pm =~ s!::!/!g;
+        $pm = "lib/$pm.pm";
+    }
+    else {
+        require File::Find;
+        my @array = ();
+        File::Find::find(sub {
+            return unless /\.pm$/;
+            my $name = $File::Find::name;
+            my $num = ($name =~ s!/+!/!g);
+            my $ary = $array[$num] ||= [];
+            push @$ary, $name;
+        }, 'lib');
+        shift @array while @array and not defined $array[0];
+        die "Can't guess main module" unless @array;
+        (($pm) = sort @{$array[0]}) or
+            die "Can't guess main module";
+    }
+    my $pmc = $pm . 'c';
+    $pm = $pmc if -e $pmc;
+    $self->set($pm);
+}
+$main::PM = bless [$main::PM ? ($main::PM) : ()], __PACKAGE__;
+
+package Module::Package::POD;
+use overload '""' => sub {
+    return $_[0]->[0] if @{$_[0]};
+    (my $pod = "$main::PM") =~ s/\.pm/.pod/
+        or die "Module::Package's \$main::PM value should end in '.pm'";
+    return -e $pod ? $pod : '';
+};
+sub set { $_[0][0] = $_[1] }
+$main::POD = bless [$main::POD ? ($main::POD) : ()], __PACKAGE__;
+
+1;
+
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ReadmeFromPod.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ReadmeFromPod.pm
new file mode 100644
index 0000000000..37382326db
--- /dev/null
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ReadmeFromPod.pm
@@ -0,0 +1,184 @@
+#line 1
+package Module::Install::ReadmeFromPod;
+
+use 5.006;
+use strict;
+use warnings;
+use base qw(Module::Install::Base);
+use vars qw($VERSION);
+
+$VERSION = '0.30';
+
+{
+
+    # these aren't defined until after _require_admin is run, so
+    # define them so prototypes are available during compilation.
+    sub io;
+    sub capture(&;@);
+
+#line 28
+
+    my $done = 0;
+
+    sub _require_admin {
+
+       # do this once to avoid redefinition warnings from IO::All
+       return if $done;
+
+       require IO::All;
+       IO::All->import( '-binary' );
+
+       require Capture::Tiny;
+       Capture::Tiny->import ( 'capture' );
+
+       return;
+    }
+
+}
+
+sub readme_from {
+  my $self = shift;
+  return unless $self->is_admin;
+
+  _require_admin;
+
+  # Input file
+  my $in_file  = shift || $self->_all_from
+    or die "Can't determine file to make readme_from";
+
+  # Get optional arguments
+  my ($clean, $format, $out_file, $options);
+  my $args = shift;
+  if ( ref $args ) {
+    # Arguments are in a hashref
+    if ( ref($args) ne 'HASH' ) {
+      die "Expected a hashref but got a ".ref($args)."\n";
+    } else {
+      $clean    = $args->{'clean'};
+      $format   = $args->{'format'};
+      $out_file = $args->{'output_file'};
+      $options  = $args->{'options'};
+    }
+  } else {
+    # Arguments are in a list
+    $clean    = $args;
+    $format   = shift;
+    $out_file = shift;
+    $options  = \@_;
+  }
+
+  # Default values;
+  $clean  ||= 0;
+  $format ||= 'txt';
+
+  # Generate README
+  print "readme_from $in_file to $format\n";
+  if ($format =~ m/te?xt/) {
+    $out_file = $self->_readme_txt($in_file, $out_file, $options);
+  } elsif ($format =~ m/html?/) {
+    $out_file = $self->_readme_htm($in_file, $out_file, $options);
+  } elsif ($format eq 'man') {
+    $out_file = $self->_readme_man($in_file, $out_file, $options);
+  } elsif ($format eq 'md') {
+    $out_file = $self->_readme_md($in_file, $out_file, $options);
+  } elsif ($format eq 'pdf') {
+    $out_file = $self->_readme_pdf($in_file, $out_file, $options);
+  }
+
+  if ($clean) {
+    $self->clean_files($out_file);
+  }
+
+  return 1;
+}
+
+
+sub _readme_txt {
+  my ($self, $in_file, $out_file, $options) = @_;
+  $out_file ||= 'README';
+  require Pod::Text;
+  my $parser = Pod::Text->new( @$options );
+  my $io = io->file($out_file)->open(">");
+  my $out_fh = $io->io_handle;
+  $parser->output_fh( *$out_fh );
+  $parser->parse_file( $in_file );
+  return $out_file;
+}
+
+
+sub _readme_htm {
+  my ($self, $in_file, $out_file, $options) = @_;
+  $out_file ||= 'README.htm';
+  require Pod::Html;
+  my ($o) = capture {
+    Pod::Html::pod2html(
+      "--infile=$in_file",
+      "--outfile=-",
+      @$options,
+    );
+  };
+  io->file($out_file)->print($o);
+  # Remove temporary files if needed
+  for my $file ('pod2htmd.tmp', 'pod2htmi.tmp') {
+    if (-e $file) {
+      unlink $file or warn "Warning: Could not remove file '$file'.\n$!\n";
+    }
+  }
+  return $out_file;
+}
+
+
+sub _readme_man {
+  my ($self, $in_file, $out_file, $options) = @_;
+  $out_file ||= 'README.1';
+  require Pod::Man;
+  my $parser = Pod::Man->new( @$options );
+  my $io = io->file($out_file)->open(">");
+  my $out_fh = $io->io_handle;
+  $parser->output_fh( *$out_fh );
+  $parser->parse_file( $in_file );
+  return $out_file;
+}
+
+
+sub _readme_pdf {
+  my ($self, $in_file, $out_file, $options) = @_;
+  $out_file ||= 'README.pdf';
+  eval { require App::pod2pdf; }
+    or die "Could not generate $out_file because pod2pdf could not be found\n";
+  my $parser = App::pod2pdf->new( @$options );
+  $parser->parse_from_file($in_file);
+  my ($o) = capture { $parser->output };
+  io->file($out_file)->print($o);
+  return $out_file;
+}
+
+sub _readme_md {
+  my ($self, $in_file, $out_file, $options) = @_;
+  $out_file ||= 'README.md';
+  require Pod::Markdown;
+  my $parser = Pod::Markdown->new( @$options );
+  my $io = io->file($out_file)->open(">");
+  my $out_fh = $io->io_handle;
+  $parser->output_fh( *$out_fh );
+  $parser->parse_file( $in_file );
+  return $out_file;
+}
+
+
+sub _all_from {
+  my $self = shift;
+  return unless $self->admin->{extensions};
+  my ($metadata) = grep {
+    ref($_) eq 'Module::Install::Metadata';
+  } @{$self->admin->{extensions}};
+  return unless $metadata;
+  return $metadata->{values}{all_from} || '';
+}
+
+'Readme!';
+
+__END__
+
+#line 316
+
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ReadmeMarkdownFromPod.pm
 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ReadmeMarkdownFromPod.pm
new file mode 100644
index 0000000000..7d4755b7d0
--- /dev/null
+++ 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/ReadmeMarkdownFromPod.pm
@@ -0,0 +1,68 @@
+#line 1
+package Module::Install::ReadmeMarkdownFromPod;
+
+use 5.006;
+use strict;
+use warnings;
+
+our $VERSION = '0.04';
+
+use base qw(Module::Install::Base);
+
+sub readme_markdown_from {
+    my ($self, $file, $clean) = @_;
+    return unless $Module::Install::AUTHOR;
+    die "syntax: readme_markdown_from $file, [$clean]\n" unless $file;
+
+    # require, not use because otherwise Makefile.PL will complain if
+    # non-authors don't have Pod::Markdown, which would be bad.
+    require Pod::Markdown;
+    $self->admin->copy_package('Pod::Markdown', $INC{'Pod/Markdown.pm'});
+
+    my $parser = Pod::Markdown->new;
+    $parser->parse_from_file($file);
+    open my $fh, '>', 'README.mkdn' or die "$!\n";
+    print $fh $parser->as_markdown;
+    close $fh or die "$!\n";
+
+    return 1 unless $clean;
+    $self->postamble(<<"END");
+distclean :: license_clean
+
+license_clean:
+\t\$(RM_F) README.mkdn
+END
+    1;
+}
+
+sub readme_markdown_from_pod {
+    my ($self, $clean) = @_;
+    return unless $Module::Install::AUTHOR;
+    unless ($self->Meta->{values}{all_from}) {
+        die "set 'all_from' or use 'readme_markdown_from'\n";
+    }
+    $self->readme_markdown_from($self->Meta->{values}{all_from}, $clean);
+}
+
+sub readme_from_pod {
+    my ($self, $clean) = @_;
+    return unless $Module::Install::AUTHOR;
+    unless ($self->Meta->{values}{all_from}) {
+        die "set 'all_from' or use 'readme_from'\n";
+    }
+    $self->readme_from($self->Meta->{values}{all_from}, $clean);
+}
+
+sub reference_module {
+    my ($self, $file) = @_;
+    die "syntax: reference_module $file\n" unless $file;
+    $self->all_from($file);
+    $self->readme_from($file);
+    $self->readme_markdown_from($file);
+}
+
+1;
+
+__END__
+
+#line 188
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Win32.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Win32.pm
index 4f808c7179..f7aa6156ef 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Win32.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/Win32.pm
@@ -2,13 +2,13 @@
 package Module::Install::Win32;
 
 use strict;
-use Module::Install::Base;
+use Module::Install::Base ();
 
-use vars qw{$VERSION $ISCORE @ISA};
+use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-       $VERSION = '0.68';
+       $VERSION = '1.19';
+       @ISA     = 'Module::Install::Base';
        $ISCORE  = 1;
-       @ISA     = qw{Module::Install::Base};
 }
 
 # determine if the user needs nmake, and download it if needed
@@ -16,7 +16,7 @@ sub check_nmake {
        my $self = shift;
        $self->load('can_run');
        $self->load('get_file');
-       
+
        require Config;
        return unless (
                $^O eq 'MSWin32'                     and
@@ -38,8 +38,7 @@ sub check_nmake {
                remove    => 1,
        );
 
-       if (!$rv) {
-        die <<'END_MESSAGE';
+       die <<'END_MESSAGE' unless $rv;
 
 -------------------------------------------------------------------------------
 
@@ -59,7 +58,7 @@ You may then resume the installation process described in 
README.
 
 -------------------------------------------------------------------------------
 END_MESSAGE
-       }
+
 }
 
 1;
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/WriteAll.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/WriteAll.pm
index 078797c95a..2db861a06b 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/WriteAll.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Install/WriteAll.pm
@@ -2,42 +2,62 @@
 package Module::Install::WriteAll;
 
 use strict;
-use Module::Install::Base;
+use Module::Install::Base ();
 
-use vars qw{$VERSION $ISCORE @ISA};
+use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-       $VERSION = '0.68';
-       $ISCORE  = 1;
+       $VERSION = '1.19';
        @ISA     = qw{Module::Install::Base};
+       $ISCORE  = 1;
 }
 
 sub WriteAll {
-    my $self = shift;
-    my %args = (
-        meta        => 1,
-        sign        => 0,
-        inline      => 0,
-        check_nmake => 1,
-        @_
-    );
-
-    $self->sign(1)                if $args{sign};
-    $self->Meta->write            if $args{meta};
-    $self->admin->WriteAll(%args) if $self->is_admin;
-
-    if ( $0 =~ /Build.PL$/i ) {
-        $self->Build->write;
-    } else {
-        $self->check_nmake if $args{check_nmake};
-        unless ( $self->makemaker_args->{'PL_FILES'} ) {
-               $self->makemaker_args( PL_FILES => {} );
-        }
-        if ($args{inline}) {
-            $self->Inline->write;
-        } else {
-            $self->Makefile->write;
-        }
-    }
+       my $self = shift;
+       my %args = (
+               meta        => 1,
+               sign        => 0,
+               inline      => 0,
+               check_nmake => 1,
+               @_,
+       );
+
+       $self->sign(1)                if $args{sign};
+       $self->admin->WriteAll(%args) if $self->is_admin;
+
+       $self->check_nmake if $args{check_nmake};
+       unless ( $self->makemaker_args->{PL_FILES} ) {
+               # XXX: This still may be a bit over-defensive...
+               unless ($self->makemaker(6.25)) {
+                       $self->makemaker_args( PL_FILES => {} ) if -f 
'Build.PL';
+               }
+       }
+
+       # Until ExtUtils::MakeMaker support MYMETA.yml, make sure
+       # we clean it up properly ourself.
+       $self->realclean_files('MYMETA.yml');
+
+       if ( $args{inline} ) {
+               $self->Inline->write;
+       } else {
+               $self->Makefile->write;
+       }
+
+       # The Makefile write process adds a couple of dependencies,
+       # so write the META.yml files after the Makefile.
+       if ( $args{meta} ) {
+               $self->Meta->write;
+       }
+
+       # Experimental support for MYMETA
+       if ( $ENV{X_MYMETA} ) {
+               if ( $ENV{X_MYMETA} eq 'JSON' ) {
+                       $self->Meta->write_mymeta_json;
+               } else {
+                       $self->Meta->write_mymeta_yaml;
+               }
+       }
+
+       return 1;
 }
 
 1;
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Package.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Package.pm
new file mode 100644
index 0000000000..7ea98a9e11
--- /dev/null
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Module/Package.pm
@@ -0,0 +1,71 @@
+#line 1
+##
+# name:      Module::Package
+# abstract:  Postmodern Perl Module Packaging
+# author:    Ingy döt Net <ingy@cpan.org>
+# license:   perl
+# copyright: 2011
+# see:
+# - Module::Package::Plugin
+# - Module::Install::Package
+# - Module::Package::Tutorial
+
+package Module::Package;
+use 5.005;
+use strict;
+
+BEGIN {
+    $Module::Package::VERSION = '0.30';
+    $inc::Module::Package::VERSION ||= $Module::Package::VERSION;
+    @inc::Module::Package::ISA = __PACKAGE__;
+}
+
+sub import {
+    my $class = shift;
+    $INC{'inc/Module/Install.pm'} = __FILE__;
+    unshift @INC, 'inc' unless $INC[0] eq 'inc';
+    eval "use Module::Install 1.01 (); 1" or $class->error($@);
+
+    package main;
+    Module::Install->import();
+    eval {
+        module_package_internals_version_check($Module::Package::VERSION);
+        module_package_internals_init(@_);
+    };
+    if ($@) {
+        $Module::Package::ERROR = $@;
+        die $@;
+    }
+}
+
+# XXX Remove this when things are stable.
+sub error {
+    my ($class, $error) = @_;
+    if (-e 'inc' and not -e 'inc/.author') {
+        require Data::Dumper;
+        $Data::Dumper::Sortkeys = 1;
+        my $dump1 = Data::Dumper::Dumper(\%INC);
+        my $dump2 = Data::Dumper::Dumper(\@INC);
+        die <<"...";
+This should not have happened. Hopefully this dump will explain the problem:
+
+inc::Module::Package: $inc::Module::Package::VERSION
+Module::Package: $Module::Package::VERSION
+inc::Module::Install: $inc::Module::Install::VERSION
+Module::Install: $Module::Install::VERSION
+
+Error: $error
+
+%INC:
+$dump1
+\@INC:
+$dump2
+...
+    }
+    else {
+        die $error;
+    }
+}
+
+1;
+
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/inc/Pod/Markdown.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Pod/Markdown.pm
new file mode 100644
index 0000000000..b9b6305169
--- /dev/null
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/inc/Pod/Markdown.pm
@@ -0,0 +1,1186 @@
+#line 1
+# vim: set ts=2 sts=2 sw=2 expandtab smarttab:
+#
+# This file is part of Pod-Markdown
+#
+# This software is copyright (c) 2011 by Randy Stauner.
+#
+# This is free software; you can redistribute it and/or modify it under
+# the same terms as the Perl 5 programming language system itself.
+#
+use 5.008;
+use strict;
+use warnings;
+
+package Pod::Markdown;
+# git description: v3.100-2-g1399a61
+
+our $AUTHORITY = 'cpan:RWSTAUNER';
+# ABSTRACT: Convert POD to Markdown
+$Pod::Markdown::VERSION = '3.101';
+use Pod::Simple 3.27 (); # detected_encoding and keep_encoding bug fix
+use parent qw(Pod::Simple::Methody);
+use Encode ();
+
+our %URL_PREFIXES = (
+  sco      => 'http://search.cpan.org/perldoc?',
+  metacpan => 'https://metacpan.org/pod/',
+  man      => 'http://man.he.net/man',
+);
+$URL_PREFIXES{perldoc} = $URL_PREFIXES{metacpan};
+
+our $LOCAL_MODULE_RE = qr/^(Local::|\w*?_\w*)/;
+
+## no critic
+#{
+  our $HAS_HTML_ENTITIES;
+
+  # Stolen from Pod::Simple::XHTML 3.28. {{{
+
+  BEGIN {
+    $HAS_HTML_ENTITIES = eval "require HTML::Entities; 1";
+  }
+
+  my %entities = (
+    q{>} => 'gt',
+    q{<} => 'lt',
+    q{'} => '#39',
+    q{"} => 'quot',
+    q{&} => 'amp',
+  );
+
+  sub encode_entities {
+    my $self = shift;
+    my $ents = $self->html_encode_chars;
+    return HTML::Entities::encode_entities( $_[0], $ents ) if 
$HAS_HTML_ENTITIES;
+    if (defined $ents) {
+        $ents =~ s,(?<!\\)([]/]),\\$1,g;
+        $ents =~ s,(?<!\\)\\\z,\\\\,;
+    } else {
+        $ents = join '', keys %entities;
+    }
+    my $str = $_[0];
+    $str =~ s/([$ents])/'&' . ($entities{$1} || sprintf '#x%X', ord $1) . 
';'/ge;
+    return $str;
+  }
+
+  # }}}
+
+  # Add a few very common ones for consistency and readability
+  # (in case HTML::Entities isn't available).
+  %entities = (
+    # Pod::Markdown has always required 5.8 so unicode_to_native will be 
available.
+    chr(utf8::unicode_to_native(0xA0)) => 'nbsp',
+    chr(utf8::unicode_to_native(0xA9)) => 'copy',
+    %entities
+  );
+
+  sub __entity_encode_ord_he {
+    my $chr = chr $_[0];
+    # Skip the encode_entities() logic and go straight for the substitution
+    # since we already have the char we know we want replaced.
+    # Both the hash and the function are documented as exportable (so should 
be reliable).
+    return $HTML::Entities::char2entity{ $chr } || HTML::Entities::num_entity( 
$chr );
+  }
+  sub __entity_encode_ord_basic {
+    return '&' . ($entities{chr $_[0]} || sprintf '#x%X', $_[0]) . ';';
+  }
+
+  # From HTML::Entities 3.69
+  my $DEFAULT_ENTITY_CHARS = '^\n\r\t !\#\$%\(-;=?-~';
+
+#}
+## use critic
+
+# Use hash for simple "exists" check in `new` (much more accurate than 
`->can`).
+my %attributes = map { ($_ => 1) }
+  qw(
+    html_encode_chars
+    match_encoding
+    output_encoding
+    local_module_re
+    local_module_url_prefix
+    man_url_prefix
+    perldoc_url_prefix
+    perldoc_fragment_format
+    markdown_fragment_format
+    include_meta_tags
+  );
+
+
+sub new {
+  my $class = shift;
+  my %args = @_;
+
+  my $self = $class->SUPER::new();
+  $self->preserve_whitespace(1);
+  $self->nbsp_for_S(1);
+  $self->accept_targets(qw( markdown html ));
+
+  # Default to the global, but allow it to be overwritten in args.
+  $self->local_module_re($LOCAL_MODULE_RE);
+
+  for my $type ( qw( perldoc man ) ){
+    my $attr  = $type . '_url_prefix';
+    # Initialize to the alias.
+    $self->$attr($type);
+  }
+
+  while( my ($attr, $val) = each %args ){
+    # NOTE: Checking exists on a private var means we don't allow Pod::Simple
+    # attributes to be set this way.  It's not very consistent, but I think
+    # I'm ok with that for now since there probably aren't many Pod::Simple 
attributes
+    # being changed besides `output_*` which feel like API rather than 
attributes.
+    # We'll see.
+    # This is currently backward-compatible as we previously just put the 
attribute
+    # into the private stash so anything unknown was silently ignored.
+    # We could open this up to `$self->can($attr)` in the future if that seems 
better
+    # but it tricked me when I was testing a misspelled attribute name
+    # which also happened to be a Pod::Simple method.
+
+    exists $attributes{ $attr } or
+      # Provide a more descriptive message than "Can't locate object method".
+      warn("Unknown argument to ${class}->new(): '$attr'"), next;
+
+    # Call setter.
+    $self->$attr($val);
+  }
+
+  # TODO: call from the setters.
+  $self->_prepare_fragment_formats;
+
+  return $self;
+}
+
+for my $type ( qw( local_module perldoc man ) ){
+  my $attr  = $type . '_url_prefix';
+  no strict 'refs'; ## no critic
+  *$attr = sub {
+    my $self = shift;
+    if (@_) {
+      $self->{$attr} = $URL_PREFIXES{ $_[0] } || $_[0];
+    }
+    else {
+      return $self->{$attr};
+    }
+  }
+}
+
+## Attribute accessors ##
+
+
+sub html_encode_chars {
+  my $self  = shift;
+  my $stash = $self->_private;
+
+  # Setter.
+  if( @_ ){
+    # If false ('', 0, undef), disable.
+    if( !$_[0] ){
+      delete $stash->{html_encode_chars};
+      $stash->{encode_amp}  = 1;
+      $stash->{encode_lt}   = 1;
+    }
+    else {
+      # Special case boolean '1' to mean "all".
+      # If we have HTML::Entities, undef will use the default.
+      # Without it, we need to specify so that we use the same list (for 
consistency).
+      $stash->{html_encode_chars} = $_[0] eq '1' ? ($HAS_HTML_ENTITIES ? undef 
: $DEFAULT_ENTITY_CHARS) : $_[0];
+
+      # If [char] doesn't get encoded, we need to do it ourselves.
+      $stash->{encode_amp}  = ($self->encode_entities('&') eq '&');
+      $stash->{encode_lt}   = ($self->encode_entities('<') eq '<');
+    }
+    return;
+  }
+
+  # Getter.
+  return $stash->{html_encode_chars};
+}
+
+
+# I prefer ro-accessors (immutability!) but it can be confusing
+# to not support the same API as other Pod::Simple classes.
+
+# NOTE: Pod::Simple::_accessorize is not a documented public API.
+# Skip any that have already been defined.
+__PACKAGE__->_accessorize(grep { !__PACKAGE__->can($_) } keys %attributes);
+
+sub _prepare_fragment_formats {
+  my ($self) = @_;
+
+  foreach my $attr ( keys %attributes ){
+    next unless $attr =~ /^(\w+)_fragment_format/;
+    my $type = $1;
+    my $format = $self->$attr;
+
+    # If one was provided.
+    if( $format ){
+      # If the attribute is a coderef just use it.
+      next if ref($format) eq 'CODE';
+    }
+    # Else determine a default.
+    else {
+      if( $type eq 'perldoc' ){
+        # Choose a default that matches the destination url.
+        my $target = $self->perldoc_url_prefix;
+        foreach my $alias ( qw( metacpan sco ) ){
+          if( $target eq $URL_PREFIXES{ $alias } ){
+            $format = $alias;
+          }
+        }
+        # This seems like a reasonable fallback.
+        $format ||= 'pod_simple_xhtml';
+      }
+      else {
+        $format = $type;
+      }
+    }
+
+    # The short name should become a method name with the prefix prepended.
+    my $prefix = 'format_fragment_';
+    $format =~ s/^$prefix//;
+    die "Unknown fragment format '$format'"
+      unless $self->can($prefix . $format);
+
+    # Save it.
+    $self->$attr($format);
+  }
+
+  return;
+}
+
+## Backward compatible API ##
+
+# For backward compatibility (previously based on Pod::Parser):
+# While Pod::Simple provides a parse_from_file() method
+# it's primarily for Pod::Parser compatibility.
+# When called without an output handle it will print to STDOUT
+# but the old Pod::Markdown never printed to a handle
+# so we don't want to start now.
+sub parse_from_file {
+  my ($self, $file) = @_;
+
+  # TODO: Check that all dependent cpan modules use the Pod::Simple API
+  # then add a deprecation warning here to avoid confusion.
+
+  $self->output_string(\($self->{_as_markdown_}));
+  $self->parse_file($file);
+}
+
+# Likewise, though Pod::Simple doesn't define this method at all.
+sub parse_from_filehandle { shift->parse_from_file(@_) }
+
+
+## Document state ##
+
+sub _private {
+  my ($self) = @_;
+  $self->{_Pod_Markdown_} ||= {
+    indent      => 0,
+    stacks      => [],
+    states      => [{}],
+    link        => [],
+    encode_amp  => 1,
+    encode_lt   => 1,
+  };
+}
+
+sub _increase_indent {
+  ++$_[0]->_private->{indent} >= 1
+    or die 'Invalid state: indent < 0';
+}
+sub _decrease_indent {
+  --$_[0]->_private->{indent} >= 0
+    or die 'Invalid state: indent < 0';
+}
+
+sub _new_stack {
+  push @{ $_[0]->_private->{stacks} }, [];
+  push @{ $_[0]->_private->{states} }, {};
+}
+
+sub _last_string {
+  $_[0]->_private->{stacks}->[-1][-1];
+}
+
+sub _pop_stack_text {
+  $_[0]->_private->{last_state} = pop @{ $_[0]->_private->{states} };
+  join '', @{ pop @{ $_[0]->_private->{stacks} } };
+}
+
+sub _stack_state {
+  $_[0]->_private->{states}->[-1];
+}
+
+sub _save {
+  my ($self, $text) = @_;
+  push @{ $self->_private->{stacks}->[-1] }, $text;
+  # return $text; # DEBUG
+}
+
+sub _save_line {
+  my ($self, $text) = @_;
+
+  $text = $self->_process_escapes($text);
+
+  $self->_save($text . $/);
+}
+
+# For paragraphs, etc.
+sub _save_block {
+  my ($self, $text) = @_;
+
+  $self->_stack_state->{blocks}++;
+
+  $self->_save_line($self->_indent($text) . $/);
+}
+
+## Formatting ##
+
+sub _chomp_all {
+  my ($self, $text) = @_;
+  1 while chomp $text;
+  return $text;
+}
+
+sub _indent {
+  my ($self, $text) = @_;
+  my $level = $self->_private->{indent};
+
+  if( $level ){
+    my $indent = ' ' x ($level * 4);
+
+    # Capture text on the line so that we don't indent blank lines 
(/^\x20{4}$/).
+    $text =~ s/^(.+)/$indent$1/mg;
+  }
+
+  return $text;
+}
+
+# as_markdown() exists solely for backward compatibility
+# and requires having called parse_from_file() to be useful.
+
+
+sub as_markdown {
+    my ($parser, %args) = @_;
+    my @header;
+    # Don't add meta tags again if we've already done it.
+    if( $args{with_meta} && !$parser->include_meta_tags ){
+        @header = $parser->_build_markdown_head;
+    }
+    return join("\n" x 2, @header, $parser->{_as_markdown_});
+}
+
+sub _build_markdown_head {
+    my $parser    = shift;
+    my $data      = $parser->_private;
+    return join "\n",
+        map  { qq![[meta \l$_="$data->{$_}"]]! }
+        grep { defined $data->{$_} }
+        qw( Title Author );
+}
+
+## Escaping ##
+
+# http://daringfireball.net/projects/markdown/syntax#backslash
+# Markdown provides backslash escapes for the following characters:
+#
+# \   backslash
+# `   backtick
+# *   asterisk
+# _   underscore
+# {}  curly braces
+# []  square brackets
+# ()  parentheses
+# #   hash mark
+# +   plus sign
+# -   minus sign (hyphen)
+# .   dot
+# !   exclamation mark
+
+# However some of those only need to be escaped in certain places:
+# * Backslashes *do* need to be escaped or they may be swallowed by markdown.
+# * Word-surrounding characters (/[`*_]/) *do* need to be escaped mid-word
+# because the markdown spec explicitly allows mid-word em*pha*sis.
+# * I don't actually see anything that curly braces are used for.
+# * Escaping square brackets is enough to avoid accidentally
+# creating links and images (so we don't need to escape plain parentheses
+# or exclamation points as that would generate a lot of unnecesary noise).
+# Parentheses will be escaped in urls (&end_L) to avoid premature termination.
+# * We don't need a backslash for every hash mark or every hyphen found 
mid-word,
+# just the ones that start a line (likewise for plus and dot).
+# (Those will all be handled by _escape_paragraph_markdown).
+
+
+# Backslash escape markdown characters to avoid having them interpreted.
+sub _escape_inline_markdown {
+  local $_ = $_[1];
+
+# s/([\\`*_{}\[\]()#+-.!])/\\$1/g; # See comments above.
+  s/([\\`*_\[\]])/\\$1/g;
+
+  return $_;
+}
+
+# Escape markdown characters that would be interpreted
+# at the start of a line.
+sub _escape_paragraph_markdown {
+    local $_ = $_[1];
+
+    # Escape headings, horizontal rules, (unordered) lists, and blockquotes.
+    s/^([-+#>])/\\$1/mg;
+
+    # Markdown doesn't support backslash escapes for equal signs
+    # even though they can be used to underline a header.
+    # So use html to escape them to avoid having them interpreted.
+    s/^([=])/sprintf '&#x%x;', ord($1)/mge;
+
+    # Escape the dots that would wrongfully create numbered lists.
+    s/^( (?:>\s+)? \d+ ) (\.\x20)/$1\\$2/xgm;
+
+    return $_;
+}
+
+
+# Additionally Markdown allows inline html so we need to escape things that 
look like it.
+# While _some_ Markdown processors handle backslash-escaped html,
+# [Daring Fireball](http://daringfireball.net/projects/markdown/syntax) states 
distinctly:
+# > In HTML, there are two characters that demand special treatment: < and &...
+# > If you want to use them as literal characters, you must escape them as 
entities, e.g. &lt;, and &amp;.
+
+# It goes on to say:
+# > Markdown allows you to use these characters naturally,
+# > taking care of all the necessary escaping for you.
+# > If you use an ampersand as part of an HTML entity,
+# > it remains unchanged; otherwise it will be translated into &amp;.
+# > Similarly, because Markdown supports inline HTML,
+# > if you use angle brackets as delimiters for HTML tags, Markdown will treat 
them as such.
+
+# In order to only encode the occurrences that require it (something that
+# could be interpreted as an entity) we escape them all so that we can do the
+# suffix test later after the string is complete (since we don't know what
+# strings might come after this one).
+
+my %_escape =
+  map {
+    my ($k, $v) = split /:/;
+    # Put the "code" marker before the char instead of after so that it doesn't
+    # get confused as the $2 (which is what requires us to entity-encode it).
+    # ( "XsX", "XcsX", "X(c?)sX" )
+    my ($s, $code, $re) = map { "\0$_$v\0" } '', map { ($_, '('.$_.'?)') } 'c';
+
+    (
+      $k         => $s,
+      $k.'_code' => $code,
+      $k.'_re'   => qr/$re/,
+    )
+  }
+    qw( amp:& lt:< );
+
+# Make the values of this private var available to the tests.
+sub __escape_sequences { %_escape }
+
+
+# HTML-entity encode any characters configured by the user.
+# If that doesn't include [&<] then we escape those chars so we can decide
+# later if we will entity-encode them or put them back verbatim.
+sub _encode_or_escape_entities {
+  my $self  = $_[0];
+  my $stash = $self->_private;
+  local $_  = $_[1];
+
+  if( $stash->{encode_amp} ){
+    if( exists($stash->{html_encode_chars}) ){
+      # Escape all amps for later processing.
+      # Pass intermediate strings to entity encoder so that it doesn't
+      # process any of the characters of our escape sequences.
+      # Use -1 to get "as many fields as possible" so that we keep leading and
+      # trailing (possibly empty) fields.
+      $_ = join $_escape{amp}, map { $self->encode_entities($_) } split /&/, 
$_, -1;
+    }
+    else {
+      s/&/$_escape{amp}/g;
+    }
+  }
+  elsif( exists($stash->{html_encode_chars}) ){
+    $_ = $self->encode_entities($_);
+  }
+
+  s/</$_escape{lt}/g
+    if $stash->{encode_lt};
+
+  return $_;
+}
+
+# From Markdown.pl version 1.0.1 line 1172 (_DoAutoLinks).
+my $EMAIL_MARKER = qr{
+#   <                  # Opening token is in parent regexp.
+        (?:mailto:)?
+    (
+      [-.\w]+
+      \@
+      [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
+    )
+    >
+}x;
+
+# Process any escapes we put in the text earlier,
+# now that the text is complete (end of a block).
+sub _process_escapes {
+  my $self  = $_[0];
+  my $stash = $self->_private;
+  local $_  = $_[1];
+
+  # The patterns below are taken from Markdown.pl 1.0.1 _EncodeAmpsAndAngles().
+  # In this case we only want to encode the ones that Markdown won't.
+  # This is overkill but produces nicer looking text (less escaped entities).
+  # If it proves insufficent then we'll just encode them all.
+
+  # $1: If the escape was in a code sequence, simply replace the original.
+  # $2: If the unescaped value would be followed by characters
+  #     that could be interpreted as html, entity-encode it.
+  # else: The character is safe to leave bare.
+
+  # Neither currently allows $2 to contain '0' so bool tests are sufficient.
+
+  if( $stash->{encode_amp} ){
+    # Encode & if succeeded by chars that look like an html entity.
+    s,$_escape{amp_re}((?:#?[xX]?(?:[0-9a-fA-F]+|\w+);)?),
+      $1 ? '&'.$2 : $2 ? '&amp;'.$2 : '&',egos;
+  }
+
+  if( $stash->{encode_lt} ){
+    # Encode < if succeeded by chars that look like an html tag.
+    # Leave email addresses (<foo@bar.com>) for Markdown to process.
+    s,$_escape{lt_re}((?=$EMAIL_MARKER)|(?:[a-z/?\$!])?),
+      $1 ? '<'.$2 : $2 ?  '&lt;'.$2 : '<',egos;
+  }
+
+  return $_;
+}
+
+
+## Parsing ##
+
+sub handle_text {
+  my $self  = $_[0];
+  my $stash = $self->_private;
+  local $_  = $_[1];
+
+  # Unless we're in a code span, verbatim block, or formatted region.
+  unless( $stash->{no_escape} ){
+
+    # We could, in theory, alter what gets escaped according to context
+    # (for example, escape square brackets (but not parens) inside link text).
+    # The markdown produced might look slightly nicer but either way you're
+    # at the whim of the markdown processor to interpret things correctly.
+    # For now just escape everything.
+
+    # Don't let literal characters be interpreted as markdown.
+    $_ = $self->_escape_inline_markdown($_);
+
+    # Entity-encode (or escape for later processing) necessary/desired chars.
+    $_ = $self->_encode_or_escape_entities($_);
+
+  }
+  # If this _is_ a code section, do limited/specific handling.
+  else {
+    # Always escaping these chars ensures that we won't mangle the text
+    # in the unlikely event that a sequence matching our escape occurred in the
+    # input stream (since we're going to escape it and then unescape it).
+    s/&/$_escape{amp_code}/gos if $stash->{encode_amp};
+    s/</$_escape{lt_code}/gos  if $stash->{encode_lt};
+  }
+
+  $self->_save($_);
+}
+
+sub start_Document {
+  my ($self) = @_;
+  $self->_new_stack;
+}
+
+sub   end_Document {
+  my ($self) = @_;
+  $self->_check_search_header;
+  my $end = pop @{ $self->_private->{stacks} };
+
+  @{ $self->_private->{stacks} } == 0
+    or die 'Document ended with stacks remaining';
+
+  my @doc = $self->_chomp_all(join('', @$end)) . $/;
+
+  if( $self->include_meta_tags ){
+    unshift @doc, $self->_build_markdown_head, ($/ x 2);
+  }
+
+  if( my $encoding = $self->_get_output_encoding ){
+    # Do the check outside the loop(s) for efficiency.
+    my $ents = $HAS_HTML_ENTITIES ? \&__entity_encode_ord_he : 
\&__entity_encode_ord_basic;
+    # Iterate indices to avoid copying large strings.
+    for my $i ( 0 .. $#doc ){
+      print { $self->{output_fh} } Encode::encode($encoding, $doc[$i], $ents);
+    }
+  }
+  else {
+    print { $self->{output_fh} } @doc;
+  }
+}
+
+sub _get_output_encoding {
+  my ($self) = @_;
+
+  # If 'match_encoding' is set we need to return an encoding.
+  # If pod has no =encoding, Pod::Simple will guess if it sees a high-bit char.
+  # If there are no high-bit chars, encoding is undef.
+  # Use detected_encoding() rather than encoding() because if Pod::Simple
+  # can't use whatever encoding was specified, we probably can't either.
+  # Fallback to 'o_e' if no match is found.  This gives the user the choice,
+  # since otherwise there would be no reason to specify 'o_e' *and* 'm_e'.
+  # Fallback to UTF-8 since it is a reasonable default these days.
+
+  return $self->detected_encoding || $self->output_encoding || 'UTF-8'
+    if $self->match_encoding;
+
+  # If output encoding wasn't specified, return false.
+  return $self->output_encoding;
+}
+
+## Blocks ##
+
+sub start_Verbatim {
+  my ($self) = @_;
+  $self->_new_stack;
+  $self->_private->{no_escape} = 1;
+}
+
+sub end_Verbatim {
+  my ($self) = @_;
+
+  my $text = $self->_pop_stack_text;
+
+  $text = $self->_indent_verbatim($text);
+
+  $self->_private->{no_escape} = 0;
+
+  # Verbatim blocks do not generate a separate "Para" event.
+  $self->_save_block($text);
+}
+
+sub _indent_verbatim {
+  my ($self, $paragraph) = @_;
+
+    # NOTE: Pod::Simple expands the tabs for us (as suggested by perlpodspec).
+    # Pod::Simple also has a 'strip_verbatim_indent' attribute
+    # but it doesn't sound like it gains us anything over this method.
+
+    # POD verbatim can start with any number of spaces (or tabs)
+    # markdown should be 4 spaces (or a tab)
+    # so indent any paragraphs so that all lines start with at least 4 spaces
+    my @lines = split /\n/, $paragraph;
+    my $indent = ' ' x 4;
+    foreach my $line ( @lines ){
+        next unless $line =~ m/^( +)/;
+        # find the smallest indentation
+        $indent = $1 if length($1) < length($indent);
+    }
+    if( (my $smallest = length($indent)) < 4 ){
+        # invert to get what needs to be prepended
+        $indent = ' ' x (4 - $smallest);
+
+        # Prepend indent to each line.
+        # We could check /\S/ to only indent non-blank lines,
+        # but it's backward compatible to respect the whitespace.
+        # Additionally, both pod and markdown say they ignore blank lines
+        # so it shouldn't hurt to leave them in.
+        $paragraph = join "\n", map { length($_) ? $indent . $_ : '' } @lines;
+    }
+
+  return $paragraph;
+}
+
+sub start_Para {
+  $_[0]->_new_stack;
+}
+
+sub   end_Para {
+  my ($self) = @_;
+  my $text = $self->_pop_stack_text;
+
+  $text = $self->_escape_paragraph_markdown($text);
+
+  $self->_save_block($text);
+}
+
+
+## Headings ##
+
+sub start_head1 { $_[0]->_start_head(1) }
+sub   end_head1 { $_[0]->_end_head(1) }
+sub start_head2 { $_[0]->_start_head(2) }
+sub   end_head2 { $_[0]->_end_head(2) }
+sub start_head3 { $_[0]->_start_head(3) }
+sub   end_head3 { $_[0]->_end_head(3) }
+sub start_head4 { $_[0]->_start_head(4) }
+sub   end_head4 { $_[0]->_end_head(4) }
+
+sub _check_search_header {
+  my ($self) = @_;
+  # Save the text since the last heading if we want it for metadata.
+  if( my $last = $self->_private->{search_header} ){
+    for( $self->_private->{$last} = $self->_last_string ){
+      s/\A\s+//;
+      s/\s+\z//;
+    }
+  }
+}
+sub _start_head {
+  my ($self) = @_;
+  $self->_check_search_header;
+  $self->_new_stack;
+}
+
+sub   _end_head {
+  my ($self, $num) = @_;
+  my $h = '#' x $num;
+
+  my $text = $self->_pop_stack_text;
+  $self->_private->{search_header} =
+      $text =~ /NAME/   ? 'Title'
+    : $text =~ /AUTHOR/ ? 'Author'
+    : undef;
+
+  # TODO: option for $h suffix
+  # TODO: put a name="" if $self->{embed_anchor_tags}; ?
+  # https://rt.cpan.org/Ticket/Display.html?id=57776
+  $self->_save_block(join(' ', $h, $text));
+}
+
+## Lists ##
+
+# With Pod::Simple->parse_empty_lists(1) there could be an over_empty event,
+# but what would you do with that?
+
+sub _start_list {
+  my ($self) = @_;
+  $self->_new_stack;
+
+  # Nest again b/c start_item will pop this to look for preceding content.
+  $self->_increase_indent;
+  $self->_new_stack;
+}
+
+sub   _end_list {
+  my ($self) = @_;
+  $self->_handle_between_item_content;
+
+  # Finish the list.
+
+  # All the child elements should be blocks,
+  # but don't end with a double newline.
+  my $text = $self->_chomp_all($self->_pop_stack_text);
+
+  $_[0]->_save_line($text . $/);
+}
+
+sub _handle_between_item_content {
+  my ($self) = @_;
+
+  # This might be empty (if the list item had no additional content).
+  if( my $text = $self->_pop_stack_text ){
+    # Else it's a sub-document.
+    # If there are blocks we need to separate with blank lines.
+    if( $self->_private->{last_state}->{blocks} ){
+      $text = $/ . $text;
+    }
+    # If not, we can condense the text.
+    # In this module's history there was a patch contributed to specifically
+    # produce "huddled" lists so we'll try to maintain that functionality.
+    else {
+      $text = $self->_chomp_all($text) . $/;
+    }
+    $self->_save($text)
+  }
+
+  $self->_decrease_indent;
+}
+
+sub _start_item {
+  my ($self) = @_;
+  $self->_handle_between_item_content;
+  $self->_new_stack;
+}
+
+sub   _end_item {
+  my ($self, $marker) = @_;
+  my $text = $self->_pop_stack_text;
+  $self->_save_line($self->_indent($marker .
+    # Add a space only if there is text after the marker.
+    (defined($text) && length($text) ? ' ' . $text : '')
+  ));
+
+  # Store any possible contents in a new stack (like a sub-document).
+  $self->_increase_indent;
+  $self->_new_stack;
+}
+
+sub start_over_bullet { $_[0]->_start_list }
+sub   end_over_bullet { $_[0]->_end_list }
+
+sub start_item_bullet { $_[0]->_start_item }
+sub   end_item_bullet { $_[0]->_end_item('-') }
+
+sub start_over_number { $_[0]->_start_list }
+sub   end_over_number { $_[0]->_end_list }
+
+sub start_item_number {
+  $_[0]->_start_item;
+  # It seems like this should be a stack,
+  # but from testing it appears that the corresponding 'end' event
+  # comes right after the text (it doesn't surround any embedded content).
+  # See t/nested.t which shows start-item, text, end-item, para, start-item....
+  $_[0]->_private->{item_number} = $_[1]->{number};
+}
+
+sub   end_item_number {
+  my ($self) = @_;
+  $self->_end_item($self->_private->{item_number} . '.');
+}
+
+# Markdown doesn't support definition lists
+# so do regular (unordered) lists with indented paragraphs.
+sub start_over_text { $_[0]->_start_list }
+sub   end_over_text { $_[0]->_end_list }
+
+sub start_item_text { $_[0]->_start_item }
+sub   end_item_text { $_[0]->_end_item('-')}
+
+
+# perlpodspec equates an over/back region with no items to a blockquote.
+sub start_over_block {
+  # NOTE: We don't actually need to indent for a blockquote.
+  $_[0]->_new_stack;
+}
+
+sub   end_over_block {
+  my ($self) = @_;
+
+  # Chomp first to avoid prefixing a blank line with a `>`.
+  my $text = $self->_chomp_all($self->_pop_stack_text);
+
+  # NOTE: Paragraphs will already be escaped.
+
+  # I don't really like either of these implementations
+  # but the join/map/split seems a little better and benches a little faster.
+  # You would lose the last newline but we've already chomped.
+  #$text =~ s{^(.)?}{'>' . (defined($1) && length($1) ? (' ' . $1) : '')}mge;
+  $text = join $/, map { length($_) ? '> ' . $_ : '>' } split qr-$/-, $text;
+
+  $self->_save_block($text);
+}
+
+## Custom Formats ##
+
+sub start_for {
+  my ($self, $attr) = @_;
+  $self->_new_stack;
+
+  if( $attr->{target} eq 'html' ){
+    # Use another stack so we can indent
+    # (not syntactily necessary but seems appropriate).
+    $self->_new_stack;
+    $self->_increase_indent;
+    $self->_private->{no_escape} = 1;
+    # Mark this so we know to undo it.
+    $self->_stack_state->{for_html} = 1;
+  }
+}
+
+sub end_for {
+  my ($self) = @_;
+  # Data gets saved as a block (which will handle indents),
+  # but if there was html we'll alter this, so chomp and save a block again.
+  my $text = $self->_chomp_all($self->_pop_stack_text);
+
+  if( $self->_private->{last_state}->{for_html} ){
+    $self->_private->{no_escape} = 0;
+    # Save it to the next stack up so we can pop it again (we made two stacks).
+    $self->_save($text);
+    $self->_decrease_indent;
+    $text = join "\n", '<div>', $self->_chomp_all($self->_pop_stack_text), 
'</div>';
+  }
+
+  $self->_save_block($text);
+}
+
+# Data events will be emitted for any formatted regions that have been enabled
+# (by default, `markdown` and `html`).
+
+sub start_Data {
+  my ($self) = @_;
+  # TODO: limit this to what's in attr?
+  $self->_private->{no_escape}++;
+  $self->_new_stack;
+}
+
+sub   end_Data {
+  my ($self) = @_;
+  my $text = $self->_pop_stack_text;
+  $self->_private->{no_escape}--;
+  $self->_save_block($text);
+}
+
+## Codes ##
+
+sub start_B { $_[0]->_save('**') }
+sub   end_B { $_[0]->start_B()   }
+
+sub start_I { $_[0]->_save('_') }
+sub   end_I { $_[0]->start_I()  }
+
+sub start_C {
+  my ($self) = @_;
+  $self->_new_stack;
+  $self->_private->{no_escape}++;
+}
+
+sub   end_C {
+  my ($self) = @_;
+  $self->_private->{no_escape}--;
+  $self->_save( $self->_wrap_code_span($self->_pop_stack_text) );
+}
+
+# Use code spans for F<>.
+sub start_F { shift->start_C(@_); }
+sub   end_F { shift  ->end_C(@_); }
+
+sub start_L {
+  my ($self, $flags) = @_;
+  $self->_new_stack;
+  push @{ $self->_private->{link} }, $flags;
+}
+
+sub   end_L {
+  my ($self) = @_;
+  my $flags = pop @{ $self->_private->{link} }
+    or die 'Invalid state: link end with no link start';
+
+  my ($type, $to, $section) = @{$flags}{qw( type to section )};
+
+  my $url = (
+    $type eq 'url' ? $to
+      : $type eq 'man' ? $self->format_man_url($to, $section)
+      : $type eq 'pod' ? $self->format_perldoc_url($to, $section)
+      :                  undef
+  );
+
+  my $text = $self->_pop_stack_text;
+
+  # NOTE: I don't think the perlpodspec says what to do with L<|blah>
+  # but it seems like a blank link text just doesn't make sense
+  if( !length($text) ){
+    $text =
+      $section ?
+        $to ? sprintf('"%s" in %s', $section, $to)
+        : ('"' . $section . '"')
+      : $to;
+  }
+
+  # FIXME: What does Pod::Simple::X?HTML do for this?
+  # if we don't know how to handle the url just print the pod back out
+  if (!$url) {
+    $self->_save(sprintf 'L<%s>', $flags->{raw});
+    return;
+  }
+
+  # In the url we need to escape quotes and parentheses lest markdown
+  # break the url (cut it short and/or wrongfully interpret a title).
+
+  # Backslash escapes do not work for the space and quotes.
+  # URL-encoding the space is not sufficient
+  # (the quotes confuse some parsers and produce invalid html).
+  # I've arbitratily chosen HTML encoding to hide them from markdown
+  # while mangling the url as litle as possible.
+  $url =~ s/([ '"])/sprintf '&#x%x;', ord($1)/ge;
+
+  # We also need to double any backslashes that may be present
+  # (lest they be swallowed up) and stop parens from breaking the url.
+  $url =~ s/([\\()])/\\$1/g;
+
+  # TODO: put section name in title if not the same as $text
+  $self->_save('[' . $text . '](' . $url . ')');
+}
+
+sub start_X {
+  $_[0]->_new_stack;
+}
+
+sub   end_X {
+  my ($self) = @_;
+  my $text = $self->_pop_stack_text;
+  # TODO: mangle $text?
+  # TODO: put <a name="$text"> if configured
+}
+
+# A code span can be delimited by multiple backticks (and a space)
+# similar to pod codes (C<< code >>), so ensure we use a big enough
+# delimiter to not have it broken by embedded backticks.
+sub _wrap_code_span {
+  my ($self, $arg) = @_;
+  my $longest = 0;
+  while( $arg =~ /([`]+)/g ){
+    my $len = length($1);
+    $longest = $len if $longest < $len;
+  }
+  my $delim = '`' x ($longest + 1);
+  my $pad = $longest > 0 ? ' ' : '';
+  return $delim . $pad . $arg . $pad . $delim;
+}
+
+## Link Formatting (TODO: Move this to another module) ##
+
+
+sub format_man_url {
+    my ($self, $to) = @_;
+    my ($page, $part) = ($to =~ /^ ([^(]+) (?: \( (\S+) \) )? /x);
+    return $self->man_url_prefix . ($part || 1) . '/' . ($page || $to);
+}
+
+
+sub format_perldoc_url {
+  my ($self, $name, $section) = @_;
+
+  my $url_prefix = defined($name)
+    && $self->is_local_module($name)
+    && $self->local_module_url_prefix
+    || $self->perldoc_url_prefix;
+
+  my $url = '';
+
+  # If the link is to another module (external link).
+  if ($name) {
+    $url = $url_prefix . $name;
+  }
+
+  # See https://rt.cpan.org/Ticket/Display.html?id=57776
+  # for a discussion on the need to mangle the section.
+  if ($section){
+
+    my $method = $url
+      # If we already have a prefix on the url it's external.
+      ? $self->perldoc_fragment_format
+      # Else an internal link points to this markdown doc.
+      : $self->markdown_fragment_format;
+
+    $method = 'format_fragment_' . $method
+      unless ref($method);
+
+    {
+      # Set topic to enable code refs to be simple.
+      local $_ = $section;
+      $section = $self->$method($section);
+    }
+
+    $url .= '#' . $section;
+  }
+
+  return $url;
+}
+
+
+# TODO: simple, pandoc, etc?
+
+sub format_fragment_markdown {
+  my ($self, $section) = @_;
+
+  # If this is an internal link (to another section in this doc)
+  # we can't be sure what the heading id's will look like
+  # (it depends on what is rendering the markdown to html)
+  # but we can try to follow popular conventions.
+
+  # 
http://johnmacfarlane.net/pandoc/demo/example9/pandocs-markdown.html#header-identifiers-in-html-latex-and-context
+  #$section =~ s/(?![-_.])[[:punct:]]//g;
+  #$section =~ s/\s+/-/g;
+  $section =~ s/\W+/-/g;
+  $section =~ s/-+$//;
+  $section =~ s/^-+//;
+  $section = lc $section;
+  #$section =~ s/^[^a-z]+//;
+  $section ||= 'section';
+
+  return $section;
+}
+
+
+{
+  # From Pod::Simple::XHTML 3.28.
+  # The strings gets passed through encode_entities() before idify().
+  # If we don't do it here the substitutions below won't operate consistently.
+
+  sub format_fragment_pod_simple_xhtml {
+    my ($self, $t) = @_;
+
+    # encode_entities {
+      # We need to use the defaults in case html_encode_chars has been 
customized
+      # (since the purpose is to match what external sources are doing).
+
+      local $self->_private->{html_encode_chars};
+      $t = $self->encode_entities($t);
+    # }
+
+    # idify {
+      for ($t) {
+          s/<[^>]+>//g;            # Strip HTML.
+          s/&[^;]+;//g;            # Strip entities.
+          s/^\s+//; s/\s+$//;      # Strip white space.
+          s/^([^a-zA-Z]+)$/pod$1/; # Prepend "pod" if no valid chars.
+          s/^[^a-zA-Z]+//;         # First char must be a letter.
+          s/[^-a-zA-Z0-9_:.]+/-/g; # All other chars must be valid.
+          s/[-:.]+$//;             # Strip trailing punctuation.
+      }
+    # }
+
+    return $t;
+  }
+}
+
+
+sub format_fragment_pod_simple_html {
+  my ($self, $section) = @_;
+
+  # From Pod::Simple::HTML 3.28.
+
+  # section_name_tidy {
+    $section =~ s/^\s+//;
+    $section =~ s/\s+$//;
+    $section =~ tr/ /_/;
+    $section =~ tr/\x00-\x1F\x80-\x9F//d if 'A' eq chr(65); # drop crazy 
characters
+
+    #$section = $self->unicode_escape_url($section);
+      # unicode_escape_url {
+      $section =~ s/([^\x00-\xFF])/'('.ord($1).')'/eg;
+        #  Turn char 1234 into "(1234)"
+      # }
+
+    $section = '_' unless length $section;
+    return $section;
+  # }
+}
+
+
+sub format_fragment_metacpan { shift->format_fragment_pod_simple_xhtml(@_); }
+sub format_fragment_sco      { shift->format_fragment_pod_simple_html(@_);  }
+
+
+sub is_local_module {
+  my ($self, $name) = @_;
+
+  return ($name =~ $self->local_module_re);
+}
+
+1;
+
+__END__
+
+#line 1669
diff --git 
a/tp/maintain/lib/Unicode-EastAsianWidth/lib/Unicode/EastAsianWidth.pm 
b/tp/maintain/lib/Unicode-EastAsianWidth/lib/Unicode/EastAsianWidth.pm
index 5abdce5c86..7454c20b0c 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/lib/Unicode/EastAsianWidth.pm
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/lib/Unicode/EastAsianWidth.pm
@@ -6,7 +6,7 @@ use base 'Exporter';
 use vars qw( $VERSION $EastAsian );
 
 BEGIN {
-    $VERSION = '1.30';
+    $VERSION = '12.0';
     $EastAsian = 0;
 };
 
@@ -42,9 +42,13 @@ sub InEastAsianAmbiguous {
 00A7\t00A8
 00AA\t00AA
 00AD\t00AE
-00B0\t00B4
-00B6\t00BA
-00BC\t00BF
+00B0\t00B1
+00B2\t00B3
+00B4\t00B4
+00B6\t00B7
+00B8\t00BA
+00BC\t00BE
+00BF\t00BF
 00C6\t00C6
 00D0\t00D0
 00D7\t00D8
@@ -54,7 +58,8 @@ sub InEastAsianAmbiguous {
 00EC\t00ED
 00F0\t00F0
 00F2\t00F3
-00F7\t00FA
+00F7\t00F7
+00F8\t00FA
 00FC\t00FC
 00FE\t00FE
 0101\t0101
@@ -91,14 +96,16 @@ sub InEastAsianAmbiguous {
 02DD\t02DD
 02DF\t02DF
 0300\t036F
-0391\t03A9
+0391\t03A1
+03A3\t03A9
 03B1\t03C1
 03C3\t03C9
 0401\t0401
 0410\t044F
 0451\t0451
 2010\t2010
-2013\t2016
+2013\t2015
+2016\t2016
 2018\t2019
 201C\t201D
 2020\t2022
@@ -124,7 +131,9 @@ sub InEastAsianAmbiguous {
 215B\t215E
 2160\t216B
 2170\t2179
-2190\t2199
+2189\t2189
+2190\t2194
+2195\t2199
 21B8\t21B9
 21D2\t21D2
 21D4\t21D4
@@ -158,8 +167,10 @@ sub InEastAsianAmbiguous {
 22A5\t22A5
 22BF\t22BF
 2312\t2312
-2460\t24E9
-24EB\t254B
+2460\t249B
+249C\t24E9
+24EB\t24FF
+2500\t254B
 2550\t2573
 2580\t258F
 2592\t2595
@@ -177,7 +188,6 @@ sub InEastAsianAmbiguous {
 2605\t2606
 2609\t2609
 260E\t260F
-2614\t2615
 261C\t261C
 261E\t261E
 2640\t2640
@@ -187,11 +197,31 @@ sub InEastAsianAmbiguous {
 2667\t266A
 266C\t266D
 266F\t266F
+269E\t269F
+26BF\t26BF
+26C6\t26CD
+26CF\t26D3
+26D5\t26E1
+26E3\t26E3
+26E8\t26E9
+26EB\t26F1
+26F4\t26F4
+26F6\t26F9
+26FB\t26FC
+26FE\t26FF
 273D\t273D
 2776\t277F
+2B56\t2B59
+3248\t324F
 E000\tF8FF
 FE00\tFE0F
 FFFD\tFFFD
+1F100\t1F10A
+1F110\t1F12D
+1F130\t1F169
+1F170\t1F18D
+1F18F\t1F190
+1F19B\t1F1AC
 E0100\tE01EF
 F0000\tFFFFD
 100000\t10FFFD
@@ -201,27 +231,66 @@ END
 sub InEastAsianFullwidth {
     return <<"END";
 3000\t3000
-FF01\tFF60
-FFE0\tFFE6
+FF01\tFF03
+FF04\tFF04
+FF05\tFF07
+FF08\tFF0D
+FF0E\tFF0F
+FF10\tFF19
+FF1A\tFF1B
+FF1C\tFF1E
+FF1F\tFF20
+FF21\tFF3A
+FF3B\tFF40
+FF41\tFF5A
+FF5B\tFF60
+FFE0\tFFE1
+FFE2\tFFE4
+FFE5\tFFE6
 END
 }
 
 sub InEastAsianHalfwidth {
     return <<"END";
 20A9\t20A9
-FF61\tFFDC
-FFE8\tFFEE
+FF61\tFF63
+FF64\tFF65
+FF66\tFF6F
+FF70\tFF70
+FF71\tFF9D
+FF9E\tFF9F
+FFA0\tFFBE
+FFC2\tFFC7
+FFCA\tFFCF
+FFD2\tFFD7
+FFDA\tFFDC
+FFE8\tFFE8
+FFE9\tFFEC
+FFED\tFFEE
 END
 }
 
 sub InEastAsianNarrow {
     return <<"END";
-0020\t007E
+0020\t0020
+0021\t0023
+0024\t0024
+0025\t0027
+0028\t002D
+002E\t002F
+0030\t0039
+003A\t003B
+003C\t003E
+003F\t0040
+0041\t005A
+005B\t0060
+0061\t007A
+007B\t007E
 00A2\t00A3
 00A5\t00A6
 00AC\t00AC
 00AF\t00AF
-27E6\t27EB
+27E6\t27ED
 2985\t2986
 END
 }
@@ -229,7 +298,9 @@ END
 sub InEastAsianNeutral {
     return <<"END";
 0000\t001F
-007F\t00A0
+007F\t007F
+0080\t009F
+00A0\t00A0
 00A9\t00A9
 00AB\t00AB
 00B5\t00B5
@@ -261,7 +332,12 @@ sub InEastAsianNeutral {
 014E\t0151
 0154\t0165
 0168\t016A
-016C\t01CD
+016C\t017F
+0180\t01BA
+01BB\t01BB
+01BC\t01BF
+01C0\t01C3
+01C4\t01CD
 01CF\t01CF
 01D1\t01D1
 01D3\t01D3
@@ -269,58 +345,717 @@ sub InEastAsianNeutral {
 01D7\t01D7
 01D9\t01D9
 01DB\t01DB
-01DD\t0250
+01DD\t024F
+0250\t0250
 0252\t0260
-0262\t02C3
+0262\t0293
+0294\t0294
+0295\t02AF
+02B0\t02C1
+02C2\t02C3
 02C5\t02C6
 02C8\t02C8
 02CC\t02CC
 02CE\t02CF
-02D1\t02D7
+02D1\t02D1
+02D2\t02D7
 02DC\t02DC
 02DE\t02DE
-02E0\t02FF
-0374\t0390
+02E0\t02E4
+02E5\t02EB
+02EC\t02EE
+02EF\t02FF
+0370\t0373
+0374\t0375
+0376\t0377
+037A\t037A
+037B\t037D
+037E\t037F
+0384\t0385
+0386\t0387
+0388\t038A
+038C\t038C
+038E\t0390
 03AA\t03B0
 03C2\t03C2
-03CA\t0400
+03CA\t03F5
+03F6\t03F6
+03F7\t03FF
+0400\t0400
 0402\t040F
 0450\t0450
-0452\t10FC
-1160\t200F
+0452\t0481
+0482\t0482
+0483\t0487
+0488\t0489
+048A\t04FF
+0500\t052F
+0531\t0556
+0559\t0559
+055A\t055F
+0560\t0588
+0589\t058A
+058D\t058E
+058F\t058F
+0591\t05BD
+05BE\t05C0
+05C1\t05C2
+05C3\t05C3
+05C4\t05C5
+05C6\t05C7
+05D0\t05EA
+05EF\t05F2
+05F3\t05F4
+0600\t0605
+0606\t0608
+0609\t060A
+060B\t060B
+060C\t060D
+060E\t060F
+0610\t061A
+061B\t061C
+061E\t061F
+0620\t063F
+0640\t0640
+0641\t064A
+064B\t065F
+0660\t0669
+066A\t066D
+066E\t066F
+0670\t0670
+0671\t06D3
+06D4\t06D5
+06D6\t06DC
+06DD\t06DE
+06DF\t06E4
+06E5\t06E6
+06E7\t06E8
+06E9\t06E9
+06EA\t06ED
+06EE\t06EF
+06F0\t06F9
+06FA\t06FC
+06FD\t06FE
+06FF\t06FF
+0700\t070D
+070F\t0711
+0712\t072F
+0730\t074A
+074D\t074F
+0750\t077F
+0780\t07A5
+07A6\t07B0
+07B1\t07B1
+07C0\t07C9
+07CA\t07EA
+07EB\t07F3
+07F4\t07F5
+07F6\t07F6
+07F7\t07F9
+07FA\t07FD
+07FE\t07FF
+0800\t0815
+0816\t0819
+081A\t081A
+081B\t0823
+0824\t0824
+0825\t0827
+0828\t0828
+0829\t082D
+0830\t083E
+0840\t0858
+0859\t085B
+085E\t085E
+0860\t086A
+08A0\t08B4
+08B6\t08BD
+08D3\t08E1
+08E2\t08E2
+08E3\t08FF
+0900\t0902
+0903\t0903
+0904\t0939
+093A\t093D
+093E\t0940
+0941\t0948
+0949\t094C
+094D\t094D
+094E\t094F
+0950\t0950
+0951\t0957
+0958\t0961
+0962\t0963
+0964\t0965
+0966\t096F
+0970\t0971
+0972\t097F
+0980\t0981
+0982\t0983
+0985\t098C
+098F\t0990
+0993\t09A8
+09AA\t09B0
+09B2\t09B2
+09B6\t09B9
+09BC\t09BD
+09BE\t09C0
+09C1\t09C4
+09C7\t09C8
+09CB\t09CC
+09CD\t09D7
+09DC\t09DD
+09DF\t09E1
+09E2\t09E3
+09E6\t09EF
+09F0\t09F1
+09F2\t09F3
+09F4\t09F9
+09FA\t09FE
+0A01\t0A02
+0A03\t0A03
+0A05\t0A0A
+0A0F\t0A10
+0A13\t0A28
+0A2A\t0A30
+0A32\t0A33
+0A35\t0A36
+0A38\t0A39
+0A3C\t0A3C
+0A3E\t0A40
+0A41\t0A42
+0A47\t0A48
+0A4B\t0A4D
+0A51\t0A51
+0A59\t0A5C
+0A5E\t0A5E
+0A66\t0A6F
+0A70\t0A71
+0A72\t0A74
+0A75\t0A76
+0A81\t0A82
+0A83\t0A83
+0A85\t0A8D
+0A8F\t0A91
+0A93\t0AA8
+0AAA\t0AB0
+0AB2\t0AB3
+0AB5\t0AB9
+0ABC\t0ABD
+0ABE\t0AC0
+0AC1\t0AC5
+0AC7\t0AC8
+0AC9\t0AC9
+0ACB\t0ACC
+0ACD\t0AD0
+0AE0\t0AE1
+0AE2\t0AE3
+0AE6\t0AEF
+0AF0\t0AF9
+0AFA\t0AFF
+0B01\t0B01
+0B02\t0B03
+0B05\t0B0C
+0B0F\t0B10
+0B13\t0B28
+0B2A\t0B30
+0B32\t0B33
+0B35\t0B39
+0B3C\t0B40
+0B41\t0B44
+0B47\t0B48
+0B4B\t0B4C
+0B4D\t0B57
+0B5C\t0B5D
+0B5F\t0B61
+0B62\t0B63
+0B66\t0B6F
+0B70\t0B71
+0B72\t0B77
+0B82\t0B83
+0B85\t0B8A
+0B8E\t0B90
+0B92\t0B95
+0B99\t0B9A
+0B9C\t0B9C
+0B9E\t0B9F
+0BA3\t0BA4
+0BA8\t0BAA
+0BAE\t0BB9
+0BBE\t0BBF
+0BC0\t0BC0
+0BC1\t0BC2
+0BC6\t0BC8
+0BCA\t0BCC
+0BCD\t0BD7
+0BE6\t0BEF
+0BF0\t0BF2
+0BF3\t0BF8
+0BF9\t0C00
+0C01\t0C03
+0C04\t0C04
+0C05\t0C0C
+0C0E\t0C10
+0C12\t0C28
+0C2A\t0C39
+0C3D\t0C3D
+0C3E\t0C40
+0C41\t0C44
+0C46\t0C48
+0C4A\t0C4D
+0C55\t0C56
+0C58\t0C5A
+0C60\t0C61
+0C62\t0C63
+0C66\t0C6F
+0C77\t0C77
+0C78\t0C7E
+0C7F\t0C81
+0C82\t0C83
+0C84\t0C84
+0C85\t0C8C
+0C8E\t0C90
+0C92\t0CA8
+0CAA\t0CB3
+0CB5\t0CB9
+0CBC\t0CBF
+0CC0\t0CC4
+0CC6\t0CC6
+0CC7\t0CC8
+0CCA\t0CCB
+0CCC\t0CCD
+0CD5\t0CD6
+0CDE\t0CDE
+0CE0\t0CE1
+0CE2\t0CE3
+0CE6\t0CEF
+0CF1\t0CF2
+0D00\t0D01
+0D02\t0D03
+0D05\t0D0C
+0D0E\t0D10
+0D12\t0D3A
+0D3B\t0D3C
+0D3D\t0D3D
+0D3E\t0D40
+0D41\t0D44
+0D46\t0D48
+0D4A\t0D4C
+0D4D\t0D4F
+0D54\t0D56
+0D57\t0D57
+0D58\t0D5E
+0D5F\t0D61
+0D62\t0D63
+0D66\t0D6F
+0D70\t0D78
+0D79\t0D79
+0D7A\t0D7F
+0D82\t0D83
+0D85\t0D96
+0D9A\t0DB1
+0DB3\t0DBB
+0DBD\t0DBD
+0DC0\t0DC6
+0DCA\t0DCA
+0DCF\t0DD1
+0DD2\t0DD4
+0DD6\t0DD6
+0DD8\t0DDF
+0DE6\t0DEF
+0DF2\t0DF3
+0DF4\t0DF4
+0E01\t0E30
+0E31\t0E31
+0E32\t0E33
+0E34\t0E3A
+0E3F\t0E3F
+0E40\t0E45
+0E46\t0E46
+0E47\t0E4E
+0E4F\t0E4F
+0E50\t0E59
+0E5A\t0E5B
+0E81\t0E82
+0E84\t0E84
+0E86\t0E8A
+0E8C\t0EA3
+0EA5\t0EA5
+0EA7\t0EB0
+0EB1\t0EB1
+0EB2\t0EB3
+0EB4\t0EBC
+0EBD\t0EBD
+0EC0\t0EC4
+0EC6\t0EC6
+0EC8\t0ECD
+0ED0\t0ED9
+0EDC\t0EDF
+0F00\t0F00
+0F01\t0F03
+0F04\t0F12
+0F13\t0F14
+0F15\t0F17
+0F18\t0F19
+0F1A\t0F1F
+0F20\t0F29
+0F2A\t0F33
+0F34\t0F3D
+0F3E\t0F3F
+0F40\t0F47
+0F49\t0F6C
+0F71\t0F7E
+0F7F\t0F7F
+0F80\t0F84
+0F85\t0F85
+0F86\t0F87
+0F88\t0F8C
+0F8D\t0F97
+0F99\t0FBC
+0FBE\t0FC5
+0FC6\t0FC6
+0FC7\t0FCC
+0FCE\t0FCF
+0FD0\t0FD4
+0FD5\t0FD8
+0FD9\t0FDA
+1000\t102A
+102B\t102C
+102D\t1030
+1031\t1031
+1032\t1037
+1038\t1038
+1039\t103A
+103B\t103C
+103D\t103E
+103F\t103F
+1040\t1049
+104A\t104F
+1050\t1055
+1056\t1057
+1058\t1059
+105A\t105D
+105E\t1060
+1061\t1061
+1062\t1064
+1065\t1066
+1067\t106D
+106E\t1070
+1071\t1074
+1075\t1081
+1082\t1082
+1083\t1084
+1085\t1086
+1087\t108C
+108D\t108F
+1090\t1099
+109A\t109C
+109D\t109D
+109E\t109F
+10A0\t10C5
+10C7\t10CD
+10D0\t10FA
+10FB\t10FC
+10FD\t10FF
+1160\t11FF
+1200\t1248
+124A\t124D
+1250\t1256
+1258\t1258
+125A\t125D
+1260\t1288
+128A\t128D
+1290\t12B0
+12B2\t12B5
+12B8\t12BE
+12C0\t12C0
+12C2\t12C5
+12C8\t12D6
+12D8\t1310
+1312\t1315
+1318\t135A
+135D\t135F
+1360\t1368
+1369\t137C
+1380\t138F
+1390\t1399
+13A0\t13F5
+13F8\t13FD
+1400\t1400
+1401\t166C
+166D\t166E
+166F\t167F
+1680\t1680
+1681\t169A
+169B\t169C
+16A0\t16EA
+16EB\t16ED
+16EE\t16F0
+16F1\t16F8
+1700\t170C
+170E\t1711
+1712\t1714
+1720\t1731
+1732\t1734
+1735\t1736
+1740\t1751
+1752\t1753
+1760\t176C
+176E\t1770
+1772\t1773
+1780\t17B3
+17B4\t17B5
+17B6\t17B6
+17B7\t17BD
+17BE\t17C5
+17C6\t17C6
+17C7\t17C8
+17C9\t17D3
+17D4\t17D6
+17D7\t17D7
+17D8\t17DA
+17DB\t17DD
+17E0\t17E9
+17F0\t17F9
+1800\t1805
+1806\t1806
+1807\t180A
+180B\t180D
+180E\t180E
+1810\t1819
+1820\t1842
+1843\t1843
+1844\t1878
+1880\t1884
+1885\t1886
+1887\t18A8
+18A9\t18AA
+18B0\t18F5
+1900\t191E
+1920\t1922
+1923\t1926
+1927\t1928
+1929\t192B
+1930\t1931
+1932\t1932
+1933\t1938
+1939\t193B
+1940\t1940
+1944\t1945
+1946\t194F
+1950\t196D
+1970\t1974
+1980\t19AB
+19B0\t19C9
+19D0\t19D9
+19DA\t19DA
+19DE\t19DF
+19E0\t19FF
+1A00\t1A16
+1A17\t1A18
+1A19\t1A1A
+1A1B\t1A1B
+1A1E\t1A1F
+1A20\t1A54
+1A55\t1A57
+1A58\t1A5E
+1A60\t1A62
+1A63\t1A64
+1A65\t1A6C
+1A6D\t1A72
+1A73\t1A7C
+1A7F\t1A7F
+1A80\t1A89
+1A90\t1A99
+1AA0\t1AA6
+1AA7\t1AA7
+1AA8\t1AAD
+1AB0\t1ABD
+1ABE\t1ABE
+1B00\t1B03
+1B04\t1B04
+1B05\t1B33
+1B34\t1B35
+1B36\t1B3A
+1B3B\t1B3C
+1B3D\t1B41
+1B42\t1B42
+1B43\t1B44
+1B45\t1B4B
+1B50\t1B59
+1B5A\t1B60
+1B61\t1B6A
+1B6B\t1B73
+1B74\t1B7C
+1B80\t1B81
+1B82\t1B82
+1B83\t1BA0
+1BA1\t1BA1
+1BA2\t1BA5
+1BA6\t1BA7
+1BA8\t1BA9
+1BAA\t1BAA
+1BAB\t1BAD
+1BAE\t1BAF
+1BB0\t1BB9
+1BBA\t1BBF
+1BC0\t1BE5
+1BE6\t1BE7
+1BE8\t1BE9
+1BEA\t1BEC
+1BED\t1BEE
+1BEF\t1BF1
+1BF2\t1BF3
+1BFC\t1BFF
+1C00\t1C23
+1C24\t1C2B
+1C2C\t1C33
+1C34\t1C35
+1C36\t1C37
+1C3B\t1C3F
+1C40\t1C49
+1C4D\t1C4F
+1C50\t1C59
+1C5A\t1C77
+1C78\t1C7D
+1C7E\t1C7F
+1C80\t1C88
+1C90\t1CBA
+1CBD\t1CBF
+1CC0\t1CC7
+1CD0\t1CD2
+1CD3\t1CD3
+1CD4\t1CE0
+1CE1\t1CE1
+1CE2\t1CE8
+1CE9\t1CEC
+1CED\t1CED
+1CEE\t1CF3
+1CF4\t1CF4
+1CF5\t1CF6
+1CF7\t1CF7
+1CF8\t1CF9
+1CFA\t1CFA
+1D00\t1D2B
+1D2C\t1D6A
+1D6B\t1D77
+1D78\t1D78
+1D79\t1D7F
+1D80\t1D9A
+1D9B\t1DBF
+1DC0\t1DF9
+1DFB\t1DFF
+1E00\t1EFF
+1F00\t1F15
+1F18\t1F1D
+1F20\t1F45
+1F48\t1F4D
+1F50\t1F57
+1F59\t1F5D
+1F5F\t1F7D
+1F80\t1FB4
+1FB6\t1FBC
+1FBD\t1FBE
+1FBF\t1FC1
+1FC2\t1FC4
+1FC6\t1FCC
+1FCD\t1FCF
+1FD0\t1FD3
+1FD6\t1FDB
+1FDD\t1FDF
+1FE0\t1FEC
+1FED\t1FEF
+1FF2\t1FF4
+1FF6\t1FFC
+1FFD\t1FFE
+2000\t200A
+200B\t200F
 2011\t2012
 2017\t2017
 201A\t201B
 201E\t201F
 2023\t2023
-2028\t202F
+2028\t2029
+202A\t202E
+202F\t202F
 2031\t2031
 2034\t2034
-2036\t203A
+2036\t2038
+2039\t203A
 203C\t203D
-203F\t2071
-2075\t207E
+203F\t2040
+2041\t2043
+2044\t2046
+2047\t2051
+2052\t2054
+2055\t205E
+205F\t205F
+2060\t2064
+2066\t206F
+2070\t2071
+2075\t2079
+207A\t207C
+207D\t207E
 2080\t2080
-2085\t20A8
+2085\t2089
+208A\t208C
+208D\t208E
+2090\t209C
+20A0\t20A8
 20AA\t20AB
-20AD\t2102
+20AD\t20BF
+20D0\t20DC
+20DD\t20E0
+20E1\t20E1
+20E2\t20E4
+20E5\t20F0
+2100\t2101
+2102\t2102
 2104\t2104
 2106\t2108
 210A\t2112
 2114\t2115
-2117\t2120
+2117\t2118
+2119\t211D
+211E\t2120
 2123\t2125
 2127\t212A
-212C\t214E
+212C\t212D
+212E\t212E
+212F\t2134
+2135\t2138
+2139\t2139
+213A\t213B
+213C\t213F
+2140\t2144
+2145\t2149
+214A\t214B
+214C\t214D
+214E\t214F
+2150\t2152
 2155\t215A
 215F\t215F
 216C\t216F
-217A\t2184
-219A\t21B7
-21BA\t21D1
+217A\t2182
+2183\t2184
+2185\t2188
+218A\t218B
+219A\t219B
+219C\t219F
+21A0\t21A0
+21A1\t21A2
+21A3\t21A3
+21A4\t21A5
+21A6\t21A6
+21A7\t21AD
+21AE\t21AE
+21AF\t21B7
+21BA\t21CD
+21CE\t21CF
+21D0\t21D1
 21D3\t21D3
 21D5\t21E6
-21E8\t21FF
+21E8\t21F3
+21F4\t21FF
 2201\t2201
 2204\t2206
 2209\t220A
@@ -348,9 +1083,26 @@ sub InEastAsianNeutral {
 2296\t2298
 229A\t22A4
 22A6\t22BE
-22C0\t2311
-2313\t2328
-232B\t244A
+22C0\t22FF
+2300\t2307
+2308\t230B
+230C\t2311
+2313\t2319
+231C\t231F
+2320\t2321
+2322\t2328
+232B\t237B
+237C\t237C
+237D\t239A
+239B\t23B3
+23B4\t23DB
+23DC\t23E1
+23E2\t23E8
+23ED\t23EF
+23F1\t23F2
+23F4\t23FF
+2400\t2426
+2440\t244A
 24EA\t24EA
 254C\t254F
 2574\t257F
@@ -366,7 +1118,10 @@ sub InEastAsianNeutral {
 25CC\t25CD
 25D2\t25E1
 25E6\t25EE
-25F0\t2604
+25F0\t25F7
+25F8\t25FC
+25FF\t25FF
+2600\t2604
 2607\t2608
 260A\t260D
 2610\t2613
@@ -374,49 +1129,1030 @@ sub InEastAsianNeutral {
 261D\t261D
 261F\t263F
 2641\t2641
-2643\t265F
+2643\t2647
+2654\t265F
 2662\t2662
 2666\t2666
 266B\t266B
 266E\t266E
-2670\t273C
-273E\t2775
-2780\t27E5
-27F0\t2984
-2987\t2E1D
+2670\t267E
+2680\t2692
+2694\t269D
+26A0\t26A0
+26A2\t26A9
+26AC\t26BC
+26C0\t26C3
+26E2\t26E2
+26E4\t26E7
+2700\t2704
+2706\t2709
+270C\t2727
+2729\t273C
+273E\t274B
+274D\t274D
+274F\t2752
+2756\t2756
+2758\t2767
+2768\t2775
+2780\t2793
+2794\t2794
+2798\t27AF
+27B1\t27BE
+27C0\t27C4
+27C5\t27C6
+27C7\t27E5
+27EE\t27EF
+27F0\t27FF
+2800\t28FF
+2900\t297F
+2980\t2982
+2983\t2984
+2987\t2998
+2999\t29D7
+29D8\t29DB
+29DC\t29FB
+29FC\t29FD
+29FE\t29FF
+2A00\t2AFF
+2B00\t2B1A
+2B1D\t2B2F
+2B30\t2B44
+2B45\t2B46
+2B47\t2B4C
+2B4D\t2B4F
+2B51\t2B54
+2B5A\t2B73
+2B76\t2B95
+2B98\t2BFF
+2C00\t2C2E
+2C30\t2C5E
+2C60\t2C7B
+2C7C\t2C7D
+2C7E\t2C7F
+2C80\t2CE4
+2CE5\t2CEA
+2CEB\t2CEE
+2CEF\t2CF1
+2CF2\t2CF3
+2CF9\t2CFC
+2CFD\t2CFD
+2CFE\t2CFF
+2D00\t2D25
+2D27\t2D2D
+2D30\t2D67
+2D6F\t2D7F
+2D80\t2D96
+2DA0\t2DA6
+2DA8\t2DAE
+2DB0\t2DB6
+2DB8\t2DBE
+2DC0\t2DC6
+2DC8\t2DCE
+2DD0\t2DD6
+2DD8\t2DDE
+2DE0\t2DFF
+2E00\t2E01
+2E02\t2E05
+2E06\t2E08
+2E09\t2E0D
+2E0E\t2E16
+2E17\t2E17
+2E18\t2E19
+2E1A\t2E1D
+2E1E\t2E1F
+2E20\t2E29
+2E2A\t2E2E
+2E2F\t2E2F
+2E30\t2E39
+2E3A\t2E3B
+2E3C\t2E3F
+2E40\t2E42
+2E43\t2E4F
 303F\t303F
 4DC0\t4DFF
-A700\tA877
+A4D0\tA4F7
+A4F8\tA4FD
+A4FE\tA4FF
+A500\tA60B
+A60C\tA60C
+A60D\tA60F
+A610\tA61F
+A620\tA629
+A62A\tA62B
+A640\tA66D
+A66E\tA66F
+A670\tA672
+A673\tA673
+A674\tA67D
+A67E\tA67F
+A680\tA69B
+A69C\tA69D
+A69E\tA69F
+A6A0\tA6E5
+A6E6\tA6EF
+A6F0\tA6F1
+A6F2\tA6F7
+A700\tA716
+A717\tA71F
+A720\tA721
+A722\tA76F
+A770\tA770
+A771\tA787
+A788\tA788
+A789\tA78A
+A78B\tA78E
+A78F\tA78F
+A790\tA7BF
+A7C2\tA7C6
+A7F7\tA7F7
+A7F8\tA7F9
+A7FA\tA7FA
+A7FB\tA7FF
+A800\tA801
+A802\tA802
+A803\tA805
+A806\tA806
+A807\tA80A
+A80B\tA80B
+A80C\tA822
+A823\tA824
+A825\tA826
+A827\tA827
+A828\tA82B
+A830\tA835
+A836\tA837
+A838\tA839
+A840\tA873
+A874\tA877
+A880\tA881
+A882\tA8B3
+A8B4\tA8C3
+A8C4\tA8C5
+A8CE\tA8CF
+A8D0\tA8D9
+A8E0\tA8F1
+A8F2\tA8F7
+A8F8\tA8FA
+A8FB\tA8FC
+A8FD\tA8FE
+A8FF\tA8FF
+A900\tA909
+A90A\tA925
+A926\tA92D
+A92E\tA92F
+A930\tA946
+A947\tA951
+A952\tA953
+A95F\tA95F
+A980\tA982
+A983\tA983
+A984\tA9B2
+A9B3\tA9B3
+A9B4\tA9B5
+A9B6\tA9B9
+A9BA\tA9BB
+A9BC\tA9BD
+A9BE\tA9C0
+A9C1\tA9CD
+A9CF\tA9CF
+A9D0\tA9D9
+A9DE\tA9DF
+A9E0\tA9E4
+A9E5\tA9E6
+A9E7\tA9EF
+A9F0\tA9F9
+A9FA\tA9FE
+AA00\tAA28
+AA29\tAA2E
+AA2F\tAA30
+AA31\tAA32
+AA33\tAA34
+AA35\tAA36
+AA40\tAA42
+AA43\tAA43
+AA44\tAA4B
+AA4C\tAA4D
+AA50\tAA59
+AA5C\tAA5F
+AA60\tAA6F
+AA70\tAA70
+AA71\tAA76
+AA77\tAA79
+AA7A\tAA7D
+AA7E\tAA7F
+AA80\tAAAF
+AAB0\tAAB1
+AAB2\tAAB4
+AAB5\tAAB6
+AAB7\tAAB8
+AAB9\tAABD
+AABE\tAABF
+AAC0\tAAC2
+AADB\tAADC
+AADD\tAADD
+AADE\tAADF
+AAE0\tAAEA
+AAEB\tAAEB
+AAEC\tAAED
+AAEE\tAAEF
+AAF0\tAAF1
+AAF2\tAAF2
+AAF3\tAAF4
+AAF5\tAAF6
+AB01\tAB06
+AB09\tAB0E
+AB11\tAB16
+AB20\tAB26
+AB28\tAB2E
+AB30\tAB5A
+AB5B\tAB5B
+AB5C\tAB5F
+AB60\tAB67
+AB70\tABBF
+ABC0\tABE2
+ABE3\tABE4
+ABE5\tABE5
+ABE6\tABE7
+ABE8\tABE8
+ABE9\tABEA
+ABEB\tABED
+ABF0\tABF9
+D7B0\tD7C6
+D7CB\tD7FB
 D800\tDB7F
 DB80\tDBFF
 DC00\tDFFF
-FB00\tFDFD
-FE20\tFE23
-FE70\tFEFF
-FFF9\tFFFC
-10000\t1D7FF
-E0001\tE007F
+FB00\tFB06
+FB13\tFB17
+FB1D\tFB1E
+FB1F\tFB28
+FB29\tFB29
+FB2A\tFB36
+FB38\tFB3C
+FB3E\tFB3E
+FB40\tFB41
+FB43\tFB44
+FB46\tFB4F
+FB50\tFBB1
+FBB2\tFBC1
+FBD3\tFD3D
+FD3E\tFD3F
+FD50\tFD8F
+FD92\tFDC7
+FDF0\tFDFB
+FDFC\tFDFD
+FE20\tFE2F
+FE70\tFE74
+FE76\tFEFC
+FEFF\tFEFF
+FFF9\tFFFB
+FFFC\tFFFC
+10000\t1000B
+1000D\t10026
+10028\t1003A
+1003C\t1003D
+1003F\t1004D
+10050\t1005D
+10080\t100FA
+10100\t10102
+10107\t10133
+10137\t1013F
+10140\t10174
+10175\t10178
+10179\t10189
+1018A\t1018B
+1018C\t1018E
+10190\t1019B
+101A0\t101A0
+101D0\t101FC
+101FD\t101FD
+10280\t1029C
+102A0\t102D0
+102E0\t102E0
+102E1\t102FB
+10300\t1031F
+10320\t10323
+1032D\t1032F
+10330\t10340
+10341\t10341
+10342\t10349
+1034A\t1034A
+10350\t10375
+10376\t1037A
+10380\t1039D
+1039F\t1039F
+103A0\t103C3
+103C8\t103CF
+103D0\t103D0
+103D1\t103D5
+10400\t1044F
+10450\t1047F
+10480\t1049D
+104A0\t104A9
+104B0\t104D3
+104D8\t104FB
+10500\t10527
+10530\t10563
+1056F\t1056F
+10600\t10736
+10740\t10755
+10760\t10767
+10800\t10805
+10808\t10808
+1080A\t10835
+10837\t10838
+1083C\t1083F
+10840\t10855
+10857\t10857
+10858\t1085F
+10860\t10876
+10877\t10878
+10879\t1087F
+10880\t1089E
+108A7\t108AF
+108E0\t108F2
+108F4\t108F5
+108FB\t108FF
+10900\t10915
+10916\t1091B
+1091F\t1091F
+10920\t10939
+1093F\t1093F
+10980\t1099F
+109A0\t109B7
+109BC\t109BD
+109BE\t109BF
+109C0\t109CF
+109D2\t109FF
+10A00\t10A00
+10A01\t10A03
+10A05\t10A06
+10A0C\t10A0F
+10A10\t10A13
+10A15\t10A17
+10A19\t10A35
+10A38\t10A3A
+10A3F\t10A3F
+10A40\t10A48
+10A50\t10A58
+10A60\t10A7C
+10A7D\t10A7E
+10A7F\t10A7F
+10A80\t10A9C
+10A9D\t10A9F
+10AC0\t10AC7
+10AC8\t10AC8
+10AC9\t10AE4
+10AE5\t10AE6
+10AEB\t10AEF
+10AF0\t10AF6
+10B00\t10B35
+10B39\t10B3F
+10B40\t10B55
+10B58\t10B5F
+10B60\t10B72
+10B78\t10B7F
+10B80\t10B91
+10B99\t10B9C
+10BA9\t10BAF
+10C00\t10C48
+10C80\t10CB2
+10CC0\t10CF2
+10CFA\t10CFF
+10D00\t10D23
+10D24\t10D27
+10D30\t10D39
+10E60\t10E7E
+10F00\t10F1C
+10F1D\t10F26
+10F27\t10F27
+10F30\t10F45
+10F46\t10F50
+10F51\t10F54
+10F55\t10F59
+10FE0\t10FF6
+11000\t11002
+11003\t11037
+11038\t11046
+11047\t1104D
+11052\t11065
+11066\t1106F
+1107F\t1107F
+11080\t11081
+11082\t11082
+11083\t110AF
+110B0\t110B2
+110B3\t110B6
+110B7\t110B8
+110B9\t110BA
+110BB\t110BC
+110BD\t110BD
+110BE\t110C1
+110CD\t110CD
+110D0\t110E8
+110F0\t110F9
+11100\t11102
+11103\t11126
+11127\t1112B
+1112C\t1112C
+1112D\t11134
+11136\t1113F
+11140\t11143
+11144\t11144
+11145\t11146
+11150\t11172
+11173\t11173
+11174\t11175
+11176\t11176
+11180\t11181
+11182\t11182
+11183\t111B2
+111B3\t111B5
+111B6\t111BE
+111BF\t111C0
+111C1\t111C4
+111C5\t111C8
+111C9\t111CC
+111CD\t111CD
+111D0\t111D9
+111DA\t111DC
+111DD\t111DF
+111E1\t111F4
+11200\t11211
+11213\t1122B
+1122C\t1122E
+1122F\t11231
+11232\t11233
+11234\t11235
+11236\t11237
+11238\t1123D
+1123E\t1123E
+11280\t11286
+11288\t11288
+1128A\t1128D
+1128F\t1129D
+1129F\t112A8
+112A9\t112A9
+112B0\t112DE
+112DF\t112DF
+112E0\t112E2
+112E3\t112EA
+112F0\t112F9
+11300\t11301
+11302\t11303
+11305\t1130C
+1130F\t11310
+11313\t11328
+1132A\t11330
+11332\t11333
+11335\t11339
+1133B\t1133C
+1133D\t1133D
+1133E\t1133F
+11340\t11340
+11341\t11344
+11347\t11348
+1134B\t1134D
+11350\t11357
+1135D\t11361
+11362\t11363
+11366\t1136C
+11370\t11374
+11400\t11434
+11435\t11437
+11438\t1143F
+11440\t11441
+11442\t11444
+11445\t11446
+11447\t1144A
+1144B\t1144F
+11450\t11459
+1145B\t1145F
+11480\t114AF
+114B0\t114B2
+114B3\t114B8
+114B9\t114BA
+114BB\t114BE
+114BF\t114C0
+114C1\t114C1
+114C2\t114C3
+114C4\t114C5
+114C6\t114C7
+114D0\t114D9
+11580\t115AE
+115AF\t115B1
+115B2\t115B5
+115B8\t115BB
+115BC\t115BD
+115BE\t115BE
+115BF\t115C0
+115C1\t115D7
+115D8\t115DB
+115DC\t115DD
+11600\t1162F
+11630\t11632
+11633\t1163A
+1163B\t1163C
+1163D\t1163E
+1163F\t11640
+11641\t11643
+11644\t11644
+11650\t11659
+11660\t1166C
+11680\t116AA
+116AB\t116AD
+116AE\t116AF
+116B0\t116B5
+116B6\t116B8
+116C0\t116C9
+11700\t1171A
+1171D\t1171F
+11720\t11721
+11722\t11725
+11726\t11726
+11727\t1172B
+11730\t11739
+1173A\t1173B
+1173C\t1173E
+1173F\t1173F
+11800\t1182B
+1182C\t1182E
+1182F\t11837
+11838\t11838
+11839\t1183A
+1183B\t1183B
+118A0\t118DF
+118E0\t118E9
+118EA\t118F2
+118FF\t118FF
+119A0\t119A7
+119AA\t119D0
+119D1\t119D3
+119D4\t119D7
+119DA\t119DB
+119DC\t119DF
+119E0\t11A00
+11A01\t11A0A
+11A0B\t11A32
+11A33\t11A38
+11A39\t11A3A
+11A3B\t11A3E
+11A3F\t11A46
+11A47\t11A50
+11A51\t11A56
+11A57\t11A58
+11A59\t11A5B
+11A5C\t11A89
+11A8A\t11A96
+11A97\t11A97
+11A98\t11A99
+11A9A\t11A9C
+11A9D\t11A9D
+11A9E\t11AA2
+11AC0\t11AF8
+11C00\t11C08
+11C0A\t11C2E
+11C2F\t11C2F
+11C30\t11C36
+11C38\t11C3D
+11C3E\t11C40
+11C41\t11C45
+11C50\t11C59
+11C5A\t11C6C
+11C70\t11C71
+11C72\t11C8F
+11C92\t11CA7
+11CA9\t11CA9
+11CAA\t11CB0
+11CB1\t11CB1
+11CB2\t11CB3
+11CB4\t11CB4
+11CB5\t11CB6
+11D00\t11D06
+11D08\t11D09
+11D0B\t11D30
+11D31\t11D36
+11D3A\t11D3A
+11D3C\t11D3D
+11D3F\t11D45
+11D46\t11D47
+11D50\t11D59
+11D60\t11D65
+11D67\t11D68
+11D6A\t11D89
+11D8A\t11D8E
+11D90\t11D91
+11D93\t11D94
+11D95\t11D98
+11DA0\t11DA9
+11EE0\t11EF2
+11EF3\t11EF4
+11EF5\t11EF6
+11EF7\t11EF8
+11FC0\t11FD4
+11FD5\t11FDC
+11FDD\t11FE0
+11FE1\t11FF1
+11FFF\t11FFF
+12000\t12399
+12400\t1246E
+12470\t12474
+12480\t12543
+13000\t1342E
+13430\t13438
+14400\t14646
+16800\t16A38
+16A40\t16A5E
+16A60\t16A69
+16A6E\t16A6F
+16AD0\t16AED
+16AF0\t16AF4
+16AF5\t16AF5
+16B00\t16B2F
+16B30\t16B36
+16B37\t16B3B
+16B3C\t16B3F
+16B40\t16B43
+16B44\t16B45
+16B50\t16B59
+16B5B\t16B61
+16B63\t16B77
+16B7D\t16B8F
+16E40\t16E7F
+16E80\t16E96
+16E97\t16E9A
+16F00\t16F4A
+16F4F\t16F50
+16F51\t16F87
+16F8F\t16F92
+16F93\t16F9F
+1BC00\t1BC6A
+1BC70\t1BC7C
+1BC80\t1BC88
+1BC90\t1BC99
+1BC9C\t1BC9C
+1BC9D\t1BC9E
+1BC9F\t1BC9F
+1BCA0\t1BCA3
+1D000\t1D0F5
+1D100\t1D126
+1D129\t1D164
+1D165\t1D166
+1D167\t1D169
+1D16A\t1D16C
+1D16D\t1D172
+1D173\t1D17A
+1D17B\t1D182
+1D183\t1D184
+1D185\t1D18B
+1D18C\t1D1A9
+1D1AA\t1D1AD
+1D1AE\t1D1E8
+1D200\t1D241
+1D242\t1D244
+1D245\t1D245
+1D2E0\t1D2F3
+1D300\t1D356
+1D360\t1D378
+1D400\t1D454
+1D456\t1D49C
+1D49E\t1D49F
+1D4A2\t1D4A2
+1D4A5\t1D4A6
+1D4A9\t1D4AC
+1D4AE\t1D4B9
+1D4BB\t1D4BB
+1D4BD\t1D4C3
+1D4C5\t1D505
+1D507\t1D50A
+1D50D\t1D514
+1D516\t1D51C
+1D51E\t1D539
+1D53B\t1D53E
+1D540\t1D544
+1D546\t1D546
+1D54A\t1D550
+1D552\t1D6A5
+1D6A8\t1D6C0
+1D6C1\t1D6C1
+1D6C2\t1D6DA
+1D6DB\t1D6DB
+1D6DC\t1D6FA
+1D6FB\t1D6FB
+1D6FC\t1D714
+1D715\t1D715
+1D716\t1D734
+1D735\t1D735
+1D736\t1D74E
+1D74F\t1D74F
+1D750\t1D76E
+1D76F\t1D76F
+1D770\t1D788
+1D789\t1D789
+1D78A\t1D7A8
+1D7A9\t1D7A9
+1D7AA\t1D7C2
+1D7C3\t1D7C3
+1D7C4\t1D7CB
+1D7CE\t1D7FF
+1D800\t1D9FF
+1DA00\t1DA36
+1DA37\t1DA3A
+1DA3B\t1DA6C
+1DA6D\t1DA74
+1DA75\t1DA75
+1DA76\t1DA83
+1DA84\t1DA84
+1DA85\t1DA86
+1DA87\t1DA8B
+1DA9B\t1DA9F
+1DAA1\t1DAAF
+1E000\t1E006
+1E008\t1E018
+1E01B\t1E021
+1E023\t1E024
+1E026\t1E02A
+1E100\t1E12C
+1E130\t1E136
+1E137\t1E13D
+1E140\t1E149
+1E14E\t1E14F
+1E2C0\t1E2EB
+1E2EC\t1E2EF
+1E2F0\t1E2F9
+1E2FF\t1E2FF
+1E800\t1E8C4
+1E8C7\t1E8CF
+1E8D0\t1E8D6
+1E900\t1E943
+1E944\t1E94A
+1E94B\t1E94B
+1E950\t1E959
+1E95E\t1E95F
+1EC71\t1ECAB
+1ECAC\t1ECAC
+1ECAD\t1ECAF
+1ECB0\t1ECB0
+1ECB1\t1ECB4
+1ED01\t1ED2D
+1ED2E\t1ED2E
+1ED2F\t1ED3D
+1EE00\t1EE03
+1EE05\t1EE1F
+1EE21\t1EE22
+1EE24\t1EE27
+1EE29\t1EE32
+1EE34\t1EE37
+1EE39\t1EE4B
+1EE4D\t1EE4F
+1EE51\t1EE52
+1EE54\t1EE5F
+1EE61\t1EE62
+1EE64\t1EE64
+1EE67\t1EE6A
+1EE6C\t1EE72
+1EE74\t1EE77
+1EE79\t1EE7C
+1EE7E\t1EE7E
+1EE80\t1EE89
+1EE8B\t1EE9B
+1EEA1\t1EEA3
+1EEA5\t1EEA9
+1EEAB\t1EEBB
+1EEF0\t1EEF1
+1F000\t1F003
+1F005\t1F02B
+1F030\t1F093
+1F0A0\t1F0AE
+1F0B1\t1F0BF
+1F0C1\t1F0CE
+1F0D1\t1F0F5
+1F10B\t1F10C
+1F12E\t1F12F
+1F16A\t1F16C
+1F1E6\t1F1FF
+1F321\t1F32C
+1F336\t1F336
+1F37D\t1F37D
+1F394\t1F39F
+1F3CB\t1F3CE
+1F3D4\t1F3DF
+1F3F1\t1F3F3
+1F3F5\t1F3F7
+1F43F\t1F43F
+1F441\t1F441
+1F4FD\t1F4FE
+1F53E\t1F54A
+1F54F\t1F54F
+1F568\t1F579
+1F57B\t1F594
+1F597\t1F5A3
+1F5A5\t1F5FA
+1F650\t1F67F
+1F6C6\t1F6CB
+1F6CD\t1F6CF
+1F6D3\t1F6D4
+1F6E0\t1F6EA
+1F6F0\t1F6F3
+1F700\t1F773
+1F780\t1F7D8
+1F800\t1F80B
+1F810\t1F847
+1F850\t1F859
+1F860\t1F887
+1F890\t1F8AD
+1F900\t1F90B
+1FA00\t1FA53
+1FA60\t1FA6D
+E0001\tE0001
+E0020\tE007F
 END
 }
 
 sub InEastAsianWide {
     return <<"END";
 1100\t115F
+231A\t231B
 2329\t232A
-2E80\t2FFB
-3001\t303E
-3041\t33FF
+23E9\t23EC
+23F0\t23F0
+23F3\t23F3
+25FD\t25FE
+2614\t2615
+2648\t2653
+267F\t267F
+2693\t2693
+26A1\t26A1
+26AA\t26AB
+26BD\t26BE
+26C4\t26C5
+26CE\t26CE
+26D4\t26D4
+26EA\t26EA
+26F2\t26F3
+26F5\t26F5
+26FA\t26FA
+26FD\t26FD
+2705\t2705
+270A\t270B
+2728\t2728
+274C\t274C
+274E\t274E
+2753\t2755
+2757\t2757
+2795\t2797
+27B0\t27B0
+27BF\t27BF
+2B1B\t2B1C
+2B50\t2B50
+2B55\t2B55
+2E80\t2E99
+2E9B\t2EF3
+2F00\t2FD5
+2FF0\t2FFB
+3001\t3003
+3004\t3011
+3012\t3013
+3014\t301D
+301E\t301F
+3020\t3020
+3021\t3029
+302A\t302D
+302E\t302F
+3030\t3030
+3031\t3035
+3036\t3037
+3038\t303A
+303B\t303E
+3041\t3096
+3099\t309A
+309B\t309C
+309D\t309E
+309F\t30A0
+30A1\t30FA
+30FB\t30FB
+30FC\t30FE
+30FF\t30FF
+3105\t312F
+3131\t318E
+3190\t3191
+3192\t3195
+3196\t319F
+31A0\t31BA
+31C0\t31E3
+31F0\t31FF
+3200\t321E
+3220\t3229
+322A\t3247
+3250\t3250
+3251\t325F
+3260\t327F
+3280\t3289
+328A\t32B0
+32B1\t32BF
+32C0\t32FE
+3300\t33FF
 3400\t4DB5
-4E00\t9FBB
-A000\tA4C6
+4DB6\t4DBF
+4E00\t9FEF
+9FF0\t9FFF
+A000\tA014
+A015\tA015
+A016\tA48C
+A490\tA4C6
+A960\tA97C
 AC00\tD7A3
-F900\tFAD9
-FE10\tFE19
-FE30\tFE6B
+F900\tFA6D
+FA6E\tFA6F
+FA70\tFAD9
+FADA\tFAFF
+FE10\tFE16
+FE17\tFE19
+FE30\tFE30
+FE31\tFE32
+FE33\tFE34
+FE35\tFE44
+FE45\tFE46
+FE47\tFE48
+FE49\tFE4C
+FE4D\tFE4F
+FE50\tFE52
+FE54\tFE57
+FE58\tFE5E
+FE5F\tFE61
+FE62\tFE63
+FE64\tFE66
+FE68\tFE69
+FE6A\tFE6B
+16FE0\t16FE1
+16FE2\t16FE3
+17000\t187F7
+18800\t18AF2
+1B000\t1B0FF
+1B100\t1B11E
+1B150\t1B152
+1B164\t1B167
+1B170\t1B2FB
+1F004\t1F004
+1F0CF\t1F0CF
+1F18E\t1F18E
+1F191\t1F19A
+1F200\t1F202
+1F210\t1F23B
+1F240\t1F248
+1F250\t1F251
+1F260\t1F265
+1F300\t1F320
+1F32D\t1F335
+1F337\t1F37C
+1F37E\t1F393
+1F3A0\t1F3CA
+1F3CF\t1F3D3
+1F3E0\t1F3F0
+1F3F4\t1F3F4
+1F3F8\t1F3FA
+1F3FB\t1F3FF
+1F400\t1F43E
+1F440\t1F440
+1F442\t1F4FC
+1F4FF\t1F53D
+1F54B\t1F54E
+1F550\t1F567
+1F57A\t1F57A
+1F595\t1F596
+1F5A4\t1F5A4
+1F5FB\t1F5FF
+1F600\t1F64F
+1F680\t1F6C5
+1F6CC\t1F6CC
+1F6D0\t1F6D2
+1F6D5\t1F6D5
+1F6EB\t1F6EC
+1F6F4\t1F6FA
+1F7E0\t1F7EB
+1F90D\t1F971
+1F973\t1F976
+1F97A\t1F9A2
+1F9A5\t1F9AA
+1F9AE\t1F9CA
+1F9CD\t1F9FF
+1FA70\t1FA73
+1FA78\t1FA7A
+1FA80\t1FA82
+1FA90\t1FA95
 20000\t2A6D6
-2A6D7\t2F7FF
+2A6D7\t2A6FF
+2A700\t2B734
+2B735\t2B73F
+2B740\t2B81D
+2B81E\t2B81F
+2B820\t2CEA1
+2CEA2\t2CEAF
+2CEB0\t2EBE0
+2EBE1\t2F7FF
 2F800\t2FA1D
-2FA1E\t2FFFD
+2FA1E\t2FA1F
+2FA20\t2FFFD
 30000\t3FFFD
 END
 }
@@ -427,15 +2163,12 @@ END
 
 __END__
 
+=encoding UTF-8
+
 =head1 NAME
 
 Unicode::EastAsianWidth - East Asian Width properties
 
-=head1 VERSION
-
-This document describes version 1.10 of Unicode::EastAsianWidth,
-released October 14, 2007.
-
 =head1 SYNOPSIS
 
     use Unicode::EastAsianWidth;
@@ -445,15 +2178,18 @@ released October 14, 2007.
     /\p{InEastAsianAmbiguous}/; # True
     /\p{InFullwidth}/;          # False
 
-    {
-        local $Unicode::EastAsianWidth::EastAsian = 1;
-        /\p{InFullwidth}/;      # True (this only works on Perl 5.8+)
-    }
+To mark ambiguous-width characters as InFullwidth:
+
+    BEGIN { $Unicode::EastAsianWidth::EastAsian = 1; }
+    use Unicode::EastAsianWidth;
+
+    $_ = chr(0x2010); # HYPHEN, an ambiguous-width character
+    /\p{InFullwidth}/;          # True
 
 =head1 DESCRIPTION
 
 This module provide user-defined Unicode properties that deal with
-East Asian characters' width status, as specified in
+width status of East Asian characters, as specified in
 L<http://www.unicode.org/unicode/reports/tr11/>.
 
 It exports the following functions to the caller's scope, to be
@@ -467,17 +2203,17 @@ C<InHalfwidth> (union of C<Halfwidth>, C<Narrow> and 
C<Neutral>).
 
 I<Ambiguous> characters are treated by default as part of
 C<InHalfwidth>, but you can modify this behaviour by assigning
-a true value to C<$Unicode::EastAsianWidth::EastAsian>.
-
-=head1 CAVEATS
-
-Setting C<$Unicode::EastAsianWidth::EastAsian> at run-time only
-works on Perl version 5.8 or above.  Perl 5.6 users must use
-a BEGIN block to set it before the C<use> statement:
+a true value to C<$Unicode::EastAsianWidth::EastAsian> at compile time
+within a C<BEGIN> block before loading this module:
 
-    BEGIN { $Unicode::EastAsianWidth::EastAsian = 1 }
+    BEGIN { $Unicode::EastAsianWidth::EastAsian = 1; }
     use Unicode::EastAsianWidth;
 
+Setting C<$Unicode::EastAsianWidth::EastAsian> at run-time used to
+work on Perl versions between 5.8 and 5.14 due to an implementation
+detail, but it will no longer work on Perl 5.16 and later versions,
+and hence is not recommended.
+
 =head1 SEE ALSO
 
 L<perlunicode>,
@@ -487,30 +2223,15 @@ L<http://www.unicode.org/unicode/reports/tr11/>
 
 Audrey Tang E<lt>cpan@audreyt.orgE<gt>
 
-=head1 COPYRIGHT
-
-Copyright 2002, 2003, 2007, 2008 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
-
-This software is released under the MIT license cited below.
+=head1 LICENSE
 
-=head2 The "MIT" License
+This work is under the B<CC0 1.0 Universal> license.
 
-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:
+To the extent possible under law, 唐鳳 has waived all copyright and related
+or neighboring rights to Unicode-EastAsianWidth.
 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
+This work is published from Taiwan.
 
-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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+L<http://creativecommons.org/publicdomain/zero/1.0>
 
 =cut
diff --git a/tp/maintain/lib/Unicode-EastAsianWidth/t/1-basic.t 
b/tp/maintain/lib/Unicode-EastAsianWidth/t/1-basic.t
index ad3634ccbf..c7b0b87661 100644
--- a/tp/maintain/lib/Unicode-EastAsianWidth/t/1-basic.t
+++ b/tp/maintain/lib/Unicode-EastAsianWidth/t/1-basic.t
@@ -3,7 +3,7 @@
 use strict;
 use Test;
 
-BEGIN { plan tests => (($] >= 5.008) ? 8 : 7) }
+BEGIN { plan tests => (($] >= 5.008 and $] < 5.015) ? 8 : 7) }
 
 use Unicode::EastAsianWidth;
 
@@ -13,7 +13,7 @@ $_ = chr(0x2010);
 ok(/\p{InEastAsianAmbiguous}/);
 ok(!/\p{InFullwidth}/);
 
-if ($] >= 5.008) {
+if ($] >= 5.008 and $] < 5.015) {
     no warnings 'once';
     local $Unicode::EastAsianWidth::EastAsian = 1;
     ok(/\p{InFullwidth}/);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]