--- a/jdk/make/java/java/Exportedfiles.gmk Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/java/java/Exportedfiles.gmk Tue Aug 20 17:44:18 2013 -0700
@@ -50,6 +50,7 @@
java/lang/SecurityManager.java \
java/lang/Shutdown.java \
java/lang/Package.java \
+ java/lang/UNIXProcess.java \
java/lang/ref/Finalizer.java \
java/lang/reflect/AccessibleObject.java \
java/lang/reflect/Field.java \
--- a/jdk/make/java/java/Makefile Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/java/java/Makefile Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -87,6 +87,7 @@
java/util/prefs/FileSystemPreferencesFactory.java \
FILES_c += UNIXProcess_md.c \
+ childproc.c \
UnixFileSystem_md.c \
canonicalize_md.c \
TimeZone.c \
@@ -468,3 +469,36 @@
clean::
$(RM) $(GENSRCDIR)/sun/util/CoreResourceBundleControl.java
+
+HELPER_EXE = $(LIBDIR)/$(LIBARCH)/jspawnhelper
+BUILDHELPER =
+ifeq ($(PLATFORM), solaris)
+ BUILDHELPER = 1
+endif
+ifeq ($(PLATFORM), macosx)
+ HELPER_EXE = $(LIBDIR)/jspawnhelper
+ BUILDHELPER = 1
+endif
+
+ARCHFLAG =
+ifeq ($(ARCH_DATA_MODEL), 64)
+ARCHFLAG = -m64
+endif
+
+ifdef BUILDHELPER
+
+HELPER_EXE_FILES_c = jspawnhelper.c
+HELPER_EXE_FILES_o = $(OBJDIR)/jspawnhelper.o \
+ $(OBJDIR)/childproc.o
+
+$(HELPER_EXE): $(HELPER_EXE_FILES_o)
+ $(CC) $(ARCHFLAG) $(HELPER_EXE_FILES_o) \
+ -o $(TEMPDIR)/jspawnhelper
+ $(CP) $(TEMPDIR)/jspawnhelper $(HELPER_EXE)
+
+build: $(HELPER_EXE)
+
+clean clobber::
+ $(RM) $(HELPER_EXE_FILES_o) $(HELPER_EXE)
+
+endif #BUILDHELPER
--- a/jdk/make/java/java/mapfile-vers Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/java/java/mapfile-vers Tue Aug 20 17:44:18 2013 -0700
@@ -100,7 +100,7 @@
Java_java_io_RandomAccessFile_open;
Java_java_io_RandomAccessFile_read;
Java_java_io_RandomAccessFile_readBytes;
- Java_java_io_RandomAccessFile_seek;
+ Java_java_io_RandomAccessFile_seek0;
Java_java_io_RandomAccessFile_setLength;
Java_java_io_RandomAccessFile_write;
Java_java_io_RandomAccessFile_writeBytes;
--- a/jdk/make/sun/javazic/tzdata/VERSION Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/VERSION Tue Aug 20 17:44:18 2013 -0700
@@ -21,4 +21,4 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-tzdata2013c
+tzdata2013d
--- a/jdk/make/sun/javazic/tzdata/africa Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/africa Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -875,12 +875,18 @@
# announced that year's Ramadan daylight-saving transitions would be
# 2012-07-20 and 2012-08-20; see
# <http://www.mmsp.gov.ma/fr/actualites.aspx?id=288>.
-#
+
+# From Andrew Paprocki (2013-07-02):
+# Morocco announced that the year's Ramadan daylight-savings
+# transitions would be 2013-07-07 and 2013-08-10; see:
+# http://www.maroc.ma/en/news/morocco-suspends-daylight-saving-time-july-7-aug10
+
+# From Paul Eggert (2013-07-03):
# To estimate what the Moroccan government will do in future years,
-# transition dates for 2013 through 2021 were determined by running
+# transition dates for 2014 through 2021 were determined by running
# the following program under GNU Emacs 24.3:
#
-# (let ((islamic-year 1434))
+# (let ((islamic-year 1435))
# (while (< islamic-year 1444)
# (let ((a
# (calendar-gregorian-from-absolute
@@ -933,8 +939,8 @@
Rule Morocco 2012 max - Sep lastSun 3:00 0 -
Rule Morocco 2012 only - Jul 20 3:00 0 -
Rule Morocco 2012 only - Aug 20 2:00 1:00 S
-Rule Morocco 2013 only - Jul 9 3:00 0 -
-Rule Morocco 2013 only - Aug 8 2:00 1:00 S
+Rule Morocco 2013 only - Jul 7 3:00 0 -
+Rule Morocco 2013 only - Aug 10 2:00 1:00 S
Rule Morocco 2014 only - Jun 29 3:00 0 -
Rule Morocco 2014 only - Jul 29 2:00 1:00 S
Rule Morocco 2015 only - Jun 18 3:00 0 -
--- a/jdk/make/sun/javazic/tzdata/antarctica Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/antarctica Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/asia Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/asia Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -1235,39 +1235,21 @@
Rule Zion 2012 only - Mar Fri>=26 2:00 1:00 D
Rule Zion 2012 only - Sep 23 2:00 0 S
-# From Ephraim Silverberg (2012-10-18):
-# Yesterday, the Interior Ministry Committee, after more than a year
-# past, approved sending the proposed June 2011 changes to the Time
-# Decree Law back to the Knesset for second and third (final) votes
-# before the upcoming elections on Jan. 22, 2013. Hence, although the
-# changes are not yet law, they are expected to be so before February 2013.
+# From Ephraim Silverberg (2013-06-27):
+# On June 23, 2013, the Israeli government approved changes to the
+# Time Decree Law. The next day, the changes passed the First Reading
+# in the Knesset. The law is expected to pass the Second and Third
+# (final) Readings by the beginning of September 2013.
#
-# As of 2013, DST starts at 02:00 on the Friday before the last Sunday in March.
-# DST ends at 02:00 on the first Sunday after October 1, unless it occurs on the
-# second day of the Jewish Rosh Hashana holiday, in which case DST ends a day
-# later (i.e. at 02:00 the first Monday after October 2).
-# [Rosh Hashana holidays are factored in until 2100.]
-
-# From Ephraim Silverberg (2012-11-05):
-# The Knesset passed today (in second and final readings) the amendment to the
-# Time Decree Law making the changes ... law.
+# As of 2013, DST starts at 02:00 on the Friday before the last Sunday
+# in March. DST ends at 02:00 on the last Sunday of October.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D
-Rule Zion 2013 2026 - Oct Sun>=2 2:00 0 S
-Rule Zion 2027 only - Oct Mon>=3 2:00 0 S
-Rule Zion 2028 max - Oct Sun>=2 2:00 0 S
-# The following rules are commented out for now, as they break older
-# versions of zic that support only signed 32-bit timestamps, i.e.,
-# through 2038-01-19 03:14:07 UTC.
-#Rule Zion 2028 2053 - Oct Sun>=2 2:00 0 S
-#Rule Zion 2054 only - Oct Mon>=3 2:00 0 S
-#Rule Zion 2055 2080 - Oct Sun>=2 2:00 0 S
-#Rule Zion 2081 only - Oct Mon>=3 2:00 0 S
-#Rule Zion 2082 max - Oct Sun>=2 2:00 0 S
+Rule Zion 2013 max - Oct lastSun 2:00 0 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Jerusalem 2:20:56 - LMT 1880
+Zone Asia/Jerusalem 2:20:54 - LMT 1880
2:20:40 - JMT 1918 # Jerusalem Mean Time?
2:00 Zion I%sT
@@ -2570,8 +2552,8 @@
Rule Syria 2007 only - Mar lastFri 0:00 1:00 S
# From Jesper Norgard (2007-10-27):
# The sister center ICARDA of my work CIMMYT is confirming that Syria DST will
-# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or
-# rather Midnight between Thursday and Friday. This does make more sence than
+# not take place 1st November at 0:00 o'clock but 1st November at 24:00 or
+# rather Midnight between Thursday and Friday. This does make more sense than
# having it between Wednesday and Thursday (two workdays in Syria) since the
# weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now
# it is implemented at midnight of the last workday before weekend...
--- a/jdk/make/sun/javazic/tzdata/australasia Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/australasia Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -253,10 +253,16 @@
# - Macquarie Island will stay on UTC+11 for winter and therefore not
# switch back from daylight savings time when other parts of Australia do
# on 4 April.
+#
+# From Arthur David Olson (2013-05-23):
+# The 1919 transition is overspecified below so pre-2013 zics
+# will produce a binary file with an EST-type as the first 32-bit type;
+# this is required for correct handling of times before 1916 by
+# pre-2013 versions of localtime.
Zone Antarctica/Macquarie 0 - zzz 1899 Nov
10:00 - EST 1916 Oct 1 2:00
10:00 1:00 EST 1917 Feb
- 10:00 Aus EST 1919 Apr
+ 10:00 Aus EST 1919 Apr 1 0:00s
0 - zzz 1948 Mar 25
10:00 Aus EST 1967
10:00 AT EST 2010 Apr 4 3:00
@@ -1498,12 +1504,12 @@
# From Paul Eggert (2000-01-08):
# IATA SSIM (1999-09) says DST ends 0100 local time. Go with McDow.
-# From the BBC World Service (1998-10-31 11:32 UTC):
+# From the BBC World Service in
+# http://news.bbc.co.uk/2/hi/asia-pacific/205226.stm (1998-10-31 16:03 UTC):
# The Fijiian government says the main reasons for the time change is to
-# improve productivity and reduce road accidents. But correspondents say it
-# also hopes the move will boost Fiji's ability to compete with other pacific
-# islands in the effort to attract tourists to witness the dawning of the new
-# millenium.
+# improve productivity and reduce road accidents.... [T]he move is also
+# intended to boost Fiji's ability to attract tourists to witness the dawning
+# of the new millennium.
# http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13)
# reports that Fiji has discontinued DST.
@@ -1648,7 +1654,7 @@
# Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell.
# From Eric Ulevik (1999-05-03):
-# Tonga's director of tourism, who is also secretary of the National Millenium
+# Tonga's director of tourism, who is also secretary of the National Millennium
# Committee, has a plan to get Tonga back in front.
# He has proposed a one-off move to tropical daylight saving for Tonga from
# October to March, which has won approval in principle from the Tongan
--- a/jdk/make/sun/javazic/tzdata/backward Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/backward Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/etcetera Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/etcetera Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/europe Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/europe Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -546,7 +546,7 @@
# It seems that Paris, Monaco, Rule France, Rule Belgium all agree on
# 2:00 standard time, e.g. 3:00 local time. However there are no
# countries that use C-Eur rules in September 1945, so the only items
-# affected are apparently these ficticious zones that translates acronyms
+# affected are apparently these fictitious zones that translate acronyms
# CET and MET:
#
# Zone CET 1:00 C-Eur CE%sT
@@ -2802,9 +2802,9 @@
# Ukraine
#
-# From Igor Karpov, who works for the Ukranian Ministry of Justice,
+# From Igor Karpov, who works for the Ukrainian Ministry of Justice,
# via Garrett Wollman (2003-01-27):
-# BTW, I've found the official document on this matter. It's goverment
+# BTW, I've found the official document on this matter. It's government
# regulations number 509, May 13, 1996. In my poor translation it says:
# "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday
# of March at 3am the time is changing to 4am and each last Sunday of
@@ -2838,7 +2838,7 @@
# time this year after all.
#
# From Udo Schwedt (2011-10-18):
-# As far as I understand, the recent change to the Ukranian time zone
+# As far as I understand, the recent change to the Ukrainian time zone
# (Europe/Kiev) to introduce permanent daylight saving time (similar
# to Russia) was reverted today:
#
--- a/jdk/make/sun/javazic/tzdata/factory Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/factory Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/iso3166.tab Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/iso3166.tab Tue Aug 20 17:44:18 2013 -0700
@@ -1,39 +1,37 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-# <pre>
+# ISO 3166 alpha-2 country codes
+#
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
-# ISO 3166 alpha-2 country codes
#
-# From Paul Eggert (2006-09-27):
+# From Paul Eggert (2013-05-27):
#
# This file contains a table with the following columns:
# 1. ISO 3166-1 alpha-2 country code, current as of
-# ISO 3166-1 Newsletter VI-1 (2007-09-21). See:
-# <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html">
-# ISO 3166 Maintenance agency (ISO 3166/MA)
-# </a>.
+# ISO 3166-1 Newsletter VI-15 (2013-05-10). See: Updates on ISO 3166
+# http://www.iso.org/iso/home/standards/country_codes/updates_on_iso_3166.htm
# 2. The usual English name for the country,
# chosen so that alphabetic sorting of subsets produces helpful lists.
# This is not the same as the English name in the ISO 3166 tables.
@@ -43,8 +41,9 @@
#
# Lines beginning with `#' are comments.
#
-# From Arthur David Olson (2011-08-17):
-# Resynchronized today with the ISO 3166 site (adding SS for South Sudan).
+# This table is intended as an aid for users, to help them select time
+# zone data appropriate for their practical needs. It is not intended
+# to take or endorse any position on legal or territorial claims.
#
#country-
#code country name
@@ -77,7 +76,7 @@
BM Bermuda
BN Brunei
BO Bolivia
-BQ Bonaire Sint Eustatius & Saba
+BQ Bonaire, St Eustatius & Saba
BR Brazil
BS Bahamas
BT Bhutan
@@ -258,7 +257,7 @@
SS South Sudan
ST Sao Tome & Principe
SV El Salvador
-SX Sint Maarten
+SX St Maarten (Dutch part)
SY Syria
SZ Swaziland
TC Turks & Caicos Is
--- a/jdk/make/sun/javazic/tzdata/leapseconds Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/leapseconds Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/northamerica Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/northamerica Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/pacificnew Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/pacificnew Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/solar87 Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/solar87 Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/solar88 Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/solar88 Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/solar89 Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/solar89 Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/southamerica Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/southamerica Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -994,7 +994,7 @@
# adopted by the same states as before.
Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S
# From Frederico A. C. Neves (2008-09-10):
-# Acording to this decree
+# According to this decree
# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm">
# http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm
# </a>
@@ -1226,7 +1226,7 @@
# http://www.emol.com/noticias/nacional/detalle/detallenoticias.asp?idnoticia=467651
# </a>
#
-# This is not yet reflected in the offical "cambio de hora" site, but
+# This is not yet reflected in the official "cambio de hora" site, but
# probably will be soon:
# <a href="http://www.horaoficial.cl/cambio.htm">
# http://www.horaoficial.cl/cambio.htm
--- a/jdk/make/sun/javazic/tzdata/systemv Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/systemv Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/make/sun/javazic/tzdata/zone.tab Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/javazic/tzdata/zone.tab Tue Aug 20 17:44:18 2013 -0700
@@ -1,41 +1,44 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-# <pre>
+# TZ zone descriptions
+#
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
#
-# TZ zone descriptions
-#
-# From Paul Eggert (1996-08-05):
+# From Paul Eggert (2013-05-27):
#
# This file contains a table with the following columns:
# 1. ISO 3166 2-character country code. See the file `iso3166.tab'.
+# This identifies a country that overlaps the zone. The country may
+# overlap other zones and the zone may overlap other countries.
# 2. Latitude and longitude of the zone's principal location
# in ISO 6709 sign-degrees-minutes-seconds format,
# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
# first latitude (+ is north), then longitude (+ is east).
+# This location need not lie within the column-1 country.
# 3. Zone name used in value of TZ environment variable.
+# Please see the 'Theory' file for how zone names are chosen.
# 4. Comments; present if and only if the country has multiple rows.
#
# Columns are separated by a single tab.
@@ -45,6 +48,10 @@
#
# Lines beginning with `#' are comments.
#
+# This table is intended as an aid for users, to help them select time
+# zone data appropriate for their practical needs. It is not intended
+# to take or endorse any position on legal or territorial claims.
+#
#country-
#code coordinates TZ comments
AD +4230+00131 Europe/Andorra
@@ -239,7 +246,7 @@
ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor
ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas)
IE +5320-00615 Europe/Dublin
-IL +3146+03514 Asia/Jerusalem
+IL +314650+0351326 Asia/Jerusalem
IM +5409-00428 Europe/Isle_of_Man
IN +2232+08822 Asia/Kolkata
IO -0720+07225 Indian/Chagos
--- a/jdk/make/sun/jconsole/Makefile Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/sun/jconsole/Makefile Tue Aug 20 17:44:18 2013 -0700
@@ -94,4 +94,5 @@
clean clobber::
$(RM) $(TEMPDIR)/manifest $(JARFILE)
+ $(RM) $(GENSRCDIR)/sun/tools/jconsole/Version.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/tools/CharsetMapping/IBM290.c2b Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,100 @@
+#
+# Diff of
+# b2c: cdctables.zip/Package2.zip/IBM-290.zip/012234B0.TPMAP100
+# c2b: cdctables.zip/Package2.zip/IBM-290.zip/012234B0.UPMAP100
+#
+# fullwidth form
+0x4B U+FF0E
+0x4C U+FF1C
+0x4D U+FF08
+0x4E U+FF0B
+0x4F U+FF5C
+0x50 U+FF06
+0x5A U+FF01
+0x5C U+FF0A
+0x5D U+FF09
+0x5E U+FF1B
+0x60 U+FF0D
+0x61 U+FF0F
+0x62 U+FF41
+0x63 U+FF42
+0x64 U+FF43
+0x65 U+FF44
+0x66 U+FF45
+0x67 U+FF46
+0x68 U+FF47
+0x69 U+FF48
+0x6B U+FF0C
+0x6C U+FF05
+0x6D U+FF3F
+0x6E U+FF1E
+0x6F U+FF1F
+0x70 U+FF3B
+0x71 U+FF49
+0x72 U+FF4A
+0x73 U+FF4B
+0x74 U+FF4C
+0x75 U+FF4D
+0x76 U+FF4E
+0x77 U+FF4F
+0x78 U+FF50
+0x79 U+FF40
+0x7A U+FF1A
+0x7B U+FF03
+0x7C U+FF20
+0x7D U+FF07
+0x7E U+FF1D
+0x7F U+FF02
+0x80 U+FF3D
+0x8B U+FF51
+0x9B U+FF52
+0xA0 U+FF5E
+0xAB U+FF53
+0xB0 U+FF3E
+0xB2 U+FF3C
+0xB3 U+FF54
+0xB4 U+FF55
+0xB5 U+FF56
+0xB6 U+FF57
+0xB7 U+FF58
+0xB8 U+FF59
+0xB9 U+FF5A
+0xC0 U+FF5B
+0xC1 U+FF21
+0xC2 U+FF22
+0xC3 U+FF23
+0xC4 U+FF24
+0xC5 U+FF25
+0xC6 U+FF26
+0xC7 U+FF27
+0xC8 U+FF28
+0xC9 U+FF29
+0xD0 U+FF5D
+0xD1 U+FF2A
+0xD2 U+FF2B
+0xD3 U+FF2C
+0xD4 U+FF2D
+0xD5 U+FF2E
+0xD6 U+FF2F
+0xD7 U+FF30
+0xD8 U+FF31
+0xD9 U+FF32
+0xE0 U+FF04
+0xE2 U+FF33
+0xE3 U+FF34
+0xE4 U+FF35
+0xE5 U+FF36
+0xE6 U+FF37
+0xE7 U+FF38
+0xE8 U+FF39
+0xE9 U+FF3A
+0xF0 U+FF10
+0xF1 U+FF11
+0xF2 U+FF12
+0xF3 U+FF13
+0xF4 U+FF14
+0xF5 U+FF15
+0xF6 U+FF16
+0xF7 U+FF17
+0xF8 U+FF18
+0xF9 U+FF19
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/tools/CharsetMapping/IBM290.map Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,232 @@
+#
+# b2c mapping for IBM290, generated from
+# cdctables.zip/Package2.zip/IBM-290.zip/012234B0.TPMAP100
+#
+0x00 U+0000
+0x01 U+0001
+0x02 U+0002
+0x03 U+0003
+0x04 U+009C
+0x05 U+0009
+0x06 U+0086
+0x07 U+007F
+0x08 U+0097
+0x09 U+008D
+0x0A U+008E
+0x0B U+000B
+0x0C U+000C
+0x0D U+000D
+0x0E U+000E
+0x0F U+000F
+0x10 U+0010
+0x11 U+0011
+0x12 U+0012
+0x13 U+0013
+0x14 U+009D
+0x15 U+0085
+0x16 U+0008
+0x17 U+0087
+0x18 U+0018
+0x19 U+0019
+0x1A U+0092
+0x1B U+008F
+0x1C U+001C
+0x1D U+001D
+0x1E U+001E
+0x1F U+001F
+0x20 U+0080
+0x21 U+0081
+0x22 U+0082
+0x23 U+0083
+0x24 U+0084
+0x25 U+000A
+0x26 U+0017
+0x27 U+001B
+0x28 U+0088
+0x29 U+0089
+0x2A U+008A
+0x2B U+008B
+0x2C U+008C
+0x2D U+0005
+0x2E U+0006
+0x2F U+0007
+0x30 U+0090
+0x31 U+0091
+0x32 U+0016
+0x33 U+0093
+0x34 U+0094
+0x35 U+0095
+0x36 U+0096
+0x37 U+0004
+0x38 U+0098
+0x39 U+0099
+0x3A U+009A
+0x3B U+009B
+0x3C U+0014
+0x3D U+0015
+0x3E U+009E
+0x3F U+001A
+0x40 U+0020
+0x41 U+FF61
+0x42 U+FF62
+0x43 U+FF63
+0x44 U+FF64
+0x45 U+FF65
+0x46 U+FF66
+0x47 U+FF67
+0x48 U+FF68
+0x49 U+FF69
+0x4A U+00A3
+0x4B U+002E
+0x4C U+003C
+0x4D U+0028
+0x4E U+002B
+0x4F U+007C
+0x50 U+0026
+0x51 U+FF6A
+0x52 U+FF6B
+0x53 U+FF6C
+0x54 U+FF6D
+0x55 U+FF6E
+0x56 U+FF6F
+0x58 U+FF70
+0x5A U+0021
+0x5B U+00A5
+0x5C U+002A
+0x5D U+0029
+0x5E U+003B
+0x5F U+00AC
+0x60 U+002D
+0x61 U+002F
+0x62 U+0061
+0x63 U+0062
+0x64 U+0063
+0x65 U+0064
+0x66 U+0065
+0x67 U+0066
+0x68 U+0067
+0x69 U+0068
+0x6B U+002C
+0x6C U+0025
+0x6D U+005F
+0x6E U+003E
+0x6F U+003F
+0x70 U+005B
+0x71 U+0069
+0x72 U+006A
+0x73 U+006B
+0x74 U+006C
+0x75 U+006D
+0x76 U+006E
+0x77 U+006F
+0x78 U+0070
+0x79 U+0060
+0x7A U+003A
+0x7B U+0023
+0x7C U+0040
+0x7D U+0027
+0x7E U+003D
+0x7F U+0022
+0x80 U+005D
+0x81 U+FF71
+0x82 U+FF72
+0x83 U+FF73
+0x84 U+FF74
+0x85 U+FF75
+0x86 U+FF76
+0x87 U+FF77
+0x88 U+FF78
+0x89 U+FF79
+0x8A U+FF7A
+0x8B U+0071
+0x8C U+FF7B
+0x8D U+FF7C
+0x8E U+FF7D
+0x8F U+FF7E
+0x90 U+FF7F
+0x91 U+FF80
+0x92 U+FF81
+0x93 U+FF82
+0x94 U+FF83
+0x95 U+FF84
+0x96 U+FF85
+0x97 U+FF86
+0x98 U+FF87
+0x99 U+FF88
+0x9A U+FF89
+0x9B U+0072
+0x9D U+FF8A
+0x9E U+FF8B
+0x9F U+FF8C
+0xA0 U+007E
+0xA1 U+203E
+0xA2 U+FF8D
+0xA3 U+FF8E
+0xA4 U+FF8F
+0xA5 U+FF90
+0xA6 U+FF91
+0xA7 U+FF92
+0xA8 U+FF93
+0xA9 U+FF94
+0xAA U+FF95
+0xAB U+0073
+0xAC U+FF96
+0xAD U+FF97
+0xAE U+FF98
+0xAF U+FF99
+0xB0 U+005E
+0xB1 U+00A2
+0xB2 U+005C
+0xB3 U+0074
+0xB4 U+0075
+0xB5 U+0076
+0xB6 U+0077
+0xB7 U+0078
+0xB8 U+0079
+0xB9 U+007A
+0xBA U+FF9A
+0xBB U+FF9B
+0xBC U+FF9C
+0xBD U+FF9D
+0xBE U+FF9E
+0xBF U+FF9F
+0xC0 U+007B
+0xC1 U+0041
+0xC2 U+0042
+0xC3 U+0043
+0xC4 U+0044
+0xC5 U+0045
+0xC6 U+0046
+0xC7 U+0047
+0xC8 U+0048
+0xC9 U+0049
+0xD0 U+007D
+0xD1 U+004A
+0xD2 U+004B
+0xD3 U+004C
+0xD4 U+004D
+0xD5 U+004E
+0xD6 U+004F
+0xD7 U+0050
+0xD8 U+0051
+0xD9 U+0052
+0xE0 U+0024
+0xE2 U+0053
+0xE3 U+0054
+0xE4 U+0055
+0xE5 U+0056
+0xE6 U+0057
+0xE7 U+0058
+0xE8 U+0059
+0xE9 U+005A
+0xF0 U+0030
+0xF1 U+0031
+0xF2 U+0032
+0xF3 U+0033
+0xF4 U+0034
+0xF5 U+0035
+0xF6 U+0036
+0xF7 U+0037
+0xF8 U+0038
+0xF9 U+0039
+0xFF U+009F
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/tools/CharsetMapping/IBM300.c2b Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,50 @@
+#
+# Diff of
+# b2c: cdctables.zip/Package2.zip/IBM-300.zip/012C34B0.TPMAP120
+# c2b: cdctables.zip/Package2.zip/IBM-300.zip/012C34B0.UPMAP120
+#
+4260 2212
+426A 00A6
+43A1 301C
+444A 2014
+446E F86F
+447C 2016
+4C7D 9E7C
+4EB3 9830
+4F5E 5861
+507F 91AC
+5190 56CA
+51F1 6805
+51FA 91B1
+5261 9EB4
+52A1 881F
+52C9 840A
+52DA 7E61
+52EC 4FE0
+5353 8EC0
+5373 7E6B
+53B3 8346
+53DA 9A52
+53E8 87EC
+53EE 7130
+53F8 8523
+5443 5C5B
+5464 9DD7
+547D 5699
+5481 525D
+54A3 6414
+54A4 7626
+54CA 7C1E
+54CD 6451
+54D4 555E
+54FA 6F51
+5550 7006
+5553 79B1
+555F 9EB5
+55C0 5C62
+55C1 985A
+5B72 6522
+5BFE 688E
+60F1 7E48
+61B0 8141
+66C8 9839
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/tools/CharsetMapping/IBM300.map Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,11644 @@
+#
+# b2c mapping for IBM300, generated from
+# cdctables.zip/Package2.zip/IBM-300.zip/012C34B0.TPMAP120
+#
+# <subchar> FEFE
+# Note: subchar FEFE itself is not a defined character in
+# 300 character set, we use fullwidth question mark
+# <0x426f U+FF1F> instead
+#
+4040 3000
+4141 03B1
+4142 03B2
+4143 03B3
+4144 03B4
+4145 03B5
+4146 03B6
+4147 03B7
+4148 03B8
+4149 03B9
+414A 03BA
+414B 03BB
+414C 03BC
+414D 03BD
+414E 03BE
+414F 03BF
+4150 03C0
+4151 03C1
+4152 03C3
+4153 03C4
+4154 03C5
+4155 03C6
+4156 03C7
+4157 03C8
+4158 03C9
+4161 0391
+4162 0392
+4163 0393
+4164 0394
+4165 0395
+4166 0396
+4167 0397
+4168 0398
+4169 0399
+416A 039A
+416B 039B
+416C 039C
+416D 039D
+416E 039E
+416F 039F
+4170 03A0
+4171 03A1
+4172 03A3
+4173 03A4
+4174 03A5
+4175 03A6
+4176 03A7
+4177 03A8
+4178 03A9
+4180 0430
+4181 0431
+4182 0432
+4183 0433
+4184 0434
+4185 0435
+4186 0451
+4187 0436
+4188 0437
+4189 0438
+418A 0439
+418B 043A
+418C 043B
+418D 043C
+418E 043D
+418F 043E
+4190 043F
+4191 0440
+4192 0441
+4193 0442
+4194 0443
+4195 0444
+4196 0445
+4197 0446
+4198 0447
+4199 0448
+419A 0449
+419B 044A
+419C 044B
+419D 044C
+419E 044D
+419F 044E
+41A0 044F
+41B1 2170
+41B2 2171
+41B3 2172
+41B4 2173
+41B5 2174
+41B6 2175
+41B7 2176
+41B8 2177
+41B9 2178
+41BA 2179
+41C0 0410
+41C1 0411
+41C2 0412
+41C3 0413
+41C4 0414
+41C5 0415
+41C6 0401
+41C7 0416
+41C8 0417
+41C9 0418
+41CA 0419
+41CB 041A
+41CC 041B
+41CD 041C
+41CE 041D
+41CF 041E
+41D0 041F
+41D1 0420
+41D2 0421
+41D3 0422
+41D4 0423
+41D5 0424
+41D6 0425
+41D7 0426
+41D8 0427
+41D9 0428
+41DA 0429
+41DB 042A
+41DC 042B
+41DD 042C
+41DE 042D
+41DF 042E
+41E0 042F
+41F1 2160
+41F2 2161
+41F3 2162
+41F4 2163
+41F5 2164
+41F6 2165
+41F7 2166
+41F8 2167
+41F9 2168
+41FA 2169
+424A FFE1
+424B FF0E
+424C FF1C
+424D FF08
+424E FF0B
+424F FF5C
+4250 FF06
+425A FF01
+425B FFE5
+425C FF0A
+425D FF09
+425E FF1B
+425F FFE2
+4260 FF0D
+4261 FF0F
+426A FFE4
+426B FF0C
+426C FF05
+426D FF3F
+426E FF1E
+426F FF1F
+4279 FF40
+427A FF1A
+427B FF03
+427C FF20
+427D FF07
+427E FF1D
+427F FF02
+4281 FF41
+4282 FF42
+4283 FF43
+4284 FF44
+4285 FF45
+4286 FF46
+4287 FF47
+4288 FF48
+4289 FF49
+4291 FF4A
+4292 FF4B
+4293 FF4C
+4294 FF4D
+4295 FF4E
+4296 FF4F
+4297 FF50
+4298 FF51
+4299 FF52
+42A1 FFE3
+42A2 FF53
+42A3 FF54
+42A4 FF55
+42A5 FF56
+42A6 FF57
+42A7 FF58
+42A8 FF59
+42A9 FF5A
+42C0 FF5B
+42C1 FF21
+42C2 FF22
+42C3 FF23
+42C4 FF24
+42C5 FF25
+42C6 FF26
+42C7 FF27
+42C8 FF28
+42C9 FF29
+42D0 FF5D
+42D1 FF2A
+42D2 FF2B
+42D3 FF2C
+42D4 FF2D
+42D5 FF2E
+42D6 FF2F
+42D7 FF30
+42D8 FF31
+42D9 FF32
+42E0 FF04
+42E2 FF33
+42E3 FF34
+42E4 FF35
+42E5 FF36
+42E6 FF37
+42E7 FF38
+42E8 FF39
+42E9 FF3A
+42F0 FF10
+42F1 FF11
+42F2 FF12
+42F3 FF13
+42F4 FF14
+42F5 FF15
+42F6 FF16
+42F7 FF17
+42F8 FF18
+42F9 FF19
+4341 3002
+4342 300C
+4343 300D
+4344 3001
+4345 30FB
+4346 30F2
+4347 30A1
+4348 30A3
+4349 30A5
+434A FFE0
+434B 2220
+434C 22A5
+434D 2312
+434E 2202
+434F 2207
+4351 30A7
+4352 30A9
+4353 30E3
+4354 30E5
+4355 30E7
+4356 30C3
+4357 30EE
+4358 30FC
+4359 30F5
+435A 30F6
+435B 2261
+435C 2252
+435D 226A
+435E 226B
+435F 221A
+4360 223D
+4361 221D
+4362 222B
+4363 222C
+4364 2208
+4365 220B
+4366 2286
+4367 2287
+4368 2282
+4369 2283
+436A 222A
+436B 2229
+436C 2227
+436D 2228
+436E 21D2
+436F 21D4
+4370 2200
+4371 2203
+4372 212B
+4373 2030
+4374 266F
+4375 266D
+4376 266A
+4377 2020
+4378 2021
+4379 00B6
+437A 25EF
+437C 2500
+437D 2502
+437E 250C
+437F 2510
+4381 30A2
+4382 30A4
+4383 30A6
+4384 30A8
+4385 30AA
+4386 30AB
+4387 30AD
+4388 30AF
+4389 30B1
+438A 30B3
+438C 30B5
+438D 30B7
+438E 30B9
+438F 30BB
+4390 30BD
+4391 30BF
+4392 30C1
+4393 30C4
+4394 30C6
+4395 30C8
+4396 30CA
+4397 30CB
+4398 30CC
+4399 30CD
+439A 30CE
+439D 30CF
+439E 30D2
+439F 30D5
+43A1 FF5E
+43A2 30D8
+43A3 30DB
+43A4 30DE
+43A5 30DF
+43A6 30E0
+43A7 30E1
+43A8 30E2
+43A9 30E4
+43AA 30E6
+43AC 30E8
+43AD 30E9
+43AE 30EA
+43AF 30EB
+43B0 2518
+43B1 2514
+43B2 251C
+43B3 252C
+43B4 2524
+43B5 2534
+43B6 253C
+43B7 2501
+43B8 2503
+43B9 250F
+43BA 30EC
+43BB 30ED
+43BC 30EF
+43BD 30F3
+43BE 309B
+43BF 309C
+43C0 30AC
+43C1 30AE
+43C2 30B0
+43C3 30B2
+43C4 30B4
+43C5 30B6
+43C6 30B8
+43C7 30BA
+43C8 30BC
+43C9 30BE
+43CA 30C0
+43CB 30C2
+43CC 30C5
+43CD 30C7
+43CE 30C9
+43CF 30D0
+43D0 30D3
+43D1 30D6
+43D2 30D9
+43D3 30DC
+43D4 30F4
+43D5 30D1
+43D6 30D4
+43D7 30D7
+43D8 30DA
+43D9 30DD
+43DA 30F0
+43DB 30F1
+43DC 30FD
+43DD 30FE
+43E0 FF3C
+43E1 2513
+43E2 251B
+43E3 2517
+43E4 2523
+43E5 2533
+43E6 252B
+43E7 253B
+43E8 254B
+43E9 2520
+43EA 252F
+43EB 2528
+43EC 2537
+43ED 253F
+43EE 251D
+43EF 2530
+43F0 2525
+43F1 2538
+43F2 2542
+4442 300E
+4443 300F
+4444 FF3B
+4445 FF3D
+4446 3092
+4447 3041
+4448 3043
+4449 3045
+444A 2015
+444B 00B1
+444C 2260
+444D 221E
+444E 2103
+4450 00B4
+4451 3047
+4452 3049
+4453 3083
+4454 3085
+4455 3087
+4456 3063
+4457 308E
+445A 2010
+445B 3003
+445C 4EDD
+445D 3005
+445E 3006
+445F 3007
+4460 00A8
+4461 2018
+4462 201C
+4463 3014
+4464 3008
+4465 300A
+4466 3010
+4467 2266
+4468 2234
+4469 2642
+446A 00A7
+446B 203B
+446C 3012
+446D 3231
+446E 2116
+446F 2121
+4470 FF3E
+4471 2019
+4472 201D
+4473 3015
+4474 3009
+4475 300B
+4476 3011
+4477 2267
+4478 2235
+4479 2640
+447A 00D7
+447B 00F7
+447C 2225
+447D 3013
+447E 2025
+447F 2026
+4481 3042
+4482 3044
+4483 3046
+4484 3048
+4485 304A
+4486 304B
+4487 304D
+4488 304F
+4489 3051
+448A 3053
+448C 3055
+448D 3057
+448E 3059
+448F 305B
+4490 305D
+4491 305F
+4492 3061
+4493 3064
+4494 3066
+4495 3068
+4496 306A
+4497 306B
+4498 306C
+4499 306D
+449A 306E
+449D 306F
+449E 3072
+449F 3075
+44A2 3078
+44A3 307B
+44A4 307E
+44A5 307F
+44A6 3080
+44A7 3081
+44A8 3082
+44A9 3084
+44AA 3086
+44AC 3088
+44AD 3089
+44AE 308A
+44AF 308B
+44BA 308C
+44BB 308D
+44BC 308F
+44BD 3093
+44C0 304C
+44C1 304E
+44C2 3050
+44C3 3052
+44C4 3054
+44C5 3056
+44C6 3058
+44C7 305A
+44C8 305C
+44C9 305E
+44CA 3060
+44CB 3062
+44CC 3065
+44CD 3067
+44CE 3069
+44CF 3070
+44D0 3073
+44D1 3076
+44D2 3079
+44D3 307C
+44D5 3071
+44D6 3074
+44D7 3077
+44D8 307A
+44D9 307D
+44DA 3090
+44DB 3091
+44DC 309D
+44DD 309E
+44E0 25CB
+44E1 25CF
+44E2 25B3
+44E3 25B2
+44E4 25CE
+44E5 2606
+44E6 2605
+44E7 25C7
+44E8 25C6
+44E9 25A1
+44EA 25A0
+44EB 25BD
+44EC 25BC
+44ED 00B0
+44EE 2032
+44EF 2033
+44F0 2192
+44F1 2190
+44F2 2191
+44F3 2193
+4541 4E00
+4542 4E8C
+4543 4E09
+4544 56DB
+4545 4E94
+4546 516D
+4547 4E03
+4548 516B
+4549 4E5D
+454A 5341
+454B 767E
+454C 5343
+454D 4E07
+454E 5104
+454F 90FD
+4550 9053
+4551 5E9C
+4552 770C
+4553 5E02
+4554 533A
+4555 753A
+4556 6751
+4557 6771
+4558 897F
+4559 5357
+455A 5317
+455B 5927
+455C 4E2D
+455D 5C0F
+455E 4E0A
+455F 4E0B
+4560 5E74
+4561 6708
+4562 65E5
+4563 7530
+4564 5B50
+4565 5C71
+4566 672C
+4567 5DDD
+4568 85E4
+4569 91CE
+456A 5DE5
+456B 696D
+456C 6728
+456D 4E95
+456E 90CE
+456F 5CF6
+4570 96C4
+4571 9AD8
+4572 5CA1
+4573 592B
+4574 539F
+4575 4EAC
+4576 4F50
+4577 6B63
+4578 677E
+4579 6A5F
+457A 548C
+457B 88FD
+457C 7537
+457D 7F8E
+457E 5409
+457F 5D0E
+4580 77F3
+4581 8C37
+4582 96FB
+4583 9577
+4584 6CBB
+4585 6CA2
+4586 91D1
+4587 65B0
+4588 53E3
+4589 6A4B
+458A 4E45
+458B 798F
+458C 6240
+458D 5E73
+458E 5185
+458F 56FD
+4590 5316
+4591 962A
+4592 5BAE
+4593 4EBA
+4594 4F5C
+4595 90E8
+4596 6E05
+4597 6B21
+4598 7FA9
+4599 751F
+459A 4EE3
+459B 51FA
+459C 6C34
+459D 68EE
+459E 5149
+459F 52A0
+45A0 5408
+45A1 795E
+45A2 6797
+45A3 91CD
+45A4 884C
+45A5 4FE1
+45A6 660E
+45A7 6D77
+45A8 5B89
+45A9 5E78
+45AA 4FDD
+45AB 592A
+45AC 5BCC
+45AD 6C5F
+45AE 9234
+45AF 524D
+45B0 77E5
+45B1 6B66
+45B2 4F0A
+45B3 662D
+45B4 5206
+45B5 52DD
+45B6 7528
+45B7 5E83
+45B8 9020
+45B9 6C17
+45BA 6210
+45BB 898B
+45BC 5229
+45BD 4F1A
+45BE 5B66
+45BF 5CA9
+45C0 7523
+45C1 9593
+45C2 5730
+45C3 81EA
+45C4 826F
+45C5 95A2
+45C6 611B
+45C7 653F
+45C8 5C3E
+45C9 8A08
+45CA 6587
+45CB 624B
+45CC 7236
+45CD 65B9
+45CE 4E8B
+45CF 6238
+45D0 54C1
+45D1 559C
+45D2 6E21
+45D3 5F18
+45D4 53E4
+45D5 8FBA
+45D6 5009
+45D7 9244
+45D8 4E4B
+45D9 5834
+45DA 6D0B
+45DB 57CE
+45DC 6D25
+45DD 7ACB
+45DE 5EA6
+45DF 5348
+45E0 4ECA
+45E1 5F66
+45E2 8A2D
+45E3 901A
+45E4 52D5
+45E5 5F8C
+45E6 5948
+45E7 5B9A
+45E8 6C60
+45E9 5C4B
+45EA 6D5C
+45EB 7406
+45EC 5742
+45ED 5B9F
+45EE 82F1
+45EF 7684
+45F0 53F8
+45F1 79C0
+45F2 6A2A
+45F3 540D
+45F4 5B5D
+45F5 7AF9
+45F6 535A
+45F7 529B
+45F8 5EAB
+45F9 8449
+45FA 6804
+45FB 6C38
+45FC 5668
+45FD 7389
+45FE 591A
+4641 8CC0
+4642 771F
+4643 6075
+4644 9759
+4645 5186
+4646 8302
+4647 654F
+4648 8C4A
+4649 5175
+464A 6CD5
+464B 767A
+464C 9752
+464D 5897
+464E 6599
+464F 5FE0
+4650 8CC7
+4651 6642
+4652 7269
+4653 8ECA
+4654 5FB3
+4655 8981
+4656 5BFE
+4657 585A
+4658 79CB
+4659 767D
+465A 6CB3
+465B 702C
+465C 6CB9
+465D 9686
+465E 8535
+465F 5F53
+4660 4FCA
+4661 5FD7
+4662 6625
+4663 793E
+4664 99AC
+4665 5165
+4666 5EFA
+4667 6839
+4668 6749
+4669 9032
+466A 8208
+466B 6D66
+466C 7CBE
+466D 540C
+466E 6027
+466F 7C73
+4670 8005
+4671 52A9
+4672 679D
+4673 8FD1
+4674 76F4
+4675 76EE
+4676 6765
+4677 753B
+4678 76F8
+4679 9ED2
+467A 4E38
+467B 8239
+467C 7531
+467D 58EB
+467E 7B2C
+467F 718A
+4680 7D19
+4681 5065
+4682 68B0
+4683 82B3
+4684 571F
+4685 6709
+4686 5BB6
+4687 7DDA
+4688 7D4C
+4689 8ABF
+468A 5929
+468B 671F
+468C 7F6E
+468D 6D45
+468E 6589
+468F 5F0F
+4690 5F62
+4691 9762
+4692 7A2E
+4693 8F38
+4694 5916
+4695 5143
+4696 4F53
+4697 9E7F
+4698 5FA1
+4699 5973
+469A 5EB7
+469B 4E16
+469C 52C7
+469D 5800
+469E 597D
+469F 5150
+46A0 5BFA
+46A1 92FC
+46A2 7279
+46A3 57FC
+46A4 9054
+46A5 5411
+46A6 53D6
+46A7 7B49
+46A8 667A
+46A9 56DE
+46AA 9580
+46AB 904B
+46AC 5099
+46AD 601D
+46AE 963F
+46AF 4E0D
+46B0 9808
+46B1 5168
+46B2 5BFF
+46B3 5584
+46B4 677F
+46B5 98EF
+46B6 8C9E
+46B7 73FE
+46B8 98DF
+46B9 7D44
+46BA 985E
+46BB 516C
+46BC 6750
+46BD 9999
+46BE 5546
+46BF 7D50
+46C0 8868
+46C1 77E2
+46C2 6F5F
+46C3 79C1
+46C4 5236
+46C5 90A6
+46C6 6CBC
+46C7 7CF8
+46C8 5B8F
+46C9 7B56
+46CA 6CE2
+46CB 54E1
+46CC 6570
+46CD 958B
+46CE 6E96
+46CF 6A39
+46D0 8CBB
+46D1 660C
+46D2 5F37
+46D3 7814
+46D4 53CB
+46D5 5B87
+46D6 82E5
+46D7 83CA
+46D8 6301
+46D9 82B1
+46DA 5F15
+46DB 7D00
+46DC 8352
+46DD 5225
+46DE 4FEE
+46DF 8D8A
+46E0 4F4F
+46E1 85AC
+46E2 6BDB
+46E3 9060
+46E4 554F
+46E5 5965
+46E6 578B
+46E7 5FC3
+46E8 767B
+46E9 65E9
+46EA 67F3
+46EB 6D69
+46EC 8CEA
+46ED 52D9
+46EE 6CC9
+46EF 5E38
+46F0 5B88
+46F1 57FA
+46F2 7BA1
+46F3 6CF0
+46F4 4F38
+46F5 6700
+46F6 4EE5
+46F7 6B4C
+46F8 88D5
+46F9 8D64
+46FA 8DB3
+46FB 898F
+46FC 6D41
+46FD 8AA0
+46FE 6607
+4741 5DDE
+4742 7167
+4743 5869
+4744 9001
+4745 96C5
+4746 672B
+4747 54F2
+4748 5CB8
+4749 4E5F
+474A 5C90
+474B 521D
+474C 8328
+474D 5247
+474E 6BD4
+474F 80FD
+4750 8A71
+4751 6295
+4752 8EE2
+4753 83C5
+4754 9023
+4755 4ED6
+4756 6C11
+4757 7D66
+4758 9152
+4759 7E41
+475A 4FA1
+475B 6E80
+475C 671D
+475D 4ED8
+475E 6761
+475F 7121
+4760 8003
+4761 697D
+4762 4E3B
+4763 610F
+4764 6226
+4765 5207
+4766 5264
+4767 7247
+4768 7D30
+4769 6E08
+476A 7A32
+476B 5E03
+476C 91CC
+476D 5C5E
+476E 7AE0
+476F 5909
+4770 4F55
+4771 685C
+4772 5F7C
+4773 67FB
+4774 76CA
+4775 58F2
+4776 4EC1
+4777 6DF1
+4778 53F0
+4779 9CE5
+477A 9DB4
+477B 652F
+477C 6574
+477D 89D2
+477E 5609
+477F 5473
+4780 885B
+4781 8B70
+4782 5727
+4783 7387
+4784 8DEF
+4785 706B
+4786 961C
+4787 8F1D
+4788 70B9
+4789 4E0E
+478A 6E1B
+478B 7551
+478C 9280
+478D 7A7A
+478E 4EA4
+478F 7FBD
+4790 534A
+4791 53CE
+4792 592E
+4793 7DCF
+4794 8A18
+4795 6674
+4796 69CB
+4797 969B
+4798 6885
+4799 5370
+479A 8A00
+479B 6817
+479C 8EAB
+479D 66F8
+479E 514B
+479F 7D20
+47A0 96C6
+47A1 7BC0
+47A2 5148
+47A3 6EDD
+47A4 6C7A
+47A5 6559
+47A6 7D14
+47A7 67F4
+47A8 63A5
+47A9 661F
+47AA 7740
+47AB 7559
+47AC 6620
+47AD 5DF1
+47AE 754C
+47AF 5177
+47B0 656C
+47B1 7FA4
+47B2 9806
+47B3 5171
+47B4 6D3B
+47B5 91CF
+47B6 6307
+47B7 89E3
+47B8 5BA4
+47B9 679C
+47BA 5404
+47BB 671B
+47BC 9632
+47BD 7D04
+47BE 61B2
+47BF 967D
+47C0 4E80
+47C1 56F3
+47C2 4E88
+47C3 8272
+47C4 7A0E
+47C5 690D
+47C6 53EF
+47C7 6052
+47C8 4F4D
+47C9 5178
+47CA 5FC5
+47CB 7D9A
+47CC 6025
+47CD 5728
+47CE 57A3
+47CF 541B
+47D0 5EF6
+47D1 5D8B
+47D2 4F01
+47D3 6803
+47D4 670D
+47D5 71B1
+47D6 5272
+47D7 5354
+47D8 6B69
+47D9 53F2
+47DA 512A
+47DB 658E
+47DC 623F
+47DD 5B97
+47DE 683C
+47DF 8FB0
+47E0 7B20
+47E1 5712
+47E2 8AF8
+47E3 8107
+47E4 5553
+47E5 8CE2
+47E6 5F25
+47E7 98A8
+47E8 5F97
+47E9 6613
+47EA 6253
+47EB 982D
+47EC 65ED
+47ED 6BB5
+47EE 52E2
+47EF 7136
+47F0 56E3
+47F1 984D
+47F2 843D
+47F3 914D
+47F4 7A0B
+47F5 8FBB
+47F6 543E
+47F7 611F
+47F8 5BDB
+47F9 53CD
+47FA 7A14
+47FB 9700
+47FC 6E90
+47FD 6C96
+47FE 984C
+4841 8FBC
+4842 8349
+4843 7B97
+4844 76DB
+4845 8FB2
+4846 90A3
+4847 7701
+4848 69D8
+4849 6BBF
+484A 5C11
+484B 4ECB
+484C 53D7
+484D 97F3
+484E 7DE8
+484F 59D4
+4850 5E84
+4851 4FC2
+4852 72B6
+4853 793A
+4854 5E97
+4855 5A9B
+4856 682A
+4857 6ECB
+4858 68A8
+4859 7E04
+485A 53F3
+485B 5DE6
+485C 53CA
+485D 9078
+485E 5C45
+485F 60C5
+4860 7DF4
+4861 70AD
+4862 9928
+4863 9271
+4864 6A21
+4865 6B8A
+4866 7E3E
+4867 4E9C
+4868 7E4A
+4869 4EF2
+486A 5857
+486B 6D88
+486C 8853
+486D 691C
+486E 6717
+486F 5B85
+4870 529F
+4871 5C1A
+4872 8CBF
+4873 60A6
+4874 8102
+4875 7BE0
+4876 4F73
+4877 7D21
+4878 51A8
+4879 6851
+487A 78BA
+487B 7267
+487C 4E26
+487D 5024
+487E 89B3
+487F 8CB4
+4880 7DAD
+4881 7D71
+4882 5BBF
+4883 4E21
+4884 7CD6
+4885 89AA
+4886 9332
+4887 6F84
+4888 65BD
+4889 5BB9
+488A 98DB
+488B 5C40
+488C 7950
+488D 904E
+488E 6C0F
+488F 6539
+4890 76E4
+4891 7A4D
+4892 6E0B
+4893 5DFB
+4894 6DF3
+4895 5FDC
+4896 4E89
+4897 8ECD
+4898 88C5
+4899 9178
+489A 7E54
+489B 67D3
+489C 5E1D
+489D 7DBF
+489E 7C89
+489F 822A
+48A0 7532
+48A1 5468
+48A2 4ED9
+48A3 5F85
+48A4 4F4E
+48A5 7DD1
+48A6 8EFD
+48A7 9EBB
+48A8 6176
+48A9 52B4
+48AA 78EF
+48AB 4E39
+48AC 80B2
+48AD 9650
+48AE 5C0E
+48AF 653E
+48B0 6643
+48B1 5EA7
+48B2 4EF6
+48B3 60F3
+48B4 9A13
+48B5 4ED5
+48B6 4F7F
+48B7 8F2A
+48B8 9854
+48B9 756A
+48BA 5F35
+48BB 805E
+48BC 4F9B
+48BD 6E6F
+48BE 6EB6
+48BF 6821
+48C0 9285
+48C1 92F3
+48C2 878D
+48C3 9756
+48C4 5199
+48C5 5B8C
+48C6 6E2F
+48C7 935B
+48C8 591C
+48C9 5145
+48CA 9F8D
+48CB 7DB1
+48CC 83F1
+48CD 901F
+48CE 52C9
+48CF 5237
+48D0 8D77
+48D1 6469
+48D2 53C2
+48D3 55B6
+48D4 7A42
+48D5 63A8
+48D6 8FD4
+48D7 8077
+48D8 6B62
+48D9 4F1D
+48DA 5E79
+48DB 7403
+48DC 6A29
+48DD 5C55
+48DE 5E61
+48DF 845B
+48E0 5EAD
+48E1 975E
+48E2 53F7
+48E3 5358
+48E4 6B73
+48E5 62E1
+48E6 51E6
+48E7 8A9E
+48E8 6628
+48E9 57DF
+48EA 6DF5
+48EB 518D
+48EC 50CD
+48ED 79D1
+48EE 9B5A
+48EF 7AEF
+48F0 9014
+48F1 6848
+48F2 5B57
+48F3 8AD6
+48F4 517C
+48F5 53C8
+48F6 632F
+48F7 6280
+48F8 5FB9
+48F9 672D
+48FA 7CFB
+48FB 5F93
+48FC 51B7
+48FD 614B
+48FE 5CF0
+4941 5931
+4942 539A
+4943 5074
+4944 6CE8
+4945 6E2C
+4946 9803
+4947 4E57
+4948 8A66
+4949 576A
+494A 8429
+494B 515A
+494C 6C7D
+494D 5B9D
+494E 606D
+494F 6A0B
+4950 6E29
+4951 6577
+4952 8AAC
+4953 82B8
+4954 544A
+4955 6B74
+4956 822C
+4957 98FE
+4958 793C
+4959 5C06
+495A 96E3
+495B 7802
+495C 5224
+495D 5F79
+495E 5F71
+495F 66FD
+4960 5E2F
+4961 9678
+4962 938C
+4963 8AC7
+4964 5F70
+4965 60AA
+4966 6A19
+4967 7533
+4968 5BB3
+4969 6BCD
+496A 88DC
+496B 5E4C
+496C 58F0
+496D 9664
+496E 7B39
+496F 5A66
+4970 4E7E
+4971 7AF6
+4972 829D
+4973 725B
+4974 8CB7
+4975 79FB
+4976 785D
+4977 8336
+4978 52B9
+4979 990A
+497A 52F2
+497B 80A5
+497C 8B19
+497D 7089
+497E 590F
+497F 5802
+4980 67CF
+4981 6255
+4982 5E30
+4983 713C
+4984 786B
+4985 8001
+4986 7A76
+4987 5BE9
+4988 91DD
+4989 65AD
+498A 5C04
+498B 5DEE
+498C 5D50
+498D 6298
+498E 8010
+498F 5BA3
+4990 59CB
+4991 5F8B
+4992 6B8B
+4993 666F
+4994 8C61
+4995 90F7
+4996 5353
+4997 96E2
+4998 85AB
+4999 6B7B
+499A 8015
+499B 64CD
+499C 4EAE
+499D 4E91
+499E 90E1
+499F 52E4
+49A0 6C42
+49A1 8CAB
+49A2 5B98
+49A3 59BB
+49A4 88CF
+49A5 773C
+49A6 4F2F
+49A7 7AAF
+49A8 7BC9
+49A9 968E
+49AA 63DB
+49AB 6842
+49AC 99C5
+49AD 68B6
+49AE 5747
+49AF 8CA1
+49B0 547D
+49B1 738B
+49B2 84B2
+49B3 90C1
+49B4 78E8
+49B5 7B11
+49B6 66F2
+49B7 6975
+49B8 5831
+49B9 63D0
+49BA 8A3C
+49BB 96EA
+49BC 9055
+49BD 88C1
+49BE 9996
+49BF 75C5
+49C0 6850
+49C1 4F59
+49C2 74E6
+49C3 4EE4
+49C4 5439
+49C5 732A
+49C6 672A
+49C7 525B
+49C8 8CA0
+49C9 4F34
+49CA 5100
+49CB 542B
+49CC 9069
+49CD 8FC4
+49CE 5C3B
+49CF 5DCC
+49D0 7B54
+49D1 8FFD
+49D2 8A0E
+49D3 4E08
+49D4 925B
+49D5 71C3
+49D6 8AB2
+49D7 70BA
+49D8 9662
+49D9 679A
+49DA 76AE
+49DB 8B77
+49DC 7DBE
+49DD 96E8
+49DE 6211
+49DF 5BC4
+49E0 837B
+49E1 62BC
+49E2 7D0D
+49E3 76E3
+49E4 7E2B
+49E5 964D
+49E6 572D
+49E7 7ADC
+49E8 7BC4
+49E9 6BBA
+49EA 8C9D
+49EB 698E
+49EC 9047
+49ED 6F14
+49EE 5360
+49EF 8FEB
+49F0 5287
+49F1 624D
+49F2 6566
+49F3 7D1A
+49F4 7D42
+49F5 6BCE
+49F6 7D79
+49F7 7E2E
+49F8 666E
+49F9 7965
+49FA 500B
+49FB 5C02
+49FC 99D2
+49FD 8A55
+49FE 7560
+4A41 5B58
+4A42 8089
+4A43 50BE
+4A44 5E2B
+4A45 6DB2
+4A46 4F8B
+4A47 81E3
+4A48 81F3
+4A49 56E0
+4A4A 7D99
+4A4B 5DF2
+4A4C 899A
+4A4D 6E9D
+4A4E 6D17
+4A4F 8AAD
+4A50 8996
+4A51 731B
+4A52 5DE8
+4A53 7DB2
+4A54 888B
+4A55 4EFB
+4A56 5BC6
+4A57 8896
+4A58 6CC1
+4A59 8457
+4A5A 8F03
+4A5B 6BC5
+4A5C 97FF
+4A5D 8CA9
+4A5E 5E45
+4A5F 82E6
+4A60 63AA
+4A61 5F81
+4A62 78C1
+4A63 821E
+4A64 52AA
+4A65 7AAA
+4A66 5999
+4A67 6297
+4A68 8F14
+4A69 7FD2
+4A6A 4FC3
+4A6B 54C9
+4A6C 967A
+4A6D 66F4
+4A6E 8B1B
+4A6F 5E72
+4A70 5FA9
+4A71 8A2A
+4A72 6D3E
+4A73 7763
+4A74 6483
+4A75 8B58
+4A76 614E
+4A77 5A5A
+4A78 8D85
+4A79 71D0
+4A7A 983C
+4A7B 72E9
+4A7C 583A
+4A7D 5DFE
+4A7E 8A8D
+4A7F 67C4
+4A80 7DE0
+4A81 4F11
+4A82 77ED
+4A83 4F0F
+4A84 5BC5
+4A85 629C
+4A86 5C3C
+4A87 533B
+4A88 6DC0
+4A89 81FC
+4A8A 96D1
+4A8B 904A
+4A8C 6D6E
+4A8D 93E1
+4A8E 5C64
+4A8F 98FC
+4A90 524A
+4A91 6DFB
+4A92 8584
+4A93 968A
+4A94 56FA
+4A95 5883
+4A96 7766
+4A97 9805
+4A98 4E73
+4A99 8C46
+4A9A 8A31
+4A9B 7DD2
+4A9C 8FF0
+4A9D 6D6A
+4A9E 4F9D
+4A9F 6B6F
+4AA0 6B27
+4AA1 62C5
+4AA2 511F
+4AA3 9769
+4AA4 5374
+4AA5 9AA8
+4AA6 6775
+4AA7 887F
+4AA8 5305
+4AA9 7570
+4AAA 8D70
+4AAB 864E
+4AAC 5CEF
+4AAD 8CDE
+4AAE 5FF5
+4AAF 725F
+4AB0 7686
+4AB1 609F
+4AB2 80CC
+4AB3 59EB
+4AB4 8131
+4AB5 5E0C
+4AB6 8A17
+4AB7 9676
+4AB8 82D7
+4AB9 74B0
+4ABA 84B8
+4ABB 50D5
+4ABC 96F2
+4ABD 7248
+4ABE 7834
+4ABF 6DD1
+4AC0 6E09
+4AC1 67FF
+4AC2 6F54
+4AC3 5915
+4AC4 500D
+4AC5 72AC
+4AC6 9EC4
+4AC7 7B46
+4AC8 9B3C
+4AC9 6563
+4ACA 53BB
+4ACB 8A98
+4ACC 91DC
+4ACD 9818
+4ACE 6FC3
+4ACF 65C5
+4AD0 501F
+4AD1 7F8A
+4AD2 6F64
+4AD3 9031
+4AD4 5F3E
+4AD5 63F4
+4AD6 9038
+4AD7 8B66
+4AD8 7BE4
+4AD9 7206
+4ADA 6843
+4ADB 72EC
+4ADC 65CF
+4ADD 82A6
+4ADE 5BA2
+4ADF 6960
+4AE0 9EA6
+4AE1 52DF
+4AE2 6790
+4AE3 639B
+4AE4 7D75
+4AE5 9855
+4AE6 5DF3
+4AE7 5805
+4AE8 8ACB
+4AE9 95A3
+4AEA 8863
+4AEB 8CA8
+4AEC 5B63
+4AED 5E8A
+4AEE 5449
+4AEF 786C
+4AF0 7D2B
+4AF1 8CA2
+4AF2 5352
+4AF3 7D76
+4AF4 8CB8
+4AF5 7070
+4AF6 547C
+4AF7 6545
+4AF8 6676
+4AF9 73B2
+4AFA 56F2
+4AFB 7BB1
+4AFC 58A8
+4AFD 7A81
+4AFE 66AE
+4B41 8087
+4B42 59FF
+4B43 8840
+4B44 56F0
+4B45 7B51
+4B46 6DF7
+4B47 5F01
+4B48 934B
+4B49 9000
+4B4A 4FE3
+4B4B 675F
+4B4C 4FBF
+4B4D 8CC3
+4B4E 526F
+4B4F 63A1
+4B50 5442
+4B51 8907
+4B52 698A
+4B53 5E2D
+4B54 5A18
+4B55 7518
+4B56 514D
+4B57 5E7E
+4B58 50B5
+4B59 5BDD
+4B5A 68D2
+4B5B 745E
+4B5C 69FB
+4B5D 5FAE
+4B5E 55E3
+4B5F 8A70
+4B60 5BF8
+4B61 5824
+4B62 8358
+4B63 5F13
+4B64 5E95
+4B65 706F
+4B66 751A
+4B67 7D05
+4B68 60E3
+4B69 7E70
+4B6A 5012
+4B6B 5238
+4B6C 83EF
+4B6D 5373
+4B6E 5F31
+4B6F 6A2B
+4B70 9CF4
+4B71 53CC
+4B72 6D32
+4B73 4EAB
+4B74 4E92
+4B75 842C
+4B76 8A8C
+4B77 65E2
+4B78 6F01
+4B79 80A9
+4B7A 9DF9
+4B7B 8B72
+4B7C 7B52
+4B7D 9589
+4B7E 6D74
+4B7F 63A2
+4B80 6590
+4B81 5BD2
+4B82 6319
+4B83 8AB0
+4B84 76DF
+4B85 99A8
+4B86 7A74
+4B87 8236
+4B88 8846
+4B89 8061
+4B8A 6557
+4B8B 5922
+4B8C 9644
+4B8D 88AB
+4B8E 9326
+4B8F 7B4B
+4B90 62B5
+4B91 5371
+4B92 5E81
+4B93 5BDF
+4B94 4F75
+4B95 58C1
+4B96 7058
+4B97 7DCA
+4B98 5438
+4B99 73E0
+4B9A 52D8
+4B9B 5208
+4B9C 78D0
+4B9D 6B23
+4B9E 6838
+4B9F 4E43
+4BA0 690E
+4BA1 8377
+4BA2 6ED1
+4BA3 98F2
+4BA4 8170
+4BA5 8857
+4BA6 8EF8
+4BA7 798E
+4BA8 83DC
+4BA9 8FCE
+4BAA 7E01
+4BAB 5510
+4BAC 4EA8
+4BAD 8A33
+4BAE 9162
+4BAF 5EFB
+4BB0 606F
+4BB1 4E86
+4BB2 664B
+4BB3 6368
+4BB4 5217
+4BB5 8056
+4BB6 51FD
+4BB7 7642
+4BB8 821F
+4BB9 9685
+4BBA 50CF
+4BBB 662F
+4BBC 4F3C
+4BBD 4E59
+4BBE 6A3D
+4BBF 4E71
+4BC0 523A
+4BC1 8ACF
+4BC2 6A58
+4BC3 66FF
+4BC4 670B
+4BC5 653B
+4BC6 9732
+4BC7 5EC3
+4BC8 8A13
+4BC9 5782
+4BCA 604B
+4BCB 866B
+4BCC 95D8
+4BCD 60A9
+4BCE 4E01
+4BCF 63CF
+4BD0 6FC0
+4BD1 659C
+4BD2 8CAC
+4BD3 8305
+4BD4 7CA7
+4BD5 6050
+4BD6 96F7
+4BD7 5FCD
+4BD8 640D
+4BD9 5B54
+4BDA 900F
+4BDB 62D3
+4BDC 59B9
+4BDD 7159
+4BDE 51AC
+4BDF 79F0
+4BE0 552F
+4BE1 5275
+4BE2 6697
+4BE3 80F8
+4BE4 4E98
+4BE5 4ECF
+4BE6 51CD
+4BE7 9D5C
+4BE8 5144
+4BE9 7A93
+4BEA 67F1
+4BEB 5841
+4BEC 7C21
+4BED 8861
+4BEE 5C31
+4BEF 68DA
+4BF0 91E7
+4BF1 9DF2
+4BF2 63EE
+4BF3 6575
+4BF4 84EE
+4BF5 523B
+4BF6 6B32
+4BF7 7C98
+4BF8 5982
+4BF9 969C
+4BFA 8987
+4BFB 7C9F
+4BFC 9006
+4BFD 62DB
+4BFE 66DC
+4C41 6355
+4C42 6982
+4C43 50AC
+4C44 623B
+4C45 5FD8
+4C46 63DA
+4C47 75DB
+4C48 627F
+4C49 616E
+4C4A 8266
+4C4B 7C95
+4C4C 716E
+4C4D 96C7
+4C4E 7F6A
+4C4F 5426
+4C50 5200
+4C51 83D3
+4C52 5211
+4C53 594F
+4C54 9D28
+4C55 574A
+4C56 66C7
+4C57 9858
+4C58 820E
+4C59 6614
+4C5A 733F
+4C5B 50B7
+4C5C 6551
+4C5D 5EB8
+4C5E 5B6B
+4C5F 55AC
+4C60 5FEB
+4C61 6388
+4C62 8CAF
+4C63 676F
+4C64 5951
+4C65 5A01
+4C66 71E5
+4C67 5DE3
+4C68 8C6A
+4C69 6271
+4C6A 81F4
+4C6B 5C3A
+4C6C 5F92
+4C6D 9045
+4C6E 7384
+4C6F 7149
+4C70 79D8
+4C71 796D
+4C72 9003
+4C73 83CC
+4C74 5FB4
+4C75 5B8D
+4C76 6279
+4C77 64AE
+4C78 7D18
+4C79 723E
+4C7A 5BEE
+4C7B 65E7
+4C7C 8D08
+4C7D 9E78
+4C7E 52E7
+4C7F 5D07
+4C80 9F62
+4C81 6069
+4C82 536F
+4C83 6681
+4C84 9663
+4C85 5E3D
+4C86 62B1
+4C87 722A
+4C88 6E4A
+4C89 93AE
+4C8A 79E6
+4C8B 53E5
+4C8C 809D
+4C8D 88FE
+4C8E 53B3
+4C8F 6C88
+4C90 6E7F
+4C91 5141
+4C92 9091
+4C93 6F6E
+4C94 84C4
+4C95 85EA
+4C96 8129
+4C97 6BD2
+4C98 663C
+4C99 7F72
+4C9A 73C2
+4C9B 5F1F
+4C9C 790E
+4C9D 60B2
+4C9E 72ED
+4C9F 58EE
+4CA0 8179
+4CA1 8E8D
+4CA2 5C65
+4CA3 5DE7
+4CA4 6C37
+4CA5 6DE1
+4CA6 862D
+4CA7 72AF
+4CA8 8E0A
+4CA9 7C92
+4CAA 8218
+4CAB 8033
+4CAC 63A7
+4CAD 9291
+4CAE 5019
+4CAF 8155
+4CB0 8A69
+4CB1 8EDF
+4CB2 66B4
+4CB3 8133
+4CB4 7591
+4CB5 6B20
+4CB6 6669
+4CB7 90F5
+4CB8 4E32
+4CB9 73EA
+4CBA 693F
+4CBB 7687
+4CBC 707D
+4CBD 7D3A
+4CBE 6148
+4CBF 8607
+4CC0 99FF
+4CC1 59C9
+4CC2 7832
+4CC3 7815
+4CC4 907F
+4CC5 80A1
+4CC6 5C3F
+4CC7 66A2
+4CC8 9418
+4CC9 6D44
+4CCA 5E55
+4CCB 5854
+4CCC 7B95
+4CCD 8DE1
+4CCE 4EA1
+4CCF 8C5A
+4CD0 81E8
+4CD1 89E6
+4CD2 9670
+4CD3 5263
+4CD4 74F6
+4CD5 9A5A
+4CD6 6012
+4CD7 520A
+4CD8 7434
+4CD9 9801
+4CDA 907A
+4CDB 5504
+4CDC 7956
+4CDD 5230
+4CDE 54B2
+4CDF 8A34
+4CE0 96A3
+4CE1 4FF3
+4CE2 9283
+4CE3 91E3
+4CE4 7D39
+4CE5 9688
+4CE6 4F51
+4CE7 7D61
+4CE8 5DBA
+4CE9 9BAE
+4CEA 5F80
+4CEB 795D
+4CEC 8597
+4CED 8DA3
+4CEE 7C60
+4CEF 5C0A
+4CF0 7565
+4CF1 85A9
+4CF2 63D6
+4CF3 9E97
+4CF4 7D22
+4CF5 5375
+4CF6 9AEA
+4CF7 9042
+4CF8 6B3D
+4CF9 7D0B
+4CFA 6392
+4CFB 80AA
+4CFC 7DE9
+4CFD 9F3B
+4CFE 99C6
+4D41 6D78
+4D42 6731
+4D43 5531
+4D44 6398
+4D45 7825
+4D46 5CB3
+4D47 5DE1
+4D48 92AD
+4D49 98FD
+4D4A 9810
+4D4B 6CE3
+4D4C 6B64
+4D4D 5321
+4D4E 6B53
+4D4F 5E8F
+4D50 7AE5
+4D51 502B
+4D52 6E56
+4D53 62BD
+4D54 8276
+4D55 6A9C
+4D56 4E18
+4D57 57F7
+4D58 752B
+4D59 7C97
+4D5A 82EB
+4D5B 9802
+4D5C 811A
+4D5D 73CD
+4D5E 8F9B
+4D5F 5C0B
+4D60 63E1
+4D61 7372
+4D62 8150
+4D63 80E1
+4D64 5B99
+4D65 76D7
+4D66 6291
+4D67 65EC
+4D68 8A3A
+4D69 5947
+4D6A 65E8
+4D6B 6E7E
+4D6C 6696
+4D6D 55AB
+4D6E 8F09
+4D6F 92ED
+4D70 9396
+4D71 4EEE
+4D72 755C
+4D73 6F38
+4D74 8F9E
+4D75 7981
+4D76 5C01
+4D77 62E0
+4D78 9BE8
+4D79 91C8
+4D7A 6276
+4D7B 65CB
+4D7C 8E0F
+4D7D 8B21
+4D7E 699B
+4D7F 6216
+4D80 5A92
+4D81 90B8
+4D82 50DA
+4D83 79DF
+4D84 6C41
+4D85 5270
+4D86 9175
+4D87 8B39
+4D88 685D
+4D89 5875
+4D8A 819C
+4D8B 5B9C
+4D8C 8A89
+4D8D 8A72
+4D8E 9D8F
+4D8F 6377
+4D90 5974
+4D91 8AA4
+4D92 52B1
+4D93 6962
+4D94 5C48
+4D95 9CE9
+4D96 673A
+4D97 75B2
+4D98 6D1E
+4D99 4F0D
+4D9A 7E6D
+4D9B 7B48
+4D9C 7FCC
+4D9D 65E6
+4D9E 59A5
+4D9F 79E9
+4DA0 6212
+4DA1 6EDE
+4DA2 770B
+4DA3 8CA7
+4DA4 65BC
+4DA5 885D
+4DA6 6ADB
+4DA7 5C4A
+4DA8 8074
+4DA9 9084
+4DAA 8ECC
+4DAB 65D7
+4DAC 57F9
+4DAD 708E
+4DAE 6F06
+4DAF 5E7C
+4DB0 77AC
+4DB1 4FF5
+4DB2 5949
+4DB3 81ED
+4DB4 9B45
+4DB5 7FFC
+4DB6 8178
+4DB7 69FD
+4DB8 6CCA
+4DB9 69C7
+4DBA 79D2
+4DBB 8B1D
+4DBC 9ED9
+4DBD 81D3
+4DBE 7A3C
+4DBF 7968
+4DC0 6F5C
+4DC1 63B2
+4DC2 8DDD
+4DC3 6383
+4DC4 6E9C
+4DC5 5E33
+4DC6 61F8
+4DC7 76BF
+4DC8 642C
+4DC9 7DB4
+4DCA 6247
+4DCB 6458
+4DCC 6816
+4DCD 5F69
+4DCE 9022
+4DCF 7A1A
+4DD0 82B9
+4DD1 70C8
+4DD2 9A12
+4DD3 6163
+4DD4 6FEF
+4DD5 53EB
+4DD6 9D3B
+4DD7 62FE
+4DD8 60A0
+4DD9 9591
+4DDA 6D99
+4DDB 6162
+4DDC 9298
+4DDD 635C
+4DDE 9707
+4DDF 8972
+4DE0 683D
+4DE1 51E1
+4DE2 9B54
+4DE3 608C
+4DE4 5B22
+4DE5 99C4
+4DE6 7126
+4DE7 8A73
+4DE8 971C
+4DE9 7396
+4DEA 67D4
+4DEB 60A3
+4DEC 4E11
+4DED 4EF0
+4DEE 8CDB
+4DEF 8CB0
+4DF0 7912
+4DF1 9774
+4DF2 8986
+4DF3 5146
+4DF4 57DC
+4DF5 99D0
+4DF6 80C3
+4DF7 8338
+4DF8 78A7
+4DF9 86CD
+4DFA 7F85
+4DFB 5049
+4DFC 8247
+4DFD 690B
+4DFE 7C4D
+4E41 53EA
+4E42 5F26
+4E43 6E25
+4E44 6881
+4E45 9375
+4E46 5DFD
+4E47 5347
+4E48 9727
+4E49 643A
+4E4A 75C7
+4E4B 6FA4
+4E4C 73A9
+4E4D 77E9
+4E4E 9451
+4E4F 8B5C
+4E50 808C
+4E51 674E
+4E52 4EAD
+4E53 582F
+4E54 7573
+4E55 8ED2
+4E56 6CE5
+4E57 9320
+4E58 8FF7
+4E59 7D33
+4E5A 72C2
+4E5B 8217
+4E5C 7422
+4E5D 82C5
+4E5E 9A30
+4E5F 773A
+4E60 5F84
+4E61 9673
+4E62 64AD
+4E63 920D
+4E64 74DC
+4E65 60C7
+4E66 86ED
+4E67 4FFA
+4E68 52A3
+4E69 6A3A
+4E6A 7720
+4E6B 5320
+4E6C 61B6
+4E6D 5674
+4E6E 8776
+4E6F 6CBF
+4E70 505C
+4E71 602A
+4E72 8466
+4E73 6B96
+4E74 6DBC
+4E75 97D3
+4E76 968F
+4E77 6876
+4E78 60D1
+4E79 5378
+4E7A 64A4
+4E7B 51A0
+4E7C 9154
+4E7D 5DF4
+4E7E 629E
+4E7F 5E63
+4E80 929A
+4E81 7693
+4E82 6C5A
+4E83 6597
+4E84 50E7
+4E85 7C82
+4E86 5F6B
+4E87 6CE1
+4E88 5F6C
+4E89 5AC1
+4E8A 6F2C
+4E8B 852D
+4E8C 6442
+4E8D 5750
+4E8E 58C7
+4E8F 8CFC
+4E90 8A5E
+4E91 7A7F
+4E92 689D
+4E93 7E26
+4E94 7A40
+4E95 7344
+4E96 8AEB
+4E97 4FD7
+4E98 7A63
+4E99 8036
+4E9A 7DEF
+4E9B 80C6
+4E9C 8AED
+4E9D 731F
+4E9E 8FEA
+4E9F 4F0E
+4EA0 758B
+4EA1 518A
+4EA2 6734
+4EA3 5FD9
+4EA4 61C7
+4EA5 65AF
+4EA6 9CF3
+4EA7 5ECA
+4EA8 9262
+4EA9 68DF
+4EAA 6CB8
+4EAB 80F4
+4EAC 57CB
+4EAD 6C99
+4EAE 96A0
+4EAF 5B64
+4EB0 58F1
+4EB1 68C4
+4EB2 5410
+4EB3 982C
+4EB4 8A87
+4EB5 4E5E
+4EB6 6167
+4EB7 9BAB
+4EB8 90AA
+4EB9 55B0
+4EBA 82BD
+4EBB 596A
+4EBC 66F3
+4EBD 8299
+4EBE 5893
+4EBF 719F
+4EC0 6284
+4EC1 67D1
+4EC2 9063
+4EC3 5ACC
+4EC4 6C57
+4EC5 7CE7
+4EC6 5851
+4EC7 64B2
+4EC8 58CA
+4EC9 830E
+4ECA 5968
+4ECB 5302
+4ECC 5A46
+4ECD 8702
+4ECE 6065
+4ECF 72D9
+4ED0 89A7
+4ED1 6689
+4ED2 66F9
+4ED3 5D6F
+4ED4 5BB0
+4ED5 96BC
+4ED6 636E
+4ED7 60DC
+4ED8 7948
+4ED9 51DD
+4EDA 8606
+4EDB 5EC9
+4EDC 7554
+4EDD 596E
+4EDE 6B04
+4EDF 4F43
+4EE0 7B94
+4EE1 67DA
+4EE2 62DD
+4EE3 628A
+4EE4 971E
+4EE5 62ED
+4EE6 6EC5
+4EE7 508D
+4EE8 67B6
+4EE9 80E4
+4EEA 9EBF
+4EEB 5EB5
+4EEC 638C
+4EED 85CD
+4EEE 9867
+4EEF 52C5
+4EF0 6016
+4EF1 68CB
+4EF2 61D0
+4EF3 5751
+4EF4 8F29
+4EF5 5FAA
+4EF6 81A8
+4EF7 7D62
+4EF8 71C8
+4EF9 54C0
+4EFA 69CC
+4EFB 6B3E
+4EFC 65AC
+4EFD 63C3
+4EFE 4F46
+4F41 7B1B
+4F42 6B86
+4F43 88F8
+4F44 5203
+4F45 732E
+4F46 6687
+4F47 7D17
+4F48 57F4
+4F49 570F
+4F4A 618E
+4F4B 970A
+4F4C 7C3F
+4F4D 8B00
+4F4E 7881
+4F4F 8CE0
+4F50 548B
+4F51 7B87
+4F52 745B
+4F53 7C11
+4F54 8870
+4F55 5398
+4F56 5448
+4F57 6CF3
+4F58 6F22
+4F59 53F6
+4F5A 88B4
+4F5B 5301
+4F5C 7A6B
+4F5D 8695
+4F5E 586B
+4F5F 5D29
+4F60 88C2
+4F61 62D2
+4F62 4E1E
+4F63 5036
+4F64 96C0
+4F65 7363
+4F66 8A3B
+4F67 5176
+4F68 7199
+4F69 7FE0
+4F6A 8888
+4F6B 7E1E
+4F6C 4E4F
+4F6D 84CB
+4F6E 6F2B
+4F6F 5859
+4F70 936C
+4F71 53E9
+4F72 865A
+4F73 9149
+4F74 86EF
+4F75 5E06
+4F76 5507
+4F77 902E
+4F78 6795
+4F79 846C
+4F7A 5BA5
+4F7B 82A5
+4F7C 8431
+4F7D 6D8C
+4F7E 63FA
+4F7F 4EA5
+4F80 51C6
+4F81 6328
+4F82 7F70
+4F83 5B5F
+4F84 5DBD
+4F85 99C8
+4F86 53EC
+4F87 7985
+4F88 8A54
+4F89 7962
+4F8A 88DF
+4F8B 5B09
+4F8C 4FB5
+4F8D 4F91
+4F8E 9B8E
+4F8F 5192
+4F90 96F0
+4F91 6DAF
+4F92 622F
+4F93 8490
+4F94 8CDC
+4F95 5075
+4F96 5CE0
+4F97 4E14
+4F98 4F83
+4F99 7C54
+4F9A 84D1
+4F9B 77B3
+4F9C 8AEE
+4F9D 5CE8
+4F9E 62F6
+4F9F 663B
+4FA0 8A93
+4FA1 8526
+4FA2 8A95
+4FA3 65FA
+4FA4 6714
+4FA5 53D4
+4FA6 62AB
+4FA7 8CE6
+4FA8 88F3
+4FA9 5BE7
+4FAA 868A
+4FAB 668E
+4FAC 582A
+4FAD 6170
+4FAE 696F
+4FAF 9F13
+4FB0 7A92
+4FB1 7893
+4FB2 6A7F
+4FB3 9017
+4FB4 9266
+4FB5 7D10
+4FB6 7BC7
+4FB7 6EF4
+4FB8 821C
+4FB9 5C3D
+4FBA 62CD
+4FBB 85C1
+4FBC 6F02
+4FBD 6E67
+4FBE 6691
+4FBF 85A6
+4FC0 637A
+4FC1 821B
+4FC2 4F8D
+4FC3 5091
+4FC4 8A02
+4FC5 62EC
+4FC6 9BC9
+4FC7 7A3D
+4FC8 7C9B
+4FC9 50C5
+4FCA 9019
+4FCB 708A
+4FCC 7C8B
+4FCD 64EC
+4FCE 665F
+4FCF 6562
+4FD0 732B
+4FD1 5339
+4FD2 67A0
+4FD3 55A7
+4FD4 6D2A
+4FD5 7A3F
+4FD6 64E6
+4FD7 79A7
+4FD8 67D8
+4FD9 7B26
+4FDA 96BB
+4FDB 6311
+4FDC 72A0
+4FDD 5C6F
+4FDE 7026
+4FDF 97EE
+4FE0 60DF
+4FE1 8AFE
+4FE2 8B04
+4FE3 8494
+4FE4 9BD6
+4FE5 82AF
+4FE6 932C
+4FE7 6606
+4FE8 9640
+4FE9 5BC2
+4FEA 86C7
+4FEB 7949
+4FEC 8017
+4FED 6919
+4FEE 7092
+4FEF 963B
+4FF0 7C7E
+4FF1 59D3
+4FF2 5B5C
+4FF3 7D1B
+4FF4 91D8
+4FF5 6A80
+4FF6 85E9
+4FF7 6905
+4FF8 6C93
+4FF9 502D
+4FFA 4EA6
+4FFB 7FC1
+4FFC 61A4
+4FFD 8CCA
+4FFE 9665
+5041 93D1
+5042 53F1
+5043 598A
+5044 8EAC
+5045 62D8
+5046 6867
+5047 71D5
+5048 7B67
+5049 504F
+504A 67D0
+504B 82D1
+504C 978D
+504D 748B
+504E 80BA
+504F 7336
+5050 514E
+5051 8105
+5052 90CA
+5053 584A
+5054 67FE
+5055 6FF1
+5056 5FFD
+5057 76C6
+5058 9A0E
+5059 507D
+505A 9694
+505B 5EF7
+505C 7BB8
+505D 904D
+505E 6C4E
+505F 85FB
+5060 819D
+5061 67AF
+5062 564C
+5063 5606
+5064 8C8C
+5065 56DA
+5066 73ED
+5067 8CC4
+5068 8FC5
+5069 96F6
+506A 6C50
+506B 8944
+506C 8F3F
+506D 7D5E
+506E 60E8
+506F 72FC
+5070 7D9C
+5071 8463
+5072 5CFB
+5073 5446
+5074 5D16
+5075 6CA1
+5076 81B3
+5077 58FA
+5078 5BB4
+5079 8108
+507A 541F
+507B 8CBC
+507C 6182
+507D 78A9
+507E 6FE1
+507F 91A4
+5080 76F2
+5081 6020
+5082 76FE
+5083 84C9
+5084 7F36
+5085 4EC7
+5086 755D
+5087 7A17
+5088 84EC
+5089 75F4
+508A 4F3A
+508B 676D
+508C 7460
+508D 62F3
+508E 6F20
+508F 79E4
+5090 87F9
+5091 6094
+5092 6234
+5093 66AB
+5094 820C
+5095 8499
+5096 723A
+5097 5FCC
+5098 6109
+5099 70CF
+509A 7261
+509B 7A50
+509C 5098
+509D 9AED
+509E 5D69
+509F 601C
+50A0 6667
+50A1 99B4
+50A2 5E7B
+50A3 643E
+50A4 5830
+50A5 53C9
+50A6 7A9F
+50A7 990C
+50A8 9B42
+50A9 8F5F
+50AA 7AAE
+50AB 5B9B
+50AC 68A2
+50AD 6249
+50AE 7984
+50AF 9DFA
+50B0 5451
+50B1 932F
+50B2 8AC4
+50B3 5F90
+50B4 8DF3
+50B5 5A2F
+50B6 80DE
+50B7 6D29
+50B8 7A4F
+50B9 84BC
+50BA 9D2B
+50BB 9010
+50BC 6D38
+50BD 916A
+50BE 6FC1
+50BF 9905
+50C0 6BBB
+50C1 5EB6
+50C2 91B8
+50C3 5076
+50C4 6F0F
+50C5 4E19
+50C6 540F
+50C7 9675
+50C8 6C72
+50C9 51B4
+50CA 5631
+50CB 9F20
+50CC 66A6
+50CD 5F0A
+50CE 75AB
+50CF 51F8
+50D0 674F
+50D1 8DF5
+50D2 6C70
+50D3 8A6B
+50D4 757F
+50D5 5CAC
+50D6 6841
+50D7 8CD3
+50D8 9BDB
+50D9 8475
+50DA 6893
+50DB 840C
+50DC 72DB
+50DD 7577
+50DE 8568
+50DF 783A
+50E0 847A
+50E1 5F10
+50E2 831C
+50E3 6813
+50E4 6E1A
+50E5 9DAF
+50E6 51F9
+50E7 7980
+50E8 4E99
+50E9 5EE3
+50EA 908A
+50EB 80AF
+50EC 59A8
+50ED 77DB
+50EE 8D74
+50EF 8A1F
+50F0 673D
+50F1 533F
+50F2 8A0A
+50F3 5618
+50F4 6756
+50F5 53D9
+50F6 4F10
+50F7 7409
+50F8 5A41
+50F9 4FF8
+50FA 79B0
+50FB 9838
+50FC 8E2A
+50FD 9D60
+50FE 8F44
+5141 65A5
+5142 75BE
+5143 906D
+5144 867B
+5145 60BC
+5146 51B6
+5147 5937
+5148 7D2F
+5149 916C
+514A 69AE
+514B 7CE0
+514C 792A
+514D 5D14
+514E 64C1
+514F 58EC
+5150 589C
+5151 8D66
+5152 66D9
+5153 61F2
+5154 912D
+5155 6E58
+5156 9435
+5157 965B
+5158 7272
+5159 5F6A
+515A 5E9A
+515B 8F1B
+515C 5B95
+515D 5C39
+515E 9013
+515F 834F
+5160 7CCE
+5161 620A
+5162 90ED
+5163 691B
+5164 6E15
+5165 65DB
+5166 66FE
+5167 4E9F
+5168 55AA
+5169 7A83
+516A 83E9
+516B 8B83
+516C 846D
+516D 83F0
+516E 7F50
+516F 918D
+5170 9190
+5171 758E
+5172 95A5
+5173 81E7
+5174 75E2
+5175 61A9
+5176 8A50
+5177 95B2
+5178 53A8
+5179 59F6
+517A 9813
+517B 7891
+517C 7C17
+517D 6B3A
+517E 57E0
+517F 620E
+5180 83D6
+5181 8AD2
+5182 75D4
+5183 927E
+5184 59DC
+5185 5289
+5186 9087
+5187 6FFE
+5188 7473
+5189 5C09
+518A 9D6C
+518B 84FC
+518C 7CDF
+518D 7BAD
+518E 8A6E
+518F 594E
+5190 56A2
+5191 819A
+5192 7947
+5193 6636
+5194 53E1
+5195 7887
+5196 58CC
+5197 9397
+5198 6E13
+5199 5256
+519A 828B
+519B 9E9F
+519C 9583
+519D 658C
+519E 9E93
+519F 7345
+51A0 6E26
+51A1 9D07
+51A2 5983
+51A3 7DAC
+51A4 96C1
+51A5 61BE
+51A6 6762
+51A7 9ECE
+51A8 90A8
+51A9 9187
+51AA 9F0E
+51AB 7C38
+51AC 51F1
+51AD 8599
+51AE 524C
+51AF 540E
+51B0 7901
+51B1 655E
+51B2 6668
+51B3 5CE1
+51B4 7566
+51B5 76C8
+51B6 8679
+51B7 531D
+51B8 5506
+51B9 7926
+51BA 8912
+51BB 77EF
+51BC 7CC0
+51BD 570B
+51BE 515C
+51BF 7E8A
+51C0 535C
+51C1 8A60
+51C2 65A7
+51C3 8766
+51C4 5766
+51C5 6AE8
+51C6 87FB
+51C7 5E16
+51C8 7AEA
+51C9 8D73
+51CA 771E
+51CB 737A
+51CC 66E0
+51CD 9410
+51CE 816B
+51CF 7B08
+51D0 91FC
+51D1 5737
+51D2 6FE4
+51D3 856A
+51D4 7E55
+51D5 9957
+51D6 87BA
+51D7 694A
+51D8 818F
+51D9 5EFF
+51DA 891C
+51DB 72D0
+51DC 9846
+51DD 9EDB
+51DE 8D99
+51DF 5DD6
+51E0 62B9
+51E1 64AB
+51E2 4F76
+51E3 613F
+51E4 68AF
+51E5 5F14
+51E6 800C
+51E7 92F8
+51E8 7BC1
+51E9 52FE
+51EA 664F
+51EB 9177
+51EC 51F6
+51ED 97A0
+51EE 839E
+51EF 647A
+51F0 9C3A
+51F1 67F5
+51F2 7C4F
+51F3 685F
+51F4 9B6F
+51F5 9F4B
+51F6 7FFB
+51F7 9348
+51F8 4FF6
+51F9 9E92
+51FA 9197
+51FB 96DB
+51FC 5BE6
+51FD 6CCC
+51FE 7CFE
+5241 9453
+5242 6822
+5243 66B9
+5244 5BD4
+5245 98F4
+5246 8AE6
+5247 8154
+5248 7827
+5249 74BD
+524A 6ED3
+524B 9288
+524C 5A20
+524D 5B8B
+524E 86F8
+524F 760D
+5250 865C
+5251 6641
+5252 91C9
+5253 5589
+5254 7A4E
+5255 59E5
+5256 6042
+5257 932B
+5258 5B5A
+5259 849C
+525A 5C91
+525B 96CD
+525C 62D9
+525D 675C
+525E 6787
+525F 5E7D
+5260 8650
+5261 9EB9
+5262 5CB1
+5263 80CE
+5264 7A00
+5265 8ABC
+5266 5700
+5267 8096
+5268 7D72
+5269 9211
+526A 8098
+526B 907C
+526C 7761
+526D 8737
+526E 9075
+526F 817A
+5270 7C3E
+5271 6EA2
+5272 965E
+5273 7E90
+5274 72D7
+5275 58FD
+5276 60B3
+5277 9786
+5278 7E88
+5279 587E
+527A 6E20
+527B 84DC
+527C 6961
+527D 77AD
+527E 5197
+527F 652A
+5280 6777
+5281 5DCD
+5282 6101
+5283 932E
+5284 5954
+5285 6367
+5286 798D
+5287 7AFF
+5288 80D6
+5289 58B3
+528A 6168
+528B 6AC3
+528C 7483
+528D 9B92
+528E 660A
+528F 642D
+5290 5118
+5291 6763
+5292 809B
+5293 9C10
+5294 4FC9
+5295 6953
+5296 7A1C
+5297 52FF
+5298 6055
+5299 768E
+529A 817F
+529B 5642
+529C 5F6D
+529D 7194
+529E 70BB
+529F 7436
+52A0 8000
+52A1 874B
+52A2 55DA
+52A3 7435
+52A4 7690
+52A5 96EB
+52A6 66DD
+52A7 751C
+52A8 633D
+52A9 6EC9
+52AA 7C64
+52AB 7CA5
+52AC 6D35
+52AD 935C
+52AE 7027
+52AF 5E25
+52B0 701D
+52B1 54BD
+52B2 611A
+52B3 6973
+52B4 6C6A
+52B5 559A
+52B6 6D19
+52B7 96CC
+52B8 5BE1
+52B9 59FB
+52BA 697C
+52BB 914C
+52BC 7709
+52BD 8500
+52BE 7A46
+52BF 7872
+52C0 92E4
+52C1 8CED
+52C2 7CFA
+52C3 9D1B
+52C4 814E
+52C5 9AC4
+52C6 68A0
+52C7 6DCB
+52C8 5918
+52C9 83B1
+52CA 5629
+52CB 9B41
+52CC 6897
+52CD 70B3
+52CE 9771
+52CF 9419
+52D0 67A2
+52D1 6802
+52D2 7895
+52D3 68A7
+52D4 50D6
+52D5 80B1
+52D6 5EF8
+52D7 82D4
+52D8 797A
+52D9 67CA
+52DA 7E4D
+52DB 69CD
+52DC 51C4
+52DD 723D
+52DE 6829
+52DF 99B3
+52E0 5F3C
+52E1 8F61
+52E2 682B
+52E3 6155
+52E4 6591
+52E5 8FB1
+52E6 7E1B
+52E7 9798
+52E8 9952
+52E9 8877
+52EA 5B2C
+52EB 6631
+52EC 4FA0
+52ED 6939
+52EE 6AFB
+52EF 5BB5
+52F0 7AC8
+52F1 5026
+52F2 5944
+52F3 9059
+52F4 7B25
+52F5 7B4F
+52F6 8E74
+52F7 8543
+52F8 5858
+52F9 8B0E
+52FA 5039
+52FB 8654
+52FC 97F6
+52FD 7569
+52FE 72F8
+5341 4EF7
+5342 9D89
+5343 5016
+5344 51CC
+5345 62CC
+5346 91C6
+5347 8755
+5348 649A
+5349 88F4
+534A 91E6
+534B 6854
+534C 695A
+534D 6C40
+534E 7B6C
+534F 6741
+5350 77D7
+5351 8823
+5352 5384
+5353 8EAF
+5354 7280
+5355 8C6B
+5356 788D
+5357 7165
+5358 8207
+5359 68B1
+535A 8D04
+535B 9077
+535C 701E
+535D 8FE6
+535E 810A
+535F 81BF
+5360 89DC
+5361 68B3
+5362 6ADF
+5363 92EA
+5364 95C7
+5365 7957
+5366 7A20
+5367 53A9
+5368 8E5F
+5369 786F
+536A 79B9
+536B 5F27
+536C 5ED6
+536D 6853
+536E 93AC
+536F 919C
+5370 691A
+5371 5806
+5372 64B0
+5373 7E4B
+5374 7D8F
+5375 68F2
+5376 6EA5
+5377 82DB
+5378 9192
+5379 5243
+537A 8EB0
+537B 9081
+537C 721B
+537D 7DCB
+537E 7656
+537F 59AC
+5380 6FE0
+5381 8B28
+5382 80A2
+5383 5544
+5384 6070
+5385 5F4A
+5386 68C8
+5387 633A
+5388 9438
+5389 9B4F
+538A 81E5
+538B 6A17
+538C 70DD
+538D 69A7
+538E 614C
+538F 920E
+5390 9310
+5391 9BAD
+5392 52D7
+5393 925E
+5394 92F9
+5395 5993
+5396 7696
+5397 66FB
+5398 5769
+5399 73CA
+539A 7678
+539B 6A1F
+539C 7E9C
+539D 9811
+539E 8CD1
+539F 5840
+53A0 6349
+53A1 871C
+53A2 62D0
+53A3 60B4
+53A4 6B89
+53A5 86EE
+53A6 5764
+53A7 581D
+53A8 8549
+53A9 7235
+53AA 7652
+53AB 983B
+53AC 8237
+53AD 5351
+53AE 5C24
+53AF 59BE
+53B0 5815
+53B1 901D
+53B2 69B4
+53B3 834A
+53B4 9EA9
+53B5 976B
+53B6 8086
+53B7 53AD
+53B8 6068
+53B9 4FAE
+53BA 76C3
+53BB 6A05
+53BC 689B
+53BD 937E
+53BE 99D5
+53BF 91C7
+53C0 5C16
+53C1 585E
+53C2 61A7
+53C3 9699
+53C4 4FDF
+53C5 8278
+53C6 9C52
+53C7 5F45
+53C8 6108
+53C9 7C8D
+53CA 806F
+53CB 5DF7
+53CC 8D6B
+53CD 57B0
+53CE 98E2
+53CF 5703
+53D0 79BF
+53D1 5996
+53D2 7941
+53D3 540A
+53D4 83DF
+53D5 9C39
+53D6 52D2
+53D7 6BD8
+53D8 86CB
+53D9 4EC0
+53DA 9A28
+53DB 5366
+53DC 8006
+53DD 7337
+53DE 6492
+53DF 8FED
+53E0 5AC9
+53E1 5420
+53E2 537F
+53E3 4FAF
+53E4 807E
+53E5 543B
+53E6 7515
+53E7 7B18
+53E8 8749
+53E9 54B3
+53EA 704C
+53EB 8997
+53EC 6CAB
+53ED 85FA
+53EE 7114
+53EF 696E
+53F0 9328
+53F1 745A
+53F2 59D1
+53F3 6E5B
+53F4 617E
+53F5 53E2
+53F6 8317
+53F7 76E7
+53F8 848B
+53F9 85AF
+53FA 6925
+53FB 5C60
+53FC 7259
+53FD 75D5
+53FE 8B90
+5441 6E07
+5442 82AD
+5443 5C4F
+5444 7BED
+5445 9784
+5446 6F70
+5447 764C
+5448 88B7
+5449 92D2
+544A 4F36
+544B 5EFE
+544C 9061
+544D 88E1
+544E 8471
+544F 711A
+5450 6D1B
+5451 80B4
+5452 74E2
+5453 7433
+5454 5A7F
+5455 905C
+5456 980C
+5457 5319
+5458 906E
+5459 6BB4
+545A 85AA
+545B 7897
+545C 7AFA
+545D 6AAE
+545E 8910
+545F 958F
+5460 620C
+5461 4F3D
+5462 4F7C
+5463 79BE
+5464 9D0E
+5465 4ED4
+5466 57A2
+5467 51A5
+5468 6900
+5469 6089
+546A 707C
+546B 7AE3
+546C 8956
+546D 93A7
+546E 9C2D
+546F 5112
+5470 52FA
+5471 7CCA
+5472 60F9
+5473 7078
+5474 81C6
+5475 559D
+5476 6991
+5477 96C9
+5478 553E
+5479 805A
+547A 8304
+547B 8332
+547C 54FA
+547D 565B
+547E 8FBF
+547F 5634
+5480 6760
+5481 5265
+5482 840E
+5483 5E5F
+5484 7B65
+5485 9035
+5486 8387
+5487 6B4E
+5488 58BE
+5489 6309
+548A 727D
+548B 97AD
+548C 69D0
+548D 546A
+548E 984E
+548F 632B
+5490 714E
+5491 8557
+5492 7CDE
+5493 6372
+5494 68F9
+5495 7511
+5496 8602
+5497 6EBA
+5498 5A3C
+5499 7A84
+549A 851A
+549B 95A4
+549C 59D0
+549D 60DA
+549E 51EA
+549F 5A29
+54A0 7169
+54A1 6F15
+54A2 696B
+54A3 63BB
+54A4 75E9
+54A5 4E4E
+54A6 7DBB
+54A7 6934
+54A8 8521
+54A9 8FFA
+54AA 9354
+54AB 9C3B
+54AC 5F17
+54AD 5ED3
+54AE 8258
+54AF 895F
+54B0 82E7
+54B1 52C3
+54B2 5C51
+54B3 83AB
+54B4 7826
+54B5 79E1
+54B6 7FF0
+54B7 626E
+54B8 60F0
+54B9 5CA8
+54BA 6F97
+54BB 71A8
+54BC 9909
+54BD 5132
+54BE 5E37
+54BF 5F04
+54C0 637B
+54C1 6753
+54C2 68D7
+54C3 6652
+54C4 9CF6
+54C5 88B0
+54C6 52AB
+54C7 4FC4
+54C8 4E3C
+54C9 67B3
+54CA 7BAA
+54CB 7F4D
+54CC 8A23
+54CD 63B4
+54CE 71E6
+54CF 65A4
+54D0 6F09
+54D1 853D
+54D2 5072
+54D3 7DBA
+54D4 5516
+54D5 7B04
+54D6 72FD
+54D7 6CD3
+54D8 8422
+54D9 621F
+54DA 50AD
+54DB 8235
+54DC 8718
+54DD 5919
+54DE 6028
+54DF 677C
+54E0 6F23
+54E1 75B9
+54E2 695C
+54E3 520E
+54E4 8018
+54E5 8B01
+54E6 71ED
+54E7 5713
+54E8 660F
+54E9 83EB
+54EA 7164
+54EB 7D9B
+54EC 5617
+54ED 7D7D
+54EE 8F4D
+54EF 9318
+54F0 8569
+54F1 5D17
+54F2 678C
+54F3 67DE
+54F4 87C7
+54F5 79AE
+54F6 5835
+54F7 8404
+54F8 9041
+54F9 7FD4
+54FA 6E8C
+54FB 8A63
+54FC 9D08
+54FD 670F
+54FE 939A
+5541 63AC
+5542 602F
+5543 64E2
+5544 608D
+5545 96B7
+5546 6357
+5547 8461
+5548 914B
+5549 75D8
+554A 60E7
+554B 9913
+554C 9C57
+554D 5984
+554E 6DEB
+554F 5E96
+5550 6D9C
+5551 9BF0
+5552 58BB
+5553 7977
+5554 60B6
+5555 633F
+5556 5BF5
+5557 9812
+5558 558B
+5559 82D3
+555A 5147
+555B 6190
+555C 7953
+555D 79BD
+555E 6C5D
+555F 9EBA
+5560 9C48
+5561 8DA8
+5562 5EE0
+5563 7D43
+5564 5EFC
+5565 854E
+5566 8CE4
+5567 5AE1
+5568 54E8
+5569 5023
+556A 52BE
+556B 7DEC
+556C 8511
+556D 6666
+556E 6C3E
+556F 724C
+5570 8ADC
+5571 9C0D
+5572 77A5
+5573 8B02
+5574 8D05
+5575 6F11
+5576 9834
+5577 97FB
+5578 50FB
+5579 7F75
+557A 5A03
+557B 8513
+557C 4FB6
+557D 634C
+557E 9D61
+557F 808B
+5580 5294
+5581 65A1
+5582 567A
+5583 5957
+5584 8D0B
+5585 6A35
+5586 6AD3
+5587 70F9
+5588 865E
+5589 6FB1
+558A 51E7
+558B 7FEB
+558C 59EA
+558D 5E87
+558E 6B6A
+558F 754F
+5590 717D
+5591 914E
+5592 7D2C
+5593 8C79
+5594 6062
+5595 621A
+5596 7FA8
+5597 5F1B
+5598 6C8C
+5599 86FE
+559A 7562
+559B 7B86
+559C 9AB8
+559D 6627
+559E 7ABA
+559F 844E
+55A0 6F81
+55A1 8B2C
+55A2 86A4
+55A3 6FEB
+55A4 7B8B
+55A5 7F77
+55A6 8F2F
+55A7 8E44
+55A8 7E23
+55A9 4E4D
+55AA 79A6
+55AB 8AFA
+55AC 903C
+55AD 50D1
+55AE 9ECD
+55AF 5EDF
+55B0 758F
+55B1 631F
+55B2 53DB
+55B3 9910
+55B4 826E
+55B5 62F7
+55B6 68FA
+55B7 725D
+55B8 803D
+55B9 58D5
+55BA 5C4D
+55BB 86D9
+55BC 540B
+55BD 8805
+55BE 92F2
+55BF 9237
+55C0 5C61
+55C1 985B
+55C2 86E4
+55C3 966A
+55C4 7262
+55C5 6955
+55C6 6CD7
+55C7 6994
+55C8 9C2F
+55C9 77E7
+55CA 68C9
+55CB 8DE8
+55CC 6D6C
+55CD 67C1
+55CE 9BAA
+55CF 619A
+55D0 63A9
+55D1 7015
+55D2 9306
+55D3 934D
+55D4 6A61
+55D5 6258
+55D6 5283
+55D7 7525
+55D8 5687
+55D9 6C83
+55DA 6834
+55DB 649E
+55DC 4E9B
+55DD 7252
+55DE 59E6
+55DF 8FC2
+55E0 5FBD
+55E1 6DD8
+55E2 85F7
+55E3 8A51
+55E4 9817
+55E5 99C1
+55E6 63A0
+55E7 7C81
+55E8 5B30
+55E9 8139
+55EA 5403
+55EB 7E82
+55EC 8106
+55ED 532A
+55EE 6A8E
+55EF 7F6B
+55F0 54E9
+55F1 5678
+55F2 8AB9
+55F3 6715
+55F4 5BD3
+55F5 6478
+55F6 64FE
+55F7 6B1D
+55F8 8CC2
+55F9 51CB
+55FA 7E8F
+5641 5F0C
+5642 4E10
+5643 4E15
+5644 4E28
+5645 4E2A
+5646 4E31
+5647 4E36
+5648 4E3F
+5649 4E42
+564A 4E56
+564B 4E58
+564C 4E62
+564D 4E82
+564E 4E85
+564F 4E8A
+5650 4E8E
+5651 5F0D
+5652 4E9E
+5653 4EA0
+5654 4EA2
+5655 4EB0
+5656 4EB3
+5657 4EB6
+5658 4ECE
+5659 4ECD
+565A 4EC4
+565B 4EC6
+565C 4EC2
+565D 4EE1
+565E 4ED7
+565F 4EDE
+5660 4EED
+5661 4EDF
+5662 4EFC
+5663 4F09
+5664 4F1C
+5665 4F00
+5666 4F03
+5667 4F5A
+5668 4F30
+5669 4F5D
+566A 4F39
+566B 4F57
+566C 4F47
+566D 4F5E
+566E 4F56
+566F 4F5B
+5670 4F92
+5671 4F8A
+5672 4F88
+5673 4F8F
+5674 4F9A
+5675 4FAD
+5676 4F98
+5677 4F7B
+5678 4FAB
+5679 4F69
+567A 4F70
+567B 4F94
+567C 4F6F
+567D 4F86
+567E 4F96
+567F 4FD4
+5680 4FCE
+5681 4FD8
+5682 4FDB
+5683 4FD1
+5684 4FDA
+5685 4FD0
+5686 4FCD
+5687 4FE4
+5688 4FE5
+5689 501A
+568A 5040
+568B 5028
+568C 5014
+568D 502A
+568E 5025
+568F 5005
+5690 5021
+5691 5022
+5692 5029
+5693 502C
+5694 4FFF
+5695 4FFE
+5696 4FEF
+5697 5011
+5698 501E
+5699 5006
+569A 5043
+569B 5047
+569C 5055
+569D 5050
+569E 5048
+569F 505A
+56A0 5056
+56A1 500F
+56A2 5046
+56A3 5070
+56A4 5042
+56A5 506C
+56A6 5078
+56A7 5080
+56A8 5094
+56A9 509A
+56AA 5085
+56AB 50B4
+56AC 6703
+56AD 50B2
+56AE 50C9
+56AF 50CA
+56B0 50B3
+56B1 50C2
+56B2 50F4
+56B3 50DE
+56B4 50E5
+56B5 50D8
+56B6 50ED
+56B7 50E3
+56B8 50EE
+56B9 50F9
+56BA 50F5
+56BB 5109
+56BC 5101
+56BD 5102
+56BE 511A
+56BF 5115
+56C0 5114
+56C1 5116
+56C2 5121
+56C3 513A
+56C4 5137
+56C5 513C
+56C6 513B
+56C7 513F
+56C8 5140
+56C9 514A
+56CA 514C
+56CB 5152
+56CC 5154
+56CD 5162
+56CE 5164
+56CF 5169
+56D0 516A
+56D1 516E
+56D2 5180
+56D3 5182
+56D4 56D8
+56D5 518C
+56D6 5189
+56D7 518F
+56D8 5191
+56D9 5193
+56DA 5195
+56DB 5196
+56DC 519D
+56DD 51A4
+56DE 51A6
+56DF 51A2
+56E0 51A9
+56E1 51AA
+56E2 51AB
+56E3 51B3
+56E4 51B1
+56E5 51B2
+56E6 51B0
+56E7 51B5
+56E8 51BE
+56E9 51BD
+56EA 51C5
+56EB 51C9
+56EC 51DB
+56ED 51E0
+56EE 51E9
+56EF 51EC
+56F0 51ED
+56F1 51F0
+56F2 51F5
+56F3 51FE
+56F4 5204
+56F5 520B
+56F6 5214
+56F7 5215
+56F8 5227
+56F9 522A
+56FA 522E
+56FB 5233
+56FC 5239
+56FD 5244
+56FE 524B
+5741 524F
+5742 525E
+5743 5254
+5744 5271
+5745 526A
+5746 5273
+5747 5274
+5748 5269
+5749 527F
+574A 527D
+574B 528D
+574C 5288
+574D 5292
+574E 5291
+574F 529C
+5750 52A6
+5751 52AC
+5752 52AD
+5753 52BC
+5754 52B5
+5755 52C1
+5756 52C0
+5757 52CD
+5758 52DB
+5759 52DE
+575A 52E3
+575B 52E6
+575C 52E0
+575D 52F3
+575E 52F5
+575F 52F8
+5760 52F9
+5761 5300
+5762 5306
+5763 5307
+5764 5308
+5765 7538
+5766 530D
+5767 5310
+5768 530F
+5769 5315
+576A 531A
+576B 5324
+576C 5323
+576D 532F
+576E 5331
+576F 5333
+5770 5338
+5771 5340
+5772 5345
+5773 5346
+5774 5349
+5775 4E17
+5776 534D
+5777 51D6
+5778 8209
+5779 535E
+577A 5369
+577B 536E
+577C 5372
+577D 5377
+577E 537B
+577F 5382
+5780 5393
+5781 5396
+5782 53A0
+5783 53A6
+5784 53A5
+5785 53AE
+5786 53B0
+5787 53B2
+5788 53B6
+5789 53C3
+578A 7C12
+578B 53DD
+578C 53DF
+578D 66FC
+578E FA0E
+578F 71EE
+5790 53EE
+5791 53E8
+5792 53ED
+5793 53FA
+5794 5401
+5795 543D
+5796 5440
+5797 542C
+5798 542D
+5799 543C
+579A 542E
+579B 5436
+579C 5429
+579D 541D
+579E 544E
+579F 548F
+57A0 5475
+57A1 548E
+57A2 545F
+57A3 5471
+57A4 5477
+57A5 5470
+57A6 5492
+57A7 547B
+57A8 5480
+57A9 549C
+57AA 5476
+57AB 5484
+57AC 5490
+57AD 5486
+57AE 548A
+57AF 54C7
+57B0 54BC
+57B1 54AF
+57B2 54A2
+57B3 54B8
+57B4 54A5
+57B5 54AC
+57B6 54C4
+57B7 54D8
+57B8 54C8
+57B9 54A8
+57BA 54AB
+57BB 54C2
+57BC 54A4
+57BD 54A9
+57BE 54BE
+57BF 54E5
+57C0 54FF
+57C1 54E6
+57C2 550F
+57C3 5514
+57C4 54FD
+57C5 54EE
+57C6 54ED
+57C7 54E2
+57C8 5539
+57C9 5540
+57CA 5563
+57CB 554C
+57CC 552E
+57CD 555C
+57CE 5545
+57CF 5556
+57D0 5557
+57D1 5538
+57D2 5533
+57D3 555D
+57D4 5599
+57D5 5580
+57D6 558A
+57D7 559F
+57D8 557B
+57D9 557E
+57DA 5598
+57DB 559E
+57DC 55AE
+57DD 557C
+57DE 5586
+57DF 5583
+57E0 55A9
+57E1 5587
+57E2 55A8
+57E3 55C5
+57E4 55DF
+57E5 55C4
+57E6 55DC
+57E7 55E4
+57E8 55D4
+57E9 55F9
+57EA 5614
+57EB 55F7
+57EC 5616
+57ED 55FE
+57EE 55FD
+57EF 561B
+57F0 564E
+57F1 5650
+57F2 5636
+57F3 5632
+57F4 5638
+57F5 566B
+57F6 5664
+57F7 5686
+57F8 562F
+57F9 566C
+57FA 566A
+57FB 71DF
+57FC 5694
+57FD 568F
+57FE 5680
+5841 568A
+5842 56A0
+5843 56A5
+5844 56AE
+5845 56B6
+5846 56B4
+5847 56C8
+5848 56C2
+5849 56BC
+584A 56C1
+584B 56C3
+584C 56C0
+584D 56CE
+584E 56D3
+584F 56D1
+5850 56D7
+5851 56EE
+5852 56F9
+5853 56FF
+5854 5704
+5855 5709
+5856 5708
+5857 570D
+5858 55C7
+5859 5718
+585A 5716
+585B 571C
+585C 5726
+585D 5738
+585E 574E
+585F 573B
+5860 5759
+5861 5740
+5862 574F
+5863 5765
+5864 5788
+5865 5761
+5866 577F
+5867 5789
+5868 5793
+5869 57A0
+586A 57A4
+586B 57B3
+586C 57AC
+586D 57AA
+586E 57C3
+586F 57C6
+5870 57C8
+5871 57C0
+5872 57D4
+5873 57C7
+5874 57D2
+5875 57D3
+5876 57D6
+5877 FA0F
+5878 580A
+5879 57E3
+587A 580B
+587B 5819
+587C 5821
+587D 584B
+587E 5862
+587F 6BC0
+5880 583D
+5881 5852
+5882 FA10
+5883 5870
+5884 5879
+5885 5885
+5886 5872
+5887 589F
+5888 58AB
+5889 58B8
+588A 589E
+588B 58AE
+588C 58B2
+588D 58B9
+588E 58BA
+588F 58C5
+5890 58D3
+5891 58D1
+5892 58D7
+5893 58D9
+5894 58D8
+5895 58DE
+5896 58DC
+5897 58DF
+5898 58E4
+5899 58E5
+589A 58EF
+589B 58F7
+589C 58F9
+589D 58FB
+589E 58FC
+589F 5902
+58A0 590A
+58A1 590B
+58A2 5910
+58A3 591B
+58A4 68A6
+58A5 5925
+58A6 592C
+58A7 592D
+58A8 5932
+58A9 5938
+58AA 593E
+58AB 5955
+58AC 5950
+58AD 5953
+58AE 595A
+58AF 5958
+58B0 595B
+58B1 595D
+58B2 5963
+58B3 5962
+58B4 5960
+58B5 5967
+58B6 596C
+58B7 5969
+58B8 5978
+58B9 5981
+58BA 598D
+58BB 599B
+58BC 599D
+58BD 59A3
+58BE 59A4
+58BF 59B2
+58C0 59BA
+58C1 59C6
+58C2 59E8
+58C3 59D9
+58C4 59DA
+58C5 5A25
+58C6 5A1F
+58C7 5A11
+58C8 5A1C
+58C9 5A1A
+58CA 5A09
+58CB 5A40
+58CC 5A6C
+58CD 5A49
+58CE 5A35
+58CF 5A36
+58D0 5A62
+58D1 5A6A
+58D2 5A9A
+58D3 5ABC
+58D4 5ABE
+58D5 5AD0
+58D6 5ACB
+58D7 5AC2
+58D8 5ABD
+58D9 5AE3
+58DA 5AD7
+58DB 5AE6
+58DC 5AE9
+58DD 5AD6
+58DE 5AFA
+58DF 5AFB
+58E0 5B0C
+58E1 5B0B
+58E2 5B16
+58E3 5B32
+58E4 5B2A
+58E5 5B36
+58E6 5B3E
+58E7 5B43
+58E8 5B45
+58E9 5B40
+58EA 5B51
+58EB 5B55
+58EC 5B56
+58ED 6588
+58EE 5B5B
+58EF 5B65
+58F0 5B69
+58F1 5B70
+58F2 5B73
+58F3 5B75
+58F4 5B78
+58F5 5B7A
+58F6 5B80
+58F7 5B83
+58F8 5BA6
+58F9 5BB8
+58FA 5BC3
+58FB 5BC7
+58FC 5BC0
+58FD 5BC9
+58FE 752F
+5941 5BD0
+5942 5BD8
+5943 5BDE
+5944 5BEC
+5945 5BE4
+5946 5BE2
+5947 5BE5
+5948 5BEB
+5949 5BF0
+594A 5BF3
+594B 5BF6
+594C 5C05
+594D 5C07
+594E 5C08
+594F 5C0D
+5950 5C13
+5951 5C1E
+5952 5C20
+5953 5C22
+5954 5C28
+5955 5C38
+5956 5C41
+5957 5C46
+5958 5C4E
+5959 5C53
+595A 5C50
+595B 5B71
+595C 5C6C
+595D 5C6E
+595E 5C76
+595F 5C79
+5960 5C8C
+5961 5C94
+5962 5CBE
+5963 5CAB
+5964 5CBB
+5965 5CB6
+5966 5CB7
+5967 5CA6
+5968 5CBA
+5969 5CC5
+596A 5CBC
+596B 5CC7
+596C 5CD9
+596D 5CE9
+596E 5CFD
+596F 5CFA
+5970 5CF5
+5971 5CED
+5972 5CEA
+5973 5D0B
+5974 5D15
+5975 5D1F
+5976 5D1B
+5977 5D11
+5978 5D27
+5979 5D22
+597A 5D1A
+597B 5D19
+597C 5D18
+597D 5D4C
+597E 5D52
+597F 5D53
+5980 FA11
+5981 5D5C
+5982 5D4E
+5983 5D4B
+5984 5D42
+5985 5D6C
+5986 5D73
+5987 5D6D
+5988 5D76
+5989 5D87
+598A 5D84
+598B 5D82
+598C 5D8C
+598D 5DA2
+598E 5D9D
+598F 5D90
+5990 5DAC
+5991 5DAE
+5992 5DB7
+5993 5DB8
+5994 5DBC
+5995 5DB9
+5996 5DC9
+5997 5DD0
+5998 5DD3
+5999 5DD2
+599A 5DDB
+599B 5DEB
+599C 5DF5
+599D 5E0B
+599E 5E1A
+599F 5E19
+59A0 5E11
+59A1 5E1B
+59A2 5E36
+59A3 5E44
+59A4 5E43
+59A5 5E40
+59A6 5E47
+59A7 5E4E
+59A8 5E57
+59A9 5E54
+59AA 5E62
+59AB 5E64
+59AC 5E75
+59AD 5E76
+59AE 5E7A
+59AF 5E7F
+59B0 5EA0
+59B1 5EC1
+59B2 5EC2
+59B3 5EC8
+59B4 5ED0
+59B5 5ECF
+59B6 5EDD
+59B7 5EDA
+59B8 5EDB
+59B9 5EE2
+59BA 5EE1
+59BB 5EE8
+59BC 5EE9
+59BD 5EEC
+59BE 5EF0
+59BF 5EF1
+59C0 5EF3
+59C1 5EF4
+59C2 5F03
+59C3 5F09
+59C4 5F0B
+59C5 5F11
+59C6 5F16
+59C7 5F21
+59C8 5F29
+59C9 5F2D
+59CA 5F2F
+59CB 5F34
+59CC 5F38
+59CD 5F41
+59CE 5F48
+59CF 5F4C
+59D0 5F4E
+59D1 5F51
+59D2 5F56
+59D3 5F57
+59D4 5F59
+59D5 5F5C
+59D6 5F5D
+59D7 5F61
+59D8 5F67
+59D9 5F73
+59DA 5F77
+59DB 5F83
+59DC 5F82
+59DD 5F7F
+59DE 5F8A
+59DF 5F88
+59E0 5F87
+59E1 5F91
+59E2 5F99
+59E3 5F9E
+59E4 5F98
+59E5 5FA0
+59E6 5FA8
+59E7 5FAD
+59E8 5FB7
+59E9 5FBC
+59EA 5FD6
+59EB 5FFB
+59EC 5FE4
+59ED 5FF8
+59EE 5FF1
+59EF 5FF0
+59F0 5FDD
+59F1 5FDE
+59F2 5FFF
+59F3 6021
+59F4 6019
+59F5 6010
+59F6 6029
+59F7 600E
+59F8 6031
+59F9 601B
+59FA 6015
+59FB 602B
+59FC 6026
+59FD 600F
+59FE 603A
+5A41 605A
+5A42 6041
+5A43 6060
+5A44 605D
+5A45 606A
+5A46 6077
+5A47 605F
+5A48 604A
+5A49 6046
+5A4A 604D
+5A4B 6063
+5A4C 6043
+5A4D 6064
+5A4E 606C
+5A4F 606B
+5A50 6059
+5A51 6085
+5A52 6081
+5A53 6083
+5A54 609A
+5A55 6084
+5A56 609B
+5A57 608A
+5A58 6096
+5A59 6097
+5A5A 6092
+5A5B 60A7
+5A5C 608B
+5A5D 60E1
+5A5E 60B8
+5A5F 60DE
+5A60 60E0
+5A61 60D3
+5A62 60BD
+5A63 60C6
+5A64 60B5
+5A65 60D5
+5A66 60D8
+5A67 6120
+5A68 60F2
+5A69 6115
+5A6A 6106
+5A6B 60F6
+5A6C 60F7
+5A6D 6100
+5A6E 60F4
+5A6F 60FA
+5A70 6103
+5A71 6121
+5A72 60FB
+5A73 60F1
+5A74 610D
+5A75 610E
+5A76 6111
+5A77 6147
+5A78 614D
+5A79 6137
+5A7A 6128
+5A7B 6127
+5A7C 613E
+5A7D 614A
+5A7E 6130
+5A7F 613C
+5A80 612C
+5A81 6134
+5A82 6165
+5A83 615D
+5A84 613D
+5A85 6142
+5A86 6144
+5A87 6173
+5A88 6187
+5A89 6177
+5A8A 6158
+5A8B 6159
+5A8C 615A
+5A8D 616B
+5A8E 6174
+5A8F 616F
+5A90 6171
+5A91 615F
+5A92 6153
+5A93 6175
+5A94 6198
+5A95 6199
+5A96 6196
+5A97 61AC
+5A98 6194
+5A99 618A
+5A9A 6191
+5A9B 61AB
+5A9C 61AE
+5A9D 61CC
+5A9E 61CA
+5A9F 61C9
+5AA0 61C8
+5AA1 61C3
+5AA2 61C6
+5AA3 61BA
+5AA4 61CB
+5AA5 7F79
+5AA6 61CD
+5AA7 61E6
+5AA8 61E3
+5AA9 61F4
+5AAA 61F7
+5AAB 61F6
+5AAC 61FD
+5AAD 61FA
+5AAE 61FF
+5AAF 61FC
+5AB0 61FE
+5AB1 6200
+5AB2 6208
+5AB3 6209
+5AB4 620D
+5AB5 6213
+5AB6 6214
+5AB7 621B
+5AB8 621E
+5AB9 6221
+5ABA 622A
+5ABB 622E
+5ABC 6230
+5ABD 6232
+5ABE 6233
+5ABF 6241
+5AC0 624E
+5AC1 625E
+5AC2 6263
+5AC3 625B
+5AC4 6260
+5AC5 6268
+5AC6 627C
+5AC7 6282
+5AC8 6289
+5AC9 6292
+5ACA 627E
+5ACB 6293
+5ACC 6296
+5ACD 6283
+5ACE 6294
+5ACF 62D7
+5AD0 62D1
+5AD1 62BB
+5AD2 62CF
+5AD3 62AC
+5AD4 62C6
+5AD5 62C8
+5AD6 62DC
+5AD7 62D4
+5AD8 62CA
+5AD9 62C2
+5ADA 62A6
+5ADB 62C7
+5ADC 629B
+5ADD 62C9
+5ADE 630C
+5ADF 62EE
+5AE0 62F1
+5AE1 6327
+5AE2 6302
+5AE3 6308
+5AE4 62EF
+5AE5 62F5
+5AE6 62FF
+5AE7 6350
+5AE8 634D
+5AE9 633E
+5AEA 634F
+5AEB 6396
+5AEC 638E
+5AED 6380
+5AEE 63AB
+5AEF 6376
+5AF0 63A3
+5AF1 638F
+5AF2 6389
+5AF3 639F
+5AF4 636B
+5AF5 6369
+5AF6 63B5
+5AF7 63BE
+5AF8 63E9
+5AF9 63C0
+5AFA 63C6
+5AFB 63F5
+5AFC 63E3
+5AFD 63C9
+5AFE 63D2
+5B41 63F6
+5B42 63C4
+5B43 6434
+5B44 6406
+5B45 6413
+5B46 6426
+5B47 6436
+5B48 641C
+5B49 6417
+5B4A 6428
+5B4B 640F
+5B4C 6416
+5B4D 644E
+5B4E 6467
+5B4F 646F
+5B50 6460
+5B51 6476
+5B52 64B9
+5B53 649D
+5B54 64CE
+5B55 6495
+5B56 64BB
+5B57 6493
+5B58 64A5
+5B59 64A9
+5B5A 6488
+5B5B 64BC
+5B5C 64DA
+5B5D 64D2
+5B5E 64C5
+5B5F 64C7
+5B60 64D4
+5B61 64D8
+5B62 64C2
+5B63 64F1
+5B64 64E7
+5B65 64E0
+5B66 64E1
+5B67 64E3
+5B68 64EF
+5B69 64F4
+5B6A 64F6
+5B6B 64F2
+5B6C 64FA
+5B6D 6500
+5B6E 64FD
+5B6F 6518
+5B70 651C
+5B71 651D
+5B72 6505
+5B73 6524
+5B74 6523
+5B75 652B
+5B76 652C
+5B77 6534
+5B78 6535
+5B79 6537
+5B7A 6536
+5B7B 6538
+5B7C 754B
+5B7D 6548
+5B7E 654E
+5B7F 6556
+5B80 654D
+5B81 6558
+5B82 6555
+5B83 655D
+5B84 6572
+5B85 6578
+5B86 6582
+5B87 6583
+5B88 8B8A
+5B89 659B
+5B8A 659F
+5B8B 65AB
+5B8C 65B7
+5B8D 65C3
+5B8E 65C6
+5B8F 65C1
+5B90 65C4
+5B91 65CC
+5B92 65D2
+5B93 65D9
+5B94 65E1
+5B95 65E0
+5B96 65F1
+5B97 6600
+5B98 6615
+5B99 6602
+5B9A 6772
+5B9B 6603
+5B9C 65FB
+5B9D 6609
+5B9E 663F
+5B9F 6635
+5BA0 662E
+5BA1 661E
+5BA2 6634
+5BA3 661C
+5BA4 6624
+5BA5 6644
+5BA6 6649
+5BA7 6665
+5BA8 6657
+5BA9 665E
+5BAA 6664
+5BAB 6659
+5BAC 6662
+5BAD 665D
+5BAE FA12
+5BAF 6673
+5BB0 6670
+5BB1 6683
+5BB2 6688
+5BB3 6684
+5BB4 6699
+5BB5 6698
+5BB6 66A0
+5BB7 669D
+5BB8 66B2
+5BB9 66C4
+5BBA 66C1
+5BBB 66BF
+5BBC 66C9
+5BBD 66BE
+5BBE 66BC
+5BBF 66B8
+5BC0 66D6
+5BC1 66DA
+5BC2 66E6
+5BC3 66E9
+5BC4 66F0
+5BC5 66F5
+5BC6 66F7
+5BC7 66FA
+5BC8 670E
+5BC9 F929
+5BCA 6716
+5BCB 671E
+5BCC 7E22
+5BCD 6726
+5BCE 6727
+5BCF 9738
+5BD0 672E
+5BD1 673F
+5BD2 6736
+5BD3 6737
+5BD4 6738
+5BD5 6746
+5BD6 675E
+5BD7 6759
+5BD8 6766
+5BD9 6764
+5BDA 6789
+5BDB 6785
+5BDC 6770
+5BDD 67A9
+5BDE 676A
+5BDF 678B
+5BE0 6773
+5BE1 67A6
+5BE2 67A1
+5BE3 67BB
+5BE4 67B7
+5BE5 67EF
+5BE6 67B4
+5BE7 67EC
+5BE8 67E9
+5BE9 67B8
+5BEA 67E7
+5BEB 67E4
+5BEC 6852
+5BED 67DD
+5BEE 67E2
+5BEF 67EE
+5BF0 67C0
+5BF1 67CE
+5BF2 67B9
+5BF3 6801
+5BF4 67C6
+5BF5 681E
+5BF6 6846
+5BF7 684D
+5BF8 6840
+5BF9 6844
+5BFA 6832
+5BFB 684E
+5BFC 6863
+5BFD 6859
+5BFE 688D
+5C41 6877
+5C42 687F
+5C43 689F
+5C44 687E
+5C45 688F
+5C46 68AD
+5C47 6894
+5C48 6883
+5C49 68BC
+5C4A 68B9
+5C4B 6874
+5C4C 68B5
+5C4D 68BA
+5C4E 690F
+5C4F 6901
+5C50 68CA
+5C51 6908
+5C52 68D8
+5C53 6926
+5C54 68E1
+5C55 690C
+5C56 68CD
+5C57 68D4
+5C58 68E7
+5C59 68D5
+5C5A 6912
+5C5B 68EF
+5C5C 6904
+5C5D 68E3
+5C5E 68E0
+5C5F 68CF
+5C60 68C6
+5C61 6922
+5C62 692A
+5C63 6921
+5C64 6923
+5C65 6928
+5C66 FA13
+5C67 6979
+5C68 6977
+5C69 6936
+5C6A 6978
+5C6B 6954
+5C6C 696A
+5C6D 6974
+5C6E 6968
+5C6F 693D
+5C70 6959
+5C71 6930
+5C72 695E
+5C73 695D
+5C74 697E
+5C75 6981
+5C76 69B2
+5C77 69BF
+5C78 FA14
+5C79 6998
+5C7A 69C1
+5C7B 69D3
+5C7C 69BE
+5C7D 69CE
+5C7E 5BE8
+5C7F 69CA
+5C80 69B1
+5C81 69DD
+5C82 69BB
+5C83 69C3
+5C84 69A0
+5C85 699C
+5C86 6995
+5C87 69DE
+5C88 6A2E
+5C89 69E8
+5C8A 6A02
+5C8B 6A1B
+5C8C 69FF
+5C8D 69F9
+5C8E 69F2
+5C8F 69E7
+5C90 69E2
+5C91 6A1E
+5C92 69ED
+5C93 6A14
+5C94 69EB
+5C95 6A0A
+5C96 6A22
+5C97 6A12
+5C98 6A23
+5C99 6A13
+5C9A 6A30
+5C9B 6A6B
+5C9C 6A44
+5C9D 6A0C
+5C9E 6AA0
+5C9F 6A36
+5CA0 6A78
+5CA1 6A47
+5CA2 6A62
+5CA3 6A59
+5CA4 6A66
+5CA5 6A48
+5CA6 6A46
+5CA7 6A38
+5CA8 6A72
+5CA9 6A73
+5CAA 6A90
+5CAB 6A8D
+5CAC 6A84
+5CAD 6AA2
+5CAE 6AA3
+5CAF 6A7E
+5CB0 6A97
+5CB1 6AAC
+5CB2 6AAA
+5CB3 6ABB
+5CB4 6AC2
+5CB5 6AB8
+5CB6 6AB3
+5CB7 6AC1
+5CB8 6ADE
+5CB9 6AE2
+5CBA 6AD1
+5CBB 6ADA
+5CBC 6AE4
+5CBD 8616
+5CBE 8617
+5CBF 6AEA
+5CC0 6B05
+5CC1 6B0A
+5CC2 6AFA
+5CC3 6B12
+5CC4 6B16
+5CC5 6B1F
+5CC6 6B38
+5CC7 6B37
+5CC8 6B39
+5CC9 76DC
+5CCA 98EE
+5CCB 6B47
+5CCC 6B43
+5CCD 6B49
+5CCE 6B50
+5CCF 6B59
+5CD0 6B54
+5CD1 6B5B
+5CD2 6B5F
+5CD3 6B61
+5CD4 6B78
+5CD5 6B79
+5CD6 6B7F
+5CD7 6B80
+5CD8 6B84
+5CD9 6B83
+5CDA 6B8D
+5CDB 6B98
+5CDC 6B95
+5CDD 6B9E
+5CDE 6BA4
+5CDF 6BAA
+5CE0 6BAB
+5CE1 6BAF
+5CE2 6BB1
+5CE3 6BB2
+5CE4 6BB3
+5CE5 6BB7
+5CE6 6BBC
+5CE7 6BC6
+5CE8 6BCB
+5CE9 6BD3
+5CEA 6BD6
+5CEB 6BDF
+5CEC 6BEC
+5CED 6BEB
+5CEE 6BF3
+5CEF 6BEF
+5CF0 6C08
+5CF1 6C13
+5CF2 6C14
+5CF3 6C1B
+5CF4 6C24
+5CF5 6C23
+5CF6 6C3F
+5CF7 6C5E
+5CF8 6C55
+5CF9 6C5C
+5CFA 6C62
+5CFB 6C82
+5CFC 6C8D
+5CFD 6C86
+5CFE 6C6F
+5D41 6C9A
+5D42 6C81
+5D43 6C9B
+5D44 6C7E
+5D45 6C68
+5D46 6C73
+5D47 6C92
+5D48 6C90
+5D49 6CC4
+5D4A 6CF1
+5D4B 6CBD
+5D4C 6CC5
+5D4D 6CAE
+5D4E 6CDA
+5D4F 6CDD
+5D50 6CB1
+5D51 6CBE
+5D52 6CBA
+5D53 6CDB
+5D54 6CEF
+5D55 6CD9
+5D56 6CEA
+5D57 6D1F
+5D58 6D04
+5D59 6D36
+5D5A 6D2B
+5D5B 6D3D
+5D5C 6D33
+5D5D 6D12
+5D5E 6D0C
+5D5F 6D63
+5D60 6D87
+5D61 6D93
+5D62 6D6F
+5D63 6D64
+5D64 6D5A
+5D65 6D79
+5D66 6D59
+5D67 6D8E
+5D68 6D95
+5D69 6D9B
+5D6A 6D85
+5D6B 6D96
+5D6C 6DF9
+5D6D 6E0A
+5D6E 6E2E
+5D6F 6DB5
+5D70 6DE6
+5D71 6DC7
+5D72 6DAC
+5D73 6DB8
+5D74 6DCF
+5D75 6DC6
+5D76 6DEC
+5D77 6DDE
+5D78 6DCC
+5D79 6DE8
+5D7A 6DF8
+5D7B 6DD2
+5D7C 6DC5
+5D7D 6DFA
+5D7E 6DD9
+5D7F 6DF2
+5D80 6DFC
+5D81 6DE4
+5D82 6DD5
+5D83 6DEA
+5D84 6DEE
+5D85 6E2D
+5D86 6E6E
+5D87 6E19
+5D88 6E72
+5D89 6E5F
+5D8A 6E39
+5D8B 6E3E
+5D8C 6E23
+5D8D 6E6B
+5D8E 6E5C
+5D8F 6E2B
+5D90 6E76
+5D91 6E4D
+5D92 6E1F
+5D93 6E27
+5D94 6E43
+5D95 6E3C
+5D96 6E3A
+5D97 6E4E
+5D98 6E24
+5D99 6E1D
+5D9A 6E38
+5D9B 6E82
+5D9C 6EAA
+5D9D 6E98
+5D9E 6EB7
+5D9F 6EBD
+5DA0 6EAF
+5DA1 6EC4
+5DA2 6EB2
+5DA3 6ED4
+5DA4 6ED5
+5DA5 6E8F
+5DA6 6EBF
+5DA7 6EC2
+5DA8 6E9F
+5DA9 6F41
+5DAA 6F45
+5DAB 6EEC
+5DAC 6EF8
+5DAD 6EFE
+5DAE 6F3F
+5DAF 6EF2
+5DB0 6F31
+5DB1 6EEF
+5DB2 6F32
+5DB3 6ECC
+5DB4 6EFF
+5DB5 6F3E
+5DB6 6F13
+5DB7 6EF7
+5DB8 6F86
+5DB9 6F7A
+5DBA 6F78
+5DBB 6F80
+5DBC 6F6F
+5DBD 6F5B
+5DBE 6F6D
+5DBF 6F74
+5DC0 6F82
+5DC1 6F88
+5DC2 6F7C
+5DC3 6F58
+5DC4 6FC6
+5DC5 6F8E
+5DC6 6F91
+5DC7 6F66
+5DC8 6FB3
+5DC9 6FA3
+5DCA 6FB5
+5DCB 6FA1
+5DCC 6FB9
+5DCD 6FDB
+5DCE 6FAA
+5DCF 6FC2
+5DD0 6FDF
+5DD1 6FD5
+5DD2 6FEC
+5DD3 6FD8
+5DD4 6FD4
+5DD5 6FF5
+5DD6 6FEE
+5DD7 7005
+5DD8 7007
+5DD9 7009
+5DDA 700B
+5DDB 6FFA
+5DDC 7011
+5DDD 7001
+5DDE 700F
+5DDF 701B
+5DE0 701A
+5DE1 701F
+5DE2 6FF3
+5DE3 7028
+5DE4 7018
+5DE5 7030
+5DE6 703E
+5DE7 7032
+5DE8 7051
+5DE9 7063
+5DEA 7085
+5DEB 7099
+5DEC 70AF
+5DED 70AB
+5DEE 70AC
+5DEF 70B8
+5DF0 70AE
+5DF1 70DF
+5DF2 70CB
+5DF3 70D9
+5DF4 7109
+5DF5 710F
+5DF6 7104
+5DF7 70F1
+5DF8 70FD
+5DF9 711C
+5DFA 7119
+5DFB 715C
+5DFC 7146
+5DFD 7147
+5DFE 7166
+5E41 7162
+5E42 714C
+5E43 7156
+5E44 716C
+5E45 7188
+5E46 718F
+5E47 7184
+5E48 7195
+5E49 FA15
+5E4A 71AC
+5E4B 71C1
+5E4C 71B9
+5E4D 71BE
+5E4E 71D2
+5E4F 71E7
+5E50 71C9
+5E51 71D4
+5E52 71D7
+5E53 71CE
+5E54 71F5
+5E55 71E0
+5E56 71EC
+5E57 71FB
+5E58 71FC
+5E59 71F9
+5E5A 71FE
+5E5B 71FF
+5E5C 720D
+5E5D 7210
+5E5E 7228
+5E5F 722D
+5E60 722C
+5E61 7230
+5E62 7232
+5E63 723B
+5E64 723C
+5E65 723F
+5E66 7240
+5E67 7246
+5E68 724B
+5E69 7258
+5E6A 7274
+5E6B 727E
+5E6C 7281
+5E6D 7287
+5E6E 7282
+5E6F 7292
+5E70 7296
+5E71 72A2
+5E72 72A7
+5E73 72B1
+5E74 72B2
+5E75 72BE
+5E76 72C3
+5E77 72C6
+5E78 72C4
+5E79 72B9
+5E7A 72CE
+5E7B 72D2
+5E7C 72E2
+5E7D 72E0
+5E7E 72E1
+5E7F 72F9
+5E80 72F7
+5E81 7317
+5E82 730A
+5E83 731C
+5E84 7316
+5E85 731D
+5E86 7324
+5E87 7334
+5E88 7329
+5E89 732F
+5E8A FA16
+5E8B 7325
+5E8C 733E
+5E8D 734F
+5E8E 734E
+5E8F 7357
+5E90 9ED8
+5E91 736A
+5E92 7368
+5E93 7370
+5E94 7377
+5E95 7378
+5E96 7375
+5E97 737B
+5E98 73C8
+5E99 73BD
+5E9A 73B3
+5E9B 73CE
+5E9C 73BB
+5E9D 73C0
+5E9E 73C9
+5E9F 73D6
+5EA0 73E5
+5EA1 73E3
+5EA2 73D2
+5EA3 73EE
+5EA4 73F1
+5EA5 73DE
+5EA6 73F8
+5EA7 7407
+5EA8 73F5
+5EA9 7405
+5EAA 7426
+5EAB 742A
+5EAC 7425
+5EAD 7429
+5EAE 742E
+5EAF 7432
+5EB0 743A
+5EB1 7455
+5EB2 743F
+5EB3 745F
+5EB4 7459
+5EB5 7441
+5EB6 745C
+5EB7 7469
+5EB8 7470
+5EB9 7463
+5EBA 746A
+5EBB 7464
+5EBC 7462
+5EBD 7489
+5EBE 746F
+5EBF 747E
+5EC0 749F
+5EC1 749E
+5EC2 74A2
+5EC3 74A7
+5EC4 74CA
+5EC5 74CF
+5EC6 74D4
+5EC7 74E0
+5EC8 74E3
+5EC9 74E7
+5ECA 74E9
+5ECB 74EE
+5ECC 74F0
+5ECD 74F2
+5ECE 74F1
+5ECF 74F7
+5ED0 74F8
+5ED1 7501
+5ED2 7504
+5ED3 7503
+5ED4 7505
+5ED5 750D
+5ED6 750C
+5ED7 750E
+5ED8 7513
+5ED9 751E
+5EDA 7526
+5EDB 752C
+5EDC 753C
+5EDD 7544
+5EDE 754D
+5EDF 754A
+5EE0 7549
+5EE1 7546
+5EE2 755B
+5EE3 755A
+5EE4 7564
+5EE5 7567
+5EE6 756B
+5EE7 756F
+5EE8 7574
+5EE9 756D
+5EEA 7578
+5EEB 7576
+5EEC 7582
+5EED 7586
+5EEE 7587
+5EEF 758A
+5EF0 7589
+5EF1 7594
+5EF2 759A
+5EF3 759D
+5EF4 75A5
+5EF5 75A3
+5EF6 75C2
+5EF7 75B3
+5EF8 75C3
+5EF9 75B5
+5EFA 75BD
+5EFB 75B8
+5EFC 75BC
+5EFD 75B1
+5EFE 75CD
+5F41 75CA
+5F42 75D2
+5F43 75D9
+5F44 75E3
+5F45 75DE
+5F46 75FE
+5F47 75FF
+5F48 75FC
+5F49 7601
+5F4A 75F0
+5F4B 75FA
+5F4C 75F2
+5F4D 75F3
+5F4E 760B
+5F4F 7609
+5F50 761F
+5F51 7627
+5F52 7620
+5F53 7621
+5F54 7622
+5F55 7624
+5F56 7634
+5F57 7630
+5F58 763B
+5F59 7647
+5F5A 7648
+5F5B 7658
+5F5C 7646
+5F5D 765C
+5F5E 7661
+5F5F 7662
+5F60 7668
+5F61 7669
+5F62 7667
+5F63 766A
+5F64 766C
+5F65 7670
+5F66 7672
+5F67 7676
+5F68 767C
+5F69 7682
+5F6A 7680
+5F6B 7683
+5F6C 7688
+5F6D 768B
+5F6E 7699
+5F6F 769A
+5F70 769C
+5F71 769E
+5F72 769B
+5F73 76A6
+5F74 76B0
+5F75 76B4
+5F76 76B8
+5F77 76B9
+5F78 76BA
+5F79 76C2
+5F7A FA17
+5F7B 76CD
+5F7C 76D6
+5F7D 76D2
+5F7E 76DE
+5F7F 76E1
+5F80 76E5
+5F81 76EA
+5F82 862F
+5F83 76FB
+5F84 7708
+5F85 7707
+5F86 7704
+5F87 7724
+5F88 7729
+5F89 7725
+5F8A 7726
+5F8B 771B
+5F8C 7737
+5F8D 7738
+5F8E 7746
+5F8F 7747
+5F90 775A
+5F91 7768
+5F92 776B
+5F93 775B
+5F94 7765
+5F95 777F
+5F96 777E
+5F97 7779
+5F98 778E
+5F99 778B
+5F9A 7791
+5F9B 77A0
+5F9C 779E
+5F9D 77B0
+5F9E 77B6
+5F9F 77B9
+5FA0 77BF
+5FA1 77BC
+5FA2 77BD
+5FA3 77BB
+5FA4 77C7
+5FA5 77CD
+5FA6 77DA
+5FA7 77DC
+5FA8 77E3
+5FA9 77EE
+5FAA 52AF
+5FAB 77FC
+5FAC 780C
+5FAD 7812
+5FAE 7821
+5FAF 783F
+5FB0 7820
+5FB1 7845
+5FB2 784E
+5FB3 7864
+5FB4 7874
+5FB5 788E
+5FB6 787A
+5FB7 7886
+5FB8 789A
+5FB9 787C
+5FBA 788C
+5FBB 78A3
+5FBC 78B5
+5FBD 78AA
+5FBE 78AF
+5FBF 78D1
+5FC0 78C6
+5FC1 78CB
+5FC2 78D4
+5FC3 78BE
+5FC4 78BC
+5FC5 78C5
+5FC6 78CA
+5FC7 78EC
+5FC8 78E7
+5FC9 78DA
+5FCA 78FD
+5FCB 78F4
+5FCC 7907
+5FCD 7911
+5FCE 7919
+5FCF 792C
+5FD0 792B
+5FD1 7930
+5FD2 FA18
+5FD3 7940
+5FD4 7960
+5FD5 FA19
+5FD6 795F
+5FD7 795A
+5FD8 7955
+5FD9 FA1A
+5FDA 797F
+5FDB 798A
+5FDC 7994
+5FDD FA1B
+5FDE 799D
+5FDF 799B
+5FE0 79AA
+5FE1 79B3
+5FE2 79BA
+5FE3 79C9
+5FE4 79D5
+5FE5 79E7
+5FE6 79EC
+5FE7 79E3
+5FE8 7A08
+5FE9 7A0D
+5FEA 7A18
+5FEB 7A19
+5FEC 7A1F
+5FED 7A31
+5FEE 7A3E
+5FEF 7A37
+5FF0 7A3B
+5FF1 7A43
+5FF2 7A57
+5FF3 7A49
+5FF4 7A62
+5FF5 7A61
+5FF6 7A69
+5FF7 9F9D
+5FF8 7A70
+5FF9 7A79
+5FFA 7A7D
+5FFB 7A88
+5FFC 7A95
+5FFD 7A98
+5FFE 7A96
+6041 7A97
+6042 7AA9
+6043 7AB0
+6044 7AB6
+6045 9083
+6046 7AC3
+6047 7ABF
+6048 7AC5
+6049 7AC4
+604A 7AC7
+604B 7ACA
+604C 7ACD
+604D 7ACF
+604E 7AD2
+604F 7AD1
+6050 7AD5
+6051 7AD3
+6052 7AD9
+6053 7ADA
+6054 7ADD
+6055 7AE1
+6056 7AE2
+6057 7AE6
+6058 7AE7
+6059 FA1C
+605A 7AEB
+605B 7AED
+605C 7AF0
+605D 7AF8
+605E 7B02
+605F 7B0F
+6060 7B0B
+6061 7B0A
+6062 7B06
+6063 7B33
+6064 7B36
+6065 7B19
+6066 7B1E
+6067 7B35
+6068 7B28
+6069 7B50
+606A 7B4D
+606B 7B4C
+606C 7B45
+606D 7B5D
+606E 7B75
+606F 7B7A
+6070 7B74
+6071 7B70
+6072 7B71
+6073 7B6E
+6074 7B9D
+6075 7B98
+6076 7B9F
+6077 7B8D
+6078 7B9C
+6079 7B9A
+607A 7B92
+607B 7B8F
+607C 7B99
+607D 7BCF
+607E 7BCB
+607F 7BCC
+6080 7BB4
+6081 7BC6
+6082 7B9E
+6083 7BDD
+6084 7BE9
+6085 7BE6
+6086 7BF7
+6087 7BE5
+6088 7C14
+6089 7C00
+608A 7C13
+608B 7C07
+608C 7BF3
+608D 7C0D
+608E 7BF6
+608F 7C23
+6090 7C27
+6091 7C2A
+6092 7C1F
+6093 7C37
+6094 7C2B
+6095 7C3D
+6096 7C40
+6097 7C4C
+6098 7C43
+6099 7C56
+609A 7C50
+609B 7C58
+609C 7C5F
+609D 7C65
+609E 7C6C
+609F 7C75
+60A0 7C83
+60A1 7C90
+60A2 7CA4
+60A3 7CA2
+60A4 7CAB
+60A5 7CA1
+60A6 7CAD
+60A7 7CA8
+60A8 7CB3
+60A9 7CB2
+60AA 7CB1
+60AB 7CAE
+60AC 7CB9
+60AD FA1D
+60AE 7CBD
+60AF 7CC5
+60B0 7CC2
+60B1 7CD2
+60B2 7CE2
+60B3 7CD8
+60B4 7CDC
+60B5 7CEF
+60B6 7CF2
+60B7 7CF4
+60B8 7CF6
+60B9 7D06
+60BA 7D02
+60BB 7D1C
+60BC 7D15
+60BD 7D0A
+60BE 7D45
+60BF 7D4B
+60C0 7D2E
+60C1 7D32
+60C2 7D3F
+60C3 7D35
+60C4 7D48
+60C5 7D46
+60C6 7D5C
+60C7 7D73
+60C8 7D56
+60C9 7D4E
+60CA 7D68
+60CB 7D6E
+60CC 7D4F
+60CD 7D63
+60CE 7D93
+60CF 7D89
+60D0 7D5B
+60D1 7DAE
+60D2 7DA3
+60D3 7DB5
+60D4 7DB7
+60D5 7DC7
+60D6 7DBD
+60D7 7DAB
+60D8 7DA2
+60D9 7DAF
+60DA 7DA0
+60DB 7DB8
+60DC 7D9F
+60DD 7DB0
+60DE 7DD5
+60DF 7DD8
+60E0 7DDD
+60E1 7DD6
+60E2 7DE4
+60E3 7DDE
+60E4 7DFB
+60E5 7E0B
+60E6 7DF2
+60E7 7DE1
+60E8 7DDC
+60E9 7E05
+60EA 7E0A
+60EB 7E21
+60EC 7E12
+60ED 7E1F
+60EE 7E09
+60EF 7E3A
+60F0 7E46
+60F1 7E66
+60F2 7E31
+60F3 7E3D
+60F4 7E35
+60F5 7E3B
+60F6 7E39
+60F7 7E43
+60F8 7E37
+60F9 7E32
+60FA 7E5D
+60FB 7E56
+60FC 7E5E
+60FD 7E52
+60FE 7E59
+6141 7E5A
+6142 7E67
+6143 7E79
+6144 7E6A
+6145 7E69
+6146 7E7C
+6147 7E7B
+6148 7E7D
+6149 8FAE
+614A 7E7F
+614B 7E83
+614C 7E89
+614D 7E8E
+614E 7E8C
+614F 7E92
+6150 7E93
+6151 7E94
+6152 7E96
+6153 7E9B
+6154 7F38
+6155 7F3A
+6156 7F45
+6157 7F47
+6158 7F4C
+6159 7F4E
+615A 7F51
+615B 7F55
+615C 7F54
+615D 7F58
+615E 7F5F
+615F 7F60
+6160 7F68
+6161 7F67
+6162 7F69
+6163 7F78
+6164 7F82
+6165 7F86
+6166 7F83
+6167 7F87
+6168 7F88
+6169 7F8C
+616A 7F94
+616B 7F9E
+616C 7F9D
+616D 7F9A
+616E 7FA1
+616F 7FA3
+6170 7FAF
+6171 7FAE
+6172 7FB2
+6173 7FB9
+6174 7FB6
+6175 7FB8
+6176 8B71
+6177 FA1E
+6178 7FC5
+6179 7FC6
+617A 7FCA
+617B 7FD5
+617C 7FE1
+617D 7FE6
+617E 7FE9
+617F 7FF3
+6180 7FF9
+6181 8004
+6182 800B
+6183 8012
+6184 8019
+6185 801C
+6186 8021
+6187 8028
+6188 803F
+6189 803B
+618A 804A
+618B 8046
+618C 8052
+618D 8058
+618E 805F
+618F 8062
+6190 8068
+6191 8073
+6192 8072
+6193 8070
+6194 8076
+6195 8079
+6196 807D
+6197 807F
+6198 8084
+6199 8085
+619A 8093
+619B 809A
+619C 80AD
+619D 5190
+619E 80AC
+619F 80DB
+61A0 80E5
+61A1 80D9
+61A2 80DD
+61A3 80C4
+61A4 80DA
+61A5 8109
+61A6 80EF
+61A7 80F1
+61A8 811B
+61A9 8123
+61AA 812F
+61AB 814B
+61AC 8146
+61AD 813E
+61AE 8153
+61AF 8151
+61B0 80FC
+61B1 8171
+61B2 816E
+61B3 8165
+61B4 815F
+61B5 8166
+61B6 8174
+61B7 8183
+61B8 8188
+61B9 818A
+61BA 8180
+61BB 8182
+61BC 81A0
+61BD 8195
+61BE 81A3
+61BF 8193
+61C0 81B5
+61C1 81A4
+61C2 81A9
+61C3 81B8
+61C4 81B0
+61C5 81C8
+61C6 81BE
+61C7 81BD
+61C8 81C0
+61C9 81C2
+61CA 81BA
+61CB 81C9
+61CC 81CD
+61CD 81D1
+61CE 81D8
+61CF 81D9
+61D0 81DA
+61D1 81DF
+61D2 81E0
+61D3 81FA
+61D4 81FB
+61D5 81FE
+61D6 8201
+61D7 8202
+61D8 8205
+61D9 820D
+61DA 8210
+61DB 8212
+61DC 8216
+61DD 8229
+61DE 822B
+61DF 822E
+61E0 8238
+61E1 8233
+61E2 8240
+61E3 8259
+61E4 825A
+61E5 825D
+61E6 825F
+61E7 8264
+61E8 8262
+61E9 8268
+61EA 826A
+61EB 826B
+61EC 8271
+61ED 8277
+61EE 827E
+61EF 828D
+61F0 8292
+61F1 82AB
+61F2 829F
+61F3 82BB
+61F4 82AC
+61F5 82E1
+61F6 82E3
+61F7 82DF
+61F8 8301
+61F9 82D2
+61FA 82F4
+61FB 82F3
+61FC 8303
+61FD 82FB
+61FE 82F9
+6241 82DE
+6242 8306
+6243 82DC
+6244 82FA
+6245 8309
+6246 82D9
+6247 8335
+6248 8362
+6249 8334
+624A 8316
+624B 8331
+624C 8340
+624D 8339
+624E 8350
+624F 8345
+6250 832F
+6251 832B
+6252 8318
+6253 839A
+6254 83AA
+6255 839F
+6256 83A2
+6257 8396
+6258 8323
+6259 838E
+625A 8375
+625B 837F
+625C 838A
+625D 837C
+625E 83B5
+625F 8373
+6260 8393
+6261 83A0
+6262 8385
+6263 8389
+6264 83A8
+6265 83F4
+6266 8413
+6267 83C7
+6268 83CE
+6269 83F7
+626A 83FD
+626B 8403
+626C 83D8
+626D 840B
+626E 83C1
+626F 8407
+6270 83E0
+6271 83F2
+6272 840D
+6273 8420
+6274 83F6
+6275 83BD
+6276 83FB
+6277 842A
+6278 8462
+6279 843C
+627A 8484
+627B 8477
+627C 846B
+627D 8479
+627E 8448
+627F 846E
+6280 8482
+6281 8469
+6282 8446
+6283 846F
+6284 8438
+6285 8435
+6286 84CA
+6287 84B9
+6288 84BF
+6289 849F
+628A 84B4
+628B 84CD
+628C 84BB
+628D 84DA
+628E 84D0
+628F 84C1
+6290 84AD
+6291 84C6
+6292 84D6
+6293 84A1
+6294 84D9
+6295 84FF
+6296 84F4
+6297 8517
+6298 8518
+6299 852C
+629A 851F
+629B 8515
+629C 8514
+629D 8506
+629E 8553
+629F 855A
+62A0 8540
+62A1 8559
+62A2 8563
+62A3 8558
+62A4 8548
+62A5 8541
+62A6 854A
+62A7 854B
+62A8 856B
+62A9 8555
+62AA 8580
+62AB 85A4
+62AC 8588
+62AD 8591
+62AE 858A
+62AF 85A8
+62B0 856D
+62B1 8594
+62B2 859B
+62B3 85AE
+62B4 8587
+62B5 859C
+62B6 8577
+62B7 857E
+62B8 8590
+62B9 FA1F
+62BA 820A
+62BB 85B0
+62BC 85C9
+62BD 85BA
+62BE 85CF
+62BF 85B9
+62C0 85D0
+62C1 85D5
+62C2 85DD
+62C3 85E5
+62C4 85DC
+62C5 85F9
+62C6 860A
+62C7 8613
+62C8 860B
+62C9 85FE
+62CA 8622
+62CB 861A
+62CC 8630
+62CD 863F
+62CE FA20
+62CF 864D
+62D0 4E55
+62D1 8655
+62D2 865F
+62D3 8667
+62D4 8671
+62D5 8693
+62D6 86A3
+62D7 86A9
+62D8 868B
+62D9 86AA
+62DA 868C
+62DB 86B6
+62DC 86AF
+62DD 86C4
+62DE 86C6
+62DF 86B0
+62E0 86C9
+62E1 86CE
+62E2 FA21
+62E3 86AB
+62E4 86D4
+62E5 86DE
+62E6 86E9
+62E7 86EC
+62E8 86DF
+62E9 86DB
+62EA 8712
+62EB 8706
+62EC 8708
+62ED 8700
+62EE 8703
+62EF 86FB
+62F0 8711
+62F1 8709
+62F2 870D
+62F3 86F9
+62F4 870A
+62F5 8734
+62F6 873F
+62F7 873B
+62F8 8725
+62F9 8729
+62FA 871A
+62FB 875F
+62FC 8778
+62FD 874C
+62FE 874E
+6341 8774
+6342 8757
+6343 8768
+6344 8782
+6345 876A
+6346 8760
+6347 876E
+6348 8759
+6349 8753
+634A 8763
+634B 877F
+634C 87A2
+634D 87C6
+634E 879F
+634F 87AF
+6350 87CB
+6351 87BD
+6352 87C0
+6353 87D0
+6354 96D6
+6355 87AB
+6356 87C4
+6357 87B3
+6358 87D2
+6359 87BB
+635A 87EF
+635B 87F2
+635C 87E0
+635D 880E
+635E 8807
+635F 880F
+6360 8816
+6361 880D
+6362 87FE
+6363 87F6
+6364 87F7
+6365 8811
+6366 8815
+6367 8822
+6368 8821
+6369 8827
+636A 8831
+636B 8836
+636C 8839
+636D 883B
+636E 8842
+636F 8844
+6370 884D
+6371 8852
+6372 8859
+6373 885E
+6374 8862
+6375 886B
+6376 8881
+6377 887E
+6378 8875
+6379 887D
+637A 8872
+637B 8882
+637C 889E
+637D 8897
+637E 8892
+637F 88AE
+6380 8899
+6381 88A2
+6382 888D
+6383 88A4
+6384 88BF
+6385 88B5
+6386 88B1
+6387 88C3
+6388 88C4
+6389 88D4
+638A 88D8
+638B 88D9
+638C 88DD
+638D 88F9
+638E 8902
+638F 88FC
+6390 88F5
+6391 88E8
+6392 88F2
+6393 8904
+6394 890C
+6395 892A
+6396 891D
+6397 890A
+6398 8913
+6399 891E
+639A 8925
+639B 892B
+639C 8941
+639D 893B
+639E 8936
+639F 8943
+63A0 8938
+63A1 894D
+63A2 894C
+63A3 8960
+63A4 895E
+63A5 8966
+63A6 896A
+63A7 8964
+63A8 896D
+63A9 896F
+63AA 8974
+63AB 8977
+63AC 897E
+63AD 8983
+63AE 8988
+63AF 898A
+63B0 8993
+63B1 8998
+63B2 89A1
+63B3 89A9
+63B4 89A6
+63B5 89AC
+63B6 89AF
+63B7 89B2
+63B8 89BA
+63B9 89BF
+63BA 89BD
+63BB 89C0
+63BC 89DA
+63BD 89DD
+63BE 89E7
+63BF 89F4
+63C0 89F8
+63C1 8A03
+63C2 8A16
+63C3 8A10
+63C4 8A0C
+63C5 8A12
+63C6 8A1B
+63C7 8A1D
+63C8 8A25
+63C9 8A36
+63CA 8A41
+63CB 8A37
+63CC 8A5B
+63CD 8A52
+63CE 8A46
+63CF 8A48
+63D0 8A7C
+63D1 8A6D
+63D2 8A6C
+63D3 8A62
+63D4 8A79
+63D5 8A85
+63D6 8A82
+63D7 8A84
+63D8 8AA8
+63D9 8AA1
+63DA 8A91
+63DB 8AA5
+63DC 8AA6
+63DD 8A9A
+63DE 8AA3
+63DF 8AA7
+63E0 8ACC
+63E1 8ABE
+63E2 8ACD
+63E3 8AC2
+63E4 8ADA
+63E5 8AF3
+63E6 8AE7
+63E7 8AE4
+63E8 8AF1
+63E9 8B14
+63EA 8AE0
+63EB 8AE2
+63EC 8AE1
+63ED 8ADF
+63EE FA22
+63EF 8AF6
+63F0 8AF7
+63F1 8ADE
+63F2 8ADB
+63F3 8B0C
+63F4 8B07
+63F5 8B1A
+63F6 8B16
+63F7 8B10
+63F8 8B17
+63F9 8B20
+63FA 8B33
+63FB 8B41
+63FC 97AB
+63FD 8B26
+63FE 8B2B
+6441 8B3E
+6442 8B4C
+6443 8B4F
+6444 8B4E
+6445 8B53
+6446 8B49
+6447 8B56
+6448 8B5B
+6449 8B5A
+644A 8B74
+644B 8B6B
+644C 8B5F
+644D 8B6C
+644E 8B6F
+644F 8B7D
+6450 8B7F
+6451 8B80
+6452 8B8C
+6453 8B8E
+6454 8B99
+6455 8B92
+6456 8B93
+6457 8B96
+6458 8B9A
+6459 8C3A
+645A 8C41
+645B 8C3F
+645C 8C48
+645D 8C4C
+645E 8C4E
+645F 8C50
+6460 8C55
+6461 8C62
+6462 8C6C
+6463 8C78
+6464 8C7A
+6465 8C7C
+6466 8C82
+6467 8C89
+6468 8C85
+6469 8C8A
+646A 8C8D
+646B 8C8E
+646C 8C98
+646D 8C94
+646E 621D
+646F 8CAD
+6470 8CAA
+6471 8CAE
+6472 8CBD
+6473 8CB2
+6474 8CB3
+6475 8CC1
+6476 8CB6
+6477 8CC8
+6478 8CCE
+6479 8CCD
+647A 8CE3
+647B 8CDA
+647C 8CF0
+647D 8CF4
+647E 8CFD
+647F 8CFA
+6480 8CFB
+6481 8D07
+6482 8D0A
+6483 8D0F
+6484 8D0D
+6485 8D12
+6486 8D10
+6487 8D13
+6488 8D14
+6489 8D16
+648A 8D67
+648B 8D6D
+648C 8D71
+648D 8D76
+648E FA23
+648F 8D81
+6490 8DC2
+6491 8DBE
+6492 8DBA
+6493 8DCF
+6494 8DDA
+6495 8DD6
+6496 8DCC
+6497 8DDB
+6498 8DCB
+6499 8DEA
+649A 8DEB
+649B 8DDF
+649C 8DE3
+649D 8DFC
+649E 8E08
+649F 8DFF
+64A0 8E09
+64A1 8E1D
+64A2 8E1E
+64A3 8E10
+64A4 8E1F
+64A5 8E42
+64A6 8E35
+64A7 8E30
+64A8 8E34
+64A9 8E4A
+64AA 8E47
+64AB 8E49
+64AC 8E4C
+64AD 8E50
+64AE 8E48
+64AF 8E59
+64B0 8E64
+64B1 8E60
+64B2 8E55
+64B3 8E63
+64B4 8E76
+64B5 8E72
+64B6 8E87
+64B7 8E7C
+64B8 8E81
+64B9 8E85
+64BA 8E84
+64BB 8E8B
+64BC 8E8A
+64BD 8E93
+64BE 8E91
+64BF 8E94
+64C0 8E99
+64C1 8EA1
+64C2 8EAA
+64C3 8EB1
+64C4 8EBE
+64C5 8EC6
+64C6 8EC5
+64C7 8EC8
+64C8 8ECB
+64C9 8ECF
+64CA 8EDB
+64CB 8EE3
+64CC 8EFC
+64CD 8EFB
+64CE 8EEB
+64CF 8EFE
+64D0 8F0A
+64D1 8F0C
+64D2 8F05
+64D3 8F15
+64D4 8F12
+64D5 8F13
+64D6 8F1C
+64D7 8F19
+64D8 8F1F
+64D9 8F26
+64DA 8F33
+64DB 8F3B
+64DC 8F39
+64DD 8F45
+64DE 8F42
+64DF 8F3E
+64E0 8F49
+64E1 8F46
+64E2 8F4C
+64E3 8F4E
+64E4 8F57
+64E5 8F5C
+64E6 8F62
+64E7 8F63
+64E8 8F64
+64E9 8F9C
+64EA 8F9F
+64EB 8FA3
+64EC 8FA8
+64ED 8FA7
+64EE 8FAD
+64EF 8FAF
+64F0 8FB7
+64F1 FA24
+64F2 8FDA
+64F3 8FE5
+64F4 8FE2
+64F5 8FEF
+64F6 8FE9
+64F7 8FF4
+64F8 9005
+64F9 8FF9
+64FA 8FF8
+64FB 9011
+64FC 9015
+64FD 900E
+64FE 9021
+6541 900D
+6542 901E
+6543 9016
+6544 900B
+6545 9027
+6546 9036
+6547 9039
+6548 904F
+6549 FA25
+654A 9050
+654B 9051
+654C 9052
+654D 9049
+654E 903E
+654F 9056
+6550 9058
+6551 905E
+6552 9068
+6553 9067
+6554 906F
+6555 9076
+6556 96A8
+6557 9072
+6558 9082
+6559 907D
+655A 9089
+655B 9080
+655C 908F
+655D 6248
+655E 90AF
+655F 90B1
+6560 90B5
+6561 90E2
+6562 90E4
+6563 90DB
+6564 90DE
+6565 9102
+6566 FA26
+6567 9115
+6568 9112
+6569 9119
+656A 9132
+656B 9127
+656C 9130
+656D 914A
+656E 9156
+656F 9158
+6570 9163
+6571 9165
+6572 9169
+6573 9173
+6574 9172
+6575 918B
+6576 9189
+6577 9182
+6578 91A2
+6579 91AB
+657A 91AF
+657B 91AA
+657C 91B5
+657D 91B4
+657E 91BA
+657F 91C0
+6580 91C1
+6581 91CB
+6582 91D0
+6583 91DA
+6584 91DB
+6585 91D7
+6586 91DE
+6587 91D6
+6588 91DF
+6589 91E1
+658A 91ED
+658B 91F5
+658C 91EE
+658D 91E4
+658E 91F6
+658F 91E5
+6590 9206
+6591 921E
+6592 91FF
+6593 9210
+6594 9214
+6595 920A
+6596 922C
+6597 9215
+6598 9229
+6599 9257
+659A 9245
+659B 923A
+659C 9249
+659D 9264
+659E 9240
+659F 923C
+65A0 9248
+65A1 924E
+65A2 9250
+65A3 9259
+65A4 923F
+65A5 9251
+65A6 9239
+65A7 924B
+65A8 9267
+65A9 925A
+65AA 929C
+65AB 92A7
+65AC 9277
+65AD 9278
+65AE 9296
+65AF 9293
+65B0 929B
+65B1 9295
+65B2 92E9
+65B3 92CF
+65B4 92E7
+65B5 92D7
+65B6 92D9
+65B7 92D0
+65B8 FA27
+65B9 92D5
+65BA 92B9
+65BB 92B7
+65BC 92E0
+65BD 92D3
+65BE 933A
+65BF 9335
+65C0 930F
+65C1 9325
+65C2 92FA
+65C3 9321
+65C4 9344
+65C5 92FB
+65C6 FA28
+65C7 9319
+65C8 931E
+65C9 92FF
+65CA 9322
+65CB 931A
+65CC 931D
+65CD 9323
+65CE 9302
+65CF 933B
+65D0 9370
+65D1 9360
+65D2 937C
+65D3 936E
+65D4 9356
+65D5 9357
+65D6 93B9
+65D7 93B0
+65D8 93A4
+65D9 93AD
+65DA 9394
+65DB 93C8
+65DC 93D6
+65DD 93C6
+65DE 93D7
+65DF 93E8
+65E0 93E5
+65E1 93D8
+65E2 93C3
+65E3 93DD
+65E4 93DE
+65E5 93D0
+65E6 93E4
+65E7 941A
+65E8 93F8
+65E9 9414
+65EA 9413
+65EB 9421
+65EC 9403
+65ED 9407
+65EE 9436
+65EF 942B
+65F0 9431
+65F1 943A
+65F2 9441
+65F3 9452
+65F4 9445
+65F5 9444
+65F6 9448
+65F7 945B
+65F8 945A
+65F9 9460
+65FA 9462
+65FB 945E
+65FC 946A
+65FD 9475
+65FE 9470
+6641 9477
+6642 947F
+6643 947D
+6644 947C
+6645 947E
+6646 9481
+6647 9582
+6648 9587
+6649 958A
+664A 9592
+664B 9594
+664C 9596
+664D 9598
+664E 9599
+664F 95A0
+6650 95A8
+6651 95A7
+6652 95AD
+6653 95BC
+6654 95BB
+6655 95B9
+6656 95BE
+6657 95CA
+6658 6FF6
+6659 95C3
+665A 95CD
+665B 95CC
+665C 95D5
+665D 95D4
+665E 95D6
+665F 95DC
+6660 95E1
+6661 95E5
+6662 95E2
+6663 9621
+6664 9628
+6665 962E
+6666 962F
+6667 9642
+6668 964F
+6669 964C
+666A 964B
+666B 965C
+666C 965D
+666D 965F
+666E 9666
+666F 9677
+6670 9672
+6671 966C
+6672 968D
+6673 968B
+6674 F9DC
+6675 9698
+6676 9695
+6677 9697
+6678 FA29
+6679 969D
+667A 96A7
+667B 96AA
+667C 96B1
+667D 96B2
+667E 96B0
+667F 96AF
+6680 96B4
+6681 96B6
+6682 96B8
+6683 96B9
+6684 96CE
+6685 96CB
+6686 96D5
+6687 96DC
+6688 96D9
+6689 96F9
+668A 9704
+668B 9706
+668C 9708
+668D 9719
+668E 970D
+668F 9713
+6690 970E
+6691 9711
+6692 970F
+6693 9716
+6694 9724
+6695 972A
+6696 9730
+6697 9733
+6698 9739
+6699 973B
+669A 973D
+669B 973E
+669C 9746
+669D 9744
+669E 9743
+669F 9748
+66A0 9742
+66A1 9749
+66A2 974D
+66A3 974F
+66A4 9751
+66A5 9755
+66A6 975C
+66A7 9760
+66A8 9764
+66A9 9766
+66AA 9768
+66AB 976D
+66AC 9779
+66AD 9785
+66AE 977C
+66AF 9781
+66B0 977A
+66B1 978B
+66B2 978F
+66B3 9790
+66B4 979C
+66B5 97A8
+66B6 97A6
+66B7 97A3
+66B8 97B3
+66B9 97B4
+66BA 97C3
+66BB 97C6
+66BC 97C8
+66BD 97CB
+66BE 97DC
+66BF 97ED
+66C0 97F2
+66C1 7ADF
+66C2 97F5
+66C3 980F
+66C4 981A
+66C5 9824
+66C6 9821
+66C7 9837
+66C8 983D
+66C9 984F
+66CA 984B
+66CB 9857
+66CC 9865
+66CD 986B
+66CE 986F
+66CF 9870
+66D0 9871
+66D1 9874
+66D2 9873
+66D3 98AA
+66D4 98AF
+66D5 98B1
+66D6 98B6
+66D7 98C4
+66D8 98C3
+66D9 98C6
+66DA 98DC
+66DB 98ED
+66DC 98E9
+66DD FA2A
+66DE 98EB
+66DF FA2B
+66E0 9903
+66E1 991D
+66E2 9912
+66E3 9914
+66E4 9918
+66E5 9927
+66E6 FA2C
+66E7 9921
+66E8 991E
+66E9 9924
+66EA 9920
+66EB 992C
+66EC 992E
+66ED 993D
+66EE 993E
+66EF 9942
+66F0 9949
+66F1 9945
+66F2 9950
+66F3 994B
+66F4 9951
+66F5 994C
+66F6 9955
+66F7 9997
+66F8 9998
+66F9 999E
+66FA 99A5
+66FB 99AD
+66FC 99AE
+66FD 99BC
+66FE 99DF
+6741 99DB
+6742 99DD
+6743 99D8
+6744 99D1
+6745 99ED
+6746 99EE
+6747 99E2
+6748 99F1
+6749 99F2
+674A 99FB
+674B 99F8
+674C 9A01
+674D 9A0F
+674E 9A05
+674F 9A19
+6750 9A2B
+6751 9A37
+6752 9A40
+6753 9A45
+6754 9A42
+6755 9A43
+6756 9A3E
+6757 9A55
+6758 9A4D
+6759 9A4E
+675A 9A5B
+675B 9A57
+675C 9A5F
+675D 9A62
+675E 9A69
+675F 9A65
+6760 9A64
+6761 9A6A
+6762 9A6B
+6763 9AAD
+6764 9AB0
+6765 9ABC
+6766 9AC0
+6767 9ACF
+6768 9AD3
+6769 9AD4
+676A 9AD1
+676B 9AD9
+676C 9ADC
+676D 9ADE
+676E 9ADF
+676F 9AE2
+6770 9AE3
+6771 9AE6
+6772 9AEF
+6773 9AEB
+6774 9AEE
+6775 9AF4
+6776 9AF1
+6777 9AF7
+6778 9AFB
+6779 9B06
+677A 9B18
+677B 9B1A
+677C 9B1F
+677D 9B22
+677E 9B23
+677F 9B25
+6780 9B27
+6781 9B28
+6782 9B29
+6783 9B2A
+6784 9B2E
+6785 9B2F
+6786 9B31
+6787 9B32
+6788 9B3B
+6789 9B44
+678A 9B43
+678B 9B4D
+678C 9B4E
+678D 9B51
+678E 9B58
+678F 9B75
+6790 9B74
+6791 9B72
+6792 9B93
+6793 9B8F
+6794 9B83
+6795 9B91
+6796 9B96
+6797 9B97
+6798 9B9F
+6799 9BA0
+679A 9BA8
+679B 9BB1
+679C 9BB4
+679D 9BC0
+679E 9BCA
+679F 9BBB
+67A0 9BB9
+67A1 9BC6
+67A2 9BCF
+67A3 9BD1
+67A4 9BD2
+67A5 9BE3
+67A6 9BE2
+67A7 9BE4
+67A8 9BD4
+67A9 9BE1
+67AA 9BF5
+67AB 9BF1
+67AC 9BF2
+67AD 9C04
+67AE 9C1B
+67AF 9C15
+67B0 9C14
+67B1 9C00
+67B2 9C09
+67B3 9C13
+67B4 9C0C
+67B5 9C06
+67B6 9C08
+67B7 9C12
+67B8 9C0A
+67B9 9C2E
+67BA 9C25
+67BB 9C24
+67BC 9C21
+67BD 9C30
+67BE 9C47
+67BF 9C32
+67C0 9C46
+67C1 9C3E
+67C2 9C5A
+67C3 9C60
+67C4 9C67
+67C5 9C76
+67C6 9C78
+67C7 9CEB
+67C8 9CE7
+67C9 9CEC
+67CA 9CF0
+67CB 9D09
+67CC 9D03
+67CD 9D06
+67CE 9D2A
+67CF 9D26
+67D0 9D2C
+67D1 9D23
+67D2 9D1F
+67D3 9D15
+67D4 9D12
+67D5 9D41
+67D6 9D3F
+67D7 9D44
+67D8 9D3E
+67D9 9D46
+67DA 9D48
+67DB 9D5D
+67DC 9D5E
+67DD 9D59
+67DE 9D51
+67DF 9D50
+67E0 9D64
+67E1 9D72
+67E2 9D70
+67E3 9D87
+67E4 9D6B
+67E5 9D6F
+67E6 9D7A
+67E7 9D9A
+67E8 9DA4
+67E9 9DA9
+67EA 9DAB
+67EB 9DB2
+67EC 9DC4
+67ED 9DC1
+67EE 9DBB
+67EF 9DB8
+67F0 9DBA
+67F1 9DC6
+67F2 9DCF
+67F3 9DC2
+67F4 FA2D
+67F5 9DD9
+67F6 9DD3
+67F7 9DF8
+67F8 9DE6
+67F9 9DED
+67FA 9DEF
+67FB 9DFD
+67FC 9E1A
+67FD 9E1B
+67FE 9E19
+6841 9E1E
+6842 9E75
+6843 9E79
+6844 9E7D
+6845 9E81
+6846 9E88
+6847 9E8B
+6848 9E8C
+6849 9E95
+684A 9E91
+684B 9E9D
+684C 9EA5
+684D 9EB8
+684E 9EAA
+684F 9EAD
+6850 9EBC
+6851 9EBE
+6852 9761
+6853 9ECC
+6854 9ECF
+6855 9ED0
+6856 9ED1
+6857 9ED4
+6858 9EDC
+6859 9EDE
+685A 9EDD
+685B 9EE0
+685C 9EE5
+685D 9EE8
+685E 9EEF
+685F 9EF4
+6860 9EF6
+6861 9EF7
+6862 9EF9
+6863 9EFB
+6864 9EFC
+6865 9EFD
+6866 9F07
+6867 9F08
+6868 76B7
+6869 9F15
+686A 9F21
+686B 9F2C
+686C 9F3E
+686D 9F4A
+686E 9F4E
+686F 9F4F
+6870 9F52
+6871 9F54
+6872 9F63
+6873 9F5F
+6874 9F60
+6875 9F61
+6876 9F66
+6877 9F67
+6878 9F6C
+6879 9F6A
+687A 9F77
+687B 9F72
+687C 9F76
+687D 9F95
+687E 9F9C
+687F 9FA0
+6880 5C2D
+6881 69D9
+6882 9065
+6883 7476
+6884 51DC
+6885 7155
+6941 E000
+6942 E001
+6943 E002
+6944 E003
+6945 E004
+6946 E005
+6947 E006
+6948 E007
+6949 E008
+694A E009
+694B E00A
+694C E00B
+694D E00C
+694E E00D
+694F E00E
+6950 E00F
+6951 E010
+6952 E011
+6953 E012
+6954 E013
+6955 E014
+6956 E015
+6957 E016
+6958 E017
+6959 E018
+695A E019
+695B E01A
+695C E01B
+695D E01C
+695E E01D
+695F E01E
+6960 E01F
+6961 E020
+6962 E021
+6963 E022
+6964 E023
+6965 E024
+6966 E025
+6967 E026
+6968 E027
+6969 E028
+696A E029
+696B E02A
+696C E02B
+696D E02C
+696E E02D
+696F E02E
+6970 E02F
+6971 E030
+6972 E031
+6973 E032
+6974 E033
+6975 E034
+6976 E035
+6977 E036
+6978 E037
+6979 E038
+697A E039
+697B E03A
+697C E03B
+697D E03C
+697E E03D
+697F E03E
+6980 E03F
+6981 E040
+6982 E041
+6983 E042
+6984 E043
+6985 E044
+6986 E045
+6987 E046
+6988 E047
+6989 E048
+698A E049
+698B E04A
+698C E04B
+698D E04C
+698E E04D
+698F E04E
+6990 E04F
+6991 E050
+6992 E051
+6993 E052
+6994 E053
+6995 E054
+6996 E055
+6997 E056
+6998 E057
+6999 E058
+699A E059
+699B E05A
+699C E05B
+699D E05C
+699E E05D
+699F E05E
+69A0 E05F
+69A1 E060
+69A2 E061
+69A3 E062
+69A4 E063
+69A5 E064
+69A6 E065
+69A7 E066
+69A8 E067
+69A9 E068
+69AA E069
+69AB E06A
+69AC E06B
+69AD E06C
+69AE E06D
+69AF E06E
+69B0 E06F
+69B1 E070
+69B2 E071
+69B3 E072
+69B4 E073
+69B5 E074
+69B6 E075
+69B7 E076
+69B8 E077
+69B9 E078
+69BA E079
+69BB E07A
+69BC E07B
+69BD E07C
+69BE E07D
+69BF E07E
+69C0 E07F
+69C1 E080
+69C2 E081
+69C3 E082
+69C4 E083
+69C5 E084
+69C6 E085
+69C7 E086
+69C8 E087
+69C9 E088
+69CA E089
+69CB E08A
+69CC E08B
+69CD E08C
+69CE E08D
+69CF E08E
+69D0 E08F
+69D1 E090
+69D2 E091
+69D3 E092
+69D4 E093
+69D5 E094
+69D6 E095
+69D7 E096
+69D8 E097
+69D9 E098
+69DA E099
+69DB E09A
+69DC E09B
+69DD E09C
+69DE E09D
+69DF E09E
+69E0 E09F
+69E1 E0A0
+69E2 E0A1
+69E3 E0A2
+69E4 E0A3
+69E5 E0A4
+69E6 E0A5
+69E7 E0A6
+69E8 E0A7
+69E9 E0A8
+69EA E0A9
+69EB E0AA
+69EC E0AB
+69ED E0AC
+69EE E0AD
+69EF E0AE
+69F0 E0AF
+69F1 E0B0
+69F2 E0B1
+69F3 E0B2
+69F4 E0B3
+69F5 E0B4
+69F6 E0B5
+69F7 E0B6
+69F8 E0B7
+69F9 E0B8
+69FA E0B9
+69FB E0BA
+69FC E0BB
+69FD E0BC
+69FE E0BD
+6A41 E0BE
+6A42 E0BF
+6A43 E0C0
+6A44 E0C1
+6A45 E0C2
+6A46 E0C3
+6A47 E0C4
+6A48 E0C5
+6A49 E0C6
+6A4A E0C7
+6A4B E0C8
+6A4C E0C9
+6A4D E0CA
+6A4E E0CB
+6A4F E0CC
+6A50 E0CD
+6A51 E0CE
+6A52 E0CF
+6A53 E0D0
+6A54 E0D1
+6A55 E0D2
+6A56 E0D3
+6A57 E0D4
+6A58 E0D5
+6A59 E0D6
+6A5A E0D7
+6A5B E0D8
+6A5C E0D9
+6A5D E0DA
+6A5E E0DB
+6A5F E0DC
+6A60 E0DD
+6A61 E0DE
+6A62 E0DF
+6A63 E0E0
+6A64 E0E1
+6A65 E0E2
+6A66 E0E3
+6A67 E0E4
+6A68 E0E5
+6A69 E0E6
+6A6A E0E7
+6A6B E0E8
+6A6C E0E9
+6A6D E0EA
+6A6E E0EB
+6A6F E0EC
+6A70 E0ED
+6A71 E0EE
+6A72 E0EF
+6A73 E0F0
+6A74 E0F1
+6A75 E0F2
+6A76 E0F3
+6A77 E0F4
+6A78 E0F5
+6A79 E0F6
+6A7A E0F7
+6A7B E0F8
+6A7C E0F9
+6A7D E0FA
+6A7E E0FB
+6A7F E0FC
+6A80 E0FD
+6A81 E0FE
+6A82 E0FF
+6A83 E100
+6A84 E101
+6A85 E102
+6A86 E103
+6A87 E104
+6A88 E105
+6A89 E106
+6A8A E107
+6A8B E108
+6A8C E109
+6A8D E10A
+6A8E E10B
+6A8F E10C
+6A90 E10D
+6A91 E10E
+6A92 E10F
+6A93 E110
+6A94 E111
+6A95 E112
+6A96 E113
+6A97 E114
+6A98 E115
+6A99 E116
+6A9A E117
+6A9B E118
+6A9C E119
+6A9D E11A
+6A9E E11B
+6A9F E11C
+6AA0 E11D
+6AA1 E11E
+6AA2 E11F
+6AA3 E120
+6AA4 E121
+6AA5 E122
+6AA6 E123
+6AA7 E124
+6AA8 E125
+6AA9 E126
+6AAA E127
+6AAB E128
+6AAC E129
+6AAD E12A
+6AAE E12B
+6AAF E12C
+6AB0 E12D
+6AB1 E12E
+6AB2 E12F
+6AB3 E130
+6AB4 E131
+6AB5 E132
+6AB6 E133
+6AB7 E134
+6AB8 E135
+6AB9 E136
+6ABA E137
+6ABB E138
+6ABC E139
+6ABD E13A
+6ABE E13B
+6ABF E13C
+6AC0 E13D
+6AC1 E13E
+6AC2 E13F
+6AC3 E140
+6AC4 E141
+6AC5 E142
+6AC6 E143
+6AC7 E144
+6AC8 E145
+6AC9 E146
+6ACA E147
+6ACB E148
+6ACC E149
+6ACD E14A
+6ACE E14B
+6ACF E14C
+6AD0 E14D
+6AD1 E14E
+6AD2 E14F
+6AD3 E150
+6AD4 E151
+6AD5 E152
+6AD6 E153
+6AD7 E154
+6AD8 E155
+6AD9 E156
+6ADA E157
+6ADB E158
+6ADC E159
+6ADD E15A
+6ADE E15B
+6ADF E15C
+6AE0 E15D
+6AE1 E15E
+6AE2 E15F
+6AE3 E160
+6AE4 E161
+6AE5 E162
+6AE6 E163
+6AE7 E164
+6AE8 E165
+6AE9 E166
+6AEA E167
+6AEB E168
+6AEC E169
+6AED E16A
+6AEE E16B
+6AEF E16C
+6AF0 E16D
+6AF1 E16E
+6AF2 E16F
+6AF3 E170
+6AF4 E171
+6AF5 E172
+6AF6 E173
+6AF7 E174
+6AF8 E175
+6AF9 E176
+6AFA E177
+6AFB E178
+6AFC E179
+6AFD E17A
+6AFE E17B
+6B41 E17C
+6B42 E17D
+6B43 E17E
+6B44 E17F
+6B45 E180
+6B46 E181
+6B47 E182
+6B48 E183
+6B49 E184
+6B4A E185
+6B4B E186
+6B4C E187
+6B4D E188
+6B4E E189
+6B4F E18A
+6B50 E18B
+6B51 E18C
+6B52 E18D
+6B53 E18E
+6B54 E18F
+6B55 E190
+6B56 E191
+6B57 E192
+6B58 E193
+6B59 E194
+6B5A E195
+6B5B E196
+6B5C E197
+6B5D E198
+6B5E E199
+6B5F E19A
+6B60 E19B
+6B61 E19C
+6B62 E19D
+6B63 E19E
+6B64 E19F
+6B65 E1A0
+6B66 E1A1
+6B67 E1A2
+6B68 E1A3
+6B69 E1A4
+6B6A E1A5
+6B6B E1A6
+6B6C E1A7
+6B6D E1A8
+6B6E E1A9
+6B6F E1AA
+6B70 E1AB
+6B71 E1AC
+6B72 E1AD
+6B73 E1AE
+6B74 E1AF
+6B75 E1B0
+6B76 E1B1
+6B77 E1B2
+6B78 E1B3
+6B79 E1B4
+6B7A E1B5
+6B7B E1B6
+6B7C E1B7
+6B7D E1B8
+6B7E E1B9
+6B7F E1BA
+6B80 E1BB
+6B81 E1BC
+6B82 E1BD
+6B83 E1BE
+6B84 E1BF
+6B85 E1C0
+6B86 E1C1
+6B87 E1C2
+6B88 E1C3
+6B89 E1C4
+6B8A E1C5
+6B8B E1C6
+6B8C E1C7
+6B8D E1C8
+6B8E E1C9
+6B8F E1CA
+6B90 E1CB
+6B91 E1CC
+6B92 E1CD
+6B93 E1CE
+6B94 E1CF
+6B95 E1D0
+6B96 E1D1
+6B97 E1D2
+6B98 E1D3
+6B99 E1D4
+6B9A E1D5
+6B9B E1D6
+6B9C E1D7
+6B9D E1D8
+6B9E E1D9
+6B9F E1DA
+6BA0 E1DB
+6BA1 E1DC
+6BA2 E1DD
+6BA3 E1DE
+6BA4 E1DF
+6BA5 E1E0
+6BA6 E1E1
+6BA7 E1E2
+6BA8 E1E3
+6BA9 E1E4
+6BAA E1E5
+6BAB E1E6
+6BAC E1E7
+6BAD E1E8
+6BAE E1E9
+6BAF E1EA
+6BB0 E1EB
+6BB1 E1EC
+6BB2 E1ED
+6BB3 E1EE
+6BB4 E1EF
+6BB5 E1F0
+6BB6 E1F1
+6BB7 E1F2
+6BB8 E1F3
+6BB9 E1F4
+6BBA E1F5
+6BBB E1F6
+6BBC E1F7
+6BBD E1F8
+6BBE E1F9
+6BBF E1FA
+6BC0 E1FB
+6BC1 E1FC
+6BC2 E1FD
+6BC3 E1FE
+6BC4 E1FF
+6BC5 E200
+6BC6 E201
+6BC7 E202
+6BC8 E203
+6BC9 E204
+6BCA E205
+6BCB E206
+6BCC E207
+6BCD E208
+6BCE E209
+6BCF E20A
+6BD0 E20B
+6BD1 E20C
+6BD2 E20D
+6BD3 E20E
+6BD4 E20F
+6BD5 E210
+6BD6 E211
+6BD7 E212
+6BD8 E213
+6BD9 E214
+6BDA E215
+6BDB E216
+6BDC E217
+6BDD E218
+6BDE E219
+6BDF E21A
+6BE0 E21B
+6BE1 E21C
+6BE2 E21D
+6BE3 E21E
+6BE4 E21F
+6BE5 E220
+6BE6 E221
+6BE7 E222
+6BE8 E223
+6BE9 E224
+6BEA E225
+6BEB E226
+6BEC E227
+6BED E228
+6BEE E229
+6BEF E22A
+6BF0 E22B
+6BF1 E22C
+6BF2 E22D
+6BF3 E22E
+6BF4 E22F
+6BF5 E230
+6BF6 E231
+6BF7 E232
+6BF8 E233
+6BF9 E234
+6BFA E235
+6BFB E236
+6BFC E237
+6BFD E238
+6BFE E239
+6C41 E23A
+6C42 E23B
+6C43 E23C
+6C44 E23D
+6C45 E23E
+6C46 E23F
+6C47 E240
+6C48 E241
+6C49 E242
+6C4A E243
+6C4B E244
+6C4C E245
+6C4D E246
+6C4E E247
+6C4F E248
+6C50 E249
+6C51 E24A
+6C52 E24B
+6C53 E24C
+6C54 E24D
+6C55 E24E
+6C56 E24F
+6C57 E250
+6C58 E251
+6C59 E252
+6C5A E253
+6C5B E254
+6C5C E255
+6C5D E256
+6C5E E257
+6C5F E258
+6C60 E259
+6C61 E25A
+6C62 E25B
+6C63 E25C
+6C64 E25D
+6C65 E25E
+6C66 E25F
+6C67 E260
+6C68 E261
+6C69 E262
+6C6A E263
+6C6B E264
+6C6C E265
+6C6D E266
+6C6E E267
+6C6F E268
+6C70 E269
+6C71 E26A
+6C72 E26B
+6C73 E26C
+6C74 E26D
+6C75 E26E
+6C76 E26F
+6C77 E270
+6C78 E271
+6C79 E272
+6C7A E273
+6C7B E274
+6C7C E275
+6C7D E276
+6C7E E277
+6C7F E278
+6C80 E279
+6C81 E27A
+6C82 E27B
+6C83 E27C
+6C84 E27D
+6C85 E27E
+6C86 E27F
+6C87 E280
+6C88 E281
+6C89 E282
+6C8A E283
+6C8B E284
+6C8C E285
+6C8D E286
+6C8E E287
+6C8F E288
+6C90 E289
+6C91 E28A
+6C92 E28B
+6C93 E28C
+6C94 E28D
+6C95 E28E
+6C96 E28F
+6C97 E290
+6C98 E291
+6C99 E292
+6C9A E293
+6C9B E294
+6C9C E295
+6C9D E296
+6C9E E297
+6C9F E298
+6CA0 E299
+6CA1 E29A
+6CA2 E29B
+6CA3 E29C
+6CA4 E29D
+6CA5 E29E
+6CA6 E29F
+6CA7 E2A0
+6CA8 E2A1
+6CA9 E2A2
+6CAA E2A3
+6CAB E2A4
+6CAC E2A5
+6CAD E2A6
+6CAE E2A7
+6CAF E2A8
+6CB0 E2A9
+6CB1 E2AA
+6CB2 E2AB
+6CB3 E2AC
+6CB4 E2AD
+6CB5 E2AE
+6CB6 E2AF
+6CB7 E2B0
+6CB8 E2B1
+6CB9 E2B2
+6CBA E2B3
+6CBB E2B4
+6CBC E2B5
+6CBD E2B6
+6CBE E2B7
+6CBF E2B8
+6CC0 E2B9
+6CC1 E2BA
+6CC2 E2BB
+6CC3 E2BC
+6CC4 E2BD
+6CC5 E2BE
+6CC6 E2BF
+6CC7 E2C0
+6CC8 E2C1
+6CC9 E2C2
+6CCA E2C3
+6CCB E2C4
+6CCC E2C5
+6CCD E2C6
+6CCE E2C7
+6CCF E2C8
+6CD0 E2C9
+6CD1 E2CA
+6CD2 E2CB
+6CD3 E2CC
+6CD4 E2CD
+6CD5 E2CE
+6CD6 E2CF
+6CD7 E2D0
+6CD8 E2D1
+6CD9 E2D2
+6CDA E2D3
+6CDB E2D4
+6CDC E2D5
+6CDD E2D6
+6CDE E2D7
+6CDF E2D8
+6CE0 E2D9
+6CE1 E2DA
+6CE2 E2DB
+6CE3 E2DC
+6CE4 E2DD
+6CE5 E2DE
+6CE6 E2DF
+6CE7 E2E0
+6CE8 E2E1
+6CE9 E2E2
+6CEA E2E3
+6CEB E2E4
+6CEC E2E5
+6CED E2E6
+6CEE E2E7
+6CEF E2E8
+6CF0 E2E9
+6CF1 E2EA
+6CF2 E2EB
+6CF3 E2EC
+6CF4 E2ED
+6CF5 E2EE
+6CF6 E2EF
+6CF7 E2F0
+6CF8 E2F1
+6CF9 E2F2
+6CFA E2F3
+6CFB E2F4
+6CFC E2F5
+6CFD E2F6
+6CFE E2F7
+6D41 E2F8
+6D42 E2F9
+6D43 E2FA
+6D44 E2FB
+6D45 E2FC
+6D46 E2FD
+6D47 E2FE
+6D48 E2FF
+6D49 E300
+6D4A E301
+6D4B E302
+6D4C E303
+6D4D E304
+6D4E E305
+6D4F E306
+6D50 E307
+6D51 E308
+6D52 E309
+6D53 E30A
+6D54 E30B
+6D55 E30C
+6D56 E30D
+6D57 E30E
+6D58 E30F
+6D59 E310
+6D5A E311
+6D5B E312
+6D5C E313
+6D5D E314
+6D5E E315
+6D5F E316
+6D60 E317
+6D61 E318
+6D62 E319
+6D63 E31A
+6D64 E31B
+6D65 E31C
+6D66 E31D
+6D67 E31E
+6D68 E31F
+6D69 E320
+6D6A E321
+6D6B E322
+6D6C E323
+6D6D E324
+6D6E E325
+6D6F E326
+6D70 E327
+6D71 E328
+6D72 E329
+6D73 E32A
+6D74 E32B
+6D75 E32C
+6D76 E32D
+6D77 E32E
+6D78 E32F
+6D79 E330
+6D7A E331
+6D7B E332
+6D7C E333
+6D7D E334
+6D7E E335
+6D7F E336
+6D80 E337
+6D81 E338
+6D82 E339
+6D83 E33A
+6D84 E33B
+6D85 E33C
+6D86 E33D
+6D87 E33E
+6D88 E33F
+6D89 E340
+6D8A E341
+6D8B E342
+6D8C E343
+6D8D E344
+6D8E E345
+6D8F E346
+6D90 E347
+6D91 E348
+6D92 E349
+6D93 E34A
+6D94 E34B
+6D95 E34C
+6D96 E34D
+6D97 E34E
+6D98 E34F
+6D99 E350
+6D9A E351
+6D9B E352
+6D9C E353
+6D9D E354
+6D9E E355
+6D9F E356
+6DA0 E357
+6DA1 E358
+6DA2 E359
+6DA3 E35A
+6DA4 E35B
+6DA5 E35C
+6DA6 E35D
+6DA7 E35E
+6DA8 E35F
+6DA9 E360
+6DAA E361
+6DAB E362
+6DAC E363
+6DAD E364
+6DAE E365
+6DAF E366
+6DB0 E367
+6DB1 E368
+6DB2 E369
+6DB3 E36A
+6DB4 E36B
+6DB5 E36C
+6DB6 E36D
+6DB7 E36E
+6DB8 E36F
+6DB9 E370
+6DBA E371
+6DBB E372
+6DBC E373
+6DBD E374
+6DBE E375
+6DBF E376
+6DC0 E377
+6DC1 E378
+6DC2 E379
+6DC3 E37A
+6DC4 E37B
+6DC5 E37C
+6DC6 E37D
+6DC7 E37E
+6DC8 E37F
+6DC9 E380
+6DCA E381
+6DCB E382
+6DCC E383
+6DCD E384
+6DCE E385
+6DCF E386
+6DD0 E387
+6DD1 E388
+6DD2 E389
+6DD3 E38A
+6DD4 E38B
+6DD5 E38C
+6DD6 E38D
+6DD7 E38E
+6DD8 E38F
+6DD9 E390
+6DDA E391
+6DDB E392
+6DDC E393
+6DDD E394
+6DDE E395
+6DDF E396
+6DE0 E397
+6DE1 E398
+6DE2 E399
+6DE3 E39A
+6DE4 E39B
+6DE5 E39C
+6DE6 E39D
+6DE7 E39E
+6DE8 E39F
+6DE9 E3A0
+6DEA E3A1
+6DEB E3A2
+6DEC E3A3
+6DED E3A4
+6DEE E3A5
+6DEF E3A6
+6DF0 E3A7
+6DF1 E3A8
+6DF2 E3A9
+6DF3 E3AA
+6DF4 E3AB
+6DF5 E3AC
+6DF6 E3AD
+6DF7 E3AE
+6DF8 E3AF
+6DF9 E3B0
+6DFA E3B1
+6DFB E3B2
+6DFC E3B3
+6DFD E3B4
+6DFE E3B5
+6E41 E3B6
+6E42 E3B7
+6E43 E3B8
+6E44 E3B9
+6E45 E3BA
+6E46 E3BB
+6E47 E3BC
+6E48 E3BD
+6E49 E3BE
+6E4A E3BF
+6E4B E3C0
+6E4C E3C1
+6E4D E3C2
+6E4E E3C3
+6E4F E3C4
+6E50 E3C5
+6E51 E3C6
+6E52 E3C7
+6E53 E3C8
+6E54 E3C9
+6E55 E3CA
+6E56 E3CB
+6E57 E3CC
+6E58 E3CD
+6E59 E3CE
+6E5A E3CF
+6E5B E3D0
+6E5C E3D1
+6E5D E3D2
+6E5E E3D3
+6E5F E3D4
+6E60 E3D5
+6E61 E3D6
+6E62 E3D7
+6E63 E3D8
+6E64 E3D9
+6E65 E3DA
+6E66 E3DB
+6E67 E3DC
+6E68 E3DD
+6E69 E3DE
+6E6A E3DF
+6E6B E3E0
+6E6C E3E1
+6E6D E3E2
+6E6E E3E3
+6E6F E3E4
+6E70 E3E5
+6E71 E3E6
+6E72 E3E7
+6E73 E3E8
+6E74 E3E9
+6E75 E3EA
+6E76 E3EB
+6E77 E3EC
+6E78 E3ED
+6E79 E3EE
+6E7A E3EF
+6E7B E3F0
+6E7C E3F1
+6E7D E3F2
+6E7E E3F3
+6E7F E3F4
+6E80 E3F5
+6E81 E3F6
+6E82 E3F7
+6E83 E3F8
+6E84 E3F9
+6E85 E3FA
+6E86 E3FB
+6E87 E3FC
+6E88 E3FD
+6E89 E3FE
+6E8A E3FF
+6E8B E400
+6E8C E401
+6E8D E402
+6E8E E403
+6E8F E404
+6E90 E405
+6E91 E406
+6E92 E407
+6E93 E408
+6E94 E409
+6E95 E40A
+6E96 E40B
+6E97 E40C
+6E98 E40D
+6E99 E40E
+6E9A E40F
+6E9B E410
+6E9C E411
+6E9D E412
+6E9E E413
+6E9F E414
+6EA0 E415
+6EA1 E416
+6EA2 E417
+6EA3 E418
+6EA4 E419
+6EA5 E41A
+6EA6 E41B
+6EA7 E41C
+6EA8 E41D
+6EA9 E41E
+6EAA E41F
+6EAB E420
+6EAC E421
+6EAD E422
+6EAE E423
+6EAF E424
+6EB0 E425
+6EB1 E426
+6EB2 E427
+6EB3 E428
+6EB4 E429
+6EB5 E42A
+6EB6 E42B
+6EB7 E42C
+6EB8 E42D
+6EB9 E42E
+6EBA E42F
+6EBB E430
+6EBC E431
+6EBD E432
+6EBE E433
+6EBF E434
+6EC0 E435
+6EC1 E436
+6EC2 E437
+6EC3 E438
+6EC4 E439
+6EC5 E43A
+6EC6 E43B
+6EC7 E43C
+6EC8 E43D
+6EC9 E43E
+6ECA E43F
+6ECB E440
+6ECC E441
+6ECD E442
+6ECE E443
+6ECF E444
+6ED0 E445
+6ED1 E446
+6ED2 E447
+6ED3 E448
+6ED4 E449
+6ED5 E44A
+6ED6 E44B
+6ED7 E44C
+6ED8 E44D
+6ED9 E44E
+6EDA E44F
+6EDB E450
+6EDC E451
+6EDD E452
+6EDE E453
+6EDF E454
+6EE0 E455
+6EE1 E456
+6EE2 E457
+6EE3 E458
+6EE4 E459
+6EE5 E45A
+6EE6 E45B
+6EE7 E45C
+6EE8 E45D
+6EE9 E45E
+6EEA E45F
+6EEB E460
+6EEC E461
+6EED E462
+6EEE E463
+6EEF E464
+6EF0 E465
+6EF1 E466
+6EF2 E467
+6EF3 E468
+6EF4 E469
+6EF5 E46A
+6EF6 E46B
+6EF7 E46C
+6EF8 E46D
+6EF9 E46E
+6EFA E46F
+6EFB E470
+6EFC E471
+6EFD E472
+6EFE E473
+6F41 E474
+6F42 E475
+6F43 E476
+6F44 E477
+6F45 E478
+6F46 E479
+6F47 E47A
+6F48 E47B
+6F49 E47C
+6F4A E47D
+6F4B E47E
+6F4C E47F
+6F4D E480
+6F4E E481
+6F4F E482
+6F50 E483
+6F51 E484
+6F52 E485
+6F53 E486
+6F54 E487
+6F55 E488
+6F56 E489
+6F57 E48A
+6F58 E48B
+6F59 E48C
+6F5A E48D
+6F5B E48E
+6F5C E48F
+6F5D E490
+6F5E E491
+6F5F E492
+6F60 E493
+6F61 E494
+6F62 E495
+6F63 E496
+6F64 E497
+6F65 E498
+6F66 E499
+6F67 E49A
+6F68 E49B
+6F69 E49C
+6F6A E49D
+6F6B E49E
+6F6C E49F
+6F6D E4A0
+6F6E E4A1
+6F6F E4A2
+6F70 E4A3
+6F71 E4A4
+6F72 E4A5
+6F73 E4A6
+6F74 E4A7
+6F75 E4A8
+6F76 E4A9
+6F77 E4AA
+6F78 E4AB
+6F79 E4AC
+6F7A E4AD
+6F7B E4AE
+6F7C E4AF
+6F7D E4B0
+6F7E E4B1
+6F7F E4B2
+6F80 E4B3
+6F81 E4B4
+6F82 E4B5
+6F83 E4B6
+6F84 E4B7
+6F85 E4B8
+6F86 E4B9
+6F87 E4BA
+6F88 E4BB
+6F89 E4BC
+6F8A E4BD
+6F8B E4BE
+6F8C E4BF
+6F8D E4C0
+6F8E E4C1
+6F8F E4C2
+6F90 E4C3
+6F91 E4C4
+6F92 E4C5
+6F93 E4C6
+6F94 E4C7
+6F95 E4C8
+6F96 E4C9
+6F97 E4CA
+6F98 E4CB
+6F99 E4CC
+6F9A E4CD
+6F9B E4CE
+6F9C E4CF
+6F9D E4D0
+6F9E E4D1
+6F9F E4D2
+6FA0 E4D3
+6FA1 E4D4
+6FA2 E4D5
+6FA3 E4D6
+6FA4 E4D7
+6FA5 E4D8
+6FA6 E4D9
+6FA7 E4DA
+6FA8 E4DB
+6FA9 E4DC
+6FAA E4DD
+6FAB E4DE
+6FAC E4DF
+6FAD E4E0
+6FAE E4E1
+6FAF E4E2
+6FB0 E4E3
+6FB1 E4E4
+6FB2 E4E5
+6FB3 E4E6
+6FB4 E4E7
+6FB5 E4E8
+6FB6 E4E9
+6FB7 E4EA
+6FB8 E4EB
+6FB9 E4EC
+6FBA E4ED
+6FBB E4EE
+6FBC E4EF
+6FBD E4F0
+6FBE E4F1
+6FBF E4F2
+6FC0 E4F3
+6FC1 E4F4
+6FC2 E4F5
+6FC3 E4F6
+6FC4 E4F7
+6FC5 E4F8
+6FC6 E4F9
+6FC7 E4FA
+6FC8 E4FB
+6FC9 E4FC
+6FCA E4FD
+6FCB E4FE
+6FCC E4FF
+6FCD E500
+6FCE E501
+6FCF E502
+6FD0 E503
+6FD1 E504
+6FD2 E505
+6FD3 E506
+6FD4 E507
+6FD5 E508
+6FD6 E509
+6FD7 E50A
+6FD8 E50B
+6FD9 E50C
+6FDA E50D
+6FDB E50E
+6FDC E50F
+6FDD E510
+6FDE E511
+6FDF E512
+6FE0 E513
+6FE1 E514
+6FE2 E515
+6FE3 E516
+6FE4 E517
+6FE5 E518
+6FE6 E519
+6FE7 E51A
+6FE8 E51B
+6FE9 E51C
+6FEA E51D
+6FEB E51E
+6FEC E51F
+6FED E520
+6FEE E521
+6FEF E522
+6FF0 E523
+6FF1 E524
+6FF2 E525
+6FF3 E526
+6FF4 E527
+6FF5 E528
+6FF6 E529
+6FF7 E52A
+6FF8 E52B
+6FF9 E52C
+6FFA E52D
+6FFB E52E
+6FFC E52F
+6FFD E530
+6FFE E531
+7041 E532
+7042 E533
+7043 E534
+7044 E535
+7045 E536
+7046 E537
+7047 E538
+7048 E539
+7049 E53A
+704A E53B
+704B E53C
+704C E53D
+704D E53E
+704E E53F
+704F E540
+7050 E541
+7051 E542
+7052 E543
+7053 E544
+7054 E545
+7055 E546
+7056 E547
+7057 E548
+7058 E549
+7059 E54A
+705A E54B
+705B E54C
+705C E54D
+705D E54E
+705E E54F
+705F E550
+7060 E551
+7061 E552
+7062 E553
+7063 E554
+7064 E555
+7065 E556
+7066 E557
+7067 E558
+7068 E559
+7069 E55A
+706A E55B
+706B E55C
+706C E55D
+706D E55E
+706E E55F
+706F E560
+7070 E561
+7071 E562
+7072 E563
+7073 E564
+7074 E565
+7075 E566
+7076 E567
+7077 E568
+7078 E569
+7079 E56A
+707A E56B
+707B E56C
+707C E56D
+707D E56E
+707E E56F
+707F E570
+7080 E571
+7081 E572
+7082 E573
+7083 E574
+7084 E575
+7085 E576
+7086 E577
+7087 E578
+7088 E579
+7089 E57A
+708A E57B
+708B E57C
+708C E57D
+708D E57E
+708E E57F
+708F E580
+7090 E581
+7091 E582
+7092 E583
+7093 E584
+7094 E585
+7095 E586
+7096 E587
+7097 E588
+7098 E589
+7099 E58A
+709A E58B
+709B E58C
+709C E58D
+709D E58E
+709E E58F
+709F E590
+70A0 E591
+70A1 E592
+70A2 E593
+70A3 E594
+70A4 E595
+70A5 E596
+70A6 E597
+70A7 E598
+70A8 E599
+70A9 E59A
+70AA E59B
+70AB E59C
+70AC E59D
+70AD E59E
+70AE E59F
+70AF E5A0
+70B0 E5A1
+70B1 E5A2
+70B2 E5A3
+70B3 E5A4
+70B4 E5A5
+70B5 E5A6
+70B6 E5A7
+70B7 E5A8
+70B8 E5A9
+70B9 E5AA
+70BA E5AB
+70BB E5AC
+70BC E5AD
+70BD E5AE
+70BE E5AF
+70BF E5B0
+70C0 E5B1
+70C1 E5B2
+70C2 E5B3
+70C3 E5B4
+70C4 E5B5
+70C5 E5B6
+70C6 E5B7
+70C7 E5B8
+70C8 E5B9
+70C9 E5BA
+70CA E5BB
+70CB E5BC
+70CC E5BD
+70CD E5BE
+70CE E5BF
+70CF E5C0
+70D0 E5C1
+70D1 E5C2
+70D2 E5C3
+70D3 E5C4
+70D4 E5C5
+70D5 E5C6
+70D6 E5C7
+70D7 E5C8
+70D8 E5C9
+70D9 E5CA
+70DA E5CB
+70DB E5CC
+70DC E5CD
+70DD E5CE
+70DE E5CF
+70DF E5D0
+70E0 E5D1
+70E1 E5D2
+70E2 E5D3
+70E3 E5D4
+70E4 E5D5
+70E5 E5D6
+70E6 E5D7
+70E7 E5D8
+70E8 E5D9
+70E9 E5DA
+70EA E5DB
+70EB E5DC
+70EC E5DD
+70ED E5DE
+70EE E5DF
+70EF E5E0
+70F0 E5E1
+70F1 E5E2
+70F2 E5E3
+70F3 E5E4
+70F4 E5E5
+70F5 E5E6
+70F6 E5E7
+70F7 E5E8
+70F8 E5E9
+70F9 E5EA
+70FA E5EB
+70FB E5EC
+70FC E5ED
+70FD E5EE
+70FE E5EF
+7141 E5F0
+7142 E5F1
+7143 E5F2
+7144 E5F3
+7145 E5F4
+7146 E5F5
+7147 E5F6
+7148 E5F7
+7149 E5F8
+714A E5F9
+714B E5FA
+714C E5FB
+714D E5FC
+714E E5FD
+714F E5FE
+7150 E5FF
+7151 E600
+7152 E601
+7153 E602
+7154 E603
+7155 E604
+7156 E605
+7157 E606
+7158 E607
+7159 E608
+715A E609
+715B E60A
+715C E60B
+715D E60C
+715E E60D
+715F E60E
+7160 E60F
+7161 E610
+7162 E611
+7163 E612
+7164 E613
+7165 E614
+7166 E615
+7167 E616
+7168 E617
+7169 E618
+716A E619
+716B E61A
+716C E61B
+716D E61C
+716E E61D
+716F E61E
+7170 E61F
+7171 E620
+7172 E621
+7173 E622
+7174 E623
+7175 E624
+7176 E625
+7177 E626
+7178 E627
+7179 E628
+717A E629
+717B E62A
+717C E62B
+717D E62C
+717E E62D
+717F E62E
+7180 E62F
+7181 E630
+7182 E631
+7183 E632
+7184 E633
+7185 E634
+7186 E635
+7187 E636
+7188 E637
+7189 E638
+718A E639
+718B E63A
+718C E63B
+718D E63C
+718E E63D
+718F E63E
+7190 E63F
+7191 E640
+7192 E641
+7193 E642
+7194 E643
+7195 E644
+7196 E645
+7197 E646
+7198 E647
+7199 E648
+719A E649
+719B E64A
+719C E64B
+719D E64C
+719E E64D
+719F E64E
+71A0 E64F
+71A1 E650
+71A2 E651
+71A3 E652
+71A4 E653
+71A5 E654
+71A6 E655
+71A7 E656
+71A8 E657
+71A9 E658
+71AA E659
+71AB E65A
+71AC E65B
+71AD E65C
+71AE E65D
+71AF E65E
+71B0 E65F
+71B1 E660
+71B2 E661
+71B3 E662
+71B4 E663
+71B5 E664
+71B6 E665
+71B7 E666
+71B8 E667
+71B9 E668
+71BA E669
+71BB E66A
+71BC E66B
+71BD E66C
+71BE E66D
+71BF E66E
+71C0 E66F
+71C1 E670
+71C2 E671
+71C3 E672
+71C4 E673
+71C5 E674
+71C6 E675
+71C7 E676
+71C8 E677
+71C9 E678
+71CA E679
+71CB E67A
+71CC E67B
+71CD E67C
+71CE E67D
+71CF E67E
+71D0 E67F
+71D1 E680
+71D2 E681
+71D3 E682
+71D4 E683
+71D5 E684
+71D6 E685
+71D7 E686
+71D8 E687
+71D9 E688
+71DA E689
+71DB E68A
+71DC E68B
+71DD E68C
+71DE E68D
+71DF E68E
+71E0 E68F
+71E1 E690
+71E2 E691
+71E3 E692
+71E4 E693
+71E5 E694
+71E6 E695
+71E7 E696
+71E8 E697
+71E9 E698
+71EA E699
+71EB E69A
+71EC E69B
+71ED E69C
+71EE E69D
+71EF E69E
+71F0 E69F
+71F1 E6A0
+71F2 E6A1
+71F3 E6A2
+71F4 E6A3
+71F5 E6A4
+71F6 E6A5
+71F7 E6A6
+71F8 E6A7
+71F9 E6A8
+71FA E6A9
+71FB E6AA
+71FC E6AB
+71FD E6AC
+71FE E6AD
+7241 E6AE
+7242 E6AF
+7243 E6B0
+7244 E6B1
+7245 E6B2
+7246 E6B3
+7247 E6B4
+7248 E6B5
+7249 E6B6
+724A E6B7
+724B E6B8
+724C E6B9
+724D E6BA
+724E E6BB
+724F E6BC
+7250 E6BD
+7251 E6BE
+7252 E6BF
+7253 E6C0
+7254 E6C1
+7255 E6C2
+7256 E6C3
+7257 E6C4
+7258 E6C5
+7259 E6C6
+725A E6C7
+725B E6C8
+725C E6C9
+725D E6CA
+725E E6CB
+725F E6CC
+7260 E6CD
+7261 E6CE
+7262 E6CF
+7263 E6D0
+7264 E6D1
+7265 E6D2
+7266 E6D3
+7267 E6D4
+7268 E6D5
+7269 E6D6
+726A E6D7
+726B E6D8
+726C E6D9
+726D E6DA
+726E E6DB
+726F E6DC
+7270 E6DD
+7271 E6DE
+7272 E6DF
+7273 E6E0
+7274 E6E1
+7275 E6E2
+7276 E6E3
+7277 E6E4
+7278 E6E5
+7279 E6E6
+727A E6E7
+727B E6E8
+727C E6E9
+727D E6EA
+727E E6EB
+727F E6EC
+7280 E6ED
+7281 E6EE
+7282 E6EF
+7283 E6F0
+7284 E6F1
+7285 E6F2
+7286 E6F3
+7287 E6F4
+7288 E6F5
+7289 E6F6
+728A E6F7
+728B E6F8
+728C E6F9
+728D E6FA
+728E E6FB
+728F E6FC
+7290 E6FD
+7291 E6FE
+7292 E6FF
+7293 E700
+7294 E701
+7295 E702
+7296 E703
+7297 E704
+7298 E705
+7299 E706
+729A E707
+729B E708
+729C E709
+729D E70A
+729E E70B
+729F E70C
+72A0 E70D
+72A1 E70E
+72A2 E70F
+72A3 E710
+72A4 E711
+72A5 E712
+72A6 E713
+72A7 E714
+72A8 E715
+72A9 E716
+72AA E717
+72AB E718
+72AC E719
+72AD E71A
+72AE E71B
+72AF E71C
+72B0 E71D
+72B1 E71E
+72B2 E71F
+72B3 E720
+72B4 E721
+72B5 E722
+72B6 E723
+72B7 E724
+72B8 E725
+72B9 E726
+72BA E727
+72BB E728
+72BC E729
+72BD E72A
+72BE E72B
+72BF E72C
+72C0 E72D
+72C1 E72E
+72C2 E72F
+72C3 E730
+72C4 E731
+72C5 E732
+72C6 E733
+72C7 E734
+72C8 E735
+72C9 E736
+72CA E737
+72CB E738
+72CC E739
+72CD E73A
+72CE E73B
+72CF E73C
+72D0 E73D
+72D1 E73E
+72D2 E73F
+72D3 E740
+72D4 E741
+72D5 E742
+72D6 E743
+72D7 E744
+72D8 E745
+72D9 E746
+72DA E747
+72DB E748
+72DC E749
+72DD E74A
+72DE E74B
+72DF E74C
+72E0 E74D
+72E1 E74E
+72E2 E74F
+72E3 E750
+72E4 E751
+72E5 E752
+72E6 E753
+72E7 E754
+72E8 E755
+72E9 E756
+72EA E757
+72EB E758
+72EC E759
+72ED E75A
+72EE E75B
+72EF E75C
+72F0 E75D
+72F1 E75E
+72F2 E75F
+72F3 E760
+72F4 E761
+72F5 E762
+72F6 E763
+72F7 E764
+72F8 E765
+72F9 E766
+72FA E767
+72FB E768
+72FC E769
+72FD E76A
+72FE E76B
+7341 E76C
+7342 E76D
+7343 E76E
+7344 E76F
+7345 E770
+7346 E771
+7347 E772
+7348 E773
+7349 E774
+734A E775
+734B E776
+734C E777
+734D E778
+734E E779
+734F E77A
+7350 E77B
+7351 E77C
+7352 E77D
+7353 E77E
+7354 E77F
+7355 E780
+7356 E781
+7357 E782
+7358 E783
+7359 E784
+735A E785
+735B E786
+735C E787
+735D E788
+735E E789
+735F E78A
+7360 E78B
+7361 E78C
+7362 E78D
+7363 E78E
+7364 E78F
+7365 E790
+7366 E791
+7367 E792
+7368 E793
+7369 E794
+736A E795
+736B E796
+736C E797
+736D E798
+736E E799
+736F E79A
+7370 E79B
+7371 E79C
+7372 E79D
+7373 E79E
+7374 E79F
+7375 E7A0
+7376 E7A1
+7377 E7A2
+7378 E7A3
+7379 E7A4
+737A E7A5
+737B E7A6
+737C E7A7
+737D E7A8
+737E E7A9
+737F E7AA
+7380 E7AB
+7381 E7AC
+7382 E7AD
+7383 E7AE
+7384 E7AF
+7385 E7B0
+7386 E7B1
+7387 E7B2
+7388 E7B3
+7389 E7B4
+738A E7B5
+738B E7B6
+738C E7B7
+738D E7B8
+738E E7B9
+738F E7BA
+7390 E7BB
+7391 E7BC
+7392 E7BD
+7393 E7BE
+7394 E7BF
+7395 E7C0
+7396 E7C1
+7397 E7C2
+7398 E7C3
+7399 E7C4
+739A E7C5
+739B E7C6
+739C E7C7
+739D E7C8
+739E E7C9
+739F E7CA
+73A0 E7CB
+73A1 E7CC
+73A2 E7CD
+73A3 E7CE
+73A4 E7CF
+73A5 E7D0
+73A6 E7D1
+73A7 E7D2
+73A8 E7D3
+73A9 E7D4
+73AA E7D5
+73AB E7D6
+73AC E7D7
+73AD E7D8
+73AE E7D9
+73AF E7DA
+73B0 E7DB
+73B1 E7DC
+73B2 E7DD
+73B3 E7DE
+73B4 E7DF
+73B5 E7E0
+73B6 E7E1
+73B7 E7E2
+73B8 E7E3
+73B9 E7E4
+73BA E7E5
+73BB E7E6
+73BC E7E7
+73BD E7E8
+73BE E7E9
+73BF E7EA
+73C0 E7EB
+73C1 E7EC
+73C2 E7ED
+73C3 E7EE
+73C4 E7EF
+73C5 E7F0
+73C6 E7F1
+73C7 E7F2
+73C8 E7F3
+73C9 E7F4
+73CA E7F5
+73CB E7F6
+73CC E7F7
+73CD E7F8
+73CE E7F9
+73CF E7FA
+73D0 E7FB
+73D1 E7FC
+73D2 E7FD
+73D3 E7FE
+73D4 E7FF
+73D5 E800
+73D6 E801
+73D7 E802
+73D8 E803
+73D9 E804
+73DA E805
+73DB E806
+73DC E807
+73DD E808
+73DE E809
+73DF E80A
+73E0 E80B
+73E1 E80C
+73E2 E80D
+73E3 E80E
+73E4 E80F
+73E5 E810
+73E6 E811
+73E7 E812
+73E8 E813
+73E9 E814
+73EA E815
+73EB E816
+73EC E817
+73ED E818
+73EE E819
+73EF E81A
+73F0 E81B
+73F1 E81C
+73F2 E81D
+73F3 E81E
+73F4 E81F
+73F5 E820
+73F6 E821
+73F7 E822
+73F8 E823
+73F9 E824
+73FA E825
+73FB E826
+73FC E827
+73FD E828
+73FE E829
+7441 E82A
+7442 E82B
+7443 E82C
+7444 E82D
+7445 E82E
+7446 E82F
+7447 E830
+7448 E831
+7449 E832
+744A E833
+744B E834
+744C E835
+744D E836
+744E E837
+744F E838
+7450 E839
+7451 E83A
+7452 E83B
+7453 E83C
+7454 E83D
+7455 E83E
+7456 E83F
+7457 E840
+7458 E841
+7459 E842
+745A E843
+745B E844
+745C E845
+745D E846
+745E E847
+745F E848
+7460 E849
+7461 E84A
+7462 E84B
+7463 E84C
+7464 E84D
+7465 E84E
+7466 E84F
+7467 E850
+7468 E851
+7469 E852
+746A E853
+746B E854
+746C E855
+746D E856
+746E E857
+746F E858
+7470 E859
+7471 E85A
+7472 E85B
+7473 E85C
+7474 E85D
+7475 E85E
+7476 E85F
+7477 E860
+7478 E861
+7479 E862
+747A E863
+747B E864
+747C E865
+747D E866
+747E E867
+747F E868
+7480 E869
+7481 E86A
+7482 E86B
+7483 E86C
+7484 E86D
+7485 E86E
+7486 E86F
+7487 E870
+7488 E871
+7489 E872
+748A E873
+748B E874
+748C E875
+748D E876
+748E E877
+748F E878
+7490 E879
+7491 E87A
+7492 E87B
+7493 E87C
+7494 E87D
+7495 E87E
+7496 E87F
+7497 E880
+7498 E881
+7499 E882
+749A E883
+749B E884
+749C E885
+749D E886
+749E E887
+749F E888
+74A0 E889
+74A1 E88A
+74A2 E88B
+74A3 E88C
+74A4 E88D
+74A5 E88E
+74A6 E88F
+74A7 E890
+74A8 E891
+74A9 E892
+74AA E893
+74AB E894
+74AC E895
+74AD E896
+74AE E897
+74AF E898
+74B0 E899
+74B1 E89A
+74B2 E89B
+74B3 E89C
+74B4 E89D
+74B5 E89E
+74B6 E89F
+74B7 E8A0
+74B8 E8A1
+74B9 E8A2
+74BA E8A3
+74BB E8A4
+74BC E8A5
+74BD E8A6
+74BE E8A7
+74BF E8A8
+74C0 E8A9
+74C1 E8AA
+74C2 E8AB
+74C3 E8AC
+74C4 E8AD
+74C5 E8AE
+74C6 E8AF
+74C7 E8B0
+74C8 E8B1
+74C9 E8B2
+74CA E8B3
+74CB E8B4
+74CC E8B5
+74CD E8B6
+74CE E8B7
+74CF E8B8
+74D0 E8B9
+74D1 E8BA
+74D2 E8BB
+74D3 E8BC
+74D4 E8BD
+74D5 E8BE
+74D6 E8BF
+74D7 E8C0
+74D8 E8C1
+74D9 E8C2
+74DA E8C3
+74DB E8C4
+74DC E8C5
+74DD E8C6
+74DE E8C7
+74DF E8C8
+74E0 E8C9
+74E1 E8CA
+74E2 E8CB
+74E3 E8CC
+74E4 E8CD
+74E5 E8CE
+74E6 E8CF
+74E7 E8D0
+74E8 E8D1
+74E9 E8D2
+74EA E8D3
+74EB E8D4
+74EC E8D5
+74ED E8D6
+74EE E8D7
+74EF E8D8
+74F0 E8D9
+74F1 E8DA
+74F2 E8DB
+74F3 E8DC
+74F4 E8DD
+74F5 E8DE
+74F6 E8DF
+74F7 E8E0
+74F8 E8E1
+74F9 E8E2
+74FA E8E3
+74FB E8E4
+74FC E8E5
+74FD E8E6
+74FE E8E7
+7541 E8E8
+7542 E8E9
+7543 E8EA
+7544 E8EB
+7545 E8EC
+7546 E8ED
+7547 E8EE
+7548 E8EF
+7549 E8F0
+754A E8F1
+754B E8F2
+754C E8F3
+754D E8F4
+754E E8F5
+754F E8F6
+7550 E8F7
+7551 E8F8
+7552 E8F9
+7553 E8FA
+7554 E8FB
+7555 E8FC
+7556 E8FD
+7557 E8FE
+7558 E8FF
+7559 E900
+755A E901
+755B E902
+755C E903
+755D E904
+755E E905
+755F E906
+7560 E907
+7561 E908
+7562 E909
+7563 E90A
+7564 E90B
+7565 E90C
+7566 E90D
+7567 E90E
+7568 E90F
+7569 E910
+756A E911
+756B E912
+756C E913
+756D E914
+756E E915
+756F E916
+7570 E917
+7571 E918
+7572 E919
+7573 E91A
+7574 E91B
+7575 E91C
+7576 E91D
+7577 E91E
+7578 E91F
+7579 E920
+757A E921
+757B E922
+757C E923
+757D E924
+757E E925
+757F E926
+7580 E927
+7581 E928
+7582 E929
+7583 E92A
+7584 E92B
+7585 E92C
+7586 E92D
+7587 E92E
+7588 E92F
+7589 E930
+758A E931
+758B E932
+758C E933
+758D E934
+758E E935
+758F E936
+7590 E937
+7591 E938
+7592 E939
+7593 E93A
+7594 E93B
+7595 E93C
+7596 E93D
+7597 E93E
+7598 E93F
+7599 E940
+759A E941
+759B E942
+759C E943
+759D E944
+759E E945
+759F E946
+75A0 E947
+75A1 E948
+75A2 E949
+75A3 E94A
+75A4 E94B
+75A5 E94C
+75A6 E94D
+75A7 E94E
+75A8 E94F
+75A9 E950
+75AA E951
+75AB E952
+75AC E953
+75AD E954
+75AE E955
+75AF E956
+75B0 E957
+75B1 E958
+75B2 E959
+75B3 E95A
+75B4 E95B
+75B5 E95C
+75B6 E95D
+75B7 E95E
+75B8 E95F
+75B9 E960
+75BA E961
+75BB E962
+75BC E963
+75BD E964
+75BE E965
+75BF E966
+75C0 E967
+75C1 E968
+75C2 E969
+75C3 E96A
+75C4 E96B
+75C5 E96C
+75C6 E96D
+75C7 E96E
+75C8 E96F
+75C9 E970
+75CA E971
+75CB E972
+75CC E973
+75CD E974
+75CE E975
+75CF E976
+75D0 E977
+75D1 E978
+75D2 E979
+75D3 E97A
+75D4 E97B
+75D5 E97C
+75D6 E97D
+75D7 E97E
+75D8 E97F
+75D9 E980
+75DA E981
+75DB E982
+75DC E983
+75DD E984
+75DE E985
+75DF E986
+75E0 E987
+75E1 E988
+75E2 E989
+75E3 E98A
+75E4 E98B
+75E5 E98C
+75E6 E98D
+75E7 E98E
+75E8 E98F
+75E9 E990
+75EA E991
+75EB E992
+75EC E993
+75ED E994
+75EE E995
+75EF E996
+75F0 E997
+75F1 E998
+75F2 E999
+75F3 E99A
+75F4 E99B
+75F5 E99C
+75F6 E99D
+75F7 E99E
+75F8 E99F
+75F9 E9A0
+75FA E9A1
+75FB E9A2
+75FC E9A3
+75FD E9A4
+75FE E9A5
+7641 E9A6
+7642 E9A7
+7643 E9A8
+7644 E9A9
+7645 E9AA
+7646 E9AB
+7647 E9AC
+7648 E9AD
+7649 E9AE
+764A E9AF
+764B E9B0
+764C E9B1
+764D E9B2
+764E E9B3
+764F E9B4
+7650 E9B5
+7651 E9B6
+7652 E9B7
+7653 E9B8
+7654 E9B9
+7655 E9BA
+7656 E9BB
+7657 E9BC
+7658 E9BD
+7659 E9BE
+765A E9BF
+765B E9C0
+765C E9C1
+765D E9C2
+765E E9C3
+765F E9C4
+7660 E9C5
+7661 E9C6
+7662 E9C7
+7663 E9C8
+7664 E9C9
+7665 E9CA
+7666 E9CB
+7667 E9CC
+7668 E9CD
+7669 E9CE
+766A E9CF
+766B E9D0
+766C E9D1
+766D E9D2
+766E E9D3
+766F E9D4
+7670 E9D5
+7671 E9D6
+7672 E9D7
+7673 E9D8
+7674 E9D9
+7675 E9DA
+7676 E9DB
+7677 E9DC
+7678 E9DD
+7679 E9DE
+767A E9DF
+767B E9E0
+767C E9E1
+767D E9E2
+767E E9E3
+767F E9E4
+7680 E9E5
+7681 E9E6
+7682 E9E7
+7683 E9E8
+7684 E9E9
+7685 E9EA
+7686 E9EB
+7687 E9EC
+7688 E9ED
+7689 E9EE
+768A E9EF
+768B E9F0
+768C E9F1
+768D E9F2
+768E E9F3
+768F E9F4
+7690 E9F5
+7691 E9F6
+7692 E9F7
+7693 E9F8
+7694 E9F9
+7695 E9FA
+7696 E9FB
+7697 E9FC
+7698 E9FD
+7699 E9FE
+769A E9FF
+769B EA00
+769C EA01
+769D EA02
+769E EA03
+769F EA04
+76A0 EA05
+76A1 EA06
+76A2 EA07
+76A3 EA08
+76A4 EA09
+76A5 EA0A
+76A6 EA0B
+76A7 EA0C
+76A8 EA0D
+76A9 EA0E
+76AA EA0F
+76AB EA10
+76AC EA11
+76AD EA12
+76AE EA13
+76AF EA14
+76B0 EA15
+76B1 EA16
+76B2 EA17
+76B3 EA18
+76B4 EA19
+76B5 EA1A
+76B6 EA1B
+76B7 EA1C
+76B8 EA1D
+76B9 EA1E
+76BA EA1F
+76BB EA20
+76BC EA21
+76BD EA22
+76BE EA23
+76BF EA24
+76C0 EA25
+76C1 EA26
+76C2 EA27
+76C3 EA28
+76C4 EA29
+76C5 EA2A
+76C6 EA2B
+76C7 EA2C
+76C8 EA2D
+76C9 EA2E
+76CA EA2F
+76CB EA30
+76CC EA31
+76CD EA32
+76CE EA33
+76CF EA34
+76D0 EA35
+76D1 EA36
+76D2 EA37
+76D3 EA38
+76D4 EA39
+76D5 EA3A
+76D6 EA3B
+76D7 EA3C
+76D8 EA3D
+76D9 EA3E
+76DA EA3F
+76DB EA40
+76DC EA41
+76DD EA42
+76DE EA43
+76DF EA44
+76E0 EA45
+76E1 EA46
+76E2 EA47
+76E3 EA48
+76E4 EA49
+76E5 EA4A
+76E6 EA4B
+76E7 EA4C
+76E8 EA4D
+76E9 EA4E
+76EA EA4F
+76EB EA50
+76EC EA51
+76ED EA52
+76EE EA53
+76EF EA54
+76F0 EA55
+76F1 EA56
+76F2 EA57
+76F3 EA58
+76F4 EA59
+76F5 EA5A
+76F6 EA5B
+76F7 EA5C
+76F8 EA5D
+76F9 EA5E
+76FA EA5F
+76FB EA60
+76FC EA61
+76FD EA62
+76FE EA63
+7741 EA64
+7742 EA65
+7743 EA66
+7744 EA67
+7745 EA68
+7746 EA69
+7747 EA6A
+7748 EA6B
+7749 EA6C
+774A EA6D
+774B EA6E
+774C EA6F
+774D EA70
+774E EA71
+774F EA72
+7750 EA73
+7751 EA74
+7752 EA75
+7753 EA76
+7754 EA77
+7755 EA78
+7756 EA79
+7757 EA7A
+7758 EA7B
+7759 EA7C
+775A EA7D
+775B EA7E
+775C EA7F
+775D EA80
+775E EA81
+775F EA82
+7760 EA83
+7761 EA84
+7762 EA85
+7763 EA86
+7764 EA87
+7765 EA88
+7766 EA89
+7767 EA8A
+7768 EA8B
+7769 EA8C
+776A EA8D
+776B EA8E
+776C EA8F
+776D EA90
+776E EA91
+776F EA92
+7770 EA93
+7771 EA94
+7772 EA95
+7773 EA96
+7774 EA97
+7775 EA98
+7776 EA99
+7777 EA9A
+7778 EA9B
+7779 EA9C
+777A EA9D
+777B EA9E
+777C EA9F
+777D EAA0
+777E EAA1
+777F EAA2
+7780 EAA3
+7781 EAA4
+7782 EAA5
+7783 EAA6
+7784 EAA7
+7785 EAA8
+7786 EAA9
+7787 EAAA
+7788 EAAB
+7789 EAAC
+778A EAAD
+778B EAAE
+778C EAAF
+778D EAB0
+778E EAB1
+778F EAB2
+7790 EAB3
+7791 EAB4
+7792 EAB5
+7793 EAB6
+7794 EAB7
+7795 EAB8
+7796 EAB9
+7797 EABA
+7798 EABB
+7799 EABC
+779A EABD
+779B EABE
+779C EABF
+779D EAC0
+779E EAC1
+779F EAC2
+77A0 EAC3
+77A1 EAC4
+77A2 EAC5
+77A3 EAC6
+77A4 EAC7
+77A5 EAC8
+77A6 EAC9
+77A7 EACA
+77A8 EACB
+77A9 EACC
+77AA EACD
+77AB EACE
+77AC EACF
+77AD EAD0
+77AE EAD1
+77AF EAD2
+77B0 EAD3
+77B1 EAD4
+77B2 EAD5
+77B3 EAD6
+77B4 EAD7
+77B5 EAD8
+77B6 EAD9
+77B7 EADA
+77B8 EADB
+77B9 EADC
+77BA EADD
+77BB EADE
+77BC EADF
+77BD EAE0
+77BE EAE1
+77BF EAE2
+77C0 EAE3
+77C1 EAE4
+77C2 EAE5
+77C3 EAE6
+77C4 EAE7
+77C5 EAE8
+77C6 EAE9
+77C7 EAEA
+77C8 EAEB
+77C9 EAEC
+77CA EAED
+77CB EAEE
+77CC EAEF
+77CD EAF0
+77CE EAF1
+77CF EAF2
+77D0 EAF3
+77D1 EAF4
+77D2 EAF5
+77D3 EAF6
+77D4 EAF7
+77D5 EAF8
+77D6 EAF9
+77D7 EAFA
+77D8 EAFB
+77D9 EAFC
+77DA EAFD
+77DB EAFE
+77DC EAFF
+77DD EB00
+77DE EB01
+77DF EB02
+77E0 EB03
+77E1 EB04
+77E2 EB05
+77E3 EB06
+77E4 EB07
+77E5 EB08
+77E6 EB09
+77E7 EB0A
+77E8 EB0B
+77E9 EB0C
+77EA EB0D
+77EB EB0E
+77EC EB0F
+77ED EB10
+77EE EB11
+77EF EB12
+77F0 EB13
+77F1 EB14
+77F2 EB15
+77F3 EB16
+77F4 EB17
+77F5 EB18
+77F6 EB19
+77F7 EB1A
+77F8 EB1B
+77F9 EB1C
+77FA EB1D
+77FB EB1E
+77FC EB1F
+77FD EB20
+77FE EB21
+7841 EB22
+7842 EB23
+7843 EB24
+7844 EB25
+7845 EB26
+7846 EB27
+7847 EB28
+7848 EB29
+7849 EB2A
+784A EB2B
+784B EB2C
+784C EB2D
+784D EB2E
+784E EB2F
+784F EB30
+7850 EB31
+7851 EB32
+7852 EB33
+7853 EB34
+7854 EB35
+7855 EB36
+7856 EB37
+7857 EB38
+7858 EB39
+7859 EB3A
+785A EB3B
+785B EB3C
+785C EB3D
+785D EB3E
+785E EB3F
+785F EB40
+7860 EB41
+7861 EB42
+7862 EB43
+7863 EB44
+7864 EB45
+7865 EB46
+7866 EB47
+7867 EB48
+7868 EB49
+7869 EB4A
+786A EB4B
+786B EB4C
+786C EB4D
+786D EB4E
+786E EB4F
+786F EB50
+7870 EB51
+7871 EB52
+7872 EB53
+7873 EB54
+7874 EB55
+7875 EB56
+7876 EB57
+7877 EB58
+7878 EB59
+7879 EB5A
+787A EB5B
+787B EB5C
+787C EB5D
+787D EB5E
+787E EB5F
+787F EB60
+7880 EB61
+7881 EB62
+7882 EB63
+7883 EB64
+7884 EB65
+7885 EB66
+7886 EB67
+7887 EB68
+7888 EB69
+7889 EB6A
+788A EB6B
+788B EB6C
+788C EB6D
+788D EB6E
+788E EB6F
+788F EB70
+7890 EB71
+7891 EB72
+7892 EB73
+7893 EB74
+7894 EB75
+7895 EB76
+7896 EB77
+7897 EB78
+7898 EB79
+7899 EB7A
+789A EB7B
+789B EB7C
+789C EB7D
+789D EB7E
+789E EB7F
+789F EB80
+78A0 EB81
+78A1 EB82
+78A2 EB83
+78A3 EB84
+78A4 EB85
+78A5 EB86
+78A6 EB87
+78A7 EB88
+78A8 EB89
+78A9 EB8A
+78AA EB8B
+78AB EB8C
+78AC EB8D
+78AD EB8E
+78AE EB8F
+78AF EB90
+78B0 EB91
+78B1 EB92
+78B2 EB93
+78B3 EB94
+78B4 EB95
+78B5 EB96
+78B6 EB97
+78B7 EB98
+78B8 EB99
+78B9 EB9A
+78BA EB9B
+78BB EB9C
+78BC EB9D
+78BD EB9E
+78BE EB9F
+78BF EBA0
+78C0 EBA1
+78C1 EBA2
+78C2 EBA3
+78C3 EBA4
+78C4 EBA5
+78C5 EBA6
+78C6 EBA7
+78C7 EBA8
+78C8 EBA9
+78C9 EBAA
+78CA EBAB
+78CB EBAC
+78CC EBAD
+78CD EBAE
+78CE EBAF
+78CF EBB0
+78D0 EBB1
+78D1 EBB2
+78D2 EBB3
+78D3 EBB4
+78D4 EBB5
+78D5 EBB6
+78D6 EBB7
+78D7 EBB8
+78D8 EBB9
+78D9 EBBA
+78DA EBBB
+78DB EBBC
+78DC EBBD
+78DD EBBE
+78DE EBBF
+78DF EBC0
+78E0 EBC1
+78E1 EBC2
+78E2 EBC3
+78E3 EBC4
+78E4 EBC5
+78E5 EBC6
+78E6 EBC7
+78E7 EBC8
+78E8 EBC9
+78E9 EBCA
+78EA EBCB
+78EB EBCC
+78EC EBCD
+78ED EBCE
+78EE EBCF
+78EF EBD0
+78F0 EBD1
+78F1 EBD2
+78F2 EBD3
+78F3 EBD4
+78F4 EBD5
+78F5 EBD6
+78F6 EBD7
+78F7 EBD8
+78F8 EBD9
+78F9 EBDA
+78FA EBDB
+78FB EBDC
+78FC EBDD
+78FD EBDE
+78FE EBDF
+7941 EBE0
+7942 EBE1
+7943 EBE2
+7944 EBE3
+7945 EBE4
+7946 EBE5
+7947 EBE6
+7948 EBE7
+7949 EBE8
+794A EBE9
+794B EBEA
+794C EBEB
+794D EBEC
+794E EBED
+794F EBEE
+7950 EBEF
+7951 EBF0
+7952 EBF1
+7953 EBF2
+7954 EBF3
+7955 EBF4
+7956 EBF5
+7957 EBF6
+7958 EBF7
+7959 EBF8
+795A EBF9
+795B EBFA
+795C EBFB
+795D EBFC
+795E EBFD
+795F EBFE
+7960 EBFF
+7961 EC00
+7962 EC01
+7963 EC02
+7964 EC03
+7965 EC04
+7966 EC05
+7967 EC06
+7968 EC07
+7969 EC08
+796A EC09
+796B EC0A
+796C EC0B
+796D EC0C
+796E EC0D
+796F EC0E
+7970 EC0F
+7971 EC10
+7972 EC11
+7973 EC12
+7974 EC13
+7975 EC14
+7976 EC15
+7977 EC16
+7978 EC17
+7979 EC18
+797A EC19
+797B EC1A
+797C EC1B
+797D EC1C
+797E EC1D
+797F EC1E
+7980 EC1F
+7981 EC20
+7982 EC21
+7983 EC22
+7984 EC23
+7985 EC24
+7986 EC25
+7987 EC26
+7988 EC27
+7989 EC28
+798A EC29
+798B EC2A
+798C EC2B
+798D EC2C
+798E EC2D
+798F EC2E
+7990 EC2F
+7991 EC30
+7992 EC31
+7993 EC32
+7994 EC33
+7995 EC34
+7996 EC35
+7997 EC36
+7998 EC37
+7999 EC38
+799A EC39
+799B EC3A
+799C EC3B
+799D EC3C
+799E EC3D
+799F EC3E
+79A0 EC3F
+79A1 EC40
+79A2 EC41
+79A3 EC42
+79A4 EC43
+79A5 EC44
+79A6 EC45
+79A7 EC46
+79A8 EC47
+79A9 EC48
+79AA EC49
+79AB EC4A
+79AC EC4B
+79AD EC4C
+79AE EC4D
+79AF EC4E
+79B0 EC4F
+79B1 EC50
+79B2 EC51
+79B3 EC52
+79B4 EC53
+79B5 EC54
+79B6 EC55
+79B7 EC56
+79B8 EC57
+79B9 EC58
+79BA EC59
+79BB EC5A
+79BC EC5B
+79BD EC5C
+79BE EC5D
+79BF EC5E
+79C0 EC5F
+79C1 EC60
+79C2 EC61
+79C3 EC62
+79C4 EC63
+79C5 EC64
+79C6 EC65
+79C7 EC66
+79C8 EC67
+79C9 EC68
+79CA EC69
+79CB EC6A
+79CC EC6B
+79CD EC6C
+79CE EC6D
+79CF EC6E
+79D0 EC6F
+79D1 EC70
+79D2 EC71
+79D3 EC72
+79D4 EC73
+79D5 EC74
+79D6 EC75
+79D7 EC76
+79D8 EC77
+79D9 EC78
+79DA EC79
+79DB EC7A
+79DC EC7B
+79DD EC7C
+79DE EC7D
+79DF EC7E
+79E0 EC7F
+79E1 EC80
+79E2 EC81
+79E3 EC82
+79E4 EC83
+79E5 EC84
+79E6 EC85
+79E7 EC86
+79E8 EC87
+79E9 EC88
+79EA EC89
+79EB EC8A
+79EC EC8B
+79ED EC8C
+79EE EC8D
+79EF EC8E
+79F0 EC8F
+79F1 EC90
+79F2 EC91
+79F3 EC92
+79F4 EC93
+79F5 EC94
+79F6 EC95
+79F7 EC96
+79F8 EC97
+79F9 EC98
+79FA EC99
+79FB EC9A
+79FC EC9B
+79FD EC9C
+79FE EC9D
+7A41 EC9E
+7A42 EC9F
+7A43 ECA0
+7A44 ECA1
+7A45 ECA2
+7A46 ECA3
+7A47 ECA4
+7A48 ECA5
+7A49 ECA6
+7A4A ECA7
+7A4B ECA8
+7A4C ECA9
+7A4D ECAA
+7A4E ECAB
+7A4F ECAC
+7A50 ECAD
+7A51 ECAE
+7A52 ECAF
+7A53 ECB0
+7A54 ECB1
+7A55 ECB2
+7A56 ECB3
+7A57 ECB4
+7A58 ECB5
+7A59 ECB6
+7A5A ECB7
+7A5B ECB8
+7A5C ECB9
+7A5D ECBA
+7A5E ECBB
+7A5F ECBC
+7A60 ECBD
+7A61 ECBE
+7A62 ECBF
+7A63 ECC0
+7A64 ECC1
+7A65 ECC2
+7A66 ECC3
+7A67 ECC4
+7A68 ECC5
+7A69 ECC6
+7A6A ECC7
+7A6B ECC8
+7A6C ECC9
+7A6D ECCA
+7A6E ECCB
+7A6F ECCC
+7A70 ECCD
+7A71 ECCE
+7A72 ECCF
+7A73 ECD0
+7A74 ECD1
+7A75 ECD2
+7A76 ECD3
+7A77 ECD4
+7A78 ECD5
+7A79 ECD6
+7A7A ECD7
+7A7B ECD8
+7A7C ECD9
+7A7D ECDA
+7A7E ECDB
+7A7F ECDC
+7A80 ECDD
+7A81 ECDE
+7A82 ECDF
+7A83 ECE0
+7A84 ECE1
+7A85 ECE2
+7A86 ECE3
+7A87 ECE4
+7A88 ECE5
+7A89 ECE6
+7A8A ECE7
+7A8B ECE8
+7A8C ECE9
+7A8D ECEA
+7A8E ECEB
+7A8F ECEC
+7A90 ECED
+7A91 ECEE
+7A92 ECEF
+7A93 ECF0
+7A94 ECF1
+7A95 ECF2
+7A96 ECF3
+7A97 ECF4
+7A98 ECF5
+7A99 ECF6
+7A9A ECF7
+7A9B ECF8
+7A9C ECF9
+7A9D ECFA
+7A9E ECFB
+7A9F ECFC
+7AA0 ECFD
+7AA1 ECFE
+7AA2 ECFF
+7AA3 ED00
+7AA4 ED01
+7AA5 ED02
+7AA6 ED03
+7AA7 ED04
+7AA8 ED05
+7AA9 ED06
+7AAA ED07
+7AAB ED08
+7AAC ED09
+7AAD ED0A
+7AAE ED0B
+7AAF ED0C
+7AB0 ED0D
+7AB1 ED0E
+7AB2 ED0F
+7AB3 ED10
+7AB4 ED11
+7AB5 ED12
+7AB6 ED13
+7AB7 ED14
+7AB8 ED15
+7AB9 ED16
+7ABA ED17
+7ABB ED18
+7ABC ED19
+7ABD ED1A
+7ABE ED1B
+7ABF ED1C
+7AC0 ED1D
+7AC1 ED1E
+7AC2 ED1F
+7AC3 ED20
+7AC4 ED21
+7AC5 ED22
+7AC6 ED23
+7AC7 ED24
+7AC8 ED25
+7AC9 ED26
+7ACA ED27
+7ACB ED28
+7ACC ED29
+7ACD ED2A
+7ACE ED2B
+7ACF ED2C
+7AD0 ED2D
+7AD1 ED2E
+7AD2 ED2F
+7AD3 ED30
+7AD4 ED31
+7AD5 ED32
+7AD6 ED33
+7AD7 ED34
+7AD8 ED35
+7AD9 ED36
+7ADA ED37
+7ADB ED38
+7ADC ED39
+7ADD ED3A
+7ADE ED3B
+7ADF ED3C
+7AE0 ED3D
+7AE1 ED3E
+7AE2 ED3F
+7AE3 ED40
+7AE4 ED41
+7AE5 ED42
+7AE6 ED43
+7AE7 ED44
+7AE8 ED45
+7AE9 ED46
+7AEA ED47
+7AEB ED48
+7AEC ED49
+7AED ED4A
+7AEE ED4B
+7AEF ED4C
+7AF0 ED4D
+7AF1 ED4E
+7AF2 ED4F
+7AF3 ED50
+7AF4 ED51
+7AF5 ED52
+7AF6 ED53
+7AF7 ED54
+7AF8 ED55
+7AF9 ED56
+7AFA ED57
+7AFB ED58
+7AFC ED59
+7AFD ED5A
+7AFE ED5B
+7B41 ED5C
+7B42 ED5D
+7B43 ED5E
+7B44 ED5F
+7B45 ED60
+7B46 ED61
+7B47 ED62
+7B48 ED63
+7B49 ED64
+7B4A ED65
+7B4B ED66
+7B4C ED67
+7B4D ED68
+7B4E ED69
+7B4F ED6A
+7B50 ED6B
+7B51 ED6C
+7B52 ED6D
+7B53 ED6E
+7B54 ED6F
+7B55 ED70
+7B56 ED71
+7B57 ED72
+7B58 ED73
+7B59 ED74
+7B5A ED75
+7B5B ED76
+7B5C ED77
+7B5D ED78
+7B5E ED79
+7B5F ED7A
+7B60 ED7B
+7B61 ED7C
+7B62 ED7D
+7B63 ED7E
+7B64 ED7F
+7B65 ED80
+7B66 ED81
+7B67 ED82
+7B68 ED83
+7B69 ED84
+7B6A ED85
+7B6B ED86
+7B6C ED87
+7B6D ED88
+7B6E ED89
+7B6F ED8A
+7B70 ED8B
+7B71 ED8C
+7B72 ED8D
+7B73 ED8E
+7B74 ED8F
+7B75 ED90
+7B76 ED91
+7B77 ED92
+7B78 ED93
+7B79 ED94
+7B7A ED95
+7B7B ED96
+7B7C ED97
+7B7D ED98
+7B7E ED99
+7B7F ED9A
+7B80 ED9B
+7B81 ED9C
+7B82 ED9D
+7B83 ED9E
+7B84 ED9F
+7B85 EDA0
+7B86 EDA1
+7B87 EDA2
+7B88 EDA3
+7B89 EDA4
+7B8A EDA5
+7B8B EDA6
+7B8C EDA7
+7B8D EDA8
+7B8E EDA9
+7B8F EDAA
+7B90 EDAB
+7B91 EDAC
+7B92 EDAD
+7B93 EDAE
+7B94 EDAF
+7B95 EDB0
+7B96 EDB1
+7B97 EDB2
+7B98 EDB3
+7B99 EDB4
+7B9A EDB5
+7B9B EDB6
+7B9C EDB7
+7B9D EDB8
+7B9E EDB9
+7B9F EDBA
+7BA0 EDBB
+7BA1 EDBC
+7BA2 EDBD
+7BA3 EDBE
+7BA4 EDBF
+7BA5 EDC0
+7BA6 EDC1
+7BA7 EDC2
+7BA8 EDC3
+7BA9 EDC4
+7BAA EDC5
+7BAB EDC6
+7BAC EDC7
+7BAD EDC8
+7BAE EDC9
+7BAF EDCA
+7BB0 EDCB
+7BB1 EDCC
+7BB2 EDCD
+7BB3 EDCE
+7BB4 EDCF
+7BB5 EDD0
+7BB6 EDD1
+7BB7 EDD2
+7BB8 EDD3
+7BB9 EDD4
+7BBA EDD5
+7BBB EDD6
+7BBC EDD7
+7BBD EDD8
+7BBE EDD9
+7BBF EDDA
+7BC0 EDDB
+7BC1 EDDC
+7BC2 EDDD
+7BC3 EDDE
+7BC4 EDDF
+7BC5 EDE0
+7BC6 EDE1
+7BC7 EDE2
+7BC8 EDE3
+7BC9 EDE4
+7BCA EDE5
+7BCB EDE6
+7BCC EDE7
+7BCD EDE8
+7BCE EDE9
+7BCF EDEA
+7BD0 EDEB
+7BD1 EDEC
+7BD2 EDED
+7BD3 EDEE
+7BD4 EDEF
+7BD5 EDF0
+7BD6 EDF1
+7BD7 EDF2
+7BD8 EDF3
+7BD9 EDF4
+7BDA EDF5
+7BDB EDF6
+7BDC EDF7
+7BDD EDF8
+7BDE EDF9
+7BDF EDFA
+7BE0 EDFB
+7BE1 EDFC
+7BE2 EDFD
+7BE3 EDFE
+7BE4 EDFF
+7BE5 EE00
+7BE6 EE01
+7BE7 EE02
+7BE8 EE03
+7BE9 EE04
+7BEA EE05
+7BEB EE06
+7BEC EE07
+7BED EE08
+7BEE EE09
+7BEF EE0A
+7BF0 EE0B
+7BF1 EE0C
+7BF2 EE0D
+7BF3 EE0E
+7BF4 EE0F
+7BF5 EE10
+7BF6 EE11
+7BF7 EE12
+7BF8 EE13
+7BF9 EE14
+7BFA EE15
+7BFB EE16
+7BFC EE17
+7BFD EE18
+7BFE EE19
+7C41 EE1A
+7C42 EE1B
+7C43 EE1C
+7C44 EE1D
+7C45 EE1E
+7C46 EE1F
+7C47 EE20
+7C48 EE21
+7C49 EE22
+7C4A EE23
+7C4B EE24
+7C4C EE25
+7C4D EE26
+7C4E EE27
+7C4F EE28
+7C50 EE29
+7C51 EE2A
+7C52 EE2B
+7C53 EE2C
+7C54 EE2D
+7C55 EE2E
+7C56 EE2F
+7C57 EE30
+7C58 EE31
+7C59 EE32
+7C5A EE33
+7C5B EE34
+7C5C EE35
+7C5D EE36
+7C5E EE37
+7C5F EE38
+7C60 EE39
+7C61 EE3A
+7C62 EE3B
+7C63 EE3C
+7C64 EE3D
+7C65 EE3E
+7C66 EE3F
+7C67 EE40
+7C68 EE41
+7C69 EE42
+7C6A EE43
+7C6B EE44
+7C6C EE45
+7C6D EE46
+7C6E EE47
+7C6F EE48
+7C70 EE49
+7C71 EE4A
+7C72 EE4B
+7C73 EE4C
+7C74 EE4D
+7C75 EE4E
+7C76 EE4F
+7C77 EE50
+7C78 EE51
+7C79 EE52
+7C7A EE53
+7C7B EE54
+7C7C EE55
+7C7D EE56
+7C7E EE57
+7C7F EE58
+7C80 EE59
+7C81 EE5A
+7C82 EE5B
+7C83 EE5C
+7C84 EE5D
+7C85 EE5E
+7C86 EE5F
+7C87 EE60
+7C88 EE61
+7C89 EE62
+7C8A EE63
+7C8B EE64
+7C8C EE65
+7C8D EE66
+7C8E EE67
+7C8F EE68
+7C90 EE69
+7C91 EE6A
+7C92 EE6B
+7C93 EE6C
+7C94 EE6D
+7C95 EE6E
+7C96 EE6F
+7C97 EE70
+7C98 EE71
+7C99 EE72
+7C9A EE73
+7C9B EE74
+7C9C EE75
+7C9D EE76
+7C9E EE77
+7C9F EE78
+7CA0 EE79
+7CA1 EE7A
+7CA2 EE7B
+7CA3 EE7C
+7CA4 EE7D
+7CA5 EE7E
+7CA6 EE7F
+7CA7 EE80
+7CA8 EE81
+7CA9 EE82
+7CAA EE83
+7CAB EE84
+7CAC EE85
+7CAD EE86
+7CAE EE87
+7CAF EE88
+7CB0 EE89
+7CB1 EE8A
+7CB2 EE8B
+7CB3 EE8C
+7CB4 EE8D
+7CB5 EE8E
+7CB6 EE8F
+7CB7 EE90
+7CB8 EE91
+7CB9 EE92
+7CBA EE93
+7CBB EE94
+7CBC EE95
+7CBD EE96
+7CBE EE97
+7CBF EE98
+7CC0 EE99
+7CC1 EE9A
+7CC2 EE9B
+7CC3 EE9C
+7CC4 EE9D
+7CC5 EE9E
+7CC6 EE9F
+7CC7 EEA0
+7CC8 EEA1
+7CC9 EEA2
+7CCA EEA3
+7CCB EEA4
+7CCC EEA5
+7CCD EEA6
+7CCE EEA7
+7CCF EEA8
+7CD0 EEA9
+7CD1 EEAA
+7CD2 EEAB
+7CD3 EEAC
+7CD4 EEAD
+7CD5 EEAE
+7CD6 EEAF
+7CD7 EEB0
+7CD8 EEB1
+7CD9 EEB2
+7CDA EEB3
+7CDB EEB4
+7CDC EEB5
+7CDD EEB6
+7CDE EEB7
+7CDF EEB8
+7CE0 EEB9
+7CE1 EEBA
+7CE2 EEBB
+7CE3 EEBC
+7CE4 EEBD
+7CE5 EEBE
+7CE6 EEBF
+7CE7 EEC0
+7CE8 EEC1
+7CE9 EEC2
+7CEA EEC3
+7CEB EEC4
+7CEC EEC5
+7CED EEC6
+7CEE EEC7
+7CEF EEC8
+7CF0 EEC9
+7CF1 EECA
+7CF2 EECB
+7CF3 EECC
+7CF4 EECD
+7CF5 EECE
+7CF6 EECF
+7CF7 EED0
+7CF8 EED1
+7CF9 EED2
+7CFA EED3
+7CFB EED4
+7CFC EED5
+7CFD EED6
+7CFE EED7
+7D41 EED8
+7D42 EED9
+7D43 EEDA
+7D44 EEDB
+7D45 EEDC
+7D46 EEDD
+7D47 EEDE
+7D48 EEDF
+7D49 EEE0
+7D4A EEE1
+7D4B EEE2
+7D4C EEE3
+7D4D EEE4
+7D4E EEE5
+7D4F EEE6
+7D50 EEE7
+7D51 EEE8
+7D52 EEE9
+7D53 EEEA
+7D54 EEEB
+7D55 EEEC
+7D56 EEED
+7D57 EEEE
+7D58 EEEF
+7D59 EEF0
+7D5A EEF1
+7D5B EEF2
+7D5C EEF3
+7D5D EEF4
+7D5E EEF5
+7D5F EEF6
+7D60 EEF7
+7D61 EEF8
+7D62 EEF9
+7D63 EEFA
+7D64 EEFB
+7D65 EEFC
+7D66 EEFD
+7D67 EEFE
+7D68 EEFF
+7D69 EF00
+7D6A EF01
+7D6B EF02
+7D6C EF03
+7D6D EF04
+7D6E EF05
+7D6F EF06
+7D70 EF07
+7D71 EF08
+7D72 EF09
+7D73 EF0A
+7D74 EF0B
+7D75 EF0C
+7D76 EF0D
+7D77 EF0E
+7D78 EF0F
+7D79 EF10
+7D7A EF11
+7D7B EF12
+7D7C EF13
+7D7D EF14
+7D7E EF15
+7D7F EF16
+7D80 EF17
+7D81 EF18
+7D82 EF19
+7D83 EF1A
+7D84 EF1B
+7D85 EF1C
+7D86 EF1D
+7D87 EF1E
+7D88 EF1F
+7D89 EF20
+7D8A EF21
+7D8B EF22
+7D8C EF23
+7D8D EF24
+7D8E EF25
+7D8F EF26
+7D90 EF27
+7D91 EF28
+7D92 EF29
+7D93 EF2A
+7D94 EF2B
+7D95 EF2C
+7D96 EF2D
+7D97 EF2E
+7D98 EF2F
+7D99 EF30
+7D9A EF31
+7D9B EF32
+7D9C EF33
+7D9D EF34
+7D9E EF35
+7D9F EF36
+7DA0 EF37
+7DA1 EF38
+7DA2 EF39
+7DA3 EF3A
+7DA4 EF3B
+7DA5 EF3C
+7DA6 EF3D
+7DA7 EF3E
+7DA8 EF3F
+7DA9 EF40
+7DAA EF41
+7DAB EF42
+7DAC EF43
+7DAD EF44
+7DAE EF45
+7DAF EF46
+7DB0 EF47
+7DB1 EF48
+7DB2 EF49
+7DB3 EF4A
+7DB4 EF4B
+7DB5 EF4C
+7DB6 EF4D
+7DB7 EF4E
+7DB8 EF4F
+7DB9 EF50
+7DBA EF51
+7DBB EF52
+7DBC EF53
+7DBD EF54
+7DBE EF55
+7DBF EF56
+7DC0 EF57
+7DC1 EF58
+7DC2 EF59
+7DC3 EF5A
+7DC4 EF5B
+7DC5 EF5C
+7DC6 EF5D
+7DC7 EF5E
+7DC8 EF5F
+7DC9 EF60
+7DCA EF61
+7DCB EF62
+7DCC EF63
+7DCD EF64
+7DCE EF65
+7DCF EF66
+7DD0 EF67
+7DD1 EF68
+7DD2 EF69
+7DD3 EF6A
+7DD4 EF6B
+7DD5 EF6C
+7DD6 EF6D
+7DD7 EF6E
+7DD8 EF6F
+7DD9 EF70
+7DDA EF71
+7DDB EF72
+7DDC EF73
+7DDD EF74
+7DDE EF75
+7DDF EF76
+7DE0 EF77
+7DE1 EF78
+7DE2 EF79
+7DE3 EF7A
+7DE4 EF7B
+7DE5 EF7C
+7DE6 EF7D
+7DE7 EF7E
+7DE8 EF7F
+7DE9 EF80
+7DEA EF81
+7DEB EF82
+7DEC EF83
+7DED EF84
+7DEE EF85
+7DEF EF86
+7DF0 EF87
+7DF1 EF88
+7DF2 EF89
+7DF3 EF8A
+7DF4 EF8B
+7DF5 EF8C
+7DF6 EF8D
+7DF7 EF8E
+7DF8 EF8F
+7DF9 EF90
+7DFA EF91
+7DFB EF92
+7DFC EF93
+7DFD EF94
+7DFE EF95
+7E41 EF96
+7E42 EF97
+7E43 EF98
+7E44 EF99
+7E45 EF9A
+7E46 EF9B
+7E47 EF9C
+7E48 EF9D
+7E49 EF9E
+7E4A EF9F
+7E4B EFA0
+7E4C EFA1
+7E4D EFA2
+7E4E EFA3
+7E4F EFA4
+7E50 EFA5
+7E51 EFA6
+7E52 EFA7
+7E53 EFA8
+7E54 EFA9
+7E55 EFAA
+7E56 EFAB
+7E57 EFAC
+7E58 EFAD
+7E59 EFAE
+7E5A EFAF
+7E5B EFB0
+7E5C EFB1
+7E5D EFB2
+7E5E EFB3
+7E5F EFB4
+7E60 EFB5
+7E61 EFB6
+7E62 EFB7
+7E63 EFB8
+7E64 EFB9
+7E65 EFBA
+7E66 EFBB
+7E67 EFBC
+7E68 EFBD
+7E69 EFBE
+7E6A EFBF
+7E6B EFC0
+7E6C EFC1
+7E6D EFC2
+7E6E EFC3
+7E6F EFC4
+7E70 EFC5
+7E71 EFC6
+7E72 EFC7
+7E73 EFC8
+7E74 EFC9
+7E75 EFCA
+7E76 EFCB
+7E77 EFCC
+7E78 EFCD
+7E79 EFCE
+7E7A EFCF
+7E7B EFD0
+7E7C EFD1
+7E7D EFD2
+7E7E EFD3
+7E7F EFD4
+7E80 EFD5
+7E81 EFD6
+7E82 EFD7
+7E83 EFD8
+7E84 EFD9
+7E85 EFDA
+7E86 EFDB
+7E87 EFDC
+7E88 EFDD
+7E89 EFDE
+7E8A EFDF
+7E8B EFE0
+7E8C EFE1
+7E8D EFE2
+7E8E EFE3
+7E8F EFE4
+7E90 EFE5
+7E91 EFE6
+7E92 EFE7
+7E93 EFE8
+7E94 EFE9
+7E95 EFEA
+7E96 EFEB
+7E97 EFEC
+7E98 EFED
+7E99 EFEE
+7E9A EFEF
+7E9B EFF0
+7E9C EFF1
+7E9D EFF2
+7E9E EFF3
+7E9F EFF4
+7EA0 EFF5
+7EA1 EFF6
+7EA2 EFF7
+7EA3 EFF8
+7EA4 EFF9
+7EA5 EFFA
+7EA6 EFFB
+7EA7 EFFC
+7EA8 EFFD
+7EA9 EFFE
+7EAA EFFF
+7EAB F000
+7EAC F001
+7EAD F002
+7EAE F003
+7EAF F004
+7EB0 F005
+7EB1 F006
+7EB2 F007
+7EB3 F008
+7EB4 F009
+7EB5 F00A
+7EB6 F00B
+7EB7 F00C
+7EB8 F00D
+7EB9 F00E
+7EBA F00F
+7EBB F010
+7EBC F011
+7EBD F012
+7EBE F013
+7EBF F014
+7EC0 F015
+7EC1 F016
+7EC2 F017
+7EC3 F018
+7EC4 F019
+7EC5 F01A
+7EC6 F01B
+7EC7 F01C
+7EC8 F01D
+7EC9 F01E
+7ECA F01F
+7ECB F020
+7ECC F021
+7ECD F022
+7ECE F023
+7ECF F024
+7ED0 F025
+7ED1 F026
+7ED2 F027
+7ED3 F028
+7ED4 F029
+7ED5 F02A
+7ED6 F02B
+7ED7 F02C
+7ED8 F02D
+7ED9 F02E
+7EDA F02F
+7EDB F030
+7EDC F031
+7EDD F032
+7EDE F033
+7EDF F034
+7EE0 F035
+7EE1 F036
+7EE2 F037
+7EE3 F038
+7EE4 F039
+7EE5 F03A
+7EE6 F03B
+7EE7 F03C
+7EE8 F03D
+7EE9 F03E
+7EEA F03F
+7EEB F040
+7EEC F041
+7EED F042
+7EEE F043
+7EEF F044
+7EF0 F045
+7EF1 F046
+7EF2 F047
+7EF3 F048
+7EF4 F049
+7EF5 F04A
+7EF6 F04B
+7EF7 F04C
+7EF8 F04D
+7EF9 F04E
+7EFA F04F
+7EFB F050
+7EFC F051
+7EFD F052
+7EFE F053
+7F41 F054
+7F42 F055
+7F43 F056
+7F44 F057
+7F45 F058
+7F46 F059
+7F47 F05A
+7F48 F05B
+7F49 F05C
+7F4A F05D
+7F4B F05E
+7F4C F05F
+7F4D F060
+7F4E F061
+7F4F F062
+7F50 F063
+7F51 F064
+7F52 F065
+7F53 F066
+7F54 F067
+7F55 F068
+7F56 F069
+7F57 F06A
+7F58 F06B
+7F59 F06C
+7F5A F06D
+7F5B F06E
+7F5C F06F
+7F5D F070
+7F5E F071
+7F5F F072
+7F60 F073
+7F61 F074
+7F62 F075
+7F63 F076
+7F64 F077
+7F65 F078
+7F66 F079
+7F67 F07A
+7F68 F07B
+7F69 F07C
+7F6A F07D
+7F6B F07E
+7F6C F07F
+7F6D F080
+7F6E F081
+7F6F F082
+7F70 F083
+7F71 F084
+7F72 F085
+7F73 F086
+7F74 F087
+7F75 F088
+7F76 F089
+7F77 F08A
+7F78 F08B
+7F79 F08C
+7F7A F08D
+7F7B F08E
+7F7C F08F
+7F7D F090
+7F7E F091
+7F7F F092
+7F80 F093
+7F81 F094
+7F82 F095
+7F83 F096
+7F84 F097
+7F85 F098
+7F86 F099
+7F87 F09A
+7F88 F09B
+7F89 F09C
+7F8A F09D
+7F8B F09E
+7F8C F09F
+7F8D F0A0
+7F8E F0A1
+7F8F F0A2
+7F90 F0A3
+7F91 F0A4
+7F92 F0A5
+7F93 F0A6
+7F94 F0A7
+7F95 F0A8
+7F96 F0A9
+7F97 F0AA
+7F98 F0AB
+7F99 F0AC
+7F9A F0AD
+7F9B F0AE
+7F9C F0AF
+7F9D F0B0
+7F9E F0B1
+7F9F F0B2
+7FA0 F0B3
+7FA1 F0B4
+7FA2 F0B5
+7FA3 F0B6
+7FA4 F0B7
+7FA5 F0B8
+7FA6 F0B9
+7FA7 F0BA
+7FA8 F0BB
+7FA9 F0BC
+7FAA F0BD
+7FAB F0BE
+7FAC F0BF
+7FAD F0C0
+7FAE F0C1
+7FAF F0C2
+7FB0 F0C3
+7FB1 F0C4
+7FB2 F0C5
+7FB3 F0C6
+7FB4 F0C7
+7FB5 F0C8
+7FB6 F0C9
+7FB7 F0CA
+7FB8 F0CB
+7FB9 F0CC
+7FBA F0CD
+7FBB F0CE
+7FBC F0CF
+7FBD F0D0
+7FBE F0D1
+7FBF F0D2
+7FC0 F0D3
+7FC1 F0D4
+7FC2 F0D5
+7FC3 F0D6
+7FC4 F0D7
+7FC5 F0D8
+7FC6 F0D9
+7FC7 F0DA
+7FC8 F0DB
+7FC9 F0DC
+7FCA F0DD
+7FCB F0DE
+7FCC F0DF
+7FCD F0E0
+7FCE F0E1
+7FCF F0E2
+7FD0 F0E3
+7FD1 F0E4
+7FD2 F0E5
+7FD3 F0E6
+7FD4 F0E7
+7FD5 F0E8
+7FD6 F0E9
+7FD7 F0EA
+7FD8 F0EB
+7FD9 F0EC
+7FDA F0ED
+7FDB F0EE
+7FDC F0EF
+7FDD F0F0
+7FDE F0F1
+7FDF F0F2
+7FE0 F0F3
+7FE1 F0F4
+7FE2 F0F5
+7FE3 F0F6
+7FE4 F0F7
+7FE5 F0F8
+7FE6 F0F9
+7FE7 F0FA
+7FE8 F0FB
+7FE9 F0FC
+7FEA F0FD
+7FEB F0FE
+7FEC F0FF
+7FED F100
+7FEE F101
+7FEF F102
+7FF0 F103
+7FF1 F104
+7FF2 F105
+7FF3 F106
+7FF4 F107
+7FF5 F108
+7FF6 F109
+7FF7 F10A
+7FF8 F10B
+7FF9 F10C
+7FFA F10D
+7FFB F10E
+7FFC F10F
+7FFD F110
+7FFE F111
--- a/jdk/make/tools/CharsetMapping/dbcs Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/tools/CharsetMapping/dbcs Tue Aug 20 17:44:18 2013 -0700
@@ -15,6 +15,7 @@
IBM1364 x-IBM1364 Cp1364 ebcdic sun.nio.cs.ext false 0x40 0xde 0x40 0xfe
IBM1381 x-IBM1381 Cp1381 basic sun.nio.cs.ext true 0x8c 0xf7 0xa1 0xfe
IBM1383 x-IBM1383 Cp1383 euc_sim sun.nio.cs.ext true 0xa1 0xfe 0xa1 0xfe
+IBM300 x-IBM300 Cp300 dbcsonly sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe
IBM930 x-IBM930 Cp930 ebcdic sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe
IBM933 x-IBM933 Cp933 ebcdic sun.nio.cs.ext false 0x40 0xdd 0x40 0xfe
IBM935 x-IBM935 Cp935 ebcdic sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe
--- a/jdk/make/tools/CharsetMapping/extsbcs Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/tools/CharsetMapping/extsbcs Tue Aug 20 17:44:18 2013 -0700
@@ -28,6 +28,7 @@
IBM280 IBM280 Cp280 false sun.nio.cs.ext
IBM284 IBM284 Cp284 false sun.nio.cs.ext
IBM285 IBM285 Cp285 false sun.nio.cs.ext
+IBM290 IBM290 Cp290 false sun.nio.cs.ext
IBM297 IBM297 Cp297 false sun.nio.cs.ext
IBM420 IBM420 Cp420 false sun.nio.cs.ext
IBM424 IBM424 Cp424 false sun.nio.cs.ext
--- a/jdk/make/tools/sharing/README.txt Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/tools/sharing/README.txt Tue Aug 20 17:44:18 2013 -0700
@@ -2,20 +2,20 @@
class list for class data sharing.
The class list is produced by running the refWorkload startup3 benchmark with
-the -verbose:class option. The -Xshare:off option must also be used so that
-bootclasspath classes are loaded from rt.jar. The MakeClasslist program
-should be built into the jar file makeclasslist.jar and is run
+the -XX:+TraceClassLoadingPreorder option. The -Xshare:off option must also be
+used so that bootclasspath classes are loaded from rt.jar. The MakeClasslist
+program should be built into the jar file makeclasslist.jar and is run
on one of the logs from each of the benchmarks in the following fashion:
-cd .../results.startup3
-$JAVA_HOME/bin/java -jar makeclasslist.jar results.Noop/results_1/log results.Framer/results_1/log results.XFramer/results_1/log results.JEdit/results_1/log results.LimeWire/results_1/log results.NetBeans/results_1/log
+cd .../<resultsdir>/results.startup3
+$JAVA_HOME/bin/java -jar makeclasslist.jar results.Noop/results_1/log results.Framer/results_1/log results.XFramer/results_1/log results.JEdit/results_1/log results.LimeWire/results_1/log results.NetBeans50/results_1/log
Presently, $JAVA_HOME must be the same path used to run the startup3 benchmark.
-The logs are deliberately concatenated in roughly smallest to largest
-order based on application size. The resulting output is redirected
-into a file and results in one of classlist.solaris, classlist.linux,
-or classlist.windows. These files are checked in to the workspace. A
+The logs are deliberately concatenated in roughly smallest to largest order
+based on application size. The resulting output is redirected into a file
+and results in one of classlist.solaris, classlist.linux, classlist.macosx,
+or classlist.windows. These files are checked in to the workspace. A
necessary checksum (AddJsum.java) is added to the final classlist
(installed in lib/ or jre/lib/) during the build process by the
makefiles in make/java/redist.
@@ -27,8 +27,8 @@
The properties file supplied to the refworkload is approximately the
following:
-javahome=/usr/java/j2sdk1.5.0
+javahome=/usr/java/j2sdk1.8.0
resultsdir=classlist-run
iterations=1
benchmarks=startup3
-globalvmoptions=-client -Xshare:off -verbose:class
+globalvmoptions=-client -Xshare:off -XX:+TraceClassLoadingPreorder
--- a/jdk/make/tools/src/build/tools/charsetmapping/DBCS.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/tools/src/build/tools/charsetmapping/DBCS.java Tue Aug 20 17:44:18 2013 -0700
@@ -196,11 +196,14 @@
// (5) c2b replacement, only used for JIs0208/0212, which
// are two pure db charsets so default '3f' does not work
+ // TBD: move this into configuration file
String c2bRepl = "";
if (clzName.startsWith("JIS_X_0208")) {
c2bRepl = "new byte[]{ (byte)0x21, (byte)0x29 },";
} else if (clzName.startsWith("JIS_X_0212")) {
c2bRepl = "new byte[]{ (byte)0x22, (byte)0x44 },";
+ } else if (clzName.startsWith("IBM300")) {
+ c2bRepl = "new byte[]{ (byte)0x42, (byte)0x6f },";
}
while (s.hasNextLine()) {
--- a/jdk/make/tools/src/build/tools/cldrconverter/CLDRConverter.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/tools/src/build/tools/cldrconverter/CLDRConverter.java Tue Aug 20 17:44:18 2013 -0700
@@ -605,7 +605,23 @@
copyIfPresent(map, key, formatData);
}
}
-
+ // Workaround for islamic-umalqura name support (JDK-8015986)
+ switch (id) {
+ case "ar":
+ map.put(CLDRConverter.CALENDAR_NAME_PREFIX
+ + CalendarType.ISLAMIC_UMALQURA.lname(),
+ // derived from CLDR 24 draft
+ "\u0627\u0644\u062a\u0642\u0648\u064a\u0645 "
+ +"\u0627\u0644\u0625\u0633\u0644\u0627\u0645\u064a "
+ +"[\u0623\u0645 \u0627\u0644\u0642\u0631\u0649]");
+ break;
+ case "en":
+ map.put(CLDRConverter.CALENDAR_NAME_PREFIX
+ + CalendarType.ISLAMIC_UMALQURA.lname(),
+ // derived from CLDR 24 draft
+ "Islamic Calendar [Umm al-Qura]");
+ break;
+ }
// Copy available calendar names
for (String key : map.keySet()) {
if (key.startsWith(CLDRConverter.CALENDAR_NAME_PREFIX)) {
--- a/jdk/make/tools/src/build/tools/cldrconverter/CalendarType.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/tools/src/build/tools/cldrconverter/CalendarType.java Tue Aug 20 17:44:18 2013 -0700
@@ -31,7 +31,8 @@
* Constants for the Calendars supported by JRE.
*/
enum CalendarType {
- GREGORIAN("gregory"), BUDDHIST, JAPANESE, ROC, ISLAMIC, ISLAMIC_CIVIL("islamicc");
+ GREGORIAN("gregory"), BUDDHIST, JAPANESE, ROC,
+ ISLAMIC, ISLAMIC_CIVIL("islamicc"), ISLAMIC_UMALQURA("islamic-umalqura");
private static final int[][] ERA_DATA = {
// start index, array length
@@ -41,6 +42,7 @@
{0, 2}, // roc (Minguo)
{0, 1}, // islamic (Hijrah)
{0, 1}, // islamicc (same as islamic)
+ {0, 1}, // islamic-umalqura
};
private final String lname; // lowercase name
@@ -52,8 +54,8 @@
private CalendarType(String uname) {
String lname = name().toLowerCase(Locale.ROOT);
- if (lname.equals("islamic_civil")) {
- lname = "islamic-civil";
+ if (lname.startsWith("islamic_")) {
+ lname = lname.replace('_', '-');
}
this.lname = lname;
this.uname = (uname != null) ? uname : lname;
--- a/jdk/make/tools/src/build/tools/makeclasslist/MakeClasslist.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/make/tools/src/build/tools/makeclasslist/MakeClasslist.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,11 +29,11 @@
import java.util.*;
import java.util.jar.*;
-/** Reads a set of files containing the output of java -verbose:class
- runs. Finds all classes that were loaded from the bootstrap class
- path by comparing the prefix of the load path to the current JRE's
- java.home system property. Prints the names of these classes to
- stdout.
+/** Reads a set of files containing the output of java
+ -XX:+TraceClassLoadingPreorder runs. Finds all classes that were
+ loaded from the bootstrap class path by comparing the prefix of
+ the load path to the current JRE's java.home system property.
+ Prints the names of these classes to stdout.
*/
public class MakeClasslist {
@@ -86,7 +86,7 @@
Set<String> seenClasses = new HashSet<>();
- for (String str : seenClasses) {
+ for (String str : classes) {
if (seenClasses.add(str)) {
System.out.println(str);
}
--- a/jdk/makefiles/CompileLaunchers.gmk Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/makefiles/CompileLaunchers.gmk Tue Aug 20 17:44:18 2013 -0700
@@ -40,7 +40,7 @@
BUILD_LAUNCHERS=
-# When building a legacy overlay image (on solaris 64 bit), the launchers
+# When building a legacy overlay image (on solaris 64 bit), the launchers
# need to be built with a different rpath and a different output dir.
ifeq ($(OVERLAY_IMAGES),true)
ORIGIN_ROOT:=/../..
@@ -63,7 +63,7 @@
#
ifneq ($(findstring $(OPENJDK_TARGET_OS), linux solaris),)
ORIGIN_ARG+=$(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/lib$(OPENJDK_TARGET_CPU_LIBDIR)) \
- $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR))
+ $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR))
endif
define SetupLauncher
@@ -189,7 +189,7 @@
ifeq ($(OPENJDK_TARGET_OS),windows)
$$(BUILD_LAUNCHER_$1) : $(JDK_OUTPUTDIR)/objs/libjava/java.lib \
$$($1_WINDOWS_JLI_LIB)
- endif
+ endif
endef
##########################################################################################
@@ -441,7 +441,7 @@
endif
# On windows, unpack200 is linked completely differently to all other
# executables, using the compiler with the compiler arguments.
-# It's also linked incrementally, producing a .ilk file that needs to
+# It's also linked incrementally, producing a .ilk file that needs to
# be kept away.
ifeq ($(OPENJDK_TARGET_OS),windows)
BUILD_UNPACKEXE_LDEXE:=$(CC)
@@ -490,7 +490,7 @@
endif
# Build into object dir and copy executable afterwards to avoid .ilk file in
-# image. The real fix would be clean up linking of unpack200 using
+# image. The real fix would be clean up linking of unpack200 using
# -link -incremental:no
# like all other launchers.
$(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/unpack200$(EXE_SUFFIX): $(BUILD_UNPACKEXE)
@@ -501,7 +501,7 @@
##########################################################################################
-BUILD_JEXEC :=
+BUILD_JEXEC :=
BUILD_JEXEC_SRC :=
BUILD_JEXEC_INC :=
BUILD_JEXEC_DST_DIR := $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)
@@ -581,11 +581,11 @@
endif
endif
-# TODO:
+# TODO:
# On windows java-rmi.cgi shouldn't be bundled since Java 1.2, but has been built all
# this time anyway. Since jdk6, it has been built from the wrong source and resulted
-# in a (almost) copy of the standard java launcher named "java-rmi.exe" ending up in
-# the final images bin dir. This weird behavior is mimicked here in the converted
+# in a (almost) copy of the standard java launcher named "java-rmi.exe" ending up in
+# the final images bin dir. This weird behavior is mimicked here in the converted
# makefiles for now. Should probably just be deleted.
# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6512052
ifeq ($(OPENJDK_TARGET_OS),windows)
@@ -598,6 +598,44 @@
endif
##########################################################################################
+
+BUILD_JSPAWNHELPER :=
+BUILD_JSPAWNHELPER_SRC := $(JDK_TOPDIR)/src/solaris/native/java/lang
+BUILD_JSPAWNHELPER_DST_DIR := $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)
+LINK_JSPAWNHELPER_OBJECTS := $(JDK_OUTPUTDIR)/objs/libjava/childproc.o
+LINK_JSPAWNHELPER_FLAGS :=
+
+ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris),)
+ BUILD_JSPAWNHELPER := 1
+endif
+
+ifeq ($(OPENJDK_TARGET_OS), macosx)
+ BUILD_JSPAWNHELPER_DST_DIR := $(JDK_OUTPUTDIR)/lib
+endif
+
+ifeq ($(OPENJDK_TARGET_CPU_BITS), 64)
+ LINK_JSPAWNHELPER_FLAGS += -m64
+endif
+
+ifeq ($(BUILD_JSPAWNHELPER), 1)
+ $(eval $(call SetupNativeCompilation,BUILD_JSPAWNHELPER,\
+ SRC:=$(BUILD_JSPAWNHELPER_SRC),\
+ INCLUDE_FILES:=jspawnhelper.c,\
+ LANG:=C,\
+ OPTIMIZATION := LOW, \
+ CFLAGS:=$(CFLAGS_JDKEXE), \
+ LDFLAGS:=$(LDFLAGS_JDKEXE) $(LINK_JSPAWNHELPER_FLAGS), \
+ LDFLAGS_SUFFIX:= $(LINK_JSPAWNHELPER_OBJECTS), \
+ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/jspawnhelper,\
+ OUTPUT_DIR:=$(BUILD_JSPAWNHELPER_DST_DIR),\
+ PROGRAM:=jspawnhelper))
+
+ $(BUILD_JSPAWNHELPER): $(LINK_JSPAWNHELPER_OBJECTS)
+
+ BUILD_LAUNCHERS += $(BUILD_JSPAWNHELPER)
+endif
+
+##########################################################################################
# jabswitch
ifndef OPENJDK
--- a/jdk/makefiles/CompileNativeLibraries.gmk Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/makefiles/CompileNativeLibraries.gmk Tue Aug 20 17:44:18 2013 -0700
@@ -199,13 +199,13 @@
LIBJAVA_CFLAGS += -DJDK_MAJOR_VERSION='"$(JDK_MAJOR_VERSION)"' \
-DJDK_MINOR_VERSION='"$(JDK_MINOR_VERSION)"' \
-DJDK_MICRO_VERSION='"$(JDK_MICRO_VERSION)"' \
- -DJDK_BUILD_NUMBER='"$(JDK_BUILD_NUMBER)"'
+ -DJDK_BUILD_NUMBER='"$(JDK_BUILD_NUMBER)"'
ifneq (,$(JDK_UPDATE_VERSION))
LIBJAVA_CFLAGS += -DJDK_UPDATE_VERSION='"$(JDK_UPDATE_VERSION)"'
endif
-LIBJAVA_EXCLUDE_FILES:=check_code.c check_format.c
+LIBJAVA_EXCLUDE_FILES:=check_code.c check_format.c jspawnhelper.c
ifneq ($(OPENJDK_TARGET_OS),macosx)
LIBJAVA_EXCLUDE_FILES += java_props_macosx.c
@@ -279,7 +279,7 @@
BUILD_LIBMLIB_SRC:=$(JDK_TOPDIR)/src/share/native/sun/awt/medialib
BUILD_LIBMLIB_CFLAGS:=-D__USE_J2D_NAMES -D__MEDIALIB_OLD_NAMES \
-I$(BUILD_LIBMLIB_SRC) \
- -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/awt/medialib
+ -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/awt/medialib
BUILD_LIBMLIB_LDLIBS:=
BUILD_LIBMLIB_IMAGE_MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libmlib_image/mapfile-vers
@@ -1042,6 +1042,7 @@
LANG:=C,\
OPTIMIZATION:=LOW, \
CFLAGS:=$(CFLAGS_JDKLIB),\
+ CFLAGS_windows:=/Gy,\
MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libattach/mapfile-$(OPENJDK_TARGET_OS), \
VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\
RC_FLAGS:=$(RC_FLAGS) \
@@ -1051,6 +1052,7 @@
LDFLAGS:=$(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN),\
LDFLAGS_solaris:=-ldoor,\
+ LDFLAGS_windows:=/ORDER:@$(JDK_TOPDIR)/makefiles/mapfiles/libattach/reorder-windows-$(OPENJDK_TARGET_CPU),\
LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX),\
LDFLAGS_SUFFIX_windows:=$(WIN_JAVA_LIB) advapi32.lib psapi.lib,\
OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libattach,\
@@ -1413,10 +1415,10 @@
# ifeq ($(OPENJDK_TARGET_OS), linux)
# ifeq ("$(CC_VER_MAJOR)", "3")
# OTHER_LDLIBS += -Wl,-Bstatic -lgcc_eh -Wl,-Bdynamic
-# endif
+# endif
# endif
#
-# The resulting size of the t2k lib file is (at least on linux) dependant on the order of
+# The resulting size of the t2k lib file is (at least on linux) dependant on the order of
# the input .o files. Because of this the new build will differ in size to the old build.
BUILD_LIBT2K_CFLAGS_COMMON:=-I$(JDK_TOPDIR)/src/share/native/sun/font \
-I$(JDK_TOPDIR)/src/closed/share/native/sun/font/t2k \
@@ -1590,8 +1592,8 @@
ifeq ($(OPENJDK_TARGET_OS), windows)
LIBINSTRUMENT_LDFLAGS += $(JDK_OUTPUTDIR)/objs/jli_static.lib $(WIN_JAVA_LIB) \
-export:Agent_OnAttach advapi32.lib
- # Statically link the C runtime so that there are not dependencies on modules
- # not on the search patch when invoked from the Windows system directory
+ # Statically link the C runtime so that there are not dependencies on modules
+ # not on the search patch when invoked from the Windows system directory
# (or elsewhere).
LIBINSTRUMENT_CFLAGS := $(filter-out -MD,$(LIBINSTRUMENT_CFLAGS))
# equivalent of strcasecmp is stricmp on Windows
@@ -2065,13 +2067,13 @@
ifeq ($(OPENJDK_TARGET_OS), windows)
BUILD_LIBJLI_FILES += java_md.c \
- cmdtoargs.c
+ cmdtoargs.c
# Staticically link with c runtime on windows.
LIBJLI_CFLAGS:=$(filter-out -MD,$(LIBJLI_CFLAGS))
else ifneq ($(OPENJDK_TARGET_OS), macosx)
BUILD_LIBJLI_FILES += java_md_common.c
- BUILD_LIBJLI_FILES += java_md_solinux.c ergo.c
+ BUILD_LIBJLI_FILES += java_md_solinux.c ergo.c
ERGO_ARCH_FILE = ergo_$(ERGO_FAMILY).c
@@ -2518,7 +2520,7 @@
BUILD_LIBRARIES += $(LIBSPLASHSCREEN)
ifeq ($(OPENJDK_TARGET_OS),macosx)
-$(LIBSPLASHSCREEN) : $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)osxapp$(SHARED_LIBRARY_SUFFIX)
+$(LIBSPLASHSCREEN) : $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)osxapp$(SHARED_LIBRARY_SUFFIX)
endif
endif
@@ -3246,7 +3248,7 @@
BUILD_LIBRARIES += $(BUILD_LIBAWT_LWAWT)
-$(BUILD_LIBAWT_LWAWT) : $(BUILD_LIBAWT)
+$(BUILD_LIBAWT_LWAWT) : $(BUILD_LIBAWT)
$(BUILD_LIBAWT_LWAWT) : $(BUILD_LIBMLIB_IMAGE)
@@ -3287,7 +3289,7 @@
BUILD_LIBRARIES += $(BUILD_LIBOSXUI)
-$(BUILD_LIBOSXUI) : $(BUILD_LIBAWT)
+$(BUILD_LIBOSXUI) : $(BUILD_LIBAWT)
$(BUILD_LIBOSXUI) : $(BUILD_LIBOSXAPP)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/makefiles/mapfiles/libattach/reorder-windows-x86 Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,2 @@
+jvm_attach_thread_func@4
+jvm_attach_thread_func_end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/makefiles/mapfiles/libattach/reorder-windows-x86_64 Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,2 @@
+jvm_attach_thread_func
+jvm_attach_thread_func_end
--- a/jdk/makefiles/mapfiles/libjava/mapfile-vers Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/makefiles/mapfiles/libjava/mapfile-vers Tue Aug 20 17:44:18 2013 -0700
@@ -100,7 +100,7 @@
Java_java_io_RandomAccessFile_open;
Java_java_io_RandomAccessFile_read;
Java_java_io_RandomAccessFile_readBytes;
- Java_java_io_RandomAccessFile_seek;
+ Java_java_io_RandomAccessFile_seek0;
Java_java_io_RandomAccessFile_setLength;
Java_java_io_RandomAccessFile_write;
Java_java_io_RandomAccessFile_writeBytes;
--- a/jdk/makefiles/profile-includes.txt Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/makefiles/profile-includes.txt Tue Aug 20 17:44:18 2013 -0700
@@ -102,6 +102,7 @@
security/US_export_policy.jar \
security/local_policy.jar
+
PROFILE_2_JRE_BIN_FILES := \
rmid$(EXE_SUFFIX) \
rmiregistry$(EXE_SUFFIX)
@@ -140,7 +141,6 @@
PROFILE_3_JRE_OTHER_FILES :=
PROFILE_3_JRE_JAR_FILES := \
- jfr.jar \
management-agent.jar
@@ -253,6 +253,6 @@
ext/cldrdata.jar \
ext/dnsns.jar \
ext/nashorn.jar \
- ext/zipfs.jar
+ ext/zipfs.jar \
+ jfr.jar
-
--- a/jdk/src/share/classes/com/sun/crypto/provider/SunJCE.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/crypto/provider/SunJCE.java Tue Aug 20 17:44:18 2013 -0700
@@ -124,7 +124,8 @@
put("Cipher.RSA", "com.sun.crypto.provider.RSACipher");
put("Cipher.RSA SupportedModes", "ECB");
put("Cipher.RSA SupportedPaddings",
- "NOPADDING|PKCS1PADDING|OAEPWITHMD5ANDMGF1PADDING"
+ "NOPADDING|PKCS1PADDING|OAEPPADDING"
+ + "|OAEPWITHMD5ANDMGF1PADDING"
+ "|OAEPWITHSHA1ANDMGF1PADDING"
+ "|OAEPWITHSHA-1ANDMGF1PADDING"
+ "|OAEPWITHSHA-224ANDMGF1PADDING"
--- a/jdk/src/share/classes/com/sun/java/swing/Painter.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/java/swing/Painter.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,5 +29,6 @@
*
* @deprecated Use {@link javax.swing.Painter} instead.
*/
+@Deprecated
public interface Painter<T> extends javax.swing.Painter<T> {
}
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/nimbus/AbstractRegionPainter.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/nimbus/AbstractRegionPainter.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,5 +29,6 @@
*
* @deprecated Use {@link javax.swing.plaf.nimbus.AbstractRegionPainter} instead.
*/
+@Deprecated
public abstract class AbstractRegionPainter extends javax.swing.plaf.nimbus.AbstractRegionPainter {
}
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/nimbus/NimbusLookAndFeel.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/nimbus/NimbusLookAndFeel.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,5 +29,6 @@
*
* @deprecated Use {@link javax.swing.plaf.nimbus.NimbusLookAndFeel} instead.
*/
+@Deprecated
public class NimbusLookAndFeel extends javax.swing.plaf.nimbus.NimbusLookAndFeel {
}
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/DEREncodedKeyValue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/DEREncodedKeyValue.java Tue Aug 20 17:44:18 2013 -0700
@@ -42,7 +42,7 @@
public class DEREncodedKeyValue extends Signature11ElementProxy implements KeyInfoContent {
/** JCA algorithm key types supported by this implementation. */
- public static final String supportedKeyTypes[] = { "RSA", "DSA", "EC"};
+ private static final String supportedKeyTypes[] = { "RSA", "DSA", "EC"};
/**
* Constructor DEREncodedKeyValue
--- a/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Tue Aug 20 17:44:18 2013 -0700
@@ -25,31 +25,9 @@
package com.sun.security.auth;
-import java.io.*;
-import java.lang.reflect.*;
-import java.net.URL;
-import java.util.*;
-
import java.security.CodeSource;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.Permission;
-import java.security.Permissions;
import java.security.PermissionCollection;
-import java.security.Principal;
-import java.security.UnresolvedPermission;
-import java.security.Security;
-import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
-
import javax.security.auth.Subject;
-import javax.security.auth.PrivateCredentialPermission;
-
-import sun.security.util.PropertyExpander;
-
-import sun.security.provider.PolicyParser.PrincipalEntry;
-import sun.security.provider.PolicyParser.GrantEntry;
-import sun.security.provider.PolicyParser.PermissionEntry;
/**
* This class represents a default implementation for
@@ -240,61 +218,14 @@
@Deprecated
public class PolicyFile extends javax.security.auth.Policy {
- static final java.util.ResourceBundle rb =
- java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction<java.util.ResourceBundle>() {
- public java.util.ResourceBundle run() {
- return (java.util.ResourceBundle.getBundle
- ("sun.security.util.AuthResources"));
- }
- });
- // needs to be package private
-
- private static final sun.security.util.Debug debug =
- sun.security.util.Debug.getInstance("policy", "\t[Auth Policy]");
-
- private static final String AUTH_POLICY = "java.security.auth.policy";
- private static final String SECURITY_MANAGER = "java.security.manager";
- private static final String AUTH_POLICY_URL = "auth.policy.url.";
-
- private Vector<PolicyEntry> policyEntries;
- private Hashtable<Object, Object> aliasMapping;
-
- private boolean initialized = false;
-
- private boolean expandProperties = true;
- private boolean ignoreIdentityScope = true;
-
- // for use with the reflection API
-
- private static final Class[] PARAMS = { String.class, String.class};
+ private final sun.security.provider.AuthPolicyFile apf;
/**
* Initializes the Policy object and reads the default policy
* configuration file(s) into the Policy object.
*/
public PolicyFile() {
- // initialize Policy if either the AUTH_POLICY or
- // SECURITY_MANAGER properties are set
- String prop = System.getProperty(AUTH_POLICY);
-
- if (prop == null) {
- prop = System.getProperty(SECURITY_MANAGER);
- }
- if (prop != null)
- init();
- }
-
- private synchronized void init() {
-
- if (initialized)
- return;
-
- policyEntries = new Vector<PolicyEntry>();
- aliasMapping = new Hashtable<Object, Object>(11);
-
- initPolicyFile();
- initialized = true;
+ apf = new sun.security.provider.AuthPolicyFile();
}
/**
@@ -305,460 +236,9 @@
* @exception SecurityException if the caller doesn't have permission
* to refresh the <code>Policy</code>.
*/
- public synchronized void refresh()
- {
-
- java.lang.SecurityManager sm = System.getSecurityManager();
- if (sm != null) {
- sm.checkPermission(new javax.security.auth.AuthPermission
- ("refreshPolicy"));
- }
-
- // XXX
- //
- // 1) if code instantiates PolicyFile directly, then it will need
- // all the permissions required for the PolicyFile initialization
- // 2) if code calls Policy.getPolicy, then it simply needs
- // AuthPermission(getPolicy), and the javax.security.auth.Policy
- // implementation instantiates PolicyFile in a doPrivileged block
- // 3) if after instantiating a Policy (either via #1 or #2),
- // code calls refresh, it simply needs
- // AuthPermission(refreshPolicy). then PolicyFile wraps
- // the refresh in a doPrivileged block.
- initialized = false;
- java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction<Void>() {
- public Void run() {
- init();
- return null;
- }
- });
- }
-
- private KeyStore initKeyStore(URL policyUrl, String keyStoreName,
- String keyStoreType) {
- if (keyStoreName != null) {
- try {
- /*
- * location of keystore is specified as absolute URL in policy
- * file, or is relative to URL of policy file
- */
- URL keyStoreUrl = null;
- try {
- keyStoreUrl = new URL(keyStoreName);
- // absolute URL
- } catch (java.net.MalformedURLException e) {
- // relative URL
- keyStoreUrl = new URL(policyUrl, keyStoreName);
- }
-
- if (debug != null) {
- debug.println("reading keystore"+keyStoreUrl);
- }
-
- InputStream inStream =
- new BufferedInputStream(getInputStream(keyStoreUrl));
-
- KeyStore ks;
- if (keyStoreType != null)
- ks = KeyStore.getInstance(keyStoreType);
- else
- ks = KeyStore.getInstance(KeyStore.getDefaultType());
- ks.load(inStream, null);
- inStream.close();
- return ks;
- } catch (Exception e) {
- // ignore, treat it like we have no keystore
- if (debug != null) {
- e.printStackTrace();
- }
- return null;
- }
- }
- return null;
- }
-
- private void initPolicyFile() {
-
- String prop = Security.getProperty("policy.expandProperties");
-
- if (prop != null) expandProperties = prop.equalsIgnoreCase("true");
-
- String iscp = Security.getProperty("policy.ignoreIdentityScope");
-
- if (iscp != null) ignoreIdentityScope = iscp.equalsIgnoreCase("true");
-
- String allowSys = Security.getProperty("policy.allowSystemProperty");
-
- if ((allowSys!=null) && allowSys.equalsIgnoreCase("true")) {
-
- String extra_policy = System.getProperty(AUTH_POLICY);
- if (extra_policy != null) {
- boolean overrideAll = false;
- if (extra_policy.startsWith("=")) {
- overrideAll = true;
- extra_policy = extra_policy.substring(1);
- }
- try {
- extra_policy = PropertyExpander.expand(extra_policy);
- URL policyURL;
- File policyFile = new File(extra_policy);
- if (policyFile.exists()) {
- policyURL =
- new URL("file:" + policyFile.getCanonicalPath());
- } else {
- policyURL = new URL(extra_policy);
- }
- if (debug != null)
- debug.println("reading "+policyURL);
- init(policyURL);
- } catch (Exception e) {
- // ignore.
- if (debug != null) {
- debug.println("caught exception: "+e);
- }
-
- }
- if (overrideAll) {
- if (debug != null) {
- debug.println("overriding other policies!");
- }
- return;
- }
- }
- }
-
- int n = 1;
- boolean loaded_one = false;
- String policy_url;
-
- while ((policy_url = Security.getProperty(AUTH_POLICY_URL+n)) != null) {
- try {
- policy_url = PropertyExpander.expand(policy_url).replace
- (File.separatorChar, '/');
- if (debug != null)
- debug.println("reading "+policy_url);
- init(new URL(policy_url));
- loaded_one = true;
- } catch (Exception e) {
- if (debug != null) {
- debug.println("error reading policy "+e);
- e.printStackTrace();
- }
- // ignore that policy
- }
- n++;
- }
-
- if (loaded_one == false) {
- // do not load a static policy
- }
- }
-
- /**
- * Checks public key. If it is marked as trusted in
- * the identity database, add it to the policy
- * with the AllPermission.
- */
- private boolean checkForTrustedIdentity(final Certificate cert) {
- // XXX JAAS has no way to access the SUN package.
- // we'll add this back in when JAAS goes into core.
- return false;
- }
-
- /**
- * Reads a policy configuration into the Policy object using a
- * Reader object.
- *
- * @param policyFile the policy Reader object.
- */
- private void init(URL policy) {
- sun.security.provider.PolicyParser pp =
- new sun.security.provider.PolicyParser(expandProperties);
- try {
- InputStreamReader isr
- = new InputStreamReader(getInputStream(policy));
- pp.read(isr);
- isr.close();
- KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(),
- pp.getKeyStoreType());
- Enumeration<GrantEntry> enum_ = pp.grantElements();
- while (enum_.hasMoreElements()) {
- GrantEntry ge = enum_.nextElement();
- addGrantEntry(ge, keyStore);
- }
- } catch (sun.security.provider.PolicyParser.ParsingException pe) {
- System.err.println(AUTH_POLICY +
- rb.getString(".error.parsing.") + policy);
- System.err.println(AUTH_POLICY +
- rb.getString("COLON") +
- pe.getMessage());
- if (debug != null)
- pe.printStackTrace();
-
- } catch (Exception e) {
- if (debug != null) {
- debug.println("error parsing "+policy);
- debug.println(e.toString());
- e.printStackTrace();
- }
- }
- }
-
- /*
- * Fast path reading from file urls in order to avoid calling
- * FileURLConnection.connect() which can be quite slow the first time
- * it is called. We really should clean up FileURLConnection so that
- * this is not a problem but in the meantime this fix helps reduce
- * start up time noticeably for the new launcher. -- DAC
- */
- private InputStream getInputStream(URL url) throws IOException {
- if ("file".equals(url.getProtocol())) {
- String path = url.getFile().replace('/', File.separatorChar);
- return new FileInputStream(path);
- } else {
- return url.openStream();
- }
- }
-
- /**
- * Given a PermissionEntry, create a codeSource.
- *
- * @return null if signedBy alias is not recognized
- */
- CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore)
- throws java.net.MalformedURLException
- {
- Certificate[] certs = null;
- if (ge.signedBy != null) {
- certs = getCertificates(keyStore, ge.signedBy);
- if (certs == null) {
- // we don't have a key for this alias,
- // just return
- if (debug != null) {
- debug.println(" no certs for alias " +
- ge.signedBy + ", ignoring.");
- }
- return null;
- }
- }
-
- URL location;
-
- if (ge.codeBase != null)
- location = new URL(ge.codeBase);
- else
- location = null;
-
- if (ge.principals == null || ge.principals.size() == 0) {
- return (canonicalizeCodebase
- (new CodeSource(location, certs),
- false));
- } else {
- return (canonicalizeCodebase
- (new SubjectCodeSource(null, ge.principals, location, certs),
- false));
- }
- }
-
- /**
- * Add one policy entry to the vector.
- */
- private void addGrantEntry(GrantEntry ge, KeyStore keyStore) {
-
- if (debug != null) {
- debug.println("Adding policy entry: ");
- debug.println(" signedBy " + ge.signedBy);
- debug.println(" codeBase " + ge.codeBase);
- if (ge.principals != null && ge.principals.size() > 0) {
- ListIterator<PrincipalEntry> li = ge.principals.listIterator();
- while (li.hasNext()) {
- PrincipalEntry pppe = li.next();
- debug.println(" " + pppe.getPrincipalClass() +
- " " + pppe.getPrincipalName());
- }
- }
- debug.println();
- }
-
- try {
- CodeSource codesource = getCodeSource(ge, keyStore);
- // skip if signedBy alias was unknown...
- if (codesource == null) return;
-
- PolicyEntry entry = new PolicyEntry(codesource);
- Enumeration<PermissionEntry> enum_ = ge.permissionElements();
- while (enum_.hasMoreElements()) {
- PermissionEntry pe = enum_.nextElement();
- try {
- // XXX special case PrivateCredentialPermission-SELF
- Permission perm;
- if (pe.permission.equals
- ("javax.security.auth.PrivateCredentialPermission") &&
- pe.name.endsWith(" self")) {
- perm = getInstance(pe.permission,
- pe.name + " \"self\"",
- pe.action);
- } else {
- perm = getInstance(pe.permission,
- pe.name,
- pe.action);
- }
- entry.add(perm);
- if (debug != null) {
- debug.println(" "+perm);
- }
- } catch (ClassNotFoundException cnfe) {
- Certificate certs[];
- if (pe.signedBy != null)
- certs = getCertificates(keyStore, pe.signedBy);
- else
- certs = null;
-
- // only add if we had no signer or we had a
- // a signer and found the keys for it.
- if (certs != null || pe.signedBy == null) {
- Permission perm = new UnresolvedPermission(
- pe.permission,
- pe.name,
- pe.action,
- certs);
- entry.add(perm);
- if (debug != null) {
- debug.println(" "+perm);
- }
- }
- } catch (java.lang.reflect.InvocationTargetException ite) {
- System.err.println
- (AUTH_POLICY +
- rb.getString(".error.adding.Permission.") +
- pe.permission +
- rb.getString("SPACE") +
- ite.getTargetException());
- } catch (Exception e) {
- System.err.println
- (AUTH_POLICY +
- rb.getString(".error.adding.Permission.") +
- pe.permission +
- rb.getString("SPACE") +
- e);
- }
- }
- policyEntries.addElement(entry);
- } catch (Exception e) {
- System.err.println
- (AUTH_POLICY +
- rb.getString(".error.adding.Entry.") +
- ge +
- rb.getString("SPACE") +
- e);
- }
-
- if (debug != null)
- debug.println();
- }
-
- /**
- * Returns a new Permission object of the given Type. The Permission is
- * created by getting the
- * Class object using the <code>Class.forName</code> method, and using
- * the reflection API to invoke the (String name, String actions)
- * constructor on the
- * object.
- *
- * @param type the type of Permission being created.
- * @param name the name of the Permission being created.
- * @param actions the actions of the Permission being created.
- *
- * @exception ClassNotFoundException if the particular Permission
- * class could not be found.
- *
- * @exception IllegalAccessException if the class or initializer is
- * not accessible.
- *
- * @exception InstantiationException if getInstance tries to
- * instantiate an abstract class or an interface, or if the
- * instantiation fails for some other reason.
- *
- * @exception NoSuchMethodException if the (String, String) constructor
- * is not found.
- *
- * @exception InvocationTargetException if the underlying Permission
- * constructor throws an exception.
- *
- */
-
- private static final Permission getInstance(String type,
- String name,
- String actions)
- throws ClassNotFoundException,
- InstantiationException,
- IllegalAccessException,
- NoSuchMethodException,
- InvocationTargetException
- {
- //XXX we might want to keep a hash of created factories...
- Class<?> pc = Class.forName(type);
- Constructor<?> c = pc.getConstructor(PARAMS);
- return (Permission) c.newInstance(new Object[] { name, actions });
- }
-
- /**
- * Fetch all certs associated with this alias.
- */
- Certificate[] getCertificates(
- KeyStore keyStore, String aliases) {
-
- Vector<Certificate> vcerts = null;
-
- StringTokenizer st = new StringTokenizer(aliases, ",");
- int n = 0;
-
- while (st.hasMoreTokens()) {
- String alias = st.nextToken().trim();
- n++;
- Certificate cert = null;
- //See if this alias's cert has already been cached
- cert = (Certificate) aliasMapping.get(alias);
- if (cert == null && keyStore != null) {
-
- try {
- cert = keyStore.getCertificate(alias);
- } catch (KeyStoreException kse) {
- // never happens, because keystore has already been loaded
- // when we call this
- }
- if (cert != null) {
- aliasMapping.put(alias, cert);
- aliasMapping.put(cert, alias);
- }
- }
-
- if (cert != null) {
- if (vcerts == null)
- vcerts = new Vector<Certificate>();
- vcerts.addElement(cert);
- }
- }
-
- // make sure n == vcerts.size, since we are doing a logical *and*
- if (vcerts != null && n == vcerts.size()) {
- Certificate[] certs = new Certificate[vcerts.size()];
- vcerts.copyInto(certs);
- return certs;
- } else {
- return null;
- }
- }
-
- /**
- * Enumerate all the entries in the global policy object.
- * This method is used by policy admin tools. The tools
- * should use the Enumeration methods on the returned object
- * to fetch the elements sequentially.
- */
- private final synchronized Enumeration<PolicyEntry> elements(){
- return policyEntries.elements();
+ @Override
+ public void refresh() {
+ apf.refresh();
}
/**
@@ -816,646 +296,9 @@
* @return the Permissions granted to the provided <code>Subject</code>
* <code>CodeSource</code>.
*/
+ @Override
public PermissionCollection getPermissions(final Subject subject,
- final CodeSource codesource) {
-
- // XXX when JAAS goes into the JDK core,
- // we can remove this method and simply
- // rely on the getPermissions variant that takes a codesource,
- // which no one can use at this point in time.
- // at that time, we can also make SubjectCodeSource a public
- // class.
-
- // XXX
- //
- // 1) if code instantiates PolicyFile directly, then it will need
- // all the permissions required for the PolicyFile initialization
- // 2) if code calls Policy.getPolicy, then it simply needs
- // AuthPermission(getPolicy), and the javax.security.auth.Policy
- // implementation instantiates PolicyFile in a doPrivileged block
- // 3) if after instantiating a Policy (either via #1 or #2),
- // code calls getPermissions, PolicyFile wraps the call
- // in a doPrivileged block.
- return java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction<PermissionCollection>() {
- public PermissionCollection run() {
- SubjectCodeSource scs = new SubjectCodeSource
- (subject,
- null,
- codesource == null ? null : codesource.getLocation(),
- codesource == null ? null : codesource.getCertificates());
- if (initialized)
- return getPermissions(new Permissions(), scs);
- else
- return new PolicyPermissions(PolicyFile.this, scs);
- }
- });
- }
-
- /**
- * Examines the global policy for the specified CodeSource, and
- * creates a PermissionCollection object with
- * the set of permissions for that principal's protection domain.
- *
- * @param CodeSource the codesource associated with the caller.
- * This encapsulates the original location of the code (where the code
- * came from) and the public key(s) of its signer.
- *
- * @return the set of permissions according to the policy.
- */
- PermissionCollection getPermissions(CodeSource codesource) {
-
- if (initialized)
- return getPermissions(new Permissions(), codesource);
- else
- return new PolicyPermissions(this, codesource);
- }
-
- /**
- * Examines the global policy for the specified CodeSource, and
- * creates a PermissionCollection object with
- * the set of permissions for that principal's protection domain.
- *
- * @param permissions the permissions to populate
- * @param codesource the codesource associated with the caller.
- * This encapsulates the original location of the code (where the code
- * came from) and the public key(s) of its signer.
- *
- * @return the set of permissions according to the policy.
- */
- Permissions getPermissions(final Permissions perms,
- final CodeSource cs)
- {
- if (!initialized) {
- init();
- }
-
- final CodeSource codesource[] = {null};
-
- codesource[0] = canonicalizeCodebase(cs, true);
-
- if (debug != null) {
- debug.println("evaluate("+codesource[0]+")\n");
- }
-
- // needs to be in a begin/endPrivileged block because
- // codesource.implies calls URL.equals which does an
- // InetAddress lookup
-
- for (int i = 0; i < policyEntries.size(); i++) {
-
- PolicyEntry entry = policyEntries.elementAt(i);
-
- if (debug != null) {
- debug.println("PolicyFile CodeSource implies: " +
- entry.codesource.toString() + "\n\n" +
- "\t" + codesource[0].toString() + "\n\n");
- }
-
- if (entry.codesource.implies(codesource[0])) {
- for (int j = 0; j < entry.permissions.size(); j++) {
- Permission p = entry.permissions.elementAt(j);
- if (debug != null) {
- debug.println(" granting " + p);
- }
- if (!addSelfPermissions(p, entry.codesource,
- codesource[0], perms)) {
- // we could check for duplicates
- // before adding new permissions,
- // but the SubjectDomainCombiner
- // already checks for duplicates later
- perms.add(p);
- }
- }
- }
- }
-
- // now see if any of the keys are trusted ids.
-
- if (!ignoreIdentityScope) {
- Certificate certs[] = codesource[0].getCertificates();
- if (certs != null) {
- for (int k=0; k < certs.length; k++) {
- if ((aliasMapping.get(certs[k]) == null) &&
- checkForTrustedIdentity(certs[k])) {
- // checkForTrustedIdentity added it
- // to the policy for us. next time
- // around we'll find it. This time
- // around we need to add it.
- perms.add(new java.security.AllPermission());
- }
- }
- }
- }
- return perms;
- }
-
- /**
- * Returns true if 'Self' permissions were added to the provided
- * 'perms', and false otherwise.
- *
- * <p>
- *
- * @param p check to see if this Permission is a "SELF"
- * PrivateCredentialPermission. <p>
- *
- * @param entryCs the codesource for the Policy entry.
- *
- * @param accCs the codesource for from the current AccessControlContext.
- *
- * @param perms the PermissionCollection where the individual
- * PrivateCredentialPermissions will be added.
- */
- private boolean addSelfPermissions(final Permission p,
- CodeSource entryCs,
- CodeSource accCs,
- Permissions perms) {
-
- if (!(p instanceof PrivateCredentialPermission))
- return false;
-
- if (!(entryCs instanceof SubjectCodeSource))
- return false;
-
-
- PrivateCredentialPermission pcp = (PrivateCredentialPermission)p;
- SubjectCodeSource scs = (SubjectCodeSource)entryCs;
-
- // see if it is a SELF permission
- String[][] pPrincipals = pcp.getPrincipals();
- if (pPrincipals.length <= 0 ||
- !pPrincipals[0][0].equalsIgnoreCase("self") ||
- !pPrincipals[0][1].equalsIgnoreCase("self")) {
-
- // regular PrivateCredentialPermission
- return false;
- } else {
-
- // granted a SELF permission - create a
- // PrivateCredentialPermission for each
- // of the Policy entry's CodeSource Principals
-
- if (scs.getPrincipals() == null) {
- // XXX SubjectCodeSource has no Subject???
- return true;
- }
-
- ListIterator<PrincipalEntry> pli =
- scs.getPrincipals().listIterator();
- while (pli.hasNext()) {
-
- PrincipalEntry principal = pli.next();
-
- // XXX
- // if the Policy entry's Principal does not contain a
- // WILDCARD for the Principal name, then a
- // new PrivateCredentialPermission is created
- // for the Principal listed in the Policy entry.
- // if the Policy entry's Principal contains a WILDCARD
- // for the Principal name, then a new
- // PrivateCredentialPermission is created
- // for each Principal associated with the Subject
- // in the current ACC.
-
- String[][] principalInfo = getPrincipalInfo
- (principal, accCs);
-
- for (int i = 0; i < principalInfo.length; i++) {
-
- // here's the new PrivateCredentialPermission
-
- PrivateCredentialPermission newPcp =
- new PrivateCredentialPermission
- (pcp.getCredentialClass() +
- " " +
- principalInfo[i][0] +
- " " +
- "\"" + principalInfo[i][1] + "\"",
- "read");
-
- if (debug != null) {
- debug.println("adding SELF permission: " +
- newPcp.toString());
- }
-
- perms.add(newPcp);
- }
- }
- }
- return true;
- }
-
- /**
- * return the principal class/name pair in the 2D array.
- * array[x][y]: x corresponds to the array length.
- * if (y == 0), it's the principal class.
- * if (y == 1), it's the principal name.
- */
- private String[][] getPrincipalInfo
- (PrincipalEntry principal, final CodeSource accCs) {
-
- // there are 3 possibilities:
- // 1) the entry's Principal class and name are not wildcarded
- // 2) the entry's Principal name is wildcarded only
- // 3) the entry's Principal class and name are wildcarded
-
- if (!principal.getPrincipalClass().equals
- (PrincipalEntry.WILDCARD_CLASS) &&
- !principal.getPrincipalName().equals
- (PrincipalEntry.WILDCARD_NAME)) {
-
- // build a PrivateCredentialPermission for the principal
- // from the Policy entry
- String[][] info = new String[1][2];
- info[0][0] = principal.getPrincipalClass();
- info[0][1] = principal.getPrincipalName();
- return info;
-
- } else if (!principal.getPrincipalClass().equals
- (PrincipalEntry.WILDCARD_CLASS) &&
- principal.getPrincipalName().equals
- (PrincipalEntry.WILDCARD_NAME)) {
-
- // build a PrivateCredentialPermission for all
- // the Subject's principals that are instances of principalClass
-
- // the accCs is guaranteed to be a SubjectCodeSource
- // because the earlier CodeSource.implies succeeded
- SubjectCodeSource scs = (SubjectCodeSource)accCs;
-
- Set<? extends Principal> principalSet = null;
- try {
- // principal.principalClass should extend Principal
- // If it doesn't, we should stop here with a ClassCastException.
- @SuppressWarnings("unchecked")
- Class<? extends Principal> pClass = (Class<? extends Principal>)
- Class.forName(principal.getPrincipalClass(), false,
- ClassLoader.getSystemClassLoader());
- principalSet = scs.getSubject().getPrincipals(pClass);
- } catch (Exception e) {
- if (debug != null) {
- debug.println("problem finding Principal Class " +
- "when expanding SELF permission: " +
- e.toString());
- }
- }
-
- if (principalSet == null) {
- // error
- return new String[0][0];
- }
-
- String[][] info = new String[principalSet.size()][2];
-
- int i = 0;
- for (Principal p : principalSet) {
- info[i][0] = p.getClass().getName();
- info[i][1] = p.getName();
- i++;
- }
- return info;
-
- } else {
-
- // build a PrivateCredentialPermission for every
- // one of the current Subject's principals
-
- // the accCs is guaranteed to be a SubjectCodeSource
- // because the earlier CodeSource.implies succeeded
- SubjectCodeSource scs = (SubjectCodeSource)accCs;
- Set<Principal> principalSet = scs.getSubject().getPrincipals();
-
- String[][] info = new String[principalSet.size()][2];
- java.util.Iterator<Principal> pIterator = principalSet.iterator();
-
- int i = 0;
- while (pIterator.hasNext()) {
- Principal p = pIterator.next();
- info[i][0] = p.getClass().getName();
- info[i][1] = p.getName();
- i++;
- }
- return info;
- }
- }
-
- /*
- * Returns the signer certificates from the list of certificates associated
- * with the given code source.
- *
- * The signer certificates are those certificates that were used to verify
- * signed code originating from the codesource location.
- *
- * This method assumes that in the given code source, each signer
- * certificate is followed by its supporting certificate chain
- * (which may be empty), and that the signer certificate and its
- * supporting certificate chain are ordered bottom-to-top (i.e., with the
- * signer certificate first and the (root) certificate authority last).
- */
- Certificate[] getSignerCertificates(CodeSource cs) {
- Certificate[] certs = null;
- if ((certs = cs.getCertificates()) == null)
- return null;
- for (int i=0; i<certs.length; i++) {
- if (!(certs[i] instanceof X509Certificate))
- return cs.getCertificates();
- }
-
- // Do we have to do anything?
- int i = 0;
- int count = 0;
- while (i < certs.length) {
- count++;
- while (((i+1) < certs.length)
- && ((X509Certificate)certs[i]).getIssuerDN().equals(
- ((X509Certificate)certs[i+1]).getSubjectDN())) {
- i++;
- }
- i++;
- }
- if (count == certs.length)
- // Done
- return certs;
-
- ArrayList<Certificate> userCertList = new ArrayList<>();
- i = 0;
- while (i < certs.length) {
- userCertList.add(certs[i]);
- while (((i+1) < certs.length)
- && ((X509Certificate)certs[i]).getIssuerDN().equals(
- ((X509Certificate)certs[i+1]).getSubjectDN())) {
- i++;
- }
- i++;
- }
- Certificate[] userCerts = new Certificate[userCertList.size()];
- userCertList.toArray(userCerts);
- return userCerts;
- }
-
- private CodeSource canonicalizeCodebase(CodeSource cs,
- boolean extractSignerCerts) {
- CodeSource canonCs = cs;
- if (cs.getLocation() != null &&
- cs.getLocation().getProtocol().equalsIgnoreCase("file")) {
- try {
- String path = cs.getLocation().getFile().replace
- ('/',
- File.separatorChar);
- URL csUrl = null;
- if (path.endsWith("*")) {
- // remove trailing '*' because it causes canonicalization
- // to fail on win32
- path = path.substring(0, path.length()-1);
- boolean appendFileSep = false;
- if (path.endsWith(File.separator))
- appendFileSep = true;
- if (path.equals("")) {
- path = System.getProperty("user.dir");
- }
- File f = new File(path);
- path = f.getCanonicalPath();
- StringBuffer sb = new StringBuffer(path);
- // reappend '*' to canonicalized filename (note that
- // canonicalization may have removed trailing file
- // separator, so we have to check for that, too)
- if (!path.endsWith(File.separator) &&
- (appendFileSep || f.isDirectory()))
- sb.append(File.separatorChar);
- sb.append('*');
- path = sb.toString();
- } else {
- path = new File(path).getCanonicalPath();
- }
- csUrl = new File(path).toURL();
-
- if (cs instanceof SubjectCodeSource) {
- SubjectCodeSource scs = (SubjectCodeSource)cs;
- if (extractSignerCerts) {
- canonCs = new SubjectCodeSource
- (scs.getSubject(),
- scs.getPrincipals(),
- csUrl,
- getSignerCertificates(scs));
- } else {
- canonCs = new SubjectCodeSource
- (scs.getSubject(),
- scs.getPrincipals(),
- csUrl,
- scs.getCertificates());
- }
- } else {
- if (extractSignerCerts) {
- canonCs = new CodeSource(csUrl,
- getSignerCertificates(cs));
- } else {
- canonCs = new CodeSource(csUrl,
- cs.getCertificates());
- }
- }
- } catch (IOException ioe) {
- // leave codesource as it is, unless we have to extract its
- // signer certificates
- if (extractSignerCerts) {
- if (!(cs instanceof SubjectCodeSource)) {
- canonCs = new CodeSource(cs.getLocation(),
- getSignerCertificates(cs));
- } else {
- SubjectCodeSource scs = (SubjectCodeSource)cs;
- canonCs = new SubjectCodeSource(scs.getSubject(),
- scs.getPrincipals(),
- scs.getLocation(),
- getSignerCertificates(scs));
- }
- }
- }
- } else {
- if (extractSignerCerts) {
- if (!(cs instanceof SubjectCodeSource)) {
- canonCs = new CodeSource(cs.getLocation(),
- getSignerCertificates(cs));
- } else {
- SubjectCodeSource scs = (SubjectCodeSource)cs;
- canonCs = new SubjectCodeSource(scs.getSubject(),
- scs.getPrincipals(),
- scs.getLocation(),
- getSignerCertificates(scs));
- }
- }
- }
- return canonCs;
- }
-
- /**
- * Each entry in the policy configuration file is represented by a
- * PolicyEntry object. <p>
- *
- * A PolicyEntry is a (CodeSource,Permission) pair. The
- * CodeSource contains the (URL, PublicKey) that together identify
- * where the Java bytecodes come from and who (if anyone) signed
- * them. The URL could refer to localhost. The URL could also be
- * null, meaning that this policy entry is given to all comers, as
- * long as they match the signer field. The signer could be null,
- * meaning the code is not signed. <p>
- *
- * The Permission contains the (Type, Name, Action) triplet. <p>
- *
- * For now, the Policy object retrieves the public key from the
- * X.509 certificate on disk that corresponds to the signedBy
- * alias specified in the Policy config file. For reasons of
- * efficiency, the Policy object keeps a hashtable of certs already
- * read in. This could be replaced by a secure internal key
- * store.
- *
- * <p>
- * For example, the entry
- * <pre>
- * permission java.io.File "/tmp", "read,write",
- * signedBy "Duke";
- * </pre>
- * is represented internally
- * <pre>
- *
- * FilePermission f = new FilePermission("/tmp", "read,write");
- * PublicKey p = publickeys.get("Duke");
- * URL u = InetAddress.getLocalHost();
- * CodeBase c = new CodeBase( p, u );
- * pe = new PolicyEntry(f, c);
- * </pre>
- *
- * @author Marianne Mueller
- * @author Roland Schemers
- * @see java.security.CodeSource
- * @see java.security.Policy
- * @see java.security.Permissions
- * @see java.security.ProtectionDomain
- */
-
- private static class PolicyEntry {
-
- CodeSource codesource;
- Vector<Permission> permissions;
-
- /**
- * Given a Permission and a CodeSource, create a policy entry.
- *
- * XXX Decide if/how to add validity fields and "purpose" fields to
- * XXX policy entries
- *
- * @param cs the CodeSource, which encapsulates the URL and the public
- * key
- * attributes from the policy config file. Validity checks are
- * performed on the public key before PolicyEntry is called.
- *
- */
- PolicyEntry(CodeSource cs)
- {
- this.codesource = cs;
- this.permissions = new Vector<Permission>();
- }
-
- /**
- * add a Permission object to this entry.
- */
- void add(Permission p) {
- permissions.addElement(p);
- }
-
- /**
- * Return the CodeSource for this policy entry
- */
- CodeSource getCodeSource() {
- return this.codesource;
- }
-
- public String toString(){
- StringBuffer sb = new StringBuffer();
- sb.append(rb.getString("LPARAM"));
- sb.append(getCodeSource());
- sb.append("\n");
- for (int j = 0; j < permissions.size(); j++) {
- Permission p = permissions.elementAt(j);
- sb.append(rb.getString("SPACE"));
- sb.append(rb.getString("SPACE"));
- sb.append(p);
- sb.append(rb.getString("NEWLINE"));
- }
- sb.append(rb.getString("RPARAM"));
- sb.append(rb.getString("NEWLINE"));
- return sb.toString();
- }
-
+ final CodeSource codesource) {
+ return apf.getPermissions(subject, codesource);
}
}
-
-@SuppressWarnings("deprecation")
-class PolicyPermissions extends PermissionCollection {
-
- private static final long serialVersionUID = -1954188373270545523L;
-
- private CodeSource codesource;
- private Permissions perms;
- private PolicyFile policy;
- private boolean notInit; // have we pulled in the policy permissions yet?
- private Vector<Permission> additionalPerms;
-
- PolicyPermissions(PolicyFile policy,
- CodeSource codesource)
- {
- this.codesource = codesource;
- this.policy = policy;
- this.perms = null;
- this.notInit = true;
- this.additionalPerms = null;
- }
-
- public void add(Permission permission) {
- if (isReadOnly())
- throw new SecurityException
- (PolicyFile.rb.getString
- ("attempt.to.add.a.Permission.to.a.readonly.PermissionCollection"));
-
- if (perms == null) {
- if (additionalPerms == null)
- additionalPerms = new Vector<Permission>();
- additionalPerms.add(permission);
- } else {
- perms.add(permission);
- }
- }
-
- private synchronized void init() {
- if (notInit) {
- if (perms == null)
- perms = new Permissions();
-
- if (additionalPerms != null) {
- Enumeration<Permission> e = additionalPerms.elements();
- while (e.hasMoreElements()) {
- perms.add(e.nextElement());
- }
- additionalPerms = null;
- }
- policy.getPermissions(perms,codesource);
- notInit=false;
- }
- }
-
- public boolean implies(Permission permission) {
- if (notInit)
- init();
- return perms.implies(permission);
- }
-
- public Enumeration<Permission> elements() {
- if (notInit)
- init();
- return perms.elements();
- }
-
- public String toString() {
- if (notInit)
- init();
- return perms.toString();
- }
-}
--- a/jdk/src/share/classes/com/sun/security/auth/PolicyParser.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,964 +0,0 @@
-/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.security.auth;
-
-import java.io.*;
-import java.lang.RuntimePermission;
-import java.net.MalformedURLException;
-import java.net.SocketPermission;
-import java.net.URL;
-import java.security.GeneralSecurityException;
-import java.text.MessageFormat;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.LinkedList;
-import java.util.ListIterator;
-import java.util.Vector;
-import java.util.StringTokenizer;
-import sun.security.util.PropertyExpander;
-
-/**
- * The policy for a Java runtime (specifying
- * which permissions are available for code from various principals)
- * is represented as a separate
- * persistent configuration. The configuration may be stored as a
- * flat ASCII file, as a serialized binary file of
- * the Policy class, or as a database. <p>
- *
- * <p>The Java runtime creates one global Policy object, which is used to
- * represent the static policy configuration file. It is consulted by
- * a ProtectionDomain when the protection domain initializes its set of
- * permissions. <p>
- *
- * <p>The Policy <code>init</code> method parses the policy
- * configuration file, and then
- * populates the Policy object. The Policy object is agnostic in that
- * it is not involved in making policy decisions. It is merely the
- * Java runtime representation of the persistent policy configuration
- * file. <p>
- *
- * <p>When a protection domain needs to initialize its set of
- * permissions, it executes code such as the following
- * to ask the global Policy object to populate a
- * Permissions object with the appropriate permissions:
- * <pre>
- * policy = Policy.getPolicy();
- * Permissions perms = policy.getPermissions(MyCodeSource)
- * </pre>
- *
- * <p>The protection domain passes in a CodeSource
- * object, which encapsulates its codebase (URL) and public key attributes.
- * The Policy object evaluates the global policy in light of who the
- * principal is and returns an appropriate Permissions object.
- *
- * @deprecated As of JDK 1.4, replaced by
- * {@link sun.security.provider.PolicyParser}.
- * This class is entirely deprecated.
- *
- * @author Roland Schemers
- *
- * @since 1.2
- */
-@Deprecated
-class PolicyParser {
-
- private static final java.util.ResourceBundle rb =
- java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction<java.util.ResourceBundle>() {
- public java.util.ResourceBundle run() {
- return (java.util.ResourceBundle.getBundle
- ("sun.security.util.AuthResources"));
- }
- });
-
- private Vector<GrantEntry> grantEntries;
-
- // Convenience variables for parsing
- private static final sun.security.util.Debug debug =
- sun.security.util.Debug.getInstance("parser", "\t[Auth Policy Parser]");
- private StreamTokenizer st;
- private int lookahead;
- private int linenum;
- private boolean expandProp = false;
- private String keyStoreUrlString = null; // unexpanded
- private String keyStoreType = null;
-
- private String expand(String value)
- throws PropertyExpander.ExpandException
- {
- if (expandProp)
- return PropertyExpander.expand(value);
- else
- return value;
- }
- /**
- * Creates a PolicyParser object.
- */
-
- public PolicyParser() {
- grantEntries = new Vector<GrantEntry>();
- }
-
-
- public PolicyParser(boolean expandProp) {
- this();
- this.expandProp = expandProp;
- }
-
- /**
- * Reads a policy configuration into the Policy object using a
- * Reader object. <p>
- *
- * @param policy the policy Reader object.
- *
- * @exception ParsingException if the policy configuration contains
- * a syntax error.
- *
- * @exception IOException if an error occurs while reading the policy
- * configuration.
- */
-
- public void read(Reader policy)
- throws ParsingException, IOException
- {
- if (!(policy instanceof BufferedReader)) {
- policy = new BufferedReader(policy);
- }
-
- /**
- * Configure the stream tokenizer:
- * Recognize strings between "..."
- * Don't convert words to lowercase
- * Recognize both C-style and C++-style comments
- * Treat end-of-line as white space, not as a token
- */
- st = new StreamTokenizer(policy);
-
- st.resetSyntax();
- st.wordChars('a', 'z');
- st.wordChars('A', 'Z');
- st.wordChars('.', '.');
- st.wordChars('0', '9');
- st.wordChars('_', '_');
- st.wordChars('$', '$');
- st.wordChars(128 + 32, 255);
- st.whitespaceChars(0, ' ');
- st.commentChar('/');
- st.quoteChar('\'');
- st.quoteChar('"');
- st.lowerCaseMode(false);
- st.ordinaryChar('/');
- st.slashSlashComments(true);
- st.slashStarComments(true);
-
- /**
- * The main parsing loop. The loop is executed once
- * for each entry in the config file. The entries
- * are delimited by semicolons. Once we've read in
- * the information for an entry, go ahead and try to
- * add it to the policy vector.
- *
- */
-
- lookahead = st.nextToken();
- while (lookahead != StreamTokenizer.TT_EOF) {
- if (peek("grant")) {
- GrantEntry ge = parseGrantEntry();
- // could be null if we couldn't expand a property
- if (ge != null)
- add(ge);
- } else if (peek("keystore") && keyStoreUrlString==null) {
- // only one keystore entry per policy file, others will be
- // ignored
- parseKeyStoreEntry();
- } else {
- // error?
- }
- match(";");
- }
- }
-
- public void add(GrantEntry ge)
- {
- grantEntries.addElement(ge);
- }
-
- public void replace(GrantEntry origGe, GrantEntry newGe)
- {
- grantEntries.setElementAt(newGe, grantEntries.indexOf(origGe));
- }
-
- public boolean remove(GrantEntry ge)
- {
- return grantEntries.removeElement(ge);
- }
-
- /**
- * Returns the (possibly expanded) keystore location, or null if the
- * expansion fails.
- */
- public String getKeyStoreUrl() {
- try {
- if (keyStoreUrlString!=null && keyStoreUrlString.length()!=0) {
- return expand(keyStoreUrlString).replace(File.separatorChar,
- '/');
- }
- } catch (PropertyExpander.ExpandException peee) {
- return null;
- }
- return null;
- }
-
- public void setKeyStoreUrl(String url) {
- keyStoreUrlString = url;
- }
-
- public String getKeyStoreType() {
- return keyStoreType;
- }
-
- public void setKeyStoreType(String type) {
- keyStoreType = type;
- }
-
- /**
- * Enumerate all the entries in the global policy object.
- * This method is used by policy admin tools. The tools
- * should use the Enumeration methods on the returned object
- * to fetch the elements sequentially.
- */
- public Enumeration<GrantEntry> grantElements(){
- return grantEntries.elements();
- }
-
- /**
- * write out the policy
- */
-
- public void write(Writer policy)
- {
- PrintWriter out = new PrintWriter(new BufferedWriter(policy));
-
- Enumeration<GrantEntry> enum_ = grantElements();
-
- out.println("/* AUTOMATICALLY GENERATED ON "+
- (new java.util.Date()) + "*/");
- out.println("/* DO NOT EDIT */");
- out.println();
-
- // write the (unexpanded) keystore entry as the first entry of the
- // policy file
- if (keyStoreUrlString != null) {
- writeKeyStoreEntry(out);
- }
-
- // write "grant" entries
- while (enum_.hasMoreElements()) {
- GrantEntry ge = enum_.nextElement();
- ge.write(out);
- out.println();
- }
- out.flush();
- }
-
- /**
- * parses a keystore entry
- */
- private void parseKeyStoreEntry() throws ParsingException, IOException {
- match("keystore");
- keyStoreUrlString = match("quoted string");
-
- // parse keystore type
- if (!peek(",")) {
- return; // default type
- }
- match(",");
-
- if (peek("\"")) {
- keyStoreType = match("quoted string");
- } else {
- throw new ParsingException(st.lineno(),
- rb.getString("expected.keystore.type"));
- }
- }
-
- /**
- * writes the (unexpanded) keystore entry
- */
- private void writeKeyStoreEntry(PrintWriter out) {
- out.print("keystore \"");
- out.print(keyStoreUrlString);
- out.print('"');
- if (keyStoreType != null && keyStoreType.length() > 0)
- out.print(", \"" + keyStoreType + "\"");
- out.println(";");
- out.println();
- }
-
- /**
- * parse a Grant entry
- */
- private GrantEntry parseGrantEntry()
- throws ParsingException, IOException
- {
- GrantEntry e = new GrantEntry();
- LinkedList<PrincipalEntry> principals = null;
- boolean ignoreEntry = false;
-
- match("grant");
-
- while(!peek("{")) {
-
- if (peekAndMatch("Codebase")) {
- e.codeBase = match("quoted string");
- peekAndMatch(",");
- } else if (peekAndMatch("SignedBy")) {
- e.signedBy = match("quoted string");
- peekAndMatch(",");
- } else if (peekAndMatch("Principal")) {
- if (principals == null) {
- principals = new LinkedList<PrincipalEntry>();
- }
-
- // check for principalClass wildcard
- String principalClass;
- if (peek("*")) {
- match("*");
- principalClass = PrincipalEntry.WILDCARD_CLASS;
- } else {
- principalClass = match("principal type");
- }
-
- // check for principalName wildcard
- String principalName;
- if (peek("*")) {
- match("*");
- principalName = PrincipalEntry.WILDCARD_NAME;
- } else {
- principalName = match("quoted string");
- }
-
- // disallow WILDCARD_CLASS && actual name
- if (principalClass.equals(PrincipalEntry.WILDCARD_CLASS) &&
- !principalName.equals(PrincipalEntry.WILDCARD_NAME)) {
- if (debug != null)
- debug.println("disallowing principal that has " +
- "WILDCARD class but no WILDCARD name");
- throw new ParsingException
- (st.lineno(),
- rb.getString("can.not.specify.Principal.with.a." +
- "wildcard.class.without.a.wildcard.name"));
- }
-
- try {
- principalName = expand(principalName);
- principals.add
- (new PrincipalEntry(principalClass, principalName));
- } catch (PropertyExpander.ExpandException peee) {
- // ignore the entire policy entry
- // but continue parsing all the info
- // so we can get to the next entry
- if (debug != null)
- debug.println("principal name expansion failed: " +
- principalName);
- ignoreEntry = true;
- }
- peekAndMatch(",");
- } else {
- throw new
- ParsingException(st.lineno(),
- rb.getString("expected.codeBase.or.SignedBy"));
- }
- }
-
- // disallow non principal-based grant entries
- if (principals == null) {
- throw new ParsingException
- (st.lineno(),
- rb.getString("only.Principal.based.grant.entries.permitted"));
- }
-
- e.principals = principals;
- match("{");
-
- while(!peek("}")) {
- if (peek("Permission")) {
- try {
- PermissionEntry pe = parsePermissionEntry();
- e.add(pe);
- } catch (PropertyExpander.ExpandException peee) {
- // ignore. The add never happened
- skipEntry(); // BugId 4219343
- }
- match(";");
- } else {
- throw new
- ParsingException(st.lineno(),
- rb.getString("expected.permission.entry"));
- }
- }
- match("}");
-
- try {
- if (e.codeBase != null)
- e.codeBase = expand(e.codeBase).replace(File.separatorChar, '/');
- e.signedBy = expand(e.signedBy);
- } catch (PropertyExpander.ExpandException peee) {
- return null;
- }
-
- return (ignoreEntry == true) ? null : e;
- }
-
- /**
- * parse a Permission entry
- */
- private PermissionEntry parsePermissionEntry()
- throws ParsingException, IOException, PropertyExpander.ExpandException
- {
- PermissionEntry e = new PermissionEntry();
-
- // Permission
- match("Permission");
- e.permission = match("permission type");
-
- if (peek("\"")) {
- // Permission name
- e.name = expand(match("quoted string"));
- }
-
- if (!peek(",")) {
- return e;
- }
- match(",");
-
- if (peek("\"")) {
- e.action = expand(match("quoted string"));
- if (!peek(",")) {
- return e;
- }
- match(",");
- }
-
- if (peekAndMatch("SignedBy")) {
- e.signedBy = expand(match("quoted string"));
- }
- return e;
- }
-
- private boolean peekAndMatch(String expect)
- throws ParsingException, IOException
- {
- if (peek(expect)) {
- match(expect);
- return true;
- } else {
- return false;
- }
- }
-
- private boolean peek(String expect) {
- boolean found = false;
-
- switch (lookahead) {
-
- case StreamTokenizer.TT_WORD:
- if (expect.equalsIgnoreCase(st.sval))
- found = true;
- break;
- case ',':
- if (expect.equalsIgnoreCase(","))
- found = true;
- break;
- case '{':
- if (expect.equalsIgnoreCase("{"))
- found = true;
- break;
- case '}':
- if (expect.equalsIgnoreCase("}"))
- found = true;
- break;
- case '"':
- if (expect.equalsIgnoreCase("\""))
- found = true;
- break;
- case '*':
- if (expect.equalsIgnoreCase("*"))
- found = true;
- break;
- default:
-
- }
- return found;
- }
-
- private String match(String expect)
- throws ParsingException, IOException
- {
- String value = null;
-
- switch (lookahead) {
- case StreamTokenizer.TT_NUMBER:
- throw new ParsingException(st.lineno(), expect,
- rb.getString("number.") +
- String.valueOf(st.nval));
- case StreamTokenizer.TT_EOF:
- MessageFormat form = new MessageFormat(
- rb.getString("expected.expect.read.end.of.file."));
- Object[] source = {expect};
- throw new ParsingException(form.format(source));
- case StreamTokenizer.TT_WORD:
- if (expect.equalsIgnoreCase(st.sval)) {
- lookahead = st.nextToken();
- } else if (expect.equalsIgnoreCase("permission type")) {
- value = st.sval;
- lookahead = st.nextToken();
- } else if (expect.equalsIgnoreCase("principal type")) {
- value = st.sval;
- lookahead = st.nextToken();
- } else {
- throw new ParsingException(st.lineno(), expect, st.sval);
- }
- break;
- case '"':
- if (expect.equalsIgnoreCase("quoted string")) {
- value = st.sval;
- lookahead = st.nextToken();
- } else if (expect.equalsIgnoreCase("permission type")) {
- value = st.sval;
- lookahead = st.nextToken();
- } else if (expect.equalsIgnoreCase("principal type")) {
- value = st.sval;
- lookahead = st.nextToken();
- } else {
- throw new ParsingException(st.lineno(), expect, st.sval);
- }
- break;
- case ',':
- if (expect.equalsIgnoreCase(","))
- lookahead = st.nextToken();
- else
- throw new ParsingException(st.lineno(), expect, ",");
- break;
- case '{':
- if (expect.equalsIgnoreCase("{"))
- lookahead = st.nextToken();
- else
- throw new ParsingException(st.lineno(), expect, "{");
- break;
- case '}':
- if (expect.equalsIgnoreCase("}"))
- lookahead = st.nextToken();
- else
- throw new ParsingException(st.lineno(), expect, "}");
- break;
- case ';':
- if (expect.equalsIgnoreCase(";"))
- lookahead = st.nextToken();
- else
- throw new ParsingException(st.lineno(), expect, ";");
- break;
- case '*':
- if (expect.equalsIgnoreCase("*"))
- lookahead = st.nextToken();
- else
- throw new ParsingException(st.lineno(), expect, "*");
- break;
- default:
- throw new ParsingException(st.lineno(), expect,
- new String(new char[] {(char)lookahead}));
- }
- return value;
- }
-
- /**
- * skip all tokens for this entry leaving the delimiter ";"
- * in the stream.
- */
- private void skipEntry()
- throws ParsingException, IOException
- {
- while(lookahead != ';') {
- switch (lookahead) {
- case StreamTokenizer.TT_NUMBER:
- throw new ParsingException(st.lineno(), ";",
- rb.getString("number.") +
- String.valueOf(st.nval));
- case StreamTokenizer.TT_EOF:
- throw new ParsingException
- (rb.getString("expected.read.end.of.file"));
- default:
- lookahead = st.nextToken();
- }
- }
- }
-
- /**
- * Each grant entry in the policy configuration file is
- * represented by a
- * GrantEntry object. <p>
- *
- * <p>
- * For example, the entry
- * <pre>
- * grant signedBy "Duke" {
- * permission java.io.FilePermission "/tmp", "read,write";
- * };
- *
- * </pre>
- * is represented internally
- * <pre>
- *
- * pe = new PermissionEntry("java.io.FilePermission",
- * "/tmp", "read,write");
- *
- * ge = new GrantEntry("Duke", null);
- *
- * ge.add(pe);
- *
- * </pre>
- *
- * @author Roland Schemers
- *
- * version 1.19, 05/21/98
- */
-
- static class GrantEntry {
-
- public String signedBy;
- public String codeBase;
- public LinkedList<PrincipalEntry> principals;
- public Vector<PermissionEntry> permissionEntries;
-
- public GrantEntry() {
- permissionEntries = new Vector<PermissionEntry>();
- }
-
- public GrantEntry(String signedBy, String codeBase) {
- this.codeBase = codeBase;
- this.signedBy = signedBy;
- permissionEntries = new Vector<PermissionEntry>();
- }
-
- public void add(PermissionEntry pe)
- {
- permissionEntries.addElement(pe);
- }
-
- public boolean remove(PermissionEntry pe)
- {
- return permissionEntries.removeElement(pe);
- }
-
- public boolean contains(PermissionEntry pe)
- {
- return permissionEntries.contains(pe);
- }
-
- /**
- * Enumerate all the permission entries in this GrantEntry.
- */
- public Enumeration<PermissionEntry> permissionElements(){
- return permissionEntries.elements();
- }
-
-
- public void write(PrintWriter out) {
- out.print("grant");
- if (signedBy != null) {
- out.print(" signedBy \"");
- out.print(signedBy);
- out.print('"');
- if (codeBase != null)
- out.print(", ");
- }
- if (codeBase != null) {
- out.print(" codeBase \"");
- out.print(codeBase);
- out.print('"');
- if (principals != null && principals.size() > 0)
- out.print(",\n");
- }
- if (principals != null && principals.size() > 0) {
- ListIterator<PrincipalEntry> pli = principals.listIterator();
- while (pli.hasNext()) {
- out.print("\tPrincipal ");
- PrincipalEntry pe = pli.next();
- out.print(pe.principalClass +
- " \"" + pe.principalName + "\"");
- if (pli.hasNext())
- out.print(",\n");
- }
- }
- out.println(" {");
- Enumeration<PermissionEntry> enum_ = permissionEntries.elements();
- while (enum_.hasMoreElements()) {
- PermissionEntry pe = enum_.nextElement();
- out.write(" ");
- pe.write(out);
- }
- out.println("};");
- }
-
- }
-
- /**
- * Principal info (class and name) in a grant entry
- */
- static class PrincipalEntry {
-
- static final String WILDCARD_CLASS = "WILDCARD_PRINCIPAL_CLASS";
- static final String WILDCARD_NAME = "WILDCARD_PRINCIPAL_NAME";
-
- String principalClass;
- String principalName;
-
- /**
- * A PrincipalEntry consists of the <code>Principal</code>
- * class and <code>Principal</code> name.
- *
- * <p>
- *
- * @param principalClass the <code>Principal</code> class. <p>
- *
- * @param principalName the <code>Principal</code> name. <p>
- */
- public PrincipalEntry(String principalClass, String principalName) {
- if (principalClass == null || principalName == null)
- throw new NullPointerException
- ("null principalClass or principalName");
- this.principalClass = principalClass;
- this.principalName = principalName;
- }
-
- /**
- * Test for equality between the specified object and this object.
- * Two PrincipalEntries are equal if their PrincipalClass and
- * PrincipalName values are equal.
- *
- * <p>
- *
- * @param obj the object to test for equality with this object.
- *
- * @return true if the objects are equal, false otherwise.
- */
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
-
- if (!(obj instanceof PrincipalEntry))
- return false;
-
- PrincipalEntry that = (PrincipalEntry)obj;
- if (this.principalClass.equals(that.principalClass) &&
- this.principalName.equals(that.principalName)) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Return a hashcode for this <code>PrincipalEntry</code>.
- *
- * <p>
- *
- * @return a hashcode for this <code>PrincipalEntry</code>.
- */
- public int hashCode() {
- return principalClass.hashCode();
- }
- }
-
- /**
- * Each permission entry in the policy configuration file is
- * represented by a
- * PermissionEntry object. <p>
- *
- * <p>
- * For example, the entry
- * <pre>
- * permission java.io.FilePermission "/tmp", "read,write";
- * </pre>
- * is represented internally
- * <pre>
- *
- * pe = new PermissionEntry("java.io.FilePermission",
- * "/tmp", "read,write");
- * </pre>
- *
- * @author Roland Schemers
- *
- * version 1.19, 05/21/98
- */
-
- static class PermissionEntry {
-
- public String permission;
- public String name;
- public String action;
- public String signedBy;
-
- public PermissionEntry() {
- }
-
- public PermissionEntry(String permission,
- String name,
- String action) {
- this.permission = permission;
- this.name = name;
- this.action = action;
- }
-
- /**
- * Calculates a hash code value for the object. Objects
- * which are equal will also have the same hashcode.
- */
- public int hashCode() {
- int retval = permission.hashCode();
- if (name != null) retval ^= name.hashCode();
- if (action != null) retval ^= action.hashCode();
- return retval;
- }
-
- public boolean equals(Object obj) {
- if (obj == this)
- return true;
-
- if (! (obj instanceof PermissionEntry))
- return false;
-
- PermissionEntry that = (PermissionEntry) obj;
-
- if (this.permission == null) {
- if (that.permission != null) return false;
- } else {
- if (!this.permission.equals(that.permission)) return false;
- }
-
- if (this.name == null) {
- if (that.name != null) return false;
- } else {
- if (!this.name.equals(that.name)) return false;
- }
-
- if (this.action == null) {
- if (that.action != null) return false;
- } else {
- if (!this.action.equals(that.action)) return false;
- }
-
- if (this.signedBy == null) {
- if (that.signedBy != null) return false;
- } else {
- if (!this.signedBy.equals(that.signedBy)) return false;
- }
-
- // everything matched -- the 2 objects are equal
- return true;
- }
-
- public void write(PrintWriter out) {
- out.print("permission ");
- out.print(permission);
- if (name != null) {
- out.print(" \"");
-
- // have to add escape chars for quotes
- if (name.indexOf("\"") != -1) {
- int numQuotes = 0;
- char[] chars = name.toCharArray();
-
- // count the number of quote chars
- for (int i = 0; i < chars.length; i++) {
- if (chars[i] == '"')
- numQuotes++;
- }
-
- // now, add an escape char before each quote
- char[] newChars = new char[chars.length + numQuotes];
- for (int i = 0, j = 0; i < chars.length; i++) {
- if (chars[i] != '"') {
- newChars[j++] = chars[i];
- } else {
- newChars[j++] = '\\';
- newChars[j++] = chars[i];
- }
- }
- name = new String(newChars);
- }
- out.print(name);
- out.print('"');
- }
- if (action != null) {
- out.print(", \"");
- out.print(action);
- out.print('"');
- }
- if (signedBy != null) {
- out.print(", signedBy \"");
- out.print(signedBy);
- out.print('"');
- }
- out.println(";");
- }
- }
-
- static class ParsingException extends GeneralSecurityException {
-
- private static final long serialVersionUID = 8240970523155877400L;
-
- /**
- * Constructs a ParsingException with the specified
- * detail message. A detail message is a String that describes
- * this particular exception, which may, for example, specify which
- * algorithm is not available.
- *
- * @param msg the detail message.
- */
- public ParsingException(String msg) {
- super(msg);
- }
-
- public ParsingException(int line, String msg) {
- super(rb.getString("line.") + line + rb.getString("COLON") + msg);
- }
-
- public ParsingException(int line, String expect, String actual) {
- super(rb.getString("line.") + line + rb.getString(".expected.") +
- expect + rb.getString(".found.") + actual +
- rb.getString("QUOTE"));
- }
- }
-
- public static void main(String arg[]) throws Exception {
- PolicyParser pp = new PolicyParser(true);
- pp.read(new FileReader(arg[0]));
- FileWriter fr = new FileWriter(arg[1]);
- pp.write(fr);
- fr.close();
- }
-}
--- a/jdk/src/share/classes/com/sun/security/auth/SubjectCodeSource.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,398 +0,0 @@
-/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.security.auth;
-
-import java.net.URL;
-import java.util.*;
-import java.security.CodeSource;
-import java.security.Principal;
-import java.security.cert.Certificate;
-import java.lang.reflect.Constructor;
-
-import javax.security.auth.Subject;
-import sun.security.provider.PolicyParser.PrincipalEntry;
-
-/**
- * <p> This <code>SubjectCodeSource</code> class contains
- * a <code>URL</code>, signer certificates, and either a <code>Subject</code>
- * (that represents the <code>Subject</code> in the current
- * <code>AccessControlContext</code>),
- * or a linked list of Principals/PrincipalComparators
- * (that represent a "subject" in a <code>Policy</code>).
- *
- */
-class SubjectCodeSource extends CodeSource implements java.io.Serializable {
-
- private static final long serialVersionUID = 6039418085604715275L;
-
- private static final java.util.ResourceBundle rb =
- java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction<java.util.ResourceBundle>() {
- public java.util.ResourceBundle run() {
- return (java.util.ResourceBundle.getBundle
- ("sun.security.util.AuthResources"));
- }
- });
-
- private Subject subject;
- private LinkedList<PrincipalEntry> principals;
- private static final Class[] PARAMS = { String.class };
- private static final sun.security.util.Debug debug =
- sun.security.util.Debug.getInstance("auth", "\t[Auth Access]");
- private ClassLoader sysClassLoader;
-
- /**
- * Creates a new <code>SubjectCodeSource</code>
- * with the given <code>Subject</code>, principals, <code>URL</code>,
- * and signers (Certificates). The <code>Subject</code>
- * represents the <code>Subject</code> associated with the current
- * <code>AccessControlContext</code>.
- * The Principals are given as a <code>LinkedList</code>
- * of <code>PolicyParser.PrincipalEntry</code> objects.
- * Typically either a <code>Subject</code> will be provided,
- * or a list of <code>principals</code> will be provided
- * (not both).
- *
- * <p>
- *
- * @param subject the <code>Subject</code> associated with this
- * <code>SubjectCodeSource</code> <p>
- *
- * @param url the <code>URL</code> associated with this
- * <code>SubjectCodeSource</code> <p>
- *
- * @param certs the signers associated with this
- * <code>SubjectCodeSource</code> <p>
- */
- SubjectCodeSource(Subject subject,
- LinkedList<PrincipalEntry> principals,
- URL url, Certificate[] certs) {
-
- super(url, certs);
- this.subject = subject;
- this.principals = (principals == null ?
- new LinkedList<PrincipalEntry>() :
- new LinkedList<PrincipalEntry>(principals));
- sysClassLoader = java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction<ClassLoader>() {
- public ClassLoader run() {
- return ClassLoader.getSystemClassLoader();
- }
- });
- }
-
- /**
- * Get the Principals associated with this <code>SubjectCodeSource</code>.
- * The Principals are retrieved as a <code>LinkedList</code>
- * of <code>PolicyParser.PrincipalEntry</code> objects.
- *
- * <p>
- *
- * @return the Principals associated with this
- * <code>SubjectCodeSource</code> as a <code>LinkedList</code>
- * of <code>PolicyParser.PrincipalEntry</code> objects.
- */
- LinkedList<PrincipalEntry> getPrincipals() {
- return principals;
- }
-
- /**
- * Get the <code>Subject</code> associated with this
- * <code>SubjectCodeSource</code>. The <code>Subject</code>
- * represents the <code>Subject</code> associated with the
- * current <code>AccessControlContext</code>.
- *
- * <p>
- *
- * @return the <code>Subject</code> associated with this
- * <code>SubjectCodeSource</code>.
- */
- Subject getSubject() {
- return subject;
- }
-
- /**
- * Returns true if this <code>SubjectCodeSource</code> object "implies"
- * the specified <code>CodeSource</code>.
- * More specifically, this method makes the following checks.
- * If any fail, it returns false. If they all succeed, it returns true.
- *
- * <p>
- * <ol>
- * <li> The provided codesource must not be <code>null</code>.
- * <li> codesource must be an instance of <code>SubjectCodeSource</code>.
- * <li> super.implies(codesource) must return true.
- * <li> for each principal in this codesource's principal list:
- * <ol>
- * <li> if the principal is an instanceof
- * <code>PrincipalComparator</code>, then the principal must
- * imply the provided codesource's <code>Subject</code>.
- * <li> if the principal is not an instanceof
- * <code>PrincipalComparator</code>, then the provided
- * codesource's <code>Subject</code> must have an
- * associated <code>Principal</code>, <i>P</i>, where
- * P.getClass().getName equals principal.principalClass,
- * and P.getName() equals principal.principalName.
- * </ol>
- * </ol>
- *
- * <p>
- *
- * @param codesource the <code>CodeSource</code> to compare against.
- *
- * @return true if this <code>SubjectCodeSource</code> implies the
- * the specified <code>CodeSource</code>.
- */
- public boolean implies(CodeSource codesource) {
-
- LinkedList<PrincipalEntry> subjectList = null;
-
- if (codesource == null ||
- !(codesource instanceof SubjectCodeSource) ||
- !(super.implies(codesource))) {
-
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: FAILURE 1");
- return false;
- }
-
- SubjectCodeSource that = (SubjectCodeSource)codesource;
-
- // if the principal list in the policy "implies"
- // the Subject associated with the current AccessControlContext,
- // then return true
-
- if (this.principals == null) {
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: PASS 1");
- return true;
- }
-
- if (that.getSubject() == null ||
- that.getSubject().getPrincipals().size() == 0) {
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: FAILURE 2");
- return false;
- }
-
- ListIterator<PrincipalEntry> li = this.principals.listIterator(0);
- while (li.hasNext()) {
- PrincipalEntry pppe = li.next();
- try {
-
- // handle PrincipalComparators
-
- Class<?> principalComparator = Class.forName(
- pppe.getPrincipalClass(), true, sysClassLoader);
- Constructor<?> c = principalComparator.getConstructor(PARAMS);
- PrincipalComparator pc =
- (PrincipalComparator)c.newInstance
- (new Object[] { pppe.getPrincipalName() });
-
- if (!pc.implies(that.getSubject())) {
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: FAILURE 3");
- return false;
- } else {
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: PASS 2");
- return true;
- }
- } catch (Exception e) {
-
- // no PrincipalComparator, simply compare Principals
-
- if (subjectList == null) {
-
- if (that.getSubject() == null) {
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: " +
- "FAILURE 4");
- return false;
- }
- Iterator<Principal> i =
- that.getSubject().getPrincipals().iterator();
-
- subjectList = new LinkedList<PrincipalEntry>();
- while (i.hasNext()) {
- Principal p = i.next();
- PrincipalEntry spppe = new PrincipalEntry
- (p.getClass().getName(), p.getName());
- subjectList.add(spppe);
- }
- }
-
- if (!subjectListImpliesPrincipalEntry(subjectList, pppe)) {
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: FAILURE 5");
- return false;
- }
- }
- }
-
- if (debug != null)
- debug.println("\tSubjectCodeSource.implies: PASS 3");
- return true;
- }
-
- /**
- * This method returns, true, if the provided <i>subjectList</i>
- * "contains" the <code>Principal</code> specified
- * in the provided <i>pppe</i> argument.
- *
- * Note that the provided <i>pppe</i> argument may have
- * wildcards (*) for the <code>Principal</code> class and name,
- * which need to be considered.
- *
- * <p>
- *
- * @param subjectList a list of PolicyParser.PrincipalEntry objects
- * that correspond to all the Principals in the Subject currently
- * on this thread's AccessControlContext. <p>
- *
- * @param pppe the Principals specified in a grant entry.
- *
- * @return true if the provided <i>subjectList</i> "contains"
- * the <code>Principal</code> specified in the provided
- * <i>pppe</i> argument.
- */
- private boolean subjectListImpliesPrincipalEntry(
- LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) {
-
- ListIterator<PrincipalEntry> li = subjectList.listIterator(0);
- while (li.hasNext()) {
- PrincipalEntry listPppe = li.next();
-
- if (pppe.getPrincipalClass().equals
- (PrincipalEntry.WILDCARD_CLASS) ||
- pppe.getPrincipalClass().equals(listPppe.getPrincipalClass()))
- {
- if (pppe.getPrincipalName().equals
- (PrincipalEntry.WILDCARD_NAME) ||
- pppe.getPrincipalName().equals(listPppe.getPrincipalName()))
- return true;
- }
- }
- return false;
- }
-
- /**
- * Tests for equality between the specified object and this
- * object. Two <code>SubjectCodeSource</code> objects are considered equal
- * if their locations are of identical value, if the two sets of
- * Certificates are of identical values, and if the
- * Subjects are equal, and if the PolicyParser.PrincipalEntry values
- * are of identical values. It is not required that
- * the Certificates or PolicyParser.PrincipalEntry values
- * be in the same order.
- *
- * <p>
- *
- * @param obj the object to test for equality with this object.
- *
- * @return true if the objects are considered equal, false otherwise.
- */
- public boolean equals(Object obj) {
-
- if (obj == this)
- return true;
-
- if (super.equals(obj) == false)
- return false;
-
- if (!(obj instanceof SubjectCodeSource))
- return false;
-
- SubjectCodeSource that = (SubjectCodeSource)obj;
-
- // the principal lists must match
- try {
- if (this.getSubject() != that.getSubject())
- return false;
- } catch (SecurityException se) {
- return false;
- }
-
- if ((this.principals == null && that.principals != null) ||
- (this.principals != null && that.principals == null))
- return false;
-
- if (this.principals != null && that.principals != null) {
- if (!this.principals.containsAll(that.principals) ||
- !that.principals.containsAll(this.principals))
-
- return false;
- }
-
- return true;
- }
-
- /**
- * Return a hashcode for this <code>SubjectCodeSource</code>.
- *
- * <p>
- *
- * @return a hashcode for this <code>SubjectCodeSource</code>.
- */
- public int hashCode() {
- return super.hashCode();
- }
-
- /**
- * Return a String representation of this <code>SubjectCodeSource</code>.
- *
- * <p>
- *
- * @return a String representation of this <code>SubjectCodeSource</code>.
- */
- public String toString() {
- String returnMe = super.toString();
- if (getSubject() != null) {
- if (debug != null) {
- final Subject finalSubject = getSubject();
- returnMe = returnMe + "\n" +
- java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction<String>() {
- public String run() {
- return finalSubject.toString();
- }
- });
- } else {
- returnMe = returnMe + "\n" + getSubject().toString();
- }
- }
- if (principals != null) {
- ListIterator<PrincipalEntry> li = principals.listIterator();
- while (li.hasNext()) {
- PrincipalEntry pppe = li.next();
- returnMe = returnMe + rb.getString("NEWLINE") +
- pppe.getPrincipalClass() + " " +
- pppe.getPrincipalName();
- }
- }
- return returnMe;
- }
-}
--- a/jdk/src/share/classes/com/sun/security/auth/login/ConfigFile.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/security/auth/login/ConfigFile.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,9 +30,9 @@
import java.net.URI;
// NOTE: As of JDK 8, this class instantiates
-// sun.security.provider.ConfigSpiFile and forwards all methods to that
+// sun.security.provider.ConfigFile.Spi and forwards all methods to that
// implementation. All implementation fixes and enhancements should be made to
-// sun.security.provider.ConfigSpiFile and not this class.
+// sun.security.provider.ConfigFile.Spi and not this class.
// See JDK-8005117 for more information.
/**
@@ -85,7 +85,7 @@
*/
public class ConfigFile extends Configuration {
- private sun.security.provider.ConfigSpiFile configFile;
+ private final sun.security.provider.ConfigFile.Spi spi;
/**
* Create a new {@code Configuration} object.
@@ -94,7 +94,7 @@
* initialized
*/
public ConfigFile() {
- configFile = new sun.security.provider.ConfigSpiFile();
+ spi = new sun.security.provider.ConfigFile.Spi();
}
/**
@@ -106,7 +106,7 @@
* @throws NullPointerException if {@code uri} is null
*/
public ConfigFile(URI uri) {
- configFile = new sun.security.provider.ConfigSpiFile(uri);
+ spi = new sun.security.provider.ConfigFile.Spi(uri);
}
/**
@@ -123,7 +123,7 @@
public AppConfigurationEntry[] getAppConfigurationEntry
(String applicationName) {
- return configFile.engineGetAppConfigurationEntry(applicationName);
+ return spi.engineGetAppConfigurationEntry(applicationName);
}
/**
@@ -134,7 +134,7 @@
* to refresh the {@code Configuration}
*/
@Override
- public synchronized void refresh() {
- configFile.engineRefresh();
+ public void refresh() {
+ spi.engineRefresh();
}
}
--- a/jdk/src/share/classes/com/sun/tools/hat/resources/hat.js Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/com/sun/tools/hat/resources/hat.js Tue Aug 20 17:44:18 2013 -0700
@@ -1144,7 +1144,7 @@
} else {
for (var index in array) {
var it = array[index];
- if (func(it, index, array)) {
+ if (func(it, String(index), array)) {
return true;
}
}
@@ -1244,7 +1244,7 @@
var result = new Array();
for (var index in array) {
var it = array[index];
- if (func(it, index, array, result)) {
+ if (func(it, String(index), array, result)) {
result[result.length] = it;
}
}
@@ -1317,7 +1317,7 @@
var result = new Array();
for (var index in array) {
var it = array[index];
- result[result.length] = func(it, index, array, result);
+ result[result.length] = func(it, String(index), array, result);
}
return result;
}
--- a/jdk/src/share/classes/java/io/RandomAccessFile.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/io/RandomAccessFile.java Tue Aug 20 17:44:18 2013 -0700
@@ -518,7 +518,15 @@
* @exception IOException if {@code pos} is less than
* {@code 0} or if an I/O error occurs.
*/
- public native void seek(long pos) throws IOException;
+ public void seek(long pos) throws IOException {
+ if (pos < 0) {
+ throw new IOException("Negative seek offset");
+ } else {
+ seek0(pos);
+ }
+ }
+
+ private native void seek0(long pos) throws IOException;
/**
* Returns the length of this file.
--- a/jdk/src/share/classes/java/lang/Math.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/lang/Math.java Tue Aug 20 17:44:18 2013 -0700
@@ -825,7 +825,7 @@
public static int multiplyExact(int x, int y) {
long r = (long)x * (long)y;
if ((int)r != r) {
- throw new ArithmeticException("long overflow");
+ throw new ArithmeticException("integer overflow");
}
return (int)r;
}
@@ -857,6 +857,108 @@
}
/**
+ * Returns the argument incremented by one, throwing an exception if the
+ * result overflows an {@code int}.
+ *
+ * @param a the value to increment
+ * @return the result
+ * @throws ArithmeticException if the result overflows an int
+ * @since 1.8
+ */
+ public static int incrementExact(int a) {
+ if (a == Integer.MAX_VALUE) {
+ throw new ArithmeticException("integer overflow");
+ }
+
+ return a + 1;
+ }
+
+ /**
+ * Returns the argument incremented by one, throwing an exception if the
+ * result overflows a {@code long}.
+ *
+ * @param a the value to increment
+ * @return the result
+ * @throws ArithmeticException if the result overflows a long
+ * @since 1.8
+ */
+ public static long incrementExact(long a) {
+ if (a == Long.MAX_VALUE) {
+ throw new ArithmeticException("long overflow");
+ }
+
+ return a + 1L;
+ }
+
+ /**
+ * Returns the argument decremented by one, throwing an exception if the
+ * result overflows an {@code int}.
+ *
+ * @param a the value to decrement
+ * @return the result
+ * @throws ArithmeticException if the result overflows an int
+ * @since 1.8
+ */
+ public static int decrementExact(int a) {
+ if (a == Integer.MIN_VALUE) {
+ throw new ArithmeticException("integer overflow");
+ }
+
+ return a - 1;
+ }
+
+ /**
+ * Returns the argument decremented by one, throwing an exception if the
+ * result overflows a {@code long}.
+ *
+ * @param a the value to decrement
+ * @return the result
+ * @throws ArithmeticException if the result overflows a long
+ * @since 1.8
+ */
+ public static long decrementExact(long a) {
+ if (a == Long.MIN_VALUE) {
+ throw new ArithmeticException("long overflow");
+ }
+
+ return a - 1L;
+ }
+
+ /**
+ * Returns the negation of the argument, throwing an exception if the
+ * result overflows an {@code int}.
+ *
+ * @param a the value to negate
+ * @return the result
+ * @throws ArithmeticException if the result overflows an int
+ * @since 1.8
+ */
+ public static int negateExact(int a) {
+ if (a == Integer.MIN_VALUE) {
+ throw new ArithmeticException("integer overflow");
+ }
+
+ return -a;
+ }
+
+ /**
+ * Returns the negation of the argument, throwing an exception if the
+ * result overflows a {@code long}.
+ *
+ * @param a the value to negate
+ * @return the result
+ * @throws ArithmeticException if the result overflows a long
+ * @since 1.8
+ */
+ public static long negateExact(long a) {
+ if (a == Long.MIN_VALUE) {
+ throw new ArithmeticException("long overflow");
+ }
+
+ return -a;
+ }
+
+ /**
* Returns the value of the {@code long} argument;
* throwing an exception if the value overflows an {@code int}.
*
--- a/jdk/src/share/classes/java/math/MutableBigInteger.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/math/MutableBigInteger.java Tue Aug 20 17:44:18 2013 -0700
@@ -1242,6 +1242,9 @@
int r = intLen;
int s = b.intLen;
+ // Clear the quotient
+ quotient.offset = quotient.intLen = 0;
+
if (r < s) {
return this;
} else {
@@ -1276,7 +1279,6 @@
// do schoolbook division on blocks, dividing 2-block numbers by 1-block numbers
MutableBigInteger qi = new MutableBigInteger();
MutableBigInteger ri;
- quotient.offset = quotient.intLen = 0;
for (int i=t-2; i > 0; i--) {
// step 8a: compute (qi,ri) such that z=b*qi+ri
ri = z.divide2n1n(bShifted, qi);
--- a/jdk/src/share/classes/java/net/DatagramPacket.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/net/DatagramPacket.java Tue Aug 20 17:44:18 2013 -0700
@@ -139,8 +139,7 @@
*
* @since 1.4
*/
- public DatagramPacket(byte buf[], int offset, int length,
- SocketAddress address) throws SocketException {
+ public DatagramPacket(byte buf[], int offset, int length, SocketAddress address) {
setData(buf, offset, length);
setSocketAddress(address);
}
@@ -175,8 +174,7 @@
* @since 1.4
* @see java.net.InetAddress
*/
- public DatagramPacket(byte buf[], int length,
- SocketAddress address) throws SocketException {
+ public DatagramPacket(byte buf[], int length, SocketAddress address) {
this(buf, 0, length, address);
}
--- a/jdk/src/share/classes/java/net/IDN.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/net/IDN.java Tue Aug 20 17:44:18 2013 -0700
@@ -113,11 +113,18 @@
int p = 0, q = 0;
StringBuffer out = new StringBuffer();
+ if (isRootLabel(input)) {
+ return ".";
+ }
+
while (p < input.length()) {
q = searchDots(input, p);
out.append(toASCIIInternal(input.substring(p, q), flag));
+ if (q != (input.length())) {
+ // has more labels, or keep the trailing dot as at present
+ out.append('.');
+ }
p = q + 1;
- if (p < input.length()) out.append('.');
}
return out.toString();
@@ -167,11 +174,18 @@
int p = 0, q = 0;
StringBuffer out = new StringBuffer();
+ if (isRootLabel(input)) {
+ return ".";
+ }
+
while (p < input.length()) {
q = searchDots(input, p);
out.append(toUnicodeInternal(input.substring(p, q), flag));
+ if (q != (input.length())) {
+ // has more labels, or keep the trailing dot as at present
+ out.append('.');
+ }
p = q + 1;
- if (p < input.length()) out.append('.');
}
return out.toString();
@@ -263,6 +277,13 @@
dest = new StringBuffer(label);
}
+ // step 8, move forward to check the smallest number of the code points
+ // the length must be inside 1..63
+ if (dest.length() == 0) {
+ throw new IllegalArgumentException(
+ "Empty label is not a legal name");
+ }
+
// step 3
// Verify the absence of non-LDH ASCII code points
// 0..0x2c, 0x2e..0x2f, 0x3a..0x40, 0x5b..0x60, 0x7b..0x7f
@@ -311,7 +332,7 @@
// step 8
// the length must be inside 1..63
- if(dest.length() > MAX_LABEL_LENGTH){
+ if (dest.length() > MAX_LABEL_LENGTH) {
throw new IllegalArgumentException("The label in the input is too long");
}
@@ -409,8 +430,7 @@
private static int searchDots(String s, int start) {
int i;
for (i = start; i < s.length(); i++) {
- char c = s.charAt(i);
- if (c == '.' || c == '\u3002' || c == '\uFF0E' || c == '\uFF61') {
+ if (isLabelSeparator(s.charAt(i))) {
break;
}
}
@@ -418,6 +438,19 @@
return i;
}
+ //
+ // to check if a string is a root label, ".".
+ //
+ private static boolean isRootLabel(String s) {
+ return (s.length() == 1 && isLabelSeparator(s.charAt(0)));
+ }
+
+ //
+ // to check if a character is a label separator, i.e. a dot character.
+ //
+ private static boolean isLabelSeparator(char c) {
+ return (c == '.' || c == '\u3002' || c == '\uFF0E' || c == '\uFF61');
+ }
//
// to check if a string only contains US-ASCII code point
--- a/jdk/src/share/classes/java/net/InetAddress.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/net/InetAddress.java Tue Aug 20 17:44:18 2013 -0700
@@ -1601,7 +1601,6 @@
pf.put("address", holder().getAddress());
pf.put("family", holder().getFamily());
s.writeFields();
- s.flush();
}
}
--- a/jdk/src/share/classes/java/net/URLClassLoader.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/net/URLClassLoader.java Tue Aug 20 17:44:18 2013 -0700
@@ -57,12 +57,6 @@
* <p>
* The classes that are loaded are by default granted permission only to
* access the URLs specified when the URLClassLoader was created.
- * <p>
- * Where a JAR file contains the {@link Name#PROFILE Profile} attribute
- * then its value is the name of the Java SE profile that the library
- * minimally requires. If this runtime does not support the profile then
- * it causes {@link java.util.jar.UnsupportedProfileException} to be
- * thrown at some unspecified time.
*
* @author David Connelly
* @since 1.2
--- a/jdk/src/share/classes/java/sql/SQLXML.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/sql/SQLXML.java Tue Aug 20 17:44:18 2013 -0700
@@ -98,7 +98,7 @@
* or, to set the result value from SAX events:
* <pre>
* SAXResult saxResult = sqlxml.setResult(SAXResult.class);
- * ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
+ * ContentHandler contentHandler = saxResult.getHandler();
* contentHandler.startDocument();
* // set the XML elements and attributes into the result
* contentHandler.endDocument();
--- a/jdk/src/share/classes/java/time/chrono/JapaneseEra.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/time/chrono/JapaneseEra.java Tue Aug 20 17:44:18 2013 -0700
@@ -107,7 +107,7 @@
* The singleton instance for the 'Meiji' era (1868-09-08 - 1912-07-29)
* which has the value -1.
*/
- public static final JapaneseEra MEIJI = new JapaneseEra(-1, LocalDate.of(1868, 9, 8));
+ public static final JapaneseEra MEIJI = new JapaneseEra(-1, LocalDate.of(1868, 1, 1));
/**
* The singleton instance for the 'Taisho' era (1912-07-30 - 1926-12-24)
* which has the value 0.
--- a/jdk/src/share/classes/java/util/ArrayDeque.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/ArrayDeque.java Tue Aug 20 17:44:18 2013 -0700
@@ -888,6 +888,19 @@
elements[i] = s.readObject();
}
+ /**
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@link Spliterator} over the elements in this
+ * deque.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED},
+ * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and
+ * {@link Spliterator#NONNULL}. Overriding implementations should document
+ * the reporting of additional characteristic values.
+ *
+ * @return a {@code Spliterator} over the elements in this deque
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return new DeqSpliterator<E>(this, -1, -1);
}
--- a/jdk/src/share/classes/java/util/ArrayList.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/ArrayList.java Tue Aug 20 17:44:18 2013 -0700
@@ -1238,6 +1238,20 @@
}
}
+ /**
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@link Spliterator} over the elements in this
+ * list.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED},
+ * {@link Spliterator#SUBSIZED}, and {@link Spliterator#ORDERED}.
+ * Overriding implementations should document the reporting of additional
+ * characteristic values.
+ *
+ * @return a {@code Spliterator} over the elements in this list
+ * @since 1.8
+ */
+ @Override
public Spliterator<E> spliterator() {
return new ArrayListSpliterator<>(this, 0, -1, 0);
}
--- a/jdk/src/share/classes/java/util/Collection.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/Collection.java Tue Aug 20 17:44:18 2013 -0700
@@ -504,7 +504,10 @@
*
* <p>The returned {@code Spliterator} must report the characteristic
* {@link Spliterator#SIZED}; implementations should document any additional
- * characteristic values reported by the returned Spliterator.
+ * characteristic values reported by the returned spliterator. If
+ * this collection contains no elements then the returned spliterator is
+ * only required to report {@link Spliterator#SIZED} and is not required to
+ * report additional characteristic values (if any).
*
* <p>The default implementation should be overridden by subclasses that
* can return a more efficient spliterator. In order to
@@ -535,6 +538,14 @@
* The returned {@code Spliterator} additionally reports
* {@link Spliterator#SUBSIZED}.
*
+ * <p>If a spliterator covers no elements then the reporting of additional
+ * characteristic values, beyond that of {@code SIZED} and {@code SUBSIZED},
+ * does not aid clients to control, specialize or simplify computation.
+ * However, this does enable shared use of an immutable and empty
+ * spliterator instance (see {@link Spliterators#emptySpliterator()}) for
+ * empty collections, and enables clients to determine if such a spliterator
+ * covers no elements.
+ *
* @return a {@code Spliterator} over the elements in this collection
* @since 1.8
*/
--- a/jdk/src/share/classes/java/util/Collections.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/Collections.java Tue Aug 20 17:44:18 2013 -0700
@@ -4508,7 +4508,6 @@
}
@Override
public void sort(Comparator<? super E> c) {
- Objects.requireNonNull(c);
}
// Override default methods in Collection
--- a/jdk/src/share/classes/java/util/CurrencyData.properties Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/CurrencyData.properties Tue Aug 20 17:44:18 2013 -0700
@@ -28,7 +28,7 @@
# Version of the currency code information in this class.
# It is a serial number that accompanies with each amendment.
-dataVersion=155
+dataVersion=156
# List of all valid ISO 4217 currency codes.
# To ensure compatibility, do not remove codes.
@@ -320,7 +320,7 @@
# LAO PEOPLE'S DEMOCRATIC REPUBLIC
LA=LAK
# LATVIA
-LV=LVL
+LV=LVL;2013-12-31-22-00-00;EUR
# LEBANON
LB=LBP
# LESOTHO
--- a/jdk/src/share/classes/java/util/Formatter.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/Formatter.java Tue Aug 20 17:44:18 2013 -0700
@@ -4196,7 +4196,7 @@
case DateTime.CENTURY: // 'C' (00 - 99)
case DateTime.YEAR_2: // 'y' (00 - 99)
case DateTime.YEAR_4: { // 'Y' (0000 - 9999)
- int i = t.get(ChronoField.YEAR);
+ int i = t.get(ChronoField.YEAR_OF_ERA);
int size = 2;
switch (c) {
case DateTime.CENTURY:
--- a/jdk/src/share/classes/java/util/HashSet.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/HashSet.java Tue Aug 20 17:44:18 2013 -0700
@@ -312,6 +312,18 @@
}
}
+ /**
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@link Spliterator} over the elements in this
+ * set.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and
+ * {@link Spliterator#DISTINCT}. Overriding implementations should document
+ * the reporting of additional characteristic values.
+ *
+ * @return a {@code Spliterator} over the elements in this set
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return new HashMap.KeySpliterator<E,Object>(map, 0, -1, 0, 0);
}
--- a/jdk/src/share/classes/java/util/LinkedHashMap.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/LinkedHashMap.java Tue Aug 20 17:44:18 2013 -0700
@@ -129,10 +129,20 @@
* exception for its correctness: <i>the fail-fast behavior of iterators
* should be used only to detect bugs.</i>
*
+ * <p>The spliterators returned by the spliterator method of the collections
+ * returned by all of this class's collection view methods are
+ * <em><a href="Spliterator.html#binding">late-binding</a></em>,
+ * <em>fail-fast</em>, and additionally report {@link Spliterator#ORDERED}.
+ *
* <p>This class is a member of the
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
* Java Collections Framework</a>.
*
+ * @implNote
+ * The spliterators returned by the spliterator method of the collections
+ * returned by all of this class's collection view methods are created from
+ * the iterators of the corresponding collections.
+ *
* @param <K> the type of keys maintained by this map
* @param <V> the type of mapped values
*
--- a/jdk/src/share/classes/java/util/LinkedHashSet.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/LinkedHashSet.java Tue Aug 20 17:44:18 2013 -0700
@@ -170,13 +170,23 @@
}
/**
- * Creates a {@code Spliterator}, over the elements in this set, that
- * reports {@code SIZED}, {@code DISTINCT} and {@code ORDERED}.
- * Overriding implementations are expected to document if the
- * {@code Spliterator} reports any additional and relevant characteristic
- * values.
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@code Spliterator} over the elements in this set.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED},
+ * {@link Spliterator#DISTINCT}, and {@code ORDERED}. Implementations
+ * should document the reporting of additional characteristic values.
+ *
+ * @implNote
+ * The implementation creates a
+ * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
+ * from the set's {@code Iterator}. The spliterator inherits the
+ * <em>fail-fast</em> properties of the set's iterator.
+ * The created {@code Spliterator} additionally reports
+ * {@link Spliterator#SUBSIZED}.
*
* @return a {@code Spliterator} over the elements in this set
+ * @since 1.8
*/
@Override
public Spliterator<E> spliterator() {
--- a/jdk/src/share/classes/java/util/LinkedList.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/LinkedList.java Tue Aug 20 17:44:18 2013 -0700
@@ -1149,6 +1149,23 @@
linkLast((E)s.readObject());
}
+ /**
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@link Spliterator} over the elements in this
+ * list.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and
+ * {@link Spliterator#ORDERED}. Overriding implementations should document
+ * the reporting of additional characteristic values.
+ *
+ * @implNote
+ * The {@code Spliterator} additionally reports {@link Spliterator#SUBSIZED}
+ * and implements {@code trySplit} to permit limited parallelism..
+ *
+ * @return a {@code Spliterator} over the elements in this list
+ * @since 1.8
+ */
+ @Override
public Spliterator<E> spliterator() {
return new LLSpliterator<E>(this, -1, 0);
}
--- a/jdk/src/share/classes/java/util/List.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/List.java Tue Aug 20 17:44:18 2013 -0700
@@ -671,7 +671,7 @@
* The default implementation creates a
* <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
* from the list's {@code Iterator}. The spliterator inherits the
- * <em>fail-fast</em> properties of the collection's iterator.
+ * <em>fail-fast</em> properties of the list's iterator.
*
* @implNote
* The created {@code Spliterator} additionally reports
--- a/jdk/src/share/classes/java/util/PriorityQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/PriorityQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -795,6 +795,19 @@
heapify();
}
+ /**
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@link Spliterator} over the elements in this
+ * queue.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED},
+ * {@link Spliterator#SUBSIZED}, and {@link Spliterator#NONNULL}.
+ * Overriding implementations should document the reporting of additional
+ * characteristic values.
+ *
+ * @return a {@code Spliterator} over the elements in this queue
+ * @since 1.8
+ */
public final Spliterator<E> spliterator() {
return new PriorityQueueSpliterator<E>(this, 0, -1, 0);
}
--- a/jdk/src/share/classes/java/util/Set.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/Set.java Tue Aug 20 17:44:18 2013 -0700
@@ -394,7 +394,7 @@
* The default implementation creates a
* <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
* from the set's {@code Iterator}. The spliterator inherits the
- * <em>fail-fast</em> properties of the collection's iterator.
+ * <em>fail-fast</em> properties of the set's iterator.
*
* @implNote
* The created {@code Spliterator} additionally reports
--- a/jdk/src/share/classes/java/util/SortedSet.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/SortedSet.java Tue Aug 20 17:44:18 2013 -0700
@@ -238,7 +238,7 @@
* The default implementation creates a
* <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
* from the sorted set's {@code Iterator}. The spliterator inherits the
- * <em>fail-fast</em> properties of the collection's iterator. The
+ * <em>fail-fast</em> properties of the set's iterator. The
* spliterator's comparator is the same as the sorted set's comparator.
*
* @implNote
--- a/jdk/src/share/classes/java/util/Spliterator.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/Spliterator.java Tue Aug 20 17:44:18 2013 -0700
@@ -74,7 +74,11 @@
* source prior to binding are reflected when the Spliterator is traversed.
* After binding a Spliterator should, on a best-effort basis, throw
* {@link ConcurrentModificationException} if structural interference is
- * detected. Spliterators that do this are called <em>fail-fast</em>.
+ * detected. Spliterators that do this are called <em>fail-fast</em>. The
+ * bulk traversal method ({@link #forEachRemaining forEachRemaining()}) of a
+ * Spliterator may optimize traversal and check for structural interference
+ * after all elements have been traversed, rather than checking per-element and
+ * failing immediately.
*
* <p>Spliterators can provide an estimate of the number of remaining elements
* via the {@link #estimateSize} method. Ideally, as reflected in characteristic
--- a/jdk/src/share/classes/java/util/TreeMap.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/TreeMap.java Tue Aug 20 17:44:18 2013 -0700
@@ -790,8 +790,19 @@
/**
* Returns a {@link Set} view of the keys contained in this map.
- * The set's iterator returns the keys in ascending order.
- * The set is backed by the map, so changes to the map are
+ *
+ * <p>The set's iterator returns the keys in ascending order.
+ * The set's spliterator is
+ * <em><a href="Spliterator.html#binding">late-binding</a></em>,
+ * <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED}
+ * and {@link Spliterator#ORDERED} with an encounter order that is ascending
+ * key order. The spliterator's comparator (see
+ * {@link java.util.Spliterator#getComparator()}) is {@code null} if
+ * the tree map's comparator (see {@link #comparator()}) is {@code null}.
+ * Otherwise, the spliterator's comparator is the same as or imposes the
+ * same total ordering as the tree map's comparator.
+ *
+ * <p>The set is backed by the map, so changes to the map are
* reflected in the set, and vice-versa. If the map is modified
* while an iteration over the set is in progress (except through
* the iterator's own {@code remove} operation), the results of
@@ -823,9 +834,15 @@
/**
* Returns a {@link Collection} view of the values contained in this map.
- * The collection's iterator returns the values in ascending order
- * of the corresponding keys.
- * The collection is backed by the map, so changes to the map are
+ *
+ * <p>The collection's iterator returns the values in ascending order
+ * of the corresponding keys. The collection's spliterator is
+ * <em><a href="Spliterator.html#binding">late-binding</a></em>,
+ * <em>fail-fast</em>, and additionally reports {@link Spliterator#ORDERED}
+ * with an encounter order that is ascending order of the corresponding
+ * keys.
+ *
+ * <p>The collection is backed by the map, so changes to the map are
* reflected in the collection, and vice-versa. If the map is
* modified while an iteration over the collection is in progress
* (except through the iterator's own {@code remove} operation),
@@ -843,8 +860,15 @@
/**
* Returns a {@link Set} view of the mappings contained in this map.
- * The set's iterator returns the entries in ascending key order.
- * The set is backed by the map, so changes to the map are
+ *
+ * <p>The set's iterator returns the entries in ascending key order. The
+ * sets's spliterator is
+ * <em><a href="Spliterator.html#binding">late-binding</a></em>,
+ * <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED} and
+ * {@link Spliterator#ORDERED} with an encounter order that is ascending key
+ * order.
+ *
+ * <p>The set is backed by the map, so changes to the map are
* reflected in the set, and vice-versa. If the map is modified
* while an iteration over the set is in progress (except through
* the iterator's own {@code remove} operation, or through the
@@ -2944,16 +2968,11 @@
@Override
public Comparator<Map.Entry<K, V>> getComparator() {
- // Since SORTED is reported and Map.Entry elements are not comparable
- // then a non-null comparator needs to be returned
+ // Adapt or create a key-based comparator
if (tree.comparator != null) {
- // Adapt the existing non-null comparator to compare entries
- // by key
return Map.Entry.comparingByKey(tree.comparator);
}
else {
- // Return a comparator of entries by key, with K assumed to be
- // of Comparable
return (Comparator<Map.Entry<K, V>> & Serializable) (e1, e2) -> {
@SuppressWarnings("unchecked")
Comparable<? super K> k1 = (Comparable<? super K>) e1.getKey();
--- a/jdk/src/share/classes/java/util/TreeSet.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/TreeSet.java Tue Aug 20 17:44:18 2013 -0700
@@ -533,6 +533,25 @@
tm.readTreeSet(size, s, PRESENT);
}
+ /**
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@link Spliterator} over the elements in this
+ * set.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED},
+ * {@link Spliterator#DISTINCT}, {@link Spliterator#SORTED}, and
+ * {@link Spliterator#ORDERED}. Overriding implementations should document
+ * the reporting of additional characteristic values.
+ *
+ * <p>The spliterator's comparator (see
+ * {@link java.util.Spliterator#getComparator()}) is {@code null} if
+ * the tree set's comparator (see {@link #comparator()}) is {@code null}.
+ * Otherwise, the spliterator's comparator is the same as or imposes the
+ * same total ordering as the tree set's comparator.
+ *
+ * @return a {@code Spliterator} over the elements in this set
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return TreeMap.keySpliteratorFor(m);
}
--- a/jdk/src/share/classes/java/util/Vector.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/Vector.java Tue Aug 20 17:44:18 2013 -0700
@@ -1323,6 +1323,19 @@
modCount++;
}
+ /**
+ * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
+ * and <em>fail-fast</em> {@link Spliterator} over the elements in this
+ * list.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED},
+ * {@link Spliterator#SUBSIZED}, and {@link Spliterator#ORDERED}.
+ * Overriding implementations should document the reporting of additional
+ * characteristic values.
+ *
+ * @return a {@code Spliterator} over the elements in this list
+ * @since 1.8
+ */
@Override
public Spliterator<E> spliterator() {
return new VectorSpliterator<>(this, null, 0, -1, 0);
--- a/jdk/src/share/classes/java/util/concurrent/ArrayBlockingQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ArrayBlockingQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -757,12 +757,8 @@
* Returns an iterator over the elements in this queue in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this queue in proper sequence
*/
@@ -1396,9 +1392,26 @@
// }
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this queue.
+ *
+ * <p>The returned spliterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
+ *
+ * @implNote
+ * The {@code Spliterator} implements {@code trySplit} to permit limited
+ * parallelism.
+ *
+ * @return a {@code Spliterator} over the elements in this queue
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return Spliterators.spliterator
(this, Spliterator.ORDERED | Spliterator.NONNULL |
Spliterator.CONCURRENT);
}
+
}
--- a/jdk/src/share/classes/java/util/concurrent/CompletableFuture.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/CompletableFuture.java Tue Aug 20 17:44:18 2013 -0700
@@ -420,6 +420,7 @@
}
/** Base class can act as either FJ or plain Runnable */
+ @SuppressWarnings("serial")
abstract static class Async extends ForkJoinTask<Void>
implements Runnable, AsynchronousCompletionTask {
public final Void getRawResult() { return null; }
@@ -671,6 +672,7 @@
}
// Opportunistically subclass AtomicInteger to use compareAndSet to claim.
+ @SuppressWarnings("serial")
abstract static class Completion extends AtomicInteger implements Runnable {
}
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Tue Aug 20 17:44:18 2013 -0700
@@ -43,7 +43,6 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
-import java.util.ConcurrentModificationException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
@@ -94,14 +93,14 @@
* that key reporting the updated value.) For aggregate operations
* such as {@code putAll} and {@code clear}, concurrent retrievals may
* reflect insertion or removal of only some entries. Similarly,
- * Iterators and Enumerations return elements reflecting the state of
- * the hash table at some point at or since the creation of the
+ * Iterators, Spliterators and Enumerations return elements reflecting the
+ * state of the hash table at some point at or since the creation of the
* iterator/enumeration. They do <em>not</em> throw {@link
- * ConcurrentModificationException}. However, iterators are designed
- * to be used by only one thread at a time. Bear in mind that the
- * results of aggregate status methods including {@code size}, {@code
- * isEmpty}, and {@code containsValue} are typically useful only when
- * a map is not undergoing concurrent updates in other threads.
+ * java.util.ConcurrentModificationException ConcurrentModificationException}.
+ * However, iterators are designed to be used by only one thread at a time.
+ * Bear in mind that the results of aggregate status methods including
+ * {@code size}, {@code isEmpty}, and {@code containsValue} are typically
+ * useful only when a map is not undergoing concurrent updates in other threads.
* Otherwise the results of these methods reflect transient states
* that may be adequate for monitoring or estimation purposes, but not
* for program control.
@@ -1200,11 +1199,11 @@
* operations. It does not support the {@code add} or
* {@code addAll} operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator
- * that will never throw {@link ConcurrentModificationException},
- * and guarantees to traverse elements as they existed upon
- * construction of the iterator, and may (but is not guaranteed to)
- * reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The view's {@code spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#DISTINCT}, and {@link Spliterator#NONNULL}.
*
* @return the set view
*/
@@ -1223,11 +1222,11 @@
* {@code retainAll}, and {@code clear} operations. It does not
* support the {@code add} or {@code addAll} operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator
- * that will never throw {@link ConcurrentModificationException},
- * and guarantees to traverse elements as they existed upon
- * construction of the iterator, and may (but is not guaranteed to)
- * reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The view's {@code spliterator} reports {@link Spliterator#CONCURRENT}
+ * and {@link Spliterator#NONNULL}.
*
* @return the collection view
*/
@@ -1245,11 +1244,11 @@
* {@code removeAll}, {@code retainAll}, and {@code clear}
* operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator
- * that will never throw {@link ConcurrentModificationException},
- * and guarantees to traverse elements as they existed upon
- * construction of the iterator, and may (but is not guaranteed to)
- * reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The view's {@code spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#DISTINCT}, and {@link Spliterator#NONNULL}.
*
* @return the set view
*/
@@ -2785,7 +2784,7 @@
return;
}
}
- else if ((s | WAITER) == 0) {
+ else if ((s & WAITER) == 0) {
if (U.compareAndSwapInt(this, LOCKSTATE, s, s | WAITER)) {
waiting = true;
waiter = Thread.currentThread();
@@ -4308,12 +4307,12 @@
// implementations below rely on concrete classes supplying these
// abstract methods
/**
- * Returns a "weakly consistent" iterator that will never
- * throw {@link ConcurrentModificationException}, and
- * guarantees to traverse elements as they existed upon
- * construction of the iterator, and may (but is not
- * guaranteed to) reflect any modifications subsequent to
- * construction.
+ * Returns an iterator over the elements in this collection.
+ *
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * @return an iterator over the elements in this collection
*/
public abstract Iterator<E> iterator();
public abstract boolean contains(Object o);
@@ -4716,6 +4715,7 @@
* Base class for bulk tasks. Repeats some fields and code from
* class Traverser, because we need to subclass CountedCompleter.
*/
+ @SuppressWarnings("serial")
abstract static class BulkTask<K,V,R> extends CountedCompleter<R> {
Node<K,V>[] tab; // same as Traverser
Node<K,V> next;
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java Tue Aug 20 17:44:18 2013 -0700
@@ -55,12 +55,8 @@
* Like most other concurrent collection implementations, this class
* does not permit the use of {@code null} elements.
*
- * <p>Iterators are <i>weakly consistent</i>, returning elements
- * reflecting the state of the deque at some point at or since the
- * creation of the iterator. They do <em>not</em> throw {@link
- * java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and may proceed concurrently with
- * other operations.
+ * <p>Iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* <p>Beware that, unlike in most collections, the {@code size} method
* is <em>NOT</em> a constant-time operation. Because of the
@@ -1290,12 +1286,8 @@
* Returns an iterator over the elements in this deque in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this deque in proper sequence
*/
@@ -1308,12 +1300,8 @@
* sequential order. The elements will be returned in order from
* last (tail) to first (head).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this deque in reverse order
*/
@@ -1493,6 +1481,22 @@
}
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this deque.
+ *
+ * <p>The returned spliterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
+ *
+ * @implNote
+ * The {@code Spliterator} implements {@code trySplit} to permit limited
+ * parallelism.
+ *
+ * @return a {@code Spliterator} over the elements in this deque
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return new CLDSpliterator<E>(this);
}
@@ -1500,6 +1504,8 @@
/**
* Saves this deque to a stream (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData All of the elements (each an {@code E}) in
* the proper order, followed by a null
*/
@@ -1522,6 +1528,10 @@
/**
* Reconstitutes this deque from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -654,12 +654,8 @@
* Returns an iterator over the elements in this queue in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this queue in proper sequence
*/
@@ -749,6 +745,8 @@
/**
* Saves this queue to a stream (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData All of the elements (each an {@code E}) in
* the proper order, followed by a null
*/
@@ -771,6 +769,10 @@
/**
* Reconstitutes this queue from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
@@ -881,6 +883,23 @@
}
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this queue.
+ *
+ * <p>The returned spliterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
+ *
+ * @implNote
+ * The {@code Spliterator} implements {@code trySplit} to permit limited
+ * parallelism.
+ *
+ * @return a {@code Spliterator} over the elements in this queue
+ * @since 1.8
+ */
+ @Override
public Spliterator<E> spliterator() {
return new CLQSpliterator<E>(this);
}
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentNavigableMap.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentNavigableMap.java Tue Aug 20 17:44:18 2013 -0700
@@ -120,11 +120,8 @@
* operations. It does not support the {@code add} or {@code addAll}
* operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator
- * that will never throw {@link ConcurrentModificationException},
- * and guarantees to traverse elements as they existed upon
- * construction of the iterator, and may (but is not guaranteed to)
- * reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return a navigable set view of the keys in this map
*/
@@ -141,11 +138,8 @@
* operations. It does not support the {@code add} or {@code addAll}
* operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator
- * that will never throw {@link ConcurrentModificationException},
- * and guarantees to traverse elements as they existed upon
- * construction of the iterator, and may (but is not guaranteed to)
- * reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* <p>This method is equivalent to method {@code navigableKeySet}.
*
@@ -164,11 +158,8 @@
* operations. It does not support the {@code add} or {@code addAll}
* operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator
- * that will never throw {@link ConcurrentModificationException},
- * and guarantees to traverse elements as they existed upon
- * construction of the iterator, and may (but is not guaranteed to)
- * reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return a reverse order navigable set view of the keys in this map
*/
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Tue Aug 20 17:44:18 2013 -0700
@@ -34,6 +34,7 @@
*/
package java.util.concurrent;
+import java.io.Serializable;
import java.util.AbstractCollection;
import java.util.AbstractMap;
import java.util.AbstractSet;
@@ -44,11 +45,15 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.NavigableMap;
import java.util.NavigableSet;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.SortedMap;
+import java.util.SortedSet;
import java.util.Spliterator;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentNavigableMap;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.BiConsumer;
@@ -66,12 +71,13 @@
* {@code containsKey}, {@code get}, {@code put} and
* {@code remove} operations and their variants. Insertion, removal,
* update, and access operations safely execute concurrently by
- * multiple threads. Iterators are <i>weakly consistent</i>, returning
- * elements reflecting the state of the map at some point at or since
- * the creation of the iterator. They do <em>not</em> throw {@link
- * java.util.ConcurrentModificationException ConcurrentModificationException},
- * and may proceed concurrently with other operations. Ascending key ordered
- * views and their iterators are faster than descending ones.
+ * multiple threads.
+ *
+ * <p>Iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>Ascending key ordered views and their iterators are faster than
+ * descending ones.
*
* <p>All {@code Map.Entry} pairs returned by methods in this class
* and its views represent snapshots of mappings at the time they were
@@ -108,9 +114,7 @@
* @since 1.6
*/
public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
- implements ConcurrentNavigableMap<K,V>,
- Cloneable,
- java.io.Serializable {
+ implements ConcurrentNavigableMap<K,V>, Cloneable, Serializable {
/*
* This class implements a tree-like two-dimensionally linked skip
* list in which the index levels are represented in separate
@@ -1412,6 +1416,8 @@
/**
* Saves this map to a stream (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData The key (Object) and value (Object) for each
* key-value mapping represented by the map, followed by
* {@code null}. The key-value mappings are emitted in key-order
@@ -1436,6 +1442,10 @@
/**
* Reconstitutes this map from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
@SuppressWarnings("unchecked")
private void readObject(final java.io.ObjectInputStream s)
@@ -1795,8 +1805,18 @@
/**
* Returns a {@link NavigableSet} view of the keys contained in this map.
- * The set's iterator returns the keys in ascending order.
- * The set is backed by the map, so changes to the map are
+ *
+ * <p>The set's iterator returns the keys in ascending order.
+ * The set's spliterator additionally reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#NONNULL}, {@link Spliterator#SORTED} and
+ * {@link Spliterator#ORDERED}, with an encounter order that is ascending
+ * key order. The spliterator's comparator (see
+ * {@link java.util.Spliterator#getComparator()}) is {@code null} if
+ * the map's comparator (see {@link #comparator()}) is {@code null}.
+ * Otherwise, the spliterator's comparator is the same as or imposes the
+ * same total ordering as the map's comparator.
+ *
+ * <p>The set is backed by the map, so changes to the map are
* reflected in the set, and vice-versa. The set supports element
* removal, which removes the corresponding mapping from the map,
* via the {@code Iterator.remove}, {@code Set.remove},
@@ -1804,11 +1824,8 @@
* operations. It does not support the {@code add} or {@code addAll}
* operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse elements
- * as they existed upon construction of the iterator, and may (but is not
- * guaranteed to) reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* <p>This method is equivalent to method {@code navigableKeySet}.
*
@@ -1826,9 +1843,13 @@
/**
* Returns a {@link Collection} view of the values contained in this map.
- * The collection's iterator returns the values in ascending order
- * of the corresponding keys.
- * The collection is backed by the map, so changes to the map are
+ * <p>The collection's iterator returns the values in ascending order
+ * of the corresponding keys. The collections's spliterator additionally
+ * reports {@link Spliterator#CONCURRENT}, {@link Spliterator#NONNULL} and
+ * {@link Spliterator#ORDERED}, with an encounter order that is ascending
+ * order of the corresponding keys.
+ *
+ * <p>The collection is backed by the map, so changes to the map are
* reflected in the collection, and vice-versa. The collection
* supports element removal, which removes the corresponding
* mapping from the map, via the {@code Iterator.remove},
@@ -1836,11 +1857,8 @@
* {@code retainAll} and {@code clear} operations. It does not
* support the {@code add} or {@code addAll} operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse elements
- * as they existed upon construction of the iterator, and may (but is not
- * guaranteed to) reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*/
public Collection<V> values() {
Values<V> vs = values;
@@ -1849,8 +1867,14 @@
/**
* Returns a {@link Set} view of the mappings contained in this map.
- * The set's iterator returns the entries in ascending key order.
- * The set is backed by the map, so changes to the map are
+ *
+ * <p>The set's iterator returns the entries in ascending key order. The
+ * set's spliterator additionally reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#NONNULL}, {@link Spliterator#SORTED} and
+ * {@link Spliterator#ORDERED}, with an encounter order that is ascending
+ * key order.
+ *
+ * <p>The set is backed by the map, so changes to the map are
* reflected in the set, and vice-versa. The set supports element
* removal, which removes the corresponding mapping from the map,
* via the {@code Iterator.remove}, {@code Set.remove},
@@ -1858,15 +1882,12 @@
* operations. It does not support the {@code add} or
* {@code addAll} operations.
*
- * <p>The view's {@code iterator} is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse elements
- * as they existed upon construction of the iterator, and may (but is not
- * guaranteed to) reflect any modifications subsequent to construction.
+ * <p>The view's iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
- * <p>The {@code Map.Entry} elements returned by
- * {@code iterator.next()} do <em>not</em> support the
- * {@code setValue} operation.
+ * <p>The {@code Map.Entry} elements traversed by the {@code iterator}
+ * or {@code spliterator} do <em>not</em> support the {@code setValue}
+ * operation.
*
* @return a set view of the mappings contained in this map,
* sorted in ascending key order
@@ -2548,8 +2569,7 @@
* @serial include
*/
static final class SubMap<K,V> extends AbstractMap<K,V>
- implements ConcurrentNavigableMap<K,V>, Cloneable,
- java.io.Serializable {
+ implements ConcurrentNavigableMap<K,V>, Cloneable, Serializable {
private static final long serialVersionUID = -7647078645895051609L;
/** Underlying map */
@@ -3180,6 +3200,7 @@
public long estimateSize() {
return Long.MAX_VALUE;
}
+
}
final class SubMapValueIterator extends SubMapIter<V> {
@@ -3434,7 +3455,8 @@
}
public int characteristics() {
- return Spliterator.CONCURRENT | Spliterator.NONNULL;
+ return Spliterator.CONCURRENT | Spliterator.ORDERED |
+ Spliterator.NONNULL;
}
}
@@ -3528,8 +3550,17 @@
}
public final Comparator<Map.Entry<K,V>> getComparator() {
- return comparator == null ? null :
- Map.Entry.comparingByKey(comparator);
+ // Adapt or create a key-based comparator
+ if (comparator != null) {
+ return Map.Entry.comparingByKey(comparator);
+ }
+ else {
+ return (Comparator<Map.Entry<K,V>> & Serializable) (e1, e2) -> {
+ @SuppressWarnings("unchecked")
+ Comparable<? super K> k1 = (Comparable<? super K>) e1.getKey();
+ return k1.compareTo(e2.getKey());
+ };
+ }
}
}
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListSet.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListSet.java Tue Aug 20 17:44:18 2013 -0700
@@ -57,12 +57,12 @@
* cost for the {@code contains}, {@code add}, and {@code remove}
* operations and their variants. Insertion, removal, and access
* operations safely execute concurrently by multiple threads.
- * Iterators are <i>weakly consistent</i>, returning elements
- * reflecting the state of the set at some point at or since the
- * creation of the iterator. They do <em>not</em> throw {@link
- * java.util.ConcurrentModificationException}, and may proceed
- * concurrently with other operations. Ascending ordered views and
- * their iterators are faster than descending ones.
+ *
+ * <p>Iterators and spliterators are
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>Ascending ordered views and their iterators are faster than
+ * descending ones.
*
* <p>Beware that, unlike in most collections, the {@code size}
* method is <em>not</em> a constant-time operation. Because of the
@@ -480,6 +480,24 @@
return new ConcurrentSkipListSet<E>(m.descendingMap());
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this set.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#NONNULL}, {@link Spliterator#DISTINCT},
+ * {@link Spliterator#SORTED} and {@link Spliterator#ORDERED}, with an
+ * encounter order that is ascending order. Overriding implementations
+ * should document the reporting of additional characteristic values.
+ *
+ * <p>The spliterator's comparator (see
+ * {@link java.util.Spliterator#getComparator()}) is {@code null} if
+ * the set's comparator (see {@link #comparator()}) is {@code null}.
+ * Otherwise, the spliterator's comparator is the same as or imposes the
+ * same total ordering as the set's comparator.
+ *
+ * @return a {@code Spliterator} over the elements in this set
+ * @since 1.8
+ */
@SuppressWarnings("unchecked")
public Spliterator<E> spliterator() {
if (m instanceof ConcurrentSkipListMap)
--- a/jdk/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Tue Aug 20 17:44:18 2013 -0700
@@ -952,6 +952,8 @@
/**
* Saves this list to a stream (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData The length of the array backing the list is emitted
* (int), followed by all of its elements (each an Object)
* in the proper order.
@@ -972,6 +974,10 @@
/**
* Reconstitutes this list from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
@@ -1092,15 +1098,29 @@
*
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
- public ListIterator<E> listIterator(final int index) {
+ public ListIterator<E> listIterator(int index) {
Object[] elements = getArray();
int len = elements.length;
- if (index<0 || index>len)
+ if (index < 0 || index > len)
throw new IndexOutOfBoundsException("Index: "+index);
return new COWIterator<E>(elements, index);
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this list.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#IMMUTABLE},
+ * {@link Spliterator#ORDERED}, {@link Spliterator#SIZED}, and
+ * {@link Spliterator#SUBSIZED}.
+ *
+ * <p>The spliterator provides a snapshot of the state of the list
+ * when the spliterator was constructed. No synchronization is needed while
+ * operating on the spliterator.
+ *
+ * @return a {@code Spliterator} over the elements in this list
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return Spliterators.spliterator
(getArray(), Spliterator.IMMUTABLE | Spliterator.ORDERED);
@@ -1257,7 +1277,7 @@
// only call this holding l's lock
private void rangeCheck(int index) {
- if (index<0 || index>=size)
+ if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
",Size: "+size);
}
@@ -1304,7 +1324,7 @@
lock.lock();
try {
checkForComodification();
- if (index<0 || index>size)
+ if (index < 0 || index > size)
throw new IndexOutOfBoundsException();
l.add(index+offset, element);
expectedArray = l.getArray();
@@ -1361,12 +1381,12 @@
}
}
- public ListIterator<E> listIterator(final int index) {
+ public ListIterator<E> listIterator(int index) {
final ReentrantLock lock = l.lock;
lock.lock();
try {
checkForComodification();
- if (index<0 || index>size)
+ if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
return new COWSubListIterator<E>(l, index, offset, size);
@@ -1380,7 +1400,7 @@
lock.lock();
try {
checkForComodification();
- if (fromIndex<0 || toIndex>size)
+ if (fromIndex < 0 || toIndex > size)
throw new IndexOutOfBoundsException();
return new COWSubList<E>(l, fromIndex + offset,
toIndex + offset);
@@ -1580,6 +1600,7 @@
return Spliterators.spliterator
(a, lo, hi, Spliterator.IMMUTABLE | Spliterator.ORDERED);
}
+
}
private static class COWSubListIterator<E> implements ListIterator<E> {
--- a/jdk/src/share/classes/java/util/concurrent/CopyOnWriteArraySet.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/CopyOnWriteArraySet.java Tue Aug 20 17:44:18 2013 -0700
@@ -404,6 +404,21 @@
al.forEach(action);
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this set in the order
+ * in which these elements were added.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#IMMUTABLE},
+ * {@link Spliterator#DISTINCT}, {@link Spliterator#SIZED}, and
+ * {@link Spliterator#SUBSIZED}.
+ *
+ * <p>The spliterator provides a snapshot of the state of the set
+ * when the spliterator was constructed. No synchronization is needed while
+ * operating on the spliterator.
+ *
+ * @return a {@code Spliterator} over the elements in this set
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return Spliterators.spliterator
(al.getArray(), Spliterator.IMMUTABLE | Spliterator.DISTINCT);
--- a/jdk/src/share/classes/java/util/concurrent/DelayQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/DelayQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -512,12 +512,8 @@
* unexpired) in this queue. The iterator does not return the
* elements in any particular order.
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this queue
*/
--- a/jdk/src/share/classes/java/util/concurrent/ForkJoinPool.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ForkJoinPool.java Tue Aug 20 17:44:18 2013 -0700
@@ -144,7 +144,8 @@
* Upon any error in establishing these settings, default parameters
* are used. It is possible to disable or limit the use of threads in
* the common pool by setting the parallelism property to zero, and/or
- * using a factory that may return {@code null}.
+ * using a factory that may return {@code null}. However doing so may
+ * cause unjoined tasks to never be executed.
*
* <p><b>Implementation notes</b>: This implementation restricts the
* maximum number of running threads to 32767. Attempts to create
@@ -3303,8 +3304,8 @@
}
if (parallelism < 0 && // default 1 less than #cores
- (parallelism = Runtime.getRuntime().availableProcessors() - 1) < 0)
- parallelism = 0;
+ (parallelism = Runtime.getRuntime().availableProcessors() - 1) <= 0)
+ parallelism = 1;
if (parallelism > MAX_CAP)
parallelism = MAX_CAP;
return new ForkJoinPool(parallelism, factory, handler, LIFO_QUEUE,
--- a/jdk/src/share/classes/java/util/concurrent/LinkedBlockingDeque.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/LinkedBlockingDeque.java Tue Aug 20 17:44:18 2013 -0700
@@ -1008,12 +1008,8 @@
* Returns an iterator over the elements in this deque in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this deque in proper sequence
*/
@@ -1026,12 +1022,8 @@
* sequential order. The elements will be returned in order from
* last (tail) to first (head).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this deque in reverse order
*/
@@ -1270,6 +1262,22 @@
}
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this deque.
+ *
+ * <p>The returned spliterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
+ *
+ * @implNote
+ * The {@code Spliterator} implements {@code trySplit} to permit limited
+ * parallelism.
+ *
+ * @return a {@code Spliterator} over the elements in this deque
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return new LBDSpliterator<E>(this);
}
@@ -1277,6 +1285,8 @@
/**
* Saves this deque to a stream (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData The capacity (int), followed by elements (each an
* {@code Object}) in the proper order, followed by a null
*/
@@ -1299,6 +1309,10 @@
/**
* Reconstitutes this deque from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
--- a/jdk/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -766,12 +766,8 @@
* Returns an iterator over the elements in this queue in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this queue in proper sequence
*/
@@ -973,6 +969,22 @@
}
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this queue.
+ *
+ * <p>The returned spliterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
+ *
+ * @implNote
+ * The {@code Spliterator} implements {@code trySplit} to permit limited
+ * parallelism.
+ *
+ * @return a {@code Spliterator} over the elements in this queue
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return new LBQSpliterator<E>(this);
}
@@ -980,6 +992,8 @@
/**
* Saves this queue to a stream (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData The capacity is emitted (int), followed by all of
* its elements (each an {@code Object}) in the proper order,
* followed by a null
@@ -1005,6 +1019,10 @@
/**
* Reconstitutes this queue from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
--- a/jdk/src/share/classes/java/util/concurrent/LinkedTransferQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/LinkedTransferQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -40,6 +40,7 @@
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Queue;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
import java.util.Spliterator;
import java.util.Spliterators;
@@ -1018,6 +1019,22 @@
}
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this queue.
+ *
+ * <p>The returned spliterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
+ * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
+ *
+ * @implNote
+ * The {@code Spliterator} implements {@code trySplit} to permit limited
+ * parallelism.
+ *
+ * @return a {@code Spliterator} over the elements in this queue
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return new LTQSpliterator<E>(this);
}
@@ -1301,12 +1318,8 @@
* Returns an iterator over the elements in this queue in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this queue in proper sequence
*/
@@ -1407,6 +1420,8 @@
/**
* Saves this queue to a stream (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData All of the elements (each an {@code E}) in
* the proper order, followed by a null
*/
@@ -1421,6 +1436,10 @@
/**
* Reconstitutes this queue from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
--- a/jdk/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -229,7 +229,7 @@
/**
* Creates a {@code PriorityBlockingQueue} containing the elements
* in the specified collection. If the specified collection is a
- * {@link SortedSet} or a {@link PriorityQueue}, this
+ * {@link SortedSet} or a {@link PriorityQueue}, this
* priority queue will be ordered according to the same ordering.
* Otherwise, this priority queue will be ordered according to the
* {@linkplain Comparable natural ordering} of its elements.
@@ -864,12 +864,8 @@
* Returns an iterator over the elements in this queue. The
* iterator does not return the elements in any particular order.
*
- * <p>The returned iterator is a "weakly consistent" iterator that
- * will never throw {@link java.util.ConcurrentModificationException
- * ConcurrentModificationException}, and guarantees to traverse
- * elements as they existed upon construction of the iterator, and
- * may (but is not guaranteed to) reflect any modifications
- * subsequent to construction.
+ * <p>The returned iterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
*
* @return an iterator over the elements in this queue
*/
@@ -915,6 +911,9 @@
* For compatibility with previous version of this class, elements
* are first copied to a java.util.PriorityQueue, which is then
* serialized.
+ *
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
@@ -932,6 +931,10 @@
/**
* Reconstitutes this queue from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
@@ -1005,6 +1008,21 @@
}
}
+ /**
+ * Returns a {@link Spliterator} over the elements in this queue.
+ *
+ * <p>The returned spliterator is
+ * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
+ *
+ * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and
+ * {@link Spliterator#NONNULL}.
+ *
+ * @implNote
+ * The {@code Spliterator} additionally reports {@link Spliterator#SUBSIZED}.
+ *
+ * @return a {@code Spliterator} over the elements in this queue
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return new PBQSpliterator<E>(this, null, 0, -1);
}
--- a/jdk/src/share/classes/java/util/concurrent/SynchronousQueue.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/SynchronousQueue.java Tue Aug 20 17:44:18 2013 -0700
@@ -38,6 +38,8 @@
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;
import java.util.*;
+import java.util.Spliterator;
+import java.util.Spliterators;
/**
* A {@linkplain BlockingQueue blocking queue} in which each insert
@@ -1062,21 +1064,17 @@
*
* @return an empty iterator
*/
- @SuppressWarnings("unchecked")
public Iterator<E> iterator() {
- return (Iterator<E>) EmptyIterator.EMPTY_ITERATOR;
+ return Collections.emptyIterator();
}
- // Replicated from a previous version of Collections
- private static class EmptyIterator<E> implements Iterator<E> {
- static final EmptyIterator<Object> EMPTY_ITERATOR
- = new EmptyIterator<Object>();
-
- public boolean hasNext() { return false; }
- public E next() { throw new NoSuchElementException(); }
- public void remove() { throw new IllegalStateException(); }
- }
-
+ /**
+ * Returns an empty spliterator in which calls to
+ * {@link java.util.Spliterator#trySplit()} always return {@code null}.
+ *
+ * @return an empty spliterator
+ * @since 1.8
+ */
public Spliterator<E> spliterator() {
return Spliterators.emptySpliterator();
}
@@ -1163,6 +1161,8 @@
/**
* Saves this queue to a stream (that is, serializes it).
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
@@ -1182,8 +1182,12 @@
/**
* Reconstitutes this queue from a stream (that is, deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
- private void readObject(final java.io.ObjectInputStream s)
+ private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
if (waitingProducers instanceof FifoWaitQueue)
--- a/jdk/src/share/classes/java/util/concurrent/atomic/Striped64.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/atomic/Striped64.java Tue Aug 20 17:44:18 2013 -0700
@@ -43,6 +43,7 @@
* for classes supporting dynamic striping on 64bit values. The class
* extends Number so that concrete subclasses must publicly do so.
*/
+@SuppressWarnings("serial")
abstract class Striped64 extends Number {
/*
* This class maintains a lazily-initialized table of atomically
--- a/jdk/src/share/classes/java/util/concurrent/package-info.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/package-info.java Tue Aug 20 17:44:18 2013 -0700
@@ -210,13 +210,19 @@
* collections are unshared, or are accessible only when
* holding other locks.
*
- * <p>Most concurrent Collection implementations (including most
- * Queues) also differ from the usual java.util conventions in that
- * their Iterators provide <em>weakly consistent</em> rather than
- * fast-fail traversal. A weakly consistent iterator is thread-safe,
- * but does not necessarily freeze the collection while iterating, so
- * it may (or may not) reflect any updates since the iterator was
- * created.
+ * <p id="Weakly">Most concurrent Collection implementations
+ * (including most Queues) also differ from the usual {@code java.util}
+ * conventions in that their {@linkplain java.util.Iterator Iterators}
+ * and {@linkplain java.util.Spliterator Spliterators} provide
+ * <em>weakly consistent</em> rather than fast-fail traversal:
+ * <ul>
+ * <li>they may proceed concurrently with other operations
+ * <li>they will never throw {@link java.util.ConcurrentModificationException
+ * ConcurrentModificationException}
+ * <li>they are guaranteed to traverse elements as they existed upon
+ * construction exactly once, and may (but are not guaranteed to)
+ * reflect any modifications subsequent to construction.
+ * </ul>
*
* <h2 id="MemoryVisibility">Memory Consistency Properties</h2>
*
--- a/jdk/src/share/classes/java/util/jar/Attributes.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/jar/Attributes.java Tue Aug 20 17:44:18 2013 -0700
@@ -565,15 +565,6 @@
public static final Name MAIN_CLASS = new Name("Main-Class");
/**
- * {@code Name} object for {@code Profile} manifest attribute used by
- * applications or libraries packaged as JAR files to indicate the
- * minimum profile required to execute the application.
- * @since 1.8
- * @see UnsupportedProfileException
- */
- public static final Name PROFILE = new Name("Profile");
-
- /**
* <code>Name</code> object for <code>Sealed</code> manifest attribute
* used for sealing.
* @see <a href="../../../../technotes/guides/extensions/spec.html#sealing">
--- a/jdk/src/share/classes/java/util/jar/JarFile.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/jar/JarFile.java Tue Aug 20 17:44:18 2013 -0700
@@ -69,8 +69,6 @@
// indicates if Class-Path attribute present (only valid if hasCheckedSpecialAttributes true)
private boolean hasClassPathAttribute;
- // indicates if Profile attribute present (only valid if hasCheckedSpecialAttributes true)
- private boolean hasProfileAttribute;
// true if manifest checked for special attributes
private volatile boolean hasCheckedSpecialAttributes;
@@ -459,15 +457,10 @@
// Statics for hand-coded Boyer-Moore search
private static final char[] CLASSPATH_CHARS = {'c','l','a','s','s','-','p','a','t','h'};
- private static final char[] PROFILE_CHARS = { 'p', 'r', 'o', 'f', 'i', 'l', 'e' };
// The bad character shift for "class-path"
private static final int[] CLASSPATH_LASTOCC;
// The good suffix shift for "class-path"
private static final int[] CLASSPATH_OPTOSFT;
- // The bad character shift for "profile"
- private static final int[] PROFILE_LASTOCC;
- // The good suffix shift for "profile"
- private static final int[] PROFILE_OPTOSFT;
static {
CLASSPATH_LASTOCC = new int[128];
@@ -483,19 +476,6 @@
for (int i=0; i<9; i++)
CLASSPATH_OPTOSFT[i] = 10;
CLASSPATH_OPTOSFT[9]=1;
-
- PROFILE_LASTOCC = new int[128];
- PROFILE_OPTOSFT = new int[7];
- PROFILE_LASTOCC[(int)'p'] = 1;
- PROFILE_LASTOCC[(int)'r'] = 2;
- PROFILE_LASTOCC[(int)'o'] = 3;
- PROFILE_LASTOCC[(int)'f'] = 4;
- PROFILE_LASTOCC[(int)'i'] = 5;
- PROFILE_LASTOCC[(int)'l'] = 6;
- PROFILE_LASTOCC[(int)'e'] = 7;
- for (int i=0; i<6; i++)
- PROFILE_OPTOSFT[i] = 7;
- PROFILE_OPTOSFT[6] = 1;
}
private JarEntry getManEntry() {
@@ -530,15 +510,6 @@
}
/**
- * Returns {@code true} iff this JAR file has a manifest with the
- * Profile attribute
- */
- boolean hasProfileAttribute() throws IOException {
- checkForSpecialAttributes();
- return hasProfileAttribute;
- }
-
- /**
* Returns true if the pattern {@code src} is found in {@code b}.
* The {@code lastOcc} and {@code optoSft} arrays are the precomputed
* bad character and good suffix shifts.
@@ -564,7 +535,7 @@
/**
* On first invocation, check if the JAR file has the Class-Path
- * and/or Profile attributes. A no-op on subsequent calls.
+ * attribute. A no-op on subsequent calls.
*/
private void checkForSpecialAttributes() throws IOException {
if (hasCheckedSpecialAttributes) return;
@@ -574,8 +545,6 @@
byte[] b = getBytes(manEntry);
if (match(CLASSPATH_CHARS, b, CLASSPATH_LASTOCC, CLASSPATH_OPTOSFT))
hasClassPathAttribute = true;
- if (match(PROFILE_CHARS, b, PROFILE_LASTOCC, PROFILE_OPTOSFT))
- hasProfileAttribute = true;
}
}
hasCheckedSpecialAttributes = true;
--- a/jdk/src/share/classes/java/util/jar/JarVerifier.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/jar/JarVerifier.java Tue Aug 20 17:44:18 2013 -0700
@@ -139,13 +139,21 @@
return;
}
+ if (uname.equals(JarFile.MANIFEST_NAME)) {
+ return;
+ }
+
if (SignatureFileVerifier.isBlockOrSF(uname)) {
/* We parse only DSA, RSA or EC PKCS7 blocks. */
parsingBlockOrSF = true;
baos.reset();
mev.setEntry(null, je);
+ return;
}
- return;
+
+ // If a META-INF entry is not MF or block or SF, they should
+ // be normal entries. According to 2 above, no more block or
+ // SF will appear. Let's doneWithMeta.
}
}
--- a/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java Tue Aug 20 17:44:18 2013 -0700
@@ -37,10 +37,6 @@
return jar.hasClassPathAttribute();
}
- public boolean jarFileHasProfileAttribute(JarFile jar) throws IOException {
- return jar.hasProfileAttribute();
- }
-
public CodeSource[] getCodeSources(JarFile jar, URL url) {
return jar.getCodeSources(url);
}
--- a/jdk/src/share/classes/java/util/jar/UnsupportedProfileException.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package java.util.jar;
-
-/**
- * Thrown to indicate an attempt to access a JAR file with a {@link
- * Attributes.Name#PROFILE Profile} attribute that names a profile that
- * is not supported by this runtime.
- *
- * @since 1.8
- */
-public class UnsupportedProfileException extends RuntimeException {
- private static final long serialVersionUID = -1834773870678792406L;
-
- /**
- * Constructs an {@code UnsupportedProfileException} with no detail
- * message.
- */
- public UnsupportedProfileException() {
- }
-
- /**
- * Constructs an {@code UnsupportedProfileException} with the
- * specified detail message.
- *
- * @param message the detail message
- */
- public UnsupportedProfileException(String message) {
- super(message);
- }
-}
--- a/jdk/src/share/classes/java/util/stream/Collectors.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/Collectors.java Tue Aug 20 17:44:18 2013 -0700
@@ -354,6 +354,43 @@
}
/**
+ * Adapts a {@code Collector} to perform an additional finishing
+ * transformation. For example, one could adapt the {@link #toList()}
+ * collector to always produce an immutable list with:
+ * <pre>{@code
+ * List<String> people
+ * = people.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList));
+ * }</pre>
+ *
+ * @param <T> the type of the input elements
+ * @param <A> intermediate accumulation type of the downstream collector
+ * @param <R> result type of the downstream collector
+ * @param <RR> result type of the resulting collector
+ * @param downstream a collector
+ * @param finisher a function to be applied to the final result of the downstream collector
+ * @return a collector which performs the action of the downstream collector,
+ * followed by an additional finishing step
+ */
+ public static<T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream,
+ Function<R,RR> finisher) {
+ Set<Collector.Characteristics> characteristics = downstream.characteristics();
+ if (characteristics.contains(Collector.Characteristics.IDENTITY_FINISH)) {
+ if (characteristics.size() == 1)
+ characteristics = Collectors.CH_NOID;
+ else {
+ characteristics = EnumSet.copyOf(characteristics);
+ characteristics.remove(Collector.Characteristics.IDENTITY_FINISH);
+ characteristics = Collections.unmodifiableSet(characteristics);
+ }
+ }
+ return new CollectorImpl<>(downstream.supplier(),
+ downstream.accumulator(),
+ downstream.combiner(),
+ downstream.finisher().andThen(finisher),
+ characteristics);
+ }
+
+ /**
* Returns a {@code Collector} accepting elements of type {@code T} that
* counts the number of input elements. If no elements are present, the
* result is 0.
--- a/jdk/src/share/classes/java/util/zip/Adler32.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/Adler32.java Tue Aug 20 17:44:18 2013 -0700
@@ -62,6 +62,11 @@
/**
* Updates the checksum with the specified array of bytes.
+ *
+ * @throws ArrayIndexOutOfBoundsException
+ * if {@code off} is negative, or {@code len} is negative,
+ * or {@code off+len} is greater than the length of the
+ * array {@code b}
*/
public void update(byte[] b, int off, int len) {
if (b == null) {
--- a/jdk/src/share/classes/java/util/zip/CRC32.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/CRC32.java Tue Aug 20 17:44:18 2013 -0700
@@ -60,6 +60,11 @@
/**
* Updates the CRC-32 checksum with the specified array of bytes.
+ *
+ * @throws ArrayIndexOutOfBoundsException
+ * if {@code off} is negative, or {@code len} is negative,
+ * or {@code off+len} is greater than the length of the
+ * array {@code b}
*/
public void update(byte[] b, int off, int len) {
if (b == null) {
--- a/jdk/src/share/classes/java/util/zip/ZipConstants.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipConstants.java Tue Aug 20 17:44:18 2013 -0700
@@ -71,10 +71,17 @@
/*
* Extra field header ID
*/
- static final int EXTID_ZIP64 = 0x0001; // Zip64
- static final int EXTID_NTFS = 0x000a; // NTFS
- static final int EXTID_UNIX = 0x000d; // UNIX
- static final int EXTID_EXTT = 0x5455; // Info-ZIP Extended Timestamp
+ static final int EXTID_ZIP64 = 0x0001; // Zip64
+ static final int EXTID_NTFS = 0x000a; // NTFS
+ static final int EXTID_UNIX = 0x000d; // UNIX
+ static final int EXTID_EXTT = 0x5455; // Info-ZIP Extended Timestamp
+
+ /*
+ * EXTT timestamp flags
+ */
+ static final int EXTT_FLAG_LMT = 0x1; // LastModifiedTime
+ static final int EXTT_FLAG_LAT = 0x2; // LastAccessTime
+ static final int EXTT_FLAT_CT = 0x4; // CreationTime
/*
* Central directory (CEN) header field offsets
--- a/jdk/src/share/classes/java/util/zip/ZipEntry.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,11 @@
package java.util.zip;
+import static java.util.zip.ZipUtils.*;
+import java.nio.file.attribute.FileTime;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
/**
* This class is used to represent a ZIP file entry.
*
@@ -32,8 +37,12 @@
*/
public
class ZipEntry implements ZipConstants, Cloneable {
+
String name; // entry name
- long mtime = -1; // last modification time
+ long time = -1; // last modification time
+ FileTime mtime; // last modification time, from extra field data
+ FileTime atime; // last access time, from extra field data
+ FileTime ctime; // creation time, from extra field data
long crc = -1; // crc-32 of entry data
long size = -1; // uncompressed size of entry data
long csize = -1; // compressed size of entry data
@@ -55,15 +64,15 @@
/**
* Creates a new zip entry with the specified name.
*
- * @param name the entry name
- * @exception NullPointerException if the entry name is null
- * @exception IllegalArgumentException if the entry name is longer than
- * 0xFFFF bytes
+ * @param name
+ * The entry name
+ *
+ * @throws NullPointerException if the entry name is null
+ * @throws IllegalArgumentException if the entry name is longer than
+ * 0xFFFF bytes
*/
public ZipEntry(String name) {
- if (name == null) {
- throw new NullPointerException();
- }
+ Objects.requireNonNull(name, "name");
if (name.length() > 0xFFFF) {
throw new IllegalArgumentException("entry name too long");
}
@@ -73,11 +82,19 @@
/**
* Creates a new zip entry with fields taken from the specified
* zip entry.
- * @param e a zip Entry object
+ *
+ * @param e
+ * A zip Entry object
+ *
+ * @throws NullPointerException if the entry object is null
*/
public ZipEntry(ZipEntry e) {
+ Objects.requireNonNull(e, "entry");
name = e.name;
+ time = e.time;
mtime = e.mtime;
+ atime = e.atime;
+ ctime = e.ctime;
crc = e.crc;
size = e.size;
csize = e.csize;
@@ -103,33 +120,178 @@
/**
* Sets the last modification time of the entry.
*
- * @param time the last modification time of the entry in milliseconds since the epoch
+ * <p> If the entry is output to a ZIP file or ZIP file formatted
+ * output stream the last modification time set by this method will
+ * be stored into the {@code date and time fields} of the zip file
+ * entry and encoded in standard {@code MS-DOS date and time format}.
+ * The {@link java.util.TimeZone#getDefault() default TimeZone} is
+ * used to convert the epoch time to the MS-DOS data and time.
+ *
+ * @param time
+ * The last modification time of the entry in milliseconds
+ * since the epoch
+ *
* @see #getTime()
+ * @see #getLastModifiedTime()
*/
public void setTime(long time) {
+ this.time = time;
+ this.mtime = null;
+ }
+
+ /**
+ * Returns the last modification time of the entry.
+ *
+ * <p> If the entry is read from a ZIP file or ZIP file formatted
+ * input stream, this is the last modification time from the {@code
+ * date and time fields} of the zip file entry. The
+ * {@link java.util.TimeZone#getDefault() default TimeZone} is used
+ * to convert the standard MS-DOS formatted date and time to the
+ * epoch time.
+ *
+ * @return The last modification time of the entry in milliseconds
+ * since the epoch, or -1 if not specified
+ *
+ * @see #setTime(long)
+ * @see #setLastModifiedTime(FileTime)
+ */
+ public long getTime() {
+ return time;
+ }
+
+ /**
+ * Sets the last modification time of the entry.
+ *
+ * <p> When output to a ZIP file or ZIP file formatted output stream
+ * the last modification time set by this method will be stored into
+ * zip file entry's {@code date and time fields} in {@code standard
+ * MS-DOS date and time format}), and the extended timestamp fields
+ * in {@code optional extra data} in UTC time.
+ *
+ * @param time
+ * The last modification time of the entry
+ * @return This zip entry
+ *
+ * @throws NullPointerException if the {@code time} is null
+ *
+ * @see #getLastModifiedTime()
+ * @since 1.8
+ */
+ public ZipEntry setLastModifiedTime(FileTime time) {
+ Objects.requireNonNull(name, "time");
this.mtime = time;
+ this.time = time.to(TimeUnit.MILLISECONDS);
+ return this;
}
/**
* Returns the last modification time of the entry.
- * <p> The last modificatin time may come from zip entry's extensible
- * data field {@code NTFS} or {@code Info-ZIP Extended Timestamp}, if
- * the entry is read from {@link ZipInputStream} or {@link ZipFile}.
+ *
+ * <p> If the entry is read from a ZIP file or ZIP file formatted
+ * input stream, this is the last modification time from the zip
+ * file entry's {@code optional extra data} if the extended timestamp
+ * fields are present. Otherwise the last modification time is read
+ * from the entry's {@code date and time fields}, the {@link
+ * java.util.TimeZone#getDefault() default TimeZone} is used to convert
+ * the standard MS-DOS formatted date and time to the epoch time.
+ *
+ * @return The last modification time of the entry, null if not specified
+ *
+ * @see #setLastModifiedTime(FileTime)
+ * @since 1.8
+ */
+ public FileTime getLastModifiedTime() {
+ if (mtime != null)
+ return mtime;
+ if (time == -1)
+ return null;
+ return FileTime.from(time, TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * Sets the last access time of the entry.
+ *
+ * <p> If set, the last access time will be stored into the extended
+ * timestamp fields of entry's {@code optional extra data}, when output
+ * to a ZIP file or ZIP file formatted stream.
+ *
+ * @param time
+ * The last access time of the entry
+ * @return This zip entry
+ *
+ * @throws NullPointerException if the {@code time} is null
+ *
+ * @see #getLastAccessTime()
+ * @since 1.8
+ */
+ public ZipEntry setLastAccessTime(FileTime time) {
+ Objects.requireNonNull(name, "time");
+ this.atime = time;
+ return this;
+ }
+
+ /**
+ * Returns the last access time of the entry.
*
- * @return the last modification time of the entry, or -1 if not specified
- * @see #setTime(long)
+ * <p> The last access time is from the extended timestamp fields
+ * of entry's {@code optional extra data} when read from a ZIP file
+ * or ZIP file formatted stream.
+ *
+ * @return The last access time of the entry, null if not specified
+
+ * @see #setLastAccessTime(FileTime)
+ * @since 1.8
*/
- public long getTime() {
- return mtime;
+ public FileTime getLastAccessTime() {
+ return atime;
+ }
+
+ /**
+ * Sets the creation time of the entry.
+ *
+ * <p> If set, the creation time will be stored into the extended
+ * timestamp fields of entry's {@code optional extra data}, when
+ * output to a ZIP file or ZIP file formatted stream.
+ *
+ * @param time
+ * The creation time of the entry
+ * @return This zip entry
+ *
+ * @throws NullPointerException if the {@code time} is null
+ *
+ * @see #getCreationTime()
+ * @since 1.8
+ */
+ public ZipEntry setCreationTime(FileTime time) {
+ Objects.requireNonNull(name, "time");
+ this.ctime = time;
+ return this;
+ }
+
+ /**
+ * Returns the creation time of the entry.
+ *
+ * <p> The creation time is from the extended timestamp fields of
+ * entry's {@code optional extra data} when read from a ZIP file
+ * or ZIP file formatted stream.
+ *
+ * @return the creation time of the entry, null if not specified
+ * @see #setCreationTime(FileTime)
+ * @since 1.8
+ */
+ public FileTime getCreationTime() {
+ return ctime;
}
/**
* Sets the uncompressed size of the entry data.
+ *
* @param size the uncompressed size in bytes
- * @exception IllegalArgumentException if the specified size is less
- * than 0, is greater than 0xFFFFFFFF when
- * <a href="package-summary.html#zip64">ZIP64 format</a> is not supported,
- * or is less than 0 when ZIP64 is supported
+ *
+ * @throws IllegalArgumentException if the specified size is less
+ * than 0, is greater than 0xFFFFFFFF when
+ * <a href="package-summary.html#zip64">ZIP64 format</a> is not supported,
+ * or is less than 0 when ZIP64 is supported
* @see #getSize()
*/
public void setSize(long size) {
@@ -140,7 +302,8 @@
}
/**
- * Returns the uncompressed size of the entry data, or -1 if not known.
+ * Returns the uncompressed size of the entry data.
+ *
* @return the uncompressed size of the entry data, or -1 if not known
* @see #setSize(long)
*/
@@ -149,9 +312,11 @@
}
/**
- * Returns the size of the compressed entry data, or -1 if not known.
- * In the case of a stored entry, the compressed size will be the same
+ * Returns the size of the compressed entry data.
+ *
+ * <p> In the case of a stored entry, the compressed size will be the same
* as the uncompressed size of the entry.
+ *
* @return the size of the compressed entry data, or -1 if not known
* @see #setCompressedSize(long)
*/
@@ -161,7 +326,9 @@
/**
* Sets the size of the compressed entry data.
+ *
* @param csize the compressed size to set to
+ *
* @see #getCompressedSize()
*/
public void setCompressedSize(long csize) {
@@ -170,9 +337,11 @@
/**
* Sets the CRC-32 checksum of the uncompressed entry data.
+ *
* @param crc the CRC-32 value
- * @exception IllegalArgumentException if the specified CRC-32 value is
- * less than 0 or greater than 0xFFFFFFFF
+ *
+ * @throws IllegalArgumentException if the specified CRC-32 value is
+ * less than 0 or greater than 0xFFFFFFFF
* @see #getCrc()
*/
public void setCrc(long crc) {
@@ -183,10 +352,11 @@
}
/**
- * Returns the CRC-32 checksum of the uncompressed entry data, or -1 if
- * not known.
+ * Returns the CRC-32 checksum of the uncompressed entry data.
+ *
* @return the CRC-32 checksum of the uncompressed entry data, or -1 if
* not known
+ *
* @see #setCrc(long)
*/
public long getCrc() {
@@ -195,9 +365,11 @@
/**
* Sets the compression method for the entry.
+ *
* @param method the compression method, either STORED or DEFLATED
- * @exception IllegalArgumentException if the specified compression
- * method is invalid
+ *
+ * @throws IllegalArgumentException if the specified compression
+ * method is invalid
* @see #getMethod()
*/
public void setMethod(int method) {
@@ -208,7 +380,8 @@
}
/**
- * Returns the compression method of the entry, or -1 if not specified.
+ * Returns the compression method of the entry.
+ *
* @return the compression method of the entry, or -1 if not specified
* @see #setMethod(int)
*/
@@ -218,21 +391,104 @@
/**
* Sets the optional extra field data for the entry.
- * @param extra the extra field data bytes
- * @exception IllegalArgumentException if the length of the specified
- * extra field data is greater than 0xFFFF bytes
+ *
+ * <p> Invoking this method may change this entry's last modification
+ * time, last access time and creation time, if the {@code extra} field
+ * data includes the extensible timestamp fields, such as {@code NTFS tag
+ * 0x0001} or {@code Info-ZIP Extended Timestamp}, as specified in
+ * <a href="http://www.info-zip.org/doc/appnote-19970311-iz.zip">Info-ZIP
+ * Application Note 970311</a>.
+ *
+ * @param extra
+ * The extra field data bytes
+ *
+ * @throws IllegalArgumentException if the length of the specified
+ * extra field data is greater than 0xFFFF bytes
+ *
* @see #getExtra()
*/
public void setExtra(byte[] extra) {
- if (extra != null && extra.length > 0xFFFF) {
- throw new IllegalArgumentException("invalid extra field length");
+ setExtra0(extra, false);
+ }
+
+ /**
+ * Sets the optional extra field data for the entry.
+ *
+ * @param extra
+ * the extra field data bytes
+ * @param doZIP64
+ * if true, set size and csize from ZIP64 fields if present
+ */
+ void setExtra0(byte[] extra, boolean doZIP64) {
+ if (extra != null) {
+ if (extra.length > 0xFFFF) {
+ throw new IllegalArgumentException("invalid extra field length");
+ }
+ // extra fields are in "HeaderID(2)DataSize(2)Data... format
+ int off = 0;
+ int len = extra.length;
+ while (off + 4 < len) {
+ int tag = get16(extra, off);
+ int sz = get16(extra, off + 2);
+ off += 4;
+ if (off + sz > len) // invalid data
+ break;
+ switch (tag) {
+ case EXTID_ZIP64:
+ if (doZIP64) {
+ // LOC extra zip64 entry MUST include BOTH original
+ // and compressed file size fields.
+ // If invalid zip64 extra fields, simply skip. Even
+ // it's rare, it's possible the entry size happens to
+ // be the magic value and it "accidently" has some
+ // bytes in extra match the id.
+ if (sz >= 16) {
+ size = get64(extra, off);
+ csize = get64(extra, off + 8);
+ }
+ }
+ break;
+ case EXTID_NTFS:
+ int pos = off + 4; // reserved 4 bytes
+ if (get16(extra, pos) != 0x0001 || get16(extra, pos + 2) != 24)
+ break;
+ mtime = winTimeToFileTime(get64(extra, pos + 4));
+ atime = winTimeToFileTime(get64(extra, pos + 12));
+ ctime = winTimeToFileTime(get64(extra, pos + 20));
+ break;
+ case EXTID_EXTT:
+ int flag = Byte.toUnsignedInt(extra[off]);
+ int sz0 = 1;
+ // The CEN-header extra field contains the modification
+ // time only, or no timestamp at all. 'sz' is used to
+ // flag its presence or absence. But if mtime is present
+ // in LOC it must be present in CEN as well.
+ if ((flag & 0x1) != 0 && (sz0 + 4) <= sz) {
+ mtime = unixTimeToFileTime(get32(extra, off + sz0));
+ sz0 += 4;
+ }
+ if ((flag & 0x2) != 0 && (sz0 + 4) <= sz) {
+ atime = unixTimeToFileTime(get32(extra, off + sz0));
+ sz0 += 4;
+ }
+ if ((flag & 0x4) != 0 && (sz0 + 4) <= sz) {
+ ctime = unixTimeToFileTime(get32(extra, off + sz0));
+ sz0 += 4;
+ }
+ break;
+ default:
+ }
+ off += sz;
+ }
}
this.extra = extra;
}
/**
- * Returns the extra field data for the entry, or null if none.
+ * Returns the extra field data for the entry.
+ *
* @return the extra field data for the entry, or null if none
+ *
* @see #setExtra(byte[])
*/
public byte[] getExtra() {
@@ -255,8 +511,10 @@
}
/**
- * Returns the comment string for the entry, or null if none.
+ * Returns the comment string for the entry.
+ *
* @return the comment string for the entry, or null if none
+ *
* @see #setComment(String)
*/
public String getComment() {
--- a/jdk/src/share/classes/java/util/zip/ZipFile.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipFile.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -567,44 +567,12 @@
e.name = zc.toString(bname, bname.length);
}
}
+ e.time = dosToJavaTime(getEntryTime(jzentry));
e.crc = getEntryCrc(jzentry);
e.size = getEntrySize(jzentry);
- e. csize = getEntryCSize(jzentry);
+ e.csize = getEntryCSize(jzentry);
e.method = getEntryMethod(jzentry);
- e.extra = getEntryBytes(jzentry, JZENTRY_EXTRA);
- if (e.extra != null) {
- byte[] extra = e.extra;
- int len = e.extra.length;
- int off = 0;
- while (off + 4 < len) {
- int pos = off;
- int tag = get16(extra, pos);
- int sz = get16(extra, pos + 2);
- pos += 4;
- if (pos + sz > len) // invalid data
- break;
- switch (tag) {
- case EXTID_NTFS:
- pos += 4; // reserved 4 bytes
- if (get16(extra, pos) != 0x0001 || get16(extra, pos + 2) != 24)
- break;
- e.mtime = winToJavaTime(get64(extra, pos + 4));
- break;
- case EXTID_EXTT:
- int flag = Byte.toUnsignedInt(extra[pos++]);
- if ((flag & 0x1) != 0) {
- e.mtime = unixToJavaTime(get32(extra, pos));
- pos += 4;
- }
- break;
- default: // unknown tag
- }
- off += (sz + 4);
- }
- }
- if (e.mtime == -1) {
- e.mtime = dosToJavaTime(getEntryTime(jzentry));
- }
+ e.setExtra0(getEntryBytes(jzentry, JZENTRY_EXTRA), false);
byte[] bcomm = getEntryBytes(jzentry, JZENTRY_COMMENT);
if (bcomm == null) {
e.comment = null;
--- a/jdk/src/share/classes/java/util/zip/ZipInputStream.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipInputStream.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -288,9 +288,9 @@
int len = get16(tmpbuf, LOCNAM);
int blen = b.length;
if (len > blen) {
- do
+ do {
blen = blen * 2;
- while (len > blen);
+ } while (len > blen);
b = new byte[blen];
}
readFully(b, 0, len);
@@ -303,7 +303,7 @@
throw new ZipException("encrypted ZIP entry not supported");
}
e.method = get16(tmpbuf, LOCHOW);
- e.mtime = dosToJavaTime(get32(tmpbuf, LOCTIM));
+ e.time = dosToJavaTime(get32(tmpbuf, LOCTIM));
if ((flag & 8) == 8) {
/* "Data Descriptor" present */
if (e.method != DEFLATED) {
@@ -319,49 +319,7 @@
if (len > 0) {
byte[] extra = new byte[len];
readFully(extra, 0, len);
- e.setExtra(extra);
- // extra fields are in "HeaderID(2)DataSize(2)Data... format
- int off = 0;
- while (off + 4 < len) {
- int pos = off;
- int tag = get16(extra, pos);
- int sz = get16(extra, pos + 2);
- pos += 4;
- if (pos + sz > len) // invalid data
- break;
- switch (tag) {
- case EXTID_ZIP64 :
- // LOC extra zip64 entry MUST include BOTH original and
- // compressed file size fields.
- //
- // If invalid zip64 extra fields, simply skip. Even it's
- // rare, it's possible the entry size happens to be
- // the magic value and it "accidently" has some bytes
- // in extra match the id.
- if (sz >= 16 && (pos + sz) <= len ) {
- e.size = get64(extra, pos);
- e.csize = get64(extra, pos + 8);
- }
- break;
- case EXTID_NTFS:
- pos += 4; // reserved 4 bytes
- if (get16(extra, pos) != 0x0001 || get16(extra, pos + 2) != 24)
- break;
- // override the loc field, NTFS time has 'microsecond' granularity
- e.mtime = winToJavaTime(get64(extra, pos + 4));
- break;
- case EXTID_EXTT:
- int flag = Byte.toUnsignedInt(extra[pos++]);
- if ((flag & 0x1) != 0) {
- e.mtime = unixToJavaTime(get32(extra, pos));
- pos += 4;
- }
- break;
- default: // unknown tag
- }
- off += (sz + 4);
- }
-
+ e.setExtra0(extra, true);
}
return e;
}
--- a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java Tue Aug 20 17:44:18 2013 -0700
@@ -59,8 +59,9 @@
"jdk.util.zip.inhibitZip64", "false")));
private static class XEntry {
- public final ZipEntry entry;
- public final long offset;
+ final ZipEntry entry;
+ final long offset;
+ long dostime; // last modification time in msdos format
public XEntry(ZipEntry entry, long offset) {
this.entry = entry;
this.offset = offset;
@@ -191,7 +192,9 @@
if (current != null) {
closeEntry(); // close previous entry
}
- if (e.mtime == -1) {
+ if (e.time == -1) {
+ // by default, do NOT use extended timestamps in extra
+ // data, for now.
e.setTime(System.currentTimeMillis());
}
if (e.method == -1) {
@@ -384,25 +387,20 @@
ZipEntry e = xentry.entry;
int flag = e.flag;
boolean hasZip64 = false;
- int elen = (e.extra != null) ? e.extra.length : 0;
- int eoff = 0;
- boolean foundEXTT = false; // if EXTT already present
- // do nothing.
- while (eoff + 4 < elen) {
- int tag = get16(e.extra, eoff);
- int sz = get16(e.extra, eoff + 2);
- if (tag == EXTID_EXTT) {
- foundEXTT = true;
- }
- eoff += (4 + sz);
- }
+ int elen = getExtraLen(e.extra);
+
+ // keep a copy of dostime for writeCEN(), otherwise the tz
+ // sensitive local time entries in loc and cen might be
+ // different if the default tz get changed during writeLOC()
+ // and writeCEN()
+ xentry.dostime = javaToDosTime(e.time);
+
writeInt(LOCSIG); // LOC header signature
if ((flag & 8) == 8) {
writeShort(version(e)); // version needed to extract
writeShort(flag); // general purpose bit flag
writeShort(e.method); // compression method
- writeInt(javaToDosTime(e.mtime)); // last modification time
-
+ writeInt(xentry.dostime); // last modification time
// store size, uncompressed size, and crc-32 in data descriptor
// immediately following compressed entry data
writeInt(0);
@@ -417,7 +415,7 @@
}
writeShort(flag); // general purpose bit flag
writeShort(e.method); // compression method
- writeInt(javaToDosTime(e.mtime)); // last modification time
+ writeInt(xentry.dostime); // last modification time
writeInt(e.crc); // crc-32
if (hasZip64) {
writeInt(ZIP64_MAGICVAL);
@@ -430,8 +428,23 @@
}
byte[] nameBytes = zc.getBytes(e.name);
writeShort(nameBytes.length);
- if (!foundEXTT)
- elen += 9; // use Info-ZIP's ext time in extra
+
+ int elenEXTT = 0; // info-zip extended timestamp
+ int flagEXTT = 0;
+ if (e.mtime != null) {
+ elenEXTT += 4;
+ flagEXTT |= EXTT_FLAG_LMT;
+ }
+ if (e.atime != null) {
+ elenEXTT += 4;
+ flagEXTT |= EXTT_FLAG_LAT;
+ }
+ if (e.ctime != null) {
+ elenEXTT += 4;
+ flagEXTT |= EXTT_FLAT_CT;
+ }
+ if (flagEXTT != 0)
+ elen += (elenEXTT + 5); // headid(2) + size(2) + flag(1) + data
writeShort(elen);
writeBytes(nameBytes, 0, nameBytes.length);
if (hasZip64) {
@@ -440,15 +453,18 @@
writeLong(e.size);
writeLong(e.csize);
}
- if (!foundEXTT) {
+ if (flagEXTT != 0) {
writeShort(EXTID_EXTT);
- writeShort(5); // size for the folowing data block
- writeByte(0x1); // flags byte, mtime only
- writeInt(javaToUnixTime(e.mtime));
+ writeShort(elenEXTT + 1); // flag + data
+ writeByte(flagEXTT);
+ if (e.mtime != null)
+ writeInt(fileTimeToUnixTime(e.mtime));
+ if (e.atime != null)
+ writeInt(fileTimeToUnixTime(e.atime));
+ if (e.ctime != null)
+ writeInt(fileTimeToUnixTime(e.ctime));
}
- if (e.extra != null) {
- writeBytes(e.extra, 0, e.extra.length);
- }
+ writeExtra(e.extra);
locoff = written;
}
@@ -506,31 +522,35 @@
}
writeShort(flag); // general purpose bit flag
writeShort(e.method); // compression method
- writeInt(javaToDosTime(e.mtime)); // last modification time
+ // use the copy in xentry, which has been converted
+ // from e.time in writeLOC()
+ writeInt(xentry.dostime); // last modification time
writeInt(e.crc); // crc-32
writeInt(csize); // compressed size
writeInt(size); // uncompressed size
byte[] nameBytes = zc.getBytes(e.name);
writeShort(nameBytes.length);
- int elen = (e.extra != null) ? e.extra.length : 0;
- int eoff = 0;
- boolean foundEXTT = false; // if EXTT already present
- // do nothing.
- while (eoff + 4 < elen) {
- int tag = get16(e.extra, eoff);
- int sz = get16(e.extra, eoff + 2);
- if (tag == EXTID_EXTT) {
- foundEXTT = true;
- }
- eoff += (4 + sz);
+ int elen = getExtraLen(e.extra);
+ if (hasZip64) {
+ elen += (elenZIP64 + 4);// + headid(2) + datasize(2)
}
- if (hasZip64) {
- // + headid(2) + datasize(2)
- elen += (elenZIP64 + 4);
+ // cen info-zip extended timestamp only outputs mtime
+ // but set the flag for a/ctime, if present in loc
+ int flagEXTT = 0;
+ if (e.mtime != null) {
+ elen += 4; // + mtime(4)
+ flagEXTT |= EXTT_FLAG_LMT;
}
- if (!foundEXTT)
- elen += 9; // Info-ZIP's Extended Timestamp
+ if (e.atime != null) {
+ flagEXTT |= EXTT_FLAG_LAT;
+ }
+ if (e.ctime != null) {
+ flagEXTT |= EXTT_FLAT_CT;
+ }
+ if (flagEXTT != 0) {
+ elen += 5; // headid + sz + flag
+ }
writeShort(elen);
byte[] commentBytes;
if (e.comment != null) {
@@ -545,6 +565,8 @@
writeInt(0); // external file attributes (unused)
writeInt(offset); // relative offset of local header
writeBytes(nameBytes, 0, nameBytes.length);
+
+ // take care of EXTID_ZIP64 and EXTID_EXTT
if (hasZip64) {
writeShort(ZIP64_EXTID);// Zip64 extra
writeShort(elenZIP64);
@@ -555,15 +577,18 @@
if (offset == ZIP64_MAGICVAL)
writeLong(xentry.offset);
}
- if (!foundEXTT) {
+ if (flagEXTT != 0) {
writeShort(EXTID_EXTT);
- writeShort(5);
- writeByte(0x1); // flags byte
- writeInt(javaToUnixTime(e.mtime));
+ if (e.mtime != null) {
+ writeShort(5); // flag + mtime
+ writeByte(flagEXTT);
+ writeInt(fileTimeToUnixTime(e.mtime));
+ } else {
+ writeShort(1); // flag only
+ writeByte(flagEXTT);
+ }
}
- if (e.extra != null) {
- writeBytes(e.extra, 0, e.extra.length);
- }
+ writeExtra(e.extra);
if (commentBytes != null) {
writeBytes(commentBytes, 0, Math.min(commentBytes.length, 0xffff));
}
@@ -627,6 +652,47 @@
}
/*
+ * Returns the length of extra data without EXTT and ZIP64.
+ */
+ private int getExtraLen(byte[] extra) {
+ if (extra == null)
+ return 0;
+ int skipped = 0;
+ int len = extra.length;
+ int off = 0;
+ while (off + 4 <= len) {
+ int tag = get16(extra, off);
+ int sz = get16(extra, off + 2);
+ if (tag == EXTID_EXTT || tag == EXTID_ZIP64) {
+ skipped += (sz + 4);
+ }
+ off += (sz + 4);
+ }
+ return len - skipped;
+ }
+
+ /*
+ * Writes extra data without EXTT and ZIP64.
+ *
+ * Extra timestamp and ZIP64 data is handled/output separately
+ * in writeLOC and writeCEN.
+ */
+ private void writeExtra(byte[] extra) throws IOException {
+ if (extra != null) {
+ int len = extra.length;
+ int off = 0;
+ while (off + 4 <= len) {
+ int tag = get16(extra, off);
+ int sz = get16(extra, off + 2);
+ if (tag != EXTID_EXTT && tag != EXTID_ZIP64) {
+ writeBytes(extra, off, sz + 4);
+ }
+ off += (sz + 4);
+ }
+ }
+ }
+
+ /*
* Writes a 8-bit byte to the output stream.
*/
private void writeByte(int v) throws IOException {
--- a/jdk/src/share/classes/java/util/zip/ZipUtils.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipUtils.java Tue Aug 20 17:44:18 2013 -0700
@@ -25,42 +25,45 @@
package java.util.zip;
+import java.nio.file.attribute.FileTime;
import java.util.Date;
import java.util.concurrent.TimeUnit;
+import static java.util.zip.ZipConstants.*;
+import static java.util.zip.ZipConstants64.*;
+
class ZipUtils {
// used to adjust values between Windows and java epoch
private static final long WINDOWS_EPOCH_IN_MICROSECONDS = -11644473600000000L;
/**
- * Converts Windows time (in microseconds, UTC/GMT) time to Java time.
+ * Converts Windows time (in microseconds, UTC/GMT) time to FileTime.
*/
- public static final long winToJavaTime(long wtime) {
- return TimeUnit.MILLISECONDS.convert(
- wtime / 10 + WINDOWS_EPOCH_IN_MICROSECONDS, TimeUnit.MICROSECONDS);
+ public static final FileTime winTimeToFileTime(long wtime) {
+ return FileTime.from(wtime / 10 + WINDOWS_EPOCH_IN_MICROSECONDS,
+ TimeUnit.MICROSECONDS);
}
/**
- * Converts Java time to Windows time.
+ * Converts FileTime to Windows time.
*/
- public static final long javaToWinTime(long time) {
- return (TimeUnit.MICROSECONDS.convert(time, TimeUnit.MILLISECONDS)
- - WINDOWS_EPOCH_IN_MICROSECONDS) * 10;
+ public static final long fileTimeToWinTime(FileTime ftime) {
+ return (ftime.to(TimeUnit.MICROSECONDS) - WINDOWS_EPOCH_IN_MICROSECONDS) * 10;
}
/**
- * Converts "standard Unix time"(in seconds, UTC/GMT) to Java time
+ * Converts "standard Unix time"(in seconds, UTC/GMT) to FileTime
*/
- public static final long unixToJavaTime(long utime) {
- return TimeUnit.MILLISECONDS.convert(utime, TimeUnit.SECONDS);
+ public static final FileTime unixTimeToFileTime(long utime) {
+ return FileTime.from(utime, TimeUnit.SECONDS);
}
/**
- * Converts Java time to "standard Unix time".
+ * Converts FileTime to "standard Unix time".
*/
- public static final long javaToUnixTime(long time) {
- return TimeUnit.SECONDS.convert(time, TimeUnit.MILLISECONDS);
+ public static final long fileTimeToUnixTime(FileTime ftime) {
+ return ftime.to(TimeUnit.SECONDS);
}
/**
@@ -92,7 +95,6 @@
d.getSeconds() >> 1;
}
-
/**
* Fetches unsigned 16-bit value from byte array at specified offset.
* The bytes are assumed to be in Intel (little-endian) byte order.
@@ -116,5 +118,4 @@
public static final long get64(byte b[], int off) {
return get32(b, off) | (get32(b, off+4) << 32);
}
-
}
--- a/jdk/src/share/classes/javax/crypto/spec/PBEParameterSpec.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/javax/crypto/spec/PBEParameterSpec.java Tue Aug 20 17:44:18 2013 -0700
@@ -64,7 +64,8 @@
* @param salt the salt. The contents of <code>salt</code> are copied
* to protect against subsequent modification.
* @param iterationCount the iteration count.
- * @param paramSpec the cipher algorithm parameter specification.
+ * @param paramSpec the cipher algorithm parameter specification, which
+ * may be null.
* @exception NullPointerException if <code>salt</code> is null.
*
* @since 1.8
--- a/jdk/src/share/classes/javax/security/auth/Policy.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/javax/security/auth/Policy.java Tue Aug 20 17:44:18 2013 -0700
@@ -156,9 +156,10 @@
private static Policy policy;
private static ClassLoader contextClassLoader;
+ private final static String AUTH_POLICY =
+ "sun.security.provider.AuthPolicyFile";
- // true if a custom (not com.sun.security.auth.PolicyFile) system-wide
- // policy object is set
+ // true if a custom (not AUTH_POLICY) system-wide policy object is set
private static boolean isCustomPolicy;
static {
@@ -220,7 +221,7 @@
}
});
if (policy_class == null) {
- policy_class = "com.sun.security.auth.PolicyFile";
+ policy_class = AUTH_POLICY;
}
try {
@@ -236,8 +237,7 @@
contextClassLoader).newInstance();
}
});
- isCustomPolicy =
- !finalClass.equals("com.sun.security.auth.PolicyFile");
+ isCustomPolicy = !finalClass.equals(AUTH_POLICY);
} catch (Exception e) {
throw new SecurityException
(sun.security.util.ResourcesMgr.getString
@@ -274,14 +274,14 @@
}
/**
- * Returns true if a custom (not com.sun.security.auth.PolicyFile)
- * system-wide policy object has been set or installed. This method is
- * called by SubjectDomainCombiner to provide backwards compatibility for
+ * Returns true if a custom (not AUTH_POLICY) system-wide policy object
+ * has been set or installed. This method is called by
+ * SubjectDomainCombiner to provide backwards compatibility for
* developers that provide their own javax.security.auth.Policy
* implementations.
*
- * @return true if a custom (not com.sun.security.auth.PolicyFile)
- * system-wide policy object has been set; false otherwise
+ * @return true if a custom (not AUTH_POLICY) system-wide policy object
+ * has been set; false otherwise
*/
static boolean isCustomPolicySet(Debug debug) {
if (policy != null) {
@@ -299,8 +299,7 @@
return Security.getProperty("auth.policy.provider");
}
});
- if (policyClass != null
- && !policyClass.equals("com.sun.security.auth.PolicyFile")) {
+ if (policyClass != null && !policyClass.equals(AUTH_POLICY)) {
if (debug != null) {
debug.println("Providing backwards compatibility for " +
"javax.security.auth.policy implementation: " +
--- a/jdk/src/share/classes/javax/security/auth/login/Configuration.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/javax/security/auth/login/Configuration.java Tue Aug 20 17:44:18 2013 -0700
@@ -75,7 +75,7 @@
* LoginModules configured for that application. Each {@code LoginModule}
* is specified via its fully qualified class name.
* Authentication proceeds down the module list in the exact order specified.
- * If an application does not have specific entry,
+ * If an application does not have a specific entry,
* it defaults to the specific entry for "<i>other</i>".
*
* <p> The <i>Flag</i> value controls the overall behavior as authentication
@@ -248,7 +248,7 @@
}
});
if (config_class == null) {
- config_class = "com.sun.security.auth.login.ConfigFile";
+ config_class = "sun.security.provider.ConfigFile";
}
try {
--- a/jdk/src/share/classes/sun/launcher/LauncherHelper.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/launcher/LauncherHelper.java Tue Aug 20 17:44:18 2013 -0700
@@ -65,13 +65,10 @@
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
-import sun.misc.Version;
-import sun.misc.URLClassPath;
public enum LauncherHelper {
INSTANCE;
private static final String MAIN_CLASS = "Main-Class";
- private static final String PROFILE = "Profile";
private static StringBuilder outBuf = new StringBuilder();
@@ -415,27 +412,6 @@
}
/*
- * If this is not a full JRE then the Profile attribute must be
- * present with the Main-Class attribute so as to indicate the minimum
- * profile required. Note that we need to suppress checking of the Profile
- * attribute after we detect an error. This is because the abort may
- * need to lookup resources and this may involve opening additional JAR
- * files that would result in errors that suppress the main error.
- */
- String profile = mainAttrs.getValue(PROFILE);
- if (profile == null) {
- if (!Version.isFullJre()) {
- URLClassPath.suppressProfileCheckForLauncher();
- abort(null, "java.launcher.jar.error4", jarname);
- }
- } else {
- if (!Version.supportsProfile(profile)) {
- URLClassPath.suppressProfileCheckForLauncher();
- abort(null, "java.launcher.jar.error5", profile, jarname);
- }
- }
-
- /*
* Hand off to FXHelper if it detects a JavaFX application
* This must be done after ensuring a Main-Class entry
* exists to enforce compliance with the jar specification
--- a/jdk/src/share/classes/sun/launcher/resources/launcher.properties Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher.properties Tue Aug 20 17:44:18 2013 -0700
@@ -139,8 +139,6 @@
Error: An unexpected error occurred while trying to open file {0}
java.launcher.jar.error2=manifest not found in {0}
java.launcher.jar.error3=no main manifest attribute, in {0}
-java.launcher.jar.error4=no Profile manifest attribute in {0}
-java.launcher.jar.error5=Profile {0} required by {1} not supported by this runtime
java.launcher.init.error=initialization error
java.launcher.javafx.error1=\
Error: The JavaFX launchApplication method has the wrong signature, it\n\
--- a/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java Tue Aug 20 17:44:18 2013 -0700
@@ -35,7 +35,6 @@
public interface JavaUtilJarAccess {
public boolean jarFileHasClassPathAttribute(JarFile jar) throws IOException;
- public boolean jarFileHasProfileAttribute(JarFile jar) throws IOException;
public CodeSource[] getCodeSources(JarFile jar, URL url);
public CodeSource getCodeSource(JarFile jar, URL url, String name);
public Enumeration<String> entryNames(JarFile jar, CodeSource[] cs);
--- a/jdk/src/share/classes/sun/misc/URLClassPath.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/misc/URLClassPath.java Tue Aug 20 17:44:18 2013 -0700
@@ -35,7 +35,6 @@
import java.util.jar.Manifest;
import java.util.jar.Attributes;
import java.util.jar.Attributes.Name;
-import java.util.jar.UnsupportedProfileException;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
@@ -66,12 +65,6 @@
private static final boolean DEBUG;
private static final boolean DISABLE_JAR_CHECKING;
- /**
- * Used by launcher to indicate that checking of the JAR file "Profile"
- * attribute has been suppressed.
- */
- private static boolean profileCheckSuppressedByLauncher;
-
static {
JAVA_VERSION = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("java.version"));
@@ -593,15 +586,6 @@
}
}
- /**
- * Used by the launcher to suppress further checking of the JAR file Profile
- * attribute (necessary when the launcher is aborting as the abort involves
- * a resource lookup that may involve opening additional JAR files)
- */
- public static void suppressProfileCheckForLauncher() {
- profileCheckSuppressedByLauncher = true;
- }
-
/*
* Inner class used to represent a Loader of resources from a JAR URL.
*/
@@ -828,25 +812,6 @@
return false;
}
- /**
- * If the Profile attribute is present then this method checks that the runtime
- * supports that profile.
- */
- void checkProfileAttribute() throws IOException {
- Manifest man = jar.getManifest();
- if (man != null) {
- Attributes attr = man.getMainAttributes();
- if (attr != null) {
- String value = attr.getValue(Name.PROFILE);
- if (value != null && !Version.supportsProfile(value)) {
- String prefix = Version.profileName().length() > 0 ?
- "This runtime implements " + Version.profileName() + ", " : "";
- throw new UnsupportedProfileException(prefix + csu + " requires " + value);
- }
- }
- }
- }
-
/*
* Returns the URL for a resource with the specified name
*/
@@ -1017,12 +982,6 @@
ensureOpen();
parseExtensionsDependencies();
- // check Profile attribute if present
- if (!profileCheckSuppressedByLauncher &&
- SharedSecrets.javaUtilJarAccess().jarFileHasProfileAttribute(jar)) {
- checkProfileAttribute();
- }
-
if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) { // Only get manifest when necessary
Manifest man = jar.getManifest();
if (man != null) {
--- a/jdk/src/share/classes/sun/misc/Version.java.template Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/misc/Version.java.template Tue Aug 20 17:44:18 2013 -0700
@@ -339,68 +339,6 @@
// Return false if not available which implies an old VM (Tiger or before).
private static native boolean getJvmVersionInfo();
private static native void getJdkVersionInfo();
-
- // Possible runtime profiles, ordered from small to large
- private final static String[] PROFILES = { "compact1", "compact2", "compact3" };
-
- /**
- * Returns the name of the profile that this runtime implements. The empty
- * string is returned for the full Java Runtime.
- */
- public static String profileName() {
- return java_profile_name;
- }
-
- /**
- * Indicates if this runtime implements the full Java Runtime.
- */
- public static boolean isFullJre() {
- return java_profile_name.length() == 0;
- }
-
- // cached index of this profile's name in PROFILES (1-based)
- private static int thisRuntimeIndex;
-
- /**
- * Indicates if this runtime supports the given profile. Profile names are
- * case sensitive.
- *
- * @return {@code true} if the given profile is supported
- */
- public static boolean supportsProfile(String requiredProfile) {
- int x = thisRuntimeIndex - 1;
- if (x < 0) {
- String profile = profileName();
- if (profile.length() > 0) {
- x = 0;
- while (x < PROFILES.length) {
- if (PROFILES[x].equals(profile))
- break;
- x++;
- }
- if (x >= PROFILES.length)
- throw new InternalError(profile + " not known to sun.misc.Version");
-
- // okay if another thread has already set it
- thisRuntimeIndex = x + 1;
- }
- // else we are a full JRE
- }
-
- int y = 0;
- while (y < PROFILES.length) {
- if (PROFILES[y].equals(requiredProfile))
- break;
- y++;
- }
- if (y >= PROFILES.length) {
- // profile not found so caller has requested something that is not defined
- return false;
- }
-
- return x < 0 || x >= y;
- }
-
}
// Help Emacs a little because this file doesn't end in .java.
--- a/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Tue Aug 20 17:44:18 2013 -0700
@@ -1031,6 +1031,24 @@
"ebcdic-s-871+euro"
});
+ charset("IBM290", "IBM290",
+ new String[] {
+ "cp290",
+ "ibm290",
+ "ibm-290",
+ "csIBM290",
+ "EBCDIC-JP-kana",
+ "290"
+ });
+
+ charset("x-IBM300", "IBM300",
+ new String[] {
+ "cp300",
+ "ibm300",
+ "ibm-300",
+ "300"
+ });
+
// Macintosh MacOS/Apple char encodingd
--- a/jdk/src/share/classes/sun/security/krb5/Credentials.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/Credentials.java Tue Aug 20 17:44:18 2013 -0700
@@ -62,7 +62,9 @@
private static CredentialsCache cache;
static boolean alreadyLoaded = false;
private static boolean alreadyTried = false;
- private static native Credentials acquireDefaultNativeCreds();
+
+ // Read native ticket with session key type in the given list
+ private static native Credentials acquireDefaultNativeCreds(int[] eTypes);
public Credentials(Ticket new_ticket,
PrincipalName new_client,
@@ -373,6 +375,8 @@
// It assumes that the GSS call has
// the privilege to access the default cache file.
+ // This method is only called on Windows and Mac OS X, the native
+ // acquireDefaultNativeCreds is also available on these platforms.
public static synchronized Credentials acquireDefaultCreds() {
Credentials result = null;
@@ -416,10 +420,15 @@
}
if (alreadyLoaded) {
// There is some native code
- if (DEBUG)
- System.out.println(">> Acquire default native Credentials");
- result = acquireDefaultNativeCreds();
- // only TGT with DES key will be returned by native method
+ if (DEBUG) {
+ System.out.println(">> Acquire default native Credentials");
+ }
+ try {
+ result = acquireDefaultNativeCreds(
+ EType.getDefaults("default_tkt_enctypes"));
+ } catch (KrbException ke) {
+ // when there is no default_tkt_enctypes.
+ }
}
}
return result;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/security/provider/AuthPolicyFile.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,1195 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.provider;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.net.URL;
+import java.util.*;
+
+import java.security.AccessController;
+import java.security.CodeSource;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.Permission;
+import java.security.Permissions;
+import java.security.PermissionCollection;
+import java.security.Principal;
+import java.security.PrivilegedAction;
+import java.security.UnresolvedPermission;
+import java.security.Security;
+import java.security.cert.Certificate;
+import java.security.cert.X509Certificate;
+
+import javax.security.auth.Subject;
+import javax.security.auth.PrivateCredentialPermission;
+
+import sun.security.provider.PolicyParser.GrantEntry;
+import sun.security.provider.PolicyParser.PermissionEntry;
+import sun.security.provider.PolicyParser.PrincipalEntry;
+import sun.security.util.Debug;
+import sun.security.util.PolicyUtil;
+import sun.security.util.PropertyExpander;
+
+/**
+ * See {@code com.sun.security.auth.PolicyFile} for the class description.
+ * This class is necessary in order to support a default
+ * {@code javax.security.auth.Policy} implementation on the compact1 and
+ * compact2 profiles.
+ *
+ * @deprecated As of JDK 1.4, replaced by
+ * {@code sun.security.provider.PolicyFile}.
+ * This class is entirely deprecated.
+ */
+@Deprecated
+public class AuthPolicyFile extends javax.security.auth.Policy {
+
+ static final ResourceBundle rb =
+ AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
+ @Override public ResourceBundle run() {
+ return (ResourceBundle.getBundle
+ ("sun.security.util.AuthResources"));
+ }
+ });
+
+ private static final Debug debug = Debug.getInstance("policy",
+ "\t[Auth Policy]");
+
+ private static final String AUTH_POLICY = "java.security.auth.policy";
+ private static final String SECURITY_MANAGER = "java.security.manager";
+ private static final String AUTH_POLICY_URL = "auth.policy.url.";
+
+ private Vector<PolicyEntry> policyEntries;
+ private Hashtable<Object, Object> aliasMapping;
+
+ private boolean initialized = false;
+
+ private boolean expandProperties = true;
+ private boolean ignoreIdentityScope = true;
+
+ // for use with the reflection API
+ private static final Class[] PARAMS = { String.class, String.class};
+
+ /**
+ * Initializes the Policy object and reads the default policy
+ * configuration file(s) into the Policy object.
+ */
+ public AuthPolicyFile() {
+ // initialize Policy if either the AUTH_POLICY or
+ // SECURITY_MANAGER properties are set
+ String prop = System.getProperty(AUTH_POLICY);
+
+ if (prop == null) {
+ prop = System.getProperty(SECURITY_MANAGER);
+ }
+ if (prop != null) {
+ init();
+ }
+ }
+
+ private synchronized void init() {
+ if (initialized) {
+ return;
+ }
+
+ policyEntries = new Vector<PolicyEntry>();
+ aliasMapping = new Hashtable<Object, Object>(11);
+
+ initPolicyFile();
+ initialized = true;
+ }
+
+ @Override
+ public synchronized void refresh() {
+
+ java.lang.SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ sm.checkPermission(new javax.security.auth.AuthPermission
+ ("refreshPolicy"));
+ }
+
+ // XXX
+ //
+ // 1) if code instantiates PolicyFile directly, then it will need
+ // all the permissions required for the PolicyFile initialization
+ // 2) if code calls Policy.getPolicy, then it simply needs
+ // AuthPermission(getPolicy), and the javax.security.auth.Policy
+ // implementation instantiates PolicyFile in a doPrivileged block
+ // 3) if after instantiating a Policy (either via #1 or #2),
+ // code calls refresh, it simply needs
+ // AuthPermission(refreshPolicy). then PolicyFile wraps
+ // the refresh in a doPrivileged block.
+ initialized = false;
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override public Void run() {
+ init();
+ return null;
+ }
+ });
+ }
+
+ private KeyStore initKeyStore(URL policyUrl, String keyStoreName,
+ String keyStoreType) {
+ if (keyStoreName != null) {
+ try {
+ /*
+ * location of keystore is specified as absolute URL in policy
+ * file, or is relative to URL of policy file
+ */
+ URL keyStoreUrl = null;
+ try {
+ keyStoreUrl = new URL(keyStoreName);
+ // absolute URL
+ } catch (java.net.MalformedURLException e) {
+ // relative URL
+ keyStoreUrl = new URL(policyUrl, keyStoreName);
+ }
+
+ if (debug != null) {
+ debug.println("reading keystore"+keyStoreUrl);
+ }
+
+ InputStream inStream = new BufferedInputStream(
+ PolicyUtil.getInputStream(keyStoreUrl));
+
+ KeyStore ks;
+ if (keyStoreType != null)
+ ks = KeyStore.getInstance(keyStoreType);
+ else
+ ks = KeyStore.getInstance(KeyStore.getDefaultType());
+ ks.load(inStream, null);
+ inStream.close();
+ return ks;
+ } catch (Exception e) {
+ // ignore, treat it like we have no keystore
+ if (debug != null) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ }
+ return null;
+ }
+
+ private void initPolicyFile() {
+
+ String prop = Security.getProperty("policy.expandProperties");
+ if (prop != null) {
+ expandProperties = prop.equalsIgnoreCase("true");
+ }
+
+ String iscp = Security.getProperty("policy.ignoreIdentityScope");
+ if (iscp != null) {
+ ignoreIdentityScope = iscp.equalsIgnoreCase("true");
+ }
+
+ String allowSys = Security.getProperty("policy.allowSystemProperty");
+ if (allowSys != null && allowSys.equalsIgnoreCase("true")) {
+ String extra_policy = System.getProperty(AUTH_POLICY);
+ if (extra_policy != null) {
+ boolean overrideAll = false;
+ if (extra_policy.startsWith("=")) {
+ overrideAll = true;
+ extra_policy = extra_policy.substring(1);
+ }
+ try {
+ extra_policy = PropertyExpander.expand(extra_policy);
+ URL policyURL;
+ File policyFile = new File(extra_policy);
+ if (policyFile.exists()) {
+ policyURL =
+ new URL("file:" + policyFile.getCanonicalPath());
+ } else {
+ policyURL = new URL(extra_policy);
+ }
+ if (debug != null) {
+ debug.println("reading " + policyURL);
+ }
+ init(policyURL);
+ } catch (Exception e) {
+ // ignore.
+ if (debug != null) {
+ debug.println("caught exception: " + e);
+ }
+
+ }
+ if (overrideAll) {
+ if (debug != null) {
+ debug.println("overriding other policies!");
+ }
+ return;
+ }
+ }
+ }
+
+ int n = 1;
+ boolean loaded_one = false;
+ String policy_url;
+
+ while ((policy_url = Security.getProperty(AUTH_POLICY_URL+n)) != null) {
+ try {
+ policy_url = PropertyExpander.expand(policy_url).replace
+ (File.separatorChar, '/');
+ if (debug != null) {
+ debug.println("reading " + policy_url);
+ }
+ init(new URL(policy_url));
+ loaded_one = true;
+ } catch (Exception e) {
+ if (debug != null) {
+ debug.println("error reading policy " + e);
+ e.printStackTrace();
+ }
+ // ignore that policy
+ }
+ n++;
+ }
+
+ if (loaded_one == false) {
+ // do not load a static policy
+ }
+ }
+
+ /**
+ * Checks public key. If it is marked as trusted in
+ * the identity database, add it to the policy
+ * with the AllPermission.
+ */
+ private boolean checkForTrustedIdentity(final Certificate cert) {
+ return false;
+ }
+
+ /**
+ * Reads a policy configuration into the Policy object using a
+ * Reader object.
+ *
+ * @param policyFile the policy Reader object.
+ */
+ private void init(URL policy) {
+ PolicyParser pp = new PolicyParser(expandProperties);
+ try (InputStreamReader isr
+ = new InputStreamReader(PolicyUtil.getInputStream(policy))) {
+ pp.read(isr);
+ KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(),
+ pp.getKeyStoreType());
+ Enumeration<GrantEntry> enum_ = pp.grantElements();
+ while (enum_.hasMoreElements()) {
+ GrantEntry ge = enum_.nextElement();
+ addGrantEntry(ge, keyStore);
+ }
+ } catch (PolicyParser.ParsingException pe) {
+ System.err.println(AUTH_POLICY +
+ rb.getString(".error.parsing.") + policy);
+ System.err.println(AUTH_POLICY + rb.getString("COLON") +
+ pe.getMessage());
+ if (debug != null) {
+ pe.printStackTrace();
+ }
+ } catch (Exception e) {
+ if (debug != null) {
+ debug.println("error parsing " + policy);
+ debug.println(e.toString());
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Given a PermissionEntry, create a codeSource.
+ *
+ * @return null if signedBy alias is not recognized
+ */
+ CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore)
+ throws java.net.MalformedURLException
+ {
+ Certificate[] certs = null;
+ if (ge.signedBy != null) {
+ certs = getCertificates(keyStore, ge.signedBy);
+ if (certs == null) {
+ // we don't have a key for this alias,
+ // just return
+ if (debug != null) {
+ debug.println(" no certs for alias " +
+ ge.signedBy + ", ignoring.");
+ }
+ return null;
+ }
+ }
+
+ URL location;
+ if (ge.codeBase != null) {
+ location = new URL(ge.codeBase);
+ } else {
+ location = null;
+ }
+
+ if (ge.principals == null || ge.principals.size() == 0) {
+ return (canonicalizeCodebase
+ (new CodeSource(location, certs),
+ false));
+ } else {
+ return (canonicalizeCodebase
+ (new SubjectCodeSource(null, ge.principals, location, certs),
+ false));
+ }
+ }
+
+ /**
+ * Add one policy entry to the vector.
+ */
+ private void addGrantEntry(GrantEntry ge, KeyStore keyStore) {
+
+ if (debug != null) {
+ debug.println("Adding policy entry: ");
+ debug.println(" signedBy " + ge.signedBy);
+ debug.println(" codeBase " + ge.codeBase);
+ if (ge.principals != null) {
+ for (PrincipalEntry pppe : ge.principals) {
+ debug.println(" " + pppe.getPrincipalClass() +
+ " " + pppe.getPrincipalName());
+ }
+ }
+ debug.println();
+ }
+
+ try {
+ CodeSource codesource = getCodeSource(ge, keyStore);
+ // skip if signedBy alias was unknown...
+ if (codesource == null) return;
+
+ PolicyEntry entry = new PolicyEntry(codesource);
+ Enumeration<PermissionEntry> enum_ = ge.permissionElements();
+ while (enum_.hasMoreElements()) {
+ PermissionEntry pe = enum_.nextElement();
+ try {
+ // XXX special case PrivateCredentialPermission-SELF
+ Permission perm;
+ if (pe.permission.equals
+ ("javax.security.auth.PrivateCredentialPermission") &&
+ pe.name.endsWith(" self")) {
+ perm = getInstance(pe.permission,
+ pe.name + " \"self\"",
+ pe.action);
+ } else {
+ perm = getInstance(pe.permission,
+ pe.name,
+ pe.action);
+ }
+ entry.add(perm);
+ if (debug != null) {
+ debug.println(" "+perm);
+ }
+ } catch (ClassNotFoundException cnfe) {
+ Certificate certs[];
+ if (pe.signedBy != null) {
+ certs = getCertificates(keyStore, pe.signedBy);
+ } else {
+ certs = null;
+ }
+
+ // only add if we had no signer or we had a
+ // a signer and found the keys for it.
+ if (certs != null || pe.signedBy == null) {
+ Permission perm = new UnresolvedPermission(
+ pe.permission,
+ pe.name,
+ pe.action,
+ certs);
+ entry.add(perm);
+ if (debug != null) {
+ debug.println(" "+perm);
+ }
+ }
+ } catch (java.lang.reflect.InvocationTargetException ite) {
+ System.err.println
+ (AUTH_POLICY +
+ rb.getString(".error.adding.Permission.") +
+ pe.permission +
+ rb.getString("SPACE") +
+ ite.getTargetException());
+ } catch (Exception e) {
+ System.err.println
+ (AUTH_POLICY +
+ rb.getString(".error.adding.Permission.") +
+ pe.permission +
+ rb.getString("SPACE") +
+ e);
+ }
+ }
+ policyEntries.addElement(entry);
+ } catch (Exception e) {
+ System.err.println
+ (AUTH_POLICY +
+ rb.getString(".error.adding.Entry.") +
+ ge +
+ rb.getString("SPACE") +
+ e);
+ }
+
+ if (debug != null) {
+ debug.println();
+ }
+ }
+
+ /**
+ * Returns a new Permission object of the given Type. The Permission is
+ * created by getting the
+ * Class object using the <code>Class.forName</code> method, and using
+ * the reflection API to invoke the (String name, String actions)
+ * constructor on the
+ * object.
+ *
+ * @param type the type of Permission being created.
+ * @param name the name of the Permission being created.
+ * @param actions the actions of the Permission being created.
+ *
+ * @exception ClassNotFoundException if the particular Permission
+ * class could not be found.
+ *
+ * @exception IllegalAccessException if the class or initializer is
+ * not accessible.
+ *
+ * @exception InstantiationException if getInstance tries to
+ * instantiate an abstract class or an interface, or if the
+ * instantiation fails for some other reason.
+ *
+ * @exception NoSuchMethodException if the (String, String) constructor
+ * is not found.
+ *
+ * @exception InvocationTargetException if the underlying Permission
+ * constructor throws an exception.
+ *
+ */
+ private static final Permission getInstance(String type,
+ String name,
+ String actions)
+ throws ClassNotFoundException,
+ InstantiationException,
+ IllegalAccessException,
+ NoSuchMethodException,
+ InvocationTargetException
+ {
+ //XXX we might want to keep a hash of created factories...
+ Class<?> pc = Class.forName(type);
+ Constructor<?> c = pc.getConstructor(PARAMS);
+ return (Permission) c.newInstance(new Object[] { name, actions });
+ }
+
+ /**
+ * Fetch all certs associated with this alias.
+ */
+ Certificate[] getCertificates(KeyStore keyStore, String aliases) {
+
+ Vector<Certificate> vcerts = null;
+
+ StringTokenizer st = new StringTokenizer(aliases, ",");
+ int n = 0;
+
+ while (st.hasMoreTokens()) {
+ String alias = st.nextToken().trim();
+ n++;
+ Certificate cert = null;
+ // See if this alias's cert has already been cached
+ cert = (Certificate) aliasMapping.get(alias);
+ if (cert == null && keyStore != null) {
+
+ try {
+ cert = keyStore.getCertificate(alias);
+ } catch (KeyStoreException kse) {
+ // never happens, because keystore has already been loaded
+ // when we call this
+ }
+ if (cert != null) {
+ aliasMapping.put(alias, cert);
+ aliasMapping.put(cert, alias);
+ }
+ }
+
+ if (cert != null) {
+ if (vcerts == null) {
+ vcerts = new Vector<Certificate>();
+ }
+ vcerts.addElement(cert);
+ }
+ }
+
+ // make sure n == vcerts.size, since we are doing a logical *and*
+ if (vcerts != null && n == vcerts.size()) {
+ Certificate[] certs = new Certificate[vcerts.size()];
+ vcerts.copyInto(certs);
+ return certs;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Enumerate all the entries in the global policy object.
+ * This method is used by policy admin tools. The tools
+ * should use the Enumeration methods on the returned object
+ * to fetch the elements sequentially.
+ */
+ private final synchronized Enumeration<PolicyEntry> elements() {
+ return policyEntries.elements();
+ }
+
+ @Override
+ public PermissionCollection getPermissions(final Subject subject,
+ final CodeSource codesource) {
+
+ // 1) if code instantiates PolicyFile directly, then it will need
+ // all the permissions required for the PolicyFile initialization
+ // 2) if code calls Policy.getPolicy, then it simply needs
+ // AuthPermission(getPolicy), and the javax.security.auth.Policy
+ // implementation instantiates PolicyFile in a doPrivileged block
+ // 3) if after instantiating a Policy (either via #1 or #2),
+ // code calls getPermissions, PolicyFile wraps the call
+ // in a doPrivileged block.
+ return AccessController.doPrivileged
+ (new PrivilegedAction<PermissionCollection>() {
+ @Override public PermissionCollection run() {
+ SubjectCodeSource scs = new SubjectCodeSource(
+ subject, null,
+ codesource == null ? null : codesource.getLocation(),
+ codesource == null ? null : codesource.getCertificates());
+ if (initialized) {
+ return getPermissions(new Permissions(), scs);
+ } else {
+ return new PolicyPermissions(AuthPolicyFile.this, scs);
+ }
+ }
+ });
+ }
+
+ /**
+ * Examines the global policy for the specified CodeSource, and
+ * creates a PermissionCollection object with
+ * the set of permissions for that principal's protection domain.
+ *
+ * @param CodeSource the codesource associated with the caller.
+ * This encapsulates the original location of the code (where the code
+ * came from) and the public key(s) of its signer.
+ *
+ * @return the set of permissions according to the policy.
+ */
+ PermissionCollection getPermissions(CodeSource codesource) {
+
+ if (initialized) {
+ return getPermissions(new Permissions(), codesource);
+ } else {
+ return new PolicyPermissions(this, codesource);
+ }
+ }
+
+ /**
+ * Examines the global policy for the specified CodeSource, and
+ * creates a PermissionCollection object with
+ * the set of permissions for that principal's protection domain.
+ *
+ * @param permissions the permissions to populate
+ * @param codesource the codesource associated with the caller.
+ * This encapsulates the original location of the code (where the code
+ * came from) and the public key(s) of its signer.
+ *
+ * @return the set of permissions according to the policy.
+ */
+ Permissions getPermissions(final Permissions perms,
+ final CodeSource cs)
+ {
+ if (!initialized) {
+ init();
+ }
+
+ final CodeSource codesource[] = {null};
+
+ codesource[0] = canonicalizeCodebase(cs, true);
+
+ if (debug != null) {
+ debug.println("evaluate(" + codesource[0] + ")\n");
+ }
+
+ // needs to be in a begin/endPrivileged block because
+ // codesource.implies calls URL.equals which does an
+ // InetAddress lookup
+
+ for (int i = 0; i < policyEntries.size(); i++) {
+
+ PolicyEntry entry = policyEntries.elementAt(i);
+
+ if (debug != null) {
+ debug.println("PolicyFile CodeSource implies: " +
+ entry.codesource.toString() + "\n\n" +
+ "\t" + codesource[0].toString() + "\n\n");
+ }
+
+ if (entry.codesource.implies(codesource[0])) {
+ for (int j = 0; j < entry.permissions.size(); j++) {
+ Permission p = entry.permissions.elementAt(j);
+ if (debug != null) {
+ debug.println(" granting " + p);
+ }
+ if (!addSelfPermissions(p, entry.codesource,
+ codesource[0], perms)) {
+ // we could check for duplicates
+ // before adding new permissions,
+ // but the SubjectDomainCombiner
+ // already checks for duplicates later
+ perms.add(p);
+ }
+ }
+ }
+ }
+
+ // now see if any of the keys are trusted ids.
+
+ if (!ignoreIdentityScope) {
+ Certificate certs[] = codesource[0].getCertificates();
+ if (certs != null) {
+ for (int k=0; k < certs.length; k++) {
+ if (aliasMapping.get(certs[k]) == null &&
+ checkForTrustedIdentity(certs[k])) {
+ // checkForTrustedIdentity added it
+ // to the policy for us. next time
+ // around we'll find it. This time
+ // around we need to add it.
+ perms.add(new java.security.AllPermission());
+ }
+ }
+ }
+ }
+ return perms;
+ }
+
+ /**
+ * Returns true if 'Self' permissions were added to the provided
+ * 'perms', and false otherwise.
+ *
+ * <p>
+ *
+ * @param p check to see if this Permission is a "SELF"
+ * PrivateCredentialPermission. <p>
+ *
+ * @param entryCs the codesource for the Policy entry.
+ *
+ * @param accCs the codesource for from the current AccessControlContext.
+ *
+ * @param perms the PermissionCollection where the individual
+ * PrivateCredentialPermissions will be added.
+ */
+ private boolean addSelfPermissions(final Permission p,
+ CodeSource entryCs,
+ CodeSource accCs,
+ Permissions perms) {
+
+ if (!(p instanceof PrivateCredentialPermission)) {
+ return false;
+ }
+
+ if (!(entryCs instanceof SubjectCodeSource)) {
+ return false;
+ }
+
+ PrivateCredentialPermission pcp = (PrivateCredentialPermission)p;
+ SubjectCodeSource scs = (SubjectCodeSource)entryCs;
+
+ // see if it is a SELF permission
+ String[][] pPrincipals = pcp.getPrincipals();
+ if (pPrincipals.length <= 0 ||
+ !pPrincipals[0][0].equalsIgnoreCase("self") ||
+ !pPrincipals[0][1].equalsIgnoreCase("self")) {
+
+ // regular PrivateCredentialPermission
+ return false;
+ } else {
+
+ // granted a SELF permission - create a
+ // PrivateCredentialPermission for each
+ // of the Policy entry's CodeSource Principals
+
+ if (scs.getPrincipals() == null) {
+ // XXX SubjectCodeSource has no Subject???
+ return true;
+ }
+
+ for (PrincipalEntry principal : scs.getPrincipals()) {
+
+ // if the Policy entry's Principal does not contain a
+ // WILDCARD for the Principal name, then a
+ // new PrivateCredentialPermission is created
+ // for the Principal listed in the Policy entry.
+ // if the Policy entry's Principal contains a WILDCARD
+ // for the Principal name, then a new
+ // PrivateCredentialPermission is created
+ // for each Principal associated with the Subject
+ // in the current ACC.
+
+ String[][] principalInfo = getPrincipalInfo(principal, accCs);
+
+ for (int i = 0; i < principalInfo.length; i++) {
+
+ // here's the new PrivateCredentialPermission
+
+ PrivateCredentialPermission newPcp =
+ new PrivateCredentialPermission
+ (pcp.getCredentialClass() +
+ " " +
+ principalInfo[i][0] +
+ " " +
+ "\"" + principalInfo[i][1] + "\"",
+ "read");
+
+ if (debug != null) {
+ debug.println("adding SELF permission: " +
+ newPcp.toString());
+ }
+
+ perms.add(newPcp);
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * return the principal class/name pair in the 2D array.
+ * array[x][y]: x corresponds to the array length.
+ * if (y == 0), it's the principal class.
+ * if (y == 1), it's the principal name.
+ */
+ private String[][] getPrincipalInfo(PrincipalEntry principal,
+ final CodeSource accCs) {
+
+ // there are 3 possibilities:
+ // 1) the entry's Principal class and name are not wildcarded
+ // 2) the entry's Principal name is wildcarded only
+ // 3) the entry's Principal class and name are wildcarded
+
+ if (!principal.getPrincipalClass().equals
+ (PrincipalEntry.WILDCARD_CLASS) &&
+ !principal.getPrincipalName().equals
+ (PrincipalEntry.WILDCARD_NAME)) {
+
+ // build a PrivateCredentialPermission for the principal
+ // from the Policy entry
+ String[][] info = new String[1][2];
+ info[0][0] = principal.getPrincipalClass();
+ info[0][1] = principal.getPrincipalName();
+ return info;
+
+ } else if (!principal.getPrincipalClass().equals
+ (PrincipalEntry.WILDCARD_CLASS) &&
+ principal.getPrincipalName().equals
+ (PrincipalEntry.WILDCARD_NAME)) {
+
+ // build a PrivateCredentialPermission for all
+ // the Subject's principals that are instances of principalClass
+
+ // the accCs is guaranteed to be a SubjectCodeSource
+ // because the earlier CodeSource.implies succeeded
+ SubjectCodeSource scs = (SubjectCodeSource)accCs;
+
+ Set<? extends Principal> principalSet = null;
+ try {
+ // principal.principalClass should extend Principal
+ // If it doesn't, we should stop here with a ClassCastException.
+ @SuppressWarnings("unchecked")
+ Class<? extends Principal> pClass = (Class<? extends Principal>)
+ Class.forName(principal.getPrincipalClass(), false,
+ ClassLoader.getSystemClassLoader());
+ principalSet = scs.getSubject().getPrincipals(pClass);
+ } catch (Exception e) {
+ if (debug != null) {
+ debug.println("problem finding Principal Class " +
+ "when expanding SELF permission: " +
+ e.toString());
+ }
+ }
+
+ if (principalSet == null) {
+ // error
+ return new String[0][0];
+ }
+
+ String[][] info = new String[principalSet.size()][2];
+
+ int i = 0;
+ for (Principal p : principalSet) {
+ info[i][0] = p.getClass().getName();
+ info[i][1] = p.getName();
+ i++;
+ }
+ return info;
+
+ } else {
+
+ // build a PrivateCredentialPermission for every
+ // one of the current Subject's principals
+
+ // the accCs is guaranteed to be a SubjectCodeSource
+ // because the earlier CodeSource.implies succeeded
+ SubjectCodeSource scs = (SubjectCodeSource)accCs;
+ Set<Principal> principalSet = scs.getSubject().getPrincipals();
+
+ String[][] info = new String[principalSet.size()][2];
+
+ int i = 0;
+ for (Principal p : principalSet) {
+ info[i][0] = p.getClass().getName();
+ info[i][1] = p.getName();
+ i++;
+ }
+ return info;
+ }
+ }
+
+ /*
+ * Returns the signer certificates from the list of certificates associated
+ * with the given code source.
+ *
+ * The signer certificates are those certificates that were used to verify
+ * signed code originating from the codesource location.
+ *
+ * This method assumes that in the given code source, each signer
+ * certificate is followed by its supporting certificate chain
+ * (which may be empty), and that the signer certificate and its
+ * supporting certificate chain are ordered bottom-to-top (i.e., with the
+ * signer certificate first and the (root) certificate authority last).
+ */
+ Certificate[] getSignerCertificates(CodeSource cs) {
+ Certificate[] certs = null;
+ if ((certs = cs.getCertificates()) == null) {
+ return null;
+ }
+ for (int i = 0; i < certs.length; i++) {
+ if (!(certs[i] instanceof X509Certificate))
+ return cs.getCertificates();
+ }
+
+ // Do we have to do anything?
+ int i = 0;
+ int count = 0;
+ while (i < certs.length) {
+ count++;
+ while (((i+1) < certs.length)
+ && ((X509Certificate)certs[i]).getIssuerDN().equals(
+ ((X509Certificate)certs[i+1]).getSubjectDN())) {
+ i++;
+ }
+ i++;
+ }
+ if (count == certs.length) {
+ // Done
+ return certs;
+ }
+
+ ArrayList<Certificate> userCertList = new ArrayList<>();
+ i = 0;
+ while (i < certs.length) {
+ userCertList.add(certs[i]);
+ while (((i+1) < certs.length)
+ && ((X509Certificate)certs[i]).getIssuerDN().equals(
+ ((X509Certificate)certs[i+1]).getSubjectDN())) {
+ i++;
+ }
+ i++;
+ }
+ Certificate[] userCerts = new Certificate[userCertList.size()];
+ userCertList.toArray(userCerts);
+ return userCerts;
+ }
+
+ private CodeSource canonicalizeCodebase(CodeSource cs,
+ boolean extractSignerCerts) {
+ CodeSource canonCs = cs;
+ if (cs.getLocation() != null &&
+ cs.getLocation().getProtocol().equalsIgnoreCase("file")) {
+ try {
+ String path = cs.getLocation().getFile().replace
+ ('/',
+ File.separatorChar);
+ URL csUrl = null;
+ if (path.endsWith("*")) {
+ // remove trailing '*' because it causes canonicalization
+ // to fail on win32
+ path = path.substring(0, path.length()-1);
+ boolean appendFileSep = false;
+ if (path.endsWith(File.separator)) {
+ appendFileSep = true;
+ }
+ if (path.equals("")) {
+ path = System.getProperty("user.dir");
+ }
+ File f = new File(path);
+ path = f.getCanonicalPath();
+ StringBuffer sb = new StringBuffer(path);
+ // reappend '*' to canonicalized filename (note that
+ // canonicalization may have removed trailing file
+ // separator, so we have to check for that, too)
+ if (!path.endsWith(File.separator) &&
+ (appendFileSep || f.isDirectory())) {
+ sb.append(File.separatorChar);
+ }
+ sb.append('*');
+ path = sb.toString();
+ } else {
+ path = new File(path).getCanonicalPath();
+ }
+ csUrl = new File(path).toURL();
+
+ if (cs instanceof SubjectCodeSource) {
+ SubjectCodeSource scs = (SubjectCodeSource)cs;
+ if (extractSignerCerts) {
+ canonCs = new SubjectCodeSource(scs.getSubject(),
+ scs.getPrincipals(),
+ csUrl,
+ getSignerCertificates(scs));
+ } else {
+ canonCs = new SubjectCodeSource(scs.getSubject(),
+ scs.getPrincipals(),
+ csUrl,
+ scs.getCertificates());
+ }
+ } else {
+ if (extractSignerCerts) {
+ canonCs = new CodeSource(csUrl,
+ getSignerCertificates(cs));
+ } else {
+ canonCs = new CodeSource(csUrl,
+ cs.getCertificates());
+ }
+ }
+ } catch (IOException ioe) {
+ // leave codesource as it is, unless we have to extract its
+ // signer certificates
+ if (extractSignerCerts) {
+ if (!(cs instanceof SubjectCodeSource)) {
+ canonCs = new CodeSource(cs.getLocation(),
+ getSignerCertificates(cs));
+ } else {
+ SubjectCodeSource scs = (SubjectCodeSource)cs;
+ canonCs = new SubjectCodeSource(scs.getSubject(),
+ scs.getPrincipals(),
+ scs.getLocation(),
+ getSignerCertificates(scs));
+ }
+ }
+ }
+ } else {
+ if (extractSignerCerts) {
+ if (!(cs instanceof SubjectCodeSource)) {
+ canonCs = new CodeSource(cs.getLocation(),
+ getSignerCertificates(cs));
+ } else {
+ SubjectCodeSource scs = (SubjectCodeSource)cs;
+ canonCs = new SubjectCodeSource(scs.getSubject(),
+ scs.getPrincipals(),
+ scs.getLocation(),
+ getSignerCertificates(scs));
+ }
+ }
+ }
+ return canonCs;
+ }
+
+ /**
+ * Each entry in the policy configuration file is represented by a
+ * PolicyEntry object. <p>
+ *
+ * A PolicyEntry is a (CodeSource,Permission) pair. The
+ * CodeSource contains the (URL, PublicKey) that together identify
+ * where the Java bytecodes come from and who (if anyone) signed
+ * them. The URL could refer to localhost. The URL could also be
+ * null, meaning that this policy entry is given to all comers, as
+ * long as they match the signer field. The signer could be null,
+ * meaning the code is not signed. <p>
+ *
+ * The Permission contains the (Type, Name, Action) triplet. <p>
+ *
+ * For now, the Policy object retrieves the public key from the
+ * X.509 certificate on disk that corresponds to the signedBy
+ * alias specified in the Policy config file. For reasons of
+ * efficiency, the Policy object keeps a hashtable of certs already
+ * read in. This could be replaced by a secure internal key
+ * store.
+ *
+ * <p>
+ * For example, the entry
+ * <pre>
+ * permission java.io.File "/tmp", "read,write",
+ * signedBy "Duke";
+ * </pre>
+ * is represented internally
+ * <pre>
+ *
+ * FilePermission f = new FilePermission("/tmp", "read,write");
+ * PublicKey p = publickeys.get("Duke");
+ * URL u = InetAddress.getLocalHost();
+ * CodeBase c = new CodeBase( p, u );
+ * pe = new PolicyEntry(f, c);
+ * </pre>
+ *
+ * @author Marianne Mueller
+ * @author Roland Schemers
+ * @see java.security.CodeSource
+ * @see java.security.Policy
+ * @see java.security.Permissions
+ * @see java.security.ProtectionDomain
+ */
+ private static class PolicyEntry {
+
+ CodeSource codesource;
+ Vector<Permission> permissions;
+
+ /**
+ * Given a Permission and a CodeSource, create a policy entry.
+ *
+ * XXX Decide if/how to add validity fields and "purpose" fields to
+ * XXX policy entries
+ *
+ * @param cs the CodeSource, which encapsulates the URL and the public
+ * key attributes from the policy config file. Validity checks
+ * are performed on the public key before PolicyEntry is called.
+ *
+ */
+ PolicyEntry(CodeSource cs) {
+ this.codesource = cs;
+ this.permissions = new Vector<Permission>();
+ }
+
+ /**
+ * add a Permission object to this entry.
+ */
+ void add(Permission p) {
+ permissions.addElement(p);
+ }
+
+ /**
+ * Return the CodeSource for this policy entry
+ */
+ CodeSource getCodeSource() {
+ return this.codesource;
+ }
+
+ @Override
+ public String toString(){
+ StringBuffer sb = new StringBuffer();
+ sb.append(rb.getString("LPARAM"));
+ sb.append(getCodeSource());
+ sb.append("\n");
+ for (int j = 0; j < permissions.size(); j++) {
+ Permission p = permissions.elementAt(j);
+ sb.append(rb.getString("SPACE"));
+ sb.append(rb.getString("SPACE"));
+ sb.append(p);
+ sb.append(rb.getString("NEWLINE"));
+ }
+ sb.append(rb.getString("RPARAM"));
+ sb.append(rb.getString("NEWLINE"));
+ return sb.toString();
+ }
+
+ }
+}
+
+@SuppressWarnings("deprecation")
+class PolicyPermissions extends PermissionCollection {
+
+ private static final long serialVersionUID = -1954188373270545523L;
+
+ private CodeSource codesource;
+ private Permissions perms;
+ private AuthPolicyFile policy;
+ private boolean notInit; // have we pulled in the policy permissions yet?
+ private Vector<Permission> additionalPerms;
+
+ PolicyPermissions(AuthPolicyFile policy,
+ CodeSource codesource)
+ {
+ this.codesource = codesource;
+ this.policy = policy;
+ this.perms = null;
+ this.notInit = true;
+ this.additionalPerms = null;
+ }
+
+ @Override
+ public void add(Permission permission) {
+ if (isReadOnly())
+ throw new SecurityException
+ (AuthPolicyFile.rb.getString
+ ("attempt.to.add.a.Permission.to.a.readonly.PermissionCollection"));
+
+ if (perms == null) {
+ if (additionalPerms == null) {
+ additionalPerms = new Vector<Permission>();
+ }
+ additionalPerms.add(permission);
+ } else {
+ perms.add(permission);
+ }
+ }
+
+ private synchronized void init() {
+ if (notInit) {
+ if (perms == null) {
+ perms = new Permissions();
+ }
+ if (additionalPerms != null) {
+ Enumeration<Permission> e = additionalPerms.elements();
+ while (e.hasMoreElements()) {
+ perms.add(e.nextElement());
+ }
+ additionalPerms = null;
+ }
+ policy.getPermissions(perms, codesource);
+ notInit = false;
+ }
+ }
+
+ @Override
+ public boolean implies(Permission permission) {
+ if (notInit) {
+ init();
+ }
+ return perms.implies(permission);
+ }
+
+ @Override
+ public Enumeration<Permission> elements() {
+ if (notInit) {
+ init();
+ }
+ return perms.elements();
+ }
+
+ @Override
+ public String toString() {
+ if (notInit) {
+ init();
+ }
+ return perms.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/security/provider/ConfigFile.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,669 @@
+/*
+ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.provider;
+
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.security.Security;
+import java.security.URIParameter;
+import java.text.MessageFormat;
+import java.util.*;
+import javax.security.auth.AuthPermission;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
+import javax.security.auth.login.Configuration;
+import javax.security.auth.login.ConfigurationSpi;
+import sun.security.util.Debug;
+import sun.security.util.PropertyExpander;
+import sun.security.util.ResourcesMgr;
+
+/**
+ * This class represents a default implementation for
+ * {@code javax.security.auth.login.Configuration}.
+ *
+ * <p> This object stores the runtime login configuration representation,
+ * and is the amalgamation of multiple static login configurations that
+ * resides in files. The algorithm for locating the login configuration
+ * file(s) and reading their information into this {@code Configuration}
+ * object is:
+ *
+ * <ol>
+ * <li>
+ * Loop through the security properties,
+ * <i>login.config.url.1</i>, <i>login.config.url.2</i>, ...,
+ * <i>login.config.url.X</i>.
+ * Each property value specifies a {@code URL} pointing to a
+ * login configuration file to be loaded. Read in and load
+ * each configuration.
+ *
+ * <li>
+ * The {@code java.lang.System} property
+ * <i>java.security.auth.login.config</i>
+ * may also be set to a {@code URL} pointing to another
+ * login configuration file
+ * (which is the case when a user uses the -D switch at runtime).
+ * If this property is defined, and its use is allowed by the
+ * security property file (the Security property,
+ * <i>policy.allowSystemProperty</i> is set to <i>true</i>),
+ * also load that login configuration.
+ *
+ * <li>
+ * If the <i>java.security.auth.login.config</i> property is defined using
+ * "==" (rather than "="), then ignore all other specified
+ * login configurations and only load this configuration.
+ *
+ * <li>
+ * If no system or security properties were set, try to read from the file,
+ * ${user.home}/.java.login.config, where ${user.home} is the value
+ * represented by the "user.home" System property.
+ * </ol>
+ *
+ * <p> The configuration syntax supported by this implementation
+ * is exactly that syntax specified in the
+ * {@code javax.security.auth.login.Configuration} class.
+ *
+ * @see javax.security.auth.login.LoginContext
+ * @see java.security.Security security properties
+ */
+public final class ConfigFile extends Configuration {
+
+ private final Spi spi;
+
+ public ConfigFile() {
+ spi = new Spi();
+ }
+
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String appName) {
+ return spi.engineGetAppConfigurationEntry(appName);
+ }
+
+ @Override
+ public synchronized void refresh() {
+ spi.engineRefresh();
+ }
+
+ public final static class Spi extends ConfigurationSpi {
+
+ private URL url;
+ private boolean expandProp = true;
+ private Map<String, List<AppConfigurationEntry>> configuration;
+ private int linenum;
+ private StreamTokenizer st;
+ private int lookahead;
+
+ private static Debug debugConfig = Debug.getInstance("configfile");
+ private static Debug debugParser = Debug.getInstance("configparser");
+
+ /**
+ * Creates a new {@code ConfigurationSpi} object.
+ *
+ * @throws SecurityException if the {@code ConfigurationSpi} can not be
+ * initialized
+ */
+ public Spi() {
+ try {
+ init();
+ } catch (IOException ioe) {
+ throw new SecurityException(ioe);
+ }
+ }
+
+ /**
+ * Creates a new {@code ConfigurationSpi} object from the specified
+ * {@code URI}.
+ *
+ * @param uri the {@code URI}
+ * @throws SecurityException if the {@code ConfigurationSpi} can not be
+ * initialized
+ * @throws NullPointerException if {@code uri} is null
+ */
+ public Spi(URI uri) {
+ // only load config from the specified URI
+ try {
+ url = uri.toURL();
+ init();
+ } catch (IOException ioe) {
+ throw new SecurityException(ioe);
+ }
+ }
+
+ public Spi(final Configuration.Parameters params) throws IOException {
+
+ // call in a doPrivileged
+ //
+ // we have already passed the Configuration.getInstance
+ // security check. also this class is not freely accessible
+ // (it is in the "sun" package).
+
+ try {
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
+ public Void run() throws IOException {
+ if (params == null) {
+ init();
+ } else {
+ if (!(params instanceof URIParameter)) {
+ throw new IllegalArgumentException
+ ("Unrecognized parameter: " + params);
+ }
+ URIParameter uriParam = (URIParameter)params;
+ url = uriParam.getURI().toURL();
+ init();
+ }
+ return null;
+ }
+ });
+ } catch (PrivilegedActionException pae) {
+ throw (IOException)pae.getException();
+ }
+
+ // if init() throws some other RuntimeException,
+ // let it percolate up naturally.
+ }
+
+ /**
+ * Read and initialize the entire login Configuration from the
+ * configured URL.
+ *
+ * @throws IOException if the Configuration can not be initialized
+ * @throws SecurityException if the caller does not have permission
+ * to initialize the Configuration
+ */
+ private void init() throws IOException {
+
+ boolean initialized = false;
+
+ // For policy.expandProperties, check if either a security or system
+ // property is set to false (old code erroneously checked the system
+ // prop so we must check both to preserve compatibility).
+ String expand = Security.getProperty("policy.expandProperties");
+ if (expand == null) {
+ expand = System.getProperty("policy.expandProperties");
+ }
+ if ("false".equals(expand)) {
+ expandProp = false;
+ }
+
+ // new configuration
+ Map<String, List<AppConfigurationEntry>> newConfig = new HashMap<>();
+
+ if (url != null) {
+ /**
+ * If the caller specified a URI via Configuration.getInstance,
+ * we only read from that URI
+ */
+ if (debugConfig != null) {
+ debugConfig.println("reading " + url);
+ }
+ init(url, newConfig);
+ configuration = newConfig;
+ return;
+ }
+
+ /**
+ * Caller did not specify URI via Configuration.getInstance.
+ * Read from URLs listed in the java.security properties file.
+ */
+ String allowSys = Security.getProperty("policy.allowSystemProperty");
+
+ if ("true".equalsIgnoreCase(allowSys)) {
+ String extra_config = System.getProperty
+ ("java.security.auth.login.config");
+ if (extra_config != null) {
+ boolean overrideAll = false;
+ if (extra_config.startsWith("=")) {
+ overrideAll = true;
+ extra_config = extra_config.substring(1);
+ }
+ try {
+ extra_config = PropertyExpander.expand(extra_config);
+ } catch (PropertyExpander.ExpandException peee) {
+ throw ioException("Unable.to.properly.expand.config",
+ extra_config);
+ }
+
+ URL configURL = null;
+ try {
+ configURL = new URL(extra_config);
+ } catch (MalformedURLException mue) {
+ File configFile = new File(extra_config);
+ if (configFile.exists()) {
+ configURL = configFile.toURI().toURL();
+ } else {
+ throw ioException(
+ "extra.config.No.such.file.or.directory.",
+ extra_config);
+ }
+ }
+
+ if (debugConfig != null) {
+ debugConfig.println("reading "+configURL);
+ }
+ init(configURL, newConfig);
+ initialized = true;
+ if (overrideAll) {
+ if (debugConfig != null) {
+ debugConfig.println("overriding other policies!");
+ }
+ configuration = newConfig;
+ return;
+ }
+ }
+ }
+
+ int n = 1;
+ String config_url;
+ while ((config_url = Security.getProperty
+ ("login.config.url."+n)) != null) {
+ try {
+ config_url = PropertyExpander.expand
+ (config_url).replace(File.separatorChar, '/');
+ if (debugConfig != null) {
+ debugConfig.println("\tReading config: " + config_url);
+ }
+ init(new URL(config_url), newConfig);
+ initialized = true;
+ } catch (PropertyExpander.ExpandException peee) {
+ throw ioException("Unable.to.properly.expand.config",
+ config_url);
+ }
+ n++;
+ }
+
+ if (initialized == false && n == 1 && config_url == null) {
+
+ // get the config from the user's home directory
+ if (debugConfig != null) {
+ debugConfig.println("\tReading Policy " +
+ "from ~/.java.login.config");
+ }
+ config_url = System.getProperty("user.home");
+ String userConfigFile = config_url + File.separatorChar +
+ ".java.login.config";
+
+ // No longer throws an exception when there's no config file
+ // at all. Returns an empty Configuration instead.
+ if (new File(userConfigFile).exists()) {
+ init(new File(userConfigFile).toURI().toURL(), newConfig);
+ }
+ }
+
+ configuration = newConfig;
+ }
+
+ private void init(URL config,
+ Map<String, List<AppConfigurationEntry>> newConfig)
+ throws IOException {
+
+ try (InputStreamReader isr
+ = new InputStreamReader(getInputStream(config), "UTF-8")) {
+ readConfig(isr, newConfig);
+ } catch (FileNotFoundException fnfe) {
+ if (debugConfig != null) {
+ debugConfig.println(fnfe.toString());
+ }
+ throw new IOException(ResourcesMgr.getString
+ ("Configuration.Error.No.such.file.or.directory",
+ "sun.security.util.AuthResources"));
+ }
+ }
+
+ /**
+ * Retrieve an entry from the Configuration using an application name
+ * as an index.
+ *
+ * @param applicationName the name used to index the Configuration.
+ * @return an array of AppConfigurationEntries which correspond to
+ * the stacked configuration of LoginModules for this
+ * application, or null if this application has no configured
+ * LoginModules.
+ */
+ @Override
+ public AppConfigurationEntry[] engineGetAppConfigurationEntry
+ (String applicationName) {
+
+ List<AppConfigurationEntry> list = null;
+ synchronized (configuration) {
+ list = configuration.get(applicationName);
+ }
+
+ if (list == null || list.size() == 0) {
+ return null;
+ }
+
+ AppConfigurationEntry[] entries =
+ new AppConfigurationEntry[list.size()];
+ Iterator<AppConfigurationEntry> iterator = list.iterator();
+ for (int i = 0; iterator.hasNext(); i++) {
+ AppConfigurationEntry e = iterator.next();
+ entries[i] = new AppConfigurationEntry(e.getLoginModuleName(),
+ e.getControlFlag(),
+ e.getOptions());
+ }
+ return entries;
+ }
+
+ /**
+ * Refresh and reload the Configuration by re-reading all of the
+ * login configurations.
+ *
+ * @throws SecurityException if the caller does not have permission
+ * to refresh the Configuration.
+ */
+ @Override
+ public synchronized void engineRefresh() {
+
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ sm.checkPermission(
+ new AuthPermission("refreshLoginConfiguration"));
+ }
+
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
+ try {
+ init();
+ } catch (IOException ioe) {
+ throw new SecurityException(ioe.getLocalizedMessage(),
+ ioe);
+ }
+ return null;
+ }
+ });
+ }
+
+ private void readConfig(Reader reader,
+ Map<String, List<AppConfigurationEntry>> newConfig)
+ throws IOException {
+
+ linenum = 1;
+
+ if (!(reader instanceof BufferedReader)) {
+ reader = new BufferedReader(reader);
+ }
+
+ st = new StreamTokenizer(reader);
+ st.quoteChar('"');
+ st.wordChars('$', '$');
+ st.wordChars('_', '_');
+ st.wordChars('-', '-');
+ st.wordChars('*', '*');
+ st.lowerCaseMode(false);
+ st.slashSlashComments(true);
+ st.slashStarComments(true);
+ st.eolIsSignificant(true);
+
+ lookahead = nextToken();
+ while (lookahead != StreamTokenizer.TT_EOF) {
+ parseLoginEntry(newConfig);
+ }
+ }
+
+ private void parseLoginEntry(
+ Map<String, List<AppConfigurationEntry>> newConfig)
+ throws IOException {
+
+ List<AppConfigurationEntry> configEntries = new LinkedList<>();
+
+ // application name
+ String appName = st.sval;
+ lookahead = nextToken();
+
+ if (debugParser != null) {
+ debugParser.println("\tReading next config entry: " + appName);
+ }
+
+ match("{");
+
+ // get the modules
+ while (peek("}") == false) {
+ // get the module class name
+ String moduleClass = match("module class name");
+
+ // controlFlag (required, optional, etc)
+ LoginModuleControlFlag controlFlag;
+ String sflag = match("controlFlag").toUpperCase();
+ switch (sflag) {
+ case "REQUIRED":
+ controlFlag = LoginModuleControlFlag.REQUIRED;
+ break;
+ case "REQUISITE":
+ controlFlag = LoginModuleControlFlag.REQUISITE;
+ break;
+ case "SUFFICIENT":
+ controlFlag = LoginModuleControlFlag.SUFFICIENT;
+ break;
+ case "OPTIONAL":
+ controlFlag = LoginModuleControlFlag.OPTIONAL;
+ break;
+ default:
+ throw ioException(
+ "Configuration.Error.Invalid.control.flag.flag",
+ sflag);
+ }
+
+ // get the args
+ Map<String, String> options = new HashMap<>();
+ while (peek(";") == false) {
+ String key = match("option key");
+ match("=");
+ try {
+ options.put(key, expand(match("option value")));
+ } catch (PropertyExpander.ExpandException peee) {
+ throw new IOException(peee.getLocalizedMessage());
+ }
+ }
+
+ lookahead = nextToken();
+
+ // create the new element
+ if (debugParser != null) {
+ debugParser.println("\t\t" + moduleClass + ", " + sflag);
+ for (String key : options.keySet()) {
+ debugParser.println("\t\t\t" + key +
+ "=" + options.get(key));
+ }
+ }
+ configEntries.add(new AppConfigurationEntry(moduleClass,
+ controlFlag,
+ options));
+ }
+
+ match("}");
+ match(";");
+
+ // add this configuration entry
+ if (newConfig.containsKey(appName)) {
+ throw ioException(
+ "Configuration.Error.Can.not.specify.multiple.entries.for.appName",
+ appName);
+ }
+ newConfig.put(appName, configEntries);
+ }
+
+ private String match(String expect) throws IOException {
+
+ String value = null;
+
+ switch(lookahead) {
+ case StreamTokenizer.TT_EOF:
+ throw ioException(
+ "Configuration.Error.expected.expect.read.end.of.file.",
+ expect);
+
+ case '"':
+ case StreamTokenizer.TT_WORD:
+ if (expect.equalsIgnoreCase("module class name") ||
+ expect.equalsIgnoreCase("controlFlag") ||
+ expect.equalsIgnoreCase("option key") ||
+ expect.equalsIgnoreCase("option value")) {
+ value = st.sval;
+ lookahead = nextToken();
+ } else {
+ throw ioException(
+ "Configuration.Error.Line.line.expected.expect.found.value.",
+ new Integer(linenum), expect, st.sval);
+ }
+ break;
+
+ case '{':
+ if (expect.equalsIgnoreCase("{")) {
+ lookahead = nextToken();
+ } else {
+ throw ioException(
+ "Configuration.Error.Line.line.expected.expect.",
+ new Integer(linenum), expect, st.sval);
+ }
+ break;
+
+ case ';':
+ if (expect.equalsIgnoreCase(";")) {
+ lookahead = nextToken();
+ } else {
+ throw ioException(
+ "Configuration.Error.Line.line.expected.expect.",
+ new Integer(linenum), expect, st.sval);
+ }
+ break;
+
+ case '}':
+ if (expect.equalsIgnoreCase("}")) {
+ lookahead = nextToken();
+ } else {
+ throw ioException(
+ "Configuration.Error.Line.line.expected.expect.",
+ new Integer(linenum), expect, st.sval);
+ }
+ break;
+
+ case '=':
+ if (expect.equalsIgnoreCase("=")) {
+ lookahead = nextToken();
+ } else {
+ throw ioException(
+ "Configuration.Error.Line.line.expected.expect.",
+ new Integer(linenum), expect, st.sval);
+ }
+ break;
+
+ default:
+ throw ioException(
+ "Configuration.Error.Line.line.expected.expect.found.value.",
+ new Integer(linenum), expect, st.sval);
+ }
+ return value;
+ }
+
+ private boolean peek(String expect) {
+ switch (lookahead) {
+ case ',':
+ return expect.equalsIgnoreCase(",");
+ case ';':
+ return expect.equalsIgnoreCase(";");
+ case '{':
+ return expect.equalsIgnoreCase("{");
+ case '}':
+ return expect.equalsIgnoreCase("}");
+ default:
+ return false;
+ }
+ }
+
+ private int nextToken() throws IOException {
+ int tok;
+ while ((tok = st.nextToken()) == StreamTokenizer.TT_EOL) {
+ linenum++;
+ }
+ return tok;
+ }
+
+ private InputStream getInputStream(URL url) throws IOException {
+ if ("file".equalsIgnoreCase(url.getProtocol())) {
+ // Compatibility notes:
+ //
+ // Code changed from
+ // String path = url.getFile().replace('/', File.separatorChar);
+ // return new FileInputStream(path);
+ //
+ // The original implementation would search for "/tmp/a%20b"
+ // when url is "file:///tmp/a%20b". This is incorrect. The
+ // current codes fix this bug and searches for "/tmp/a b".
+ // For compatibility reasons, when the file "/tmp/a b" does
+ // not exist, the file named "/tmp/a%20b" will be tried.
+ //
+ // This also means that if both file exists, the behavior of
+ // this method is changed, and the current codes choose the
+ // correct one.
+ try {
+ return url.openStream();
+ } catch (Exception e) {
+ String file = url.getPath();
+ if (url.getHost().length() > 0) { // For Windows UNC
+ file = "//" + url.getHost() + file;
+ }
+ if (debugConfig != null) {
+ debugConfig.println("cannot read " + url +
+ ", try " + file);
+ }
+ return new FileInputStream(file);
+ }
+ } else {
+ return url.openStream();
+ }
+ }
+
+ private String expand(String value)
+ throws PropertyExpander.ExpandException, IOException {
+
+ if (value.isEmpty()) {
+ return value;
+ }
+
+ if (!expandProp) {
+ return value;
+ }
+ String s = PropertyExpander.expand(value);
+ if (s == null || s.length() == 0) {
+ throw ioException(
+ "Configuration.Error.Line.line.system.property.value.expanded.to.empty.value",
+ new Integer(linenum), value);
+ }
+ return s;
+ }
+
+ private IOException ioException(String resourceKey, Object... args) {
+ MessageFormat form = new MessageFormat(ResourcesMgr.getString
+ (resourceKey, "sun.security.util.AuthResources"));
+ return new IOException(form.format(args));
+ }
+ }
+}
--- a/jdk/src/share/classes/sun/security/provider/ConfigSpiFile.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,693 +0,0 @@
-/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.provider;
-
-import java.io.*;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.security.Security;
-import java.security.URIParameter;
-import java.text.MessageFormat;
-import java.util.*;
-import javax.security.auth.AuthPermission;
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.Configuration;
-import javax.security.auth.login.ConfigurationSpi;
-import sun.security.util.Debug;
-import sun.security.util.PropertyExpander;
-import sun.security.util.ResourcesMgr;
-
-/**
- * This class represents a default implementation for
- * {@code javax.security.auth.login.Configuration}.
- *
- * <p> This object stores the runtime login configuration representation,
- * and is the amalgamation of multiple static login
- * configurations that resides in files.
- * The algorithm for locating the login configuration file(s) and reading their
- * information into this {@code Configuration} object is:
- *
- * <ol>
- * <li>
- * Loop through the security properties,
- * <i>login.config.url.1</i>, <i>login.config.url.2</i>, ...,
- * <i>login.config.url.X</i>.
- * Each property value specifies a <code>URL</code> pointing to a
- * login configuration file to be loaded. Read in and load
- * each configuration.
- *
- * <li>
- * The {@code java.lang.System} property
- * <i>java.security.auth.login.config</i>
- * may also be set to a {@code URL} pointing to another
- * login configuration file
- * (which is the case when a user uses the -D switch at runtime).
- * If this property is defined, and its use is allowed by the
- * security property file (the Security property,
- * <i>policy.allowSystemProperty</i> is set to <i>true</i>),
- * also load that login configuration.
- *
- * <li>
- * If the <i>java.security.auth.login.config</i> property is defined using
- * "==" (rather than "="), then ignore all other specified
- * login configurations and only load this configuration.
- *
- * <li>
- * If no system or security properties were set, try to read from the file,
- * ${user.home}/.java.login.config, where ${user.home} is the value
- * represented by the "user.home" System property.
- * </ol>
- *
- * <p> The configuration syntax supported by this implementation
- * is exactly that syntax specified in the
- * {@code javax.security.auth.login.Configuration} class.
- *
- * @see javax.security.auth.login.LoginContext
- * @see java.security.Security security properties
- */
-public final class ConfigSpiFile extends ConfigurationSpi {
-
- private URL url;
- private boolean expandProp = true;
- private Map<String, List<AppConfigurationEntry>> configuration;
- private int linenum;
- private StreamTokenizer st;
- private int lookahead;
-
- private static Debug debugConfig = Debug.getInstance("configfile");
- private static Debug debugParser = Debug.getInstance("configparser");
-
- /**
- * Create a new {@code Configuration} object.
- *
- * @throws SecurityException if the {@code Configuration} can not be
- * initialized
- */
- public ConfigSpiFile() {
- try {
- init();
- } catch (IOException ioe) {
- throw new SecurityException(ioe);
- }
- }
-
- /**
- * Create a new {@code Configuration} object from the specified {@code URI}.
- *
- * @param uri the {@code URI}
- * @throws SecurityException if the {@code Configuration} can not be
- * initialized
- * @throws NullPointerException if {@code uri} is null
- */
- public ConfigSpiFile(URI uri) {
- // only load config from the specified URI
- try {
- url = uri.toURL();
- init();
- } catch (IOException ioe) {
- throw new SecurityException(ioe);
- }
- }
-
- public ConfigSpiFile(final Configuration.Parameters params)
- throws IOException {
-
- // call in a doPrivileged
- //
- // we have already passed the Configuration.getInstance
- // security check. also this class is not freely accessible
- // (it is in the "sun" package).
-
- try {
- AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
- public Void run() throws IOException {
- if (params == null) {
- init();
- } else {
- if (!(params instanceof URIParameter)) {
- throw new IllegalArgumentException
- ("Unrecognized parameter: " + params);
- }
- URIParameter uriParam = (URIParameter)params;
- url = uriParam.getURI().toURL();
- init();
- }
- return null;
- }
- });
- } catch (PrivilegedActionException pae) {
- throw (IOException)pae.getException();
- }
-
- // if init() throws some other RuntimeException,
- // let it percolate up naturally.
- }
-
- /**
- * Read and initialize the entire login Configuration from the configured
- * URL.
- *
- * @throws IOException if the Configuration can not be initialized
- * @throws SecurityException if the caller does not have permission
- * to initialize the Configuration
- */
- private void init() throws IOException {
-
- boolean initialized = false;
-
- // For policy.expandProperties, check if either a security or system
- // property is set to false (old code erroneously checked the system
- // prop so we must check both to preserve compatibility).
- String expand = Security.getProperty("policy.expandProperties");
- if (expand == null) {
- expand = System.getProperty("policy.expandProperties");
- }
- if ("false".equals(expand)) {
- expandProp = false;
- }
-
- // new configuration
- Map<String, List<AppConfigurationEntry>> newConfig = new HashMap<>();
-
- if (url != null) {
- /**
- * If the caller specified a URI via Configuration.getInstance,
- * we only read from that URI
- */
- if (debugConfig != null) {
- debugConfig.println("reading " + url);
- }
- init(url, newConfig);
- configuration = newConfig;
- return;
- }
-
- /**
- * Caller did not specify URI via Configuration.getInstance.
- * Read from URLs listed in the java.security properties file.
- */
- String allowSys = Security.getProperty("policy.allowSystemProperty");
-
- if ("true".equalsIgnoreCase(allowSys)) {
- String extra_config = System.getProperty
- ("java.security.auth.login.config");
- if (extra_config != null) {
- boolean overrideAll = false;
- if (extra_config.startsWith("=")) {
- overrideAll = true;
- extra_config = extra_config.substring(1);
- }
- try {
- extra_config = PropertyExpander.expand(extra_config);
- } catch (PropertyExpander.ExpandException peee) {
- MessageFormat form = new MessageFormat
- (ResourcesMgr.getString
- ("Unable.to.properly.expand.config",
- "sun.security.util.AuthResources"));
- Object[] source = {extra_config};
- throw new IOException(form.format(source));
- }
-
- URL configURL = null;
- try {
- configURL = new URL(extra_config);
- } catch (MalformedURLException mue) {
- File configFile = new File(extra_config);
- if (configFile.exists()) {
- configURL = configFile.toURI().toURL();
- } else {
- MessageFormat form = new MessageFormat
- (ResourcesMgr.getString
- ("extra.config.No.such.file.or.directory.",
- "sun.security.util.AuthResources"));
- Object[] source = {extra_config};
- throw new IOException(form.format(source));
- }
- }
-
- if (debugConfig != null) {
- debugConfig.println("reading "+configURL);
- }
- init(configURL, newConfig);
- initialized = true;
- if (overrideAll) {
- if (debugConfig != null) {
- debugConfig.println("overriding other policies!");
- }
- configuration = newConfig;
- return;
- }
- }
- }
-
- int n = 1;
- String config_url;
- while ((config_url = Security.getProperty
- ("login.config.url."+n)) != null) {
- try {
- config_url = PropertyExpander.expand
- (config_url).replace(File.separatorChar, '/');
- if (debugConfig != null) {
- debugConfig.println("\tReading config: " + config_url);
- }
- init(new URL(config_url), newConfig);
- initialized = true;
- } catch (PropertyExpander.ExpandException peee) {
- MessageFormat form = new MessageFormat
- (ResourcesMgr.getString
- ("Unable.to.properly.expand.config",
- "sun.security.util.AuthResources"));
- Object[] source = {config_url};
- throw new IOException(form.format(source));
- }
- n++;
- }
-
- if (initialized == false && n == 1 && config_url == null) {
-
- // get the config from the user's home directory
- if (debugConfig != null) {
- debugConfig.println("\tReading Policy " +
- "from ~/.java.login.config");
- }
- config_url = System.getProperty("user.home");
- String userConfigFile = config_url +
- File.separatorChar + ".java.login.config";
-
- // No longer throws an exception when there's no config file
- // at all. Returns an empty Configuration instead.
- if (new File(userConfigFile).exists()) {
- init(new File(userConfigFile).toURI().toURL(),
- newConfig);
- }
- }
-
- configuration = newConfig;
- }
-
- private void init(URL config,
- Map<String, List<AppConfigurationEntry>> newConfig)
- throws IOException {
-
- try (InputStreamReader isr
- = new InputStreamReader(getInputStream(config), "UTF-8")) {
- readConfig(isr, newConfig);
- } catch (FileNotFoundException fnfe) {
- if (debugConfig != null) {
- debugConfig.println(fnfe.toString());
- }
- throw new IOException(ResourcesMgr.getString
- ("Configuration.Error.No.such.file.or.directory",
- "sun.security.util.AuthResources"));
- }
- }
-
- /**
- * Retrieve an entry from the Configuration using an application name
- * as an index.
- *
- * @param applicationName the name used to index the Configuration.
- * @return an array of AppConfigurationEntries which correspond to
- * the stacked configuration of LoginModules for this
- * application, or null if this application has no configured
- * LoginModules.
- */
- @Override
- public AppConfigurationEntry[] engineGetAppConfigurationEntry
- (String applicationName) {
-
- List<AppConfigurationEntry> list = null;
- synchronized (configuration) {
- list = configuration.get(applicationName);
- }
-
- if (list == null || list.size() == 0)
- return null;
-
- AppConfigurationEntry[] entries =
- new AppConfigurationEntry[list.size()];
- Iterator<AppConfigurationEntry> iterator = list.iterator();
- for (int i = 0; iterator.hasNext(); i++) {
- AppConfigurationEntry e = iterator.next();
- entries[i] = new AppConfigurationEntry(e.getLoginModuleName(),
- e.getControlFlag(),
- e.getOptions());
- }
- return entries;
- }
-
- /**
- * Refresh and reload the Configuration by re-reading all of the
- * login configurations.
- *
- * @throws SecurityException if the caller does not have permission
- * to refresh the Configuration.
- */
- @Override
- public synchronized void engineRefresh() {
-
- SecurityManager sm = System.getSecurityManager();
- if (sm != null)
- sm.checkPermission(new AuthPermission("refreshLoginConfiguration"));
-
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- try {
- init();
- } catch (IOException ioe) {
- throw new SecurityException(ioe.getLocalizedMessage(), ioe);
- }
- return null;
- }
- });
- }
-
- private void readConfig(Reader reader,
- Map<String, List<AppConfigurationEntry>> newConfig)
- throws IOException {
-
- linenum = 1;
-
- if (!(reader instanceof BufferedReader))
- reader = new BufferedReader(reader);
-
- st = new StreamTokenizer(reader);
- st.quoteChar('"');
- st.wordChars('$', '$');
- st.wordChars('_', '_');
- st.wordChars('-', '-');
- st.wordChars('*', '*');
- st.lowerCaseMode(false);
- st.slashSlashComments(true);
- st.slashStarComments(true);
- st.eolIsSignificant(true);
-
- lookahead = nextToken();
- while (lookahead != StreamTokenizer.TT_EOF) {
- parseLoginEntry(newConfig);
- }
- }
-
- private void parseLoginEntry(
- Map<String, List<AppConfigurationEntry>> newConfig)
- throws IOException {
-
- List<AppConfigurationEntry> configEntries = new LinkedList<>();
-
- // application name
- String appName = st.sval;
- lookahead = nextToken();
-
- if (debugParser != null) {
- debugParser.println("\tReading next config entry: " + appName);
- }
-
- match("{");
-
- // get the modules
- while (peek("}") == false) {
- // get the module class name
- String moduleClass = match("module class name");
-
- // controlFlag (required, optional, etc)
- AppConfigurationEntry.LoginModuleControlFlag controlFlag;
- String sflag = match("controlFlag").toUpperCase();
- switch (sflag) {
- case "REQUIRED":
- controlFlag =
- AppConfigurationEntry.LoginModuleControlFlag.REQUIRED;
- break;
- case "REQUISITE":
- controlFlag =
- AppConfigurationEntry.LoginModuleControlFlag.REQUISITE;
- break;
- case "SUFFICIENT":
- controlFlag =
- AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT;
- break;
- case "OPTIONAL":
- controlFlag =
- AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL;
- break;
- default:
- MessageFormat form = new MessageFormat(
- ResourcesMgr.getString
- ("Configuration.Error.Invalid.control.flag.flag",
- "sun.security.util.AuthResources"));
- Object[] source = {sflag};
- throw new IOException(form.format(source));
- }
-
- // get the args
- Map<String, String> options = new HashMap<>();
- while (peek(";") == false) {
- String key = match("option key");
- match("=");
- try {
- options.put(key, expand(match("option value")));
- } catch (PropertyExpander.ExpandException peee) {
- throw new IOException(peee.getLocalizedMessage());
- }
- }
-
- lookahead = nextToken();
-
- // create the new element
- if (debugParser != null) {
- debugParser.println("\t\t" + moduleClass + ", " + sflag);
- for (String key : options.keySet()) {
- debugParser.println("\t\t\t" + key +
- "=" + options.get(key));
- }
- }
- configEntries.add(new AppConfigurationEntry(moduleClass,
- controlFlag, options));
- }
-
- match("}");
- match(";");
-
- // add this configuration entry
- if (newConfig.containsKey(appName)) {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Can.not.specify.multiple.entries.for.appName",
- "sun.security.util.AuthResources"));
- Object[] source = {appName};
- throw new IOException(form.format(source));
- }
- newConfig.put(appName, configEntries);
- }
-
- private String match(String expect) throws IOException {
-
- String value = null;
-
- switch(lookahead) {
- case StreamTokenizer.TT_EOF:
-
- MessageFormat form1 = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.expected.expect.read.end.of.file.",
- "sun.security.util.AuthResources"));
- Object[] source1 = {expect};
- throw new IOException(form1.format(source1));
-
- case '"':
- case StreamTokenizer.TT_WORD:
-
- if (expect.equalsIgnoreCase("module class name") ||
- expect.equalsIgnoreCase("controlFlag") ||
- expect.equalsIgnoreCase("option key") ||
- expect.equalsIgnoreCase("option value")) {
- value = st.sval;
- lookahead = nextToken();
- } else {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Line.line.expected.expect.found.value.",
- "sun.security.util.AuthResources"));
- Object[] source = {new Integer(linenum), expect, st.sval};
- throw new IOException(form.format(source));
- }
- break;
-
- case '{':
-
- if (expect.equalsIgnoreCase("{")) {
- lookahead = nextToken();
- } else {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Line.line.expected.expect.",
- "sun.security.util.AuthResources"));
- Object[] source = {new Integer(linenum), expect, st.sval};
- throw new IOException(form.format(source));
- }
- break;
-
- case ';':
-
- if (expect.equalsIgnoreCase(";")) {
- lookahead = nextToken();
- } else {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Line.line.expected.expect.",
- "sun.security.util.AuthResources"));
- Object[] source = {new Integer(linenum), expect, st.sval};
- throw new IOException(form.format(source));
- }
- break;
-
- case '}':
-
- if (expect.equalsIgnoreCase("}")) {
- lookahead = nextToken();
- } else {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Line.line.expected.expect.",
- "sun.security.util.AuthResources"));
- Object[] source = {new Integer(linenum), expect, st.sval};
- throw new IOException(form.format(source));
- }
- break;
-
- case '=':
-
- if (expect.equalsIgnoreCase("=")) {
- lookahead = nextToken();
- } else {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Line.line.expected.expect.",
- "sun.security.util.AuthResources"));
- Object[] source = {new Integer(linenum), expect, st.sval};
- throw new IOException(form.format(source));
- }
- break;
-
- default:
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Line.line.expected.expect.found.value.",
- "sun.security.util.AuthResources"));
- Object[] source = {new Integer(linenum), expect, st.sval};
- throw new IOException(form.format(source));
- }
- return value;
- }
-
- private boolean peek(String expect) {
- boolean found = false;
-
- switch (lookahead) {
- case ',':
- if (expect.equalsIgnoreCase(","))
- found = true;
- break;
- case ';':
- if (expect.equalsIgnoreCase(";"))
- found = true;
- break;
- case '{':
- if (expect.equalsIgnoreCase("{"))
- found = true;
- break;
- case '}':
- if (expect.equalsIgnoreCase("}"))
- found = true;
- break;
- default:
- }
- return found;
- }
-
- private int nextToken() throws IOException {
- int tok;
- while ((tok = st.nextToken()) == StreamTokenizer.TT_EOL) {
- linenum++;
- }
- return tok;
- }
-
- private InputStream getInputStream(URL url) throws IOException {
- if ("file".equalsIgnoreCase(url.getProtocol())) {
- // Compatibility notes:
- //
- // Code changed from
- // String path = url.getFile().replace('/', File.separatorChar);
- // return new FileInputStream(path);
- //
- // The original implementation would search for "/tmp/a%20b"
- // when url is "file:///tmp/a%20b". This is incorrect. The
- // current codes fix this bug and searches for "/tmp/a b".
- // For compatibility reasons, when the file "/tmp/a b" does
- // not exist, the file named "/tmp/a%20b" will be tried.
- //
- // This also means that if both file exists, the behavior of
- // this method is changed, and the current codes choose the
- // correct one.
- try {
- return url.openStream();
- } catch (Exception e) {
- String file = url.getPath();
- if (url.getHost().length() > 0) { // For Windows UNC
- file = "//" + url.getHost() + file;
- }
- if (debugConfig != null) {
- debugConfig.println("cannot read " + url +
- ", try " + file);
- }
- return new FileInputStream(file);
- }
- } else {
- return url.openStream();
- }
- }
-
- private String expand(String value)
- throws PropertyExpander.ExpandException, IOException {
-
- if (value.isEmpty()) {
- return value;
- }
-
- if (expandProp) {
-
- String s = PropertyExpander.expand(value);
-
- if (s == null || s.length() == 0) {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- ("Configuration.Error.Line.line.system.property.value.expanded.to.empty.value",
- "sun.security.util.AuthResources"));
- Object[] source = {new Integer(linenum), value};
- throw new IOException(form.format(source));
- }
- return s;
- } else {
- return value;
- }
- }
-}
--- a/jdk/src/share/classes/sun/security/provider/DSAPublicKey.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/provider/DSAPublicKey.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
import sun.security.x509.X509Key;
import sun.security.x509.AlgIdDSA;
+import sun.security.util.BitArray;
import sun.security.util.Debug;
import sun.security.util.DerValue;
import sun.security.util.DerInputStream;
@@ -88,8 +89,9 @@
algid = new AlgIdDSA(p, q, g);
try {
- key = new DerValue(DerValue.tag_Integer,
+ byte[] keyArray = new DerValue(DerValue.tag_Integer,
y.toByteArray()).toByteArray();
+ setKey(new BitArray(keyArray.length*8, keyArray));
encode();
} catch (IOException e) {
throw new InvalidKeyException("could not DER encode y: " +
@@ -142,7 +144,7 @@
protected void parseKeyBits() throws InvalidKeyException {
try {
- DerInputStream in = new DerInputStream(key);
+ DerInputStream in = new DerInputStream(getKey().toByteArray());
y = in.getBigInteger();
} catch (IOException e) {
throw new InvalidKeyException("Invalid key: y value\n" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/security/provider/SubjectCodeSource.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,401 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.provider;
+
+import java.net.URL;
+import java.util.*;
+import java.security.CodeSource;
+import java.security.Principal;
+import java.security.cert.Certificate;
+import java.lang.reflect.Constructor;
+
+import javax.security.auth.Subject;
+import sun.security.provider.PolicyParser.PrincipalEntry;
+
+/**
+ * <p> This <code>SubjectCodeSource</code> class contains
+ * a <code>URL</code>, signer certificates, and either a <code>Subject</code>
+ * (that represents the <code>Subject</code> in the current
+ * <code>AccessControlContext</code>), or a linked list of Principals
+ * (that represent a "subject" in a <code>Policy</code>).
+ *
+ */
+class SubjectCodeSource extends CodeSource implements java.io.Serializable {
+
+ private static final long serialVersionUID = 6039418085604715275L;
+
+ private static final java.util.ResourceBundle rb =
+ java.security.AccessController.doPrivileged
+ (new java.security.PrivilegedAction<java.util.ResourceBundle>() {
+ public java.util.ResourceBundle run() {
+ return (java.util.ResourceBundle.getBundle
+ ("sun.security.util.AuthResources"));
+ }
+ });
+
+ private Subject subject;
+ private LinkedList<PrincipalEntry> principals;
+ private static final Class[] PARAMS = { String.class };
+ private static final sun.security.util.Debug debug =
+ sun.security.util.Debug.getInstance("auth", "\t[Auth Access]");
+ private ClassLoader sysClassLoader;
+
+ /**
+ * Creates a new <code>SubjectCodeSource</code>
+ * with the given <code>Subject</code>, principals, <code>URL</code>,
+ * and signers (Certificates). The <code>Subject</code>
+ * represents the <code>Subject</code> associated with the current
+ * <code>AccessControlContext</code>.
+ * The Principals are given as a <code>LinkedList</code>
+ * of <code>PolicyParser.PrincipalEntry</code> objects.
+ * Typically either a <code>Subject</code> will be provided,
+ * or a list of <code>principals</code> will be provided
+ * (not both).
+ *
+ * <p>
+ *
+ * @param subject the <code>Subject</code> associated with this
+ * <code>SubjectCodeSource</code> <p>
+ *
+ * @param url the <code>URL</code> associated with this
+ * <code>SubjectCodeSource</code> <p>
+ *
+ * @param certs the signers associated with this
+ * <code>SubjectCodeSource</code> <p>
+ */
+ SubjectCodeSource(Subject subject,
+ LinkedList<PrincipalEntry> principals,
+ URL url, Certificate[] certs) {
+
+ super(url, certs);
+ this.subject = subject;
+ this.principals = (principals == null ?
+ new LinkedList<PrincipalEntry>() :
+ new LinkedList<PrincipalEntry>(principals));
+ sysClassLoader = java.security.AccessController.doPrivileged
+ (new java.security.PrivilegedAction<ClassLoader>() {
+ public ClassLoader run() {
+ return ClassLoader.getSystemClassLoader();
+ }
+ });
+ }
+
+ /**
+ * Get the Principals associated with this <code>SubjectCodeSource</code>.
+ * The Principals are retrieved as a <code>LinkedList</code>
+ * of <code>PolicyParser.PrincipalEntry</code> objects.
+ *
+ * <p>
+ *
+ * @return the Principals associated with this
+ * <code>SubjectCodeSource</code> as a <code>LinkedList</code>
+ * of <code>PolicyParser.PrincipalEntry</code> objects.
+ */
+ LinkedList<PrincipalEntry> getPrincipals() {
+ return principals;
+ }
+
+ /**
+ * Get the <code>Subject</code> associated with this
+ * <code>SubjectCodeSource</code>. The <code>Subject</code>
+ * represents the <code>Subject</code> associated with the
+ * current <code>AccessControlContext</code>.
+ *
+ * <p>
+ *
+ * @return the <code>Subject</code> associated with this
+ * <code>SubjectCodeSource</code>.
+ */
+ Subject getSubject() {
+ return subject;
+ }
+
+ /**
+ * Returns true if this <code>SubjectCodeSource</code> object "implies"
+ * the specified <code>CodeSource</code>.
+ * More specifically, this method makes the following checks.
+ * If any fail, it returns false. If they all succeed, it returns true.
+ *
+ * <p>
+ * <ol>
+ * <li> The provided codesource must not be <code>null</code>.
+ * <li> codesource must be an instance of <code>SubjectCodeSource</code>.
+ * <li> super.implies(codesource) must return true.
+ * <li> for each principal in this codesource's principal list:
+ * <ol>
+ * <li> if the principal is an instanceof
+ * <code>Principal</code>, then the principal must
+ * imply the provided codesource's <code>Subject</code>.
+ * <li> if the principal is not an instanceof
+ * <code>Principal</code>, then the provided
+ * codesource's <code>Subject</code> must have an
+ * associated <code>Principal</code>, <i>P</i>, where
+ * P.getClass().getName equals principal.principalClass,
+ * and P.getName() equals principal.principalName.
+ * </ol>
+ * </ol>
+ *
+ * <p>
+ *
+ * @param codesource the <code>CodeSource</code> to compare against.
+ *
+ * @return true if this <code>SubjectCodeSource</code> implies the
+ * the specified <code>CodeSource</code>.
+ */
+ public boolean implies(CodeSource codesource) {
+
+ LinkedList<PrincipalEntry> subjectList = null;
+
+ if (codesource == null ||
+ !(codesource instanceof SubjectCodeSource) ||
+ !(super.implies(codesource))) {
+
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: FAILURE 1");
+ return false;
+ }
+
+ SubjectCodeSource that = (SubjectCodeSource)codesource;
+
+ // if the principal list in the policy "implies"
+ // the Subject associated with the current AccessControlContext,
+ // then return true
+
+ if (this.principals == null) {
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: PASS 1");
+ return true;
+ }
+
+ if (that.getSubject() == null ||
+ that.getSubject().getPrincipals().size() == 0) {
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: FAILURE 2");
+ return false;
+ }
+
+ ListIterator<PrincipalEntry> li = this.principals.listIterator(0);
+ while (li.hasNext()) {
+ PrincipalEntry pppe = li.next();
+ try {
+
+ // use new Principal.implies method
+
+ Class<?> pClass = Class.forName(pppe.principalClass,
+ true, sysClassLoader);
+ if (!Principal.class.isAssignableFrom(pClass)) {
+ // not the right subtype
+ throw new ClassCastException(pppe.principalClass +
+ " is not a Principal");
+ }
+ Constructor<?> c = pClass.getConstructor(PARAMS);
+ Principal p = (Principal)c.newInstance(new Object[] {
+ pppe.principalName });
+
+ if (!p.implies(that.getSubject())) {
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: FAILURE 3");
+ return false;
+ } else {
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: PASS 2");
+ return true;
+ }
+ } catch (Exception e) {
+
+ // simply compare Principals
+
+ if (subjectList == null) {
+
+ if (that.getSubject() == null) {
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: " +
+ "FAILURE 4");
+ return false;
+ }
+ Iterator<Principal> i =
+ that.getSubject().getPrincipals().iterator();
+
+ subjectList = new LinkedList<PrincipalEntry>();
+ while (i.hasNext()) {
+ Principal p = i.next();
+ PrincipalEntry spppe = new PrincipalEntry
+ (p.getClass().getName(), p.getName());
+ subjectList.add(spppe);
+ }
+ }
+
+ if (!subjectListImpliesPrincipalEntry(subjectList, pppe)) {
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: FAILURE 5");
+ return false;
+ }
+ }
+ }
+
+ if (debug != null)
+ debug.println("\tSubjectCodeSource.implies: PASS 3");
+ return true;
+ }
+
+ /**
+ * This method returns, true, if the provided <i>subjectList</i>
+ * "contains" the <code>Principal</code> specified
+ * in the provided <i>pppe</i> argument.
+ *
+ * Note that the provided <i>pppe</i> argument may have
+ * wildcards (*) for the <code>Principal</code> class and name,
+ * which need to be considered.
+ *
+ * <p>
+ *
+ * @param subjectList a list of PolicyParser.PrincipalEntry objects
+ * that correspond to all the Principals in the Subject currently
+ * on this thread's AccessControlContext. <p>
+ *
+ * @param pppe the Principals specified in a grant entry.
+ *
+ * @return true if the provided <i>subjectList</i> "contains"
+ * the <code>Principal</code> specified in the provided
+ * <i>pppe</i> argument.
+ */
+ private boolean subjectListImpliesPrincipalEntry(
+ LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) {
+
+ ListIterator<PrincipalEntry> li = subjectList.listIterator(0);
+ while (li.hasNext()) {
+ PrincipalEntry listPppe = li.next();
+
+ if (pppe.getPrincipalClass().equals
+ (PrincipalEntry.WILDCARD_CLASS) ||
+ pppe.getPrincipalClass().equals(listPppe.getPrincipalClass()))
+ {
+ if (pppe.getPrincipalName().equals
+ (PrincipalEntry.WILDCARD_NAME) ||
+ pppe.getPrincipalName().equals(listPppe.getPrincipalName()))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Tests for equality between the specified object and this
+ * object. Two <code>SubjectCodeSource</code> objects are considered equal
+ * if their locations are of identical value, if the two sets of
+ * Certificates are of identical values, and if the
+ * Subjects are equal, and if the PolicyParser.PrincipalEntry values
+ * are of identical values. It is not required that
+ * the Certificates or PolicyParser.PrincipalEntry values
+ * be in the same order.
+ *
+ * <p>
+ *
+ * @param obj the object to test for equality with this object.
+ *
+ * @return true if the objects are considered equal, false otherwise.
+ */
+ public boolean equals(Object obj) {
+
+ if (obj == this)
+ return true;
+
+ if (super.equals(obj) == false)
+ return false;
+
+ if (!(obj instanceof SubjectCodeSource))
+ return false;
+
+ SubjectCodeSource that = (SubjectCodeSource)obj;
+
+ // the principal lists must match
+ try {
+ if (this.getSubject() != that.getSubject())
+ return false;
+ } catch (SecurityException se) {
+ return false;
+ }
+
+ if ((this.principals == null && that.principals != null) ||
+ (this.principals != null && that.principals == null))
+ return false;
+
+ if (this.principals != null && that.principals != null) {
+ if (!this.principals.containsAll(that.principals) ||
+ !that.principals.containsAll(this.principals))
+
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Return a hashcode for this <code>SubjectCodeSource</code>.
+ *
+ * <p>
+ *
+ * @return a hashcode for this <code>SubjectCodeSource</code>.
+ */
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ /**
+ * Return a String representation of this <code>SubjectCodeSource</code>.
+ *
+ * <p>
+ *
+ * @return a String representation of this <code>SubjectCodeSource</code>.
+ */
+ public String toString() {
+ String returnMe = super.toString();
+ if (getSubject() != null) {
+ if (debug != null) {
+ final Subject finalSubject = getSubject();
+ returnMe = returnMe + "\n" +
+ java.security.AccessController.doPrivileged
+ (new java.security.PrivilegedAction<String>() {
+ public String run() {
+ return finalSubject.toString();
+ }
+ });
+ } else {
+ returnMe = returnMe + "\n" + getSubject().toString();
+ }
+ }
+ if (principals != null) {
+ ListIterator<PrincipalEntry> li = principals.listIterator();
+ while (li.hasNext()) {
+ PrincipalEntry pppe = li.next();
+ returnMe = returnMe + rb.getString("NEWLINE") +
+ pppe.getPrincipalClass() + " " +
+ pppe.getPrincipalName();
+ }
+ }
+ return returnMe;
+ }
+}
--- a/jdk/src/share/classes/sun/security/provider/SunEntries.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/provider/SunEntries.java Tue Aug 20 17:44:18 2013 -0700
@@ -242,7 +242,7 @@
* Configuration
*/
map.put("Configuration.JavaLoginConfig",
- "sun.security.provider.ConfigSpiFile");
+ "sun.security.provider.ConfigFile$Spi");
/*
* CertPathBuilder
--- a/jdk/src/share/classes/sun/security/rsa/RSAPadding.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSAPadding.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -458,7 +458,7 @@
private void mgf1(byte[] seed, int seedOfs, int seedLen,
byte[] out, int outOfs, int maskLen) throws BadPaddingException {
byte[] C = new byte[4]; // 32 bit counter
- byte[] digest = new byte[20]; // 20 bytes is length of SHA-1 digest
+ byte[] digest = new byte[mgfMd.getDigestLength()];
while (maskLen > 0) {
mgfMd.update(seed, seedOfs, seedLen);
mgfMd.update(C);
--- a/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -67,9 +67,10 @@
DerOutputStream out = new DerOutputStream();
out.putInteger(n);
out.putInteger(e);
- DerValue val =
- new DerValue(DerValue.tag_Sequence, out.toByteArray());
- key = val.toByteArray();
+ byte[] keyArray =
+ new DerValue(DerValue.tag_Sequence,
+ out.toByteArray()).toByteArray();
+ setKey(new BitArray(keyArray.length*8, keyArray));
} catch (IOException exc) {
// should never occur
throw new InvalidKeyException(exc);
@@ -104,7 +105,7 @@
*/
protected void parseKeyBits() throws InvalidKeyException {
try {
- DerInputStream in = new DerInputStream(key);
+ DerInputStream in = new DerInputStream(getKey().toByteArray());
DerValue derValue = in.getDerValue();
if (derValue.tag != DerValue.tag_Sequence) {
throw new IOException("Not a SEQUENCE");
--- a/jdk/src/share/classes/sun/security/rsa/RSASignature.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSASignature.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -244,12 +244,14 @@
}
// set parameter, not supported. See JCA doc
+ @Deprecated
protected void engineSetParameter(String param, Object value)
throws InvalidParameterException {
throw new UnsupportedOperationException("setParameter() not supported");
}
// get parameter, not supported. See JCA doc
+ @Deprecated
protected Object engineGetParameter(String param)
throws InvalidParameterException {
throw new UnsupportedOperationException("getParameter() not supported");
--- a/jdk/src/share/classes/sun/security/ssl/KerberosClientKeyExchange.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/ssl/KerberosClientKeyExchange.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -57,7 +57,8 @@
private final KerberosClientKeyExchange impl = createImpl();
private KerberosClientKeyExchange createImpl() {
- if (getClass() == KerberosClientKeyExchange.class) {
+ if (implClass != null &&
+ getClass() == KerberosClientKeyExchange.class) {
try {
return (KerberosClientKeyExchange)implClass.newInstance();
} catch (InstantiationException e) {
@@ -69,8 +70,11 @@
return null;
}
- public KerberosClientKeyExchange() {
- // empty
+ // This constructor will be called when constructing an instance of its
+ // subclass -- KerberosClientKeyExchangeImpl. Please won't check the
+ // value of impl variable in this constructor.
+ protected KerberosClientKeyExchange() {
+ // please won't check the value of impl variable
}
public KerberosClientKeyExchange(String serverName, boolean isLoopback,
@@ -85,8 +89,9 @@
}
public KerberosClientKeyExchange(ProtocolVersion protocolVersion,
- ProtocolVersion clientVersion, SecureRandom rand,
- HandshakeInStream input, AccessControlContext acc, Object serverKeys) throws IOException {
+ ProtocolVersion clientVersion, SecureRandom rand,
+ HandshakeInStream input, AccessControlContext acc,
+ Object serverKeys) throws IOException {
if (impl != null) {
init(protocolVersion, clientVersion, rand, input, acc, serverKeys);
@@ -101,7 +106,7 @@
}
@Override
- public int messageLength() {
+ public int messageLength() {
return impl.messageLength();
}
@@ -125,11 +130,13 @@
}
public void init(ProtocolVersion protocolVersion,
- ProtocolVersion clientVersion, SecureRandom rand,
- HandshakeInStream input, AccessControlContext acc, Object ServiceCreds) throws IOException {
+ ProtocolVersion clientVersion, SecureRandom rand,
+ HandshakeInStream input, AccessControlContext acc,
+ Object ServiceCreds) throws IOException {
if (impl != null) {
- impl.init(protocolVersion, clientVersion, rand, input, acc, ServiceCreds);
+ impl.init(protocolVersion, clientVersion,
+ rand, input, acc, ServiceCreds);
}
}
--- a/jdk/src/share/classes/sun/security/x509/AlgIdDSA.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/x509/AlgIdDSA.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -96,7 +96,7 @@
* Default constructor. The OID and parameters must be
* deserialized before this algorithm ID is used.
*/
- // XXX deprecated for general use
+ @Deprecated
public AlgIdDSA () {}
AlgIdDSA (DerValue val) throws IOException
--- a/jdk/src/share/classes/sun/security/x509/X509Key.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/security/x509/X509Key.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -79,6 +79,7 @@
* Added to keep the byte[] key form consistent with the BitArray
* form. Can de deleted when byte[] key is deleted.
*/
+ @Deprecated
private int unusedBits = 0;
/* BitArray form of key */
--- a/jdk/src/share/classes/sun/text/resources/FormatData.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/text/resources/FormatData.java Tue Aug 20 17:44:18 2013 -0700
@@ -858,6 +858,9 @@
}
},
{ "DateTimePatternChars", "GyMdkHmsSEDFwWahKzZ" },
+
+ // Workaround for islamic-umalqura name support (JDK-8015986)
+ { "calendarname.islamic-umalqura", "Islamic Umm al-Qura Calendar" },
};
}
}
--- a/jdk/src/share/classes/sun/text/resources/ar/FormatData_ar.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/text/resources/ar/FormatData_ar.java Tue Aug 20 17:44:18 2013 -0700
@@ -264,6 +264,10 @@
}
},
{ "DateTimePatternChars", "GanjkHmsSEDFwWxhKzZ" },
+
+ // Workaround for islamic-umalqura name support (JDK-8015986)
+ { "calendarname.islamic-umalqura",
+ "\u0644\u062a\u0642\u0648\u064a\u0645 \u0627\u0644\u0647\u062c\u0631\u064a\u060c \u0623\u0645 \u0627\u0644\u0642\u0631\u0649" },
};
}
}
--- a/jdk/src/share/classes/sun/tools/jar/Main.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/jar/Main.java Tue Aug 20 17:44:18 2013 -0700
@@ -47,7 +47,7 @@
class Main {
String program;
PrintStream out, err;
- String fname, mname, ename, pname;
+ String fname, mname, ename;
String zname = "";
String[] files;
String rootjar = null;
@@ -78,9 +78,6 @@
static final String MANIFEST_DIR = "META-INF/";
static final String VERSION = "1.0";
- // valid values for Profile attribute
- private static final String[] PROFILES = { "compact1", "compact2", "compact3" };
-
private static ResourceBundle rsrc;
/**
@@ -187,14 +184,6 @@
if (ename != null) {
addMainClass(manifest, ename);
}
- if (pname != null) {
- if (!addProfileName(manifest, pname)) {
- if (in != null) {
- in.close();
- }
- return false;
- }
- }
}
OutputStream out;
if (fname != null) {
@@ -372,9 +361,6 @@
case 'e':
ename = args[count++];
break;
- case 'p':
- pname = args[count++];
- break;
default:
error(formatMsg("error.illegal.option",
String.valueOf(flags.charAt(i))));
@@ -424,7 +410,7 @@
usageError();
return false;
} else if (uflag) {
- if ((mname != null) || (ename != null) || (pname != null)) {
+ if ((mname != null) || (ename != null)) {
/* just want to update the manifest */
return true;
} else {
@@ -558,7 +544,7 @@
|| (Mflag && isManifestEntry)) {
continue;
} else if (isManifestEntry && ((newManifest != null) ||
- (ename != null) || (pname != null))) {
+ (ename != null))) {
foundManifest = true;
if (newManifest != null) {
// Don't read from the newManifest InputStream, as we
@@ -616,7 +602,7 @@
updateOk = false;
}
}
- } else if (ename != null || pname != null) {
+ } else if (ename != null) {
if (!updateManifest(new Manifest(), zos)) {
updateOk = false;
}
@@ -651,11 +637,6 @@
if (ename != null) {
addMainClass(m, ename);
}
- if (pname != null) {
- if (!addProfileName(m, pname)) {
- return false;
- }
- }
ZipEntry e = new ZipEntry(MANIFEST_NAME);
e.setTime(System.currentTimeMillis());
if (flag0) {
@@ -713,28 +694,6 @@
global.put(Attributes.Name.MAIN_CLASS, mainApp);
}
- private boolean addProfileName(Manifest m, String profile) {
- // check profile name
- boolean found = false;
- int i = 0;
- while (i < PROFILES.length) {
- if (profile.equals(PROFILES[i])) {
- found = true;
- break;
- }
- i++;
- }
- if (!found) {
- error(formatMsg("error.bad.pvalue", profile));
- return false;
- }
-
- // overrides any existing Profile attribute
- Attributes global = m.getMainAttributes();
- global.put(Attributes.Name.PROFILE, profile);
- return true;
- }
-
private boolean isAmbiguousMainClass(Manifest m) {
if (ename != null) {
Attributes global = m.getMainAttributes();
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar.properties Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar.properties Tue Aug 20 17:44:18 2013 -0700
@@ -36,8 +36,6 @@
error.bad.eflag=\
'e' flag and manifest with the 'Main-Class' attribute cannot be specified \n\
together!
-error.bad.pvalue=\
- bad value for 'Profile' attribute: {0}
error.nosuch.fileordir=\
{0} : no such file or directory
error.write.file=\
@@ -79,7 +77,6 @@
\ \ -m include manifest information from specified manifest file\n\
\ \ -e specify application entry point for stand-alone application \n\
\ \ bundled into an executable jar file\n\
-\ \ -p specify profile name\n\
\ \ -0 store only; use no ZIP compression\n\
\ \ -M do not create a manifest file for the entries\n\
\ \ -i generate index information for the specified jar files\n\
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/tools/jconsole/ExceptionSafePlugin.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package sun.tools.jconsole;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.SwingWorker;
+
+import com.sun.tools.jconsole.JConsolePlugin;
+
+/**
+ * Proxy that shields GUI from plug-in exceptions.
+ *
+ */
+final class ExceptionSafePlugin extends JConsolePlugin {
+
+ private static boolean ignoreExceptions;
+ private final JConsolePlugin plugin;
+
+ public ExceptionSafePlugin(JConsolePlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public Map<String, JPanel> getTabs() {
+ try {
+ return plugin.getTabs();
+ } catch (RuntimeException e) {
+ handleException(e);
+ }
+ return new HashMap<>();
+ }
+
+ @Override
+ public SwingWorker<?, ?> newSwingWorker() {
+ try {
+ return plugin.newSwingWorker();
+ } catch (RuntimeException e) {
+ handleException(e);
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ try {
+ plugin.dispose();
+ } catch (RuntimeException e) {
+ handleException(e);
+ }
+ }
+
+ public void executeSwingWorker(SwingWorker<?, ?> sw) {
+ try {
+ sw.execute();
+ } catch (RuntimeException e) {
+ handleException(e);
+ }
+ }
+
+ private void handleException(Exception e) {
+ if (JConsole.isDebug()) {
+ System.err.println("Plug-in exception:");
+ e.printStackTrace();
+ } else {
+ if (!ignoreExceptions) {
+ showExceptionDialog(e);
+ }
+ }
+ }
+
+ private void showExceptionDialog(Exception e) {
+ Object[] buttonTexts = {
+ Messages.PLUGIN_EXCEPTION_DIALOG_BUTTON_OK,
+ Messages.PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT,
+ Messages.PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE
+ };
+
+ String message = String.format(
+ Messages.PLUGIN_EXCEPTION_DIALOG_MESSAGE,
+ plugin.getClass().getSimpleName(),
+ String.valueOf(e.getMessage())
+ );
+
+ int buttonIndex = JOptionPane.showOptionDialog(
+ null,
+ message,
+ Messages.PLUGIN_EXCEPTION_DIALOG_TITLE,
+ JOptionPane.YES_NO_CANCEL_OPTION,
+ JOptionPane.ERROR_MESSAGE,
+ null,
+ buttonTexts,
+ buttonTexts[0]
+ );
+
+ if (buttonIndex == 1) {
+ System.exit(0);
+ }
+ ignoreExceptions = buttonIndex == 2;
+ }
+}
--- a/jdk/src/share/classes/sun/tools/jconsole/MemoryTab.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/jconsole/MemoryTab.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -228,6 +228,7 @@
if (ev.getStateChange() == ItemEvent.SELECTED) {
Plotter plotter = (Plotter)plotterChoice.getSelectedItem();
plotterPanel.setPlotter(plotter);
+ plotterPanel.repaint();
}
}
--- a/jdk/src/share/classes/sun/tools/jconsole/Messages.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/jconsole/Messages.java Tue Aug 20 17:44:18 2013 -0700
@@ -240,6 +240,11 @@
public static String PLOTTER_ACCESSIBLE_NAME_NO_DATA;
public static String PLOTTER_SAVE_AS_MENU_ITEM;
public static String PLOTTER_TIME_RANGE_MENU;
+ public static String PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT;
+ public static String PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE;
+ public static String PLUGIN_EXCEPTION_DIALOG_BUTTON_OK;
+ public static String PLUGIN_EXCEPTION_DIALOG_MESSAGE;
+ public static String PLUGIN_EXCEPTION_DIALOG_TITLE;
public static String PROBLEM_ADDING_LISTENER;
public static String PROBLEM_DISPLAYING_MBEAN;
public static String PROBLEM_INVOKING;
--- a/jdk/src/share/classes/sun/tools/jconsole/VMPanel.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/jconsole/VMPanel.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -71,7 +71,7 @@
// Each VMPanel has its own instance of the JConsolePlugin
// A map of JConsolePlugin to the previous SwingWorker
- private Map<JConsolePlugin, SwingWorker<?, ?>> plugins = null;
+ private Map<ExceptionSafePlugin, SwingWorker<?, ?>> plugins = null;
private boolean pluginTabsAdded = false;
// Update these only on the EDT
@@ -107,10 +107,10 @@
}
}
- plugins = new LinkedHashMap<JConsolePlugin, SwingWorker<?, ?>>();
+ plugins = new LinkedHashMap<ExceptionSafePlugin, SwingWorker<?, ?>>();
for (JConsolePlugin p : JConsole.getPlugins()) {
p.setContext(proxyClient);
- plugins.put(p, null);
+ plugins.put(new ExceptionSafePlugin(p), null);
}
Utilities.updateTransparency(this);
@@ -566,7 +566,7 @@
}
// plugin GUI update
- for (JConsolePlugin p : plugins.keySet()) {
+ for (ExceptionSafePlugin p : plugins.keySet()) {
SwingWorker<?, ?> sw = p.newSwingWorker();
SwingWorker<?, ?> prevSW = plugins.get(p);
// schedule SwingWorker to run only if the previous
@@ -575,7 +575,7 @@
if (sw == null || sw.getState() == SwingWorker.StateValue.PENDING) {
plugins.put(p, sw);
if (sw != null) {
- sw.execute();
+ p.executeSwingWorker(sw);
}
}
}
--- a/jdk/src/share/classes/sun/tools/jconsole/resources/messages.properties Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/jconsole/resources/messages.properties Tue Aug 20 17:44:18 2013 -0700
@@ -137,14 +137,14 @@
MBEANS=MBeans
MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON=&Clear
MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON_TOOLTIP=Clear notifications
-MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=Composite Navigation {0}/{1}
-MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=Composite Navigation
+MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=Composite Data Navigation {0}/{1}
+MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=Composite Data Navigation
MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON=&Refresh
MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON_TOOLTIP=Refresh attributes
MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON=&Subscribe
MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=Start listening for notifications
-MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=Tabular Navigation {0}/{1}
-MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=Tabular Navigation
+MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=Tabular Data Navigation {0}/{1}
+MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=Tabular Data Navigation
MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON=&Unsubscribe
MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=Stop listening for notifications
MANAGE_HOTSPOT_MBEANS_IN_COLON_=Manage Hotspot MBeans in:
@@ -198,6 +198,11 @@
PLOTTER_ACCESSIBLE_NAME_NO_DATA=No data plotted.
PLOTTER_SAVE_AS_MENU_ITEM=Save data &as...
PLOTTER_TIME_RANGE_MENU=&Time Range
+PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT=Exit
+PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE=Ignore
+PLUGIN_EXCEPTION_DIALOG_BUTTON_OK=OK
+PLUGIN_EXCEPTION_DIALOG_MESSAGE=An unexpected exception has occurred in %s:\n\n%s\n\nStart with -debug for details. Ignore will suppress further exceptions.
+PLUGIN_EXCEPTION_DIALOG_TITLE=Plug-in exception
PROBLEM_ADDING_LISTENER=Problem adding listener
PROBLEM_DISPLAYING_MBEAN=Problem displaying MBean
PROBLEM_INVOKING=Problem invoking
--- a/jdk/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -35,4 +35,5 @@
# This notice and attribution to Taligent may not be removed.
# Taligent is a registered trademark of Taligent, Inc.
+EUR=\u20AC
LVL=Ls
--- a/jdk/src/share/lib/security/java.security-linux Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/lib/security/java.security-linux Tue Aug 20 17:44:18 2013 -0700
@@ -132,7 +132,7 @@
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
-login.configuration.provider=com.sun.security.auth.login.ConfigFile
+login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
--- a/jdk/src/share/lib/security/java.security-macosx Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/lib/security/java.security-macosx Tue Aug 20 17:44:18 2013 -0700
@@ -133,7 +133,7 @@
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
-login.configuration.provider=com.sun.security.auth.login.ConfigFile
+login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
--- a/jdk/src/share/lib/security/java.security-solaris Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/lib/security/java.security-solaris Tue Aug 20 17:44:18 2013 -0700
@@ -134,7 +134,7 @@
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
-login.configuration.provider=com.sun.security.auth.login.ConfigFile
+login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
--- a/jdk/src/share/lib/security/java.security-windows Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/lib/security/java.security-windows Tue Aug 20 17:44:18 2013 -0700
@@ -133,7 +133,7 @@
# Class to instantiate as the javax.security.auth.login.Configuration
# provider.
#
-login.configuration.provider=com.sun.security.auth.login.ConfigFile
+login.configuration.provider=sun.security.provider.ConfigFile
#
# Default login configuration file
--- a/jdk/src/share/native/java/io/RandomAccessFile.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/native/java/io/RandomAccessFile.c Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -123,7 +123,7 @@
}
JNIEXPORT void JNICALL
-Java_java_io_RandomAccessFile_seek(JNIEnv *env,
+Java_java_io_RandomAccessFile_seek0(JNIEnv *env,
jobject this, jlong pos) {
FD fd;
--- a/jdk/src/share/native/sun/security/krb5/nativeccache.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/share/native/sun/security/krb5/nativeccache.c Tue Aug 20 17:44:18 2013 -0700
@@ -264,13 +264,21 @@
}
+int isIn(krb5_enctype e, int n, jint* etypes)
+{
+ int i;
+ for (i=0; i<n; i++) {
+ if (e == etypes[i]) return 1;
+ }
+ return 0;
+}
/*
* Class: sun_security_krb5_Credentials
* Method: acquireDefaultNativeCreds
- * Signature: ()Lsun/security/krb5/Credentials;
+ * Signature: ([I])Lsun/security/krb5/Credentials;
*/
JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativeCreds
-(JNIEnv *env, jclass krbcredsClass)
+(JNIEnv *env, jclass krbcredsClass, jintArray jetypes)
{
jobject krbCreds = NULL;
krb5_error_code err = 0;
@@ -280,6 +288,9 @@
krb5_flags flags = 0;
krb5_context kcontext = NULL;
+ int netypes;
+ jint *etypes = NULL;
+
/* Initialize the Kerberos 5 context */
err = krb5_init_context (&kcontext);
@@ -295,6 +306,9 @@
err = krb5_cc_start_seq_get (kcontext, ccache, &cursor);
}
+ netypes = (*env)->GetArrayLength(env, jetypes);
+ etypes = (jint *) (*env)->GetIntArrayElements(env, jetypes, NULL);
+
if (!err) {
while ((err = krb5_cc_next_cred (kcontext, ccache, &cursor, &creds)) == 0) {
char *serverName = NULL;
@@ -305,7 +319,8 @@
}
if (!err) {
- if (strncmp (serverName, "krbtgt", strlen("krbtgt")) == 0) {
+ if (strncmp (serverName, "krbtgt", sizeof("krbtgt")-1) == 0 &&
+ isIn(creds.keyblock.enctype, netypes, etypes)) {
jobject ticket, clientPrincipal, targetPrincipal, encryptionKey;
jobject ticketFlags, startTime, endTime;
jobject authTime, renewTillTime, hostAddresses;
@@ -321,7 +336,7 @@
targetPrincipal = BuildClientPrincipal(env, kcontext, creds.server);
if (targetPrincipal == NULL) goto cleanup;
- // Build a com.ibm.security.krb5.Ticket
+ // Build a sun/security/krb5/internal/Ticket
ticket = BuildTicket(env, &creds.ticket);
if (ticket == NULL) goto cleanup;
@@ -353,7 +368,7 @@
krbcredsConstructor = (*env)->GetMethodID(env, krbcredsClass, "<init>",
"(Lsun/security/krb5/internal/Ticket;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/EncryptionKey;Lsun/security/krb5/internal/TicketFlags;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/HostAddresses;)V");
if (krbcredsConstructor == 0) {
- printf("Couldn't find com.ibm.security.krb5.Credentials constructor\n");
+ printf("Couldn't find sun.security.krb5.internal.Ticket constructor\n");
break;
}
}
@@ -409,6 +424,10 @@
printiferr (err, "while finishing ticket retrieval");
}
+ if (etypes != NULL) {
+ (*env)->ReleaseIntArrayElements(env, jetypes, etypes, 0);
+ }
+
krb5_free_context (kcontext);
return krbCreds;
}
--- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Aug 20 17:44:18 2013 -0700
@@ -64,11 +64,59 @@
private /* final */ InputStream stdout;
private /* final */ InputStream stderr;
+ private static enum LaunchMechanism {
+ FORK(1),
+ POSIX_SPAWN(2);
+
+ private int value;
+ LaunchMechanism(int x) {value = x;}
+ };
+
+ /* On BSD, the default is to spawn */
+ private static final LaunchMechanism launchMechanism;
+ private static byte[] helperpath;
+
+ private static byte[] toCString(String s) {
+ if (s == null)
+ return null;
+ byte[] bytes = s.getBytes();
+ byte[] result = new byte[bytes.length + 1];
+ System.arraycopy(bytes, 0,
+ result, 0,
+ bytes.length);
+ result[result.length-1] = (byte)0;
+ return result;
+ }
+
+ static {
+ launchMechanism = AccessController.doPrivileged(
+ new PrivilegedAction<LaunchMechanism>()
+ {
+ public LaunchMechanism run() {
+ String javahome = System.getProperty("java.home");
+
+ helperpath = toCString(javahome + "/lib/jspawnhelper");
+ String s = System.getProperty(
+ "jdk.lang.Process.launchMechanism", "posix_spawn");
+
+ try {
+ return LaunchMechanism.valueOf(s.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ throw new Error(s + " is not a supported " +
+ "process launch mechanism on this platform.");
+ }
+ }
+ });
+ }
+
/* this is for the reaping thread */
private native int waitForProcessExit(int pid);
/**
- * Create a process using fork(2) and exec(2).
+ * Create a process. Depending on the mode flag, this is done by
+ * one of the following mechanisms.
+ * - fork(2) and exec(2)
+ * - posix_spawn(2)
*
* @param fds an array of three file descriptors.
* Indexes 0, 1, and 2 correspond to standard input,
@@ -81,7 +129,8 @@
* output.
* @return the pid of the subprocess
*/
- private native int forkAndExec(byte[] prog,
+ private native int forkAndExec(int mode, byte[] helperpath,
+ byte[] prog,
byte[] argBlock, int argc,
byte[] envBlock, int envc,
byte[] dir,
@@ -133,7 +182,9 @@
final boolean redirectErrorStream)
throws IOException {
- pid = forkAndExec(prog,
+ pid = forkAndExec(launchMechanism.value,
+ helperpath,
+ prog,
argBlock, argc,
envBlock, envc,
dir,
@@ -212,13 +263,13 @@
}
return exitcode;
}
-
+
@Override
- public synchronized boolean waitFor(long timeout, TimeUnit unit)
- throws InterruptedException
+ public synchronized boolean waitFor(long timeout, TimeUnit unit)
+ throws InterruptedException
{
if (hasExited) return true;
- if (timeout <= 0) return false;
+ if (timeout <= 0) return false;
long timeoutAsNanos = unit.toNanos(timeout);
long startTime = System.nanoTime();
--- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Aug 20 17:44:18 2013 -0700
@@ -64,11 +64,61 @@
private /* final */ InputStream stdout;
private /* final */ InputStream stderr;
+ private static enum LaunchMechanism {
+ FORK(1),
+ VFORK(3);
+
+ private int value;
+ LaunchMechanism(int x) {value = x;}
+ };
+
+ /* default is VFORK on Linux */
+ private static final LaunchMechanism launchMechanism;
+ private static byte[] helperpath;
+
+ private static byte[] toCString(String s) {
+ if (s == null)
+ return null;
+ byte[] bytes = s.getBytes();
+ byte[] result = new byte[bytes.length + 1];
+ System.arraycopy(bytes, 0,
+ result, 0,
+ bytes.length);
+ result[result.length-1] = (byte)0;
+ return result;
+ }
+
+ static {
+ launchMechanism = AccessController.doPrivileged(
+ new PrivilegedAction<LaunchMechanism>()
+ {
+ public LaunchMechanism run() {
+ String javahome = System.getProperty("java.home");
+ String osArch = System.getProperty("os.arch");
+
+ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
+ String s = System.getProperty(
+ "jdk.lang.Process.launchMechanism", "vfork");
+
+ try {
+ return LaunchMechanism.valueOf(s.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ throw new Error(s + " is not a supported " +
+ "process launch mechanism on this platform.");
+ }
+ }
+ });
+ }
+
/* this is for the reaping thread */
private native int waitForProcessExit(int pid);
/**
- * Create a process using fork(2) and exec(2).
+ * Create a process. Depending on the mode flag, this is done by
+ * one of the following mechanisms.
+ * - fork(2) and exec(2)
+ * - clone(2) and exec(2)
+ * - vfork(2) and exec(2)
*
* @param fds an array of three file descriptors.
* Indexes 0, 1, and 2 correspond to standard input,
@@ -81,7 +131,8 @@
* output.
* @return the pid of the subprocess
*/
- private native int forkAndExec(byte[] prog,
+ private native int forkAndExec(int mode, byte[] helperpath,
+ byte[] prog,
byte[] argBlock, int argc,
byte[] envBlock, int envc,
byte[] dir,
@@ -133,7 +184,9 @@
final boolean redirectErrorStream)
throws IOException {
- pid = forkAndExec(prog,
+ pid = forkAndExec(launchMechanism.value,
+ helperpath,
+ prog,
argBlock, argc,
envBlock, envc,
dir,
--- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Aug 20 17:44:18 2013 -0700
@@ -27,6 +27,8 @@
import java.io.*;
import java.util.concurrent.TimeUnit;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
/* java.lang.Process subclass in the UNIX environment.
*
@@ -46,11 +48,65 @@
private DeferredCloseInputStream stdout_inner_stream;
private InputStream stderr_stream;
+ private static enum LaunchMechanism {
+ FORK(1),
+ POSIX_SPAWN(2);
+
+ private int value;
+ LaunchMechanism(int x) {value = x;}
+ };
+
+ /* On Solaris, the default is to spawn */
+ private static final LaunchMechanism launchMechanism;
+ private static byte[] helperpath;
+
+ private static byte[] toCString(String s) {
+ if (s == null)
+ return null;
+ byte[] bytes = s.getBytes();
+ byte[] result = new byte[bytes.length + 1];
+ System.arraycopy(bytes, 0,
+ result, 0,
+ bytes.length);
+ result[result.length-1] = (byte)0;
+ return result;
+ }
+
+ static {
+ launchMechanism = AccessController.doPrivileged(
+ new PrivilegedAction<LaunchMechanism>()
+ {
+ public LaunchMechanism run() {
+ String javahome = System.getProperty("java.home");
+ String osArch = System.getProperty("os.arch");
+ if (osArch.equals("x86")) {
+ osArch = "i386";
+ } else if (osArch.equals("x86_64")) {
+ osArch = "amd64";
+ }
+
+ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
+ String s = System.getProperty(
+ "jdk.lang.Process.launchMechanism", "posix_spawn");
+
+ try {
+ return LaunchMechanism.valueOf(s.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ throw new Error(s + " is not a supported " +
+ "process launch mechanism on this platform.");
+ }
+ }
+ });
+ }
+
/* this is for the reaping thread */
private native int waitForProcessExit(int pid);
/**
- * Create a process using fork(2) and exec(2).
+ * Create a process. Depending on the mode flag, this is done by
+ * one of the following mechanisms.
+ * - fork(2) and exec(2)
+ * - posix_spawn(2)
*
* @param std_fds array of file descriptors. Indexes 0, 1, and
* 2 correspond to standard input, standard output and
@@ -62,7 +118,8 @@
* if and only if it is <em>not</em> -1 on output.
* @return the pid of the subprocess
*/
- private native int forkAndExec(byte[] prog,
+ private native int forkAndExec(int mode, byte[] helperpath,
+ byte[] prog,
byte[] argBlock, int argc,
byte[] envBlock, int envc,
byte[] dir,
@@ -77,7 +134,9 @@
final int[] std_fds,
final boolean redirectErrorStream)
throws IOException {
- pid = forkAndExec(prog,
+ pid = forkAndExec(launchMechanism.value,
+ helperpath,
+ prog,
argBlock, argc,
envBlock, envc,
dir,
--- a/jdk/src/solaris/classes/sun/print/AttributeClass.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/solaris/classes/sun/print/AttributeClass.java Tue Aug 20 17:44:18 2013 -0700
@@ -24,6 +24,7 @@
*/
package sun.print;
+import java.util.Objects;
import java.io.ByteArrayInputStream;
public class AttributeClass {
@@ -248,11 +249,24 @@
return myName;
}
+ @Override
public boolean equals(Object obj) {
- return
- obj != null &&
- obj instanceof AttributeClass &&
- obj.toString().equals (((AttributeClass) obj).toString());
+ if (!(obj instanceof AttributeClass)) {
+ return false;
+ }
+ if (this == obj) {
+ return true;
+ }
+
+ AttributeClass acObj = (AttributeClass) obj;
+ return myType == acObj.getType() &&
+ Objects.equals(myName, acObj.getName()) &&
+ Objects.equals(myValue, acObj.getObjectValue());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(myType, myName, myValue);
}
public String toString() {
--- a/jdk/src/solaris/native/java/lang/UNIXProcess_md.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/solaris/native/java/lang/UNIXProcess_md.c Tue Aug 20 17:44:18 2013 -0700
@@ -43,32 +43,15 @@
#include <sys/wait.h>
#include <signal.h>
#include <string.h>
-#include <errno.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <limits.h>
-#ifdef __APPLE__
-#include <crt_externs.h>
-#define environ (*_NSGetEnviron())
-#else
-/* This is one of the rare times it's more portable to declare an
- * external symbol explicitly, rather than via a system header.
- * The declaration is standardized as part of UNIX98, but there is
- * no standard (not even de-facto) header file where the
- * declaration is to be found. See:
- * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
- * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
- *
- * "All identifiers in this volume of IEEE Std 1003.1-2001, except
- * environ, are defined in at least one of the headers" (!)
- */
-extern char **environ;
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
+#include <spawn.h>
#endif
+#include "childproc.h"
+
/*
- * There are 3 possible strategies we might use to "fork":
+ * There are 4 possible strategies we might use to "fork":
*
* - fork(2). Very portable and reliable but subject to
* failure due to overcommit (see the documentation on
@@ -103,68 +86,21 @@
* http://sources.redhat.com/bugzilla/show_bug.cgi?id=10311
* but the glibc maintainers closed it as WONTFIX.
*
+ * - posix_spawn(). While posix_spawn() is a fairly elaborate and
+ * complicated system call, it can't quite do everything that the old
+ * fork()/exec() combination can do, so the only feasible way to do
+ * this, is to use posix_spawn to launch a new helper executable
+ * "jprochelper", which in turn execs the target (after cleaning
+ * up file-descriptors etc.) The end result is the same as before,
+ * a child process linked to the parent in the same way, but it
+ * avoids the problem of duplicating the parent (VM) process
+ * address space temporarily, before launching the target command.
+ *
* Based on the above analysis, we are currently using vfork() on
- * Linux and fork() on other Unix systems, but the code to use clone()
- * remains.
+ * Linux and spawn() on other Unix systems, but the code to use clone()
+ * and fork() remains.
*/
-#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
-
-#ifndef START_CHILD_USE_CLONE
- #ifdef __linux__
- #define START_CHILD_USE_CLONE 1
- #else
- #define START_CHILD_USE_CLONE 0
- #endif
-#endif
-
-/* By default, use vfork() on Linux. */
-#ifndef START_CHILD_USE_VFORK
- #ifdef __linux__
- #define START_CHILD_USE_VFORK 1
- #else
- #define START_CHILD_USE_VFORK 0
- #endif
-#endif
-
-#if START_CHILD_USE_CLONE
-#include <sched.h>
-#define START_CHILD_SYSTEM_CALL "clone"
-#elif START_CHILD_USE_VFORK
-#define START_CHILD_SYSTEM_CALL "vfork"
-#else
-#define START_CHILD_SYSTEM_CALL "fork"
-#endif
-
-#ifndef STDIN_FILENO
-#define STDIN_FILENO 0
-#endif
-
-#ifndef STDOUT_FILENO
-#define STDOUT_FILENO 1
-#endif
-
-#ifndef STDERR_FILENO
-#define STDERR_FILENO 2
-#endif
-
-#ifndef SA_NOCLDSTOP
-#define SA_NOCLDSTOP 0
-#endif
-
-#ifndef SA_RESTART
-#define SA_RESTART 0
-#endif
-
-#define FAIL_FILENO (STDERR_FILENO + 1)
-
-/* TODO: Refactor. */
-#define RESTARTABLE(_cmd, _result) do { \
- do { \
- _result = _cmd; \
- } while((_result == -1) && (errno == EINTR)); \
-} while(0)
-
static void
setSIGCHLDHandler(JNIEnv *env)
@@ -266,17 +202,10 @@
return pathv;
}
-/**
- * The cached and split version of the JDK's effective PATH.
- * (We don't support putenv("PATH=...") in native code)
- */
-static const char * const *parentPathv;
-
JNIEXPORT void JNICALL
Java_java_lang_UNIXProcess_init(JNIEnv *env, jclass clazz)
{
parentPathv = effectivePathv(env);
-
setSIGCHLDHandler(env);
}
@@ -343,96 +272,6 @@
}
}
-static ssize_t
-restartableWrite(int fd, const void *buf, size_t count)
-{
- ssize_t result;
- RESTARTABLE(write(fd, buf, count), result);
- return result;
-}
-
-static int
-restartableDup2(int fd_from, int fd_to)
-{
- int err;
- RESTARTABLE(dup2(fd_from, fd_to), err);
- return err;
-}
-
-static int
-restartableClose(int fd)
-{
- int err;
- RESTARTABLE(close(fd), err);
- return err;
-}
-
-static int
-closeSafely(int fd)
-{
- return (fd == -1) ? 0 : restartableClose(fd);
-}
-
-static int
-isAsciiDigit(char c)
-{
- return c >= '0' && c <= '9';
-}
-
-#ifdef _ALLBSD_SOURCE
-#define FD_DIR "/dev/fd"
-#define dirent64 dirent
-#define readdir64 readdir
-#else
-#define FD_DIR "/proc/self/fd"
-#endif
-
-static int
-closeDescriptors(void)
-{
- DIR *dp;
- struct dirent64 *dirp;
- int from_fd = FAIL_FILENO + 1;
-
- /* We're trying to close all file descriptors, but opendir() might
- * itself be implemented using a file descriptor, and we certainly
- * don't want to close that while it's in use. We assume that if
- * opendir() is implemented using a file descriptor, then it uses
- * the lowest numbered file descriptor, just like open(). So we
- * close a couple explicitly. */
-
- restartableClose(from_fd); /* for possible use by opendir() */
- restartableClose(from_fd + 1); /* another one for good luck */
-
- if ((dp = opendir(FD_DIR)) == NULL)
- return 0;
-
- /* We use readdir64 instead of readdir to work around Solaris bug
- * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
- */
- while ((dirp = readdir64(dp)) != NULL) {
- int fd;
- if (isAsciiDigit(dirp->d_name[0]) &&
- (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
- restartableClose(fd);
- }
-
- closedir(dp);
-
- return 1;
-}
-
-static int
-moveDescriptor(int fd_from, int fd_to)
-{
- if (fd_from != fd_to) {
- if ((restartableDup2(fd_from, fd_to) == -1) ||
- (restartableClose(fd_from) == -1))
- return -1;
- }
- return 0;
-}
-
static const char *
getBytes(JNIEnv *env, jbyteArray arr)
{
@@ -448,19 +287,6 @@
}
static void
-initVectorFromBlock(const char**vector, const char* block, int count)
-{
- int i;
- const char *p;
- for (i = 0, p = block; i < count; i++) {
- /* Invariant: p always points to the start of a C string. */
- vector[i] = p;
- while (*(p++));
- }
- vector[count] = NULL;
-}
-
-static void
throwIOException(JNIEnv *env, int errnum, const char *defaultDetail)
{
static const char * const format = "error=%d, %s";
@@ -503,182 +329,6 @@
}
#endif /* DEBUG_PROCESS */
-/**
- * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
- * If we could do it over again, we would probably not support such an ancient
- * misfeature, but compatibility wins over sanity. The original support for
- * this was imported accidentally from execvp().
- */
-static void
-execve_as_traditional_shell_script(const char *file,
- const char *argv[],
- const char *const envp[])
-{
- /* Use the extra word of space provided for us in argv by caller. */
- const char *argv0 = argv[0];
- const char *const *end = argv;
- while (*end != NULL)
- ++end;
- memmove(argv+2, argv+1, (end-argv) * sizeof (*end));
- argv[0] = "/bin/sh";
- argv[1] = file;
- execve(argv[0], (char **) argv, (char **) envp);
- /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
- memmove(argv+1, argv+2, (end-argv) * sizeof (*end));
- argv[0] = argv0;
-}
-
-/**
- * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
- * be a shell script and the system default shell is invoked to run it.
- */
-static void
-execve_with_shell_fallback(const char *file,
- const char *argv[],
- const char *const envp[])
-{
-#if START_CHILD_USE_CLONE || START_CHILD_USE_VFORK
- /* shared address space; be very careful. */
- execve(file, (char **) argv, (char **) envp);
- if (errno == ENOEXEC)
- execve_as_traditional_shell_script(file, argv, envp);
-#else
- /* unshared address space; we can mutate environ. */
- environ = (char **) envp;
- execvp(file, (char **) argv);
-#endif
-}
-
-/**
- * 'execvpe' should have been included in the Unix standards,
- * and is a GNU extension in glibc 2.10.
- *
- * JDK_execvpe is identical to execvp, except that the child environment is
- * specified via the 3rd argument instead of being inherited from environ.
- */
-static void
-JDK_execvpe(const char *file,
- const char *argv[],
- const char *const envp[])
-{
- if (envp == NULL || (char **) envp == environ) {
- execvp(file, (char **) argv);
- return;
- }
-
- if (*file == '\0') {
- errno = ENOENT;
- return;
- }
-
- if (strchr(file, '/') != NULL) {
- execve_with_shell_fallback(file, argv, envp);
- } else {
- /* We must search PATH (parent's, not child's) */
- char expanded_file[PATH_MAX];
- int filelen = strlen(file);
- int sticky_errno = 0;
- const char * const * dirs;
- for (dirs = parentPathv; *dirs; dirs++) {
- const char * dir = *dirs;
- int dirlen = strlen(dir);
- if (filelen + dirlen + 2 >= PATH_MAX) {
- errno = ENAMETOOLONG;
- continue;
- }
- memcpy(expanded_file, dir, dirlen);
- if (expanded_file[dirlen - 1] != '/')
- expanded_file[dirlen++] = '/';
- memcpy(expanded_file + dirlen, file, filelen);
- expanded_file[dirlen + filelen] = '\0';
- execve_with_shell_fallback(expanded_file, argv, envp);
- /* There are 3 responses to various classes of errno:
- * return immediately, continue (especially for ENOENT),
- * or continue with "sticky" errno.
- *
- * From exec(3):
- *
- * If permission is denied for a file (the attempted
- * execve returned EACCES), these functions will continue
- * searching the rest of the search path. If no other
- * file is found, however, they will return with the
- * global variable errno set to EACCES.
- */
- switch (errno) {
- case EACCES:
- sticky_errno = errno;
- /* FALLTHRU */
- case ENOENT:
- case ENOTDIR:
-#ifdef ELOOP
- case ELOOP:
-#endif
-#ifdef ESTALE
- case ESTALE:
-#endif
-#ifdef ENODEV
- case ENODEV:
-#endif
-#ifdef ETIMEDOUT
- case ETIMEDOUT:
-#endif
- break; /* Try other directories in PATH */
- default:
- return;
- }
- }
- if (sticky_errno != 0)
- errno = sticky_errno;
- }
-}
-
-/*
- * Reads nbyte bytes from file descriptor fd into buf,
- * The read operation is retried in case of EINTR or partial reads.
- *
- * Returns number of bytes read (normally nbyte, but may be less in
- * case of EOF). In case of read errors, returns -1 and sets errno.
- */
-static ssize_t
-readFully(int fd, void *buf, size_t nbyte)
-{
- ssize_t remaining = nbyte;
- for (;;) {
- ssize_t n = read(fd, buf, remaining);
- if (n == 0) {
- return nbyte - remaining;
- } else if (n > 0) {
- remaining -= n;
- if (remaining <= 0)
- return nbyte;
- /* We were interrupted in the middle of reading the bytes.
- * Unlikely, but possible. */
- buf = (void *) (((char *)buf) + n);
- } else if (errno == EINTR) {
- /* Strange signals like SIGJVM1 are possible at any time.
- * See http://www.dreamsongs.com/WorseIsBetter.html */
- } else {
- return -1;
- }
- }
-}
-
-typedef struct _ChildStuff
-{
- int in[2];
- int out[2];
- int err[2];
- int fail[2];
- int fds[3];
- const char **argv;
- const char **envv;
- const char *pdir;
- jboolean redirectErrorStream;
-#if START_CHILD_USE_CLONE
- void *clone_stack;
-#endif
-} ChildStuff;
-
static void
copyPipe(int from[2], int to[2])
{
@@ -686,97 +336,67 @@
to[1] = from[1];
}
-/**
- * Child process after a successful fork() or clone().
- * This function must not return, and must be prepared for either all
- * of its address space to be shared with its parent, or to be a copy.
- * It must not modify global variables such as "environ".
+/* arg is an array of pointers to 0 terminated strings. array is terminated
+ * by a null element.
+ *
+ * *nelems and *nbytes receive the number of elements of array (incl 0)
+ * and total number of bytes (incl. 0)
+ * Note. An empty array will have one null element
+ * But if arg is null, then *nelems set to 0, and *nbytes to 0
*/
-static int
-childProcess(void *arg)
+static void arraysize(const char * const *arg, int *nelems, int *nbytes)
{
- const ChildStuff* p = (const ChildStuff*) arg;
-
- /* Close the parent sides of the pipes.
- Closing pipe fds here is redundant, since closeDescriptors()
- would do it anyways, but a little paranoia is a good thing. */
- if ((closeSafely(p->in[1]) == -1) ||
- (closeSafely(p->out[0]) == -1) ||
- (closeSafely(p->err[0]) == -1) ||
- (closeSafely(p->fail[0]) == -1))
- goto WhyCantJohnnyExec;
-
- /* Give the child sides of the pipes the right fileno's. */
- /* Note: it is possible for in[0] == 0 */
- if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
- STDIN_FILENO) == -1) ||
- (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
- STDOUT_FILENO) == -1))
- goto WhyCantJohnnyExec;
-
- if (p->redirectErrorStream) {
- if ((closeSafely(p->err[1]) == -1) ||
- (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
- goto WhyCantJohnnyExec;
- } else {
- if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
- STDERR_FILENO) == -1)
- goto WhyCantJohnnyExec;
+ int i, bytes, count;
+ const char * const *a = arg;
+ char *p;
+ int *q;
+ if (arg == 0) {
+ *nelems = 0;
+ *nbytes = 0;
+ return;
}
+ /* count the array elements and number of bytes */
+ for (count=0, bytes=0; *a != 0; count++, a++) {
+ bytes += strlen(*a)+1;
+ }
+ *nbytes = bytes;
+ *nelems = count+1;
+}
- if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
- goto WhyCantJohnnyExec;
-
- /* close everything */
- if (closeDescriptors() == 0) { /* failed, close the old way */
- int max_fd = (int)sysconf(_SC_OPEN_MAX);
- int fd;
- for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
- if (restartableClose(fd) == -1 && errno != EBADF)
- goto WhyCantJohnnyExec;
- }
-
- /* change to the new working directory */
- if (p->pdir != NULL && chdir(p->pdir) < 0)
- goto WhyCantJohnnyExec;
-
- if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
- goto WhyCantJohnnyExec;
+/* copy the strings from arg[] into buf, starting at given offset
+ * return new offset to next free byte
+ */
+static int copystrings(char *buf, int offset, const char * const *arg) {
+ char *p;
+ const char * const *a;
+ int count=0;
- JDK_execvpe(p->argv[0], p->argv, p->envv);
-
- WhyCantJohnnyExec:
- /* We used to go to an awful lot of trouble to predict whether the
- * child would fail, but there is no reliable way to predict the
- * success of an operation without *trying* it, and there's no way
- * to try a chdir or exec in the parent. Instead, all we need is a
- * way to communicate any failure back to the parent. Easy; we just
- * send the errno back to the parent over a pipe in case of failure.
- * The tricky thing is, how do we communicate the *success* of exec?
- * We use FD_CLOEXEC together with the fact that a read() on a pipe
- * yields EOF when the write ends (we have two of them!) are closed.
- */
- {
- int errnum = errno;
- restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
+ if (arg == 0) {
+ return offset;
}
- restartableClose(FAIL_FILENO);
- _exit(-1);
- return 0; /* Suppress warning "no return value from function" */
+ for (p=buf+offset, a=arg; *a != 0; a++) {
+ int len = strlen(*a) +1;
+ memcpy(p, *a, len);
+ p += len;
+ count += len;
+ }
+ return offset+count;
}
/**
- * Start a child process running function childProcess.
- * This function only returns in the parent.
* We are unusually paranoid; use of clone/vfork is
* especially likely to tickle gcc/glibc bugs.
*/
#ifdef __attribute_noinline__ /* See: sys/cdefs.h */
__attribute_noinline__
#endif
+
+#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
+
+#ifdef START_CHILD_USE_CLONE
static pid_t
-startChild(ChildStuff *c) {
-#if START_CHILD_USE_CLONE
+cloneChild(ChildStuff *c) {
+#ifdef __linux__
#define START_CHILD_CLONE_STACK_SIZE (64 * 1024)
/*
* See clone(2).
@@ -790,33 +410,161 @@
c->clone_stack + START_CHILD_CLONE_STACK_SIZE,
CLONE_VFORK | CLONE_VM | SIGCHLD, c);
#else
- #if START_CHILD_USE_VFORK
+/* not available on Solaris / Mac */
+ assert(0);
+ return -1;
+#endif
+}
+#endif
+
+static pid_t
+vforkChild(ChildStuff *c) {
+ volatile pid_t resultPid;
+
/*
* We separate the call to vfork into a separate function to make
* very sure to keep stack of child from corrupting stack of parent,
* as suggested by the scary gcc warning:
* warning: variable 'foo' might be clobbered by 'longjmp' or 'vfork'
*/
- volatile pid_t resultPid = vfork();
- #else
+ resultPid = vfork();
+
+ if (resultPid == 0) {
+ childProcess(c);
+ }
+ assert(resultPid != 0); /* childProcess never returns */
+ return resultPid;
+}
+
+static pid_t
+forkChild(ChildStuff *c) {
+ pid_t resultPid;
+
/*
* From Solaris fork(2): In Solaris 10, a call to fork() is
* identical to a call to fork1(); only the calling thread is
* replicated in the child process. This is the POSIX-specified
* behavior for fork().
*/
- pid_t resultPid = fork();
- #endif
- if (resultPid == 0)
+ resultPid = fork();
+
+ if (resultPid == 0) {
childProcess(c);
+ }
assert(resultPid != 0); /* childProcess never returns */
return resultPid;
-#endif /* ! START_CHILD_USE_CLONE */
+}
+
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
+static pid_t
+spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
+ pid_t resultPid;
+ jboolean isCopy;
+ int i, offset, rval, bufsize, magic;
+ char *buf, buf1[16];
+ char *hlpargs[2];
+ SpawnInfo sp;
+
+ /* need to tell helper which fd is for receiving the childstuff
+ * and which fd to send response back on
+ */
+ snprintf(buf1, sizeof(buf1), "%d:%d", c->childenv[0], c->fail[1]);
+ /* put the fd string as argument to the helper cmd */
+ hlpargs[0] = buf1;
+ hlpargs[1] = 0;
+
+ /* Following items are sent down the pipe to the helper
+ * after it is spawned.
+ * All strings are null terminated. All arrays of strings
+ * have an empty string for termination.
+ * - the ChildStuff struct
+ * - the SpawnInfo struct
+ * - the argv strings array
+ * - the envv strings array
+ * - the home directory string
+ * - the parentPath string
+ * - the parentPathv array
+ */
+ /* First calculate the sizes */
+ arraysize(c->argv, &sp.nargv, &sp.argvBytes);
+ bufsize = sp.argvBytes;
+ arraysize(c->envv, &sp.nenvv, &sp.envvBytes);
+ bufsize += sp.envvBytes;
+ sp.dirlen = c->pdir == 0 ? 0 : strlen(c->pdir)+1;
+ bufsize += sp.dirlen;
+ arraysize(parentPathv, &sp.nparentPathv, &sp.parentPathvBytes);
+ bufsize += sp.parentPathvBytes;
+ /* We need to clear FD_CLOEXEC if set in the fds[].
+ * Files are created FD_CLOEXEC in Java.
+ * Otherwise, they will be closed when the target gets exec'd */
+ for (i=0; i<3; i++) {
+ if (c->fds[i] != -1) {
+ int flags = fcntl(c->fds[i], F_GETFD);
+ if (flags & FD_CLOEXEC) {
+ fcntl(c->fds[i], F_SETFD, flags & (~1));
+ }
+ }
+ }
+
+ rval = posix_spawn(&resultPid, helperpath, 0, 0, (char * const *) hlpargs, environ);
+
+ if (rval != 0) {
+ return -1;
+ }
+
+ /* now the lengths are known, copy the data */
+ buf = NEW(char, bufsize);
+ if (buf == 0) {
+ return -1;
+ }
+ offset = copystrings(buf, 0, &c->argv[0]);
+ offset = copystrings(buf, offset, &c->envv[0]);
+ memcpy(buf+offset, c->pdir, sp.dirlen);
+ offset += sp.dirlen;
+ offset = copystrings(buf, offset, parentPathv);
+ assert(offset == bufsize);
+
+ magic = magicNumber();
+
+ /* write the two structs and the data buffer */
+ write(c->childenv[1], (char *)&magic, sizeof(magic)); // magic number first
+ write(c->childenv[1], (char *)c, sizeof(*c));
+ write(c->childenv[1], (char *)&sp, sizeof(sp));
+ write(c->childenv[1], buf, bufsize);
+ free(buf);
+
+ /* In this mode an external main() in invoked which calls back into
+ * childProcess() in this file, rather than directly
+ * via the statement below */
+ return resultPid;
+}
+#endif
+
+/*
+ * Start a child process running function childProcess.
+ * This function only returns in the parent.
+ */
+static pid_t
+startChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
+ switch (c->mode) {
+ case MODE_VFORK:
+ return vforkChild(c);
+ case MODE_FORK:
+ return forkChild(c);
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
+ case MODE_POSIX_SPAWN:
+ return spawnChild(env, process, c, helperpath);
+#endif
+ default:
+ return -1;
+ }
}
JNIEXPORT jint JNICALL
Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env,
jobject process,
+ jint mode,
+ jbyteArray helperpath,
jbyteArray prog,
jbyteArray argBlock, jint argc,
jbyteArray envBlock, jint envc,
@@ -826,32 +574,35 @@
{
int errnum;
int resultPid = -1;
- int in[2], out[2], err[2], fail[2];
+ int in[2], out[2], err[2], fail[2], childenv[2];
jint *fds = NULL;
+ const char *phelperpath = NULL;
const char *pprog = NULL;
const char *pargBlock = NULL;
const char *penvBlock = NULL;
ChildStuff *c;
in[0] = in[1] = out[0] = out[1] = err[0] = err[1] = fail[0] = fail[1] = -1;
+ childenv[0] = childenv[1] = -1;
if ((c = NEW(ChildStuff, 1)) == NULL) return -1;
c->argv = NULL;
c->envv = NULL;
c->pdir = NULL;
-#if START_CHILD_USE_CLONE
c->clone_stack = NULL;
-#endif
/* Convert prog + argBlock into a char ** argv.
* Add one word room for expansion of argv for use by
* execve_as_traditional_shell_script.
+ * This word is also used when using spawn mode
*/
assert(prog != NULL && argBlock != NULL);
+ if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch;
if ((pprog = getBytes(env, prog)) == NULL) goto Catch;
if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch;
if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch;
c->argv[0] = pprog;
+ c->argc = argc + 2;
initVectorFromBlock(c->argv+1, pargBlock, argc);
if (envBlock != NULL) {
@@ -872,6 +623,7 @@
if ((fds[0] == -1 && pipe(in) < 0) ||
(fds[1] == -1 && pipe(out) < 0) ||
(fds[2] == -1 && pipe(err) < 0) ||
+ (pipe(childenv) < 0) ||
(pipe(fail) < 0)) {
throwIOException(env, errno, "Bad file descriptor");
goto Catch;
@@ -884,18 +636,29 @@
copyPipe(out, c->out);
copyPipe(err, c->err);
copyPipe(fail, c->fail);
+ copyPipe(childenv, c->childenv);
c->redirectErrorStream = redirectErrorStream;
+ c->mode = mode;
- resultPid = startChild(c);
+ resultPid = startChild(env, process, c, phelperpath);
assert(resultPid != 0);
if (resultPid < 0) {
- throwIOException(env, errno, START_CHILD_SYSTEM_CALL " failed");
+ switch (c->mode) {
+ case MODE_VFORK:
+ throwIOException(env, errno, "vfork failed");
+ break;
+ case MODE_FORK:
+ throwIOException(env, errno, "fork failed");
+ break;
+ case MODE_POSIX_SPAWN:
+ throwIOException(env, errno, "spawn failed");
+ break;
+ }
goto Catch;
}
-
- restartableClose(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec */
+ close(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec (childproc.c) */
switch (readFully(fail[0], &errnum, sizeof(errnum))) {
case 0: break; /* Exec succeeded */
@@ -913,18 +676,18 @@
fds[2] = (err[0] != -1) ? err[0] : -1;
Finally:
-#if START_CHILD_USE_CLONE
free(c->clone_stack);
-#endif
/* Always clean up the child's side of the pipes */
closeSafely(in [0]);
closeSafely(out[1]);
closeSafely(err[1]);
- /* Always clean up fail descriptors */
+ /* Always clean up fail and childEnv descriptors */
closeSafely(fail[0]);
closeSafely(fail[1]);
+ closeSafely(childenv[0]);
+ closeSafely(childenv[1]);
releaseBytes(env, prog, pprog);
releaseBytes(env, argBlock, pargBlock);
@@ -942,9 +705,9 @@
Catch:
/* Clean up the parent's side of the pipes in case of failure only */
- closeSafely(in [1]);
- closeSafely(out[0]);
- closeSafely(err[0]);
+ closeSafely(in [1]); in[1] = -1;
+ closeSafely(out[0]); out[0] = -1;
+ closeSafely(err[0]); err[0] = -1;
goto Finally;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/java/lang/childproc.c Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,376 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+
+#include "childproc.h"
+
+
+ssize_t
+restartableWrite(int fd, const void *buf, size_t count)
+{
+ ssize_t result;
+ RESTARTABLE(write(fd, buf, count), result);
+ return result;
+}
+
+int
+restartableDup2(int fd_from, int fd_to)
+{
+ int err;
+ RESTARTABLE(dup2(fd_from, fd_to), err);
+ return err;
+}
+
+int
+closeSafely(int fd)
+{
+ return (fd == -1) ? 0 : close(fd);
+}
+
+int
+isAsciiDigit(char c)
+{
+ return c >= '0' && c <= '9';
+}
+
+#ifdef _ALLBSD_SOURCE
+#define FD_DIR "/dev/fd"
+#define dirent64 dirent
+#define readdir64 readdir
+#else
+#define FD_DIR "/proc/self/fd"
+#endif
+
+int
+closeDescriptors(void)
+{
+ DIR *dp;
+ struct dirent64 *dirp;
+ int from_fd = FAIL_FILENO + 1;
+
+ /* We're trying to close all file descriptors, but opendir() might
+ * itself be implemented using a file descriptor, and we certainly
+ * don't want to close that while it's in use. We assume that if
+ * opendir() is implemented using a file descriptor, then it uses
+ * the lowest numbered file descriptor, just like open(). So we
+ * close a couple explicitly. */
+
+ close(from_fd); /* for possible use by opendir() */
+ close(from_fd + 1); /* another one for good luck */
+
+ if ((dp = opendir(FD_DIR)) == NULL)
+ return 0;
+
+ /* We use readdir64 instead of readdir to work around Solaris bug
+ * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
+ */
+ while ((dirp = readdir64(dp)) != NULL) {
+ int fd;
+ if (isAsciiDigit(dirp->d_name[0]) &&
+ (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
+ close(fd);
+ }
+
+ closedir(dp);
+
+ return 1;
+}
+
+int
+moveDescriptor(int fd_from, int fd_to)
+{
+ if (fd_from != fd_to) {
+ if ((restartableDup2(fd_from, fd_to) == -1) ||
+ (close(fd_from) == -1))
+ return -1;
+ }
+ return 0;
+}
+
+int
+magicNumber() {
+ return 43110;
+}
+
+/*
+ * Reads nbyte bytes from file descriptor fd into buf,
+ * The read operation is retried in case of EINTR or partial reads.
+ *
+ * Returns number of bytes read (normally nbyte, but may be less in
+ * case of EOF). In case of read errors, returns -1 and sets errno.
+ */
+ssize_t
+readFully(int fd, void *buf, size_t nbyte)
+{
+ ssize_t remaining = nbyte;
+ for (;;) {
+ ssize_t n = read(fd, buf, remaining);
+ if (n == 0) {
+ return nbyte - remaining;
+ } else if (n > 0) {
+ remaining -= n;
+ if (remaining <= 0)
+ return nbyte;
+ /* We were interrupted in the middle of reading the bytes.
+ * Unlikely, but possible. */
+ buf = (void *) (((char *)buf) + n);
+ } else if (errno == EINTR) {
+ /* Strange signals like SIGJVM1 are possible at any time.
+ * See http://www.dreamsongs.com/WorseIsBetter.html */
+ } else {
+ return -1;
+ }
+ }
+}
+
+void
+initVectorFromBlock(const char**vector, const char* block, int count)
+{
+ int i;
+ const char *p;
+ for (i = 0, p = block; i < count; i++) {
+ /* Invariant: p always points to the start of a C string. */
+ vector[i] = p;
+ while (*(p++));
+ }
+ vector[count] = NULL;
+}
+
+/**
+ * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
+ * If we could do it over again, we would probably not support such an ancient
+ * misfeature, but compatibility wins over sanity. The original support for
+ * this was imported accidentally from execvp().
+ */
+void
+execve_as_traditional_shell_script(const char *file,
+ const char *argv[],
+ const char *const envp[])
+{
+ /* Use the extra word of space provided for us in argv by caller. */
+ const char *argv0 = argv[0];
+ const char *const *end = argv;
+ while (*end != NULL)
+ ++end;
+ memmove(argv+2, argv+1, (end-argv) * sizeof(*end));
+ argv[0] = "/bin/sh";
+ argv[1] = file;
+ execve(argv[0], (char **) argv, (char **) envp);
+ /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
+ memmove(argv+1, argv+2, (end-argv) * sizeof(*end));
+ argv[0] = argv0;
+}
+
+/**
+ * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
+ * be a shell script and the system default shell is invoked to run it.
+ */
+void
+execve_with_shell_fallback(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[])
+{
+ if (mode == MODE_CLONE || mode == MODE_VFORK) {
+ /* shared address space; be very careful. */
+ execve(file, (char **) argv, (char **) envp);
+ if (errno == ENOEXEC)
+ execve_as_traditional_shell_script(file, argv, envp);
+ } else {
+ /* unshared address space; we can mutate environ. */
+ environ = (char **) envp;
+ execvp(file, (char **) argv);
+ }
+}
+
+/**
+ * 'execvpe' should have been included in the Unix standards,
+ * and is a GNU extension in glibc 2.10.
+ *
+ * JDK_execvpe is identical to execvp, except that the child environment is
+ * specified via the 3rd argument instead of being inherited from environ.
+ */
+void
+JDK_execvpe(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[])
+{
+ if (envp == NULL || (char **) envp == environ) {
+ execvp(file, (char **) argv);
+ return;
+ }
+
+ if (*file == '\0') {
+ errno = ENOENT;
+ return;
+ }
+
+ if (strchr(file, '/') != NULL) {
+ execve_with_shell_fallback(mode, file, argv, envp);
+ } else {
+ /* We must search PATH (parent's, not child's) */
+ char expanded_file[PATH_MAX];
+ int filelen = strlen(file);
+ int sticky_errno = 0;
+ const char * const * dirs;
+ for (dirs = parentPathv; *dirs; dirs++) {
+ const char * dir = *dirs;
+ int dirlen = strlen(dir);
+ if (filelen + dirlen + 2 >= PATH_MAX) {
+ errno = ENAMETOOLONG;
+ continue;
+ }
+ memcpy(expanded_file, dir, dirlen);
+ if (expanded_file[dirlen - 1] != '/')
+ expanded_file[dirlen++] = '/';
+ memcpy(expanded_file + dirlen, file, filelen);
+ expanded_file[dirlen + filelen] = '\0';
+ execve_with_shell_fallback(mode, expanded_file, argv, envp);
+ /* There are 3 responses to various classes of errno:
+ * return immediately, continue (especially for ENOENT),
+ * or continue with "sticky" errno.
+ *
+ * From exec(3):
+ *
+ * If permission is denied for a file (the attempted
+ * execve returned EACCES), these functions will continue
+ * searching the rest of the search path. If no other
+ * file is found, however, they will return with the
+ * global variable errno set to EACCES.
+ */
+ switch (errno) {
+ case EACCES:
+ sticky_errno = errno;
+ /* FALLTHRU */
+ case ENOENT:
+ case ENOTDIR:
+#ifdef ELOOP
+ case ELOOP:
+#endif
+#ifdef ESTALE
+ case ESTALE:
+#endif
+#ifdef ENODEV
+ case ENODEV:
+#endif
+#ifdef ETIMEDOUT
+ case ETIMEDOUT:
+#endif
+ break; /* Try other directories in PATH */
+ default:
+ return;
+ }
+ }
+ if (sticky_errno != 0)
+ errno = sticky_errno;
+ }
+}
+
+/**
+ * Child process after a successful fork() or clone().
+ * This function must not return, and must be prepared for either all
+ * of its address space to be shared with its parent, or to be a copy.
+ * It must not modify global variables such as "environ".
+ */
+int
+childProcess(void *arg)
+{
+ const ChildStuff* p = (const ChildStuff*) arg;
+
+ /* Close the parent sides of the pipes.
+ Closing pipe fds here is redundant, since closeDescriptors()
+ would do it anyways, but a little paranoia is a good thing. */
+ if ((closeSafely(p->in[1]) == -1) ||
+ (closeSafely(p->out[0]) == -1) ||
+ (closeSafely(p->err[0]) == -1) ||
+ (closeSafely(p->childenv[0]) == -1) ||
+ (closeSafely(p->childenv[1]) == -1) ||
+ (closeSafely(p->fail[0]) == -1))
+ goto WhyCantJohnnyExec;
+
+ /* Give the child sides of the pipes the right fileno's. */
+ /* Note: it is possible for in[0] == 0 */
+ if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
+ STDIN_FILENO) == -1) ||
+ (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
+ STDOUT_FILENO) == -1))
+ goto WhyCantJohnnyExec;
+
+ if (p->redirectErrorStream) {
+ if ((closeSafely(p->err[1]) == -1) ||
+ (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
+ goto WhyCantJohnnyExec;
+ } else {
+ if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
+ STDERR_FILENO) == -1)
+ goto WhyCantJohnnyExec;
+ }
+
+ if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
+ goto WhyCantJohnnyExec;
+
+ /* close everything */
+ if (closeDescriptors() == 0) { /* failed, close the old way */
+ int max_fd = (int)sysconf(_SC_OPEN_MAX);
+ int fd;
+ for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
+ if (close(fd) == -1 && errno != EBADF)
+ goto WhyCantJohnnyExec;
+ }
+
+ /* change to the new working directory */
+ if (p->pdir != NULL && chdir(p->pdir) < 0)
+ goto WhyCantJohnnyExec;
+
+ if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
+ goto WhyCantJohnnyExec;
+
+ JDK_execvpe(p->mode, p->argv[0], p->argv, p->envv);
+
+ WhyCantJohnnyExec:
+ /* We used to go to an awful lot of trouble to predict whether the
+ * child would fail, but there is no reliable way to predict the
+ * success of an operation without *trying* it, and there's no way
+ * to try a chdir or exec in the parent. Instead, all we need is a
+ * way to communicate any failure back to the parent. Easy; we just
+ * send the errno back to the parent over a pipe in case of failure.
+ * The tricky thing is, how do we communicate the *success* of exec?
+ * We use FD_CLOEXEC together with the fact that a read() on a pipe
+ * yields EOF when the write ends (we have two of them!) are closed.
+ */
+ {
+ int errnum = errno;
+ restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
+ }
+ close(FAIL_FILENO);
+ _exit(-1);
+ return 0; /* Suppress warning "no return value from function" */
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/java/lang/childproc.h Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef CHILDPROC_MD_H
+#define CHILDPROC_MD_H
+
+#include <sys/types.h>
+
+#ifdef __APPLE__
+#include <crt_externs.h>
+#define environ (*_NSGetEnviron())
+#else
+/* This is one of the rare times it's more portable to declare an
+ * external symbol explicitly, rather than via a system header.
+ * The declaration is standardized as part of UNIX98, but there is
+ * no standard (not even de-facto) header file where the
+ * declaration is to be found. See:
+ * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
+ * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
+ *
+ * "All identifiers in this volume of IEEE Std 1003.1-2001, except
+ * environ, are defined in at least one of the headers" (!)
+ */
+extern char **environ;
+#endif
+
+#ifdef __linux__
+#include <sched.h>
+#endif
+
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
+
+#ifndef SA_NOCLDSTOP
+#define SA_NOCLDSTOP 0
+#endif
+
+#ifndef SA_RESTART
+#define SA_RESTART 0
+#endif
+
+#define FAIL_FILENO (STDERR_FILENO + 1)
+
+/* TODO: Refactor. */
+#define RESTARTABLE(_cmd, _result) do { \
+ do { \
+ _result = _cmd; \
+ } while((_result == -1) && (errno == EINTR)); \
+} while(0)
+
+/* These numbers must be the same as the Enum in UNIXProcess.java
+ * Must be a better way of doing this.
+ */
+#define MODE_FORK 1
+#define MODE_POSIX_SPAWN 2
+#define MODE_VFORK 3
+#define MODE_CLONE 4
+
+typedef struct _ChildStuff
+{
+ int in[2];
+ int out[2];
+ int err[2];
+ int fail[2];
+ int childenv[2];
+ int fds[3];
+ int mode;
+ const char **argv;
+ int argc;
+ const char **envv;
+ const char *pdir;
+ int redirectErrorStream;
+ void *clone_stack;
+} ChildStuff;
+
+/* following used in addition when mode is SPAWN */
+typedef struct _SpawnInfo {
+ int nargv; /* number of argv array elements */
+ int argvBytes; /* total number of bytes in argv array */
+ int nenvv; /* number of envv array elements */
+ int envvBytes; /* total number of bytes in envv array */
+ int dirlen; /* length of home directory string */
+ int nparentPathv; /* number of elements in parentPathv array */
+ int parentPathvBytes; /* total number of bytes in parentPathv array */
+} SpawnInfo;
+
+/**
+ * The cached and split version of the JDK's effective PATH.
+ * (We don't support putenv("PATH=...") in native code)
+ */
+const char * const *parentPathv;
+
+ssize_t restartableWrite(int fd, const void *buf, size_t count);
+int restartableDup2(int fd_from, int fd_to);
+int closeSafely(int fd);
+int isAsciiDigit(char c);
+int closeDescriptors(void);
+int moveDescriptor(int fd_from, int fd_to);
+
+int magicNumber();
+ssize_t readFully(int fd, void *buf, size_t nbyte);
+void initVectorFromBlock(const char**vector, const char* block, int count);
+void execve_as_traditional_shell_script(const char *file,
+ const char *argv[],
+ const char *const envp[]);
+void execve_with_shell_fallback(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[]);
+void JDK_execvpe(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[]);
+int childProcess(void *arg);
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/java/lang/jspawnhelper.c Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "childproc.h"
+
+extern int errno;
+
+#define ALLOC(X,Y) { \
+ void *mptr; \
+ mptr = malloc (Y); \
+ if (mptr == 0) { \
+ error (fdout, ERR_MALLOC); \
+ } \
+ X = mptr; \
+}
+
+#define ERR_MALLOC 1
+#define ERR_PIPE 2
+#define ERR_ARGS 3
+
+void error (int fd, int err) {
+ write (fd, &err, sizeof(err));
+ exit (1);
+}
+
+void shutItDown() {
+ fprintf(stdout, "This command is not for general use and should ");
+ fprintf(stdout, "only be run as the result of a call to\n");
+ fprintf(stdout, "ProcessBuilder.start() or Runtime.exec() in a java ");
+ fprintf(stdout, "application\n");
+ _exit(1);
+}
+
+/*
+ * read the following off the pipefd
+ * - the ChildStuff struct
+ * - the SpawnInfo struct
+ * - the data strings for fields in ChildStuff
+ */
+void initChildStuff (int fdin, int fdout, ChildStuff *c) {
+ int n;
+ int argvBytes, nargv, envvBytes, nenvv;
+ int dirlen;
+ char *buf;
+ SpawnInfo sp;
+ int bufsize, offset=0;
+ int magic;
+ int res;
+
+ res = readFully (fdin, &magic, sizeof(magic));
+ if (res != 4 || magic != magicNumber()) {
+ error (fdout, ERR_PIPE);
+ }
+
+ if (readFully (fdin, c, sizeof(*c)) == -1) {
+ error (fdout, ERR_PIPE);
+ }
+
+ if (readFully (fdin, &sp, sizeof(sp)) == -1) {
+ error (fdout, ERR_PIPE);
+ }
+
+ bufsize = sp.argvBytes + sp.envvBytes +
+ sp.dirlen + sp.parentPathvBytes;
+
+ ALLOC(buf, bufsize);
+
+ if (readFully (fdin, buf, bufsize) == -1) {
+ error (fdout, ERR_PIPE);
+ }
+
+ /* Initialize argv[] */
+ ALLOC(c->argv, sizeof(char *) * sp.nargv);
+ initVectorFromBlock (c->argv, buf+offset, sp.nargv-1);
+ offset += sp.argvBytes;
+
+ /* Initialize envv[] */
+ if (sp.nenvv == 0) {
+ c->envv = 0;
+ } else {
+ ALLOC(c->envv, sizeof(char *) * sp.nenvv);
+ initVectorFromBlock (c->envv, buf+offset, sp.nenvv-1);
+ offset += sp.envvBytes;
+ }
+
+ /* Initialize pdir */
+ if (sp.dirlen == 0) {
+ c->pdir = 0;
+ } else {
+ c->pdir = buf+offset;
+ offset += sp.dirlen;
+ }
+
+ /* Initialize parentPathv[] */
+ ALLOC(parentPathv, sizeof (char *) * sp.nparentPathv)
+ initVectorFromBlock ((const char**)parentPathv, buf+offset, sp.nparentPathv-1);
+ offset += sp.parentPathvBytes;
+}
+
+int main(int argc, char *argv[]) {
+ ChildStuff c;
+ int t;
+ struct stat buf;
+ /* argv[0] contains the fd number to read all the child info */
+ int r, fdin, fdout;
+
+ r = sscanf (argv[argc-1], "%d:%d", &fdin, &fdout);
+ if (r == 2 && fcntl(fdin, F_GETFD) != -1) {
+ fstat(fdin, &buf);
+ if (!S_ISFIFO(buf.st_mode))
+ shutItDown();
+ } else {
+ shutItDown();
+ }
+ initChildStuff (fdin, fdout, &c);
+
+ childProcess (&c);
+ return 0; /* NOT REACHED */
+}
--- a/jdk/src/solaris/native/java/net/NetworkInterface.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/solaris/native/java/net/NetworkInterface.c Tue Aug 20 17:44:18 2013 -0700
@@ -563,11 +563,9 @@
if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
(*env)->ReleaseStringUTFChars(env, name, name_utf);
- return -1;
+ return -1;
}
- name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
-
ret = getFlags(sock, name_utf, &flags);
close(sock);
--- a/jdk/src/windows/classes/java/lang/ProcessImpl.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/windows/classes/java/lang/ProcessImpl.java Tue Aug 20 17:44:18 2013 -0700
@@ -491,8 +491,10 @@
/**
* Create a process using the win32 function CreateProcess.
+ * The method is synchronized due to MS kb315939 problem.
+ * All native handles should restore the inherit flag at the end of call.
*
- * @param cmdstr the Windows commandline
+ * @param cmdstr the Windows command line
* @param envblock NUL-separated, double-NUL-terminated list of
* environment strings in VAR=VALUE form
* @param dir the working directory of the process, or null if
@@ -508,7 +510,7 @@
* @param redirectErrorStream redirectErrorStream attribute
* @return the native subprocess HANDLE returned by CreateProcess
*/
- private static native long create(String cmdstr,
+ private static synchronized native long create(String cmdstr,
String envblock,
String dir,
long[] stdHandles,
--- a/jdk/src/windows/native/java/io/Console_md.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/windows/native/java/io/Console_md.c Tue Aug 20 17:44:18 2013 -0700
@@ -38,12 +38,10 @@
{
if (hStdIn == INVALID_HANDLE_VALUE &&
(hStdIn = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
- JNU_ThrowIOExceptionWithLastError(env, "Open Console input failed");
return JNI_FALSE;
}
if (hStdOut == INVALID_HANDLE_VALUE &&
(hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
- JNU_ThrowIOExceptionWithLastError(env, "Open Console output failed");
return JNI_FALSE;
}
if (GetFileType(hStdIn) != FILE_TYPE_CHAR ||
--- a/jdk/src/windows/native/java/io/canonicalize_md.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/windows/native/java/io/canonicalize_md.c Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -179,6 +179,10 @@
wdots(WCHAR *start)
{
WCHAR *p = start;
+ // Skip "\\.\" prefix
+ if (wcslen(p) > 4 && !wcsncmp(p, L"\\\\.\\", 4))
+ p = p + 4;
+
while (*p) {
if ((p = wcschr(p, L'.')) == NULL) // find next occurence of '.'
return 0; // no more dots
--- a/jdk/src/windows/native/java/io/io_util_md.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/windows/native/java/io/io_util_md.c Tue Aug 20 17:44:18 2013 -0700
@@ -251,12 +251,6 @@
free(pathbuf);
if (h == INVALID_HANDLE_VALUE) {
- int error = GetLastError();
- if (error == ERROR_TOO_MANY_OPEN_FILES) {
- JNU_ThrowByName(env, JNU_JAVAIOPKG "IOException",
- "Too many open files");
- return -1;
- }
throwFileNotFoundException(env, path);
return -1;
}
--- a/jdk/src/windows/native/java/lang/ProcessImpl_md.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/windows/native/java/lang/ProcessImpl_md.c Tue Aug 20 17:44:18 2013 -0700
@@ -113,6 +113,233 @@
CloseHandle(handle);
}
+static BOOL hasInheritFlag(HANDLE handle)
+{
+ DWORD mask;
+ if (GetHandleInformation(handle, &mask)) {
+ return mask & HANDLE_FLAG_INHERIT;
+ }
+ return FALSE;
+}
+
+#define HANDLE_STORAGE_SIZE 6
+#define OFFSET_READ 0
+#define OFFSET_WRITE 1
+//long signed version of INVALID_HANDLE_VALUE
+#define JAVA_INVALID_HANDLE_VALUE ((jlong) -1)
+#define OPPOSITE_END(offset) (offset==OFFSET_READ ? OFFSET_WRITE : OFFSET_READ)
+
+/* Pipe holder structure */
+typedef struct _STDHOLDER {
+ HANDLE pipe[2];
+ int offset;
+} STDHOLDER;
+
+/* Responsible for correct initialization of the [pHolder] structure
+ (that is used for handles recycling) if needs,
+ and appropriate setup of IOE handle [phStd] for child process based
+ on created pipe or Java handle. */
+static BOOL initHolder(
+ JNIEnv *env,
+ jlong *pjhandles, /* IN OUT - the handle form Java,
+ that can be a file, console or undefined */
+ STDHOLDER *pHolder, /* OUT - initialized structure that holds pipe
+ handles */
+ HANDLE *phStd /* OUT - initialized handle for child process */
+) {
+ /* Here we test the value from Java against invalid
+ handle value. We are not using INVALID_HANDLE_VALUE macro
+ due to double signed/unsigned and 32/64bit ambiguity.
+ Otherwise it will be easy to get the wrong
+ value 0x00000000FFFFFFFF
+ instead 0xFFFFFFFFFFFFFFFF. */
+ if (*pjhandles != JAVA_INVALID_HANDLE_VALUE) {
+ /* Java file or console redirection */
+ *phStd = (HANDLE) *pjhandles;
+ /* Here we set the related Java stream (Process.getXXXXStream())
+ to [ProcessBuilder.NullXXXXStream.INSTANCE] value.
+ The initial Java handle [*pjhandles] will be closed in
+ ANY case. It is not a handle leak. */
+ *pjhandles = JAVA_INVALID_HANDLE_VALUE;
+ } else {
+ /* Creation of parent-child pipe */
+ if (!CreatePipe(
+ &pHolder->pipe[OFFSET_READ],
+ &pHolder->pipe[OFFSET_WRITE],
+ NULL, /* we would like to inherit
+ default process access,
+ instead of 'Everybody' access */
+ PIPE_SIZE))
+ {
+ win32Error(env, L"CreatePipe");
+ return FALSE;
+ } else {
+ /* [thisProcessEnd] has no the inherit flag because
+ the [lpPipeAttributes] param of [CreatePipe]
+ had the NULL value. */
+ HANDLE thisProcessEnd = pHolder->pipe[OPPOSITE_END(pHolder->offset)];
+ *phStd = pHolder->pipe[pHolder->offset];
+ *pjhandles = (jlong) thisProcessEnd;
+ }
+ }
+ /* Pipe handle will be closed in the [releaseHolder] call,
+ file handle will be closed in Java.
+ The long-live handle need to restore the inherit flag,
+ we do it later in the [prepareIOEHandleState] call. */
+ SetHandleInformation(
+ *phStd,
+ HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
+ return TRUE;
+}
+
+/* Smart recycling of pipe handles in [pHolder]. For the failed
+ create process attempts, both ends of pipe need to be released.
+ The [complete] has the [TRUE] value in the failed attempt. */
+static void releaseHolder(BOOL complete, STDHOLDER *pHolder) {
+ closeSafely(pHolder->pipe[pHolder->offset]);
+ if (complete) {
+ /* Error occur, close this process pipe end */
+ closeSafely(pHolder->pipe[OPPOSITE_END(pHolder->offset)]);
+ }
+}
+
+/* Stores and drops the inherit flag of handles that should not
+ be shared with the child process by default, but can hold the
+ inherit flag due to MS process birth specific. */
+static void prepareIOEHandleState(
+ HANDLE *stdIOE,
+ BOOL *inherit)
+{
+ int i;
+ for (i = 0; i < HANDLE_STORAGE_SIZE; ++i) {
+ HANDLE hstd = stdIOE[i];
+ if (INVALID_HANDLE_VALUE != hstd && hasInheritFlag(hstd)) {
+ /* FALSE by default */
+ inherit[i] = TRUE;
+ /* Java does not need implicit inheritance for IOE handles,
+ so we drop inherit flag that probably was installed by
+ previous CreateProcess call that launched current process.
+ We will return the handle state back after CreateProcess call.
+ By clearing inherit flag we prevent "greedy grandchild" birth.
+ The explicit inheritance for child process IOE handles is
+ implemented in the [initHolder] call. */
+ SetHandleInformation(hstd, HANDLE_FLAG_INHERIT, 0);
+ }
+ }
+}
+
+/* Restores the inheritance flag of handles from stored values. */
+static void restoreIOEHandleState(
+ const HANDLE *stdIOE,
+ const BOOL *inherit)
+{
+ /* The set of current process standard IOE handles and
+ the set of child process IOE handles can intersect.
+ To restore the inherit flag right, we use backward
+ array iteration. */
+ int i;
+ for (i = HANDLE_STORAGE_SIZE - 1; i >= 0; --i)
+ if (INVALID_HANDLE_VALUE != stdIOE[i]) {
+ /* Restore inherit flag for any case.
+ The handle can be changed by explicit inheritance.*/
+ SetHandleInformation(stdIOE[i],
+ HANDLE_FLAG_INHERIT,
+ inherit[i] ? HANDLE_FLAG_INHERIT : 0);
+ }
+}
+
+/* Please, read about the MS inheritance problem
+ http://support.microsoft.com/kb/315939
+ and critical section/synchronized block solution. */
+static jlong processCreate(
+ JNIEnv *env,
+ const jchar *pcmd,
+ const jchar *penvBlock,
+ const jchar *pdir,
+ jlong *handles,
+ jboolean redirectErrorStream)
+{
+ jlong ret = 0L;
+ STARTUPINFOW si = {sizeof(si)};
+
+ /* Handles for which the inheritance flag must be restored. */
+ HANDLE stdIOE[HANDLE_STORAGE_SIZE] = {
+ /* Current process standard IOE handles: JDK-7147084 */
+ INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE,
+ /* Child process IOE handles: JDK-6921885 */
+ (HANDLE)handles[0], (HANDLE)handles[1], (HANDLE)handles[2]};
+ BOOL inherit[HANDLE_STORAGE_SIZE] = {
+ FALSE, FALSE, FALSE,
+ FALSE, FALSE, FALSE};
+
+ {
+ /* Extraction of current process standard IOE handles */
+ DWORD idsIOE[3] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE};
+ int i;
+ for (i = 0; i < 3; ++i)
+ /* Should not be closed by CloseHandle! */
+ stdIOE[i] = GetStdHandle(idsIOE[i]);
+ }
+
+ prepareIOEHandleState(stdIOE, inherit);
+ {
+ /* Input */
+ STDHOLDER holderIn = {{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}, OFFSET_READ};
+ if (initHolder(env, &handles[0], &holderIn, &si.hStdInput)) {
+
+ /* Output */
+ STDHOLDER holderOut = {{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}, OFFSET_WRITE};
+ if (initHolder(env, &handles[1], &holderOut, &si.hStdOutput)) {
+
+ /* Error */
+ STDHOLDER holderErr = {{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}, OFFSET_WRITE};
+ BOOL success;
+ if (redirectErrorStream) {
+ si.hStdError = si.hStdOutput;
+ /* Here we set the error stream to [ProcessBuilder.NullInputStream.INSTANCE]
+ value. That is in accordance with Java Doc for the redirection case.
+ The Java file for the [ handles[2] ] will be closed in ANY case. It is not
+ a handle leak. */
+ handles[2] = JAVA_INVALID_HANDLE_VALUE;
+ success = TRUE;
+ } else {
+ success = initHolder(env, &handles[2], &holderErr, &si.hStdError);
+ }
+
+ if (success) {
+ PROCESS_INFORMATION pi;
+ DWORD processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
+
+ si.dwFlags = STARTF_USESTDHANDLES;
+ if (!CreateProcessW(
+ NULL, /* executable name */
+ (LPWSTR)pcmd, /* command line */
+ NULL, /* process security attribute */
+ NULL, /* thread security attribute */
+ TRUE, /* inherits system handles */
+ processFlag, /* selected based on exe type */
+ (LPVOID)penvBlock,/* environment block */
+ (LPCWSTR)pdir, /* change to the new current directory */
+ &si, /* (in) startup information */
+ &pi)) /* (out) process information */
+ {
+ win32Error(env, L"CreateProcess");
+ } else {
+ closeSafely(pi.hThread);
+ ret = (jlong)pi.hProcess;
+ }
+ }
+ releaseHolder(ret == 0, &holderErr);
+ releaseHolder(ret == 0, &holderOut);
+ }
+ releaseHolder(ret == 0, &holderIn);
+ }
+ }
+ restoreIOEHandleState(stdIOE, inherit);
+
+ return ret;
+}
+
JNIEXPORT jlong JNICALL
Java_java_lang_ProcessImpl_create(JNIEnv *env, jclass ignored,
jstring cmd,
@@ -121,138 +348,35 @@
jlongArray stdHandles,
jboolean redirectErrorStream)
{
- HANDLE inRead = INVALID_HANDLE_VALUE;
- HANDLE inWrite = INVALID_HANDLE_VALUE;
- HANDLE outRead = INVALID_HANDLE_VALUE;
- HANDLE outWrite = INVALID_HANDLE_VALUE;
- HANDLE errRead = INVALID_HANDLE_VALUE;
- HANDLE errWrite = INVALID_HANDLE_VALUE;
- SECURITY_ATTRIBUTES sa;
- PROCESS_INFORMATION pi;
- STARTUPINFOW si;
- const jchar* pcmd = NULL;
- const jchar* pdir = NULL;
- const jchar* penvBlock = NULL;
- jlong *handles = NULL;
jlong ret = 0;
- DWORD processFlag;
-
- assert(cmd != NULL);
- pcmd = (*env)->GetStringChars(env, cmd, NULL);
- if (pcmd == NULL) goto Catch;
-
- if (dir != 0) {
- pdir = (*env)->GetStringChars(env, dir, NULL);
- if (pdir == NULL) goto Catch;
- }
- if (envBlock != NULL) {
- penvBlock = ((*env)->GetStringChars(env, envBlock, NULL));
- if (penvBlock == NULL) goto Catch;
- }
- assert(stdHandles != NULL);
- handles = (*env)->GetLongArrayElements(env, stdHandles, NULL);
- if (handles == NULL) goto Catch;
-
- memset(&si, 0, sizeof(si));
- si.cb = sizeof(si);
- si.dwFlags = STARTF_USESTDHANDLES;
-
- sa.nLength = sizeof(sa);
- sa.lpSecurityDescriptor = 0;
- sa.bInheritHandle = TRUE;
-
- if (handles[0] != (jlong) -1) {
- si.hStdInput = (HANDLE) handles[0];
- handles[0] = (jlong) -1;
- } else {
- if (! CreatePipe(&inRead, &inWrite, &sa, PIPE_SIZE)) {
- win32Error(env, L"CreatePipe");
- goto Catch;
- }
- si.hStdInput = inRead;
- SetHandleInformation(inWrite, HANDLE_FLAG_INHERIT, 0);
- handles[0] = (jlong) inWrite;
- }
- SetHandleInformation(si.hStdInput,
- HANDLE_FLAG_INHERIT,
- HANDLE_FLAG_INHERIT);
-
- if (handles[1] != (jlong) -1) {
- si.hStdOutput = (HANDLE) handles[1];
- handles[1] = (jlong) -1;
- } else {
- if (! CreatePipe(&outRead, &outWrite, &sa, PIPE_SIZE)) {
- win32Error(env, L"CreatePipe");
- goto Catch;
+ if (cmd != NULL && stdHandles != NULL) {
+ const jchar *pcmd = (*env)->GetStringChars(env, cmd, NULL);
+ if (pcmd != NULL) {
+ const jchar *penvBlock = (envBlock != NULL)
+ ? (*env)->GetStringChars(env, envBlock, NULL)
+ : NULL;
+ const jchar *pdir = (dir != NULL)
+ ? (*env)->GetStringChars(env, dir, NULL)
+ : NULL;
+ jlong *handles = (*env)->GetLongArrayElements(env, stdHandles, NULL);
+ if (handles != NULL) {
+ ret = processCreate(
+ env,
+ pcmd,
+ penvBlock,
+ pdir,
+ handles,
+ redirectErrorStream);
+ (*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0);
+ }
+ if (pdir != NULL)
+ (*env)->ReleaseStringChars(env, dir, pdir);
+ if (penvBlock != NULL)
+ (*env)->ReleaseStringChars(env, envBlock, penvBlock);
+ (*env)->ReleaseStringChars(env, cmd, pcmd);
}
- si.hStdOutput = outWrite;
- SetHandleInformation(outRead, HANDLE_FLAG_INHERIT, 0);
- handles[1] = (jlong) outRead;
}
- SetHandleInformation(si.hStdOutput,
- HANDLE_FLAG_INHERIT,
- HANDLE_FLAG_INHERIT);
-
- if (redirectErrorStream) {
- si.hStdError = si.hStdOutput;
- handles[2] = (jlong) -1;
- } else if (handles[2] != (jlong) -1) {
- si.hStdError = (HANDLE) handles[2];
- handles[2] = (jlong) -1;
- } else {
- if (! CreatePipe(&errRead, &errWrite, &sa, PIPE_SIZE)) {
- win32Error(env, L"CreatePipe");
- goto Catch;
- }
- si.hStdError = errWrite;
- SetHandleInformation(errRead, HANDLE_FLAG_INHERIT, 0);
- handles[2] = (jlong) errRead;
- }
- SetHandleInformation(si.hStdError,
- HANDLE_FLAG_INHERIT,
- HANDLE_FLAG_INHERIT);
-
- processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
- ret = CreateProcessW(0, /* executable name */
- (LPWSTR)pcmd, /* command line */
- 0, /* process security attribute */
- 0, /* thread security attribute */
- TRUE, /* inherits system handles */
- processFlag, /* selected based on exe type */
- (LPVOID)penvBlock,/* environment block */
- (LPCWSTR)pdir, /* change to the new current directory */
- &si, /* (in) startup information */
- &pi); /* (out) process information */
- if (!ret) {
- win32Error(env, L"CreateProcess");
- goto Catch;
- }
-
- CloseHandle(pi.hThread);
- ret = (jlong)pi.hProcess;
-
- Finally:
- /* Always clean up the child's side of the pipes */
- closeSafely(inRead);
- closeSafely(outWrite);
- closeSafely(errWrite);
-
- if (pcmd != NULL)
- (*env)->ReleaseStringChars(env, cmd, pcmd);
- if (pdir != NULL)
- (*env)->ReleaseStringChars(env, dir, pdir);
- if (penvBlock != NULL)
- (*env)->ReleaseStringChars(env, envBlock, penvBlock);
- if (handles != NULL)
- (*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0);
return ret;
-
- Catch:
- /* Clean up the parent's side of the pipes in case of failure only */
- closeSafely(inWrite);
- closeSafely(outRead);
- closeSafely(errRead);
- goto Finally;
}
JNIEXPORT jint JNICALL
--- a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c Tue Aug 20 17:44:18 2013 -0700
@@ -367,11 +367,12 @@
/*
* Class: sun_security_krb5_Credentials
* Method: acquireDefaultNativeCreds
- * Signature: ()Lsun/security/krb5/Credentials;
+ * Signature: ([I])Lsun/security/krb5/Credentials;
*/
JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativeCreds(
JNIEnv *env,
- jclass krbcredsClass) {
+ jclass krbcredsClass,
+ jintArray jetypes) {
KERB_QUERY_TKT_CACHE_REQUEST CacheRequest;
PKERB_RETRIEVE_TKT_RESPONSE TktCacheResponse = NULL;
@@ -387,9 +388,12 @@
jobject ticketFlags, startTime, endTime, krbCreds = NULL;
jobject authTime, renewTillTime, hostAddresses = NULL;
KERB_EXTERNAL_TICKET *msticket;
- int ignore_cache = 0;
+ int found_in_cache = 0;
FILETIME Now, EndTime, LocalEndTime;
+ int i, netypes;
+ jint *etypes = NULL;
+
while (TRUE) {
if (krbcredsConstructor == 0) {
@@ -456,31 +460,33 @@
// got the native MS TGT
msticket = &(TktCacheResponse->Ticket);
+ netypes = (*env)->GetArrayLength(env, jetypes);
+ etypes = (jint *) (*env)->GetIntArrayElements(env, jetypes, NULL);
+
// check TGT validity
- switch (msticket->SessionKey.KeyType) {
- case KERB_ETYPE_DES_CBC_CRC:
- case KERB_ETYPE_DES_CBC_MD5:
- case KERB_ETYPE_NULL:
- case KERB_ETYPE_RC4_HMAC_NT:
- GetSystemTimeAsFileTime(&Now);
- EndTime.dwLowDateTime = msticket->EndTime.LowPart;
- EndTime.dwHighDateTime = msticket->EndTime.HighPart;
- FileTimeToLocalFileTime(&EndTime, &LocalEndTime);
- if (CompareFileTime(&Now, &LocalEndTime) >= 0) {
- ignore_cache = 1;
- }
- if (msticket->TicketFlags & KERB_TICKET_FLAGS_invalid) {
- ignore_cache = 1;
- }
- break;
- case KERB_ETYPE_RC4_MD4:
- default:
- // not supported
- ignore_cache = 1;
- break;
+ if (native_debug) {
+ printf("LSA: TICKET SessionKey KeyType is %d\n", msticket->SessionKey.KeyType);
}
- if (ignore_cache) {
+ if ((msticket->TicketFlags & KERB_TICKET_FLAGS_invalid) == 0) {
+ GetSystemTimeAsFileTime(&Now);
+ EndTime.dwLowDateTime = msticket->EndTime.LowPart;
+ EndTime.dwHighDateTime = msticket->EndTime.HighPart;
+ FileTimeToLocalFileTime(&EndTime, &LocalEndTime);
+ if (CompareFileTime(&Now, &LocalEndTime) < 0) {
+ for (i=0; i<netypes; i++) {
+ if (etypes[i] == msticket->SessionKey.KeyType) {
+ found_in_cache = 1;
+ if (native_debug) {
+ printf("LSA: Valid etype found: %d\n", etypes[i]);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ if (!found_in_cache) {
if (native_debug) {
printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n");
}
@@ -494,34 +500,41 @@
}
pTicketRequest->MessageType = KerbRetrieveEncodedTicketMessage;
- pTicketRequest->EncryptionType = KERB_ETYPE_DES_CBC_MD5;
pTicketRequest->CacheOptions = KERB_RETRIEVE_TICKET_DONT_USE_CACHE;
- Status = LsaCallAuthenticationPackage(
- LogonHandle,
- PackageId,
- pTicketRequest,
- requestSize,
- &pTicketResponse,
- &responseSize,
- &SubStatus
- );
+ for (i=0; i<netypes; i++) {
+ pTicketRequest->EncryptionType = etypes[i];
+ Status = LsaCallAuthenticationPackage(
+ LogonHandle,
+ PackageId,
+ pTicketRequest,
+ requestSize,
+ &pTicketResponse,
+ &responseSize,
+ &SubStatus
+ );
- if (native_debug) {
- printf("LSA: Response size is %d\n", responseSize);
- }
+ if (native_debug) {
+ printf("LSA: Response size is %d for %d\n", responseSize, etypes[i]);
+ }
- if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) {
- if (!LSA_SUCCESS(Status)) {
- ShowNTError("LsaCallAuthenticationPackage", Status);
- } else {
- ShowNTError("Protocol status", SubStatus);
+ if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) {
+ if (!LSA_SUCCESS(Status)) {
+ ShowNTError("LsaCallAuthenticationPackage", Status);
+ } else {
+ ShowNTError("Protocol status", SubStatus);
+ }
+ continue;
}
+
+ // got the native MS Kerberos TGT
+ msticket = &(pTicketResponse->Ticket);
break;
}
+ }
- // got the native MS Kerberos TGT
- msticket = &(pTicketResponse->Ticket);
+ if (etypes != NULL) {
+ (*env)->ReleaseIntArrayElements(env, jetypes, etypes, 0);
}
/*
@@ -644,7 +657,7 @@
hostAddresses);
break;
- } // end of WHILE
+ } // end of WHILE. This WHILE will never loop.
// clean up resources
if (TktCacheResponse != NULL) {
--- a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -91,7 +91,7 @@
* Code copied to target process
*/
#pragma check_stack (off)
-static DWORD WINAPI thread_func(DataBlock *pData)
+DWORD WINAPI jvm_attach_thread_func(DataBlock *pData)
{
HINSTANCE h;
EnqueueOperationFunc addr;
@@ -117,8 +117,8 @@
}
}
-/* This function marks the end of thread_func. */
-static void thread_end (void) {
+/* This function marks the end of jvm_attach_thread_func. */
+void jvm_attach_thread_func_end (void) {
}
#pragma check_stack
@@ -152,10 +152,10 @@
DWORD len;
jbyteArray array;
- len = (DWORD)((LPBYTE) thread_end - (LPBYTE) thread_func);
+ len = (DWORD)((LPBYTE) jvm_attach_thread_func_end - (LPBYTE) jvm_attach_thread_func);
array= (*env)->NewByteArray(env, (jsize)len);
if (array != NULL) {
- (*env)->SetByteArrayRegion(env, array, 0, (jint)len, (jbyte*)&thread_func);
+ (*env)->SetByteArrayRegion(env, array, 0, (jint)len, (jbyte*)&jvm_attach_thread_func);
}
return array;
}
--- a/jdk/test/ProblemList.txt Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/ProblemList.txt Tue Aug 20 17:44:18 2013 -0700
@@ -131,13 +131,6 @@
# 7196801
java/lang/management/MemoryMXBean/LowMemoryTest2.sh generic-all
-# 8015780
-java/lang/reflect/Method/GenericStringTest.java generic-all
-
-# 8019845 due to memleak not related to the tested fix
-java/lang/instrument/RedefineBigClass.sh linux-x64
-java/lang/instrument/RetransformBigClass.sh linux-x64
-
# 8021230
java/lang/ThreadLocal/ThreadLocalSupplierTest.java generic-all
@@ -296,9 +289,6 @@
sun/security/krb5/auto/BadKdc3.java solaris-sparcv9
sun/security/krb5/auto/BadKdc4.java solaris-sparcv9
-# 7194428
-sun/security/mscapi/ShortRSAKey1024.sh windows-all
-
############################################################################
# jdk_sound
@@ -315,9 +305,6 @@
# jdk_time
-# 8016623
-java/time/test/java/time/format/TestDateTimeTextProvider.java generic-all
-
############################################################################
# jdk_tools
@@ -335,8 +322,6 @@
# Tests take too long, on sparcs see 7143279
tools/pack200/CommandLineTests.java solaris-all, macosx-all
tools/pack200/Pack200Test.java solaris-all, macosx-all
-# 8015666
-tools/pack200/TimeStamp.java generic-all
# 8007410
tools/launcher/FXLauncherTest.java linux-all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Cipher/RSA/TestOAEPPadding.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8020081 8022669
+ * @summary encryption/decryption test for using OAEPPadding with
+ * OAEPParameterSpec specified and not specified during a Cipher.init().
+ * @author Anthony Scarpino
+ */
+
+import java.util.Arrays;
+
+import java.security.Security;
+import java.security.Provider;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.MGF1ParameterSpec;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.OAEPParameterSpec;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.spec.PSource;
+
+
+public class TestOAEPPadding {
+ private static RSAPrivateKey privateKey;
+ private static RSAPublicKey publicKey;
+ static Provider cp;
+ static boolean failed = false;
+
+ public static void main(String args[]) throws Exception {
+ cp = Security.getProvider("SunJCE");
+ System.out.println("Testing provider " + cp.getName() + "...");
+ Provider kfp = Security.getProvider("SunRsaSign");
+ KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", kfp);
+ kpg.initialize(2048);
+ KeyPair kp = kpg.generateKeyPair();
+ privateKey = (RSAPrivateKey)kp.getPrivate();
+ publicKey = (RSAPublicKey)kp.getPublic();
+
+ // Test using a spec with each digest algorithm case
+ // MD5
+ test(new OAEPParameterSpec("MD5", "MGF1",
+ MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("MD5", "MGF1",
+ MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("MD5", "MGF1",
+ MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("MD5", "MGF1",
+ MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("MD5", "MGF1",
+ MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT));
+ // SHA1
+ test(new OAEPParameterSpec("SHA1", "MGF1",
+ MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA1", "MGF1",
+ MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA1", "MGF1",
+ MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA1", "MGF1",
+ MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA1", "MGF1",
+ MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT));
+ // For default OAEPParameterSpec case (SHA1)
+ test(null);
+ // SHA-224
+ test(new OAEPParameterSpec("SHA-224", "MGF1",
+ MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-224", "MGF1",
+ MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-224", "MGF1",
+ MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-224", "MGF1",
+ MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-224", "MGF1",
+ MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT));
+ // SHA-256
+ test(new OAEPParameterSpec("SHA-256", "MGF1",
+ MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-256", "MGF1",
+ MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-256", "MGF1",
+ MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-256", "MGF1",
+ MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-256", "MGF1",
+ MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT));
+ // SHA-384
+ test(new OAEPParameterSpec("SHA-384", "MGF1",
+ MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-384", "MGF1",
+ MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-384", "MGF1",
+ MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-384", "MGF1",
+ MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-384", "MGF1",
+ MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT));
+ // SHA-512
+ test(new OAEPParameterSpec("SHA-512", "MGF1",
+ MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-512", "MGF1",
+ MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-512", "MGF1",
+ MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-512", "MGF1",
+ MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT));
+ test(new OAEPParameterSpec("SHA-512", "MGF1",
+ MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT));
+ if (failed) {
+ throw new Exception("Test failed");
+ }
+ }
+
+ /*
+ * Test with one byte, the max bytes, and the max + 1 bytes allowed by
+ * the RSA key size and the digest algorithm
+ */
+ static void test(OAEPParameterSpec spec) throws Exception {
+ int dlen = 0;
+ String algo;
+
+ // For default OAEPParameterSpec case (SHA1)
+ if (spec == null) {
+ dlen = 20;
+ algo = "Default";
+ } else {
+ // Use the digest algorith provided in the spec
+ algo = spec.getDigestAlgorithm();
+ if (algo.equals("MD5")) {
+ dlen = 16;
+ } else if (algo.equals("SHA1")) {
+ dlen = 20;
+ } else if (algo.equals("SHA-224")) {
+ dlen = 28;
+ } else if (algo.equals("SHA-256")) {
+ dlen = 32;
+ } else if (algo.equals("SHA-384")) {
+ dlen = 48;
+ } else if (algo.equals("SHA-512")) {
+ dlen = 64;
+ }
+ }
+
+ // OAEP maximum length for a given digest algorith & RSA key length
+ int max = ((publicKey.getModulus().bitLength() / 8) - (2 * dlen) - 2);
+
+ // Test with data length of 1
+ try {
+ testEncryptDecrypt(spec, 1);
+ } catch (Exception e) {
+ System.out.println(algo + " failed with data length of 1");
+ e.printStackTrace();
+ failed = true;
+ }
+
+ // Test with data length of maximum allowed
+ try {
+ testEncryptDecrypt(spec, max);
+ } catch (Exception e) {
+ System.out.println(algo + " failed with data length of " + max);
+ e.printStackTrace();
+ failed = true;
+ }
+
+ // Test with data length of maximum allowed + 1
+ try {
+ testEncryptDecrypt(spec, max + 1);
+ throw new Exception();
+ } catch (IllegalBlockSizeException ie) {
+ // expected to fail
+ } catch (Exception e) {
+ System.err.println(algo + " failed with data length of " +
+ (max + 1));
+ e.printStackTrace();
+ failed = true;
+
+ }
+ }
+
+ private static void testEncryptDecrypt(OAEPParameterSpec spec,
+ int dataLength) throws Exception {
+
+ System.out.print("Testing OAEP with hash ");
+ if (spec != null) {
+ System.out.print(spec.getDigestAlgorithm() + " and MGF " +
+ ((MGF1ParameterSpec)spec.getMGFParameters()).
+ getDigestAlgorithm());
+ } else {
+ System.out.print("Default");
+ }
+ System.out.println(", " + dataLength + " bytes");
+
+ Cipher c = Cipher.getInstance("RSA/ECB/OAEPPadding", cp);
+ if (spec != null) {
+ c.init(Cipher.ENCRYPT_MODE, publicKey, spec);
+ } else {
+ c.init(Cipher.ENCRYPT_MODE, publicKey);
+ }
+
+ byte[] data = new byte[dataLength];
+ byte[] enc = c.doFinal(data);
+ if (spec != null) {
+ c.init(Cipher.DECRYPT_MODE, privateKey, spec);
+ } else {
+ c.init(Cipher.DECRYPT_MODE, privateKey);
+ }
+ byte[] dec = c.doFinal(enc);
+ if (Arrays.equals(data, dec) == false) {
+ throw new Exception("Data does not match");
+ }
+ }
+}
--- a/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -7,7 +7,7 @@
* @author Robert Field
*
* @library ..
- * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE
+ * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE HelloWorld
* @run compile TemperatureTableTest.java
* @run compile -g TemperatureTableServlet.java
* @run main TemperatureTableTest
--- a/jdk/test/java/io/File/WinDeviceName.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/io/File/WinDeviceName.java Tue Aug 20 17:44:18 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,11 +22,12 @@
*/
/* @test
- @bug 6176051
- @summary Check isFile's handling of Windows device names
+ @bug 6176051 4858457
+ @summary Check whether reserved names are handled correctly on Windows
*/
import java.io.File;
+import java.io.IOException;
public class WinDeviceName {
private static String devnames[] = {
@@ -35,22 +36,38 @@
"LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9",
"CLOCK$"
};
- public static void main(String[] args) throws Exception {
+ public static void main(String[] args) {
String osName = System.getProperty("os.name");
if (!osName.startsWith("Windows")) {
return;
}
+
for (int i = 0; i < devnames.length; i++) {
- if (new File(devnames[i]).isFile() ||
- new File(devnames[i] + ".txt").isFile()) {
- if ("CLOCK$".equals(devnames[i]) &&
- (osName.startsWith("Windows 9") ||
- osName.startsWith("Windows Me"))) {
- //"CLOCK$" is a reserved device name for NT
- continue;
+ String names[] = { devnames[i], devnames[i] + ".TXT",
+ devnames[i].toLowerCase(),
+ devnames[i].toLowerCase() + ".txt" };
+
+ for (String name : names) {
+ File f = new File(name);
+ if (f.isFile()) {
+ if ("CLOCK$".equals(devnames[i]) &&
+ (osName.startsWith("Windows 9") ||
+ osName.startsWith("Windows Me"))) {
+ //"CLOCK$" is a reserved device name for NT
+ continue;
+ }
+ throw new RuntimeException("isFile() returns true for " +
+ "Device name " + devnames[i]);
}
- throw new Exception("isFile() returns true for Device name "
- + devnames[i]);
+
+ if (!"CLOCK$".equals(devnames[i])) {
+ try {
+ System.out.println((new File(name)).getCanonicalPath());
+ } catch(IOException ie) {
+ throw new RuntimeException("Fail to get canonical " +
+ "path for " + name);
+ }
+ }
}
}
}
--- a/jdk/test/java/lang/Math/ExactArithTests.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/Math/ExactArithTests.java Tue Aug 20 17:44:18 2013 -0700
@@ -132,7 +132,56 @@
fail("FAIL: int Math.multiplyExact(" + x + " * " + y + ")" + "; Unexpected exception: " + ex);
}
}
+ try {
+ // Test incrementExact
+ int inc = Math.incrementExact(x);
+ long inc2 = (long) x + 1L;
+ if ((int) inc2 != inc2) {
+ fail("FAIL: int Math.incrementExact(" + x + ") = " + inc + "; expected Arithmetic exception");
+ } else if (inc != inc2) {
+ fail("FAIL: long Math.incrementExact(" + x + ") = " + inc + "; expected: " + inc2);
+ }
+ } catch (ArithmeticException ex) {
+ long inc2 = (long) x + 1L;
+ if ((int) inc2 == inc2) {
+ fail("FAIL: int Math.incrementExact(" + x + ")" + "; Unexpected exception: " + ex);
+ }
+ }
+
+ try {
+ // Test decrementExact
+ int dec = Math.decrementExact(x);
+ long dec2 = (long) x - 1L;
+ if ((int) dec2 != dec2) {
+ fail("FAIL: int Math.decrementExact(" + x + ") = " + dec + "; expected Arithmetic exception");
+ } else if (dec != dec2) {
+ fail("FAIL: long Math.decrementExact(" + x + ") = " + dec + "; expected: " + dec2);
+ }
+ } catch (ArithmeticException ex) {
+ long dec2 = (long) x - 1L;
+ if ((int) dec2 == dec2) {
+ fail("FAIL: int Math.decrementExact(" + x + ")" + "; Unexpected exception: " + ex);
+
+ }
+ }
+
+ try {
+ // Test negateExact
+ int neg = Math.negateExact(x);
+ long neg2 = -((long)x) ;
+ if ((int) neg2 != neg2) {
+ fail("FAIL: int Math.negateExact(" + x + ") = " + neg + "; expected Arithmetic exception");
+ } else if (neg != neg2) {
+ fail("FAIL: long Math.negateExact(" + x + ") = " + neg + "; expected: " + neg2);
+ }
+ } catch (ArithmeticException ex) {
+ long neg2 = (long) x - 1L;
+ if ((int) neg2 == neg2) {
+ fail("FAIL: int Math.negateExact(" + x + ")" + "; Unexpected exception: " + ex);
+
+ }
+ }
}
/**
@@ -225,6 +274,39 @@
}
try {
+ // Test incrementExact
+ resultBig = xBig.add(BigInteger.ONE);
+ long inc = Math.incrementExact(x);
+ checkResult("long Math.incrementExact", x, 1L, inc, resultBig);
+ } catch (ArithmeticException ex) {
+ if (inLongRange(resultBig)) {
+ fail("FAIL: long Math.incrementExact(" + x + "); Unexpected exception: " + ex);
+ }
+ }
+
+ try {
+ // Test decrementExact
+ resultBig = xBig.subtract(BigInteger.ONE);
+ long dec = Math.decrementExact(x);
+ checkResult("long Math.decrementExact", x, 1L, dec, resultBig);
+ } catch (ArithmeticException ex) {
+ if (inLongRange(resultBig)) {
+ fail("FAIL: long Math.decrementExact(" + x + "); Unexpected exception: " + ex);
+ }
+ }
+
+ try {
+ // Test negateExact
+ resultBig = xBig.negate();
+ long dec = Math.negateExact(x);
+ checkResult("long Math.negateExact", x, 0L, dec, resultBig);
+ } catch (ArithmeticException ex) {
+ if (inLongRange(resultBig)) {
+ fail("FAIL: long Math.negateExact(" + x + "); Unexpected exception: " + ex);
+ }
+ }
+
+ try {
// Test toIntExact
int value = Math.toIntExact(x);
if ((long)value != x) {
--- a/jdk/test/java/lang/ProcessBuilder/Basic.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/ProcessBuilder/Basic.java Tue Aug 20 17:44:18 2013 -0700
@@ -26,9 +26,10 @@
* @bug 4199068 4738465 4937983 4930681 4926230 4931433 4932663 4986689
* 5026830 5023243 5070673 4052517 4811767 6192449 6397034 6413313
* 6464154 6523983 6206031 4960438 6631352 6631966 6850957 6850958
- * 4947220 7018606 7034570 4244896
+ * 4947220 7018606 7034570 4244896 5049299
* @summary Basic tests for Process and Environment Variable code
* @run main/othervm/timeout=300 Basic
+ * @run main/othervm/timeout=300 -Djdk.lang.Process.launchMechanism=fork Basic
* @author Martin Buchholz
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ProcessBuilder/InheritIOEHandle.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 7147084
+ * @run main/othervm InheritIOEHandle
+ * @summary inherit IOE handles and MS CreateProcess limitations (kb315939)
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class InheritIOEHandle {
+ private static enum APP {
+ B, C;
+ }
+ private static File stopC = new File(".\\StopC.txt");
+ private static String SIGNAL = "After call child process";
+ private static String JAVA_EXE = System.getProperty("java.home")
+ + File.separator + "bin"
+ + File.separator + "java";
+
+ private static String[] getCommandArray(String processName) {
+ String[] cmdArray = {
+ JAVA_EXE,
+ "-cp",
+ System.getProperty("java.class.path"),
+ InheritIOEHandle.class.getName(),
+ processName
+ };
+ return cmdArray;
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (!System.getProperty("os.name").startsWith("Windows")) {
+ return;
+ }
+
+ if (args.length > 0) {
+ APP app = APP.valueOf(args[0]);
+ switch (app) {
+ case B:
+ performB();
+ break;
+ case C:
+ performC();
+ break;
+ }
+ return;
+ }
+ performA();
+ }
+
+ private static void performA() {
+ try {
+ stopC.delete();
+
+ ProcessBuilder builder = new ProcessBuilder(
+ getCommandArray(APP.B.name()));
+ builder.redirectErrorStream(true);
+
+ Process process = builder.start();
+
+ process.getOutputStream().close();
+ process.getErrorStream().close();
+
+ try (BufferedReader in = new BufferedReader( new InputStreamReader(
+ process.getInputStream(), "utf-8")))
+ {
+ String result;
+ while ((result = in.readLine()) != null) {
+ if (!SIGNAL.equals(result)) {
+ throw new Error("Catastrophe in process B! Bad output.");
+ }
+ }
+ }
+
+ // If JDK-7147084 is not fixed that point is unreachable.
+
+ // write signal file
+ stopC.createNewFile();
+
+ System.err.println("Read stream finished.");
+ } catch (IOException ex) {
+ throw new Error("Catastrophe in process A!", ex);
+ }
+ }
+
+ private static void performB() {
+ try {
+ ProcessBuilder builder = new ProcessBuilder(
+ getCommandArray(APP.C.name()));
+
+ Process process = builder.start();
+
+ process.getInputStream().close();
+ process.getOutputStream().close();
+ process.getErrorStream().close();
+
+ System.out.println(SIGNAL);
+
+ // JDK-7147084 subject:
+ // Process C inherits the [System.out] handle and
+ // handle close in B does not finalize the streaming for A.
+ // (handle reference count > 1).
+ } catch (IOException ex) {
+ throw new Error("Catastrophe in process B!", ex);
+ }
+ }
+
+ private static void performC() {
+ // If JDK-7147084 is not fixed the loop is 5min long.
+ for (int i = 0; i < 5*60; ++i) {
+ try {
+ Thread.sleep(1000);
+ // check for sucess
+ if (stopC.exists())
+ break;
+ } catch (InterruptedException ex) {
+ // that is ok. Longer sleep - better effect.
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ProcessBuilder/SiblingIOEHandle.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6921885
+ * @run main/othervm SiblingIOEHandle
+ * @summary inherit IOE handles and MS CreateProcess limitations (kb315939)
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+
+public class SiblingIOEHandle {
+ private static enum APP {
+ B, C;
+ }
+ private static File stopC = new File(".\\StopCs.txt");
+ private static String SIGNAL = "B child reported.";
+ private static String JAVA_EXE = System.getProperty("java.home")
+ + File.separator + "bin"
+ + File.separator + "java";
+
+ private static String[] getCommandArray(String processName) {
+ String[] cmdArray = {
+ JAVA_EXE,
+ "-cp",
+ System.getProperty("java.class.path"),
+ SiblingIOEHandle.class.getName(),
+ processName
+ };
+ return cmdArray;
+ }
+
+ public static void main(String[] args) {
+ if (!System.getProperty("os.name").startsWith("Windows")) {
+ return;
+ }
+
+ if (args.length > 0) {
+ APP app = APP.valueOf(args[0]);
+ switch (app) {
+ case B:
+ performB();
+ break;
+ case C:
+ performC();
+ break;
+ }
+ return;
+ }
+ performA(true);
+ performA(false);
+ }
+
+ static boolean procClaunched = false;
+
+ private static void waitAbit() {
+ try {
+ Thread.sleep(0);
+ } catch (InterruptedException ex) {
+ // that was long enough
+ }
+ }
+ private static boolean waitBarrier(CyclicBarrier barrier) {
+ while (true) try {
+ barrier.await();
+ return true;
+ } catch (InterruptedException ex) {
+ continue;
+ } catch (BrokenBarrierException ex) {
+ ex.printStackTrace();
+ return false;
+ }
+ }
+
+ private static void performA(boolean fileOut) {
+ try {
+ stopC.delete();
+ ProcessBuilder builderB = new ProcessBuilder(
+ getCommandArray(APP.B.name()));
+
+ File outB = null;
+ if (fileOut) {
+ outB = new File("outB.txt");
+ builderB.redirectOutput(outB);
+ }
+ builderB.redirectErrorStream(true);
+
+ final CyclicBarrier barrier = new CyclicBarrier(2);
+ Thread procCRunner = new Thread(new Runnable() {
+ @Override public void run() {
+ try {
+ if (waitBarrier(barrier)) {
+ waitAbit();
+ // Run process C next to B ASAP to make an attempt
+ // to capture the B-process IOE handles in C process.
+ Runtime.getRuntime().exec(getCommandArray(APP.C.name()));
+ procClaunched = true;
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ });
+ procCRunner.start();
+
+
+ if (!waitBarrier(barrier)) {
+ throw new Error("Catastrophe in process A! Synchronization failed.");
+ }
+ // Run process B first.
+ Process processB = builderB.start();
+
+ while (true) try {
+ procCRunner.join();
+ break;
+ } catch (InterruptedException ex) {
+ continue;
+ }
+
+ if (!procClaunched) {
+ throw new Error("Catastrophe in process A! C was not launched.");
+ }
+
+ processB.getOutputStream().close();
+ processB.getErrorStream().close();
+
+ if (fileOut) {
+ try {
+ processB.waitFor();
+ } catch (InterruptedException ex) {
+ throw new Error("Catastrophe in process B! B hung up.");
+ }
+ System.err.println("Trying to delete [outB.txt].");
+ if (!outB.delete()) {
+ throw new Error("Greedy brother C deadlock! File share.");
+ }
+ System.err.println("Succeeded in delete [outB.txt].");
+ } else {
+ System.err.println("Read stream start.");
+ try (BufferedReader in = new BufferedReader( new InputStreamReader(
+ processB.getInputStream(), "utf-8")))
+ {
+ String result;
+ while ((result = in.readLine()) != null) {
+ if (!SIGNAL.equals(result)) {
+ throw new Error("Catastrophe in process B! Bad output.");
+ }
+ }
+ }
+ System.err.println("Read stream finished.");
+ }
+ // If JDK-6921885 is not fixed that point is unreachable.
+ // Test timeout exception.
+
+ // write signal file to stop C process.
+ stopC.createNewFile();
+ } catch (IOException ex) {
+ throw new Error("Catastrophe in process A!", ex);
+ }
+ }
+
+ private static void performB() {
+ System.out.println(SIGNAL);
+ }
+
+ private static void performC() {
+ // If JDK-7147084 is not fixed the loop is 5min long.
+ for (int i = 0; i < 5*60; ++i) {
+ try {
+ Thread.sleep(1000);
+ // check for sucess
+ if (stopC.exists())
+ break;
+ } catch (InterruptedException ex) {
+ // that is ok. Longer sleep - better effect.
+ }
+ }
+ }
+}
--- a/jdk/test/java/lang/invoke/AccessControlTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/invoke/AccessControlTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -28,7 +28,7 @@
* @library ../../../..
* @build test.java.lang.invoke.AccessControlTest
* @build test.java.lang.invoke.AccessControlTest_subpkg.Acquaintance_remote
- * @run junit/othervm test.java.lang.invoke.AccessControlTest
+ * @run testng/othervm test.java.lang.invoke.AccessControlTest
*/
package test.java.lang.invoke;
@@ -36,12 +36,14 @@
import java.lang.invoke.*;
import java.lang.reflect.*;
import java.util.*;
-import org.junit.*;
+import org.testng.*;
+import org.testng.annotations.*;
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodHandles.Lookup.*;
import static java.lang.invoke.MethodType.*;
-import static org.junit.Assert.*;
+import static org.testng.Assert.*;
+
import test.java.lang.invoke.AccessControlTest_subpkg.Acquaintance_remote;
--- a/jdk/test/java/lang/invoke/ClassValueTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/invoke/ClassValueTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -26,20 +26,14 @@
/* @test
* @summary tests for class-specific values
* @compile ClassValueTest.java
- * @run junit/othervm test.java.lang.invoke.ClassValueTest
- */
-
-/*
- Manually:
- $ $JAVA7X_HOME/bin/javac -d foo -cp $JUNIT4_JAR test/java/lang/invoke/ClassValueTest.java
- $ $JAVA7X_HOME/bin/java -cp foo:$JUNIT4_JAR org.junit.runner.JUnitCore test.java.lang.invoke.ClassValueTest
- Output: .testAdd => 1000 : Integer
+ * @run testng/othervm test.java.lang.invoke.ClassValueTest
*/
package test.java.lang.invoke;
-import org.junit.*;
-import static org.junit.Assert.*;
+import org.testng.*;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.*;
/**
* @author jrose
--- a/jdk/test/java/lang/invoke/InvokeGenericTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/invoke/InvokeGenericTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -26,7 +26,7 @@
/* @test
* @summary unit tests for java.lang.invoke.MethodHandle.invoke
* @compile InvokeGenericTest.java
- * @run junit/othervm test.java.lang.invoke.InvokeGenericTest
+ * @run testng/othervm test.java.lang.invoke.InvokeGenericTest
*/
package test.java.lang.invoke;
@@ -36,10 +36,9 @@
import static java.lang.invoke.MethodType.*;
import java.lang.reflect.*;
import java.util.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-import static org.junit.Assume.*;
-
+import org.testng.*;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.*;
/**
*
@@ -71,7 +70,7 @@
String testName;
static int allPosTests, allNegTests;
int posTests, negTests;
- @After
+ @AfterMethod
public void printCounts() {
if (verbosity >= 2 && (posTests | negTests) != 0) {
System.out.println();
--- a/jdk/test/java/lang/invoke/JavaDocExamplesTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/invoke/JavaDocExamplesTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -26,19 +26,9 @@
/* @test
* @summary example code used in javadoc for java.lang.invoke API
* @compile JavaDocExamplesTest.java
- * @run junit/othervm test.java.lang.invoke.JavaDocExamplesTest
+ * @run testng/othervm test.java.lang.invoke.JavaDocExamplesTest
*/
-/*
----- To run outside jtreg:
-$ $JAVA7X_HOME/bin/javac -cp $JUNIT4_JAR -d /tmp/Classes \
- $DAVINCI/sources/jdk/test/java/lang/invoke/JavaDocExamplesTest.java
-$ $JAVA7X_HOME/bin/java -cp $JUNIT4_JAR:/tmp/Classes \
- -DJavaDocExamplesTest.verbosity=1 \
- test.java.lang.invoke.JavaDocExamplesTest
-----
-*/
-
package test.java.lang.invoke;
import java.lang.invoke.*;
@@ -47,22 +37,21 @@
import java.util.*;
-import org.junit.*;
-import static org.junit.Assert.*;
-
+import org.testng.*;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.*;
/**
* @author jrose
*/
public class JavaDocExamplesTest {
- /** Wrapper for running the JUnit tests in this module.
- * Put JUnit on the classpath!
+ /** Wrapper for running the TestNG tests in this module.
+ * Put TestNG on the classpath!
*/
public static void main(String... ignore) throws Throwable {
- System.out.println("can run this as:");
- System.out.println("$ java org.junit.runner.JUnitCore "+JavaDocExamplesTest.class.getName());
new JavaDocExamplesTest().run();
}
+
public void run() throws Throwable {
testFindVirtual();
testPermuteArguments();
--- a/jdk/test/java/lang/invoke/MethodTypeTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/invoke/MethodTypeTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -24,7 +24,7 @@
/* @test
* @summary unit tests for java.lang.invoke.MethodType
* @compile MethodTypeTest.java
- * @run junit/othervm test.java.lang.invoke.MethodTypeTest
+ * @run testng/othervm test.java.lang.invoke.MethodTypeTest
*/
package test.java.lang.invoke;
@@ -34,8 +34,9 @@
import java.lang.reflect.Method;
import java.util.*;
-import org.junit.*;
-import static org.junit.Assert.*;
+import org.testng.*;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.*;
/**
*
@@ -53,7 +54,7 @@
private MethodType[] GALLERY;
private Method compareTo;
- @Before
+ @BeforeMethod
public void setUp() throws Exception {
rtype = void.class;
ptypes = new Class<?>[] { int.class, String.class };
@@ -94,7 +95,7 @@
};
}
- @After
+ @AfterMethod
public void tearDown() throws Exception {
}
--- a/jdk/test/java/lang/invoke/PermuteArgsTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/invoke/PermuteArgsTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -25,7 +25,7 @@
/* @test
* @summary unit tests for method handles which permute their arguments
- * @run junit/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies -ea -esa -DPermuteArgsTest.MAX_ARITY=8 test.java.lang.invoke.PermuteArgsTest
+ * @run testng/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies -ea -esa -DPermuteArgsTest.MAX_ARITY=8 test.java.lang.invoke.PermuteArgsTest
*/
/* Examples of manual runs:
* java -DPermuteArgsTest.{DRY_RUN=true,MAX_ARITY=253} test.java.lang.invoke.PermuteArgsTest
@@ -35,7 +35,8 @@
package test.java.lang.invoke;
-import org.junit.*;
+import org.testng.*;
+import org.testng.annotations.*;
import java.util.*;
import java.lang.reflect.*;
--- a/jdk/test/java/lang/invoke/ThrowExceptionsTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/invoke/ThrowExceptionsTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -25,12 +25,13 @@
/* @test
* @summary unit tests for method handles which permute their arguments
- * @run junit test.java.lang.invoke.ThrowExceptionsTest
+ * @run testng test.java.lang.invoke.ThrowExceptionsTest
*/
package test.java.lang.invoke;
-import org.junit.*;
+import org.testng.*;
+import org.testng.annotations.*;
import java.util.*;
import java.lang.reflect.*;
--- a/jdk/test/java/lang/reflect/Method/GenericStringTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/lang/reflect/Method/GenericStringTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -48,10 +48,18 @@
if (egs != null) {
String actual = method.toGenericString();
System.out.println(actual);
- if (! egs.value().equals(actual)) {
- failures++;
- System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n",
- egs.value(), actual);
+ if (method.isBridge()) {
+ if (! egs.bridgeValue().equals(actual)) {
+ failures++;
+ System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n",
+ egs.value(), actual);
+ }
+ } else {
+ if (! egs.value().equals(actual)) {
+ failures++;
+ System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n",
+ egs.value(), actual);
+ }
}
}
@@ -117,7 +125,8 @@
class Roebling implements Comparable<Roebling> {
@ExpectedGenericString(
- "public int Roebling.compareTo(Roebling)")
+ value="public int Roebling.compareTo(Roebling)",
+ bridgeValue="public int Roebling.compareTo(java.lang.Object)")
public int compareTo(Roebling r) {
throw new IllegalArgumentException();
}
@@ -154,9 +163,11 @@
@Retention(RetentionPolicy.RUNTIME)
@interface ExpectedGenericString {
String value();
+ String bridgeValue() default "";
}
@Retention(RetentionPolicy.RUNTIME)
@interface ExpectedString {
String value();
}
+
--- a/jdk/test/java/math/BigInteger/BigIntegerTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/math/BigInteger/BigIntegerTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -74,10 +74,10 @@
static final int ORDER_SMALL = 60;
static final int ORDER_MEDIUM = 100;
- // #bits for testing Karatsuba and Burnikel-Ziegler
+ // #bits for testing Karatsuba
static final int ORDER_KARATSUBA = 1800;
- // #bits for testing Toom-Cook
- static final int ORDER_TOOM_COOK = 3000;
+ // #bits for testing Toom-Cook and Burnikel-Ziegler
+ static final int ORDER_TOOM_COOK = 4000;
// #bits for testing Karatsuba squaring
static final int ORDER_KARATSUBA_SQUARE = 3200;
// #bits for testing Toom-Cook squaring
@@ -964,12 +964,12 @@
nextProbablePrime();
arithmetic(order1); // small numbers
- arithmetic(order3); // Karatsuba / Burnikel-Ziegler range
- arithmetic(order4); // Toom-Cook range
+ arithmetic(order3); // Karatsuba range
+ arithmetic(order4); // Toom-Cook / Burnikel-Ziegler range
divideAndRemainder(order1); // small numbers
- divideAndRemainder(order3); // Karatsuba / Burnikel-Ziegler range
- divideAndRemainder(order4); // Toom-Cook range
+ divideAndRemainder(order3); // Karatsuba range
+ divideAndRemainder(order4); // Toom-Cook / Burnikel-Ziegler range
pow(order1);
pow(order3);
@@ -989,8 +989,8 @@
byteArrayConv(order1);
modInv(order1); // small numbers
- modInv(order3); // Karatsuba / Burnikel-Ziegler range
- modInv(order4); // Toom-Cook range
+ modInv(order3); // Karatsuba range
+ modInv(order4); // Toom-Cook / Burnikel-Ziegler range
modExp(order1, order2);
modExp2(order1);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/IDN/IllegalArg.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8020842
+ * @summary IDN do not throw IAE when hostname ends with a trailing dot
+ */
+
+import java.net.*;
+
+public class IllegalArg {
+
+ public static void main(String[] args) throws Exception {
+ String[] illegalNames = {
+ "com..net",
+ "com..",
+ ".com",
+ ".com."
+ };
+
+ String[] legalNames = {
+ "example.com",
+ "com\u3002",
+ "com.",
+ "."
+ };
+
+ for (String name : illegalNames) {
+ try {
+ IDN.toASCII(name, IDN.USE_STD3_ASCII_RULES);
+ throw new Exception(
+ "Expected to get IllegalArgumentException for " + name);
+ } catch (IllegalArgumentException iae) {
+ // That's the right behavior.
+ }
+
+ try {
+ IDN.toASCII(name);
+ throw new Exception(
+ "Expected to get IllegalArgumentException for " + name);
+ } catch (IllegalArgumentException iae) {
+ // That's the right behavior.
+ }
+ }
+
+ for (String name : legalNames) {
+ System.out.println("Convering " + name);
+ System.out.println(IDN.toASCII(name, IDN.USE_STD3_ASCII_RULES));
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/NetworkInterface/MemLeakTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8022584
+ * @summary Some NetworkInterface methods can leak native memory
+ * @run main/othervm/timeout=700 MemLeakTest
+ */
+
+/* Note: the test can cause a memory leak that's why othervm option is required
+ */
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Collection;
+import java.util.Collections;
+
+public class MemLeakTest {
+
+ /**
+ * Memory leak is assumed, if application consumes more than specified amount of memory during its execution.
+ * The number is given in Kb.
+ */
+ private static final long MEM_LEAK_THRESHOLD = 32 * 1024; // 32Mb
+
+ public static void main(String[] args)
+ throws Exception {
+
+ if (!System.getProperty("os.name").equals("Linux")) {
+ System.out.println("Test only runs on Linux");
+ return;
+ }
+
+ // warm up
+ accessNetInterfaces(3);
+
+ long vMemBefore = getVMemSize();
+ accessNetInterfaces(500_000);
+ long vMemAfter = getVMemSize();
+
+ long vMemDelta = vMemAfter - vMemBefore;
+ if (vMemDelta > MEM_LEAK_THRESHOLD) {
+ throw new Exception("FAIL: Virtual memory usage increased by " + vMemDelta + "Kb " +
+ "(greater than " + MEM_LEAK_THRESHOLD + "Kb)");
+ }
+
+ System.out.println("PASS: Virtual memory usage increased by " + vMemDelta + "Kb " +
+ "(not greater than " + MEM_LEAK_THRESHOLD + "Kb)");
+ }
+
+ private static void accessNetInterfaces(int times) {
+ try {
+ Collection<NetworkInterface> interfaces =
+ Collections.list(NetworkInterface.getNetworkInterfaces());
+ for (int i = 0; i != times; ++i) {
+ for (NetworkInterface netInterface : interfaces) {
+ netInterface.getMTU();
+ netInterface.isLoopback();
+ netInterface.isUp();
+ netInterface.isPointToPoint();
+ netInterface.supportsMulticast();
+ }
+ }
+ } catch (SocketException ignore) {}
+ }
+
+ /**
+ * Returns size of virtual memory allocated to the process in Kb.
+ * Linux specific. On other platforms and in case of any errors returns 0.
+ */
+ private static long getVMemSize() {
+
+ // Refer to the Linux proc(5) man page for details about /proc/self/stat file
+ //
+ // In short, this file contains status information about the current process
+ // written in one line. The fields are separated with spaces.
+ // The 23rd field is defined as 'vsize %lu Virtual memory size in bytes'
+
+ try (FileReader fileReader = new FileReader("/proc/self/stat");
+ BufferedReader bufferedReader = new BufferedReader(fileReader)) {
+ String line = bufferedReader.readLine();
+ return Long.parseLong(line.split(" ")[22]) / 1024;
+ } catch (Exception ignore) {}
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/ServerSocket/SelectFdsLimit.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8021820
+ * @summary The total number of file descriptors is limited to
+ * 1024(FDSET_SIZE) on MacOSX (the size of fd array passed to select()
+ * call in java.net classes is limited to this value).
+ * @run main/othervm SelectFdsLimit
+ * @author aleksej.efimov@oracle.com
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.ServerSocket;
+import java.net.SocketTimeoutException;
+
+
+/*
+ * Test must be run in othervm mode to ensure that all files
+ * opened by openFiles() are closed propertly.
+*/
+public class SelectFdsLimit {
+ static final int FDTOOPEN = 1023;
+ static final String TESTFILE = "testfile";
+ static FileInputStream [] testFIS;
+
+ static void prepareTestEnv() throws IOException {
+ File fileToCreate = new File(TESTFILE);
+ if (!fileToCreate.exists())
+ if (!fileToCreate.createNewFile())
+ throw new RuntimeException("Can't create test file");
+ }
+
+ //If there will be some problem (i.e. ulimits on number of opened files will fail)
+ //then this method will fail with exception and test will be considered as
+ //failed. But allocated fds will be released because the test is executed by
+ //dedicated VM (@run main/othervm).
+ static void openFiles(int fn, File f) throws FileNotFoundException, IOException {
+ testFIS = new FileInputStream[FDTOOPEN];
+ for (;;) {
+ if (0 == fn)
+ break;
+ FileInputStream fis = new FileInputStream(f);
+ testFIS[--fn] = fis;
+ }
+ }
+
+ public static void main(String [] args) throws IOException, FileNotFoundException {
+
+ //The bug 8021820 is a Mac specific and because of that test will pass on all
+ //other platforms
+ if (!System.getProperty("os.name").contains("OS X")) {
+ return;
+ }
+
+ //Create test directory with test files
+ prepareTestEnv();
+
+ //Consume FD ids for this java process to overflow the 1024
+ openFiles(FDTOOPEN,new File(TESTFILE));
+
+ //Wait for incoming connection and make the select() used in java.net
+ //classes fail the limitation on FDSET_SIZE
+ ServerSocket socket = new ServerSocket(0);
+
+ //Set the minimal timeout, no one is
+ //going to connect to this server socket
+ socket.setSoTimeout(1);
+
+ // The accept() call will throw SocketException if the
+ // select() has failed due to limitation on fds size,
+ // indicating test failure. A SocketTimeoutException
+ // is expected, so it is caught and ignored, and the test
+ // passes.
+ try {
+ socket.accept();
+ } catch (SocketTimeoutException e) { }
+ }
+}
--- a/jdk/test/java/net/URLClassLoader/profiles/Basic.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.net.*;
-import java.io.File;
-import java.util.jar.*;
-
-/**
- * Attempts to load classes or resources from a JAR file. The load should succeed
- * if the runtime supports the profile indicated by the Profile attribute, fail
- * with UnsupportedProfileException otherwise.
- */
-
-public class Basic {
-
- static int indexOf(String profile) {
- if (profile == null || "compact1".equals(profile)) return 1;
- if ("compact2".equals(profile)) return 2;
- if ("compact3".equals(profile)) return 3;
- if ("".equals(profile)) return 4;
- return Integer.MAX_VALUE; // unknown profile name
- }
-
- public static void main(String[] args) throws Exception {
- if (args.length < 2)
- throw new RuntimeException("Usage: java <jarfile> <classname>");
- String jar = args[0];
- String cn = args[1];
-
- File lib = new File(jar);
- URL url = lib.toURI().toURL();
- URL urls[] = { url };
-
- // ## replace this if there is a standard way to determine the profile
- String thisProfile = sun.misc.Version.profileName();
-
- String jarProfile = null;
- try (JarFile jf = new JarFile(lib)) {
- Manifest manifest = jf.getManifest();
- if (manifest != null) {
- Attributes mainAttrs = manifest.getMainAttributes();
- if (mainAttrs != null) {
- jarProfile = mainAttrs.getValue(Attributes.Name.PROFILE);
- }
- }
- }
-
- boolean shouldFail = indexOf(thisProfile) < indexOf(jarProfile);
-
- try (URLClassLoader cl = new URLClassLoader(urls)) {
- System.out.format("Loading %s from %s ...%n", cn, jar);
- Class<?> c = Class.forName(cn, true, cl);
- System.out.println(c);
- if (shouldFail)
- throw new RuntimeException("UnsupportedProfileException expected");
- } catch (UnsupportedProfileException x) {
- if (!shouldFail)
- throw x;
- System.out.println("UnsupportedProfileException thrown as expected");
- }
-
- try (URLClassLoader cl = new URLClassLoader(urls)) {
- System.out.format("Loading resource from %s ...%n", jar);
- URL r = cl.findResource("META-INF/MANIFEST.MF");
- System.out.println(r);
- if (shouldFail)
- throw new RuntimeException("UnsupportedProfileException expected");
- } catch (UnsupportedProfileException x) {
- if (!shouldFail)
- throw x;
- System.out.println("UnsupportedProfileException thrown as expected");
- }
- }
-}
-
--- a/jdk/test/java/net/URLClassLoader/profiles/Lib.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package lib;
-
-public class Lib {
- private Lib() { }
-
- public static void doSomething() { }
-}
--- a/jdk/test/java/net/URLClassLoader/profiles/basic.sh Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-#
-# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-# @test
-# @bug 8003255
-# @compile -XDignore.symbol.file Basic.java Lib.java
-# @summary Test that UnsupportedProfileException thrown when attempting to
-# load classes or resources from a JAR file with the Profile attribute
-# @run shell basic.sh
-
-if [ -z "$TESTJAVA" ]; then
- if [ $# -lt 1 ]; then exit 1; fi
- TESTJAVA=$1; shift
- COMPILEJAVA=$TESTJAVA
- TESTSRC=`pwd`
- TESTCLASSES=`pwd`
-fi
-
-echo "Creating GoodLib.jar ..."
-echo "Profile: compact3" > good.mf
-$COMPILEJAVA/bin/jar cvfm GoodLib.jar good.mf -C $TESTCLASSES lib
-
-echo "Create BadLib.jar ..."
-echo "Profile: badname" > bad.mf
-$COMPILEJAVA/bin/jar cvfm BadLib.jar bad.mf -C $TESTCLASSES lib
-
-# remove classes so that they aren't on the classpath
-rm -rf $TESTCLASSES/lib
-
-echo "Test with GoodLib.jar ..."
-$TESTJAVA/bin/java -cp $TESTCLASSES Basic GoodLib.jar lib.Lib
-
-echo "Test with BadLib.jar ..."
-$TESTJAVA/bin/java -cp $TESTCLASSES Basic BadLib.jar lib.Lib
-
--- a/jdk/test/java/nio/channels/ServerSocketChannel/AdaptServerSocket.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/nio/channels/ServerSocketChannel/AdaptServerSocket.java Tue Aug 20 17:44:18 2013 -0700
@@ -35,7 +35,7 @@
public class AdaptServerSocket {
static java.io.PrintStream out = System.out;
-
+ static volatile boolean clientStarted = false;
static volatile Exception clientException = null;
static volatile Thread client = null;
@@ -44,15 +44,14 @@
{
Thread t = new Thread() {
public void run() {
- try {
- Socket so = new Socket();
+ try (Socket so = new Socket()) {
out.println("client: " + so);
+ clientStarted = true;
if (dally > 0)
Thread.sleep(dally);
so.connect(new InetSocketAddress(port));
if (Thread.interrupted()) {
out.println("client interrupted");
- so.close();
return;
}
out.println("client: " + so);
@@ -61,7 +60,6 @@
a += 1;
so.getOutputStream().write(a);
out.println("client: wrote " + a);
- so.close();
} catch (Exception x) {
if (x instanceof InterruptedException)
return;
@@ -78,43 +76,44 @@
static void test(int clientDally, int timeout, boolean shouldTimeout)
throws Exception
{
+ clientStarted = false;
out.println();
- ServerSocketChannel ssc = ServerSocketChannel.open();
- ServerSocket sso = ssc.socket();
- out.println("created: " + ssc);
- out.println(" " + sso);
- if (timeout != 0)
- sso.setSoTimeout(timeout);
- out.println("timeout: " + sso.getSoTimeout());
- sso.bind(null);
- out.println("bound: " + ssc);
- out.println(" " + sso);
- startClient(sso.getLocalPort(), clientDally);
- Thread.sleep(10);
+ try (ServerSocketChannel ssc = ServerSocketChannel.open();
+ ServerSocket sso = ssc.socket()) {
+ out.println("created: " + ssc);
+ out.println(" " + sso);
+ if (timeout != 0)
+ sso.setSoTimeout(timeout);
+ out.println("timeout: " + sso.getSoTimeout());
+ sso.bind(null);
+ out.println("bound: " + ssc);
+ out.println(" " + sso);
+ startClient(sso.getLocalPort(), clientDally);
+ while (!clientStarted) {
+ Thread.sleep(20);
+ }
+ Socket so = null;
+ try {
+ so = sso.accept();
+ } catch (SocketTimeoutException x) {
+ if (shouldTimeout)
+ out.println("Accept timed out, as expected");
+ else
+ throw x;
+ }
+ if (shouldTimeout && (so != null))
+ throw new Exception("Accept did not time out");
- Socket so = null;
- try {
- so = sso.accept();
- } catch (SocketTimeoutException x) {
- if (shouldTimeout)
- out.println("Accept timed out, as expected");
- else
- throw x;
+ if (so != null) {
+ int a = 42;
+ so.getOutputStream().write(a);
+ int b = so.getInputStream().read();
+ if (b != a + 1)
+ throw new Exception("Read incorrect data");
+ out.println("server: read " + b);
+ }
}
- if (shouldTimeout && (so != null))
- throw new Exception("Accept did not time out");
-
- if (so != null) {
- int a = 42;
- so.getOutputStream().write(a);
- int b = so.getInputStream().read();
- if (b != a + 1)
- throw new Exception("Read incorrect data");
- out.println("server: read " + b);
- sso.close();
- }
-
client.interrupt();
client.join();
if (clientException != null)
--- a/jdk/test/java/time/tck/java/time/chrono/TCKChronology.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/time/tck/java/time/chrono/TCKChronology.java Tue Aug 20 17:44:18 2013 -0700
@@ -148,7 +148,7 @@
@DataProvider(name = "calendarDisplayName")
Object[][] data_of_calendarDisplayNames() {
return new Object[][] {
- {"Hijrah", "Hijrah-umalqura"},
+ {"Hijrah", "Islamic Umm al-Qura Calendar"},
{"ISO", "ISO"},
{"Japanese", "Japanese Calendar"},
{"Minguo", "Minguo Calendar"},
--- a/jdk/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java Tue Aug 20 17:44:18 2013 -0700
@@ -438,13 +438,13 @@
// Test to verify the formatted dates
@Test(dataProvider="patternMonthNames")
public void test_ofPattern(int year, int month, int day, String expected) {
- DateTimeFormatter test = DateTimeFormatter.ofPattern("dd G E MMMM yyyy");
+ DateTimeFormatter test = DateTimeFormatter.ofPattern("dd G E MMMM yyyy", Locale.US);
assertEquals(test.format(HijrahDate.of(year, month, day)), expected);
}
// Data provider for localized dates
@DataProvider(name="chronoDateTimes")
- Object[][] data_chronodatetimes() {
+ Object[][] data_chronodatetimes() {
return new Object[][] {
{1432, 12, 29, "Safar 1, 1434 AH"},
{1433, 1, 30, "Safar 30, 1434 AH"},
@@ -463,7 +463,7 @@
hdt = hdt.plus(1, ChronoUnit.HOURS);
hdt = hdt.plus(1, ChronoUnit.MINUTES);
hdt = hdt.plus(1, ChronoUnit.SECONDS);
- DateTimeFormatter df = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withChronology(Chronology.of("Hijrah-umalqura")).withLocale(Locale.forLanguageTag("en-US"));
+ DateTimeFormatter df = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withChronology(Chronology.of("Hijrah-umalqura")).withLocale(Locale.US);
assertEquals(df.format(hdt), expected);
}
--- a/jdk/test/java/time/test/java/time/format/TestNonIsoFormatter.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/time/test/java/time/format/TestNonIsoFormatter.java Tue Aug 20 17:44:18 2013 -0700
@@ -110,7 +110,7 @@
// Chronology, Locale, Chronology Name
{ ISO8601, Locale.ENGLISH, "ISO" }, // No data in CLDR; Use Id.
{ BUDDHIST, Locale.ENGLISH, "Buddhist Calendar" },
- { HIJRAH, Locale.ENGLISH, "Hijrah-umalqura" }, // No data in CLDR; Use Id.
+ { HIJRAH, Locale.ENGLISH, "Islamic Umm al-Qura Calendar" }, // JDK-8015986
{ JAPANESE, Locale.ENGLISH, "Japanese Calendar" },
{ MINGUO, Locale.ENGLISH, "Minguo Calendar" },
@@ -121,6 +121,10 @@
{ ISO8601, thTH, "ISO" }, // No data in CLDR; Use Id.
{ JAPANESE, thTH, "\u0e1b\u0e0f\u0e34\u0e17\u0e34\u0e19\u0e0d\u0e35\u0e48\u0e1b\u0e38\u0e48\u0e19" },
{ BUDDHIST, thTH, "\u0e1b\u0e0f\u0e34\u0e17\u0e34\u0e19\u0e1e\u0e38\u0e17\u0e18" },
+
+ { HIJRAH, ARABIC, "\u0644\u062a\u0642\u0648\u064a\u0645 "
+ + "\u0627\u0644\u0647\u062c\u0631\u064a\u060c "
+ + "\u0623\u0645 \u0627\u0644\u0642\u0631\u0649" }, // JDK-8015986
};
}
--- a/jdk/test/java/time/test/java/util/TestFormatter.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/time/test/java/util/TestFormatter.java Tue Aug 20 17:44:18 2013 -0700
@@ -22,16 +22,27 @@
*/
package test.java.util;
+import static org.testng.Assert.assertEquals;
+
import java.time.Instant;
+import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.time.ZoneId;
+
+import java.time.chrono.ChronoLocalDate;
+import java.time.chrono.ChronoLocalDateTime;
+import java.time.chrono.ChronoZonedDateTime;
+import java.time.chrono.Chronology;
+
import java.time.temporal.ChronoField;
+import java.time.temporal.TemporalQuery;
+import java.time.temporal.TemporalAccessor;
import java.util.*;
+import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
-import static org.testng.Assert.assertEquals;
/* @test
* @summary Unit test for j.u.Formatter threeten date/time support
@@ -57,18 +68,32 @@
private int total = 0;
private int failure = 0;
- private boolean verbose = true;
+ private boolean verbose = false;
- @Test
- public void test () {
+ @DataProvider(name = "calendarsByLocale")
+ Object[][] data_calendars() {
+ return new Object[][] {
+ {"en_US"},
+ {"th_TH"},
+ {"ja-JP-u-ca-japanese"},
+ };
+ }
+ @Test(dataProvider="calendarsByLocale")
+ public void test (String calendarLocale) {
+ failure = 0;
int N = 12;
//locales = Locale.getAvailableLocales();
Locale[] locales = new Locale[] {
Locale.ENGLISH, Locale.FRENCH, Locale.JAPANESE, Locale.CHINESE};
Random r = new Random();
- ZonedDateTime zdt0 = ZonedDateTime.now();
- ZonedDateTime[] zdts = new ZonedDateTime[] {
+
+ Locale calLocale = Locale.forLanguageTag(calendarLocale);
+ Chronology chrono = Chronology.ofLocale(calLocale);
+ ChronoLocalDate now = chrono.dateNow();
+ ChronoLocalDateTime<?> ldt0 = now.atTime(LocalTime.now());
+ ChronoZonedDateTime<?> zdt0 = ldt0.atZone(ZoneId.systemDefault());
+ ChronoZonedDateTime<?>[] zdts = new ChronoZonedDateTime<?>[] {
zdt0,
zdt0.withZoneSameLocal(ZoneId.of("UTC")),
zdt0.withZoneSameLocal(ZoneId.of("GMT")),
@@ -76,11 +101,11 @@
};
while (N-- > 0) {
- for (ZonedDateTime zdt : zdts) {
- zdt = zdt.withDayOfYear(r.nextInt(365) + 1)
+ for (ChronoZonedDateTime<?> zdt : zdts) {
+ zdt = zdt.with(ChronoField.DAY_OF_YEAR, (r.nextInt(365) + 1))
.with(ChronoField.SECOND_OF_DAY, r.nextInt(86400));
Instant instant = zdt.toInstant();
- Calendar cal = Calendar.getInstance();
+ Calendar cal = Calendar.getInstance(calLocale);
cal.setTimeInMillis(instant.toEpochMilli());
cal.setTimeZone(TimeZone.getTimeZone(zdt.getZone()));
for (Locale locale : locales) {
@@ -106,8 +131,19 @@
}
private String getClassName(Object o) {
- Class c = o.getClass();
- return c.getName().substring(c.getPackage().getName().length() + 1);
+ Class<?> c = o.getClass();
+ String clname = c.getName().substring(c.getPackage().getName().length() + 1);
+ if (o instanceof TemporalAccessor) {
+ Chronology chrono = ((TemporalAccessor)o).query(TemporalQuery.chronology());
+ if (chrono != null) {
+ clname = clname + "(" + chrono.getId() + ")";
+ }
+ }
+ if (o instanceof Calendar) {
+ String type = ((Calendar)o).getCalendarType();
+ clname = clname + "(" + type + ")";
+ }
+ return clname;
}
private String test(String fmtStr, Locale locale,
@@ -115,12 +151,12 @@
String out = new Formatter(
new StringBuilder(), locale).format(fmtStr, dt).out().toString();
if (verbose) {
- System.out.printf("%-18s : %s%n", getClassName(dt), out);
+ System.out.printf("%-24s : %s%n", getClassName(dt), out);
}
if (expected != null && !out.equals(expected)) {
- System.out.printf("=====>%-18s : %s [ FAILED expected: %s ]%n",
+ System.out.printf("%-24s actual: %s%n FAILED; expected: %s%n",
getClassName(dt), out, expected);
- new RuntimeException().printStackTrace();
+ new RuntimeException().printStackTrace(System.out);
failure++;
}
total++;
@@ -135,24 +171,29 @@
}
private void testDate(String fmtStr, Locale locale,
- ZonedDateTime zdt, Calendar cal) {
+ ChronoZonedDateTime<?> zdt, Calendar cal) {
printFmtStr(locale, fmtStr);
String expected = test(fmtStr, locale, null, cal);
test(fmtStr, locale, expected, zdt);
- test(fmtStr, locale, expected, zdt.toOffsetDateTime());
test(fmtStr, locale, expected, zdt.toLocalDateTime());
test(fmtStr, locale, expected, zdt.toLocalDate());
+ if (zdt instanceof ZonedDateTime) {
+ test(fmtStr, locale, expected, ((ZonedDateTime)zdt).toOffsetDateTime());
+ }
}
private void testTime(String fmtStr, Locale locale,
- ZonedDateTime zdt, Calendar cal) {
+ ChronoZonedDateTime<?> zdt, Calendar cal) {
printFmtStr(locale, fmtStr);
String expected = test(fmtStr, locale, null, cal);
test(fmtStr, locale, expected, zdt);
- test(fmtStr, locale, expected, zdt.toOffsetDateTime());
test(fmtStr, locale, expected, zdt.toLocalDateTime());
- test(fmtStr, locale, expected, zdt.toOffsetDateTime().toOffsetTime());
test(fmtStr, locale, expected, zdt.toLocalTime());
+ if (zdt instanceof ZonedDateTime) {
+ OffsetDateTime odt = ((ZonedDateTime)zdt).toOffsetDateTime();
+ test(fmtStr, locale, expected, odt);
+ test(fmtStr, locale, expected, odt.toOffsetTime());
+ }
}
private String toZoneIdStr(String expected) {
@@ -164,7 +205,7 @@
.replaceAll("GMT|UTC|UT", "Z");
}
- private void testZoneId(Locale locale, ZonedDateTime zdt, Calendar cal) {
+ private void testZoneId(Locale locale, ChronoZonedDateTime<?> zdt, Calendar cal) {
String fmtStr = "z:[%tz] z:[%1$Tz] Z:[%1$tZ] Z:[%1$TZ]";
printFmtStr(locale, fmtStr);
String expected = toZoneIdStr(test(fmtStr, locale, null, cal));
@@ -174,8 +215,11 @@
cal0.setTimeInMillis(zdt.toInstant().toEpochMilli());
cal0.setTimeZone(TimeZone.getTimeZone("GMT" + zdt.getOffset().getId()));
expected = toZoneOffsetStr(test(fmtStr, locale, null, cal0));
- test(fmtStr, locale, expected, zdt.toOffsetDateTime());
- test(fmtStr, locale, expected, zdt.toOffsetDateTime().toOffsetTime());
+ if (zdt instanceof ZonedDateTime) {
+ OffsetDateTime odt = ((ZonedDateTime)zdt).toOffsetDateTime();
+ test(fmtStr, locale, expected, odt);
+ test(fmtStr, locale, expected, odt.toOffsetTime());
+ }
// datetime + zid
fmtStr = "c:[%tc] c:[%1$Tc]";
@@ -185,12 +229,15 @@
}
private void testInstant(Locale locale, Instant instant,
- ZonedDateTime zdt, Calendar cal) {
+ ChronoZonedDateTime<?> zdt, Calendar cal) {
String fmtStr = "s:[%ts] s:[%1$Ts] Q:[%1$tQ] Q:[%1$TQ]";
printFmtStr(locale, fmtStr);
String expected = test(fmtStr, locale, null, cal);
test(fmtStr, locale, expected, instant);
test(fmtStr, locale, expected, zdt);
- test(fmtStr, locale, expected, zdt.toOffsetDateTime());
+ if (zdt instanceof ZonedDateTime) {
+ OffsetDateTime odt = ((ZonedDateTime)zdt).toOffsetDateTime();
+ test(fmtStr, locale, expected, odt);
+ }
}
}
--- a/jdk/test/java/util/Collection/ListDefaults.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/Collection/ListDefaults.java Tue Aug 20 17:44:18 2013 -0700
@@ -49,6 +49,7 @@
/**
* @test
+ * @bug 8023367
* @library testlibrary
* @build CollectionAsserts CollectionSupplier
* @run testng ListDefaults
@@ -100,6 +101,7 @@
@DataProvider(name="listProvider", parallel=true)
public static Object[][] listCases() {
final List<Object[]> cases = new LinkedList<>();
+ cases.add(new Object[] { Collections.emptyList() });
cases.add(new Object[] { new ArrayList<>() });
cases.add(new Object[] { new LinkedList<>() });
cases.add(new Object[] { new Vector<>() });
@@ -128,6 +130,11 @@
list.removeIf(null);
fail("expected NPE not thrown");
} catch (NullPointerException npe) {}
+ try {
+ list.sort(null);
+ } catch (Throwable t) {
+ fail("Exception not expected: " + t);
+ }
}
@Test
--- a/jdk/test/java/util/Collection/MOAT.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/Collection/MOAT.java Tue Aug 20 17:44:18 2013 -0700
@@ -30,7 +30,6 @@
* @summary Run many tests on many Collection and Map implementations
* @author Martin Buchholz
* @run main MOAT
- * @run main/othervm -XX:+AggressiveOpts MOAT
*/
/* Mother Of All (Collection) Tests
--- a/jdk/test/java/util/Comparator/TypeTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/Comparator/TypeTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -75,7 +75,7 @@
}
}
- public static void main(String[] args) {
+ public void testOrder() {
Manager m1 = new Manager("Manager", 2, 2000);
Manager m2 = new Manager("Manager", 4, 1300);
--- a/jdk/test/java/util/Currency/tablea1.txt Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/Currency/tablea1.txt Tue Aug 20 17:44:18 2013 -0700
@@ -1,12 +1,12 @@
#
#
-# Amendments up until ISO 4217 AMENDMENT NUMBER 155
-# (As of 11 April 2013)
+# Amendments up until ISO 4217 AMENDMENT NUMBER 156
+# (As of 23 July 2013)
#
# Version
FILEVERSION=1
-DATAVERSION=155
+DATAVERSION=156
# ISO 4217 currency data
AF AFN 971 2
@@ -135,7 +135,7 @@
KW KWD 414 3
KG KGS 417 2
LA LAK 418 2
-LV LVL 428 2
+LV LVL 428 2 2013-12-31-22-00-00 EUR 978 2
LB LBP 422 2
#LS ZAR 710 2
LS LSL 426 2
--- a/jdk/test/java/util/Spliterator/SpliteratorCharacteristics.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/Spliterator/SpliteratorCharacteristics.java Tue Aug 20 17:44:18 2013 -0700
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 8020156 8020009
+ * @bug 8020156 8020009 8022326
* @run testng SpliteratorCharacteristics
*/
@@ -32,80 +32,134 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
import java.util.Spliterator;
import java.util.TreeMap;
import java.util.TreeSet;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.ConcurrentSkipListSet;
import static org.testng.Assert.*;
@Test
public class SpliteratorCharacteristics {
- public void testTreeMap() {
- TreeMap<Integer, String> tm = new TreeMap<>();
- tm.put(1, "4");
- tm.put(2, "3");
- tm.put(3, "2");
- tm.put(4, "1");
+ // TreeMap
- assertCharacteristics(tm.keySet(),
- Spliterator.SIZED | Spliterator.DISTINCT |
- Spliterator.SORTED | Spliterator.ORDERED);
- assertNullComparator(tm.keySet());
-
- assertCharacteristics(tm.values(),
- Spliterator.SIZED | Spliterator.ORDERED);
- assertISEComparator(tm.values());
-
- assertCharacteristics(tm.entrySet(),
- Spliterator.SIZED | Spliterator.DISTINCT |
- Spliterator.SORTED | Spliterator.ORDERED);
- assertNotNullComparator(tm.entrySet());
+ public void testTreeMap() {
+ assertSortedMapCharacteristics(new TreeMap<>(),
+ Spliterator.SIZED | Spliterator.DISTINCT |
+ Spliterator.SORTED | Spliterator.ORDERED);
}
public void testTreeMapWithComparator() {
- TreeMap<Integer, String> tm = new TreeMap<>(Comparator.<Integer>reverseOrder());
- tm.put(1, "4");
- tm.put(2, "3");
- tm.put(3, "2");
- tm.put(4, "1");
-
- assertCharacteristics(tm.keySet(),
- Spliterator.SIZED | Spliterator.DISTINCT |
- Spliterator.SORTED | Spliterator.ORDERED);
- assertNotNullComparator(tm.keySet());
-
- assertCharacteristics(tm.values(),
- Spliterator.SIZED | Spliterator.ORDERED);
- assertISEComparator(tm.values());
-
- assertCharacteristics(tm.entrySet(),
- Spliterator.SIZED | Spliterator.DISTINCT |
- Spliterator.SORTED | Spliterator.ORDERED);
- assertNotNullComparator(tm.entrySet());
+ assertSortedMapCharacteristics(new TreeMap<>(Comparator.reverseOrder()),
+ Spliterator.SIZED | Spliterator.DISTINCT |
+ Spliterator.SORTED | Spliterator.ORDERED);
}
- public void testTreeSet() {
- TreeSet<Integer> ts = new TreeSet<>();
- ts.addAll(Arrays.asList(1, 2, 3, 4));
+
+ // TreeSet
- assertCharacteristics(ts,
- Spliterator.SIZED | Spliterator.DISTINCT |
- Spliterator.SORTED | Spliterator.ORDERED);
- assertNullComparator(ts);
+ public void testTreeSet() {
+ assertSortedSetCharacteristics(new TreeSet<>(),
+ Spliterator.SIZED | Spliterator.DISTINCT |
+ Spliterator.SORTED | Spliterator.ORDERED);
}
public void testTreeSetWithComparator() {
- TreeSet<Integer> ts = new TreeSet<>(Comparator.reverseOrder());
- ts.addAll(Arrays.asList(1, 2, 3, 4));
+ assertSortedSetCharacteristics(new TreeSet<>(Comparator.reverseOrder()),
+ Spliterator.SIZED | Spliterator.DISTINCT |
+ Spliterator.SORTED | Spliterator.ORDERED);
+ }
+
+
+ // ConcurrentSkipListMap
+
+ public void testConcurrentSkipListMap() {
+ assertSortedMapCharacteristics(new ConcurrentSkipListMap<>(),
+ Spliterator.CONCURRENT | Spliterator.NONNULL |
+ Spliterator.DISTINCT | Spliterator.SORTED |
+ Spliterator.ORDERED);
+ }
- assertCharacteristics(ts,
- Spliterator.SIZED | Spliterator.DISTINCT |
- Spliterator.SORTED | Spliterator.ORDERED);
- assertNotNullComparator(ts);
+ public void testConcurrentSkipListMapWithComparator() {
+ assertSortedMapCharacteristics(new ConcurrentSkipListMap<>(Comparator.<Integer>reverseOrder()),
+ Spliterator.CONCURRENT | Spliterator.NONNULL |
+ Spliterator.DISTINCT | Spliterator.SORTED |
+ Spliterator.ORDERED);
+ }
+
+
+ // ConcurrentSkipListSet
+
+ public void testConcurrentSkipListSet() {
+ assertSortedSetCharacteristics(new ConcurrentSkipListSet<>(),
+ Spliterator.CONCURRENT | Spliterator.NONNULL |
+ Spliterator.DISTINCT | Spliterator.SORTED |
+ Spliterator.ORDERED);
+ }
+
+ public void testConcurrentSkipListSetWithComparator() {
+ assertSortedSetCharacteristics(new ConcurrentSkipListSet<>(Comparator.reverseOrder()),
+ Spliterator.CONCURRENT | Spliterator.NONNULL |
+ Spliterator.DISTINCT | Spliterator.SORTED |
+ Spliterator.ORDERED);
}
+ //
+
+ void assertSortedMapCharacteristics(SortedMap<Integer, String> m, int keyCharacteristics) {
+ initMap(m);
+
+ boolean hasComparator = m.comparator() != null;
+
+ Set<Integer> keys = m.keySet();
+ assertCharacteristics(keys, keyCharacteristics);
+ if (hasComparator) {
+ assertNotNullComparator(keys);
+ }
+ else {
+ assertNullComparator(keys);
+ }
+
+ assertCharacteristics(m.values(),
+ keyCharacteristics & ~(Spliterator.DISTINCT | Spliterator.SORTED));
+ assertISEComparator(m.values());
+
+ assertCharacteristics(m.entrySet(), keyCharacteristics);
+ assertNotNullComparator(m.entrySet());
+ }
+
+ void assertSortedSetCharacteristics(SortedSet<Integer> s, int keyCharacteristics) {
+ initSet(s);
+
+ boolean hasComparator = s.comparator() != null;
+
+ assertCharacteristics(s, keyCharacteristics);
+ if (hasComparator) {
+ assertNotNullComparator(s);
+ }
+ else {
+ assertNullComparator(s);
+ }
+ }
+
+ void initMap(Map<Integer, String> m) {
+ m.put(1, "4");
+ m.put(2, "3");
+ m.put(3, "2");
+ m.put(4, "1");
+ }
+
+ void initSet(Set<Integer> s) {
+ s.addAll(Arrays.asList(1, 2, 3, 4));
+ }
+
void assertCharacteristics(Collection<?> c, int expectedCharacteristics) {
assertCharacteristics(c.spliterator(), expectedCharacteristics);
}
--- a/jdk/test/java/util/Spliterator/SpliteratorCollisions.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/Spliterator/SpliteratorCollisions.java Tue Aug 20 17:44:18 2013 -0700
@@ -148,7 +148,6 @@
List<Object[]> data = new ArrayList<>();
for (int size : SIZES) {
List<HashableInteger> exp = listIntRange(size, true);
- exp.add(0, null);
SpliteratorDataBuilder<HashableInteger> db = new SpliteratorDataBuilder<>(data, exp);
// Maps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/jar/JarInputStream/ExtraFileInMetaInf.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8021788
+ * @summary JarInputStream doesn't provide certificates for some file under META-INF
+ */
+
+import java.util.jar.*;
+import java.io.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ExtraFileInMetaInf {
+ public static void main(String args[]) throws Exception {
+
+ // Create a zip file with 2 entries
+ try (ZipOutputStream zos =
+ new ZipOutputStream(new FileOutputStream("x.jar"))) {
+ zos.putNextEntry(new ZipEntry("META-INF/SUB/file"));
+ zos.write(new byte[10]);
+ zos.putNextEntry(new ZipEntry("x"));
+ zos.write(new byte[10]);
+ zos.close();
+ }
+
+ // Sign it
+ new File("ks").delete();
+ sun.security.tools.keytool.Main.main(
+ ("-keystore ks -storepass changeit -keypass changeit " +
+ "-alias a -dname CN=A -genkeypair").split(" "));
+ sun.security.tools.jarsigner.Main.main(
+ "-keystore ks -storepass changeit x.jar a".split(" "));
+
+ // Check if the entries are signed
+ try (JarInputStream jis =
+ new JarInputStream(new FileInputStream("x.jar"))) {
+ JarEntry je;
+ while ((je = jis.getNextJarEntry()) != null) {
+ String name = je.toString();
+ if (name.equals("META-INF/SUB/file") || name.equals("x")) {
+ while (jis.read(new byte[1000]) >= 0);
+ if (je.getCertificates() == null) {
+ throw new Exception(name + " not signed");
+ }
+ }
+ }
+ }
+ }
+}
--- a/jdk/test/java/util/logging/bundlesearch/ResourceBundleSearchTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/logging/bundlesearch/ResourceBundleSearchTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -57,9 +57,32 @@
private static int numFail = 0;
private static List<String> msgs = new ArrayList<>();
+ // This test has been falling in timeout - so we're adding some
+ // time stamp here and there to help diagnose whether it's a
+ // simple system slowness or whether there's a deeper issue,
+ // like a deadlock. The timeout issue should be fixed now,
+ // but we leave the time stamps in case it reappears.
+ //
+ static final long stamp = System.currentTimeMillis();
+ private static String getTimeStamp() {
+ long time = System.currentTimeMillis();
+ long delta = time - stamp;
+ long min = delta/60000;
+ long sec = (delta - min * 60000) / 10000;
+ long msec = delta - min * 60000 - sec * 1000;
+ return (min == 0 ? "" : (min + " min. ")) +
+ (sec == 0 ? "" : (sec + " sec. ")) +
+ (msec == 0 ? "" : (msec + "ms."));
+ }
+
public static void main(String[] args) throws Throwable {
+ System.out.println("ResourceBundleSearchTest starting: "+getTimeStamp());
ResourceBundleSearchTest test = new ResourceBundleSearchTest();
- test.runTests();
+ try {
+ test.runTests();
+ } finally {
+ System.out.println("ResourceBundleSearchTest terminated: "+getTimeStamp());
+ }
}
private void runTests() throws Throwable {
@@ -77,15 +100,19 @@
urls[0] = Paths.get(testDir, "resources").toUri().toURL();
URLClassLoader rbClassLoader = new URLClassLoader(urls);
+ int testnb = 1;
+ System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp());
// Test 1 - can we find a Logger bundle from doing a stack search?
// We shouldn't be able to
assertFalse(testGetBundleFromStackSearch(), "1-testGetBundleFromStackSearch");
+ System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp());
// Test 2 - can we find a Logger bundle off of the Thread context class
// loader? We should be able to.
assertTrue(testGetBundleFromTCCL(TCCL_TEST_BUNDLE, rbClassLoader),
"2-testGetBundleFromTCCL");
+ System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp());
// Test 3 - Can we find a Logger bundle from the classpath? We should be
// able to. We'll first check to make sure the setup is correct and
// it actually is on the classpath before checking whether logging
@@ -99,21 +126,25 @@
+ " on the classpath");
}
+ System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp());
// Test 4 - we should be able to find a bundle from the caller's
// classloader, but only one level up.
assertTrue(testGetBundleFromCallersClassLoader(),
"4-testGetBundleFromCallersClassLoader");
+ System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp());
// Test 5 - this ensures that getAnonymousLogger(String rbName)
// can find the bundle from the caller's classloader
assertTrue(testGetAnonymousLogger(), "5-testGetAnonymousLogger");
+ System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp());
// Test 6 - first call getLogger("myLogger").
// Then call getLogger("myLogger","bundleName") from a different ClassLoader
// Make sure we find the bundle
assertTrue(testGetBundleFromSecondCallersClassLoader(),
"6-testGetBundleFromSecondCallersClassLoader");
+ System.out.println("ResourceBundleSearchTest generating report: "+getTimeStamp());
report();
}
@@ -132,6 +163,7 @@
public void assertTrue(boolean testResult, String testName) {
if (testResult) {
numPass++;
+ System.out.println("PASSED: " + testName);
} else {
numFail++;
System.out.println("FAILED: " + testName
@@ -142,6 +174,7 @@
public void assertFalse(boolean testResult, String testName) {
if (!testResult) {
numPass++;
+ System.out.println("PASSED: " + testName);
} else {
numFail++;
System.out.println("FAILED: " + testName
@@ -170,12 +203,10 @@
debug("Looking for " + bundleName + " using TCCL");
LoggingThread lr = new LoggingThread(bundleName, setOnTCCL);
lr.start();
- synchronized (lr) {
- try {
- lr.wait();
- } catch (InterruptedException ex) {
- throw ex;
- }
+ try {
+ lr.join();
+ } catch (InterruptedException ex) {
+ throw ex;
}
msgs.add(lr.msg);
return lr.foundBundle;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/stream/bootlib/java/util/stream/LambdaTestMode.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package java.util.stream;
+
+/**
+ * Runtime modes of test execution.
+ */
+public enum LambdaTestMode {
+ /**
+ * Execution mode with no particular runtime constraints.
+ */
+ NORMAL,
+
+ /**
+ * Execution mode where tests are executed for testing lambda serialization
+ * and deserialization.
+ *
+ * <p>This mode may be queried by tests or data supplied by data
+ * providers, which cannot otherwise be assigned to the test group
+ * <em>serialization-hostile</em>, to not execute or declare
+ * serialization-hostile code or data.
+ *
+ * <p>This mode is enabled if the boolean system property
+ * {@code org.openjdk.java.util.stream.sand.mode} is declared with a
+ * {@code true} value.
+ */
+ SERIALIZATION;
+
+ /**
+ * {@code true} if tests are executed in the mode for testing lambda
+ * Serialization ANd Deserialization (SAND).
+ */
+ private static final boolean IS_LAMBDA_SERIALIZATION_MODE =
+ Boolean.getBoolean("org.openjdk.java.util.stream.sand.mode");
+
+ /**
+ *
+ * @return the mode of test execution.
+ */
+ public static LambdaTestMode getMode() {
+ return IS_LAMBDA_SERIALIZATION_MODE ? SERIALIZATION : NORMAL;
+ }
+
+ /**
+ *
+ * @return {@code true} if normal test mode.
+ */
+ public static boolean isNormalMode() {
+ return getMode() == NORMAL;
+ }
+}
--- a/jdk/test/java/util/stream/bootlib/java/util/stream/StreamTestDataProvider.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/stream/bootlib/java/util/stream/StreamTestDataProvider.java Tue Aug 20 17:44:18 2013 -0700
@@ -96,8 +96,14 @@
list.add(streamDataDescr("DelegatingStream(ArrayList):" + name,
() -> new ArrayList<>(intsAsList).stream()));
List<Integer> aList = new ArrayList<>(intsAsList);
- list.add(collectionDataDescr("ArrayList.Sublist:" + name,
- (ints.length) <= 1 ? aList.subList(0, 0) : aList.subList(1, ints.length / 2)));
+ if (LambdaTestMode.isNormalMode()) {
+ // Only include sub-lists for normal test execution mode
+ // This data is serialization-hostile since the state of the
+ // deserialized sub-list will be out of sync with the
+ // enclosing list.
+ list.add(collectionDataDescr("ArrayList.Sublist:" + name,
+ (ints.length) <= 1 ? aList.subList(0, 0) : aList.subList(1, ints.length / 2)));
+ }
list.add(collectionDataDescr("LinkedList:" + name, new LinkedList<>(intsAsList)));
list.add(collectionDataDescr("HashSet:" + name, new HashSet<>(intsAsList)));
list.add(collectionDataDescr("LinkedHashSet:" + name, new LinkedHashSet<>(intsAsList)));
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
@@ -52,6 +53,7 @@
import org.testng.annotations.Test;
+import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.groupingByConcurrent;
import static java.util.stream.Collectors.partitioningBy;
@@ -603,4 +605,17 @@
new PartitionAssertion<>(classifier,
new ReduceAssertion<>(0, LambdaTestHelpers.identity(), Integer::sum)));
}
+
+ @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+ public void testComposeFinisher(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException {
+ List<Integer> asList = exerciseTerminalOps(data, s -> s.collect(toList()));
+ List<Integer> asImmutableList = exerciseTerminalOps(data, s -> s.collect(collectingAndThen(toList(), Collections::<Integer>unmodifiableList)));
+ assertEquals(asList, asImmutableList);
+ try {
+ asImmutableList.add(0);
+ fail("Expecting immutable result");
+ }
+ catch (UnsupportedOperationException ignored) { }
+ }
+
}
--- a/jdk/test/java/util/zip/TestExtraTime.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/java/util/zip/TestExtraTime.java Tue Aug 20 17:44:18 2013 -0700
@@ -23,14 +23,19 @@
/**
* @test
- * @bug 4759491 6303183 7012868
+ * @bug 4759491 6303183 7012868 8015666
* @summary Test ZOS and ZIS timestamp in extra field correctly
*/
import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.FileTime;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
@@ -41,14 +46,32 @@
File src = new File(System.getProperty("test.src", "."), "TestExtraTime.java");
if (src.exists()) {
- long mtime = src.lastModified();
- test(mtime, null);
- test(10, null); // ms-dos 1980 epoch problem
- test(mtime, TimeZone.getTimeZone("Asia/Shanghai"));
+ long time = src.lastModified();
+ FileTime mtime = FileTime.from(time, TimeUnit.MILLISECONDS);
+ FileTime atime = FileTime.from(time + 300000, TimeUnit.MILLISECONDS);
+ FileTime ctime = FileTime.from(time - 300000, TimeUnit.MILLISECONDS);
+ TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+
+ test(mtime, null, null, null);
+ // ms-dos 1980 epoch problem
+ test(FileTime.from(10, TimeUnit.MILLISECONDS), null, null, null);
+ // non-default tz
+ test(mtime, null, null, tz);
+
+ test(mtime, atime, null, null);
+ test(mtime, null, ctime, null);
+ test(mtime, atime, ctime, null);
+
+ test(mtime, atime, null, tz);
+ test(mtime, null, ctime, tz);
+ test(mtime, atime, ctime, tz);
}
}
- private static void test(long mtime, TimeZone tz) throws Throwable {
+ static void test(FileTime mtime, FileTime atime, FileTime ctime,
+ TimeZone tz) throws Throwable {
+ System.out.printf("--------------------%nTesting: [%s]/[%s]/[%s]%n",
+ mtime, atime, ctime);
TimeZone tz0 = TimeZone.getDefault();
if (tz != null) {
TimeZone.setDefault(tz);
@@ -57,23 +80,55 @@
ZipOutputStream zos = new ZipOutputStream(baos);
ZipEntry ze = new ZipEntry("TestExtreTime.java");
- ze.setTime(mtime);
+ ze.setLastModifiedTime(mtime);
+ if (atime != null)
+ ze.setLastAccessTime(atime);
+ if (ctime != null)
+ ze.setCreationTime(ctime);
zos.putNextEntry(ze);
zos.write(new byte[] { 1,2 ,3, 4});
zos.close();
if (tz != null) {
TimeZone.setDefault(tz0);
}
+ // ZipInputStream
ZipInputStream zis = new ZipInputStream(
new ByteArrayInputStream(baos.toByteArray()));
ze = zis.getNextEntry();
zis.close();
+ check(mtime, atime, ctime, ze);
- System.out.printf("%tc => %tc%n", mtime, ze.getTime());
+ // ZipFile
+ Path zpath = Paths.get(System.getProperty("test.dir", "."),
+ "TestExtraTimp.zip");
+ Files.copy(new ByteArrayInputStream(baos.toByteArray()), zpath);
+ ZipFile zf = new ZipFile(zpath.toFile());
+ ze = zf.getEntry("TestExtreTime.java");
+ // ZipFile read entry from cen, which does not have a/ctime,
+ // for now.
+ check(mtime, null, null, ze);
+ zf.close();
+ Files.delete(zpath);
+ }
- if (TimeUnit.MILLISECONDS.toSeconds(mtime) !=
- TimeUnit.MILLISECONDS.toSeconds(ze.getTime()))
- throw new RuntimeException("Timestamp storing failed!");
-
+ static void check(FileTime mtime, FileTime atime, FileTime ctime,
+ ZipEntry ze) {
+ /*
+ System.out.printf(" mtime [%tc]: [%tc]/[%tc]%n",
+ mtime.to(TimeUnit.MILLISECONDS),
+ ze.getTime(),
+ ze.getLastModifiedTime().to(TimeUnit.MILLISECONDS));
+ */
+ if (mtime.to(TimeUnit.SECONDS) !=
+ ze.getLastModifiedTime().to(TimeUnit.SECONDS))
+ throw new RuntimeException("Timestamp: storing mtime failed!");
+ if (atime != null &&
+ atime.to(TimeUnit.SECONDS) !=
+ ze.getLastAccessTime().to(TimeUnit.SECONDS))
+ throw new RuntimeException("Timestamp: storing atime failed!");
+ if (ctime != null &&
+ ctime.to(TimeUnit.SECONDS) !=
+ ze.getCreationTime().to(TimeUnit.SECONDS))
+ throw new RuntimeException("Timestamp: storing ctime failed!");
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/parsers/8022548/JDK8022548.xml Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<?xml-stylesheet type="text/xsl" href="../resources/style/pagex.xsl"?>
+
+<my:doc xmlns:my="http://www.jenitennison.com/" xmlns="http://www.w3.org/1999/xhtml">
+
+ <p>
+ These pages are all about XSLT, an XML-based language for translating one set of XML into another set of XML, or into HTML. Of course, there are all sorts of <my:link href="#links">other pages</my:link> around that cover XSLT. Jeni's XSLT Pages, though, are dedicated to helping people understand and make the most of using XSLT.
+</p>
+ <p>
+ My warmest thanks to all those people who post interesting problems on <my:link href="http://www.mulberytech.com/xsl/xsl-list/">XSL-List</my:link>, and especially to those of you that have encouraged me to set up this site through your kind emails.
+</p>
+
+</my:doc>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/parsers/8022548/JDK8022548.xsl Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,618 @@
+<?xml version="1.0" encoding='UTF-8'?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns:my="http://www.jenitennison.com/"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:dcq="http://purl.org/dc/qualifiers/1.0/"
+ xmlns:vcf="http://www.ietf.org/internet-drafts/draft-dawson-vcard-xml-dtd-03.txt"
+ xmlns:msxsl="urn:schemas-microsoft-com:xslt"
+ exclude-result-prefixes="rdf dc dcq my html vcf msxsl">
+
+<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+ cdata-section-elements="script"
+ indent="no"
+ method="xml"
+ encoding='UTF-8'/>
+
+<xsl:param name="dynamic" select="'true'" />
+<xsl:param name="base" select="'/'" />
+
+<xsl:variable name="supports-document" select="function-available('document')" />
+<xsl:variable name="supports-keys" select="function-available('key')" />
+
+<xsl:variable name="default-title" select='"Jeni's XML Site"' />
+
+<xsl:template match="my:doc">
+ <xsl:variable name="metadata" select="/*/rdf:RDF" />
+ <xsl:variable name="uri" select="$metadata/rdf:Description[1]/@about" />
+ <html>
+ <head>
+ <title>
+ <xsl:call-template name="get-metadata">
+ <xsl:with-param name="what" select="'title'" />
+ <xsl:with-param name="about" select="$uri" />
+ </xsl:call-template>
+ </title>
+ <xsl:call-template name="get-metadata">
+ <xsl:with-param name="what" select="'link'" />
+ <xsl:with-param name="about" select="$uri" />
+ </xsl:call-template>
+ <link rel="alternate" type="text/xml" href="{$uri}" />
+ <xsl:call-template name="get-metadata">
+ <xsl:with-param name="what" select="'rights'" />
+ <xsl:with-param name="about" select="$uri" />
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:if test="$dynamic = 'false'">
+ <p id="xml-link">
+ Try the <a href="{$uri}">XML version</a> of this page.
+ If you have problems with it, consult the
+ <a href="/compatibility.html">compatibility page</a>.
+ </p>
+ </xsl:if>
+ <xsl:apply-templates />
+ <xsl:apply-templates select="." mode="colophon" />
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="html:h1">
+ <h1>
+ <xsl:apply-templates />
+ <xsl:call-template name="insert-navigation" />
+ </h1>
+</xsl:template>
+
+<xsl:template name="insert-navigation">
+ <xsl:variable name="metadata" select="/*/rdf:RDF" />
+ <xsl:variable name="uri" select="$metadata/rdf:Description[1]/@about" />
+ <xsl:if test="$uri != concat($base, 'index.xml')">
+ <span id="link-top">
+ <a class="img">
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="$dynamic = 'true'">/index.xml</xsl:when>
+
+ <xsl:otherwise>/index.html</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <img src="{$base}resources/icons/top.gif" width="29" height="29" />
+ </a>
+ </span>
+ <span id="link-up">
+ <a class="img">
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="contains($uri, 'index.xml')">
+ <xsl:choose>
+ <xsl:when test="$dynamic = 'true'">../index.xml</xsl:when>
+ <xsl:otherwise>../index.html</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$dynamic = 'true'">index.xml</xsl:when>
+ <xsl:otherwise>index.html</xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <img src="{$base}resources/icons/up.gif" width="29" height="29" />
+ </a>
+ </span>
+</xsl:if>
+</xsl:template>
+
+
+<xsl:template match="rdf:RDF" />
+
+<xsl:template name="get-metadata">
+ <xsl:param name="what" />
+ <xsl:param name="about" select="/*/rdf:RDF/rdf:Description/@about" />
+ <xsl:variable name="metadata" select="/*/rdf:RDF" />
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="contains($what, '::')">
+ <xsl:value-of select="substring-before($what, '::')" />
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$what" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="mode">
+ <xsl:choose>
+ <xsl:when test="contains($what, '::')">
+ <xsl:value-of select="substring-after($what, '::')" />
+ </xsl:when>
+ <xsl:otherwise />
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:apply-templates select="$metadata/rdf:Description[@about = $about or
+ (@aboutEachPrefix != '' and starts-with($about, @aboutEachPrefix))]/*[local-name() = $type]">
+ <xsl:with-param name="mode" select="$mode" />
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="rdf:Description/*">
+ <xsl:param name="mode" />
+ <xsl:choose>
+ <xsl:when test="@rdf:resource != ''">
+ <xsl:call-template name="get-metadata">
+ <xsl:with-param name="about" select="@rdf:resource" />
+ <xsl:with-param name="what" select="$mode" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$mode = '' and @rdf:value != ''">
+ <xsl:value-of select="@rdf:value" />
+ </xsl:when>
+ <xsl:when test="$mode = '' and *">
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="get-metadata">
+ <xsl:with-param name="mode" select="$mode" />
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="html:link" mode="get-metadata">
+ <link>
+ <xsl:copy-of select="@*" />
+ </link>
+</xsl:template>
+
+<xsl:template match="dc:rights" mode="get-metadata">
+ <xsl:comment>
+ <xsl:value-of select="." />
+ </xsl:comment>
+</xsl:template>
+
+<xsl:template match="dc:date" mode="get-metadata">
+ <xsl:param name="mode" select="''" />
+ <xsl:if test="$mode = @dcq:dateType">
+ <xsl:value-of select="@rdf:value" />
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="vcf:vCard" mode="get-metadata">
+ <xsl:param name="mode" select="''" />
+ <xsl:choose>
+ <xsl:when test="$mode = 'mailto-link'">
+ <xsl:call-template name="link">
+ <xsl:with-param name="link">
+ <xsl:choose>
+ <xsl:when test="vcf:email[contains(@email.type, 'PREF')]">
+ <xsl:value-of select="vcf:email[contains(@email.type, 'PREF')]" />
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="vcf:email[1]" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="value">
+ <xsl:apply-templates select="vcf:n" mode="full" />
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$mode = 'name'">
+ <xsl:apply-templates select="vcf:n" mode="full" />
+ </xsl:when>
+ <xsl:otherwise />
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="vcf:n" mode="full">
+ <xsl:if test="vcf:prefix">
+ <xsl:value-of select="vcf:prefix" /><xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="../vcf:nickname">
+ <xsl:value-of select="../vcf:nickname" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="vcf:given" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="vcf:family" />
+</xsl:template>
+
+<xsl:template match="html:*">
+ <xsl:element name="{local-name()}">
+ <xsl:copy-of select="@*" />
+ <xsl:apply-templates />
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="my:vars">
+ <dl>
+ <xsl:apply-templates />
+ </dl>
+</xsl:template>
+
+<xsl:template match="my:var">
+ <dt id="{translate(my:name, ' ', '-')}">
+ <xsl:text/>$<xsl:value-of select="my:name" />
+ <xsl:choose>
+ <xsl:when test="my:value">
+ <xsl:text/> = <xsl:apply-templates select="my:value" />
+ </xsl:when>
+ <xsl:when test="my:default">
+ <xsl:text/> [= <xsl:apply-templates select="my:default" />]<xsl:text/>
+ </xsl:when>
+ </xsl:choose>
+ </dt>
+ <dd>
+ <xsl:if test="my:desc"><xsl:apply-templates select="my:desc" /></xsl:if>
+ <xsl:if test="my:option">
+ <ul>
+ <xsl:apply-templates select="my:option" />
+ </ul>
+ </xsl:if>
+ <xsl:apply-templates select="my:defn" />
+ </dd>
+</xsl:template>
+
+<xsl:template match="my:option">
+ <li><xsl:apply-templates select="my:value" />: <xsl:apply-templates select="my:desc" /></li>
+</xsl:template>
+
+<xsl:template match="my:value | my:default">
+ <xsl:choose>
+ <xsl:when test="@type">
+ <span class="{@type}">
+ <xsl:choose>
+ <xsl:when test="@type = 'string'">'<xsl:value-of select="." />'</xsl:when>
+ <xsl:when test="@type = 'rtf'">"<xsl:value-of select="." />"</xsl:when>
+ <xsl:otherwise><xsl:value-of select="." /></xsl:otherwise>
+ </xsl:choose>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="." />
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="my:post">
+ <div class="post">
+ <xsl:apply-templates />
+ </div>
+</xsl:template>
+
+<xsl:template match="my:response">
+ <div class="response">
+ <xsl:apply-templates />
+ </div>
+</xsl:template>
+
+<xsl:template match="my:question">
+ <div class="question">
+ <p>
+ <xsl:call-template name="insert-icon">
+ <xsl:with-param name="icon" select="'question'" />
+ <xsl:with-param name="active" select="false()" />
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="*[1]/node()" />
+ </p>
+ <xsl:apply-templates select="*[position() > 1]"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="my:example | my:defn">
+ <pre>
+ <xsl:apply-templates />
+ </pre>
+</xsl:template>
+
+<xsl:template match="my:example[parent::my:aside and ancestor::my:example]">
+ <xsl:choose>
+ <xsl:when test="$dynamic = 'true'">
+ <pre>
+ <xsl:apply-templates />
+ </pre>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="example">
+ <xsl:apply-templates />
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="my:example[parent::my:aside and not(ancestor::my:example)]">
+ <xsl:call-template name="split-and-code">
+ <xsl:with-param name="text" select="string(.)" />
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="split-and-code">
+ <xsl:param name="text" />
+ <br />
+ <xsl:choose>
+ <xsl:when test="contains($text, '
')">
+ <code><xsl:value-of select="substring-before($text, '
')" /></code>
+ <xsl:call-template name="split-and-code">
+ <xsl:with-param name="text" select="substring-after($text, '
')" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <code><xsl:value-of select="$text" /></code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="my:aside">
+ <xsl:choose>
+ <xsl:when test="$dynamic = 'true'">
+ <span class="note"
+ ><img src="{$base}resources/icons/note.gif" height="17" width="13" border="0"
+ style="z-index: 2;"
+ onmouseover="javascript:{generate-id()}.style.visibility='visible';"
+ onmouseout="javascript:{generate-id()}.style.visibility='hidden';"
+ /><span class="popup" id="{generate-id()}"
+ onmouseover="javascript:{generate-id()}.style.visibility='visible';"
+ onmouseout="javascript:{generate-id()}.style.visibility='hidden';">
+ <xsl:apply-templates />
+ </span
+ ></span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ <span class="note">[<xsl:apply-templates />]</span>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="my:quote">
+ <blockquote uri="{@href}">
+ <xsl:apply-templates />
+ </blockquote>
+ <p class="byline">
+ <xsl:text>[From </xsl:text>
+ <xsl:call-template name="link">
+ <xsl:with-param name="link" select="@href" />
+ <xsl:with-param name="value">
+ <xsl:value-of select="@href" />
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>]</xsl:text>
+ </p>
+</xsl:template>
+
+<xsl:template match="my:icon">
+ <xsl:call-template name="insert-icon">
+ <xsl:with-param name="icon" select="@name" />
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="insert-icon">
+ <xsl:param name="icon" select="'goto'" />
+ <xsl:param name="active" select="true()" />
+ <img src="{$base}resources/icons/{$icon}.gif" height="28" width="28" border="0">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$base" />
+ <xsl:text>resources/icons/</xsl:text>
+ <xsl:if test="not($active)">click-</xsl:if>
+ <xsl:value-of select="$icon" />
+ <xsl:text>.gif</xsl:text>
+ </xsl:attribute>
+ <xsl:if test="$active">
+ <xsl:attribute name="onmouseover">javascript:this.src='<xsl:value-of select="$base" />resources/icons/over-<xsl:value-of select="$icon" />.gif'</xsl:attribute>
+ <xsl:attribute name="onclick">javascript:this.src='<xsl:value-of select="$base" />resources/icons/click-<xsl:value-of select="$icon" />.gif'</xsl:attribute>
+ <xsl:attribute name="onmouseout">javascript:this.src='<xsl:value-of select="$base" />resources/icons/<xsl:value-of select="$icon" />.gif'</xsl:attribute>
+ </xsl:if>
+ </img>
+</xsl:template>
+
+<xsl:template match="my:links">
+ <xsl:choose>
+ <xsl:when test="parent::html:dd">
+ <xsl:apply-templates select="my:link" mode="list" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="columnise">
+ <xsl:with-param name="max-height" select="3" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="columnise">
+ <xsl:param name="max-height" select="5" />
+ <xsl:param name="max-width" select="3" />
+ <xsl:variable name="no-items" select="count(*)" />
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$no-items > $max-height * $max-width">
+ <xsl:value-of select="$max-width" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="ceiling($no-items div $max-height)" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="height" select="ceiling($no-items div $width)" />
+ <table>
+ <colgroup span="{$width}" />
+ <tr>
+ <xsl:for-each select="*[position() = 1 or position() mod $height = 1]">
+ <td>
+ <xsl:apply-templates select=". | following-sibling::*[position() < $height]" mode="list" />
+ </td>
+ </xsl:for-each>
+ </tr>
+ </table>
+</xsl:template>
+
+<xsl:template match="my:link" mode="list">
+ <p class="link">
+ <xsl:call-template name="link">
+ <xsl:with-param name="link" select="@href" />
+ <xsl:with-param name="value">
+ <xsl:value-of select="." />
+ </xsl:with-param>
+ <xsl:with-param name="addicon" select="true()" />
+ </xsl:call-template>
+ </p>
+</xsl:template>
+
+<xsl:template match="my:link">
+ <xsl:apply-templates select="." mode="link" />
+</xsl:template>
+
+<xsl:template match="*[@href][. != '']" mode="link">
+ <xsl:call-template name="link">
+ <xsl:with-param name="link" select="@href" />
+ <xsl:with-param name="value">
+ <xsl:apply-templates />
+ </xsl:with-param>
+ <xsl:with-param name="addicon" select="@addicon" />
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="*[@href][. = '']" mode="link">
+ <xsl:call-template name="link">
+ <xsl:with-param name="link" select="@href" />
+ <xsl:with-param name="value">
+ <xsl:value-of select="@href" />
+ </xsl:with-param>
+ <xsl:with-param name="addicon" select="@addicon" />
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="text()|@*" mode="link">
+ <xsl:call-template name="link">
+ <xsl:with-param name="link" select="." />
+ <xsl:with-param name="value">
+ <xsl:value-of select="." />
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="link">
+ <xsl:param name="link" />
+ <xsl:param name="value" />
+ <xsl:param name="addicon" select="''" />
+ <xsl:variable name="uri">
+ <xsl:call-template name="full-uri">
+ <xsl:with-param name="uri" select="$link" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="class">
+ <xsl:call-template name="uri-class">
+ <xsl:with-param name="uri" select="$uri" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$addicon">
+ <a href="{$uri}">
+ <xsl:attribute name="class">
+ <xsl:text>img </xsl:text>
+ <xsl:value-of select="$class" />
+ </xsl:attribute>
+ <xsl:call-template name="insert-icon">
+ <xsl:with-param name="icon">
+ <xsl:call-template name="icon-type">
+ <xsl:with-param name="uri" select="$uri" />
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <a href="{$uri}">
+ <xsl:if test="$class != ''">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$class" />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$value" />
+ </a>
+</xsl:template>
+
+<xsl:template name="full-uri">
+ <xsl:param name="uri" />
+ <xsl:variable name="partial-uri">
+ <xsl:choose>
+ <xsl:when test="$dynamic='false' and
+ substring($uri, string-length($uri) - 3, 4) = '.xml'">
+ <xsl:value-of select="concat(substring($uri, 1, string-length($uri) - 4), '.html')" />
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$uri" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="starts-with($partial-uri, 'www')">
+ <xsl:text>http://</xsl:text><xsl:value-of select="$partial-uri" />
+ </xsl:when>
+ <xsl:when test="contains($partial-uri, '@') and not(starts-with($partial-uri, 'mailto:'))">
+ <xsl:text>mailto:</xsl:text><xsl:value-of select="$partial-uri" />
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$partial-uri" /></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="uri-class">
+ <xsl:param name="uri" />
+ <xsl:choose>
+ <xsl:when test="starts-with($uri, 'http://') and not(starts-with($uri, $base))">offsite</xsl:when>
+ <xsl:when test="starts-with($uri, 'mailto:')">mailto</xsl:when>
+ <xsl:when test="starts-with($uri, '#')">local</xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="icon-type">
+ <xsl:param name="uri" />
+ <xsl:variable name="url">
+ <xsl:choose>
+ <xsl:when test="starts-with($uri, 'http://')"><xsl:value-of select="substring-after($uri, 'http://')" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="$uri" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="(not(contains($url, '/')) and starts-with($url, 'www.')) or (contains($url, '/') and not(substring-after($url, '/')))">home</xsl:when>
+ <xsl:when test="contains($url, '@')">mail</xsl:when>
+ <xsl:otherwise>goto</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="/*" mode="colophon">
+ <xsl:variable name="metadata" select="/*/rdf:RDF" />
+ <xsl:variable name="uri" select="$metadata/rdf:Description[1]/@about" />
+ <div id="colophon">
+ <hr class="final" />
+ <p>
+ <xsl:apply-templates select="$uri" mode="link" />
+ <xsl:variable name="modified">
+ <xsl:call-template name="get-metadata">
+ <xsl:with-param name="what" select="'date::modified'" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="string($modified)">
+ <xsl:text> last modified </xsl:text>
+ <xsl:copy-of select="$modified" />
+ </xsl:if>
+ <xsl:variable name="creator">
+ <xsl:call-template name="get-metadata">
+ <xsl:with-param name="what" select="'creator::vCard::mailto-link'" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:text> by </xsl:text>
+ <xsl:choose>
+ <xsl:when test="string($creator)">
+ <xsl:copy-of select="$creator" />
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="mailto:mail@jenitennison.com" class="mailto">Jeni Tennison</a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/parsers/8022548/TestBase.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,73 @@
+
+import java.security.Policy;
+
+/**
+ *
+ *
+ * @author huizhe.wang@oracle.com
+ */
+public class TestBase {
+ public String filePath;
+ boolean hasSM;
+ String curdir;
+ Policy origPolicy;
+
+ String testName;
+ String errMsg;
+
+ int passed = 0, failed = 0;
+
+ /**
+ * Creates a new instance of StreamReader
+ */
+ public TestBase(String name) {
+ testName = name;
+ }
+
+ //junit @Override
+ protected void setUp() {
+ if (System.getSecurityManager() != null) {
+ hasSM = true;
+ System.setSecurityManager(null);
+ }
+
+ filePath = System.getProperty("test.src");
+ if (filePath == null) {
+ //current directory
+ filePath = System.getProperty("user.dir");
+ }
+ origPolicy = Policy.getPolicy();
+
+ }
+
+ //junit @Override
+ public void tearDown() {
+ // turn off security manager and restore policy
+ System.setSecurityManager(null);
+ Policy.setPolicy(origPolicy);
+ if (hasSM) {
+ System.setSecurityManager(new SecurityManager());
+ }
+ System.out.println("\nNumber of tests passed: " + passed);
+ System.out.println("Number of tests failed: " + failed + "\n");
+
+ if (errMsg != null ) {
+ throw new RuntimeException(errMsg);
+ }
+ }
+
+ void fail(String msg) {
+ if (errMsg == null) {
+ errMsg = msg;
+ } else {
+ errMsg = errMsg + "\n" + msg;
+ }
+ failed++;
+ }
+
+ void success(String msg) {
+ passed++;
+ System.out.println(msg);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/parsers/8022548/XOMParserTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test @bug 8022548
+ * @summary test that a parser can use DTDConfiguration
+ * @run main XOMParserTest
+ */
+import com.sun.org.apache.xerces.internal.impl.Constants;
+import com.sun.org.apache.xerces.internal.parsers.*;
+import java.io.*;
+import javax.xml.transform.*;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import org.xml.sax.InputSource;
+
+/**
+ * <p>Test {@link javax.xml.transform.Transformer} for JDK-8022548: SPECJVM2008
+ * has errors introduced in 7u40-b34
+ *
+ * Test XOM is supported after jaxp 1.5 </p>
+ *
+ * @author Joe Wang <huizhe.wang@oracle.com>
+ *
+ */
+public class XOMParserTest extends TestBase {
+
+ public XOMParserTest(String name) {
+ super(name);
+ }
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String[] args) {
+ XOMParserTest test = new XOMParserTest("XOM parser test");
+ test.setUp();
+ test.testTransform();
+ test.tearDown();
+ }
+
+ public final void testTransform() {
+
+ try {
+
+ String inFilename = filePath + "/JDK8022548.xml";
+ String xslFilename = filePath + "/JDK8022548.xsl";
+ String outFilename = filePath + "/JDK8022548.out";
+
+ StringWriter sw = new StringWriter();
+ // Create transformer factory
+ TransformerFactory factory = TransformerFactory.newInstance();
+ // set the translet name
+// factory.setAttribute("translet-name", "myTranslet");
+
+ // set the destination directory
+// factory.setAttribute("destination-directory", "c:\\temp");
+// factory.setAttribute("generate-translet", Boolean.TRUE);
+
+ // Use the factory to create a template containing the xsl file
+ Templates template = factory.newTemplates(new StreamSource(new FileInputStream(xslFilename)));
+ // Use the template to create a transformer
+ Transformer xformer = template.newTransformer();
+ // Prepare the input and output files
+ Source source = new StreamSource(new FileInputStream(inFilename));
+ Result result = new StreamResult(new FileOutputStream(outFilename));
+ //Result result = new StreamResult(sw);
+ // Apply the xsl file to the source file and write the result to the output file
+ xformer.transform(source, result);
+
+ /**
+ * String out = sw.toString(); if (out.indexOf("<p>") < 0 ) {
+ * fail(out); }
+ */
+ String canonicalizedFileName = outFilename + ".canonicalized";
+ canonicalize(outFilename, canonicalizedFileName);
+ } catch (Exception e) {
+ // unexpected failure
+ fail(e.getMessage());
+ }
+ }
+
+ public void canonicalize(String inName, String outName) {
+ try (//FileOutputStream outStream = new FileOutputStream(outName);
+ FileInputStream inputStream = new FileInputStream(inName);) {
+ JDK15XML1_0Parser parser = new JDK15XML1_0Parser();
+ parser.parse(new InputSource(inputStream));
+ success("test passed");
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ }
+
+ class JDK15XML1_0Parser extends SAXParser {
+
+ JDK15XML1_0Parser() throws org.xml.sax.SAXException {
+
+ super(new DTDConfiguration());
+ // workaround for Java 1.5 beta 2 bugs
+ com.sun.org.apache.xerces.internal.util.SecurityManager manager =
+ new com.sun.org.apache.xerces.internal.util.SecurityManager();
+ setProperty(Constants.XERCES_PROPERTY_PREFIX + Constants.SECURITY_MANAGER_PROPERTY, manager);
+
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/IllegalSNIName.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8020842
+ * @summary SNIHostName does not throw IAE when hostname ends
+ * with a trailing dot
+ */
+
+import javax.net.ssl.SNIHostName;
+
+public class IllegalSNIName {
+
+ public static void main(String[] args) throws Exception {
+ String[] illegalNames = {
+ "example\u3003\u3002com",
+ "example..com",
+ "com\u3002",
+ "com.",
+ "."
+ };
+
+ for (String name : illegalNames) {
+ try {
+ SNIHostName hostname = new SNIHostName(name);
+ throw new Exception(
+ "Expected to get IllegalArgumentException for " + name);
+ } catch (IllegalArgumentException iae) {
+ // That's the right behavior.
+ }
+ }
+ }
+}
--- a/jdk/test/sun/text/resources/LocaleData Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/text/resources/LocaleData Tue Aug 20 17:44:18 2013 -0700
@@ -7679,3 +7679,5 @@
FormatData/pt/MonthAbbreviations/10=nov
FormatData/pt/MonthAbbreviations/11=dez
+# bug 8021121
+CurrencyNames/lv_LV/EUR=\u20AC
--- a/jdk/test/sun/text/resources/LocaleDataTest.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java Tue Aug 20 17:44:18 2013 -0700
@@ -35,7 +35,7 @@
* 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787
* 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495
* 7003124 7085757 7028073 7171028 7189611 8000983 7195759 8004489 8006509
- * 7114053 7074882 7040556 8013836
+ * 7114053 7074882 7040556 8013836 8021121
* @summary Verify locale data
*
*/
--- a/jdk/test/sun/util/calendar/zi/tzdata/VERSION Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/VERSION Tue Aug 20 17:44:18 2013 -0700
@@ -21,4 +21,4 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-tzdata2013c
+tzdata2013d
--- a/jdk/test/sun/util/calendar/zi/tzdata/africa Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/africa Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -875,12 +875,18 @@
# announced that year's Ramadan daylight-saving transitions would be
# 2012-07-20 and 2012-08-20; see
# <http://www.mmsp.gov.ma/fr/actualites.aspx?id=288>.
-#
+
+# From Andrew Paprocki (2013-07-02):
+# Morocco announced that the year's Ramadan daylight-savings
+# transitions would be 2013-07-07 and 2013-08-10; see:
+# http://www.maroc.ma/en/news/morocco-suspends-daylight-saving-time-july-7-aug10
+
+# From Paul Eggert (2013-07-03):
# To estimate what the Moroccan government will do in future years,
-# transition dates for 2013 through 2021 were determined by running
+# transition dates for 2014 through 2021 were determined by running
# the following program under GNU Emacs 24.3:
#
-# (let ((islamic-year 1434))
+# (let ((islamic-year 1435))
# (while (< islamic-year 1444)
# (let ((a
# (calendar-gregorian-from-absolute
@@ -933,8 +939,8 @@
Rule Morocco 2012 max - Sep lastSun 3:00 0 -
Rule Morocco 2012 only - Jul 20 3:00 0 -
Rule Morocco 2012 only - Aug 20 2:00 1:00 S
-Rule Morocco 2013 only - Jul 9 3:00 0 -
-Rule Morocco 2013 only - Aug 8 2:00 1:00 S
+Rule Morocco 2013 only - Jul 7 3:00 0 -
+Rule Morocco 2013 only - Aug 10 2:00 1:00 S
Rule Morocco 2014 only - Jun 29 3:00 0 -
Rule Morocco 2014 only - Jul 29 2:00 1:00 S
Rule Morocco 2015 only - Jun 18 3:00 0 -
--- a/jdk/test/sun/util/calendar/zi/tzdata/antarctica Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/antarctica Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/asia Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/asia Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -1235,39 +1235,21 @@
Rule Zion 2012 only - Mar Fri>=26 2:00 1:00 D
Rule Zion 2012 only - Sep 23 2:00 0 S
-# From Ephraim Silverberg (2012-10-18):
-# Yesterday, the Interior Ministry Committee, after more than a year
-# past, approved sending the proposed June 2011 changes to the Time
-# Decree Law back to the Knesset for second and third (final) votes
-# before the upcoming elections on Jan. 22, 2013. Hence, although the
-# changes are not yet law, they are expected to be so before February 2013.
+# From Ephraim Silverberg (2013-06-27):
+# On June 23, 2013, the Israeli government approved changes to the
+# Time Decree Law. The next day, the changes passed the First Reading
+# in the Knesset. The law is expected to pass the Second and Third
+# (final) Readings by the beginning of September 2013.
#
-# As of 2013, DST starts at 02:00 on the Friday before the last Sunday in March.
-# DST ends at 02:00 on the first Sunday after October 1, unless it occurs on the
-# second day of the Jewish Rosh Hashana holiday, in which case DST ends a day
-# later (i.e. at 02:00 the first Monday after October 2).
-# [Rosh Hashana holidays are factored in until 2100.]
-
-# From Ephraim Silverberg (2012-11-05):
-# The Knesset passed today (in second and final readings) the amendment to the
-# Time Decree Law making the changes ... law.
+# As of 2013, DST starts at 02:00 on the Friday before the last Sunday
+# in March. DST ends at 02:00 on the last Sunday of October.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D
-Rule Zion 2013 2026 - Oct Sun>=2 2:00 0 S
-Rule Zion 2027 only - Oct Mon>=3 2:00 0 S
-Rule Zion 2028 max - Oct Sun>=2 2:00 0 S
-# The following rules are commented out for now, as they break older
-# versions of zic that support only signed 32-bit timestamps, i.e.,
-# through 2038-01-19 03:14:07 UTC.
-#Rule Zion 2028 2053 - Oct Sun>=2 2:00 0 S
-#Rule Zion 2054 only - Oct Mon>=3 2:00 0 S
-#Rule Zion 2055 2080 - Oct Sun>=2 2:00 0 S
-#Rule Zion 2081 only - Oct Mon>=3 2:00 0 S
-#Rule Zion 2082 max - Oct Sun>=2 2:00 0 S
+Rule Zion 2013 max - Oct lastSun 2:00 0 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Jerusalem 2:20:56 - LMT 1880
+Zone Asia/Jerusalem 2:20:54 - LMT 1880
2:20:40 - JMT 1918 # Jerusalem Mean Time?
2:00 Zion I%sT
@@ -2570,8 +2552,8 @@
Rule Syria 2007 only - Mar lastFri 0:00 1:00 S
# From Jesper Norgard (2007-10-27):
# The sister center ICARDA of my work CIMMYT is confirming that Syria DST will
-# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or
-# rather Midnight between Thursday and Friday. This does make more sence than
+# not take place 1st November at 0:00 o'clock but 1st November at 24:00 or
+# rather Midnight between Thursday and Friday. This does make more sense than
# having it between Wednesday and Thursday (two workdays in Syria) since the
# weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now
# it is implemented at midnight of the last workday before weekend...
--- a/jdk/test/sun/util/calendar/zi/tzdata/australasia Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/australasia Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -253,10 +253,16 @@
# - Macquarie Island will stay on UTC+11 for winter and therefore not
# switch back from daylight savings time when other parts of Australia do
# on 4 April.
+#
+# From Arthur David Olson (2013-05-23):
+# The 1919 transition is overspecified below so pre-2013 zics
+# will produce a binary file with an EST-type as the first 32-bit type;
+# this is required for correct handling of times before 1916 by
+# pre-2013 versions of localtime.
Zone Antarctica/Macquarie 0 - zzz 1899 Nov
10:00 - EST 1916 Oct 1 2:00
10:00 1:00 EST 1917 Feb
- 10:00 Aus EST 1919 Apr
+ 10:00 Aus EST 1919 Apr 1 0:00s
0 - zzz 1948 Mar 25
10:00 Aus EST 1967
10:00 AT EST 2010 Apr 4 3:00
@@ -1498,12 +1504,12 @@
# From Paul Eggert (2000-01-08):
# IATA SSIM (1999-09) says DST ends 0100 local time. Go with McDow.
-# From the BBC World Service (1998-10-31 11:32 UTC):
+# From the BBC World Service in
+# http://news.bbc.co.uk/2/hi/asia-pacific/205226.stm (1998-10-31 16:03 UTC):
# The Fijiian government says the main reasons for the time change is to
-# improve productivity and reduce road accidents. But correspondents say it
-# also hopes the move will boost Fiji's ability to compete with other pacific
-# islands in the effort to attract tourists to witness the dawning of the new
-# millenium.
+# improve productivity and reduce road accidents.... [T]he move is also
+# intended to boost Fiji's ability to attract tourists to witness the dawning
+# of the new millennium.
# http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13)
# reports that Fiji has discontinued DST.
@@ -1648,7 +1654,7 @@
# Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell.
# From Eric Ulevik (1999-05-03):
-# Tonga's director of tourism, who is also secretary of the National Millenium
+# Tonga's director of tourism, who is also secretary of the National Millennium
# Committee, has a plan to get Tonga back in front.
# He has proposed a one-off move to tropical daylight saving for Tonga from
# October to March, which has won approval in principle from the Tongan
--- a/jdk/test/sun/util/calendar/zi/tzdata/backward Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/backward Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/etcetera Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/etcetera Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/europe Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/europe Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -546,7 +546,7 @@
# It seems that Paris, Monaco, Rule France, Rule Belgium all agree on
# 2:00 standard time, e.g. 3:00 local time. However there are no
# countries that use C-Eur rules in September 1945, so the only items
-# affected are apparently these ficticious zones that translates acronyms
+# affected are apparently these fictitious zones that translate acronyms
# CET and MET:
#
# Zone CET 1:00 C-Eur CE%sT
@@ -2802,9 +2802,9 @@
# Ukraine
#
-# From Igor Karpov, who works for the Ukranian Ministry of Justice,
+# From Igor Karpov, who works for the Ukrainian Ministry of Justice,
# via Garrett Wollman (2003-01-27):
-# BTW, I've found the official document on this matter. It's goverment
+# BTW, I've found the official document on this matter. It's government
# regulations number 509, May 13, 1996. In my poor translation it says:
# "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday
# of March at 3am the time is changing to 4am and each last Sunday of
@@ -2838,7 +2838,7 @@
# time this year after all.
#
# From Udo Schwedt (2011-10-18):
-# As far as I understand, the recent change to the Ukranian time zone
+# As far as I understand, the recent change to the Ukrainian time zone
# (Europe/Kiev) to introduce permanent daylight saving time (similar
# to Russia) was reverted today:
#
--- a/jdk/test/sun/util/calendar/zi/tzdata/factory Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/factory Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/iso3166.tab Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/iso3166.tab Tue Aug 20 17:44:18 2013 -0700
@@ -1,39 +1,37 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-# <pre>
+# ISO 3166 alpha-2 country codes
+#
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
-# ISO 3166 alpha-2 country codes
#
-# From Paul Eggert (2006-09-27):
+# From Paul Eggert (2013-05-27):
#
# This file contains a table with the following columns:
# 1. ISO 3166-1 alpha-2 country code, current as of
-# ISO 3166-1 Newsletter VI-1 (2007-09-21). See:
-# <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html">
-# ISO 3166 Maintenance agency (ISO 3166/MA)
-# </a>.
+# ISO 3166-1 Newsletter VI-15 (2013-05-10). See: Updates on ISO 3166
+# http://www.iso.org/iso/home/standards/country_codes/updates_on_iso_3166.htm
# 2. The usual English name for the country,
# chosen so that alphabetic sorting of subsets produces helpful lists.
# This is not the same as the English name in the ISO 3166 tables.
@@ -43,8 +41,9 @@
#
# Lines beginning with `#' are comments.
#
-# From Arthur David Olson (2011-08-17):
-# Resynchronized today with the ISO 3166 site (adding SS for South Sudan).
+# This table is intended as an aid for users, to help them select time
+# zone data appropriate for their practical needs. It is not intended
+# to take or endorse any position on legal or territorial claims.
#
#country-
#code country name
@@ -77,7 +76,7 @@
BM Bermuda
BN Brunei
BO Bolivia
-BQ Bonaire Sint Eustatius & Saba
+BQ Bonaire, St Eustatius & Saba
BR Brazil
BS Bahamas
BT Bhutan
@@ -258,7 +257,7 @@
SS South Sudan
ST Sao Tome & Principe
SV El Salvador
-SX Sint Maarten
+SX St Maarten (Dutch part)
SY Syria
SZ Swaziland
TC Turks & Caicos Is
--- a/jdk/test/sun/util/calendar/zi/tzdata/leapseconds Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/leapseconds Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/northamerica Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/northamerica Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/pacificnew Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/pacificnew Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/solar87 Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/solar87 Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/solar88 Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/solar88 Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/solar89 Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/solar89 Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/southamerica Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/southamerica Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
@@ -994,7 +994,7 @@
# adopted by the same states as before.
Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S
# From Frederico A. C. Neves (2008-09-10):
-# Acording to this decree
+# According to this decree
# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm">
# http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm
# </a>
@@ -1226,7 +1226,7 @@
# http://www.emol.com/noticias/nacional/detalle/detallenoticias.asp?idnoticia=467651
# </a>
#
-# This is not yet reflected in the offical "cambio de hora" site, but
+# This is not yet reflected in the official "cambio de hora" site, but
# probably will be soon:
# <a href="http://www.horaoficial.cl/cambio.htm">
# http://www.horaoficial.cl/cambio.htm
--- a/jdk/test/sun/util/calendar/zi/tzdata/systemv Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/systemv Tue Aug 20 17:44:18 2013 -0700
@@ -1,22 +1,22 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
--- a/jdk/test/sun/util/calendar/zi/tzdata/zone.tab Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/sun/util/calendar/zi/tzdata/zone.tab Tue Aug 20 17:44:18 2013 -0700
@@ -1,41 +1,44 @@
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
+#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
-#
+#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
-#
+#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
+#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-# <pre>
+# TZ zone descriptions
+#
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
#
-# TZ zone descriptions
-#
-# From Paul Eggert (1996-08-05):
+# From Paul Eggert (2013-05-27):
#
# This file contains a table with the following columns:
# 1. ISO 3166 2-character country code. See the file `iso3166.tab'.
+# This identifies a country that overlaps the zone. The country may
+# overlap other zones and the zone may overlap other countries.
# 2. Latitude and longitude of the zone's principal location
# in ISO 6709 sign-degrees-minutes-seconds format,
# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
# first latitude (+ is north), then longitude (+ is east).
+# This location need not lie within the column-1 country.
# 3. Zone name used in value of TZ environment variable.
+# Please see the 'Theory' file for how zone names are chosen.
# 4. Comments; present if and only if the country has multiple rows.
#
# Columns are separated by a single tab.
@@ -45,6 +48,10 @@
#
# Lines beginning with `#' are comments.
#
+# This table is intended as an aid for users, to help them select time
+# zone data appropriate for their practical needs. It is not intended
+# to take or endorse any position on legal or territorial claims.
+#
#country-
#code coordinates TZ comments
AD +4230+00131 Europe/Andorra
@@ -239,7 +246,7 @@
ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor
ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas)
IE +5320-00615 Europe/Dublin
-IL +3146+03514 Asia/Jerusalem
+IL +314650+0351326 Asia/Jerusalem
IM +5409-00428 Europe/Isle_of_Man
IN +2232+08822 Asia/Kolkata
IO -0720+07225 Indian/Chagos
--- a/jdk/test/tools/jar/AddAndUpdateProfile.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/* @test
- * @bug 8003255
- * @compile -XDignore.symbol.file AddAndUpdateProfile.java
- * @run main AddAndUpdateProfile
- * @summary Basic test of jar tool "p" option to add or update the Profile
- * attribute in the main manifest of a JAR file
- */
-
-import java.util.jar.*;
-import static java.util.jar.Attributes.Name.*;
-import java.nio.file.*;
-import java.io.IOException;
-
-import sun.tools.jar.Main;
-
-public class AddAndUpdateProfile {
- static boolean doJar(String... args) {
- System.out.print("jar");
- for (String arg: args)
- System.out.print(" " + arg);
- System.out.println("");
-
- Main jartool = new Main(System.out, System.err, "jar");
- return jartool.run(args);
- }
-
- static void jar(String... args) {
- if (!doJar(args))
- throw new RuntimeException("jar command failed");
- }
-
- static void jarExpectingFail(String... args) {
- if (doJar(args))
- throw new RuntimeException("jar command not expected to succeed");
- }
-
- static void checkMainAttribute(String jarfile, Attributes.Name name,
- String expectedValue)
- throws IOException
- {
- try (JarFile jf = new JarFile(jarfile)) {
- Manifest mf = jf.getManifest();
- if (mf == null && expectedValue != null)
- throw new RuntimeException("Manifest not found");
- if (mf != null) {
- String actual = mf.getMainAttributes().getValue(name);
- if (actual != null) {
- if (!actual.equals(expectedValue))
- throw new RuntimeException("Profile attribute has unexpected value");
- } else {
- if (expectedValue != null)
- throw new RuntimeException("Profile attribute should not be present");
- }
- }
- }
- }
-
- public static void main(String[] args) throws Exception {
- Path entry = Files.createFile(Paths.get("xfoo"));
- String jarfile = "xFoo.jar";
- try {
-
- // create JAR file with Profile attribute
- jar("cfp", jarfile, "compact1", entry.toString());
- checkMainAttribute(jarfile, PROFILE, "compact1");
-
- // attempt to create JAR file with Profile attribute and bad value
- jarExpectingFail("cfp", jarfile, "garbage", entry.toString());
- jarExpectingFail("cfp", jarfile, "Compact1", entry.toString());
- jarExpectingFail("cfp", jarfile, "COMPACT1", entry.toString());
-
- // update value of Profile attribute
- jar("ufp", jarfile, "compact2");
- checkMainAttribute(jarfile, PROFILE, "compact2");
-
- // attempt to update value of Profile attribute to bad value
- // (update should not change the JAR file)
- jarExpectingFail("ufp", jarfile, "garbage");
- checkMainAttribute(jarfile, PROFILE, "compact2");
- jarExpectingFail("ufp", jarfile, "COMPACT1");
- checkMainAttribute(jarfile, PROFILE, "compact2");
-
- // create JAR file with both a Main-Class and Profile attribute
- jar("cfep", jarfile, "Foo", "compact1", entry.toString());
- checkMainAttribute(jarfile, MAIN_CLASS, "Foo");
- checkMainAttribute(jarfile, PROFILE, "compact1");
-
- // update value of Profile attribute
- jar("ufp", jarfile, "compact2");
- checkMainAttribute(jarfile, PROFILE, "compact2");
-
- // create JAR file without Profile attribute
- jar("cf", jarfile, entry.toString());
- checkMainAttribute(jarfile, PROFILE, null);
-
- // update value of Profile attribute
- jar("ufp", jarfile, "compact3");
- checkMainAttribute(jarfile, PROFILE, "compact3");
-
- } finally {
- Files.deleteIfExists(Paths.get(jarfile));
- Files.delete(entry);
- }
- }
-
-}
--- a/jdk/test/tools/launcher/profiles/Basic.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,231 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @bug 8003255
- * @compile -XDignore.symbol.file Basic.java Main.java Logging.java
- * @run main Basic
- * @summary Test the launcher checks the Profile attribute of executable JAR
- * files. Also checks that libraries that specify the Profile attribute
- * are not loaded if the runtime does not support the required profile.
- */
-
-import java.io.*;
-import java.util.jar.*;
-import static java.util.jar.JarFile.MANIFEST_NAME;
-import java.util.zip.*;
-import java.nio.file.*;
-import java.nio.file.attribute.BasicFileAttributes;
-
-public class Basic {
-
- static final String MANIFEST_DIR = "META-INF/";
-
- static final String JAVA_HOME = System.getProperty("java.home");
- static final String OS_NAME = System.getProperty("os.name");
- static final String OS_ARCH = System.getProperty("os.arch");
-
- static final String JAVA_CMD =
- OS_NAME.startsWith("Windows") ? "java.exe" : "java";
-
- static final boolean NEED_D64 =
- OS_NAME.equals("SunOS") &&
- (OS_ARCH.equals("sparcv9") || OS_ARCH.equals("amd64"));
-
- /**
- * Creates a JAR file with the given attributes and the given entries.
- * Class files are assumed to be in ${test.classes}. Note that this this
- * method cannot use the "jar" tool as it may not be present in the image.
- */
- static void createJarFile(String jarfile,
- String mainAttributes,
- String... entries)
- throws IOException
- {
- // create Manifest
- Manifest manifest = new Manifest();
- Attributes jarAttrs = manifest.getMainAttributes();
- jarAttrs.put(Attributes.Name.MANIFEST_VERSION, "1.0");
- if (mainAttributes.length() > 0) {
- for (String attr: mainAttributes.split(",")) {
- String[] s = attr.split("=");
- jarAttrs.put(new Attributes.Name(s[0]), s[1]);
- }
- }
-
- try (OutputStream out = Files.newOutputStream(Paths.get(jarfile));
- ZipOutputStream zos = new JarOutputStream(out))
- {
- // add manifest directory and manifest file
- ZipEntry e = new JarEntry(MANIFEST_DIR);
- e.setTime(System.currentTimeMillis());
- e.setSize(0);
- e.setCrc(0);
- zos.putNextEntry(e);
- e = new ZipEntry(MANIFEST_NAME);
- e.setTime(System.currentTimeMillis());
- zos.putNextEntry(e);
- manifest.write(zos);
- zos.closeEntry();
-
- // entries in JAR file
- for (String entry: entries) {
- e = new JarEntry(entry);
- Path path;
- if (entry.endsWith(".class")) {
- path = Paths.get(System.getProperty("test.classes"), entry);
- } else {
- path = Paths.get(entry);
- }
- BasicFileAttributes attrs =
- Files.readAttributes(path, BasicFileAttributes.class);
- e.setTime(attrs.lastModifiedTime().toMillis());
- if (attrs.size() == 0) {
- e.setMethod(ZipEntry.STORED);
- e.setSize(0);
- e.setCrc(0);
- }
- zos.putNextEntry(e);
- if (attrs.isRegularFile())
- Files.copy(path, zos);
- zos.closeEntry();
- }
- }
- }
-
- /**
- * Execute the given executable JAR file with the given arguments. This
- * method blocks until the launched VM terminates. Any output or error
- * message from the launched VM are printed to System.out. Returns the
- * exit value.
- */
- static int exec(String jf, String... args) throws IOException {
- StringBuilder sb = new StringBuilder();
- sb.append(Paths.get(JAVA_HOME, "bin", JAVA_CMD).toString());
- if (NEED_D64)
- sb.append(" -d64");
- sb.append(" -jar ");
- sb.append(Paths.get(jf).toAbsolutePath());
- for (String arg: args) {
- sb.append(' ');
- sb.append(arg);
- }
- String[] cmd = sb.toString().split(" ");
- ProcessBuilder pb = new ProcessBuilder(cmd);
- pb.redirectErrorStream(true);
- Process p = pb.start();
- BufferedReader reader =
- new BufferedReader(new InputStreamReader(p.getInputStream()));
- String line;
- while ((line = reader.readLine()) != null) {
- System.out.println(line);
- }
- try {
- return p.waitFor();
- } catch (InterruptedException e) {
- throw new RuntimeException("Should not happen");
- }
- }
-
- static void checkRun(String jf, String... args) throws IOException {
- if (exec(jf) != 0)
- throw new RuntimeException(jf + " failed!!!");
- }
-
- static void checkRunFail(String jf, String... args) throws IOException {
- if (exec(jf) == 0)
- throw new RuntimeException(jf + " did not fail!!!");
- System.out.println("Failed as expected");
- }
-
- public static void main(String[] args) throws IOException {
- // ## replace this if there is a standard way to determine the profile
- String profile = sun.misc.Version.profileName();
-
- int thisProfile = 4;
- if ("compact1".equals(profile)) thisProfile = 1;
- if ("compact2".equals(profile)) thisProfile = 2;
- if ("compact3".equals(profile)) thisProfile = 3;
-
- // "library" JAR file used by the test
- createJarFile("Logging.jar", "", "Logging.class");
-
- // Executable JAR file without the Profile attribute
- if (thisProfile <= 3) {
- createJarFile("Main.jar",
- "Main-Class=Main,Class-Path=Logging.jar",
- "Main.class");
- checkRunFail("Main.jar");
- }
-
- // Executable JAR file with Profile attribute, Library JAR file without
- for (int p=1; p<=3; p++) {
- String attrs = "Main-Class=Main,Class-Path=Logging.jar" +
- ",Profile=compact" + p;
- createJarFile("Main.jar", attrs, "Main.class");
- if (p <= thisProfile) {
- checkRun("Main.jar");
- } else {
- checkRunFail("Main.jar");
- }
- }
-
- // Executable JAR file with Profile attribute that has invalid profile
- // name, including incorrect case.
- createJarFile("Main.jar",
- "Main-Class=Main,Class-Path=Logging.jar,Profile=BadName",
- "Main.class");
- checkRunFail("Main.jar");
-
- createJarFile("Main.jar",
- "Main-Class=Main,Class-Path=Logging.jar,Profile=Compact1",
- "Main.class");
- checkRunFail("Main.jar");
-
- // Executable JAR file and Librrary JAR file with Profile attribute
- createJarFile("Main.jar",
- "Main-Class=Main,Class-Path=Logging.jar,Profile=compact1",
- "Main.class");
- for (int p=1; p<=3; p++) {
- String attrs = "Profile=compact" + p;
- createJarFile("Logging.jar", attrs, "Logging.class");
- if (p <= thisProfile) {
- checkRun("Main.jar");
- } else {
- checkRunFail("Main.jar");
- }
- }
-
- // Executable JAR file and Library JAR with Profile attribute, value
- // of Profile not recognized
- createJarFile("Logging.jar", "Profile=BadName", "Logging.class");
- createJarFile("Main.jar",
- "Main-Class=Main,Class-Path=Logging.jar,Profile=compact1",
- "Main.class");
- checkRunFail("Main.jar");
-
- System.out.println("TEST PASSED.");
- }
-
-}
--- a/jdk/test/tools/launcher/profiles/Logging.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-public class Logging {
- private Logging() { }
-
- public static void log(String msg) {
- System.out.println(msg);
- }
-}
--- a/jdk/test/tools/launcher/profiles/Main.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-public class Main {
- private Main() { }
-
- public static void main(String[] args) {
- Logging.log("main running");
- }
-}
--- a/jdk/test/tools/launcher/profiles/VersionCheck.java Tue Aug 20 17:38:56 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @bug 8003256
- * @compile -XDignore.symbol.file VersionCheck.java
- * @run main VersionCheck
- * @summary Tests that "java -version" includes the name of the profile and that
- * it matches the name in the release file
- */
-
-import java.nio.file.*;
-import java.io.*;
-import java.util.Properties;
-
-public class VersionCheck {
-
- static final String JAVA_HOME = System.getProperty("java.home");
- static final String OS_NAME = System.getProperty("os.name");
- static final String OS_ARCH = System.getProperty("os.arch");
-
- static final String JAVA_CMD =
- OS_NAME.startsWith("Windows") ? "java.exe" : "java";
-
- static final boolean NEED_D64 =
- OS_NAME.equals("SunOS") &&
- (OS_ARCH.equals("sparcv9") || OS_ARCH.equals("amd64"));
-
- /**
- * Returns {@code true} if the given class is present.
- */
- static boolean isPresent(String cn) {
- try {
- Class.forName(cn);
- return true;
- } catch (ClassNotFoundException ignore) {
- return false;
- }
- }
-
- /**
- * Determines the profile by checking whether specific classes are present.
- * Returns the empty string if this runtime does not appear to be a profile
- * of Java SE.
- */
- static String probeProfile() {
- if (isPresent("java.awt.Window"))
- return "";
- if (isPresent("java.lang.management.ManagementFactory"))
- return "compact3";
- if (isPresent("java.sql.DriverManager"))
- return "compact2";
- return "compact1";
- }
-
- /**
- * Execs java with the given parameters. The method blocks until the
- * process terminates. Returns a {@code ByteArrayOutputStream} with any
- * stdout or stderr from the process.
- */
- static ByteArrayOutputStream execJava(String... args)
- throws IOException
- {
- StringBuilder sb = new StringBuilder();
- sb.append(Paths.get(JAVA_HOME, "bin", JAVA_CMD).toString());
- if (NEED_D64)
- sb.append(" -d64");
- for (String arg: args) {
- sb.append(' ');
- sb.append(arg);
- }
- String[] cmd = sb.toString().split(" ");
- ProcessBuilder pb = new ProcessBuilder(cmd);
- pb.redirectErrorStream(true);
- Process p = pb.start();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buf = new byte[1024];
- int n;
- do {
- n = p.getInputStream().read(buf);
- if (n > 0)
- baos.write(buf, 0, n);
- } while (n > 0);
- try {
- int exitCode = p.waitFor();
- if (exitCode != 0)
- throw new RuntimeException("Exit code: " + exitCode);
- } catch (InterruptedException e) {
- throw new RuntimeException("Should not happen");
- }
- return baos;
- }
-
- public static void main(String[] args) throws IOException {
- String reported = sun.misc.Version.profileName();
- String probed = probeProfile();
- if (!reported.equals(probed)) {
- throw new RuntimeException("sun.misc.Version reports: " + reported
- + ", but probing reports: " + probed);
- }
-
- String profile = probed;
- boolean isFullJre = (profile.length() == 0);
-
- // check that java -version includes "profile compactN"
- String expected = "profile " + profile;
- System.out.println("Checking java -version ...");
- ByteArrayOutputStream baos = execJava("-version");
- ByteArrayInputStream bain = new ByteArrayInputStream(baos.toByteArray());
- BufferedReader reader = new BufferedReader(new InputStreamReader(bain));
- boolean found = false;
- String line;
- while ((line = reader.readLine()) != null) {
- if (line.contains(expected)) {
- found = true;
- break;
- }
- }
- if (found && isFullJre)
- throw new RuntimeException(expected + " found in java -version output");
- if (!found && !isFullJre)
- throw new RuntimeException("java -version did not include " + expected);
-
- // check that the profile name matches the release file
- System.out.println("Checking release file ...");
- Properties props = new Properties();
-
- Path home = Paths.get(JAVA_HOME);
- if (home.getFileName().toString().equals("jre"))
- home = home.getParent();
- Path release = home.resolve("release");
- try (InputStream in = Files.newInputStream(release)) {
- props.load(in);
- }
- String value = props.getProperty("JAVA_PROFILE");
- if (isFullJre) {
- if (value != null)
- throw new RuntimeException("JAVA_PROFILE should not be present");
- } else {
- if (value == null)
- throw new RuntimeException("JAVA_PROFILE not present in release file");
- if (!value.equals("\"" + profile + "\""))
- throw new RuntimeException("Unexpected value of JAVA_PROFILE: " + value);
- }
-
- System.out.println("Test passed.");
- }
-}
--- a/jdk/test/tools/pack200/TimeStamp.java Tue Aug 20 17:38:56 2013 -0700
+++ b/jdk/test/tools/pack200/TimeStamp.java Tue Aug 20 17:44:18 2013 -0700
@@ -88,6 +88,7 @@
unpackNative(packFile, pstFile);
verifyJar(goldenFile, pstFile);
pstFile.delete();
+ Utils.cleanup();
}
static void unpackNative(File packFile, File outFile) {
@@ -149,7 +150,6 @@
Utils.close(jf1);
Utils.close(jf2);
}
- Utils.cleanup();
if (errors > 0) {
throw new RuntimeException("FAIL:" + errors + " error(s) encounted");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/vm/verifier/defaultMethods/DefaultMethodRegressionTests.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8003639
+ * @summary defaultMethod resolution and verification
+ * @run main DefaultMethodRegressionTests
+ */
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * This set of classes/interfaces (K/I/C) is specially designed to expose a
+ * bug in the JVM where it did not find some overloaded methods in some
+ * specific situations. (fixed by hotspot changeset ffb9316fd9ed).
+ */
+interface K {
+ int bbb(Long l);
+}
+
+interface I extends K {
+ default void aaa() {}
+ default void aab() {}
+ default void aac() {}
+
+ default int bbb(Integer i) { return 22; }
+ default int bbb(Float f) { return 33; }
+ default int bbb(Long l) { return 44; }
+ default int bbb(Double d) { return 55; }
+ default int bbb(String s) { return 66; }
+
+ default void caa() {}
+ default void cab() {}
+ default void cac() {}
+}
+
+class C implements I {}
+
+public class DefaultMethodRegressionTests {
+ public static void main(String... args) {
+ new DefaultMethodRegressionTests().run(args);
+ }
+ void run(String... args) {
+ testLostOverloadedMethod();
+ System.out.println("testLostOverloadedMethod: OK");
+ testInferenceVerifier();
+ System.out.println("testInferenceVerifier: OK");
+ }
+ void testLostOverloadedMethod() {
+ C c = new C();
+ assertEquals(c.bbb(new Integer(1)), 22);
+ assertEquals(c.bbb(new Float(1.1)), 33);
+ assertEquals(c.bbb(new Long(1L)), 44);
+ assertEquals(c.bbb(new Double(0.01)), 55);
+ assertEquals(c.bbb(new String("")), 66);
+ }
+ // Test to ensure that the inference verifier accepts older classfiles
+ // with classes that implement interfaces with defaults.
+ void testInferenceVerifier() {
+ // interface I { int m() default { return 99; } }
+ byte I_bytes[] = {
+ (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe, 0x00, 0x00, 0x00, 0x34,
+ 0x00, 0x08, 0x07, 0x00, 0x06, 0x07, 0x00, 0x07,
+ 0x01, 0x00, 0x03, 0x66, 0x6f, 0x6f, 0x01, 0x00,
+ 0x03, 0x28, 0x29, 0x49, 0x01, 0x00, 0x04, 0x43,
+ 0x6f, 0x64, 0x65, 0x01, 0x00, 0x01, 0x49, 0x01,
+ 0x00, 0x10, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c,
+ 0x61, 0x6e, 0x67, 0x2f, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x06, 0x00, 0x00, 0x01, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01,
+ 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x03, 0x10, 0x63, (byte)0xac, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ // public class C implements I {} /* -target 1.5 */
+ byte C_bytes[] = {
+ (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe, 0x00, 0x00, 0x00, 0x31,
+ 0x00, 0x0c, 0x0a, 0x00, 0x03, 0x00, 0x08, 0x07,
+ 0x00, 0x09, 0x07, 0x00, 0x0a, 0x07, 0x00, 0x0b,
+ 0x01, 0x00, 0x06, 0x3c, 0x69, 0x6e, 0x69, 0x74,
+ 0x3e, 0x01, 0x00, 0x03, 0x28, 0x29, 0x56, 0x01,
+ 0x00, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x0c, 0x00,
+ 0x05, 0x00, 0x06, 0x01, 0x00, 0x01, 0x43, 0x01,
+ 0x00, 0x10, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c,
+ 0x61, 0x6e, 0x67, 0x2f, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x01, 0x00, 0x01, 0x49, 0x00, 0x21,
+ 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05,
+ 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x05, 0x2a, (byte)0xb7, 0x00, 0x01, (byte)0xb1, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ ClassLoader cl = new ClassLoader() {
+ protected Class<?> findClass(String name) {
+ if (name.equals("I")) {
+ return defineClass("I", I_bytes, 0, I_bytes.length);
+ } else if (name.equals("C")) {
+ return defineClass("C", C_bytes, 0, C_bytes.length);
+ } else {
+ return null;
+ }
+ }
+ };
+ try {
+ Class.forName("C", true, cl);
+ } catch (Exception e) {
+ // unmodified verifier will throw VerifyError
+ throw new RuntimeException(e);
+ }
+ }
+ void assertEquals(Object o1, Object o2) {
+ System.out.print("Expected: " + o1);
+ System.out.println(", Obtained: " + o2);
+ if (!o1.equals(o2)) {
+ throw new RuntimeException("got unexpected values");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/vm/verifier/defaultMethods/DefaultMethodRegressionTestsRun.java Tue Aug 20 17:44:18 2013 -0700
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8003639
+ * @summary defaultMethod resolution and verification using an URLClassLoader
+ * @compile -XDignore.symbol.file=true DefaultMethodRegressionTestsRun.java
+ * @run main DefaultMethodRegressionTestsRun
+ */
+import java.io.File;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+/**
+ * This test is a variant of DefaultMethodRegressionTests, this one creates
+ * an URLClassLoader to load the support classes.
+ *
+ */
+public class DefaultMethodRegressionTestsRun {
+ public static void main(String... args) throws Exception {
+ File scratchDir = new File(".");
+ File testDir = new File(scratchDir, "testdir");
+ testDir.mkdirs();
+ File srcFile = new File(new File(System.getProperty("test.src")),
+ "DefaultMethodRegressionTests.java");
+ String[] javacargs = {
+ srcFile.getAbsolutePath(),
+ "-d",
+ testDir.getAbsolutePath()
+ };
+ com.sun.tools.javac.Main.compile(javacargs);
+ runClass(testDir, "DefaultMethodRegressionTests");
+ }
+ static void runClass(
+ File classPath,
+ String classname) throws Exception {
+ URL[] urls = {classPath.toURI().toURL()};
+ ClassLoader loader = new URLClassLoader(urls);
+ Class<?> c = loader.loadClass(classname);
+
+ Class<?>[] argTypes = new Class<?>[]{String[].class};
+ Object[] methodArgs = new Object[]{null};
+
+ Method method = c.getMethod("main", argTypes);
+ method.invoke(c, methodArgs);
+ }
+}