author | duke |
Wed, 05 Jul 2017 19:07:19 +0200 | |
changeset 19242 | 51714f9f4323 |
parent 19241 | 1317035e27c5 (current diff) |
parent 19240 | 45992754c3b7 (diff) |
child 19244 | 06fb07bb9897 |
--- a/.hgtags-top-repo Thu Aug 08 10:10:37 2013 -0700 +++ b/.hgtags-top-repo Wed Jul 05 19:07:19 2017 +0200 @@ -223,3 +223,4 @@ 59dc9da813794c924a0383c2a6241af94defdfed jdk8-b99 d2dcb110e9dbaf9903c05b211df800e78e4b394e jdk8-b100 9f74a220677dc265a724515d8e2617548cef62f1 jdk8-b101 +5eb3c1dc348f72a7f84f7d9d07834e8bbe09a799 jdk8-b102
--- a/corba/.hgtags Thu Aug 08 10:10:37 2013 -0700 +++ b/corba/.hgtags Wed Jul 05 19:07:19 2017 +0200 @@ -223,3 +223,4 @@ 3f67804ab61303782df57e54989ef5e0e4629beb jdk8-b99 8d492f1dfd1b131a4c7886ee6b59528609f7e4fe jdk8-b100 a013024b07475782f1fa8e196e950b34b4077663 jdk8-b101 +528c7e76eaeee022817ee085668459bc97cf5665 jdk8-b102
--- a/corba/src/share/classes/com/sun/corba/se/impl/copyobject/JavaInputStream.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,528 +0,0 @@ -/* - * Copyright (c) 2004, 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.corba.se.impl.encoding; - -import java.io.IOException; -import java.io.Serializable; -import java.math.BigDecimal; -import java.nio.ByteBuffer; - -import org.omg.CORBA.TypeCode; -import org.omg.CORBA.Principal; -import org.omg.CORBA.Any; - -import com.sun.org.omg.SendingContext.CodeBase; - -import com.sun.corba.se.pept.protocol.MessageMediator; - -import com.sun.corba.se.spi.logging.CORBALogDomains; -import com.sun.corba.se.spi.orb.ORB; -import com.sun.corba.se.spi.ior.iiop.GIOPVersion; -import com.sun.corba.se.spi.protocol.CorbaMessageMediator; - -import com.sun.corba.se.impl.logging.ORBUtilSystemException; -import com.sun.corba.se.impl.encoding.CodeSetConversion; -import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry; - -/** - * This is delegates to the real implementation. - * - * NOTE: - * - * Before using the stream for valuetype unmarshaling, one must call - * performORBVersionSpecificInit(). - */ -public abstract class CDRInputStream - extends org.omg.CORBA_2_3.portable.InputStream - implements com.sun.corba.se.impl.encoding.MarshalInputStream, - org.omg.CORBA.DataInputStream, org.omg.CORBA.portable.ValueInputStream -{ - protected CorbaMessageMediator messageMediator; - private CDRInputStreamBase impl; - - // We can move this out somewhere later. For now, it serves its purpose - // to create a concrete CDR delegate based on the GIOP version. - private static class InputStreamFactory { - - public static CDRInputStreamBase newInputStream(ORB orb, GIOPVersion version) - { - switch(version.intValue()) { - case GIOPVersion.VERSION_1_0: - return new CDRInputStream_1_0(); - case GIOPVersion.VERSION_1_1: - return new CDRInputStream_1_1(); - case GIOPVersion.VERSION_1_2: - return new CDRInputStream_1_2(); - default: - ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb, - CORBALogDomains.RPC_ENCODING ) ; - throw wrapper.unsupportedGiopVersion( version ) ; - } - } - } - - // Required for the case when a ClientResponseImpl is - // created with a SystemException due to a dead server/closed - // connection with no warning. Note that the stream will - // not be initialized in this case. - // - // Probably also required by ServerRequestImpl. - // - // REVISIT. - public CDRInputStream() { - } - - public CDRInputStream(CDRInputStream is) { - impl = is.impl.dup(); - impl.setParent(this); - } - - public CDRInputStream(org.omg.CORBA.ORB orb, - ByteBuffer byteBuffer, - int size, - boolean littleEndian, - GIOPVersion version, - BufferManagerRead bufMgr) - { - impl = InputStreamFactory.newInputStream( (ORB)orb, version); - - impl.init(orb, byteBuffer, size, littleEndian, bufMgr); - - impl.setParent(this); - } - - // org.omg.CORBA.portable.InputStream - public final boolean read_boolean() { - return impl.read_boolean(); - } - - public final char read_char() { - return impl.read_char(); - } - - public final char read_wchar() { - return impl.read_wchar(); - } - - public final byte read_octet() { - return impl.read_octet(); - } - - public final short read_short() { - return impl.read_short(); - } - - public final short read_ushort() { - return impl.read_ushort(); - } - - public final int read_long() { - return impl.read_long(); - } - - public final int read_ulong() { - return impl.read_ulong(); - } - - public final long read_longlong() { - return impl.read_longlong(); - } - - public final long read_ulonglong() { - return impl.read_ulonglong(); - } - - public final float read_float() { - return impl.read_float(); - } - - public final double read_double() { - return impl.read_double(); - } - - public final String read_string() { - return impl.read_string(); - } - - public final String read_wstring() { - return impl.read_wstring(); - } - - public final void read_boolean_array(boolean[] value, int offset, int length) { - impl.read_boolean_array(value, offset, length); - } - - public final void read_char_array(char[] value, int offset, int length) { - impl.read_char_array(value, offset, length); - } - - public final void read_wchar_array(char[] value, int offset, int length) { - impl.read_wchar_array(value, offset, length); - } - - public final void read_octet_array(byte[] value, int offset, int length) { - impl.read_octet_array(value, offset, length); - } - - public final void read_short_array(short[] value, int offset, int length) { - impl.read_short_array(value, offset, length); - } - - public final void read_ushort_array(short[] value, int offset, int length) { - impl.read_ushort_array(value, offset, length); - } - - public final void read_long_array(int[] value, int offset, int length) { - impl.read_long_array(value, offset, length); - } - - public final void read_ulong_array(int[] value, int offset, int length) { - impl.read_ulong_array(value, offset, length); - } - - public final void read_longlong_array(long[] value, int offset, int length) { - impl.read_longlong_array(value, offset, length); - } - - public final void read_ulonglong_array(long[] value, int offset, int length) { - impl.read_ulonglong_array(value, offset, length); - } - - public final void read_float_array(float[] value, int offset, int length) { - impl.read_float_array(value, offset, length); - } - - public final void read_double_array(double[] value, int offset, int length) { - impl.read_double_array(value, offset, length); - } - - public final org.omg.CORBA.Object read_Object() { - return impl.read_Object(); - } - - public final TypeCode read_TypeCode() { - return impl.read_TypeCode(); - } - public final Any read_any() { - return impl.read_any(); - } - - public final Principal read_Principal() { - return impl.read_Principal(); - } - - public final int read() throws java.io.IOException { - return impl.read(); - } - - public final java.math.BigDecimal read_fixed() { - return impl.read_fixed(); - } - - public final org.omg.CORBA.Context read_Context() { - return impl.read_Context(); - } - - public final org.omg.CORBA.Object read_Object(java.lang.Class clz) { - return impl.read_Object(clz); - } - - public final org.omg.CORBA.ORB orb() { - return impl.orb(); - } - - // org.omg.CORBA_2_3.portable.InputStream - public final java.io.Serializable read_value() { - return impl.read_value(); - } - - public final java.io.Serializable read_value(java.lang.Class clz) { - return impl.read_value(clz); - } - - public final java.io.Serializable read_value(org.omg.CORBA.portable.BoxedValueHelper factory) { - return impl.read_value(factory); - } - - public final java.io.Serializable read_value(java.lang.String rep_id) { - return impl.read_value(rep_id); - } - - public final java.io.Serializable read_value(java.io.Serializable value) { - return impl.read_value(value); - } - - public final java.lang.Object read_abstract_interface() { - return impl.read_abstract_interface(); - } - - public final java.lang.Object read_abstract_interface(java.lang.Class clz) { - return impl.read_abstract_interface(clz); - } - // com.sun.corba.se.impl.encoding.MarshalInputStream - - public final void consumeEndian() { - impl.consumeEndian(); - } - - public final int getPosition() { - return impl.getPosition(); - } - - // org.omg.CORBA.DataInputStream - - public final java.lang.Object read_Abstract () { - return impl.read_Abstract(); - } - - public final java.io.Serializable read_Value () { - return impl.read_Value(); - } - - public final void read_any_array (org.omg.CORBA.AnySeqHolder seq, int offset, int length) { - impl.read_any_array(seq, offset, length); - } - - public final void read_boolean_array (org.omg.CORBA.BooleanSeqHolder seq, int offset, int length) { - impl.read_boolean_array(seq, offset, length); - } - - public final void read_char_array (org.omg.CORBA.CharSeqHolder seq, int offset, int length) { - impl.read_char_array(seq, offset, length); - } - - public final void read_wchar_array (org.omg.CORBA.WCharSeqHolder seq, int offset, int length) { - impl.read_wchar_array(seq, offset, length); - } - - public final void read_octet_array (org.omg.CORBA.OctetSeqHolder seq, int offset, int length) { - impl.read_octet_array(seq, offset, length); - } - - public final void read_short_array (org.omg.CORBA.ShortSeqHolder seq, int offset, int length) { - impl.read_short_array(seq, offset, length); - } - - public final void read_ushort_array (org.omg.CORBA.UShortSeqHolder seq, int offset, int length) { - impl.read_ushort_array(seq, offset, length); - } - - public final void read_long_array (org.omg.CORBA.LongSeqHolder seq, int offset, int length) { - impl.read_long_array(seq, offset, length); - } - - public final void read_ulong_array (org.omg.CORBA.ULongSeqHolder seq, int offset, int length) { - impl.read_ulong_array(seq, offset, length); - } - - public final void read_ulonglong_array (org.omg.CORBA.ULongLongSeqHolder seq, int offset, int length) { - impl.read_ulonglong_array(seq, offset, length); - } - - public final void read_longlong_array (org.omg.CORBA.LongLongSeqHolder seq, int offset, int length) { - impl.read_longlong_array(seq, offset, length); - } - - public final void read_float_array (org.omg.CORBA.FloatSeqHolder seq, int offset, int length) { - impl.read_float_array(seq, offset, length); - } - - public final void read_double_array (org.omg.CORBA.DoubleSeqHolder seq, int offset, int length) { - impl.read_double_array(seq, offset, length); - } - - // org.omg.CORBA.portable.ValueBase - public final String[] _truncatable_ids() { - return impl._truncatable_ids(); - } - - // java.io.InputStream - public final int read(byte b[]) throws IOException { - return impl.read(b); - } - - public final int read(byte b[], int off, int len) throws IOException { - return impl.read(b, off, len); - } - - public final long skip(long n) throws IOException { - return impl.skip(n); - } - - public final int available() throws IOException { - return impl.available(); - } - - public final void close() throws IOException { - impl.close(); - } - - public final void mark(int readlimit) { - impl.mark(readlimit); - } - - public final void reset() { - impl.reset(); - } - - public final boolean markSupported() { - return impl.markSupported(); - } - - public abstract CDRInputStream dup(); - - // Needed by TCUtility - public final java.math.BigDecimal read_fixed(short digits, short scale) { - return impl.read_fixed(digits, scale); - } - - public final boolean isLittleEndian() { - return impl.isLittleEndian(); - } - - protected final ByteBuffer getByteBuffer() { - return impl.getByteBuffer(); - } - - protected final void setByteBuffer(ByteBuffer byteBuffer) { - impl.setByteBuffer(byteBuffer); - } - - protected final void setByteBufferWithInfo(ByteBufferWithInfo bbwi) { - impl.setByteBufferWithInfo(bbwi); - } - - public final int getBufferLength() { - return impl.getBufferLength(); - } - - protected final void setBufferLength(int value) { - impl.setBufferLength(value); - } - - protected final int getIndex() { - return impl.getIndex(); - } - - protected final void setIndex(int value) { - impl.setIndex(value); - } - - public final void orb(org.omg.CORBA.ORB orb) { - impl.orb(orb); - } - - public final GIOPVersion getGIOPVersion() { - return impl.getGIOPVersion(); - } - - public final BufferManagerRead getBufferManager() { - return impl.getBufferManager(); - } - - // This should be overridden by any stream (ex: IIOPInputStream) - // which wants to read values. Thus, TypeCodeInputStream doesn't - // have to do this. - public CodeBase getCodeBase() { - return null; - } - - // Use Latin-1 for GIOP 1.0 or when code set negotiation was not - // performed. - protected CodeSetConversion.BTCConverter createCharBTCConverter() { - return CodeSetConversion.impl().getBTCConverter(OSFCodeSetRegistry.ISO_8859_1, - impl.isLittleEndian()); - } - - // Subclasses must decide what to do here. It's inconvenient to - // make the class and this method abstract because of dup(). - protected abstract CodeSetConversion.BTCConverter createWCharBTCConverter(); - - // Prints the current buffer in a human readable form - void printBuffer() { - impl.printBuffer(); - } - - /** - * Aligns the current position on the given octet boundary - * if there are enough bytes available to do so. Otherwise, - * it just returns. This is used for some (but not all) - * GIOP 1.2 message headers. - */ - public void alignOnBoundary(int octetBoundary) { - impl.alignOnBoundary(octetBoundary); - } - - // Needed by request and reply messages for GIOP versions >= 1.2 only. - public void setHeaderPadding(boolean headerPadding) { - impl.setHeaderPadding(headerPadding); - } - - /** - * This must be called after determining the proper ORB version, - * and setting it on the stream's ORB instance. It can be called - * after reading the service contexts, since that is the only place - * we can get the ORB version info. - * - * Trying to unmarshal things requiring repository IDs before calling - * this will result in NullPtrExceptions. - */ - public void performORBVersionSpecificInit() { - // In the case of SystemExceptions, a stream is created - // with its default constructor (and thus no impl is set). - if (impl != null) - impl.performORBVersionSpecificInit(); - } - - /** - * Resets any internal references to code set converters. - * This is useful for forcing the CDR stream to reacquire - * converters (probably from its subclasses) when state - * has changed. - */ - public void resetCodeSetConverters() { - impl.resetCodeSetConverters(); - } - - public void setMessageMediator(MessageMediator messageMediator) - { - this.messageMediator = (CorbaMessageMediator) messageMediator; - } - - public MessageMediator getMessageMediator() - { - return messageMediator; - } - - // ValueInputStream ----------------------------- - - public void start_value() { - impl.start_value(); - } - - public void end_value() { - impl.end_value(); - } -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/copyobject/JavaOutputStream.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,435 +0,0 @@ -/* - * Copyright (c) 2004, 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.corba.se.impl.encoding; - -import java.io.IOException; -import java.io.Serializable; -import java.math.BigDecimal; -import java.nio.ByteBuffer; - -import org.omg.CORBA.TypeCode; -import org.omg.CORBA.Principal; -import org.omg.CORBA.Any; - -import com.sun.corba.se.pept.protocol.MessageMediator; - -import com.sun.corba.se.spi.orb.ORB; -import com.sun.corba.se.spi.logging.CORBALogDomains; -import com.sun.corba.se.spi.ior.iiop.GIOPVersion; -import com.sun.corba.se.spi.protocol.CorbaMessageMediator; - -import com.sun.corba.se.impl.encoding.CodeSetConversion; -import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry; -import com.sun.corba.se.impl.orbutil.ORBConstants; -import com.sun.corba.se.impl.logging.ORBUtilSystemException; - -/** - * This is delegates to the real implementation. - */ -public abstract class CDROutputStream - extends org.omg.CORBA_2_3.portable.OutputStream - implements com.sun.corba.se.impl.encoding.MarshalOutputStream, - org.omg.CORBA.DataOutputStream, org.omg.CORBA.portable.ValueOutputStream -{ -/* - private CDROutputStreamBase impl; - protected ORB orb ; - protected ORBUtilSystemException wrapper ; - protected CorbaMessageMediator corbaMessageMediator; - - - // We can move this out somewhere later. For now, it serves its purpose - // to create a concrete CDR delegate based on the GIOP version. - private static class OutputStreamFactory { - - public static CDROutputStreamBase newOutputStream(ORB orb, GIOPVersion version) - { - switch(version.intValue()) { - case GIOPVersion.VERSION_1_0: - return new CDROutputStream_1_0(); - case GIOPVersion.VERSION_1_1: - return new CDROutputStream_1_1(); - case GIOPVersion.VERSION_1_2: - return new CDROutputStream_1_2(); - default: - ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb, - CORBALogDomains.RPC_ENCODING ) ; - // REVISIT - what is appropriate? INTERNAL exceptions - // are really hard to track later. - throw wrapper.unsupportedGiopVersion( version ) ; - } - } - } - - // REVISIT - These two constructors should be re-factored to better hide - // the fact that someone extending this class 'can' construct a CDROutputStream - // that does not use pooled ByteBuffers. Right now, only EncapsOutputStream - // does _not_ use pooled ByteBuffers, see EncapsOutputStream. - - // NOTE: When a stream is constructed for non-channel-backed sockets - // it notifies the constructor not to use pooled (i.e, direct) - // ByteBuffers. - - public CDROutputStream(ORB orb, - GIOPVersion version, - boolean littleEndian, - BufferManagerWrite bufferManager, - byte streamFormatVersion, - boolean usePooledByteBuffers) - { - impl = OutputStreamFactory.newOutputStream(orb, version); - impl.init(orb, littleEndian, bufferManager, streamFormatVersion, usePooledByteBuffers); - - impl.setParent(this); - this.orb = orb ; - this.wrapper = ORBUtilSystemException.get( orb, - CORBALogDomains.RPC_ENCODING ) ; - } - - public CDROutputStream(ORB orb, - GIOPVersion version, - boolean littleEndian, - BufferManagerWrite bufferManager, - byte streamFormatVersion) - { - this(orb, version, littleEndian, bufferManager, streamFormatVersion, true); - } -*/ - - private ByteArrayOutputStream bos ; - private ObjectOutputStream oos ; - - public JavaOutputStream() - { - bos = new ByteArrayOutputStream() ; - oos = new ObjectOutputStream( bos ) ; - } - - // Provided by IIOPOutputStream and EncapsOutputStream - public org.omg.CORBA.portable.InputStream create_input_stream() - { - ObjectInputStream ois = new ByteArrayInputStream( bos.toByteArray() ) ; - - return new JavaInputStream( ois ) ; - } - - public final void write_boolean(boolean value) { - impl.write_boolean(value); - } - public final void write_char(char value) { - impl.write_char(value); - } - public final void write_wchar(char value) { - impl.write_wchar(value); - } - public final void write_octet(byte value) { - impl.write_octet(value); - } - public final void write_short(short value) { - impl.write_short(value); - } - public final void write_ushort(short value) { - impl.write_ushort(value); - } - public final void write_long(int value) { - impl.write_long(value); - } - public final void write_ulong(int value) { - impl.write_ulong(value); - } - public final void write_longlong(long value) { - impl.write_longlong(value); - } - public final void write_ulonglong(long value) { - impl.write_ulonglong(value); - } - public final void write_float(float value) { - impl.write_float(value); - } - public final void write_double(double value) { - impl.write_double(value); - } - public final void write_string(String value) { - impl.write_string(value); - } - public final void write_wstring(String value) { - impl.write_wstring(value); - } - - public final void write_boolean_array(boolean[] value, int offset, int length) { - impl.write_boolean_array(value, offset, length); - } - public final void write_char_array(char[] value, int offset, int length) { - impl.write_char_array(value, offset, length); - } - public final void write_wchar_array(char[] value, int offset, int length) { - impl.write_wchar_array(value, offset, length); - } - public final void write_octet_array(byte[] value, int offset, int length) { - impl.write_octet_array(value, offset, length); - } - public final void write_short_array(short[] value, int offset, int length) { - impl.write_short_array(value, offset, length); - } - public final void write_ushort_array(short[] value, int offset, int length){ - impl.write_ushort_array(value, offset, length); - } - public final void write_long_array(int[] value, int offset, int length) { - impl.write_long_array(value, offset, length); - } - public final void write_ulong_array(int[] value, int offset, int length) { - impl.write_ulong_array(value, offset, length); - } - public final void write_longlong_array(long[] value, int offset, int length) { - impl.write_longlong_array(value, offset, length); - } - public final void write_ulonglong_array(long[] value, int offset,int length) { - impl.write_ulonglong_array(value, offset, length); - } - public final void write_float_array(float[] value, int offset, int length) { - impl.write_float_array(value, offset, length); - } - public final void write_double_array(double[] value, int offset, int length) { - impl.write_double_array(value, offset, length); - } - public final void write_Object(org.omg.CORBA.Object value) { - impl.write_Object(value); - } - public final void write_TypeCode(TypeCode value) { - impl.write_TypeCode(value); - } - public final void write_any(Any value) { - impl.write_any(value); - } - - public final void write_Principal(Principal value) { - impl.write_Principal(value); - } - - public final void write(int b) throws java.io.IOException { - impl.write(b); - } - - public final void write_fixed(java.math.BigDecimal value) { - impl.write_fixed(value); - } - - public final void write_Context(org.omg.CORBA.Context ctx, - org.omg.CORBA.ContextList contexts) { - impl.write_Context(ctx, contexts); - } - - public final org.omg.CORBA.ORB orb() { - return impl.orb(); - } - - // org.omg.CORBA_2_3.portable.OutputStream - public final void write_value(java.io.Serializable value) { - impl.write_value(value); - } - - public final void write_value(java.io.Serializable value, java.lang.Class clz) { - impl.write_value(value, clz); - } - - public final void write_value(java.io.Serializable value, String repository_id) { - impl.write_value(value, repository_id); - } - - public final void write_value(java.io.Serializable value, - org.omg.CORBA.portable.BoxedValueHelper factory) { - impl.write_value(value, factory); - } - - public final void write_abstract_interface(java.lang.Object obj) { - impl.write_abstract_interface(obj); - } - - // java.io.OutputStream - public final void write(byte b[]) throws IOException { - impl.write(b); - } - - public final void write(byte b[], int off, int len) throws IOException { - impl.write(b, off, len); - } - - public final void flush() throws IOException { - impl.flush(); - } - - public final void close() throws IOException { - impl.close(); - } - - // com.sun.corba.se.impl.encoding.MarshalOutputStream - public final void start_block() { - impl.start_block(); - } - - public final void end_block() { - impl.end_block(); - } - - public final void putEndian() { - impl.putEndian(); - } - - public void writeTo(java.io.OutputStream s) - throws IOException - { - impl.writeTo(s); - } - - public final byte[] toByteArray() { - return impl.toByteArray(); - } - - // org.omg.CORBA.DataOutputStream - public final void write_Abstract (java.lang.Object value) { - impl.write_Abstract(value); - } - - public final void write_Value (java.io.Serializable value) { - impl.write_Value(value); - } - - public final void write_any_array(org.omg.CORBA.Any[] seq, int offset, int length) { - impl.write_any_array(seq, offset, length); - } - - public void setMessageMediator(MessageMediator messageMediator) - { - this.corbaMessageMediator = (CorbaMessageMediator) messageMediator; - } - - public MessageMediator getMessageMediator() - { - return corbaMessageMediator; - } - - // org.omg.CORBA.portable.ValueBase - public final String[] _truncatable_ids() { - return impl._truncatable_ids(); - } - - // Other - protected final int getSize() { - return impl.getSize(); - } - - protected final int getIndex() { - return impl.getIndex(); - } - - protected int getRealIndex(int index) { - // Used in indirections. Overridden by TypeCodeOutputStream. - return index; - } - - protected final void setIndex(int value) { - impl.setIndex(value); - } - - protected final ByteBuffer getByteBuffer() { - return impl.getByteBuffer(); - } - - protected final void setByteBuffer(ByteBuffer byteBuffer) { - impl.setByteBuffer(byteBuffer); - } - - public final boolean isLittleEndian() { - return impl.isLittleEndian(); - } - - // XREVISIT - return to final if possible - // REVISIT - was protected - need access from msgtypes test. - public ByteBufferWithInfo getByteBufferWithInfo() { - return impl.getByteBufferWithInfo(); - } - - protected void setByteBufferWithInfo(ByteBufferWithInfo bbwi) { - impl.setByteBufferWithInfo(bbwi); - } - - // REVISIT: was protected - but need to access from xgiop. - public final BufferManagerWrite getBufferManager() { - return impl.getBufferManager(); - } - - public final void write_fixed(java.math.BigDecimal bigDecimal, short digits, short scale) { - impl.write_fixed(bigDecimal, digits, scale); - } - - public final void writeOctetSequenceTo(org.omg.CORBA.portable.OutputStream s) { - impl.writeOctetSequenceTo(s); - } - - public final GIOPVersion getGIOPVersion() { - return impl.getGIOPVersion(); - } - - public final void writeIndirection(int tag, int posIndirectedTo) { - impl.writeIndirection(tag, posIndirectedTo); - } - - // Use Latin-1 for GIOP 1.0 or when code set negotiation was not - // performed. - protected CodeSetConversion.CTBConverter createCharCTBConverter() { - return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.ISO_8859_1); - } - - // Subclasses must decide what to do here. It's inconvenient to - // make the class and this method abstract because of dup(). - protected abstract CodeSetConversion.CTBConverter createWCharCTBConverter(); - - protected final void freeInternalCaches() { - impl.freeInternalCaches(); - } - - void printBuffer() { - impl.printBuffer(); - } - - public void alignOnBoundary(int octetBoundary) { - impl.alignOnBoundary(octetBoundary); - } - - // Needed by request and reply messages for GIOP versions >= 1.2 only. - public void setHeaderPadding(boolean headerPadding) { - impl.setHeaderPadding(headerPadding); - } - - // ValueOutputStream ----------------------------- - - public void start_value(String rep_id) { - impl.start_value(rep_id); - } - - public void end_value() { - impl.end_value(); - } -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/ThreadCurrentStack.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2000, 2002, 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.corba.se.impl.interceptors; - -import com.sun.corba.se.impl.corba.AnyImpl; -import org.omg.PortableInterceptor.Current; -import org.omg.PortableInterceptor.InvalidSlot; - -import com.sun.corba.se.impl.util.MinorCodes; -import com.sun.corba.se.impl.core.ORB; - -/** - * ThreadCurrentStack is the container of PICurrent instances for each thread - */ -public class ThreadCurrentStack -{ - // PICurrentPool is the container for reusable PICurrents - private class PICurrentPool { - - // Contains a list of reusable PICurrents - private java.util.ArrayList pool; - - // High water mark for the pool - // If the pool size reaches this limit then putPICurrent will - // not put PICurrent to the pool. - private static final int HIGH_WATER_MARK = 5; - - // currentIndex points to the last PICurrent in the list - private int currentIndex; - - PICurrentPool( ) { - pool = new java.util.ArrayList( HIGH_WATER_MARK ); - currentIndex = 0; - } - - /** - * Puts PICurrent to the re-usable pool. - */ - void putPICurrent( PICurrent current ) { - // If there are enough PICurrents in the pool, then don't add - // this current to the pool. - if( currentIndex >= HIGH_WATER_MARK ) { - return; - } - pool.add(currentIndex , current); - currentIndex++; - } - - /** - * Gets PICurrent from the re-usable pool. - */ - PICurrent getPICurrent( ) { - // If there are no entries in the pool then return null - if( currentIndex == 0 ) { - return null; - } - // Works like a stack, Gets the last one added first - currentIndex--; - return (PICurrent) pool.get(currentIndex); - } - } - - // Contains all the active PICurrents for each thread. - // The ArrayList is made to behave like a stack. - private java.util.ArrayList currentContainer; - - // Keeps track of number of PICurrents in the stack. - private int currentIndex; - - // For Every Thread there will be a pool of re-usable ThreadCurrent's - // stored in PICurrentPool - private PICurrentPool currentPool; - - // The orb associated with this ThreadCurrentStack - private ORB piOrb; - - /** - * Constructs the stack and and PICurrentPool - */ - ThreadCurrentStack( ORB piOrb, PICurrent current ) { - this.piOrb = piOrb; - currentIndex = 0; - currentContainer = new java.util.ArrayList( ); - currentPool = new PICurrentPool( ); - currentContainer.add( currentIndex, current ); - currentIndex++; - } - - - /** - * pushPICurrent goes through the following steps - * 1: Checks to see if there is any PICurrent in PICurrentPool - * If present then use that instance to push into the ThreadCurrentStack - * - * 2:If there is no PICurrent in the pool, then creates a new one and pushes - * that into the ThreadCurrentStack - */ - void pushPICurrent( ) { - PICurrent current = currentPool.getPICurrent( ); - if( current == null ) { - // get an existing PICurrent to get the slotSize - PICurrent currentTemp = peekPICurrent(); - current = new PICurrent( piOrb, currentTemp.getSlotSize( )); - } - currentContainer.add( currentIndex, current ); - currentIndex++; - } - - /** - * popPICurrent does the following - * 1: pops the top PICurrent in the ThreadCurrentStack - * - * 2: resets the slots in the PICurrent which resets the slotvalues to - * null if there are any previous sets. - * - * 3: pushes the reset PICurrent into the PICurrentPool to reuse - */ - void popPICurrent( ) { - // Do not pop the PICurrent, If there is only one. - // This should not happen, But an extra check for safety. - if( currentIndex <= 1 ) { - throw new org.omg.CORBA.INTERNAL( - "Cannot pop the only PICurrent in the stack", - MinorCodes.CANT_POP_ONLY_CURRENT_2, - CompletionStatus.COMPLETED_NO ); - } - currentIndex--; - PICurrent current = (PICurrent)currentContainer.get( currentIndex ); - current.resetSlots( ); - currentPool.putPICurrent( current ); - } - - /** - * peekPICurrent gets the top PICurrent in the ThreadCurrentStack without - * popping. - */ - PICurrent peekPICurrent( ) { - return (PICurrent) currentContainer.get( currentIndex - 1); - } - -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/orbutil/DefineWrapper.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2001, 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 com.sun.corba.se.impl.orbutil ; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; - -/** This class provides just a main method. Its purpose is to allow -D arguments to -* set up the system properties when starting programs with tools like OptimizeIt that -* make this difficult or impossible. -* -* Invocation: {java launcher of some kind} DefineClass -Dxxx=yyy -Dxxx=yyy ... {class name} arg0, arg1, ... -* Result: updates system properties with -D args, then uses reflection to invoke {class name}.main with the args -*/ - -class DefineWrapper { - public static void main( String[] args ) - { - int numberDefines = args.length ; - String className = null ; - - for (int ctr=0; ctr<args.length; ctr++ ) { - String arg = args[ctr] ; - - if ((arg.charAt(0) == '-') && (arg.charAt(1) == 'D')) { - int eqIndex = arg.indexOf( '=' ) ; - if (eqIndex < 0) - throw new Exception( arg + " is not a valid property assignment" ) ; - - final String key = arg.subString( 2, eqIndex ) ; - final String value = arg.subStrung( eqIndex + 1 ) ; - - AccessController.doPrivileged( new PrivilegedAction() { - public Object run() { - System.setProperty( key, value ) ; - return null ; - } - } ) ; - } else { - numberDefines = ctr ; - className = arg ; - break ; - } - } - - if (numberDefines < args.length) { - Class cls = getMainClass( className ) ; - Method mainMethod = getMainMethod( cls ) ; - - String[] newArgs = new String[ args.length - numberDefines ] ; - for (int ctr = numberDefines+1; ctr<args.length; ctr++ ) { - newArgs[ ctr-numberDefines-1 ] = args[ ctr ] ; - } - - // build args to the main and call it - Object params [] = new Object [1]; - params[0] = newArgs; - mainMethod.invoke(null, params); - } else { - throw new Exception( "No class name given" ) ; - } - } - - private static Class getMainClass( String name ) - { - // determine the class loader to be used for loading the class - // since ServerMain is going to be in JDK and we need to have this - // class to load application classes, this is required here. - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - - if (cl == null) - cl = ClassLoader.getSystemClassLoader(); - - try { - // determine the main class, try loading with current class loader - cls = Class.forName( className ) ; - } catch (ClassNotFoundException ex) { - // eat the exception and try to load using SystemClassLoader - cls = Class.forName( className, true, cl); - } - } - - private static Method getMainMethod( Class serverClass ) - { - Class argTypes[] = new Class[] { String[].class } ; - Method method = null ; - - try { - method = serverClass.getDeclaredMethod( "main", argTypes ) ; - } catch (Exception exc) { - throw new Exception( "Could not get main() method: " + exc ) ; - } - - if (!isPublicStaticVoid( method )) - throw new Exception( "Main method is not public static void" ) ; - - return method ; - } - - private static boolean isPublicStaticVoid( Method method ) - { - // check modifiers: public static - int modifiers = method.getModifiers (); - if (!Modifier.isPublic (modifiers) || !Modifier.isStatic (modifiers)) { - logError( method.getName() + " is not public static" ) ; - return false ; - } - - // check return type and exceptions - if (method.getExceptionTypes ().length != 0) { - logError( method.getName() + " declares exceptions" ) ; - return false ; - } - - if (!method.getReturnType().equals (Void.TYPE)) { - logError( method.getName() + " does not have a void return type" ) ; - return false ; - } - - return true ; - } -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLNameTranslatorImpl_save.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,909 +0,0 @@ -/* - * Copyright (c) 2004, 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.corba.se.impl.presentation.rmi ; - -import java.lang.reflect.Method; - -import java.math.BigInteger; - -import java.util.Map; -import java.util.Set; -import java.util.HashSet; -import java.util.Iterator; -import java.util.HashMap; -import java.util.StringTokenizer; - -import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator ; - -import com.sun.corba.se.impl.presentation.rmi.IDLType ; -import com.sun.corba.se.impl.presentation.rmi.IDLTypeException ; -import com.sun.corba.se.impl.presentation.rmi.IDLTypesUtil ; -import com.sun.corba.se.impl.orbutil.ObjectUtility ; - -/** - * Bidirectional translator between RMI-IIOP interface methods and - * and IDL Names. - */ -public class IDLNameTranslatorImpl implements IDLNameTranslator { - - // From CORBA Spec, Table 6 Keywords. - // Note that since all IDL identifiers are case - // insensitive, java identifier comparisons to these - // will be case insensitive also. - private static String[] IDL_KEYWORDS = { - - "abstract", "any", "attribute", "boolean", "case", "char", - "const", "context", "custom", "default", "double", "enum", - "exception", "factory", "FALSE", "fixed", "float", "in", "inout", - "interface", "long", "module", "native", "Object", "octet", - "oneway", "out", "private", "public", "raises", "readonly", "sequence", - "short", "string", "struct", "supports", "switch", "TRUE", "truncatable", - "typedef", "unsigned", "union", "ValueBase", "valuetype", "void", - "wchar", "wstring" - - }; - - private static char[] HEX_DIGITS = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F' - }; - - private static final String UNDERSCORE = "_"; - - // used to mangle java inner class names - private static final String INNER_CLASS_SEPARATOR = - UNDERSCORE + UNDERSCORE; - - // used to form IDL array type names - private static final String[] BASE_IDL_ARRAY_MODULE_TYPE= - new String[] { "org", "omg", "boxedRMI" } ; - - private static final String BASE_IDL_ARRAY_ELEMENT_TYPE = "seq"; - - // used to mangling java identifiers that have a leading underscore - private static final String LEADING_UNDERSCORE_CHAR = "J"; - private static final String ID_CONTAINER_CLASH_CHAR = UNDERSCORE; - - // separator used between types in a mangled overloaded method name - private static final String OVERLOADED_TYPE_SEPARATOR = - UNDERSCORE + UNDERSCORE; - - // string appended to attribute if it clashes with a method name - private static final String ATTRIBUTE_METHOD_CLASH_MANGLE_CHARS = - UNDERSCORE + UNDERSCORE; - - private static Set idlKeywords_; - - static { - - idlKeywords_ = new HashSet(); - for(int i = 0; i < IDL_KEYWORDS.length; i++) { - String next = (String) IDL_KEYWORDS[i]; - // Convert keyword to all caps to ease equality - // check. - String keywordAllCaps = next.toUpperCase(); - idlKeywords_.add(keywordAllCaps); - } - - } - - // - // Instance state - // - - // Remote interface for name translation. - private Class[] interf_; - - // Maps used to hold name translations. These do not need to be - // synchronized since the translation is never modified after - // initialization. - private Map methodToIDLNameMap_; - private Map IDLNameToMethodMap_; - private Method[] methods_; - - /** - * Return an IDLNameTranslator for the given interface. - * - * @throws IllegalStateException if given class is not a valid - * RMI/IIOP Remote Interface - */ - public static IDLNameTranslator get( Class interf ) - { - - return new IDLNameTranslatorImpl(new Class[] { interf } ); - - } - - /** - * Return an IDLNameTranslator for the given interfacex. - * - * @throws IllegalStateException if given classes are not valid - * RMI/IIOP Remote Interfaces - */ - public static IDLNameTranslator get( Class[] interfaces ) - { - - return new IDLNameTranslatorImpl(interfaces ); - - } - - public static String getExceptionId( Class cls ) - { - // Requirements for this method: - // 1. cls must be an exception but not a RemoteException. - // 2. If cls has an IDL keyword name, an underscore is prepended (1.3.2.2). - // 3. If cls jas a leading underscore, J is prepended (1.3.2.3). - // 4. If cls has an illegal IDL ident char, it is mapped to UXXXX where - // XXXX is the unicode value in hex of the char (1.3.2.4). - // 5. double underscore for inner class (1.3.2.5). - // 6. The ID is "IDL:" + name with / separators + ":1.0". - IDLType itype = classToIDLType( cls ) ; - return itype.getExceptionName() ; - } - - public Class[] getInterfaces() - { - return interf_; - } - - public Method[] getMethods() - { - return methods_ ; - } - - public Method getMethod( String idlName ) - { - return (Method) IDLNameToMethodMap_.get(idlName); - } - - public String getIDLName( Method method ) - { - return (String) methodToIDLNameMap_.get(method); - } - - /** - * Initialize an IDLNameTranslator for the given interface. - * - * @throws IllegalStateException if given class is not a valid - * RMI/IIOP Remote Interface - */ - private IDLNameTranslatorImpl(Class[] interfaces) - { - - try { - IDLTypesUtil idlTypesUtil = new IDLTypesUtil(); - for (int ctr=0; ctr<interfaces.length; ctr++) - idlTypesUtil.validateRemoteInterface(interfaces[ctr]); - interf_ = interfaces; - buildNameTranslation(); - } catch( IDLTypeException ite) { - String msg = ite.getMessage(); - IllegalStateException ise = new IllegalStateException(msg); - ise.initCause(ite); - throw ise; - } - } - - private void buildNameTranslation() - { - // holds method info, keyed by method - Map allMethodInfo = new HashMap() ; - - for (int ctr=0; ctr<interf_.length; ctr++) { - Class interf = interf_[ctr] ; - - IDLTypesUtil idlTypesUtil = new IDLTypesUtil(); - Method[] methods = interf.getMethods(); - - // Take an initial pass through all the methods and create some - // information that will be used to track the IDL name - // transformation. - for(int i = 0; i < methods.length; i++) { - - Method nextMethod = methods[i]; - - IDLMethodInfo methodInfo = new IDLMethodInfo(); - - methodInfo.method = nextMethod; - - methodInfo.propertyType = - idlTypesUtil.propertyAccessorMethodType( - nextMethod, interf ) ; - - if (methodInfo.propertyType != null) { - String attributeName = idlTypesUtil. - getAttributeNameForProperty(nextMethod.getName()); - methodInfo.originalName = attributeName; - methodInfo.mangledName = attributeName; - } else { - methodInfo.originalName = nextMethod.getName(); - methodInfo.mangledName = nextMethod.getName(); - } - - allMethodInfo.put(nextMethod, methodInfo); - } - } - - // Check for having both is<NAME> and get<NAME> methods. - - - // - // Perform case sensitivity test first. This applies to all - // method names AND attributes. Compare each method name and - // attribute to all other method names and attributes. If names - // differ only in case, apply mangling as defined in section 1.3.2.7 - // of Java2IDL spec. Note that we compare using the original names. - // - for(Iterator outerIter=allMethodInfo.values().iterator(); - outerIter.hasNext();) { - IDLMethodInfo outer = (IDLMethodInfo) outerIter.next(); - for(Iterator innerIter = allMethodInfo.values().iterator(); - innerIter.hasNext();) { - IDLMethodInfo inner = (IDLMethodInfo) innerIter.next(); - - if( (outer != inner) && - (!outer.originalName.equals(inner.originalName)) && - outer.originalName.equalsIgnoreCase(inner.originalName) ) { - outer.mangledName = - mangleCaseSensitiveCollision(outer.originalName); - break; - } - - } - } - - for(Iterator iter = allMethodInfo.values().iterator(); - iter.hasNext();) { - IDLMethodInfo next = (IDLMethodcurrentInfo) iter.next(); - next.mangledName = - mangleIdentifier(next.mangledName, - next.propertyType != null); - } - - // - // Now check for overloaded method names and apply 1.3.2.6. - // - for(Iterator outerIter=allMethodInfo.values().iterator(); - outerIter.hasNext();) { - IDLMethodInfo outer = (IDLMethodInfo) outerIter.next(); - if (outer.propertyType != null) { - continue; - } - for(Iterator innerIter = allMethodInfo.values().iterator(); - innerIter.hasNext();) { - IDLMethodInfo inner = (IDLMethodInfo) innerIter.next(); - - if( (outer != inner) && - (inner.propertyType == null) && - outer.originalName.equals(inner.originalName) ) { - outer.mangledName = mangleOverloadedMethod - (outer.mangledName, outer.method); - break; - } - } - } - - // - // Now mangle any properties that clash with method names. - // - for(Iterator outerIter=allMethodInfo.values().iterator(); - outerIter.hasNext();) { - IDLMethodInfo outer = (IDLMethodInfo) outerIter.next(); - if(outer.propertyType == null) { - continue; - } - for(Iterator innerIter = allMethodInfo.values().iterator(); - innerIter.hasNext();) { - IDLMethodInfo inner = (IDLMethodInfo) innerIter.next(); - if( (outer != inner) && - (inner.propertyType == null) && - outer.mangledName.equals(inner.mangledName) ) { - outer.mangledName = outer.mangledName + - ATTRIBUTE_METHOD_CLASH_MANGLE_CHARS; - break; - } - } - } - - // - // Ensure that no mapped method names clash with mapped name - // of container(1.3.2.9). This is a case insensitive comparison. - // - for (int ctr=0; ctr<interf_.length; ctr++ ) { - Class interf = interf_[ctr] ; - String mappedContainerName = getMappedContainerName(interf); - for(Iterator iter = allMethodInfo.values().iterator(); - iter.hasNext();) { - IDLMethodInfo next = (IDLMethodInfo) iter.next(); - if( (next.propertyType == null) && - identifierClashesWithContainer(mappedContainerName, - next.mangledName)) { - next.mangledName = mangleContainerClash(next.mangledName); - } - } - } - - // - // Populate name translation maps. - // - methodToIDLNameMap_ = new HashMap(); - IDLNameToMethodMap_ = new HashMap(); - methods_ = (Method[])allMethodInfo.keySet().toArray( - new Method[0] ) ; - - for(Iterator iter = allMethodInfo.values().iterator(); - iter.hasNext();) { - IDLMethodInfo next = (IDLMethodInfo) iter.next(); - String idlName = next.mangledName; - if (next.propertyType != null) { - idlName = javaPropertyPrefixToIDL( next.propertyType ) + - next.mangledName ; - } - - methodToIDLNameMap_.put(next.method, idlName); - - // Final check to see if there are any clashes after all the - // manglings have been applied. If so, this is treated as an - // invalid interface. Currently, we do a CASE-SENSITIVE - // comparison since that matches the rmic behavior. - // @@@ Shouldn't this be a case-insensitive check? - // If there is a collision between is<TYPE> and get<TYPE>, - // map only is<TYPE> to an attribute, and leave the - // get<TYPE> method alone. - if( IDLNameToMethodMap_.containsKey(idlName) ) { - // @@@ I18N - Method clash = (Method) IDLNameToMethodMap_.get(idlName); - MethodInfo clashMethodInfo = - (MethodInfo)allMethodInfo.get( clash ) ; - if (clashMethodInfo.isBooleanProperty() && - next.isReadProperty()) { - // fix idlName - } else if (clashMethodInfo.isReadProperty() && - next.isBooleanProperty()) { - // Remove entry under idlName - // put entry into table under correct name - } else { - throw new IllegalStateException("Error : methods " + - clash + " and " + next.method + - " both result in IDL name '" + idlName + "'"); - } - } - - IDLNameToMethodMap_.put(idlName, next.method); - } - - return; - - } - - - /** - * Perform all necessary stand-alone identifier mangling operations - * on a java identifier that is being transformed into an IDL name. - * That is, mangling operations that don't require looking at anything - * else but the identifier itself. This covers sections 1.3.2.2, 1.3.2.3, - * and 1.3.2.4 of the Java2IDL spec. Method overloading and - * case-sensitivity checks are handled elsewhere. - */ - - private static String mangleIdentifier(String identifier) { - return mangleIdentifier(identifier, false); - } - - private static String mangleIdentifier(String identifier, boolean attribute) { - - String mangledName = identifier; - - // - // Apply leading underscore test (1.3.2.3) - // This should be done before IDL Keyword clash test, since clashing - // IDL keywords are mangled by adding a leading underscore. - // - if( hasLeadingUnderscore(mangledName) ) { - mangledName = mangleLeadingUnderscore(mangledName); - } - - // - // Apply IDL keyword clash test (1.3.2.2). - // This is not needed for attributes since when the full property - // name is composed it cannot clash with an IDL keyword. - // (Also, rmic doesn't do it.) - // - - if( !attribute && isIDLKeyword(mangledName) ) { - mangledName = mangleIDLKeywordClash(mangledName); - } - - // - // Replace illegal IDL identifier characters (1.3.2.4) - // for all method names and attributes. - // - if( !isIDLIdentifier(mangledName) ) { - mangledName = mangleUnicodeChars(mangledName); - } - - return mangledName; - } - - /** - * Checks whether a java identifier clashes with an - * IDL keyword. Note that this is a case-insensitive - * comparison. - * - * Used to implement section 1.3.2.2 of Java2IDL spec. - */ - private static boolean isIDLKeyword(String identifier) { - - String identifierAllCaps = identifier.toUpperCase(); - - return idlKeywords_.contains(identifierAllCaps); - } - - private static String mangleIDLKeywordClash(String identifier) { - return UNDERSCORE + identifier; - } - - private static String mangleLeadingUnderscore(String identifier) { - return LEADING_UNDERSCORE_CHAR + identifier; - } - - /** - * Checks whether a java identifier starts with an underscore. - * Used to implement section 1.3.2.3 of Java2IDL spec. - */ - private static boolean hasLeadingUnderscore(String identifier) { - return identifier.startsWith(UNDERSCORE); - } - - /** - * Implements Section 1.3.2.4 of Java2IDL Mapping. - * All non-IDL identifier characters must be replaced - * with their Unicode representation. - */ - static String mangleUnicodeChars(String identifier) { - StringBuffer mangledIdentifier = new StringBuffer(); - - for(int i = 0; i < identifier.length(); i++) { - char nextChar = identifier.charAt(i); - if( isIDLIdentifierChar(nextChar) ) { - mangledIdentifier.append(nextChar); - } else { - String unicode = charToUnicodeRepresentation(nextChar); - mangledIdentifier.append(unicode); - } - } - - return mangledIdentifier.toString(); - } - - /** - * Implements mangling portion of Section 1.3.2.7 of Java2IDL spec. - * This method only deals with the actual mangling. Decision about - * whether case-sensitive collision mangling is required is made - * elsewhere. - * - * - * "...a mangled name is generated consisting of the original name - * followed by an underscore separated list of decimal indices - * into the string, where the indices identify all the upper case - * characters in the original string. Indices are zero based." - * - */ - String mangleCaseSensitiveCollision(String identifier) { - - StringBuffer mangledIdentifier = new StringBuffer(identifier); - - // There is always at least one trailing underscore, whether or - // not the identifier has uppercase letters. - mangledIdentifier.append(UNDERSCORE); - - boolean needUnderscore = false; - for(int i = 0; i < identifier.length(); i++) { - char next = identifier.charAt(i); - if( Character.isUpperCase(next) ) { - // This bit of logic is needed to ensure that we have - // an underscore separated list of indices but no - // trailing underscores. Basically, after we have at least - // one uppercase letter, we always put an undercore before - // printing the next one. - if( needUnderscore ) { - mangledIdentifier.append(UNDERSCORE); - } - mangledIdentifier.append(i); - needUnderscore = true; - } - } - - return mangledIdentifier.toString(); - } - - private static String mangleContainerClash(String identifier) { - return identifier + ID_CONTAINER_CLASH_CHAR; - } - - /** - * Implements Section 1.3.2.9 of Java2IDL Mapping. Container in this - * context means the name of the java Class(excluding package) in which - * the identifier is defined. Comparison is case-insensitive. - */ - private static boolean identifierClashesWithContainer - (String mappedContainerName, String identifier) { - - return identifier.equalsIgnoreCase(mappedContainerName); - } - - /** - * Returns Unicode mangling as defined in Section 1.3.2.4 of - * Java2IDL spec. - * - * "For Java identifiers that contain illegal OMG IDL identifier - * characters such as '$' or Unicode characters outside of ISO Latin 1, - * any such illegal characters are replaced by "U" followed by the - * 4 hexadecimal characters(in upper case) representing the Unicode - * value. So, the Java name a$b is mapped to aU0024b and - * x\u03bCy is mapped to xU03BCy." - */ - public static String charToUnicodeRepresentation(char c) { - - int orig = (int) c; - StringBuffer hexString = new StringBuffer(); - - int value = orig; - - while( value > 0 ) { - int div = value / 16; - int mod = value % 16; - hexString.insert(0, HEX_DIGITS[mod]); - value = div; - } - - int numZerosToAdd = 4 - hexString.length(); - for(int i = 0; i < numZerosToAdd; i++) { - hexString.insert(0, "0"); - } - - hexString.insert(0, "U"); - return hexString.toString(); - } - - private static boolean isIDLIdentifier(String identifier) { - - boolean isIdentifier = true; - - for(int i = 0; i < identifier.length(); i++) { - char nextChar = identifier.charAt(i); - // 1st char must be alphbetic. - isIdentifier = (i == 0) ? - isIDLAlphabeticChar(nextChar) : - isIDLIdentifierChar(nextChar); - if( !isIdentifier ) { - break; - } - } - - return isIdentifier; - - } - - private static boolean isIDLIdentifierChar(char c) { - return (isIDLAlphabeticChar(c) || - isIDLDecimalDigit(c) || - isUnderscore(c)); - } - - /** - * True if character is one of 114 Alphabetic characters as - * specified in Table 2 of Chapter 3 in CORBA spec. - */ - private static boolean isIDLAlphabeticChar(char c) { - - // NOTE that we can't use the java.lang.Character - // isUpperCase, isLowerCase, etc. methods since they - // include many characters other than the Alphabetic list in - // the CORBA spec. Instead, we test for inclusion in the - // Unicode value ranges for the corresponding legal characters. - - boolean alphaChar = - ( - // A - Z - ((c >= 0x0041) && (c <= 0x005A)) - - || - - // a - z - ((c >= 0x0061) && (c <= 0x007A)) - - || - - // other letter uppercase, other letter lowercase, which is - // the entire upper half of C1 Controls except X and / - ((c >= 0x00C0) && (c <= 0x00FF) - && (c != 0x00D7) && (c != 0x00F7))); - - return alphaChar; - } - - /** - * True if character is one of 10 Decimal Digits - * specified in Table 3 of Chapter 3 in CORBA spec. - */ - private static boolean isIDLDecimalDigit(char c) { - return ( (c >= 0x0030) && (c <= 0x0039) ); - } - - private static boolean isUnderscore(char c) { - return ( c == 0x005F ); - } - - /** - * Mangle an overloaded method name as defined in Section 1.3.2.6 of - * Java2IDL spec. Current value of method name is passed in as argument. - * We can't start from original method name since the name might have - * been partially mangled as a result of the other rules. - */ - private static String mangleOverloadedMethod(String mangledName, Method m) { - - IDLTypesUtil idlTypesUtil = new IDLTypesUtil(); - - // Start by appending the separator string - String newMangledName = mangledName + OVERLOADED_TYPE_SEPARATOR; - - Class[] parameterTypes = m.getParameterTypes(); - - for(int i = 0; i < parameterTypes.length; i++) { - Class nextParamType = parameterTypes[i]; - - if( i > 0 ) { - newMangledName = newMangledName + OVERLOADED_TYPE_SEPARATOR; - } - IDLType idlType = classToIDLType(nextParamType); - - String moduleName = idlType.getModuleName(); - String memberName = idlType.getMemberName(); - - String typeName = (moduleName.length() > 0) ? - moduleName + UNDERSCORE + memberName : memberName; - - if( !idlTypesUtil.isPrimitive(nextParamType) && - (idlTypesUtil.getSpecialCaseIDLTypeMapping(nextParamType) - == null) && - isIDLKeyword(typeName) ) { - typeName = mangleIDLKeywordClash(typeName); - } - - typeName = mangleUnicodeChars(typeName); - - newMangledName = newMangledName + typeName; - } - - return newMangledName; - } - - - private static IDLType classToIDLType(Class c) { - - IDLType idlType = null; - IDLTypesUtil idlTypesUtil = new IDLTypesUtil(); - - if( idlTypesUtil.isPrimitive(c) ) { - - idlType = idlTypesUtil.getPrimitiveIDLTypeMapping(c); - - } else if( c.isArray() ) { - - // Calculate array depth, as well as base element type. - Class componentType = c.getComponentType(); - int numArrayDimensions = 1; - while(componentType.isArray()) { - componentType = componentType.getComponentType(); - numArrayDimensions++; - } - IDLType componentIdlType = classToIDLType(componentType); - - String[] modules = BASE_IDL_ARRAY_MODULE_TYPE; - if( componentIdlType.hasModule() ) { - modules = (String[])ObjectUtility.concatenateArrays( modules, - componentIdlType.getModules() ) ; - } - - String memberName = BASE_IDL_ARRAY_ELEMENT_TYPE + - numArrayDimensions + UNDERSCORE + - componentIdlType.getMemberName(); - - idlType = new IDLType(c, modules, memberName); - - } else { - idlType = idlTypesUtil.getSpecialCaseIDLTypeMapping(c); - - if (idlType == null) { - // Section 1.3.2.5 of Java2IDL spec defines mangling rules for - // inner classes. - String memberName = getUnmappedContainerName(c); - - // replace inner class separator with double underscore - memberName = memberName.replaceAll("\\$", - INNER_CLASS_SEPARATOR); - - if( hasLeadingUnderscore(memberName) ) { - memberName = mangleLeadingUnderscore(memberName); - } - - // Get raw package name. If there is a package, it - // will still have the "." separators and none of the - // mangling rules will have been applied. - String packageName = getPackageName(c); - - if (packageName == null) { - idlType = new IDLType( c, memberName ) ; - } else { - // If this is a generated IDL Entity Type we need to - // prepend org_omg_boxedIDL per sections 1.3.5 and 1.3.9 - if (idlTypesUtil.isEntity(c)) { - packageName = "org.omg.boxedIDL." + packageName ; - } - - // Section 1.3.2.1 and 1.3.2.6 of Java2IDL spec defines - // rules for mapping java packages to IDL modules and for - // mangling module name portion of type name. NOTE that - // of the individual identifier mangling rules, - // only the leading underscore test is done here. - // The other two(IDL Keyword, Illegal Unicode chars) are - // done in mangleOverloadedMethodName. - StringTokenizer tokenizer = - new StringTokenizer(packageName, "."); - - String[] modules = new String[ tokenizer.countTokens() ] ; - int index = 0 ; - while (tokenizer.hasMoreElements()) { - String next = tokenizer.nextToken(); - String nextMangled = hasLeadingUnderscore(next) ? - mangleLeadingUnderscore(next) : next; - - modules[index++] = nextMangled ; - } - - idlType = new IDLType(c, modules, memberName); - } - } - } - - return idlType; - } - - /** - * Return Class' package name or null if there is no package. - */ - private static String getPackageName(Class c) { - Package thePackage = c.getPackage(); - String packageName = null; - - // Try to get package name by introspection. Some classloaders might - // not provide this information, so check for null. - if( thePackage != null ) { - packageName = thePackage.getName(); - } else { - // brute force method - String fullyQualifiedClassName = c.getName(); - int lastDot = fullyQualifiedClassName.indexOf('.'); - packageName = (lastDot == -1) ? null : - fullyQualifiedClassName.substring(0, lastDot); - } - return packageName; - } - - private static String getMappedContainerName(Class c) { - String unmappedName = getUnmappedContainerName(c); - - return mangleIdentifier(unmappedName); - } - - /** - * Return portion of class name excluding package name. - */ - private static String getUnmappedContainerName(Class c) { - - String memberName = null; - String packageName = getPackageName(c); - - String fullyQualifiedClassName = c.getName(); - - if( packageName != null ) { - int packageLength = packageName.length(); - memberName = fullyQualifiedClassName.substring(packageLength + 1); - } else { - memberName = fullyQualifiedClassName; - - } - - return memberName; - } - - /** - * Internal helper class for tracking information related to each - * interface method while we're building the name translation table. - */ - private static class IDLMethodInfo - { - public Method method; - public String propertyType; - - // If this is a property, originalName holds the original - // attribute name. Otherwise, it holds the original method name. - public String originalName; - - // If this is a property, mangledName holds the mangled attribute - // name. Otherwise, it holds the mangled method name. - public String mangledName; - - } - - public String toString() { - - StringBuffer contents = new StringBuffer(); - contents.append("IDLNameTranslator[" ); - for( int ctr=0; ctr<interf_.length; ctr++) { - if (ctr != 0) - contents.append( " " ) ; - contents.append( interf_[ctr].getName() ) ; - } - contents.append("]\n"); - for(Iterator iter = methodToIDLNameMap_.keySet().iterator(); - iter.hasNext();) { - - Method method = (Method) iter.next(); - String idlName = (String) methodToIDLNameMap_.get(method); - - contents.append(idlName + ":" + method + "\n"); - - } - - return contents.toString(); - } - - public static void main(String[] args) { - - Class remoteInterface = java.rmi.Remote.class; - - if( args.length > 0 ) { - String className = args[0]; - try { - remoteInterface = Class.forName(className); - } catch(Exception e) { - e.printStackTrace(); - System.exit(-1); - } - } - - System.out.println("Building name translation for " + remoteInterface); - try { - IDLNameTranslator nameTranslator = - IDLNameTranslatorImpl.get(remoteInterface); - System.out.println(nameTranslator); - } catch(IllegalStateException ise) { - ise.printStackTrace(); - } - } -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLTypesUtil_save.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,544 +0,0 @@ -/* - * Copyright (c) 2004, 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 com.sun.corba.se.impl.presentation.rmi ; - -import java.lang.reflect.Method; -import java.lang.reflect.Field; -import java.util.Set; -import java.util.HashSet; -import java.util.Iterator; - -/** - * Utility class for testing RMI/IDL Types as defined in - * Section 1.2 of The Java Language to IDL Mapping. Note that - * these are static checks only. Runtime checks, such as those - * described in Section 1.2.3, #3, are not covered. - */ -public class IDLTypesUtil { - - public static final String JAVA_GET_PROPERTY_PREFIX = "get"; - public static final String JAVA_SET_PROPERTY_PREFIX = "set"; - public static final String JAVA_IS_PROPERTY_PREFIX = "is"; - - public static final int VALID_TYPE = 0; - public static final int INVALID_TYPE = 1; - - /** - * Validate a class to ensure it conforms to the rules for a - * Java RMI/IIOP interface. - * - * @throws IDLTypeException if not a valid RMI/IIOP interface. - */ - public void validateRemoteInterface(Class c) throws IDLTypeException - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - if( !c.isInterface() ) { - String msg = "Class " + c + " must be a java interface."; - throw new IDLTypeException(msg); - } - - if( !java.rmi.Remote.class.isAssignableFrom(c) ) { - String msg = "Class " + c + " must extend java.rmi.Remote, " + - "either directly or indirectly."; - throw new IDLTypeException(msg); - } - - // Get all methods, including super-interface methods. - Method[] methods = c.getMethods(); - - for(int i = 0; i < methods.length; i++) { - Method next = methods[i]; - validateExceptions(next); - } - - // Removed because of bug 4989053 - // validateDirectInterfaces(c); - validateConstants(c); - - return; - } - - public boolean isRemoteInterface(Class c) - { - boolean remoteInterface = true; - try { - validateRemoteInterface(c); - } catch(IDLTypeException ite) { - remoteInterface = false; - } - - return remoteInterface; - } - - /** - * Section 1.2.2 Primitive Types - */ - public boolean isPrimitive(Class c) - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - return c.isPrimitive(); - } - - /** - * Section 1.2.4 - */ - public boolean isValue(Class c) - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - return - (!c.isInterface() && - java.io.Serializable.class.isAssignableFrom(c) && - !java.rmi.Remote.class.isAssignableFrom(c)); - } - - /** - * Section 1.2.5 - */ - public boolean isArray(Class c) - { - boolean arrayType = false; - - if( c == null ) { - throw new IllegalArgumentException(); - } - - if( c.isArray() ) { - Class componentType = c.getComponentType(); - arrayType = - (isPrimitive(componentType) || isRemoteInterface(componentType) || - isEntity(componentType) || isException(componentType) || - isValue(componentType) || isObjectReference(componentType) ); - } - - return arrayType; - } - - /** - * Section 1.2.6 - */ - public boolean isException(Class c) - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - // Must be a checked exception, not including RemoteException or - // its subclasses. - return isCheckedException(c) && !isRemoteException(c) && isValue(c); - } - - public boolean isRemoteException(Class c) - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - return java.rmi.RemoteException.class.isAssignableFrom(c) ; - } - - public boolean isCheckedException(Class c) - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - return Throwable.class.isAssignableFrom(c) && - !RuntimeException.class.isAssignableFrom(c) && - !Error.class.isAssignableFrom(c) ; - } - - /** - * Section 1.2.7 - */ - public boolean isObjectReference(Class c) - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - return (c.isInterface() && - org.omg.CORBA.Object.class.isAssignableFrom(c)); - } - - /** - * Section 1.2.8 - */ - public boolean isEntity(Class c) - { - if( c == null ) { - throw new IllegalArgumentException(); - } - - Class superClass = c.getSuperclass(); - return (!c.isInterface() && - (superClass != null) && - (org.omg.CORBA.portable.IDLEntity.class.isAssignableFrom(c))); - } - - public String javaPropertyPrefixToIDL( String javaPrefix ) - { - return "_" + javaPrefix + "_" ; - } - - /** - * Return the property type if given method is legal property accessor as defined in - * Section 1.3.4.3 of Java2IDL spec. Result is one of: JAVA_GET_PROPERTY_PREFIX, - * JAVA_SET_PROPERTY_PREFIX, JAVA_IS_PROPERTY_PREFIX. - */ - public String propertyAccessorMethodType(Method m, Class c) { - - String methodName = m.getName(); - Class returnType = m.getReturnType(); - Class[] parameters = m.getParameterTypes(); - Class[] exceptionTypes = m.getExceptionTypes(); - String propertyType = null; - - if( methodName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) { - - if((parameters.length == 0) && (returnType != Void.TYPE) && - !hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX) { - propertyType = JAVA_GET_PROPERTY_PREFIX; - } - - } else if( methodName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) { - - if((returnType == Void.TYPE) && (parameters.length == 1)) { - if (hasCorrespondingReadProperty(m, c, JAVA_GET_PROPERTY_PREFIX) || - hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX)) { - propertyType = JAVA_SET_PROPERTY_PREFIX; - } - } - - } else if( methodName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) { - if((parameters.length == 0) && (returnType == Boolean.TYPE)) { - propertyType = JAVA_IS_PROPERTY_PREFIX; - } - } - - // Some final checks that apply to all properties. - if( propertyType != null ) { - if(!validPropertyExceptions(m) || - (methodName.length() <= propertyType.length())) { - propertyType = null; - } - } - - return propertyType ; - } - - private boolean hasCorrespondingReadProperty - (Method writeProperty, Class c, String readPropertyPrefix) { - - String writePropertyMethodName = writeProperty.getName(); - Class[] writePropertyParameters = writeProperty.getParameterTypes(); - boolean foundReadProperty = false; - - try { - // Look for a valid corresponding Read property - String readPropertyMethodName = - writePropertyMethodName.replaceFirst - (JAVA_SET_PROPERTY_PREFIX, readPropertyPrefix); - Method readPropertyMethod = c.getMethod(readPropertyMethodName, - new Class[] {}); - foundReadProperty = - ((propertyAccessorMethodType(readPropertyMethod, c) != null) && - (readPropertyMethod.getReturnType() == - writePropertyParameters[0])); - } catch(Exception e) { - // ignore. this means we didn't find a corresponding get property. - } - - return foundReadProperty; - } - - public String getAttributeNameForProperty(String propertyName) { - String attributeName = null; - String prefix = null; - - if( propertyName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) { - prefix = JAVA_GET_PROPERTY_PREFIX; - } else if( propertyName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) { - prefix = JAVA_SET_PROPERTY_PREFIX; - } else if( propertyName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) { - prefix = JAVA_IS_PROPERTY_PREFIX; - } - - if( (prefix != null) && (prefix.length() < propertyName.length()) ) { - String remainder = propertyName.substring(prefix.length()); - if( (remainder.length() >= 2) && - Character.isUpperCase(remainder.charAt(0)) && - Character.isUpperCase(remainder.charAt(1)) ) { - // don't set the first letter to lower-case if the - // first two are upper-case - attributeName = remainder; - } else { - attributeName = Character.toLowerCase(remainder.charAt(0)) + - remainder.substring(1); - } - } - - return attributeName; - } - - /** - * Return IDL Type name for primitive types as defined in - * Section 1.3.3 of Java2IDL spec or null if not a primitive type. - */ - public IDLType getPrimitiveIDLTypeMapping(Class c) { - - if( c == null ) { - throw new IllegalArgumentException(); - } - - if( c.isPrimitive() ) { - if( c == Void.TYPE ) { - return new IDLType( c, "void" ) ; - } else if( c == Boolean.TYPE ) { - return new IDLType( c, "boolean" ) ; - } else if( c == Character.TYPE ) { - return new IDLType( c, "wchar" ) ; - } else if( c == Byte.TYPE ) { - return new IDLType( c, "octet" ) ; - } else if( c == Short.TYPE ) { - return new IDLType( c, "short" ) ; - } else if( c == Integer.TYPE ) { - return new IDLType( c, "long" ) ; - } else if( c == Long.TYPE ) { - return new IDLType( c, "long_long" ) ; - } else if( c == Float.TYPE ) { - return new IDLType( c, "float" ) ; - } else if( c == Double.TYPE ) { - return new IDLType( c, "double" ) ; - } - } - - return null; - } - - /** - * Return IDL Type name for special case type mappings as defined in - * Table 1-1 of Java2IDL spec or null if given class is not a special - * type. - */ - public IDLType getSpecialCaseIDLTypeMapping(Class c) { - - if( c == null ) { - throw new IllegalArgumentException(); - } - - if( c == java.lang.Object.class ) { - return new IDLType( c, new String[] { "java", "lang" }, - "Object" ) ; - } else if( c == java.lang.String.class ) { - return new IDLType( c, new String[] { "CORBA" }, - "WStringValue" ) ; - } else if( c == java.lang.Class.class ) { - return new IDLType( c, new String[] { "javax", "rmi", "CORBA" }, - "ClassDesc" ) ; - } else if( c == java.io.Serializable.class ) { - return new IDLType( c, new String[] { "java", "io" }, - "Serializable" ) ; - } else if( c == java.io.Externalizable.class ) { - return new IDLType( c, new String[] { "java", "io" }, - "Externalizable" ) ; - } else if( c == java.rmi.Remote.class ) { - return new IDLType( c, new String[] { "java", "rmi" }, - "Remote" ) ; - } else if( c == org.omg.CORBA.Object.class ) { - return new IDLType( c, "Object" ) ; - } else { - return null; - } - } - - /** - * Implements 1.2.3 #2 and #4 - */ - private void validateExceptions(Method method) throws IDLTypeException { - - Class[] exceptions = method.getExceptionTypes(); - - boolean declaresRemoteExceptionOrSuperClass = false; - - // Section 1.2.3, #2 - for(int eIndex = 0; eIndex < exceptions.length; eIndex++) { - Class exception = exceptions[eIndex]; - if( isRemoteExceptionOrSuperClass(exception) ) { - declaresRemoteExceptionOrSuperClass = true; - break; - } - } - - if( !declaresRemoteExceptionOrSuperClass ) { - String msg = "Method '" + method + "' must throw at least one " + - "exception of type java.rmi.RemoteException or one of its " + - "super-classes"; - throw new IDLTypeException(msg); - } - - // Section 1.2.3, #4 - // See also bug 4972402 - // For all exceptions E in exceptions, - // (isCheckedException(E) => (isValue(E) || RemoteException.isAssignableFrom( E ) ) - for(int eIndex = 0; eIndex < exceptions.length; eIndex++) { - Class exception = exceptions[eIndex]; - - if (isCheckedException(exception) && !isValue(exception) && - !isRemoteException(exception)) - { - String msg = "Exception '" + exception + "' on method '" + - method + "' is not a allowed RMI/IIOP exception type"; - throw new IDLTypeException(msg); - } - } - - return; - } - - /** - * Returns true if the method's throw clause conforms to the exception - * restrictions for properties as defined in Section 1.3.4.3 of - * Java2IDL spec. This means that for all exceptions E declared on the - * method, E isChecked => RemoteException.isAssignableFrom( E ). - */ - private boolean validPropertyExceptions(Method method) - { - Class[] exceptions = method.getExceptionTypes(); - - for(int eIndex = 0; eIndex < exceptions.length; eIndex++) { - Class exception = exceptions[eIndex]; - - if (isCheckedException(exception) && !isRemoteException(exception)) - return false ; - } - - return true; - } - - /** - * Implements Section 1.2.3, #2. - */ - private boolean isRemoteExceptionOrSuperClass(Class c) { - return - ((c == java.rmi.RemoteException.class) || - (c == java.io.IOException.class) || - (c == java.lang.Exception.class) || - (c == java.lang.Throwable.class)); - } - - /** - * Implements Section 1.2.3, #5. - */ - private void validateDirectInterfaces(Class c) throws IDLTypeException { - - Class[] directInterfaces = c.getInterfaces(); - - if( directInterfaces.length < 2 ) { - return; - } - - Set allMethodNames = new HashSet(); - Set currentMethodNames = new HashSet(); - - for(int i = 0; i < directInterfaces.length; i++) { - Class next = directInterfaces[i]; - Method[] methods = next.getMethods(); - - // Comparison is based on method names only. First collect - // all methods from current interface, eliminating duplicate - // names. - currentMethodNames.clear(); - for(int m = 0; m < methods.length; m++) { - currentMethodNames.add(methods[m].getName()); - } - - // Now check each method against list of all unique method - // names processed so far. - for(Iterator iter=currentMethodNames.iterator(); iter.hasNext();) { - String methodName = (String) iter.next(); - if( allMethodNames.contains(methodName) ) { - String msg = "Class " + c + " inherits method " + - methodName + " from multiple direct interfaces."; - throw new IDLTypeException(msg); - } else { - allMethodNames.add(methodName); - } - } - } - - return; - } - - /** - * Implements 1.2.3 #6 - */ - private void validateConstants(final Class c) - throws IDLTypeException { - - Field[] fields = null; - - try { - fields = (Field[]) - java.security.AccessController.doPrivileged - (new java.security.PrivilegedExceptionAction() { - public java.lang.Object run() throws Exception { - return c.getFields(); - } - }); - } catch(java.security.PrivilegedActionException pae) { - IDLTypeException ite = new IDLTypeException(); - ite.initCause(pae); - throw ite; - } - - for(int i = 0; i < fields.length; i++) { - Field next = fields[i]; - Class fieldType = next.getType(); - if( (fieldType != java.lang.String.class) && - !isPrimitive(fieldType) ) { - String msg = "Constant field '" + next.getName() + - "' in class '" + next.getDeclaringClass().getName() + - "' has invalid type' " + next.getType() + "'. Constants" + - " in RMI/IIOP interfaces can only have primitive" + - " types and java.lang.String types."; - throw new IDLTypeException(msg); - } - } - - - return; - } - -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientRequestImpl.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +0,0 @@ -/* - * Copyright (c) 1999, 2003, 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.corba.se.impl.iiop; - -import com.sun.corba.se.impl.protocol.Request; -import com.sun.corba.se.impl.core.ClientRequest; -import com.sun.corba.se.impl.core.ServiceContext; -import com.sun.corba.se.impl.core.ServiceContexts; -import com.sun.corba.se.impl.core.ClientResponse; -import com.sun.corba.se.impl.core.ServerRequest; -import com.sun.corba.se.impl.core.ServerResponse; -import com.sun.corba.se.impl.corba.IOR; -import com.sun.corba.se.impl.corba.GIOPVersion; -import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase; -import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage; -import com.sun.corba.se.impl.orbutil.ORBConstants; -import com.sun.corba.se.impl.core.ORBVersion; -import com.sun.corba.se.impl.core.ORB; -import com.sun.corba.se.impl.orbutil.ORBUtility; -import com.sun.corba.se.impl.ior.ObjectKeyFactory ; -import com.sun.corba.se.impl.ior.ObjectKey ; -import com.sun.corba.se.impl.ior.ObjectKeyTemplate ; -import com.sun.corba.se.impl.ior.IIOPProfile; - -public class LocalClientRequestImpl extends IIOPOutputStream - implements ClientRequest -{ - public LocalClientRequestImpl( GIOPVersion gv, - ORB orb, IOR ior, short addrDisposition, - String operationName, boolean oneway, ServiceContexts svc, - int requestId, byte streamFormatVersion) - { - super(gv, - orb, - null, - BufferManagerFactory.newBufferManagerWrite(BufferManagerFactory.GROW), - streamFormatVersion); - - this.isOneway = oneway; - boolean responseExpected = !isOneway; - - IIOPProfile iop = ior.getProfile(); - ObjectKey okey = iop.getObjectKey(); - ObjectKeyTemplate oktemp = okey.getTemplate() ; - ORBVersion version = oktemp.getORBVersion() ; - orb.setORBVersion( version ) ; - - this.request = MessageBase.createRequest(orb, gv, requestId, - responseExpected, ior, addrDisposition, operationName, svc, null); - setMessage(request); - request.write(this); - - // mark beginning of msg body for possible later use - bodyBegin = getSize(); - } - - public int getRequestId() { - return request.getRequestId(); - } - - public boolean isOneWay() { - return isOneway; - } - - public ServiceContexts getServiceContexts() { - return request.getServiceContexts(); - } - - public String getOperationName() { - return request.getOperation(); - } - - public ObjectKey getObjectKey() { - return request.getObjectKey(); - } - - public ServerRequest getServerRequest() - { - // Set the size of the marshalled data in the message header. - getMessage().setSize( getByteBuffer(), getSize() ) ; - - // Construct a new ServerRequest out of the buffer in this ClientRequest - LocalServerRequestImpl serverRequest = new LocalServerRequestImpl( - (ORB)orb(), toByteArray(), request ) ; - - // Skip over all of the GIOP header information. This positions - // the offset in the buffer so that the skeleton can correctly read - // the marshalled arguments. - serverRequest.setIndex( bodyBegin ) ; - - return serverRequest ; - } - - public ClientResponse invoke() - { - ORB myORB = (ORB)orb() ; - - ServerResponse serverResponse = myORB.process( getServerRequest() ) ; - - LocalServerResponseImpl lsr = (LocalServerResponseImpl)serverResponse ; - - return lsr.getClientResponse() ; - } - - /** - * Check to see if the request is local. - */ - public boolean isLocal(){ - return true; - } - - private RequestMessage request; - private int bodyBegin; - private boolean isOneway; -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientResponseImpl.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,162 +0,0 @@ -/* - * Copyright (c) 1999, 2003, 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.corba.se.impl.iiop; - -import java.io.IOException; - -import org.omg.CORBA.SystemException; -import org.omg.CORBA.CompletionStatus; - -import com.sun.corba.se.impl.core.Response; -import com.sun.corba.se.impl.core.ClientResponse; -import com.sun.corba.se.impl.corba.IOR; -import com.sun.corba.se.impl.core.ORB; -import com.sun.corba.se.impl.core.ServiceContext; -import com.sun.corba.se.impl.core.ServiceContexts; -import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; -import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage; -import com.sun.corba.se.impl.orbutil.MinorCodes; - -class LocalClientResponseImpl extends IIOPInputStream implements ClientResponse -{ - LocalClientResponseImpl(ORB orb, byte[] buf, ReplyMessage header) - { - super(orb, buf, header.getSize(), header.isLittleEndian(), header, null); - - this.reply = header; - - // NOTE (Ram J) (06/02/2000) if we set result.setIndex(bodyBegin) - // in LocalServerResponse.getClientResponse(), then we do not need - // to read the headers (done below) anymore. - // This will be an optimisation which is can be done to speed up the - // local invocation by avoiding reading the headers in the local cases. - - // BUGFIX(Ram Jeyaraman) This has been moved from - // LocalServerResponse.getClientResponse() - // Skip over all of the GIOP header information. This positions - // the offset in the buffer so that the skeleton can correctly read - // the marshalled arguments. - this.setIndex(Message.GIOPMessageHeaderLength); - - // BUGFIX(Ram Jeyaraman) For local invocations, the reply mesg fields - // needs to be set, by reading the response buffer contents - // to correctly set the exception type and other info. - this.reply.read(this); - } - - LocalClientResponseImpl(SystemException ex) - { - this.systemException = ex; - } - - public boolean isSystemException() { - if ( reply != null ) - return reply.getReplyStatus() == ReplyMessage.SYSTEM_EXCEPTION; - else - return (systemException != null); - } - - public boolean isUserException() { - if ( reply != null ) - return reply.getReplyStatus() == ReplyMessage.USER_EXCEPTION; - else - return false; - } - - public boolean isLocationForward() { - if ( reply != null ) { - return ( (reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD) || - (reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD_PERM) ); - //return reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD; - } else { - return false; - } - } - - public boolean isDifferentAddrDispositionRequested() { - if (reply != null) { - return reply.getReplyStatus() == ReplyMessage.NEEDS_ADDRESSING_MODE; - } - - return false; - } - - public short getAddrDisposition() { - if (reply != null) { - return reply.getAddrDisposition(); - } - - throw new org.omg.CORBA.INTERNAL( - "Null reply in getAddrDisposition", - MinorCodes.NULL_REPLY_IN_GET_ADDR_DISPOSITION, - CompletionStatus.COMPLETED_MAYBE); - } - - public IOR getForwardedIOR() { - if ( reply != null ) - return reply.getIOR(); - else - return null; - } - - public int getRequestId() { - if ( reply != null ) - return reply.getRequestId(); - else - throw new org.omg.CORBA.INTERNAL("Error in getRequestId"); - } - - public ServiceContexts getServiceContexts() { - if ( reply != null ) - return reply.getServiceContexts(); - else - return null; - } - - public SystemException getSystemException() { - if ( reply != null ) - return reply.getSystemException(); - else - return systemException; - } - - public java.lang.String peekUserExceptionId() { - mark(Integer.MAX_VALUE); - String result = read_string(); - reset(); - return result; - } - - /** - * Check to see if the response is local. - */ - public boolean isLocal(){ - return true; - } - - private ReplyMessage reply; - private SystemException systemException; -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerRequestImpl.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,208 +0,0 @@ -/* - * Copyright (c) 1999, 2003, 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.corba.se.impl.iiop; - -import org.omg.CORBA.SystemException; - -import com.sun.corba.se.impl.core.ServerRequest; -import com.sun.corba.se.impl.core.ServiceContext; -import com.sun.corba.se.impl.core.DuplicateServiceContext; -import com.sun.corba.se.impl.core.UEInfoServiceContext; -import com.sun.corba.se.impl.core.ServiceContexts; -import com.sun.corba.se.impl.core.ServerResponse; -import com.sun.corba.se.impl.corba.IOR; -import com.sun.corba.se.impl.core.ORB; -import com.sun.corba.se.impl.orbutil.ORBUtility; //d11638 -import org.omg.CORBA.portable.UnknownException; -import org.omg.CORBA.UNKNOWN; -import org.omg.CORBA.CompletionStatus; -import com.sun.corba.se.impl.ior.ObjectKey; -import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase; -import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage; -import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage; - -class LocalServerRequestImpl extends IIOPInputStream implements ServerRequest { - org.omg.CORBA.portable.OutputStream replyStream; - org.omg.CORBA.portable.OutputStream exceptionReplyStream; - - LocalServerRequestImpl(ORB orb, byte[] buf, RequestMessage header) - { - super(orb, buf, header.getSize(), header.isLittleEndian(), header, null ); - - this.request = header; - } - - public int getRequestId() { - return request.getRequestId(); - } - - public boolean isOneWay() { - return !request.isResponseExpected(); - } - - public ServiceContexts getServiceContexts() { - return request.getServiceContexts(); - } - - public String getOperationName() { - return request.getOperation(); - } - - public ObjectKey getObjectKey() { - return request.getObjectKey(); - } - - public ServerResponse createResponse(ServiceContexts svc) - { - return new LocalServerResponseImpl(this, svc); - } - - public org.omg.CORBA.portable.OutputStream createReply() { - if (replyStream == null) { - replyStream = (org.omg.CORBA.portable.OutputStream) - createResponse(null); - } - return replyStream; - } - - public org.omg.CORBA.portable.OutputStream createExceptionReply() { - if (exceptionReplyStream == null) { - exceptionReplyStream = (org.omg.CORBA.portable.OutputStream) - createUserExceptionResponse(null); - } - return exceptionReplyStream; - } - - public ServerResponse createUserExceptionResponse( - ServiceContexts svc) - { - return new LocalServerResponseImpl(this, svc, true); - } - - public ServerResponse createUnknownExceptionResponse( - UnknownException ex) { - ServiceContexts contexts = null; - SystemException sys = new UNKNOWN( 0, - CompletionStatus.COMPLETED_MAYBE); - - try { - contexts = new ServiceContexts( (ORB)orb() ); - UEInfoServiceContext uei = new UEInfoServiceContext(sys); - contexts.put(uei) ; - } catch (DuplicateServiceContext d) { - // can't happen - } - - return createSystemExceptionResponse(sys,contexts); - } - - public ServerResponse createSystemExceptionResponse( - SystemException ex, ServiceContexts svc) { - - // Only do this if interceptors have been initialized on this request - // and have not completed their lifecycle (otherwise the info stack - // may be empty or have a different request's entry on top). - if (executePIInResponseConstructor()) { - // Inform Portable Interceptors of the SystemException. This is - // required to be done here because the ending interception point - // is called in the ServerResponseImpl constructor called below - // but we do not currently write the SystemException into the - // response until after the ending point is called. - ORB orb = (ORB)orb(); - orb.getPIHandler().setServerPIInfo( ex ); - } - - if (orb() != null && ((ORB)orb()).subcontractDebugFlag && ex != null) - ORBUtility.dprint(this, "Sending SystemException:", ex); - - LocalServerResponseImpl response = - new LocalServerResponseImpl(this, svc, false); - ORBUtility.writeSystemException(ex, response); - return response; - } - - public ServerResponse createLocationForward( - IOR ior, ServiceContexts svc) { - ReplyMessage reply = MessageBase.createReply( (ORB)orb(), - request.getGIOPVersion(), request.getRequestId(), - ReplyMessage.LOCATION_FORWARD, svc, ior); - LocalServerResponseImpl response = - new LocalServerResponseImpl(this, reply, ior); - - return response; - } - - private RequestMessage request; - - /** - * Check to see if the request is local. - */ - public boolean isLocal(){ - return true; - } - - private boolean _executeReturnServantInResponseConstructor = false; - - public boolean executeReturnServantInResponseConstructor() - { - return _executeReturnServantInResponseConstructor; - } - - public void setExecuteReturnServantInResponseConstructor(boolean b) - { - _executeReturnServantInResponseConstructor = b; - } - - - private boolean _executeRemoveThreadInfoInResponseConstructor = false; - - public boolean executeRemoveThreadInfoInResponseConstructor() - { - return _executeRemoveThreadInfoInResponseConstructor; - } - - public void setExecuteRemoveThreadInfoInResponseConstructor(boolean b) - { - _executeRemoveThreadInfoInResponseConstructor = b; - } - - - private boolean _executePIInResponseConstructor = false; - - public boolean executePIInResponseConstructor() { - return _executePIInResponseConstructor; - } - - public void setExecutePIInResponseConstructor( boolean b ) { - _executePIInResponseConstructor = b; - } - - // We know that we're talking to the same ValueHandler, so - // use the maximum version it supports. - public byte getStreamFormatVersionForReply() { - return ORBUtility.getMaxStreamFormatVersion(); - } -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerResponseImpl.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/* - * Copyright (c) 1999, 2003, 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.corba.se.impl.iiop; - -import org.omg.CORBA.SystemException; - -import com.sun.corba.se.impl.core.ServerResponse; -import com.sun.corba.se.impl.core.ORB; -import com.sun.corba.se.impl.corba.IOR; -import com.sun.corba.se.impl.core.ServiceContext; -import com.sun.corba.se.impl.core.ServiceContexts; -import com.sun.corba.se.impl.core.ClientResponse; -import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase; -import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage; - -class LocalServerResponseImpl - extends IIOPOutputStream - implements ServerResponse -{ - LocalServerResponseImpl(LocalServerRequestImpl request, ServiceContexts svc) - { - this(request, - MessageBase.createReply( - (ORB)request.orb(), - request.getGIOPVersion(), - request.getRequestId(), ReplyMessage.NO_EXCEPTION, - svc, null), - null); - } - - LocalServerResponseImpl(LocalServerRequestImpl request, ServiceContexts svc, - boolean user) - { - this(request, - MessageBase.createReply( - (ORB)request.orb(), - request.getGIOPVersion(), request.getRequestId(), - user ? ReplyMessage.USER_EXCEPTION : - ReplyMessage.SYSTEM_EXCEPTION, - svc, null), - null); - } - - LocalServerResponseImpl( LocalServerRequestImpl request, ReplyMessage reply, - IOR ior) - { - super(request.getGIOPVersion(), - (ORB)request.orb(), - null, - BufferManagerFactory.newBufferManagerWrite(BufferManagerFactory.GROW), - request.getStreamFormatVersionForReply()); - - setMessage(reply); - - ORB orb = (ORB)request.orb(); - - ServerResponseImpl.runServantPostInvoke(orb, request); - - if( request.executePIInResponseConstructor() ) { - // Invoke server request ending interception points (send_*): - // Note: this may end up with a SystemException or an internal - // Runtime ForwardRequest. - orb.getPIHandler().invokeServerPIEndingPoint( reply ); - - // Note this will be executed even if a ForwardRequest or - // SystemException is thrown by a Portable Interceptors ending - // point since we end up in this constructor again anyway. - orb.getPIHandler().cleanupServerPIRequest(); - - // See (Local)ServerRequestImpl.createSystemExceptionResponse - // for why this is necesary. - request.setExecutePIInResponseConstructor(false); - } - - // Once you get here then the final reply is available (i.e., - // postinvoke and interceptors have completed. - if (request.executeRemoveThreadInfoInResponseConstructor()) { - ServerResponseImpl.removeThreadInfo(orb, request); - } - - reply.write(this); - if (reply.getIOR() != null) - reply.getIOR().write(this); - - this.reply = reply; - this.ior = reply.getIOR(); - } - - public boolean isSystemException() { - if (reply != null) - return reply.getReplyStatus() == ReplyMessage.SYSTEM_EXCEPTION; - return false; - } - - public boolean isUserException() { - if (reply != null) - return reply.getReplyStatus() == ReplyMessage.USER_EXCEPTION; - return false; - } - - public boolean isLocationForward() { - if (ior != null) - return true; - return false; - } - - public IOR getForwardedIOR() { - return ior; - } - - public int getRequestId() { - if (reply != null) - return reply.getRequestId(); - return -1; - } - - public ServiceContexts getServiceContexts() { - if (reply != null) - return reply.getServiceContexts(); - return null; - } - - public SystemException getSystemException() { - if (reply != null) - return reply.getSystemException(); - return null; - } - - public ReplyMessage getReply() - { - return reply ; - } - - public ClientResponse getClientResponse() - { - // set the size of the marshalled data in the message header - getMessage().setSize(getByteBuffer(), getSize()); - - // Construct a new ClientResponse out of the buffer in this ClientRequest - LocalClientResponseImpl result = - new LocalClientResponseImpl( (ORB)orb(), toByteArray(), reply); - - // NOTE (Ram J) (06/02/2000) if we set result.setIndex(bodyBegin) here - // then the LocalClientResponse does not need to read the headers anymore. - // This will be an optimisation which is can be done to speed up the - // local invocation by avoiding reading the headers in the local cases. - - // BUGFIX(Ram Jeyaraman) result.setOffset is now done in - // LocalClientResponseImpl constructor. - /* - // Skip over all of the GIOP header information. This positions - // the offset in the buffer so that the skeleton can correctly read - // the marshalled arguments. - result.setOffset( bodyBegin ) ; - */ - - return result ; - } - - /** - * Check to see if the response is local. - */ - public boolean isLocal(){ - return true; - } - - private ReplyMessage reply; - private IOR ior; // forwarded IOR -}
--- a/corba/src/share/classes/com/sun/corba/se/impl/transport/BufferConnectionImpl.sjava Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,710 +0,0 @@ -/* - * Copyright (c) 2004, 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.corba.se.impl.transport; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.nio.channels.SelectableChannel; -import java.nio.channels.SelectionKey; -import java.nio.channels.SocketChannel; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.Collections; -import java.util.Hashtable; -import java.util.HashMap; -import java.util.Map; - -import org.omg.CORBA.COMM_FAILURE; -import org.omg.CORBA.CompletionStatus; -import org.omg.CORBA.DATA_CONVERSION; -import org.omg.CORBA.INTERNAL; -import org.omg.CORBA.MARSHAL; -import org.omg.CORBA.OBJECT_NOT_EXIST; -import org.omg.CORBA.SystemException; - -import com.sun.org.omg.SendingContext.CodeBase; - -import com.sun.corba.se.pept.broker.Broker; -import com.sun.corba.se.pept.encoding.InputObject; -import com.sun.corba.se.pept.encoding.OutputObject; -import com.sun.corba.se.pept.protocol.MessageMediator; -import com.sun.corba.se.pept.transport.Acceptor; -import com.sun.corba.se.pept.transport.Connection; -import com.sun.corba.se.pept.transport.ConnectionCache; -import com.sun.corba.se.pept.transport.ContactInfo; -import com.sun.corba.se.pept.transport.EventHandler; -import com.sun.corba.se.pept.transport.InboundConnectionCache; -import com.sun.corba.se.pept.transport.OutboundConnectionCache; -import com.sun.corba.se.pept.transport.ResponseWaitingRoom; -import com.sun.corba.se.pept.transport.Selector; - -import com.sun.corba.se.spi.ior.IOR; -import com.sun.corba.se.spi.ior.iiop.GIOPVersion; -import com.sun.corba.se.spi.logging.CORBALogDomains; -import com.sun.corba.se.spi.orb.ORB ; -import com.sun.corba.se.spi.orbutil.threadpool.Work; -import com.sun.corba.se.spi.protocol.CorbaMessageMediator; -import com.sun.corba.se.spi.transport.CorbaContactInfo; -import com.sun.corba.se.spi.transport.CorbaConnection; -import com.sun.corba.se.spi.transport.CorbaResponseWaitingRoom; - -import com.sun.corba.se.impl.encoding.CachedCodeBase; -import com.sun.corba.se.impl.encoding.CDRInputStream_1_0; -import com.sun.corba.se.impl.encoding.CDROutputObject; -import com.sun.corba.se.impl.encoding.CDROutputStream_1_0; -import com.sun.corba.se.impl.encoding.CodeSetComponentInfo; -import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry; -import com.sun.corba.se.impl.logging.ORBUtilSystemException; -import com.sun.corba.se.impl.orbutil.ORBConstants; -import com.sun.corba.se.impl.orbutil.ORBUtility; -import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; -import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase; -import com.sun.corba.se.impl.transport.CorbaResponseWaitingRoomImpl; - -/** - * @author Ken Cavanaugh - */ -public class BufferConnectionImpl - extends - EventHandlerBase - implements - CorbaConnection, - Work -{ - // - // New transport. - // - - protected long enqueueTime; - - public SocketChannel getSocketChannel() - { - return null; - } - - // REVISIT: - // protected for test: genericRPCMSGFramework.IIOPConnection constructor. - - // - // From iiop.Connection.java - // - - protected long timeStamp = 0; - protected boolean isServer = false; - - // Start at some value other than zero since this is a magic - // value in some protocols. - protected int requestId = 5; - protected CorbaResponseWaitingRoom responseWaitingRoom; - protected int state; - protected java.lang.Object stateEvent = new java.lang.Object(); - protected java.lang.Object writeEvent = new java.lang.Object(); - protected boolean writeLocked; - protected int serverRequestCount = 0; - - // Server request map: used on the server side of Connection - // Maps request ID to IIOPInputStream. - Map serverRequestMap = new HashMap() ; - - // This is a flag associated per connection telling us if the - // initial set of sending contexts were sent to the receiver - // already... - protected boolean postInitialContexts = false; - - // Remote reference to CodeBase server (supplies - // FullValueDescription, among other things) - protected IOR codeBaseServerIOR; - - // CodeBase cache for this connection. This will cache remote operations, - // handle connecting, and ensure we don't do any remote operations until - // necessary. - protected CachedCodeBase cachedCodeBase = new CachedCodeBase(this); - - protected ORBUtilSystemException wrapper ; - - List buffers ; - - public BufferConnectionImpl(ORB orb, byte[][] data ) - { - this.orb = orb; - wrapper = ORBUtilSystemException.get( orb, - CORBALogDomains.RPC_TRANSPORT ) ; - buffers = new ArrayList() ; - } - - //////////////////////////////////////////////////// - // - // framework.transport.Connection - // - - public boolean shouldRegisterReadEvent() - { - return false; - } - - public boolean shouldRegisterServerReadEvent() - { - return false; - } - - public boolean read() - { - return true ; - } - - protected CorbaMessageMediator readBits() - { - return null ; - } - - protected boolean dispatch(CorbaMessageMediator messageMediator) - { - } - - public boolean shouldUseDirectByteBuffers() - { - return false ; - } - - // Only called from readGIOPMessage with (12, 0, 12) as arguments - // size is size of buffer to create - // offset is offset from start of message in buffer - // length is length to read - public ByteBuffer read(int size, int offset, int length) - throws IOException - { - byte[] buf = new byte[size]; - readFully( buf, offset, length); - ByteBuffer byteBuffer = ByteBuffer.wrap(buf); - byteBuffer.limit(size); - return byteBuffer; - } - - // Only called as read( buf, 12, msgsize-12 ) in readGIOPMessage - // We can ignore the byteBuffer parameter - // offset is the starting position to place data in the result - // length is the length of the data to read - public ByteBuffer read(ByteBuffer byteBuffer, int offset, int length) - throws IOException - { - int size = offset + length; - byte[] buf = new byte[size]; - readFully(buf, offset, length); - return ByteBuffer.wrap(buf); - } - - // Read size bytes from buffer list and place the data - // starting at offset in buf. - public void readFully(byte[] buf, int offset, int size) - throws IOException - { - int remaining = size ; - int position = offset ; - while (remaining > 0) { - ByteBuffer buff = (ByteBuffer)buffers.get(0) ; - int dataSize = buff.remaining() ; - int xferSize = dataSize ; - if (dataSize >= remaining) : - xferSize = remaining ; - buffers.remove(0) ; - } - - buff.get( buf, offset, xferSize ) ; - - offset += xferSize ; - remaining -= xferSize ; - } - } - - public void write(ByteBuffer byteBuffer) - throws IOException - { - buffers.add( byteBuffer ) ; - } - - /** - * Note:it is possible for this to be called more than once - */ - public synchronized void close() - { - } - - public Acceptor getAcceptor() - { - return null; - } - - public ContactInfo getContactInfo() - { - return null; - } - - public EventHandler getEventHandler() - { - return this; - } - - public OutputObject createOutputObject(MessageMediator messageMediator) - { - // REVISIT - remove this method from Connection and all it subclasses. - throw new RuntimeException("*****SocketOrChannelConnectionImpl.createOutputObject - should not be called."); - } - - // This is used by the GIOPOutputObject in order to - // throw the correct error when handling code sets. - // Can we determine if we are on the server side by - // other means? XREVISIT - public boolean isServer() - { - return isServer; - } - - public boolean isBusy() - { - return false ; - } - - public long getTimeStamp() - { - return timeStamp; - } - - public void setTimeStamp(long time) - { - timeStamp = time; - } - - public void setState(String stateString) - { - synchronized (stateEvent) { - if (stateString.equals("ESTABLISHED")) { - state = ESTABLISHED; - stateEvent.notifyAll(); - } else { - // REVISIT: ASSERT - } - } - } - - public void writeLock() - { - } - - public void writeUnlock() - { - } - - public void sendWithoutLock(OutputObject outputObject) - { - } - - public void registerWaiter(MessageMediator messageMediator) - { - } - - public void unregisterWaiter(MessageMediator messageMediator) - { - } - - public InputObject waitForResponse(MessageMediator messageMediator) - { - return null ; - } - - public void setConnectionCache(ConnectionCache connectionCache) - { - } - - public ConnectionCache getConnectionCache() - { - return null; - } - - //////////////////////////////////////////////////// - // - // EventHandler methods - // - - public SelectableChannel getChannel() - { - return null; - } - - public int getInterestOps() - { - return null; - } - - // public Acceptor getAcceptor() - already defined above. - - public Connection getConnection() - { - return this; - } - - //////////////////////////////////////////////////// - // - // Work methods. - // - - public String getName() - { - return this.toString(); - } - - public void doWork() - { - } - - public void setEnqueueTime(long timeInMillis) - { - enqueueTime = timeInMillis; - } - - public long getEnqueueTime() - { - return enqueueTime; - } - - //////////////////////////////////////////////////// - // - // spi.transport.CorbaConnection. - // - - public ResponseWaitingRoom getResponseWaitingRoom() - { - return null ; - } - - // REVISIT - inteface defines isServer but already defined in - // higher interface. - - - public void serverRequestMapPut(int requestId, - CorbaMessageMediator messageMediator) - { - serverRequestMap.put(new Integer(requestId), messageMediator); - } - - public CorbaMessageMediator serverRequestMapGet(int requestId) - { - return (CorbaMessageMediator) - serverRequestMap.get(new Integer(requestId)); - } - - public void serverRequestMapRemove(int requestId) - { - serverRequestMap.remove(new Integer(requestId)); - } - - - // REVISIT: this is also defined in: - // com.sun.corba.se.spi.legacy.connection.Connection - public java.net.Socket getSocket() - { - return null; - } - - /** It is possible for a Close Connection to have been - ** sent here, but we will not check for this. A "lazy" - ** Exception will be thrown in the Worker thread after the - ** incoming request has been processed even though the connection - ** is closed before the request is processed. This is o.k because - ** it is a boundary condition. To prevent it we would have to add - ** more locks which would reduce performance in the normal case. - **/ - public synchronized void serverRequestProcessingBegins() - { - serverRequestCount++; - } - - public synchronized void serverRequestProcessingEnds() - { - serverRequestCount--; - } - - // - // - // - - public synchronized int getNextRequestId() - { - return requestId++; - } - - // Negotiated code sets for char and wchar data - protected CodeSetComponentInfo.CodeSetContext codeSetContext = null; - - public ORB getBroker() - { - return orb; - } - - public CodeSetComponentInfo.CodeSetContext getCodeSetContext() - { - // Needs to be synchronized for the following case when the client - // doesn't send the code set context twice, and we have two threads - // in ServerRequestDispatcher processCodeSetContext. - // - // Thread A checks to see if there is a context, there is none, so - // it calls setCodeSetContext, getting the synch lock. - // Thread B checks to see if there is a context. If we didn't synch, - // it might decide to outlaw wchar/wstring. - if (codeSetContext == null) { - synchronized(this) { - return codeSetContext; - } - } - - return codeSetContext; - } - - public synchronized void setCodeSetContext(CodeSetComponentInfo.CodeSetContext csc) { - // Double check whether or not we need to do this - if (codeSetContext == null) { - - if (OSFCodeSetRegistry.lookupEntry(csc.getCharCodeSet()) == null || - OSFCodeSetRegistry.lookupEntry(csc.getWCharCodeSet()) == null) { - // If the client says it's negotiated a code set that - // isn't a fallback and we never said we support, then - // it has a bug. - throw wrapper.badCodesetsFromClient() ; - } - - codeSetContext = csc; - } - } - - // - // from iiop.IIOPConnection.java - // - - // Map request ID to an InputObject. - // This is so the client thread can start unmarshaling - // the reply and remove it from the out_calls map while the - // ReaderThread can still obtain the input stream to give - // new fragments. Only the ReaderThread touches the clientReplyMap, - // so it doesn't incur synchronization overhead. - - public MessageMediator clientRequestMapGet(int requestId) - { - return null ; - } - - protected MessageMediator clientReply_1_1; - - public void clientReply_1_1_Put(MessageMediator x) - { - clientReply_1_1 = x; - } - - public MessageMediator clientReply_1_1_Get() - { - return clientReply_1_1; - } - - public void clientReply_1_1_Remove() - { - clientReply_1_1 = null; - } - - protected MessageMediator serverRequest_1_1; - - public void serverRequest_1_1_Put(MessageMediator x) - { - serverRequest_1_1 = x; - } - - public MessageMediator serverRequest_1_1_Get() - { - return serverRequest_1_1; - } - - public void serverRequest_1_1_Remove() - { - serverRequest_1_1 = null; - } - - protected String getStateString( int state ) - { - synchronized ( stateEvent ){ - switch (state) { - case OPENING : return "OPENING" ; - case ESTABLISHED : return "ESTABLISHED" ; - case CLOSE_SENT : return "CLOSE_SENT" ; - case CLOSE_RECVD : return "CLOSE_RECVD" ; - case ABORT : return "ABORT" ; - default : return "???" ; - } - } - } - - public synchronized boolean isPostInitialContexts() { - return postInitialContexts; - } - - // Can never be unset... - public synchronized void setPostInitialContexts(){ - postInitialContexts = true; - } - - /** - * Wake up the outstanding requests on the connection, and hand them - * COMM_FAILURE exception with a given minor code. - * - * Also, delete connection from connection table and - * stop the reader thread. - - * Note that this should only ever be called by the Reader thread for - * this connection. - * - * @param minor_code The minor code for the COMM_FAILURE major code. - * @param die Kill the reader thread (this thread) before exiting. - */ - public void purgeCalls(SystemException systemException, - boolean die, boolean lockHeld) - { - } - - /************************************************************************* - * The following methods are for dealing with Connection cleaning for - * better scalability of servers in high network load conditions. - **************************************************************************/ - - public void sendCloseConnection(GIOPVersion giopVersion) - throws IOException - { - Message msg = MessageBase.createCloseConnection(giopVersion); - sendHelper(giopVersion, msg); - } - - public void sendMessageError(GIOPVersion giopVersion) - throws IOException - { - Message msg = MessageBase.createMessageError(giopVersion); - sendHelper(giopVersion, msg); - } - - /** - * Send a CancelRequest message. This does not lock the connection, so the - * caller needs to ensure this method is called appropriately. - * @exception IOException - could be due to abortive connection closure. - */ - public void sendCancelRequest(GIOPVersion giopVersion, int requestId) - throws IOException - { - - Message msg = MessageBase.createCancelRequest(giopVersion, requestId); - sendHelper(giopVersion, msg); - } - - protected void sendHelper(GIOPVersion giopVersion, Message msg) - throws IOException - { - // REVISIT: See comments in CDROutputObject constructor. - CDROutputObject outputObject = - new CDROutputObject((ORB)orb, null, giopVersion, this, msg, - ORBConstants.STREAM_FORMAT_VERSION_1); - msg.write(outputObject); - - outputObject.writeTo(this); - } - - public void sendCancelRequestWithLock(GIOPVersion giopVersion, - int requestId) - throws IOException - { - writeLock(); - try { - sendCancelRequest(giopVersion, requestId); - } finally { - writeUnlock(); - } - } - - // Begin Code Base methods --------------------------------------- - // - // Set this connection's code base IOR. The IOR comes from the - // SendingContext. This is an optional service context, but all - // JavaSoft ORBs send it. - // - // The set and get methods don't need to be synchronized since the - // first possible get would occur during reading a valuetype, and - // that would be after the set. - - // Sets this connection's code base IOR. This is done after - // getting the IOR out of the SendingContext service context. - // Our ORBs always send this, but it's optional in CORBA. - - public final void setCodeBaseIOR(IOR ior) { - codeBaseServerIOR = ior; - } - - public final IOR getCodeBaseIOR() { - return codeBaseServerIOR; - } - - // Get a CodeBase stub to use in unmarshaling. The CachedCodeBase - // won't connect to the remote codebase unless it's necessary. - public final CodeBase getCodeBase() { - return cachedCodeBase; - } - - // End Code Base methods ----------------------------------------- - - // Can be overridden in subclass for different options. - protected void setSocketOptions(Socket socket) - { - } - - public String toString() - { - synchronized ( stateEvent ){ - return - "BufferConnectionImpl[" + " " - + getStateString( state ) + " " - + shouldUseSelectThreadToWait() + " " - + shouldUseWorkerThreadForEvent() - + "]" ; - } - } - - // Must be public - used in encoding. - public void dprint(String msg) - { - ORBUtility.dprint("SocketOrChannelConnectionImpl", msg); - } - - protected void dprint(String msg, Throwable t) - { - dprint(msg); - t.printStackTrace(System.out); - } -} - -// End of file.
--- a/hotspot/.hgtags Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/.hgtags Wed Jul 05 19:07:19 2017 +0200 @@ -365,3 +365,5 @@ 46487ba40ff225654d0c51787ed3839bafcbd9f3 hs25-b43 f6921c876db192bba389cec062855a66372da01c jdk8-b101 530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44 +c4697c1c448416108743b59118b4a2498b339d0c jdk8-b102 +7f55137d6aa81efc6eb0035813709f2cb6a26b8b hs25-b45
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/JVMTIThreadState.java Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/JVMTIThreadState.java Wed Jul 05 19:07:19 2017 +0200 @@ -29,11 +29,10 @@ public static final int JVMTI_THREAD_STATE_ALIVE = 0x0001; public static final int JVMTI_THREAD_STATE_TERMINATED = 0x0002; public static final int JVMTI_THREAD_STATE_RUNNABLE = 0x0004; - public static final int JVMTI_THREAD_STATE_WAITING = 0x0008; + public static final int JVMTI_THREAD_STATE_WAITING = 0x0080; public static final int JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010; public static final int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020; public static final int JVMTI_THREAD_STATE_SLEEPING = 0x0040; - public static final int JVMTI_THREAD_STATE_WAITING_FOR_NOTIFICATION = 0x0080; public static final int JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100; public static final int JVMTI_THREAD_STATE_PARKED = 0x0200; public static final int JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/OSThread.java Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/OSThread.java Wed Jul 05 19:07:19 2017 +0200 @@ -32,7 +32,7 @@ // to the sys_thread_t structure of the classic JVM implementation. public class OSThread extends VMObject { private static JIntField interruptedField; - private static JIntField threadIdField; + private static Field threadIdField; static { VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) { @@ -44,7 +44,7 @@ private static synchronized void initialize(TypeDataBase db) { Type type = db.lookupType("OSThread"); interruptedField = type.getJIntField("_interrupted"); - threadIdField = type.getJIntField("_thread_id"); + threadIdField = type.getField("_thread_id"); } public OSThread(Address addr) { @@ -56,7 +56,7 @@ } public int threadId() { - return (int)threadIdField.getValue(addr); + return threadIdField.getJInt(addr); } }
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -74,23 +74,24 @@ public void run() { // Ready to go with the database... try { - // The name of the filter always comes from a System property. - // If we have a pkgList, pass it, otherwise let the filter read - // its own System property for the list of classes. - String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter", - "sun.jvm.hotspot.tools.jcore.PackageNameFilter"); - try { - Class filterClass = Class.forName(filterClassName); - if (pkgList == null) { - classFilter = (ClassFilter) filterClass.newInstance(); - } else { - Constructor con = filterClass.getConstructor(String.class); - classFilter = (ClassFilter) con.newInstance(pkgList); + if (classFilter == null) { + // If not already set, the name of the filter comes from a System property. + // If we have a pkgList, pass it, otherwise let the filter read + // its own System property for the list of classes. + String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter", + "sun.jvm.hotspot.tools.jcore.PackageNameFilter"); + try { + Class filterClass = Class.forName(filterClassName); + if (pkgList == null) { + classFilter = (ClassFilter) filterClass.newInstance(); + } else { + Constructor con = filterClass.getConstructor(String.class); + classFilter = (ClassFilter) con.newInstance(pkgList); + } + } catch(Exception exp) { + System.err.println("Warning: Can not create class filter!"); } - } catch(Exception exp) { - System.err.println("Warning: Can not create class filter!"); } - String outputDirectory = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir", "."); setOutputDirectory(outputDirectory);
--- a/hotspot/make/hotspot_version Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/make/hotspot_version Wed Jul 05 19:07:19 2017 +0200 @@ -35,7 +35,7 @@ HS_MAJOR_VER=25 HS_MINOR_VER=0 -HS_BUILD_NUMBER=44 +HS_BUILD_NUMBER=45 JDK_MAJOR_VER=1 JDK_MINOR_VER=8
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 19:07:19 2017 +0200 @@ -2295,7 +2295,7 @@ if (gen_type_check) { // We have determined that offset == referent_offset && src != null. // if (src->_klass->_reference_type == REF_NONE) -> continue - __ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), UseCompressedKlassPointers ? T_OBJECT : T_ADDRESS), src_klass); + __ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), src_klass); LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE); LIR_Opr reference_type = new_register(T_INT); __ move(reference_type_addr, reference_type);
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/src/share/vm/classfile/classLoader.cpp Wed Jul 05 19:07:19 2017 +0200 @@ -878,7 +878,7 @@ instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) { ResourceMark rm(THREAD); - EventMark m("loading class " INTPTR_FORMAT, (address)h_name); + EventMark m("loading class %s", h_name->as_C_string()); ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion); stringStream st;
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 19:07:19 2017 +0200 @@ -60,6 +60,28 @@ #define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp" #define DEFAULT_JAVA_LAUNCHER "generic" +// Disable options not supported in this release, with a warning if they +// were explicitly requested on the command-line +#define UNSUPPORTED_OPTION(opt, description) \ +do { \ + if (opt) { \ + if (FLAG_IS_CMDLINE(opt)) { \ + warning(description " is disabled in this release."); \ + } \ + FLAG_SET_DEFAULT(opt, false); \ + } \ +} while(0) + +#define UNSUPPORTED_GC_OPTION(gc) \ +do { \ + if (gc) { \ + if (FLAG_IS_CMDLINE(gc)) { \ + warning(#gc " is not supported in this VM. Using Serial GC."); \ + } \ + FLAG_SET_DEFAULT(gc, false); \ + } \ +} while(0) + char** Arguments::_jvm_flags_array = NULL; int Arguments::_num_jvm_flags = 0; char** Arguments::_jvm_args_array = NULL; @@ -3128,14 +3150,17 @@ FLAG_SET_DEFAULT(UseLargePages, false); } - // Tiered compilation is undefined with C1. - TieredCompilation = false; #else if (!FLAG_IS_DEFAULT(OptoLoopAlignment) && FLAG_IS_DEFAULT(MaxLoopPad)) { FLAG_SET_DEFAULT(MaxLoopPad, OptoLoopAlignment-1); } #endif +#ifndef TIERED + // Tiered compilation is undefined. + UNSUPPORTED_OPTION(TieredCompilation, "TieredCompilation"); +#endif + // If we are running in a headless jre, force java.awt.headless property // to be true unless the property has already been set. // Also allow the OS environment variable JAVA_AWT_HEADLESS to set headless state. @@ -3278,29 +3303,6 @@ } } -// Disable options not supported in this release, with a warning if they -// were explicitly requested on the command-line -#define UNSUPPORTED_OPTION(opt, description) \ -do { \ - if (opt) { \ - if (FLAG_IS_CMDLINE(opt)) { \ - warning(description " is disabled in this release."); \ - } \ - FLAG_SET_DEFAULT(opt, false); \ - } \ -} while(0) - - -#define UNSUPPORTED_GC_OPTION(gc) \ -do { \ - if (gc) { \ - if (FLAG_IS_CMDLINE(gc)) { \ - warning(#gc " is not supported in this VM. Using Serial GC."); \ - } \ - FLAG_SET_DEFAULT(gc, false); \ - } \ -} while(0) - #if !INCLUDE_ALL_GCS static void force_serial_gc() { FLAG_SET_DEFAULT(UseSerialGC, true);
--- a/hotspot/src/share/vm/services/gcNotifier.cpp Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/src/share/vm/services/gcNotifier.cpp Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -211,9 +211,9 @@ NotificationMark nm(request); Handle objGcInfo = createGcInfo(request->gcManager, request->gcStatInfo, THREAD); - Handle objName = java_lang_String::create_from_platform_dependent_str(request->gcManager->name(), CHECK); - Handle objAction = java_lang_String::create_from_platform_dependent_str(request->gcAction, CHECK); - Handle objCause = java_lang_String::create_from_platform_dependent_str(request->gcCause, CHECK); + Handle objName = java_lang_String::create_from_str(request->gcManager->name(), CHECK); + Handle objAction = java_lang_String::create_from_str(request->gcAction, CHECK); + Handle objCause = java_lang_String::create_from_str(request->gcCause, CHECK); Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK); instanceKlassHandle gc_mbean_klass(THREAD, k);
--- a/hotspot/src/share/vm/services/management.cpp Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/src/share/vm/services/management.cpp Wed Jul 05 19:07:19 2017 +0200 @@ -1831,13 +1831,13 @@ private: objArrayHandle _names_strings; char **_names_chars; - typeArrayOop _times; + typeArrayHandle _times; int _names_len; int _times_len; int _count; public: - ThreadTimesClosure(objArrayHandle names, typeArrayOop times); + ThreadTimesClosure(objArrayHandle names, typeArrayHandle times); ~ThreadTimesClosure(); virtual void do_thread(Thread* thread); void do_unlocked(); @@ -1845,9 +1845,9 @@ }; ThreadTimesClosure::ThreadTimesClosure(objArrayHandle names, - typeArrayOop times) { + typeArrayHandle times) { assert(names() != NULL, "names was NULL"); - assert(times != NULL, "times was NULL"); + assert(times() != NULL, "times was NULL"); _names_strings = names; _names_len = names->length(); _names_chars = NEW_C_HEAP_ARRAY(char*, _names_len, mtInternal); @@ -1925,7 +1925,7 @@ typeArrayOop ta = typeArrayOop(JNIHandles::resolve_non_null(times)); typeArrayHandle times_ah(THREAD, ta); - ThreadTimesClosure ttc(names_ah, times_ah()); + ThreadTimesClosure ttc(names_ah, times_ah); { MutexLockerEx ml(Threads_lock); Threads::threads_do(&ttc);
--- a/hotspot/src/share/vm/utilities/exceptions.cpp Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/src/share/vm/utilities/exceptions.cpp Wed Jul 05 19:07:19 2017 +0200 @@ -125,13 +125,13 @@ } void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exception, const char* message) { + ResourceMark rm; assert(h_exception() != NULL, "exception should not be NULL"); // tracing (do this up front - so it works during boot strapping) if (TraceExceptions) { ttyLocker ttyl; - ResourceMark rm; - tty->print_cr("Exception <%s>%s%s (" INTPTR_FORMAT " ) \n" + tty->print_cr("Exception <%s%s%s> (" INTPTR_FORMAT ") \n" "thrown [%s, line %d]\nfor thread " INTPTR_FORMAT, h_exception->print_value_string(), message ? ": " : "", message ? message : "", @@ -141,7 +141,9 @@ NOT_PRODUCT(Exceptions::debug_check_abort(h_exception, message)); // Check for special boot-strapping/vm-thread handling - if (special_exception(thread, file, line, h_exception)) return; + if (special_exception(thread, file, line, h_exception)) { + return; + } assert(h_exception->is_a(SystemDictionary::Throwable_klass()), "exception is not a subclass of java/lang/Throwable"); @@ -149,7 +151,9 @@ thread->set_pending_exception(h_exception(), file, line); // vm log - Events::log_exception(thread, "Threw " INTPTR_FORMAT " at %s:%d", (address)h_exception(), file, line); + Events::log_exception(thread, "Exception <%s%s%s> (" INTPTR_FORMAT ") thrown at [%s, line %d]", + h_exception->print_value_string(), message ? ": " : "", message ? message : "", + (address)h_exception(), file, line); }
--- a/hotspot/src/share/vm/utilities/taskqueue.hpp Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/src/share/vm/utilities/taskqueue.hpp Wed Jul 05 19:07:19 2017 +0200 @@ -395,7 +395,13 @@ template<class E, MEMFLAGS F, unsigned int N> bool GenericTaskQueue<E, F, N>::pop_global(E& t) { Age oldAge = _age.get(); - uint localBot = _bottom; + // Architectures with weak memory model require a barrier here + // to guarantee that bottom is not older than age, + // which is crucial for the correctness of the algorithm. +#if !(defined SPARC || defined IA32 || defined AMD64) + OrderAccess::fence(); +#endif + uint localBot = OrderAccess::load_acquire((volatile juint*)&_bottom); uint n_elems = size(localBot, oldAge.top()); if (n_elems == 0) { return false; @@ -644,7 +650,7 @@ template<class E, MEMFLAGS F, unsigned int N> inline bool GenericTaskQueue<E, F, N>::push(E t) { uint localBot = _bottom; - assert((localBot >= 0) && (localBot < N), "_bottom out of range."); + assert(localBot < N, "_bottom out of range."); idx_t top = _age.top(); uint dirty_n_elems = dirty_size(localBot, top); assert(dirty_n_elems < N, "n_elems out of range.");
--- a/hotspot/test/compiler/codecache/CheckUpperLimit.java Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/test/compiler/codecache/CheckUpperLimit.java Wed Jul 05 19:07:19 2017 +0200 @@ -35,10 +35,6 @@ ProcessBuilder pb; OutputAnalyzer out; - pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=2048m", "-version"); - out = new OutputAnalyzer(pb.start()); - out.shouldHaveExitValue(0); - pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=2049m", "-version"); out = new OutputAnalyzer(pb.start()); out.shouldContain("Invalid ReservedCodeCacheSize=");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 8016474 + * @summary The bug only happens with C1 and G1 using a different ObjectAlignmentInBytes than KlassAlignmentInBytes (which is 8) + * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32 GetUnsafeObjectG1PreBarrier + */ + +import java.lang.reflect.Field; + +import sun.misc.Unsafe; + +public class GetUnsafeObjectG1PreBarrier { + private static final Unsafe unsafe; + private static final int N = 100_000; + + static { + try { + Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); + theUnsafe.setAccessible(true); + unsafe = (Unsafe) theUnsafe.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + + public Object a; + + public static void main(String[] args) throws Throwable { + new GetUnsafeObjectG1PreBarrier(); + } + + public GetUnsafeObjectG1PreBarrier() throws Throwable { + doit(); + } + + private void doit() throws Throwable { + Field field = GetUnsafeObjectG1PreBarrier.class.getField("a"); + long fieldOffset = unsafe.objectFieldOffset(field); + + for (int i = 0; i < N; i++) { + readField(this, fieldOffset); + } + } + + private void readField(Object o, long fieldOffset) { + unsafe.getObject(o, fieldOffset); + } +}
--- a/hotspot/test/runtime/7196045/Test7196045.java Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +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 7196045 - * @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API. - * @run main/othervm -XX:+UsePerfData Test7196045 - */ - -import java.lang.management.ManagementFactory; -import javax.management.JMException; -import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; - -public class Test7196045 { - - public static long duration = 1000 * 60 * 2; - private static final String HOTSPOT_INTERNAL = "sun.management:type=HotspotInternal"; - - public static void main(String[] args) { - - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - ObjectName objName= null; - try { - ObjectName hotspotInternal = new ObjectName(HOTSPOT_INTERNAL); - try { - server.registerMBean(new sun.management.HotspotInternal(), hotspotInternal); - } catch (JMException e) { - throw new RuntimeException("HotSpotWatcher: Failed to register the HotspotInternal MBean" + e); - } - objName= new ObjectName("sun.management:type=HotspotThreading"); - - } catch (MalformedObjectNameException e1) { - throw new RuntimeException("Bad object name" + e1); - } - - long endTime = System.currentTimeMillis() + duration; - long i = 0; - while (true) { - try { - server.getAttribute(objName, "InternalThreadCpuTimes"); - } catch (Exception ex) { - System.err.println("Exception while getting attribute: " + ex); - } - i++; - if (i % 10000 == 0) { - System.out.println("Successful iterations: " + i); - } - if (System.currentTimeMillis() > endTime) { - break; - } - } - System.out.println("PASSED."); - } -}
--- a/hotspot/test/runtime/8000968/Test8000968.sh Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -# -# 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 Test8000968.sh -# @bug 8000968 -# @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32 -# @run shell Test8000968.sh -# - -if [ "${TESTJAVA}" = "" ] -then - PARENT=`dirname \`which java\`` - TESTJAVA=`dirname ${PARENT}` - printf "TESTJAVA not set, selecting " ${TESTJAVA} - printf " If this is incorrect, try setting the variable manually.\n" -fi - - -# set platform-dependent variables -OS=`uname -s` -case "$OS" in - Windows_* ) - FS="\\" - NULL=NUL - ;; - * ) - FS="/" - NULL=/dev/null - ;; -esac - -JAVA=${TESTJAVA}${FS}bin${FS}java - -# -# See if platform has 64 bit java. -# -${JAVA} ${TESTVMOPTS} -d64 -version 2>&1 | grep -i "does not support" > ${NULL} -if [ "$?" != "1" ] -then - printf "Platform is 32 bit, does not support -XX:ObjectAlignmentInBytes= option.\n" - printf "Passed.\n" - exit 0 -fi - -# -# Test -XX:ObjectAlignmentInBytes with -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops. -# -${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16 -version 2>&1 > ${NULL} -if [ "$?" != "0" ] -then - printf "FAILED: -XX:ObjectAlignmentInBytes=16 option did not work.\n" - exit 1 -fi - -${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=32 -version 2>&1 > ${NULL} -if [ "$?" != "0" ] -then - printf "FAILED: -XX:ObjectAlignmentInBytes=32 option did not work.\n" - exit 1 -fi - -${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=64 -version 2>&1 > ${NULL} -if [ "$?" != "0" ] -then - printf "FAILED: -XX:ObjectAlignmentInBytes=64 option did not work.\n" - exit 1 -fi - -${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=128 -version 2>&1 > ${NULL} -if [ "$?" != "0" ] -then - printf "FAILED: -XX:ObjectAlignmentInBytes=128 option did not work.\n" - exit 1 -fi - - -printf "Passed.\n" -exit 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/CompressedOops/CompressedKlassPointerAndOops.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,63 @@ +/* + * 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 8000968 + * @key regression + * @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32 + * @library /testlibrary + */ + +import com.oracle.java.testlibrary.*; + +public class CompressedKlassPointerAndOops { + + public static void main(String[] args) throws Exception { + + if (!Platform.is64bit()) { + // Can't test this on 32 bit, just pass + System.out.println("Skipping test on 32bit"); + return; + } + + runWithAlignment(16); + runWithAlignment(32); + runWithAlignment(64); + runWithAlignment(128); + } + + private static void runWithAlignment(int alignment) throws Exception { + ProcessBuilder pb; + OutputAnalyzer output; + + pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UseCompressedKlassPointers", + "-XX:+UseCompressedOops", + "-XX:ObjectAlignmentInBytes=" + alignment, + "-version"); + + output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/InternalApi/ThreadCpuTimesDeadlock.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,92 @@ +/* + * 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. + * + * 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 7196045 + * @bug 8014294 + * @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API. + * @run main/othervm -XX:+UsePerfData -Xmx32m ThreadCpuTimesDeadlock + */ + +import java.lang.management.ManagementFactory; +import javax.management.JMException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; + +public class ThreadCpuTimesDeadlock { + + public static byte[] dummy; + public static long duration = 10 * 1000; + private static final String HOTSPOT_INTERNAL = "sun.management:type=HotspotInternal"; + + public static void main(String[] args) { + + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + ObjectName objName= null; + try { + ObjectName hotspotInternal = new ObjectName(HOTSPOT_INTERNAL); + try { + server.registerMBean(new sun.management.HotspotInternal(), hotspotInternal); + } catch (JMException e) { + throw new RuntimeException("HotSpotWatcher: Failed to register the HotspotInternal MBean" + e); + } + objName= new ObjectName("sun.management:type=HotspotThreading"); + + } catch (MalformedObjectNameException e1) { + throw new RuntimeException("Bad object name" + e1); + } + + // Thread that allocs memory to generate GC's + Thread allocThread = new Thread() { + public void run() { + while (true) { + dummy = new byte[4096]; + } + } + }; + + allocThread.setDaemon(true); + allocThread.start(); + + long endTime = System.currentTimeMillis() + duration; + long i = 0; + while (true) { + try { + server.getAttribute(objName, "InternalThreadCpuTimes"); + } catch (Exception ex) { + System.err.println("Exception while getting attribute: " + ex); + } + i++; + if (i % 10000 == 0) { + System.out.println("Successful iterations: " + i); + } + if (System.currentTimeMillis() > endTime) { + break; + } + } + System.out.println("PASSED."); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/testlibrary/OutputAnalyzerReportingTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,124 @@ +/* + * 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 + * @summary Test the OutputAnalyzer reporting functionality, + * such as printing additional diagnostic info + * (exit code, stdout, stderr, command line, etc.) + * @library /testlibrary + */ + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import com.oracle.java.testlibrary.OutputAnalyzer; +import com.oracle.java.testlibrary.ProcessTools; + + +public class OutputAnalyzerReportingTest { + + public static void main(String[] args) throws Exception { + // Create the output analyzer under test + String stdout = "aaaaaa"; + String stderr = "bbbbbb"; + OutputAnalyzer output = new OutputAnalyzer(stdout, stderr); + + // Expected summary values should be the same for all cases, + // since the outputAnalyzer object is the same + String expectedExitValue = "-1"; + String expectedSummary = + " stdout: [" + stdout + "];\n" + + " stderr: [" + stderr + "]\n" + + " exitValue = " + expectedExitValue + "\n"; + + + DiagnosticSummaryTestRunner testRunner = + new DiagnosticSummaryTestRunner(); + + // should have exit value + testRunner.init(expectedSummary); + int unexpectedExitValue = 2; + try { + output.shouldHaveExitValue(unexpectedExitValue); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should not contain + testRunner.init(expectedSummary); + try { + output.shouldNotContain(stdout); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should contain + testRunner.init(expectedSummary); + try { + output.shouldContain("unexpected-stuff"); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should not match + testRunner.init(expectedSummary); + try { + output.shouldNotMatch("[a]"); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should match + testRunner.init(expectedSummary); + try { + output.shouldMatch("[qwerty]"); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + } + + private static class DiagnosticSummaryTestRunner { + private ByteArrayOutputStream byteStream = + new ByteArrayOutputStream(10000); + + private String expectedSummary = ""; + private PrintStream errStream; + + + public void init(String expectedSummary) { + this.expectedSummary = expectedSummary; + byteStream.reset(); + errStream = new PrintStream(byteStream); + System.setErr(errStream); + } + + public void closeAndCheckResults() { + // check results + errStream.close(); + String stdErrStr = byteStream.toString(); + if (!stdErrStr.contains(expectedSummary)) { + throw new RuntimeException("The output does not contain " + + "the diagnostic message, or the message is incorrect"); + } + } + } + +}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java Wed Jul 05 19:07:19 2017 +0200 @@ -76,7 +76,8 @@ */ public void shouldContain(String expectedString) { if (!stdout.contains(expectedString) && !stderr.contains(expectedString)) { - throw new RuntimeException("'" + expectedString + "' missing from stdout/stderr: [" + stdout + stderr + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + expectedString + "' missing from stdout/stderr \n"); } } @@ -88,7 +89,8 @@ */ public void stdoutShouldContain(String expectedString) { if (!stdout.contains(expectedString)) { - throw new RuntimeException("'" + expectedString + "' missing from stdout: [" + stdout + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + expectedString + "' missing from stdout \n"); } } @@ -100,7 +102,8 @@ */ public void stderrShouldContain(String expectedString) { if (!stderr.contains(expectedString)) { - throw new RuntimeException("'" + expectedString + "' missing from stderr: [" + stderr + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + expectedString + "' missing from stderr \n"); } } @@ -112,10 +115,12 @@ */ public void shouldNotContain(String notExpectedString) { if (stdout.contains(notExpectedString)) { - throw new RuntimeException("'" + notExpectedString + "' found in stdout: [" + stdout + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + notExpectedString + "' found in stdout \n"); } if (stderr.contains(notExpectedString)) { - throw new RuntimeException("'" + notExpectedString + "' found in stderr: [" + stderr + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + notExpectedString + "' found in stderr \n"); } } @@ -127,7 +132,8 @@ */ public void stdoutShouldNotContain(String notExpectedString) { if (stdout.contains(notExpectedString)) { - throw new RuntimeException("'" + notExpectedString + "' found in stdout: [" + stdout + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + notExpectedString + "' found in stdout \n"); } } @@ -139,7 +145,8 @@ */ public void stderrShouldNotContain(String notExpectedString) { if (stderr.contains(notExpectedString)) { - throw new RuntimeException("'" + notExpectedString + "' found in stderr: [" + stderr + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + notExpectedString + "' found in stderr \n"); } } @@ -154,9 +161,9 @@ Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); if (!stdoutMatcher.find() && !stderrMatcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' missing from stdout/stderr: [" + stdout + stderr - + "]\n"); + + "' missing from stdout/stderr \n"); } } @@ -170,8 +177,9 @@ public void stdoutShouldMatch(String pattern) { Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); if (!matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' missing from stdout: [" + stdout + "]\n"); + + "' missing from stdout \n"); } } @@ -185,8 +193,9 @@ public void stderrShouldMatch(String pattern) { Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); if (!matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' missing from stderr: [" + stderr + "]\n"); + + "' missing from stderr \n"); } } @@ -200,13 +209,15 @@ public void shouldNotMatch(String pattern) { Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); if (matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' found in stdout: [" + stdout + "]\n"); + + "' found in stdout \n"); } matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); if (matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' found in stderr: [" + stderr + "]\n"); + + "' found in stderr \n"); } } @@ -220,8 +231,9 @@ public void stdoutShouldNotMatch(String pattern) { Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); if (matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' found in stdout: [" + stdout + "]\n"); + + "' found in stdout \n"); } } @@ -235,23 +247,45 @@ public void stderrShouldNotMatch(String pattern) { Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); if (matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' found in stderr: [" + stderr + "]\n"); + + "' found in stderr \n"); } } /** - * Verifiy the exit value of the process + * Verify the exit value of the process * * @param expectedExitValue Expected exit value from process * @throws RuntimeException If the exit value from the process did not match the expected value */ public void shouldHaveExitValue(int expectedExitValue) { if (getExitValue() != expectedExitValue) { - throw new RuntimeException("Exit value " + getExitValue() + " , expected to get " + expectedExitValue); + reportDiagnosticSummary(); + throw new RuntimeException("Expected to get exit value of [" + + expectedExitValue + "]\n"); } } + + /** + * Report summary that will help to diagnose the problem + * Currently includes: + * - standard input produced by the process under test + * - standard output + * - exit code + * Note: the command line is printed by the ProcessTools + */ + private void reportDiagnosticSummary() { + String msg = + " stdout: [" + stdout + "];\n" + + " stderr: [" + stderr + "]\n" + + " exitValue = " + getExitValue() + "\n"; + + System.err.println(msg); + } + + /** * Get the contents of the output buffer (stdout and stderr) *
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Wed Jul 05 19:07:19 2017 +0200 @@ -27,6 +27,7 @@ private static final String osName = System.getProperty("os.name"); private static final String dataModel = System.getProperty("sun.arch.data.model"); private static final String vmVersion = System.getProperty("java.vm.version"); + private static final String osArch = System.getProperty("os.arch"); public static boolean is64bit() { return dataModel.equals("64"); @@ -59,4 +60,14 @@ public static String getVMVersion() { return vmVersion; } + + // Returns true for sparc and sparcv9. + public static boolean isSparc() { + return osArch.toLowerCase().startsWith("sparc"); + } + + public static String getOsArch() { + return osArch; + } + }
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java Thu Aug 08 10:10:37 2013 -0700 +++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java Wed Jul 05 19:07:19 2017 +0200 @@ -31,6 +31,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import sun.management.VMManagement; @@ -107,6 +108,22 @@ } /** + * Get the string containing input arguments passed to the VM + * + * @return arguments + */ + public static String getVmInputArguments() { + RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); + + List<String> args = runtime.getInputArguments(); + StringBuilder result = new StringBuilder(); + for (String arg : args) + result.append(arg).append(' '); + + return result.toString(); + } + + /** * Get platform specific VM arguments (e.g. -d64 on 64bit Solaris) * * @return String[] with platform specific arguments, empty if there are none @@ -132,8 +149,13 @@ Collections.addAll(args, getPlatformSpecificVMArgs()); Collections.addAll(args, command); + // Reporting + StringBuilder cmdLine = new StringBuilder(); + for (String cmd : args) + cmdLine.append(cmd).append(' '); + System.out.println("Command line: [" + cmdLine.toString() + "]"); + return new ProcessBuilder(args.toArray(new String[args.size()])); - } }
--- a/jdk/.hgtags Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/.hgtags Wed Jul 05 19:07:19 2017 +0200 @@ -223,3 +223,4 @@ 6a099a36589bd933957272ba63e5263bede29971 jdk8-b99 5be9c5bfcfe9b2a40412b4fb364377d49de014eb jdk8-b100 6901612328239fbd471d20823113c1cf3fdaebee jdk8-b101 +8ed8e2b4b90e0ac9aa5b3efef51cd576a9db96a9 jdk8-b102
--- a/jdk/makefiles/CompileNativeLibraries.gmk Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/makefiles/CompileNativeLibraries.gmk Wed Jul 05 19:07:19 2017 +0200 @@ -798,6 +798,16 @@ LIBAWT_XAWT_CFLAGS += -DFUNCPROTO=15 endif +ifeq ($(OPENJDK_TARGET_OS),linux) +ifndef OPENJDK +include $(JDK_TOPDIR)/make/closed/xawt.gmk +endif + +ifeq ($(DISABLE_XRENDER),true) + LIBAWT_XAWT_CFLAGS += -DDISABLE_XRENDER_BY_DEFAULT=true +endif +endif + ifeq ($(MILESTONE),internal) LIBAWT_XAWT_CFLAGS += -DINTERNAL_BUILD endif
--- a/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java Wed Jul 05 19:07:19 2017 +0200 @@ -1856,7 +1856,10 @@ // If we're not valid that means we will shortly be validated and // painted, which means we don't have to do anything here. if (!isRunsDirty && index >= 0 && index < tabPane.getTabCount()) { - tabPane.repaint(getTabBounds(tabPane, index)); + Rectangle rect = getTabBounds(tabPane, index); + if (rect != null) { + tabPane.repaint(rect); + } } }
--- a/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java Wed Jul 05 19:07:19 2017 +0200 @@ -702,6 +702,20 @@ } /** + * Returns the bounds of the specified tab index. The bounds are + * with respect to the JTabbedPane's coordinate space. If the tab at this + * index is not currently visible in the UI, then returns null. + */ + @Override + public Rectangle getTabBounds(final JTabbedPane pane, final int i) { + if (visibleTabState.needsScrollTabs() + && (visibleTabState.isBefore(i) || visibleTabState.isAfter(i))) { + return null; + } + return super.getTabBounds(pane, i); + } + + /** * Returns the tab index which intersects the specified point * in the JTabbedPane's coordinate space. */
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed Jul 05 19:07:19 2017 +0200 @@ -830,18 +830,19 @@ // UTILITY METHODS // ---------------------------------------------------------------------- - /* - * Find image to install into Title or into Application icon. - * First try icons installed for toplevel. If there is no icon - * use default Duke image. - * This method shouldn't return null. + /** + * Find image to install into Title or into Application icon. First try + * icons installed for toplevel. Null is returned, if there is no icon and + * default Duke image should be used. */ private CImage getImageForTarget() { - List<Image> icons = target.getIconImages(); - if (icons == null || icons.size() == 0) { - return null; + CImage icon = null; + try { + icon = CImage.getCreator().createFromImages(target.getIconImages()); + } catch (Exception ignored) { + // Perhaps the icon passed into Java is broken. Skipping this icon. } - return CImage.getCreator().createFromImages(icons); + return icon; } /*
--- a/jdk/src/macosx/native/java/util/SCDynamicStoreConfig.m Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/macosx/native/java/util/SCDynamicStoreConfig.m Wed Jul 05 19:07:19 2017 +0200 @@ -103,7 +103,6 @@ CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]); if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) { - NSLog(@"Unexpected CFType for realm Info: %lu", CFGetTypeID(realmInfo)); return nil; } @@ -140,7 +139,6 @@ SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL); if (store == NULL) { - NSLog(@"Unable to load SCDynamicStore to install NotificationCallback"); return; } @@ -171,19 +169,11 @@ SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL); if (store == NULL) { - NSLog(@"Unable to load SCDynamicStore"); - return NULL; - } - - // Create the store if it is NULL and set it. - if (store == NULL) { - NSLog(@"Invalid value for SCDynamicStore"); return NULL; } CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS); if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) { - NSLog(@"Unable to load realm info from SCDynamicStore"); if (realms) CFRelease(realms); CFRelease(store); return NULL; @@ -192,7 +182,6 @@ CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS); if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) { - NSLog(@"Unable to load realm mapping info from SCDynamicStore"); if (realmMappings) CFRelease(realmMappings); CFRelease(realms); CFRelease(store);
--- a/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -47,6 +47,10 @@ 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 * <code>javax.security.auth.Policy</code>. @@ -469,7 +473,8 @@ * @param policyFile the policy Reader object. */ private void init(URL policy) { - PolicyParser pp = new PolicyParser(expandProperties); + sun.security.provider.PolicyParser pp = + new sun.security.provider.PolicyParser(expandProperties); try { InputStreamReader isr = new InputStreamReader(getInputStream(policy)); @@ -477,12 +482,12 @@ isr.close(); KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(), pp.getKeyStoreType()); - Enumeration<PolicyParser.GrantEntry> enum_ = pp.grantElements(); + Enumeration<GrantEntry> enum_ = pp.grantElements(); while (enum_.hasMoreElements()) { - PolicyParser.GrantEntry ge = enum_.nextElement(); + GrantEntry ge = enum_.nextElement(); addGrantEntry(ge, keyStore); } - } catch (PolicyParser.ParsingException pe) { + } catch (sun.security.provider.PolicyParser.ParsingException pe) { System.err.println(AUTH_POLICY + rb.getString(".error.parsing.") + policy); System.err.println(AUTH_POLICY + @@ -521,8 +526,8 @@ * * @return null if signedBy alias is not recognized */ - CodeSource getCodeSource(PolicyParser.GrantEntry ge, KeyStore keyStore) - throws java.net.MalformedURLException + CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore) + throws java.net.MalformedURLException { Certificate[] certs = null; if (ge.signedBy != null) { @@ -559,20 +564,18 @@ /** * Add one policy entry to the vector. */ - private void addGrantEntry(PolicyParser.GrantEntry ge, - KeyStore keyStore) { + 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<PolicyParser.PrincipalEntry> li = - ge.principals.listIterator(); + ListIterator<PrincipalEntry> li = ge.principals.listIterator(); while (li.hasNext()) { - PolicyParser.PrincipalEntry pppe = li.next(); - debug.println(" " + pppe.principalClass + - " " + pppe.principalName); + PrincipalEntry pppe = li.next(); + debug.println(" " + pppe.getPrincipalClass() + + " " + pppe.getPrincipalName()); } } debug.println(); @@ -584,10 +587,9 @@ if (codesource == null) return; PolicyEntry entry = new PolicyEntry(codesource); - Enumeration<PolicyParser.PermissionEntry> enum_ = - ge.permissionElements(); + Enumeration<PermissionEntry> enum_ = ge.permissionElements(); while (enum_.hasMoreElements()) { - PolicyParser.PermissionEntry pe = enum_.nextElement(); + PermissionEntry pe = enum_.nextElement(); try { // XXX special case PrivateCredentialPermission-SELF Permission perm; @@ -998,11 +1000,11 @@ return true; } - ListIterator<PolicyParser.PrincipalEntry> pli = - scs.getPrincipals().listIterator(); + ListIterator<PrincipalEntry> pli = + scs.getPrincipals().listIterator(); while (pli.hasNext()) { - PolicyParser.PrincipalEntry principal = pli.next(); + PrincipalEntry principal = pli.next(); // XXX // if the Policy entry's Principal does not contain a @@ -1050,30 +1052,29 @@ * if (y == 1), it's the principal name. */ private String[][] getPrincipalInfo - (PolicyParser.PrincipalEntry principal, - final CodeSource accCs) { + (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.principalClass.equals - (PolicyParser.PrincipalEntry.WILDCARD_CLASS) && - !principal.principalName.equals - (PolicyParser.PrincipalEntry.WILDCARD_NAME)) { + 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.principalClass; - info[0][1] = principal.principalName; + info[0][0] = principal.getPrincipalClass(); + info[0][1] = principal.getPrincipalName(); return info; - } else if (!principal.principalClass.equals - (PolicyParser.PrincipalEntry.WILDCARD_CLASS) && - principal.principalName.equals - (PolicyParser.PrincipalEntry.WILDCARD_NAME)) { + } 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 @@ -1088,7 +1089,7 @@ // If it doesn't, we should stop here with a ClassCastException. @SuppressWarnings("unchecked") Class<? extends Principal> pClass = (Class<? extends Principal>) - Class.forName(principal.principalClass, false, + Class.forName(principal.getPrincipalClass(), false, ClassLoader.getSystemClassLoader()); principalSet = scs.getSubject().getPrincipals(pClass); } catch (Exception e) { @@ -1387,6 +1388,7 @@ } } +@SuppressWarnings("deprecation") class PolicyPermissions extends PermissionCollection { private static final long serialVersionUID = -1954188373270545523L;
--- a/jdk/src/share/classes/com/sun/security/auth/SubjectCodeSource.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/com/sun/security/auth/SubjectCodeSource.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -33,6 +33,7 @@ import java.lang.reflect.Constructor; import javax.security.auth.Subject; +import sun.security.provider.PolicyParser.PrincipalEntry; /** * <p> This <code>SubjectCodeSource</code> class contains @@ -57,7 +58,7 @@ }); private Subject subject; - private LinkedList<PolicyParser.PrincipalEntry> principals; + 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]"); @@ -87,14 +88,14 @@ * <code>SubjectCodeSource</code> <p> */ SubjectCodeSource(Subject subject, - LinkedList<PolicyParser.PrincipalEntry> principals, + LinkedList<PrincipalEntry> principals, URL url, Certificate[] certs) { super(url, certs); this.subject = subject; this.principals = (principals == null ? - new LinkedList<PolicyParser.PrincipalEntry>() : - new LinkedList<PolicyParser.PrincipalEntry>(principals)); + new LinkedList<PrincipalEntry>() : + new LinkedList<PrincipalEntry>(principals)); sysClassLoader = java.security.AccessController.doPrivileged (new java.security.PrivilegedAction<ClassLoader>() { public ClassLoader run() { @@ -114,7 +115,7 @@ * <code>SubjectCodeSource</code> as a <code>LinkedList</code> * of <code>PolicyParser.PrincipalEntry</code> objects. */ - LinkedList<PolicyParser.PrincipalEntry> getPrincipals() { + LinkedList<PrincipalEntry> getPrincipals() { return principals; } @@ -167,7 +168,7 @@ */ public boolean implies(CodeSource codesource) { - LinkedList<PolicyParser.PrincipalEntry> subjectList = null; + LinkedList<PrincipalEntry> subjectList = null; if (codesource == null || !(codesource instanceof SubjectCodeSource) || @@ -197,20 +198,19 @@ return false; } - ListIterator<PolicyParser.PrincipalEntry> li = - this.principals.listIterator(0); + ListIterator<PrincipalEntry> li = this.principals.listIterator(0); while (li.hasNext()) { - PolicyParser.PrincipalEntry pppe = li.next(); + PrincipalEntry pppe = li.next(); try { // handle PrincipalComparators Class<?> principalComparator = Class.forName( - pppe.principalClass, true, sysClassLoader); + pppe.getPrincipalClass(), true, sysClassLoader); Constructor<?> c = principalComparator.getConstructor(PARAMS); PrincipalComparator pc = (PrincipalComparator)c.newInstance - (new Object[] { pppe.principalName }); + (new Object[] { pppe.getPrincipalName() }); if (!pc.implies(that.getSubject())) { if (debug != null) @@ -236,11 +236,10 @@ Iterator<Principal> i = that.getSubject().getPrincipals().iterator(); - subjectList = new LinkedList<PolicyParser.PrincipalEntry>(); + subjectList = new LinkedList<PrincipalEntry>(); while (i.hasNext()) { Principal p = i.next(); - PolicyParser.PrincipalEntry spppe = - new PolicyParser.PrincipalEntry + PrincipalEntry spppe = new PrincipalEntry (p.getClass().getName(), p.getName()); subjectList.add(spppe); } @@ -281,23 +280,19 @@ * <i>pppe</i> argument. */ private boolean subjectListImpliesPrincipalEntry( - LinkedList<PolicyParser.PrincipalEntry> subjectList, - PolicyParser.PrincipalEntry pppe) { + LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) { - ListIterator<PolicyParser.PrincipalEntry> li = - subjectList.listIterator(0); + ListIterator<PrincipalEntry> li = subjectList.listIterator(0); while (li.hasNext()) { - PolicyParser.PrincipalEntry listPppe = li.next(); + PrincipalEntry listPppe = li.next(); - if (pppe.principalClass.equals - (PolicyParser.PrincipalEntry.WILDCARD_CLASS) || - pppe.principalClass.equals - (listPppe.principalClass)) { - - if (pppe.principalName.equals - (PolicyParser.PrincipalEntry.WILDCARD_NAME) || - pppe.principalName.equals - (listPppe.principalName)) + 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; } } @@ -390,13 +385,12 @@ } } if (principals != null) { - ListIterator<PolicyParser.PrincipalEntry> li = - principals.listIterator(); + ListIterator<PrincipalEntry> li = principals.listIterator(); while (li.hasNext()) { - PolicyParser.PrincipalEntry pppe = li.next(); + PrincipalEntry pppe = li.next(); returnMe = returnMe + rb.getString("NEWLINE") + - pppe.principalClass + " " + - pppe.principalName; + pppe.getPrincipalClass() + " " + + pppe.getPrincipalName(); } } return returnMe;
--- a/jdk/src/share/classes/com/sun/tools/hat/resources/hat.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/com/sun/tools/hat/resources/hat.js Wed Jul 05 19:07:19 2017 +0200 @@ -151,7 +151,7 @@ while (tmp != null) { res[res.length] = tmp; tmp = tmp.superclass; - } + } return res; } @@ -263,16 +263,19 @@ if (name == 'class') { return wrapJavaValue(instance.clazz); - } else if (name == 'toString') { - return function() { - return instance.toString(); - } } else if (name == 'wrapped-object') { return instance; } return undefined; - } + }, + __call__: function(name) { + if (name == 'toString') { + return instance.toString(); + } else { + return undefined; + } + } } } @@ -297,7 +300,7 @@ return true; } } - return theJavaClassProto[name] != undefined; + return false; }, __get__ : function(name) { for (var i in fields) { @@ -305,7 +308,7 @@ return wrapJavaValue(fields[i].value); } } - return theJavaClassProto[name]; + return undefined; } } @@ -322,7 +325,12 @@ this.name = jclass.name; this.fields = jclass.fields; this['wrapped-object'] = jclass; - this.__proto__ = this.statics; + } + + for (var i in theJavaClassProto) { + if (typeof theJavaClassProto[i] == 'function') { + JavaClassWrapper.prototype[i] = theJavaClassProto[i]; + } } // returns wrapper for Java object arrays @@ -334,32 +342,35 @@ __getIds__ : function() { var res = new Array(elements.length); for (var i = 0; i < elements.length; i++) { - res[i] = i; + res[i] = String(i); } return res; }, __has__: function(name) { - return (typeof(name) == 'number' && - name >= 0 && name < elements.length) || + return (name >= 0 && name < elements.length) || name == 'length' || name == 'class' || name == 'toString' || name == 'wrapped-object'; }, __get__ : function(name) { - if (typeof(name) == 'number' && - name >= 0 && name < elements.length) { + if (name >= 0 && name < elements.length) { return wrapJavaValue(elements[name]); } else if (name == 'length') { return elements.length; } else if (name == 'class') { return wrapJavaValue(array.clazz); - } else if (name == 'toString') { - return function() { return array.toString(); } } else if (name == 'wrapped-object') { return array; } else { return undefined; } - } + }, + __call__: function(name) { + if (name == 'toString') { + return array.toString(); + } else { + return undefined; + } + } } } @@ -373,26 +384,22 @@ __getIds__ : function() { var r = new Array(array.length); for (var i = 0; i < array.length; i++) { - r[i] = i; + r[i] = String(i); } return r; }, __has__: function(name) { - return (typeof(name) == 'number' && - name >= 0 && name < array.length) || + return (name >= 0 && name < array.length) || name == 'length' || name == 'class' || name == 'toString' || name == 'wrapped-object'; }, __get__: function(name) { - if (typeof(name) == 'number' && - name >= 0 && name < array.length) { + if (name >= 0 && name < array.length) { return elements[name]; } if (name == 'length') { return array.length; - } else if (name == 'toString') { - return function() { return array.valueString(true); } } else if (name == 'wrapped-object') { return array; } else if (name == 'class') { @@ -400,7 +407,14 @@ } else { return undefined; } - } + }, + __call__: function(name) { + if (name == 'toString') { + return array.valueString(true); + } else { + return undefined; + } + } } } return javaObject(thing); @@ -673,34 +687,33 @@ __getIds__ : function() { var res = new Array(path.length); for (var i = 0; i < path.length; i++) { - res[i] = i; + res[i] = String(i); } return res; }, __has__ : function (name) { - return (typeof(name) == 'number' && - name >= 0 && name < path.length) || + return (name >= 0 && name < path.length) || name == 'length' || name == 'toHtml' || name == 'toString'; }, __get__ : function(name) { - if (typeof(name) == 'number' && - name >= 0 && name < path.length) { + if (name >= 0 && name < path.length) { return path[name]; } else if (name == 'length') { return path.length; - } else if (name == 'toHtml') { - return function() { - return computeDescription(true); - } - } else if (name == 'toString') { - return function() { - return computeDescription(false); - } } else { return undefined; } }, + __call__: function(name) { + if (name == 'toHtml') { + return computeDescription(true); + } else if (name == 'toString') { + return computeDescription(false); + } else { + return undefined; + } + } }; } @@ -1005,22 +1018,8 @@ return "<a href='/object/" + id + "'>" + name + "@" + id + "</a>"; } - } else if ((typeof(obj) == 'object') || (obj instanceof JSAdapter)) { - if (obj instanceof java.lang.Object) { - // script wrapped Java object - obj = wrapIterator(obj); - // special case for enumeration - if (obj instanceof java.util.Enumeration) { - var res = "[ "; - while (obj.hasMoreElements()) { - res += toHtml(obj.nextElement()) + ", "; - } - res += "]"; - return res; - } else { - return obj; - } - } else if (obj instanceof Array) { + } else if (obj instanceof Object) { + if (Array.isArray(obj)) { // script array var res = "[ "; for (var i in obj) { @@ -1047,8 +1046,19 @@ } } } else { - // JavaScript primitive value - return obj; + // a Java object + obj = wrapIterator(obj); + // special case for enumeration + if (obj instanceof java.util.Enumeration) { + var res = "[ "; + while (obj.hasMoreElements()) { + res += toHtml(obj.nextElement()) + ", "; + } + res += "]"; + return res; + } else { + return obj; + } } }
--- a/jdk/src/share/classes/com/sun/tools/hat/resources/oqlhelp.html Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/com/sun/tools/hat/resources/oqlhelp.html Wed Jul 05 19:07:19 2017 +0200 @@ -79,7 +79,7 @@ <li>select all Strings of length 100 or more <pre> <code> - select s from java.lang.String s where s.count >= 100 + select s from java.lang.String s where s.value.length >= 100 </code> </pre> <li>select all int arrays of length 256 or more @@ -92,7 +92,7 @@ <pre> <code> select s.value.toString() from java.lang.String s - where /java/(s.value.toString()) + where /java/.test(s.value.toString()) </code> </pre> <li>show path value of all File objects @@ -219,7 +219,6 @@ <pre> <code> select heap.findClass("java.lang.System").statics.props - select heap.findClass("java.lang.System").props </code> </pre> <li>get number of fields of java.lang.String class @@ -237,7 +236,7 @@ <li>select all classes that have name pattern java.net.* <pre> <code> - select <a href="#filter">filter</a>(heap.classes(), "/java.net./(it.name)") + select <a href="#filter">filter</a>(heap.classes(), "/java.net./.test(it.name)") </code> </pre> </ul> @@ -536,7 +535,7 @@ Example: print number of classes that have specific name pattern <pre> <code> - select count(<a href="#classes">heap.classes()</a>, "/java.io./(it.name)") + select count(<a href="#classes">heap.classes()</a>, "/java.io./.test(it.name)") </code> </pre> @@ -559,14 +558,14 @@ <li>show all classes that have java.io.* name pattern <pre> <code> - select filter(<a href="#classes">heap.classes</a>(), "/java.io./(it.name)") + select filter(<a href="#classes">heap.classes</a>(), "/java.io./.test(it.name)") </code> </pre> <li> show all referrers of URL object where the referrer is not from java.net package <pre> <code> - select filter(<a href="#referrers">referrers</a>(u), "! /java.net./(<a href="#classof">classof</a>(it).name)") + select filter(<a href="#referrers">referrers</a>(u), "! /java.net./.test(<a href="#classof">classof</a>(it).name)") from java.net.URL u </code> </pre> @@ -619,13 +618,13 @@ <li>find the maximum length of any String instance <pre> <code> - select max(map(heap.objects('java.lang.String', false), 'it.count')) + select max(map(heap.objects('java.lang.String', false), 'it.value.length')) </code> </pre> <li>find string instance that has the maximum length <pre> <code> - select max(heap.objects('java.lang.String'), 'lhs.count > rhs.count') + select max(heap.objects('java.lang.String'), 'lhs.value.length > rhs.value.length') </code> </pre> </ul> @@ -775,7 +774,7 @@ <pre> <code> - select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').props.table, 'it != null'), + select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').statics.props.table, 'it != null'), function (it) { var res = ""; while (it != null) {
--- a/jdk/src/share/classes/java/applet/AppletContext.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/applet/AppletContext.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2006, 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 @@ -56,7 +56,7 @@ /** * Returns an <code>Image</code> object that can then be painted on - * the screen. The <code>url</code> argument<code> </code>that is + * the screen. The <code>url</code> argument that is * passed as an argument must specify an absolute URL. * <p> * This method always returns immediately, whether or not the image @@ -157,7 +157,7 @@ * @param stream stream to be associated with the specified key. If this * parameter is <code>null</code>, the specified key is removed * in this applet context. - * @throws <code>IOException</code> if the stream size exceeds a certain + * @throws IOException if the stream size exceeds a certain * size limit. Size limit is decided by the implementor of this * interface. * @since 1.4
--- a/jdk/src/share/classes/java/awt/event/ContainerListener.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/event/ContainerListener.java Wed Jul 05 19:07:19 2017 +0200 @@ -42,7 +42,7 @@ * Container events are provided for notification purposes ONLY; * The AWT will automatically handle add and remove operations * internally so the program works properly regardless of - * whether the program registers a <code>ComponentListener</code> or not. + * whether the program registers a {@code ContainerListener} or not. * * @see ContainerAdapter * @see ContainerEvent
--- a/jdk/src/share/classes/java/awt/image/BufferStrategy.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/BufferStrategy.java Wed Jul 05 19:07:19 2017 +0200 @@ -55,7 +55,7 @@ * Alternatively, the contents of the back buffer can be copied, or * <i>blitted</i> forward in a chain instead of moving the video pointer. * <p> - * <pre> + * <pre>{@code * Double buffering: * * *********** *********** @@ -72,7 +72,7 @@ * * * <------ * * <----- * * * *********** *********** *********** * - * </pre> + * }</pre> * <p> * Here is an example of how buffer strategies can be created and used: * <pre><code>
--- a/jdk/src/share/classes/java/awt/image/BufferedImage.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/BufferedImage.java Wed Jul 05 19:07:19 2017 +0200 @@ -602,12 +602,12 @@ * the raster has been premultiplied with alpha. * @param properties <code>Hashtable</code> of * <code>String</code>/<code>Object</code> pairs. - * @exception <code>RasterFormatException</code> if the number and + * @exception RasterFormatException if the number and * types of bands in the <code>SampleModel</code> of the * <code>Raster</code> do not match the number and types required by * the <code>ColorModel</code> to represent its color and alpha * components. - * @exception <code>IllegalArgumentException</code> if + * @exception IllegalArgumentException if * <code>raster</code> is incompatible with <code>cm</code> * @see ColorModel * @see Raster @@ -927,7 +927,7 @@ * each color component in the returned data when * using this method. With a specified coordinate (x, y) in the * image, the ARGB pixel can be accessed in this way: - * </p> + * <p> * * <pre> * pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)]; </pre> @@ -1131,7 +1131,7 @@ * @return an {@link Object} that is the property referred to by the * specified <code>name</code> or <code>null</code> if the * properties of this image are not yet known. - * @throws <code>NullPointerException</code> if the property name is null. + * @throws NullPointerException if the property name is null. * @see ImageObserver * @see java.awt.Image#UndefinedProperty */ @@ -1144,7 +1144,7 @@ * @param name the property name * @return an <code>Object</code> that is the property referred to by * the specified <code>name</code>. - * @throws <code>NullPointerException</code> if the property name is null. + * @throws NullPointerException if the property name is null. */ public Object getProperty(String name) { if (name == null) { @@ -1196,7 +1196,7 @@ * @param h the height of the specified rectangular region * @return a <code>BufferedImage</code> that is the subimage of this * <code>BufferedImage</code>. - * @exception <code>RasterFormatException</code> if the specified + * @exception RasterFormatException if the specified * area is not contained within this <code>BufferedImage</code>. */ public BufferedImage getSubimage (int x, int y, int w, int h) { @@ -1388,7 +1388,7 @@ * @param tileY the y index of the requested tile in the tile array * @return a <code>Raster</code> that is the tile defined by the * arguments <code>tileX</code> and <code>tileY</code>. - * @exception <code>ArrayIndexOutOfBoundsException</code> if both + * @exception ArrayIndexOutOfBoundsException if both * <code>tileX</code> and <code>tileY</code> are not * equal to 0 */ @@ -1558,7 +1558,7 @@ * @return <code>true</code> if the tile specified by the specified * indices is checked out for writing; <code>false</code> * otherwise. - * @exception <code>ArrayIndexOutOfBoundsException</code> if both + * @exception ArrayIndexOutOfBoundsException if both * <code>tileX</code> and <code>tileY</code> are not equal * to 0 */
--- a/jdk/src/share/classes/java/awt/image/ByteLookupTable.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/ByteLookupTable.java Wed Jul 05 19:07:19 2017 +0200 @@ -171,7 +171,7 @@ * @exception ArrayIndexOutOfBoundsException if <code>src</code> is * longer than <code>dst</code> or if for any element * <code>i</code> of <code>src</code>, - * <code>(src[i]&0xff)-offset</code> is either less than + * {@code (src[i]&0xff)-offset} is either less than * zero or greater than or equal to the length of the * lookup table for any band. */
--- a/jdk/src/share/classes/java/awt/image/ColorModel.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/ColorModel.java Wed Jul 05 19:07:19 2017 +0200 @@ -692,12 +692,12 @@ * <code>DataBuffer.TYPE_INT</code>. * @param inData an array of pixel values * @return the value of the green component of the specified pixel. - * @throws <code>ClassCastException</code> if <code>inData</code> + * @throws ClassCastException if <code>inData</code> * is not a primitive array of type <code>transferType</code> - * @throws <code>ArrayIndexOutOfBoundsException</code> if + * @throws ArrayIndexOutOfBoundsException if * <code>inData</code> is not large enough to hold a pixel value * for this <code>ColorModel</code> - * @throws <code>UnsupportedOperationException</code> if this + * @throws UnsupportedOperationException if this * <code>tranferType</code> is not supported by this * <code>ColorModel</code> */
--- a/jdk/src/share/classes/java/awt/image/DirectColorModel.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/DirectColorModel.java Wed Jul 05 19:07:19 2017 +0200 @@ -642,12 +642,12 @@ * @param inData the specified pixel * @return the alpha component of the specified pixel, scaled from * 0 to 255. - * @exception <code>ClassCastException</code> if <code>inData</code> + * @exception ClassCastException if <code>inData</code> * is not a primitive array of type <code>transferType</code> - * @exception <code>ArrayIndexOutOfBoundsException</code> if + * @exception ArrayIndexOutOfBoundsException if * <code>inData</code> is not large enough to hold a pixel value * for this <code>ColorModel</code> - * @exception <code>UnsupportedOperationException</code> if this + * @exception UnsupportedOperationException if this * <code>tranferType</code> is not supported by this * <code>ColorModel</code> */ @@ -1055,7 +1055,7 @@ * begin retrieving the color and alpha components * @return an <code>int</code> pixel value in this * <code>ColorModel</code> corresponding to the specified components. - * @exception <code>ArrayIndexOutOfBoundsException</code> if + * @exception ArrayIndexOutOfBoundsException if * the <code>components</code> array is not large enough to * hold all of the color and alpha components starting at * <code>offset</code> @@ -1097,9 +1097,9 @@ * and alpha components * @return an <code>Object</code> representing an array of color and * alpha components. - * @exception <code>ClassCastException</code> if <code>obj</code> + * @exception ClassCastException if <code>obj</code> * is not a primitive array of type <code>transferType</code> - * @exception <code>ArrayIndexOutOfBoundsException</code> if + * @exception ArrayIndexOutOfBoundsException if * <code>obj</code> is not large enough to hold a pixel value * for this <code>ColorModel</code> or the <code>components</code> * array is not large enough to hold all of the color and alpha
--- a/jdk/src/share/classes/java/awt/image/ImageProducer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/ImageProducer.java Wed Jul 05 19:07:19 2017 +0200 @@ -100,11 +100,11 @@ * <code>ImageProducer</code> should respond by executing * the following minimum set of <code>ImageConsumer</code> * method calls: - * <pre> + * <pre>{@code * ic.setHints(TOPDOWNLEFTRIGHT | < otherhints >); * ic.setPixels(...); // As many times as needed * ic.imageComplete(); - * </pre> + * }</pre> * @param ic the specified <code>ImageConsumer</code> * @see ImageConsumer#setHints */
--- a/jdk/src/share/classes/java/awt/image/IndexColorModel.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/IndexColorModel.java Wed Jul 05 19:07:19 2017 +0200 @@ -98,6 +98,7 @@ * Index values greater than or equal to the map size, but less than * 2<sup><em>n</em></sup>, are undefined and return 0 for all color and * alpha components. + * </a> * <p> * For those methods that use a primitive array pixel representation of * type <code>transferType</code>, the array length is always one.
--- a/jdk/src/share/classes/java/awt/image/MemoryImageSource.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/MemoryImageSource.java Wed Jul 05 19:07:19 2017 +0200 @@ -37,7 +37,7 @@ * uses an array to produce pixel values for an Image. Here is an example * which calculates a 100x100 image representing a fade from black to blue * along the X axis and a fade from black to red along the Y axis: - * <pre> + * <pre>{@code * * int w = 100; * int h = 100; @@ -52,12 +52,12 @@ * } * Image img = createImage(new MemoryImageSource(w, h, pix, 0, w)); * - * </pre> + * }</pre> * The MemoryImageSource is also capable of managing a memory image which * varies over time to allow animation or custom rendering. Here is an * example showing how to set up the animation source and signal changes * in the data (adapted from the MemoryAnimationSourceDemo by Garth Dickie): - * <pre> + * <pre>{@code * * int pixels[]; * MemoryImageSource source; @@ -96,7 +96,7 @@ * } * } * - * </pre> + * }</pre> * * @see ImageProducer *
--- a/jdk/src/share/classes/java/awt/image/MultiPixelPackedSampleModel.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/MultiPixelPackedSampleModel.java Wed Jul 05 19:07:19 2017 +0200 @@ -52,14 +52,14 @@ * <code>x, y</code> from <code>DataBuffer</code> <code>data</code> * and storing the pixel data in data elements of type * <code>dataType</code>: - * <pre> + * <pre>{@code * int dataElementSize = DataBuffer.getDataTypeSize(dataType); * int bitnum = dataBitOffset + x*pixelBitStride; * int element = data.getElem(y*scanlineStride + bitnum/dataElementSize); * int shift = dataElementSize - (bitnum & (dataElementSize-1)) * - pixelBitStride; * int pixel = (element >> shift) & ((1 << pixelBitStride) - 1); - * </pre> + * }</pre> */ public class MultiPixelPackedSampleModel extends SampleModel
--- a/jdk/src/share/classes/java/awt/image/PixelGrabber.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/PixelGrabber.java Wed Jul 05 19:07:19 2017 +0200 @@ -35,7 +35,7 @@ * The PixelGrabber class implements an ImageConsumer which can be attached * to an Image or ImageProducer object to retrieve a subset of the pixels * in that image. Here is an example: - * <pre> + * <pre>{@code * * public void handlesinglepixel(int x, int y, int pixel) { * int alpha = (pixel >> 24) & 0xff; @@ -65,7 +65,7 @@ * } * } * - * </pre> + * }</pre> * * @see ColorModel#getRGBdefault * @@ -165,8 +165,8 @@ * accumulated in the default RGB ColorModel. If the forceRGB * parameter is true, then the pixels will be accumulated in the * default RGB ColorModel anyway. A buffer is allocated by the - * PixelGrabber to hold the pixels in either case. If (w < 0) or - * (h < 0), then they will default to the remaining width and + * PixelGrabber to hold the pixels in either case. If {@code (w < 0)} or + * {@code (h < 0)}, then they will default to the remaining width and * height of the source data when that information is delivered. * @param img the image to retrieve the image data from * @param x the x coordinate of the upper left corner of the rectangle @@ -233,10 +233,10 @@ * behaves in the following ways, depending on the value of * <code>ms</code>: * <ul> - * <li> If <code>ms</code> == 0, waits until all pixels are delivered - * <li> If <code>ms</code> > 0, waits until all pixels are delivered + * <li> If {@code ms == 0}, waits until all pixels are delivered + * <li> If {@code ms > 0}, waits until all pixels are delivered * as timeout expires. - * <li> If <code>ms</code> < 0, returns <code>true</code> if all pixels + * <li> If {@code ms < 0}, returns <code>true</code> if all pixels * are grabbed, <code>false</code> otherwise and does not wait. * </ul> * @param ms the number of milliseconds to wait for the image pixels
--- a/jdk/src/share/classes/java/awt/image/RGBImageFilter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/RGBImageFilter.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,7 +39,7 @@ * The only method which needs to be defined to create a useable image * filter is the filterRGB method. Here is an example of a definition * of a filter which swaps the red and blue components of an image: - * <pre> + * <pre>{@code * * class RedBlueSwapFilter extends RGBImageFilter { * public RedBlueSwapFilter() { @@ -56,7 +56,7 @@ * } * } * - * </pre> + * }</pre> * * @see FilteredImageSource * @see ImageFilter
--- a/jdk/src/share/classes/java/awt/image/ShortLookupTable.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/ShortLookupTable.java Wed Jul 05 19:07:19 2017 +0200 @@ -114,7 +114,7 @@ * @exception ArrayIndexOutOfBoundsException if <code>src</code> is * longer than <code>dst</code> or if for any element * <code>i</code> of <code>src</code>, - * <code>(src[i]&0xffff)-offset</code> is either less than + * {@code (src[i]&0xffff)-offset} is either less than * zero or greater than or equal to the length of the * lookup table for any band. */ @@ -165,7 +165,7 @@ * @exception ArrayIndexOutOfBoundsException if <code>src</code> is * longer than <code>dst</code> or if for any element * <code>i</code> of <code>src</code>, - * <code>(src[i]&0xffff)-offset</code> is either less than + * {@code (src[i]&0xffff)-offset} is either less than * zero or greater than or equal to the length of the * lookup table for any band. */
--- a/jdk/src/share/classes/java/awt/image/SinglePixelPackedSampleModel.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/SinglePixelPackedSampleModel.java Wed Jul 05 19:07:19 2017 +0200 @@ -57,10 +57,10 @@ * The following code illustrates extracting the bits of the sample * representing band <code>b</code> for pixel <code>x,y</code> * from DataBuffer <code>data</code>: - * <pre> + * <pre>{@code * int sample = data.getElem(y * scanlineStride + x); * sample = (sample & bitMasks[b]) >>> bitOffsets[b]; - * </pre> + * }</pre> */ public class SinglePixelPackedSampleModel extends SampleModel
--- a/jdk/src/share/classes/java/awt/image/WritableRaster.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/awt/image/WritableRaster.java Wed Jul 05 19:07:19 2017 +0200 @@ -372,13 +372,13 @@ * integral type and less than or equal to 32 bits in size, then calling * this method is equivalent to executing the following code for all * <code>x,y</code> addresses valid in both Rasters. - * <pre> + * <pre>{@code * Raster srcRaster; * WritableRaster dstRaster; * for (int b = 0; b < srcRaster.getNumBands(); b++) { * dstRaster.setSample(x, y, b, srcRaster.getSample(x, y, b)); * } - * </pre> + * }</pre> * Thus, when copying an integral type source to an integral type * destination, if the source sample size is greater than the destination * sample size for a particular band, the high order bits of the source
--- a/jdk/src/share/classes/java/beans/AppletInitializer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/AppletInitializer.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2000, 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 @@ -68,7 +68,6 @@ * the Applet with its Container during the subsequent invocation of its * addChildren() method. * </ol> - * </p> * * @param newAppletBean The newly instantiated JavaBean * @param bCtxt The BeanContext intended for this Applet, or
--- a/jdk/src/share/classes/java/beans/Beans.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/Beans.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2009, 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 @@ -62,7 +62,7 @@ * <p> * Instantiate a JavaBean. * </p> - * + * @return a JavaBean * @param cls the class-loader from which we should create * the bean. If this is null, then the system * class-loader is used. @@ -82,6 +82,7 @@ * <p> * Instantiate a JavaBean. * </p> + * @return a JavaBean * * @param cls the class-loader from which we should create * the bean. If this is null, then the system @@ -137,6 +138,7 @@ * the JDK appletviewer (for a reference browser environment) and the * BDK BeanBox (for a reference bean container). * + * @return a JavaBean * @param cls the class-loader from which we should create * the bean. If this is null, then the system * class-loader is used. @@ -361,6 +363,8 @@ * This method is provided in Beans 1.0 as a hook to allow the * addition of more flexible bean behaviour in the future. * + * @return an object representing a specified type view of the + * source object * @param bean Object from which we want to obtain a view. * @param targetType The type of view we'd like to get. * @@ -384,7 +388,6 @@ return Introspector.isSubclass(bean.getClass(), targetType); } - /** * Test if we are in design-mode. *
--- a/jdk/src/share/classes/java/beans/ConstructorProperties.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/ConstructorProperties.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -61,7 +61,7 @@ the {@code getY()} method. Since parameter names are not in general available at runtime, without the annotation there would be no way to know whether the parameters correspond to {@code getX()} - and {@code getY()} or the other way around.</p> + and {@code getY()} or the other way around. @since 1.6 */
--- a/jdk/src/share/classes/java/beans/DefaultPersistenceDelegate.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/DefaultPersistenceDelegate.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -382,6 +382,7 @@ * a class such that no property value depends on the value of * a subsequent property. * + * @param type the type of the instances * @param oldInstance The instance to be copied. * @param newInstance The instance that is to be modified. * @param out The stream to which any initialization statements should be written.
--- a/jdk/src/share/classes/java/beans/EventHandler.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/EventHandler.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2009, 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 @@ -515,6 +515,7 @@ *</pre> *</blockquote> * + * @param <T> the type to create * @param listenerInterface the listener interface to create a proxy for * @param target the object that will perform the action * @param action the name of a (possibly qualified) property or method on @@ -570,6 +571,7 @@ *</pre> *</blockquote> * + * @param <T> the type to create * @param listenerInterface the listener interface to create a proxy for * @param target the object that will perform the action * @param action the name of a (possibly qualified) property or method on @@ -659,6 +661,7 @@ * </pre> *</blockquote> * + * @param <T> the type to create * @param listenerInterface the listener interface to create a proxy for * @param target the object that will perform the action * @param action the name of a (possibly qualified) property or method on
--- a/jdk/src/share/classes/java/beans/Expression.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/Expression.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, 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 @@ -139,7 +139,7 @@ * replaces this default value in the same way that any other value * would, ensuring that expressions are never evaluated more than once. * <p> - * See the <code>excecute</code> method for details on how + * See the <code>execute</code> method for details on how * methods are chosen using the dynamic types of the target * and arguments. * @@ -147,6 +147,8 @@ * @see #setValue * * @return The result of applying this method to these arguments. + * @throws Exception if the method with the specified methodName + * throws an exception */ public Object getValue() throws Exception { if (value == unbound) {
--- a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Wed Jul 05 19:07:19 2017 +0200 @@ -207,6 +207,8 @@ * Sets the method that should be used to read an indexed property value. * * @param readMethod The new indexed read method. + * @throws IntrospectionException if an exception occurs during + * introspection. */ public synchronized void setIndexedReadMethod(Method readMethod) throws IntrospectionException { @@ -285,6 +287,8 @@ * Sets the method that should be used to write an indexed property value. * * @param writeMethod The new indexed write method. + * @throws IntrospectionException if an exception occurs during + * introspection. */ public synchronized void setIndexedWriteMethod(Method writeMethod) throws IntrospectionException {
--- a/jdk/src/share/classes/java/beans/Introspector.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/Introspector.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -93,8 +93,17 @@ public class Introspector { // Flags that can be used to control getBeanInfo: + /** + * Flag to indicate to use of all beaninfo. + */ public final static int USE_ALL_BEANINFO = 1; + /** + * Flag to indicate to ignore immediate beaninfo. + */ public final static int IGNORE_IMMEDIATE_BEANINFO = 2; + /** + * Flag to indicate to ignore all beaninfo. + */ public final static int IGNORE_ALL_BEANINFO = 3; // Static Caches to speed up introspection. @@ -202,7 +211,7 @@ * If the BeanInfo class for a Java Bean has been previously Introspected * based on the same arguments, then the BeanInfo class is retrieved * from the BeanInfo cache. - * + * @return the BeanInfo for the bean * @param beanClass The bean class to be analyzed. * @param stopClass The baseclass at which to stop the analysis. Any * methods/properties/events in the stopClass or in its baseclasses
--- a/jdk/src/share/classes/java/beans/PersistenceDelegate.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/PersistenceDelegate.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, 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 @@ -197,6 +197,7 @@ * The default implementation, calls the <code>initialize</code> * method of the type's superclass. * + * @param type the type of the instances * @param oldInstance The instance to be copied. * @param newInstance The instance that is to be modified. * @param out The stream to which any initialization statements should be written.
--- a/jdk/src/share/classes/java/beans/PropertyChangeSupport.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/PropertyChangeSupport.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -156,7 +156,7 @@ * <code>PropertyChangeListenerProxy</code>, perform the cast, and examine * the parameter. * - * <pre> + * <pre>{@code * PropertyChangeListener[] listeners = bean.getPropertyChangeListeners(); * for (int i = 0; i < listeners.length; i++) { * if (listeners[i] instanceof PropertyChangeListenerProxy) { @@ -168,7 +168,7 @@ * } * } * } - *</pre> + * }</pre> * * @see PropertyChangeListenerProxy * @return all of the <code>PropertyChangeListeners</code> added or an
--- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java Wed Jul 05 19:07:19 2017 +0200 @@ -243,6 +243,7 @@ * Sets the method that should be used to read the property value. * * @param readMethod The new read method. + * @throws IntrospectionException if the read method is invalid */ public synchronized void setReadMethod(Method readMethod) throws IntrospectionException { @@ -313,6 +314,7 @@ * Sets the method that should be used to write the property value. * * @param writeMethod The new write method. + * @throws IntrospectionException if the write method is invalid */ public synchronized void setWriteMethod(Method writeMethod) throws IntrospectionException {
--- a/jdk/src/share/classes/java/beans/Transient.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/Transient.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -40,7 +40,7 @@ * A {@code true} value for the "transient" attribute * indicates to encoders derived from {@link Encoder} * that this feature should be ignored. - * <p/> + * <p> * The {@code Transient} annotation may be be used * in any of the methods that are involved * in a {@link FeatureDescriptor} subclass @@ -49,7 +49,7 @@ * to put the annotation and it is this declaration * that takes precedence in the case of multiple annotations * being defined for the same feature. - * <p/> + * <p> * To declare a feature non-transient in a class * whose superclass declares it transient, * use {@code @Transient(false)}. @@ -64,5 +64,11 @@ @Target({METHOD}) @Retention(RUNTIME) public @interface Transient { + /** + * Returns whether or not the {@code Introspector} should + * construct artifacts for the annotated method. + * @return whether or not the {@code Introspector} should + * construct artifacts for the annotated method + */ boolean value() default true; }
--- a/jdk/src/share/classes/java/beans/VetoableChangeSupport.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/VetoableChangeSupport.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -42,7 +42,7 @@ * <p> * Here is an example of {@code VetoableChangeSupport} usage that follows * the rules and recommendations laid out in the JavaBeans™ specification: - * <pre> + * <pre>{@code * public class MyBean { * private final VetoableChangeSupport vcs = new VetoableChangeSupport(this); * @@ -68,7 +68,7 @@ * * [...] * } - * </pre> + * }</pre> * <p> * A {@code VetoableChangeSupport} instance is thread-safe. * <p> @@ -156,7 +156,7 @@ * <code>VetoableChangeListenerProxy</code>, perform the cast, and examine * the parameter. * - * <pre> + * <pre>{@code * VetoableChangeListener[] listeners = bean.getVetoableChangeListeners(); * for (int i = 0; i < listeners.length; i++) { * if (listeners[i] instanceof VetoableChangeListenerProxy) { @@ -168,7 +168,7 @@ * } * } * } - *</pre> + * }</pre> * * @see VetoableChangeListenerProxy * @return all of the <code>VetoableChangeListeners</code> added or an
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContext.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContext.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, 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 @@ -64,10 +64,12 @@ * and is defined by the * <code>java.beans.Beans.instantiate()</code> method. * + * @return a javaBean named as a child of this + * <code>BeanContext</code> * @param beanName The name of the JavaBean to instantiate * as a child of this <code>BeanContext</code> - * @throws <code>IOException</code> - * @throws <code>ClassNotFoundException</code> if the class identified + * @throws IOException if an IO problem occurs + * @throws ClassNotFoundException if the class identified * by the beanName parameter is not found */ Object instantiateChild(String beanName) throws IOException, ClassNotFoundException; @@ -83,7 +85,7 @@ * @return an <code>InputStream</code> for reading the resource, * or <code>null</code> if the resource could not * be found. - * @throws <code>IllegalArgumentException</code> if + * @throws IllegalArgumentException if * the resource is not valid */ InputStream getResourceAsStream(String name, BeanContextChild bcc) throws IllegalArgumentException; @@ -98,7 +100,7 @@ * @param bcc the specified child * @return a <code>URL</code> for the named * resource for the specified child - * @throws <code>IllegalArgumentException</code> + * @throws IllegalArgumentException * if the resource is not valid */ URL getResource(String name, BeanContextChild bcc) throws IllegalArgumentException; @@ -109,7 +111,7 @@ * this <code>BeanContext</code> whenever it adds * or removes a child <code>Component</code>(s). * - * @param bcml the <code>BeanContextMembershipListener</code> to be added + * @param bcml the BeanContextMembershipListener to be added */ void addBeanContextMembershipListener(BeanContextMembershipListener bcml);
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextChild.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextChild.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, 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 @@ -82,7 +82,7 @@ * </p> * @param bc The <code>BeanContext</code> with which * to associate this <code>BeanContextChild</code>. - * @throws <code>PropertyVetoException</code> if the + * @throws PropertyVetoException if the * addition of the specified <code>BeanContext</code> is refused. */ void setBeanContext(BeanContext bc) throws PropertyVetoException;
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextChildSupport.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextChildSupport.java Wed Jul 05 19:07:19 2017 +0200 @@ -78,6 +78,7 @@ * construct a BeanContextChildSupport where the JavaBean component * itself implements BeanContextChild, and encapsulates this, delegating * that interface to this implementation + * @param bcc the underlying bean context child */ public BeanContextChildSupport(BeanContextChild bcc) { @@ -94,7 +95,7 @@ * this <code>BeanContextChildSupport</code>. * @param bc the new value to be assigned to the <code>BeanContext</code> * property - * @throws <code>PropertyVetoException</code> if the change is rejected + * @throws PropertyVetoException if the change is rejected */ public synchronized void setBeanContext(BeanContext bc) throws PropertyVetoException { if (bc == beanContext) return; @@ -361,6 +362,9 @@ */ protected VetoableChangeSupport vcSupport; + /** + * The bean context. + */ protected transient BeanContext beanContext; /**
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2009, 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 @@ -103,6 +103,7 @@ * Is the child specified affected by the event? * @return <code>true</code> if affected, <code>false</code> * if not + * @param child the object to check for being affected */ public boolean contains(Object child) { return children.contains(child);
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServices.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServices.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2004, 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 @@ -60,6 +60,7 @@ * @param serviceClass the service to add * @param serviceProvider the <code>BeanContextServiceProvider</code> * associated with the service + * @return true if the service was successful added, false otherwise */ boolean addService(Class serviceClass, BeanContextServiceProvider serviceProvider); @@ -108,7 +109,7 @@ * @param bcsrl the * <code>BeanContextServiceRevokedListener</code> to notify * if the service should later become revoked - * @throws TooManyListenersException + * @throws TooManyListenersException if there are too many listeners * @return a reference to this context's named * Service as requested or <code>null</code> */
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2009, 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 @@ -603,12 +603,16 @@ serviceProvider = bcsp; } + /** + * Returns the service provider. + * @return the service provider + */ protected BeanContextServiceProvider getServiceProvider() { return serviceProvider; } - /* - * fields + /** + * The service provider. */ protected BeanContextServiceProvider serviceProvider; @@ -618,6 +622,9 @@ * subclasses can override this method to create new subclasses of * BCSSServiceProvider without having to overrride addService() in * order to instantiate. + * @param sc the class + * @param bcsp the service provider + * @return a service provider without overriding addService() */ protected BCSSServiceProvider createBCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) { @@ -629,7 +636,7 @@ /** * add a BeanContextServicesListener * - * @throws NullPointerException + * @throws NullPointerException if the argument is null */ public void addBeanContextServicesListener(BeanContextServicesListener bcsl) { @@ -660,6 +667,8 @@ /** * add a service + * @param serviceClass the service class + * @param bcsp the service provider */ public boolean addService(Class serviceClass, BeanContextServiceProvider bcsp) { @@ -668,6 +677,10 @@ /** * add a service + * @param serviceClass the service class + * @param bcsp the service provider + * @param fireEvent whether or not an event should be fired + * @return true if the service was successfully added */ protected boolean addService(Class serviceClass, BeanContextServiceProvider bcsp, boolean fireEvent) { @@ -709,6 +722,9 @@ /** * remove a service + * @param serviceClass the service class + * @param bcsp the service provider + * @param revokeCurrentServicesNow whether or not to revoke the service */ public void revokeService(Class serviceClass, BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow) { @@ -1067,6 +1083,7 @@ /** * Fires a <tt>BeanContextServiceEvent</tt> notifying of a new service. + * @param serviceClass the service class */ protected final void fireServiceAdded(Class serviceClass) { BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass); @@ -1109,6 +1126,8 @@ * Fires a <tt>BeanContextServiceRevokedEvent</tt> * indicating that a particular service is * no longer available. + * @param serviceClass the service class + * @param revokeNow whether or not the event should be revoked now */ protected final void fireServiceRevoked(Class serviceClass, boolean revokeNow) { Object[] copy;
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextSupport.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextSupport.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2004, 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 @@ -62,7 +62,6 @@ /** * This helper class provides a utility implementation of the * java.beans.beancontext.BeanContext interface. - * </p> * <p> * Since this class directly implements the BeanContext interface, the class * can, and is intended to be used either by subclassing this implementation, @@ -351,9 +350,8 @@ * of Child without having to override add() or the other Collection * methods that add children to the set. * </p> - * * @param targetChild the child to create the Child on behalf of - * @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy + * @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy * @return Subtype-specific subclass of Child without overriding collection methods */ protected BCSChild createBCSChild(Object targetChild, Object peer) { @@ -492,6 +490,7 @@ * @param callChildSetBC used to indicate that * the child should be notified that it is no * longer nested in this <tt>BeanContext</tt>. + * @return whether or not was present before being removed */ protected boolean remove(Object targetChild, boolean callChildSetBC) { @@ -580,7 +579,8 @@ /** * add Collection to set of Children (Unsupported) * implementations must synchronized on the hierarchy lock and "children" protected field - * @throws UnsupportedOperationException + * @throws UnsupportedOperationException thrown unconditionally by this implementation + * @return this implementation unconditionally throws {@code UnsupportedOperationException} */ public boolean addAll(Collection c) { throw new UnsupportedOperationException(); @@ -589,7 +589,9 @@ /** * remove all specified children (Unsupported) * implementations must synchronized on the hierarchy lock and "children" protected field - * @throws UnsupportedOperationException + * @throws UnsupportedOperationException thrown unconditionally by this implementation + * @return this implementation unconditionally throws {@code UnsupportedOperationException} + */ public boolean removeAll(Collection c) { throw new UnsupportedOperationException(); @@ -599,7 +601,8 @@ /** * retain only specified children (Unsupported) * implementations must synchronized on the hierarchy lock and "children" protected field - * @throws UnsupportedOperationException + * @throws UnsupportedOperationException thrown unconditionally by this implementation + * @return this implementation unconditionally throws {@code UnsupportedOperationException} */ public boolean retainAll(Collection c) { throw new UnsupportedOperationException(); @@ -608,7 +611,7 @@ /** * clear the children (Unsupported) * implementations must synchronized on the hierarchy lock and "children" protected field - * @throws UnsupportedOperationException + * @throws UnsupportedOperationException thrown unconditionally by this implementation */ public void clear() { throw new UnsupportedOperationException(); @@ -618,7 +621,7 @@ * Adds a BeanContextMembershipListener * * @param bcml the BeanContextMembershipListener to add - * @throws NullPointerException + * @throws NullPointerException if the argument is null */ public void addBeanContextMembershipListener(BeanContextMembershipListener bcml) { @@ -636,7 +639,7 @@ * Removes a BeanContextMembershipListener * * @param bcml the BeanContextMembershipListener to remove - * @throws NullPointerException + * @throws NullPointerException if the argument is null */ public void removeBeanContextMembershipListener(BeanContextMembershipListener bcml) { @@ -655,7 +658,7 @@ * @param bcc the child object making the request. * * @return the requested resource as an InputStream - * @throws NullPointerException + * @throws NullPointerException if the argument is null */ public InputStream getResourceAsStream(String name, BeanContextChild bcc) { @@ -849,6 +852,8 @@ * * This method should not however be used by subclasses to replace their * own implementation (if any) of writeObject(). + * @param oos the {@code ObjectOutputStream} to use during serialization + * @throws IOException if serialization failed */ protected void bcsPreSerializationHook(ObjectOutputStream oos) throws IOException { @@ -864,6 +869,9 @@ * * This method should not however be used by subclasses to replace their * own implementation (if any) of readObject(). + * @param ois the {@code ObjectInputStream} to use during deserialization + * @throws IOException if deserialization failed + * @throws ClassNotFoundException if needed classes are not found */ protected void bcsPreDeserializationHook(ObjectInputStream ois) throws IOException, ClassNotFoundException { @@ -914,6 +922,8 @@ * used by readObject to deserialize a collection. * @param ois the ObjectInputStream to use * @param coll the Collection + * @throws IOException if deserialization failed + * @throws ClassNotFoundException if needed classes are not found */ protected final void deserialize(ObjectInputStream ois, Collection coll) throws IOException, ClassNotFoundException { int count = 0; @@ -1005,6 +1015,9 @@ * When an instance of this class is used as a delegate for the * implementation of the BeanContext protocols (and its subprotocols) * there exists a 'chicken and egg' problem during deserialization + * @param ois the ObjectInputStream to use + * @throws IOException if deserialization failed + * @throws ClassNotFoundException if needed classes are not found */ public final void readChildren(ObjectInputStream ois) throws IOException, ClassNotFoundException { @@ -1122,6 +1135,7 @@ * immediately prior to their being added to the BeanContext. * </p> * + * @param targetChild the child to create the Child on behalf of * @return true iff the child may be added to this BeanContext, otherwise false. */ @@ -1136,6 +1150,7 @@ * immediately prior to their being removed from the BeanContext. * </p> * + * @param targetChild the child to create the Child on behalf of * @return true iff the child may be removed from this BeanContext, otherwise false. */ @@ -1147,6 +1162,8 @@ * subclasses may override this method to simply extend add() semantics * after the child has been added and before the event notification has * occurred. The method is called with the child synchronized. + * @param child the child + * @param bcsc the BCSChild */ protected void childJustAddedHook(Object child, BCSChild bcsc) { @@ -1156,6 +1173,8 @@ * subclasses may override this method to simply extend remove() semantics * after the child has been removed and before the event notification has * occurred. The method is called with the child synchronized. + * @param child the child + * @param bcsc the BCSChild */ protected void childJustRemovedHook(Object child, BCSChild bcsc) { @@ -1254,6 +1273,7 @@ /** * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface + * @param bcme the event to fire */ protected final void fireChildrenAdded(BeanContextMembershipEvent bcme) { @@ -1267,6 +1287,7 @@ /** * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface + * @param bcme the event to fire */ protected final void fireChildrenRemoved(BeanContextMembershipEvent bcme) {
--- a/jdk/src/share/classes/java/net/SocketAddress.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/net/SocketAddress.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,4 +39,7 @@ * @since 1.4 */ public abstract class SocketAddress implements java.io.Serializable { + + static final long serialVersionUID = 5215720748342549866L; + }
--- a/jdk/src/share/classes/java/nio/file/Files.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/nio/file/Files.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,10 +25,10 @@ package java.nio.file; -import java.nio.ByteBuffer; import java.nio.file.attribute.*; import java.nio.file.spi.FileSystemProvider; import java.nio.file.spi.FileTypeDetector; +import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.SeekableByteChannel; import java.io.Closeable; @@ -2965,7 +2965,63 @@ } /** - * Read all the bytes from a file. The method ensures that the file is + * The maximum size of array to allocate. + * Some VMs reserve some header words in an array. + * Attempts to allocate larger arrays may result in + * OutOfMemoryError: Requested array size exceeds VM limit + */ + private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8; + + /** + * Reads all the bytes from an input stream. Uses {@code initialSize} as a hint + * about how many bytes the stream will have. + * + * @param source + * the input stream to read from + * @param initialSize + * the initial size of the byte array to allocate + * + * @return a byte array containing the bytes read from the file + * + * @throws IOException + * if an I/O error occurs reading from the stream + * @throws OutOfMemoryError + * if an array of the required size cannot be allocated + */ + private static byte[] read(InputStream source, int initialSize) + throws IOException + { + int capacity = initialSize; + byte[] buf = new byte[capacity]; + int nread = 0; + int n; + for (;;) { + // read to EOF which may read more or less than initialSize (eg: file + // is truncated while we are reading) + while ((n = source.read(buf, nread, capacity - nread)) > 0) + nread += n; + + // if last call to source.read() returned -1, we are done + // otherwise, try to read one more byte; if that failed we're done too + if (n < 0 || (n = source.read()) < 0) + break; + + // one more byte was read; need to allocate a larger buffer + if (capacity <= MAX_BUFFER_SIZE - capacity) { + capacity = Math.max(capacity << 1, BUFFER_SIZE); + } else { + if (capacity == MAX_BUFFER_SIZE) + throw new OutOfMemoryError("Required array size too large"); + capacity = MAX_BUFFER_SIZE; + } + buf = Arrays.copyOf(buf, capacity); + buf[nread++] = (byte)n; + } + return (capacity == nread) ? buf : Arrays.copyOf(buf, nread); + } + + /** + * Reads all the bytes from a file. The method ensures that the file is * closed when all bytes have been read or an I/O error, or other runtime * exception, is thrown. * @@ -2989,22 +3045,13 @@ * method is invoked to check read access to the file. */ public static byte[] readAllBytes(Path path) throws IOException { - try (FileChannel fc = FileChannel.open(path)) { + try (FileChannel fc = FileChannel.open(path); + InputStream is = Channels.newInputStream(fc)) { long size = fc.size(); - if (size > (long)Integer.MAX_VALUE) + if (size > (long)MAX_BUFFER_SIZE) throw new OutOfMemoryError("Required array size too large"); - byte[] arr = new byte[(int)size]; - ByteBuffer bb = ByteBuffer.wrap(arr); - while (bb.hasRemaining()) { - if (fc.read(bb) < 0) { - // truncated - break; - } - } - - int nread = bb.position(); - return (nread == size) ? arr : Arrays.copyOf(arr, nread); + return read(is, (int)size); } }
--- a/jdk/src/share/classes/java/rmi/server/RMISocketFactory.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/rmi/server/RMISocketFactory.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2002, 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 @@ -33,15 +33,47 @@ * in order to obtain client and server sockets for RMI calls. An * application may use the <code>setSocketFactory</code> method to * request that the RMI runtime use its socket factory instance - * instead of the default implementation.<p> + * instead of the default implementation. * - * The default socket factory implementation used goes through a + * <p>The default socket factory implementation performs a * three-tiered approach to creating client sockets. First, a direct * socket connection to the remote VM is attempted. If that fails * (due to a firewall), the runtime uses HTTP with the explicit port * number of the server. If the firewall does not allow this type of * communication, then HTTP to a cgi-bin script on the server is used - * to POST the RMI call.<p> + * to POST the RMI call. + * + * <p>The default socket factory implementation creates server sockets that + * are bound to the wildcard address, which accepts requests from all network + * interfaces. + * + * @implNote + * <p>You can use the {@code RMISocketFactory} class to create a server socket that + * is bound to a specific address, restricting the origin of requests. For example, + * the following code implements a socket factory that binds server sockets to the + * loopback address. This restricts RMI to processing requests only from the local host. + * + * <pre>{@code + * class LoopbackSocketFactory extends RMISocketFactory { + * public ServerSocket createServerSocket(int port) throws IOException { + * return new ServerSocket(port, 5, InetAddress.getLoopbackAddress()); + * } + * + * public Socket createSocket(String host, int port) throws IOException { + * // just call the default client socket factory + * return RMISocketFactory.getDefaultSocketFactory() + * .createSocket(host, port); + * } + * } + * + * // ... + * + * RMISocketFactory.setSocketFactory(new LoopbackSocketFactory()); + * }</pre> + * + * Set the {@code java.rmi.server.hostname} system property + * to a host name (typically {@code localhost}) that resolves to the loopback + * interface to ensure that the generated stubs use the right network interface. * * @author Ann Wollrath * @author Peter Jones
--- a/jdk/src/share/classes/java/rmi/server/UnicastRemoteObject.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/rmi/server/UnicastRemoteObject.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -100,6 +100,26 @@ * </ul> * </ul> * + * <p>If an object is exported with the + * {@link #exportObject(Remote) exportObject(Remote)} + * or + * {@link #exportObject(Remote, int) exportObject(Remote, port)} + * methods, or if a subclass constructor invokes one of the + * {@link #UnicastRemoteObject()} + * or + * {@link #UnicastRemoteObject(int) UnicastRemoteObject(port)} + * constructors, the object is exported with a server socket created using the + * {@link RMISocketFactory} + * class. + * + * @implNote + * <p>By default, server sockets created by the {@link RMISocketFactory} class + * listen on all network interfaces. See the + * {@link RMISocketFactory} class and the section + * <a href="{@docRoot}/../platform/rmi/spec/rmi-server29.html">RMI Socket Factories</a> + * in the + * <a href="{@docRoot}/../platform/rmi/spec/rmiTOC.html">Java RMI Specification</a>. + * * @author Ann Wollrath * @author Peter Jones * @since JDK1.1
--- a/jdk/src/share/classes/java/security/Security.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/security/Security.java Wed Jul 05 19:07:19 2017 +0200 @@ -326,17 +326,13 @@ * * <p>A provider cannot be added if it is already installed. * - * <p>First, if there is a security manager, its - * {@code checkSecurityAccess} - * method is called with the string - * {@code "insertProvider."+provider.getName()} - * to see if it's ok to add a new provider. - * If the default implementation of {@code checkSecurityAccess} - * is used (i.e., that method is not overriden), then this will result in - * a call to the security manager's {@code checkPermission} method - * with a - * {@code SecurityPermission("insertProvider."+provider.getName())} - * permission. + * <p>If there is a security manager, the + * {@link java.lang.SecurityManager#checkSecurityAccess} method is called + * with the {@code "insertProvider"} permission target name to see if + * it's ok to add a new provider. If this permission check is denied, + * {@code checkSecurityAccess} is called again with the + * {@code "insertProvider."+provider.getName()} permission target name. If + * both checks are denied, a {@code SecurityException} is thrown. * * @param provider the provider to be added. * @@ -360,7 +356,7 @@ public static synchronized int insertProviderAt(Provider provider, int position) { String providerName = provider.getName(); - check("insertProvider." + providerName); + checkInsertProvider(providerName); ProviderList list = Providers.getFullProviderList(); ProviderList newList = ProviderList.insertAt(list, provider, position - 1); if (list == newList) { @@ -373,17 +369,13 @@ /** * Adds a provider to the next position available. * - * <p>First, if there is a security manager, its - * {@code checkSecurityAccess} - * method is called with the string - * {@code "insertProvider."+provider.getName()} - * to see if it's ok to add a new provider. - * If the default implementation of {@code checkSecurityAccess} - * is used (i.e., that method is not overriden), then this will result in - * a call to the security manager's {@code checkPermission} method - * with a - * {@code SecurityPermission("insertProvider."+provider.getName())} - * permission. + * <p>If there is a security manager, the + * {@link java.lang.SecurityManager#checkSecurityAccess} method is called + * with the {@code "insertProvider"} permission target name to see if + * it's ok to add a new provider. If this permission check is denied, + * {@code checkSecurityAccess} is called again with the + * {@code "insertProvider."+provider.getName()} permission target name. If + * both checks are denied, a {@code SecurityException} is thrown. * * @param provider the provider to be added. * @@ -863,6 +855,23 @@ } } + private static void checkInsertProvider(String name) { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + try { + security.checkSecurityAccess("insertProvider"); + } catch (SecurityException se1) { + try { + security.checkSecurityAccess("insertProvider." + name); + } catch (SecurityException se2) { + // throw first exception, but add second to suppressed + se1.addSuppressed(se2); + throw se1; + } + } + } + } + /* * Returns all providers who satisfy the specified * criterion.
--- a/jdk/src/share/classes/java/security/SecurityPermission.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/security/SecurityPermission.java Wed Jul 05 19:07:19 2017 +0200 @@ -130,14 +130,17 @@ * </tr> * * <tr> - * <td>insertProvider.{provider name}</td> - * <td>Addition of a new provider, with the specified name</td> + * <td>insertProvider</td> + * <td>Addition of a new provider</td> * <td>This would allow somebody to introduce a possibly * malicious provider (e.g., one that discloses the private keys passed * to it) as the highest-priority provider. This would be possible * because the Security object (which manages the installed providers) * currently does not check the integrity or authenticity of a provider - * before attaching it.</td> + * before attaching it. The "insertProvider" permission subsumes the + * "insertProvider.{provider name}" permission (see the section below for + * more information). + * </td> * </tr> * * <tr> @@ -186,9 +189,10 @@ * </table> * * <P> - * The following permissions are associated with classes that have been - * deprecated: {@link Identity}, {@link IdentityScope}, {@link Signer}. Use of - * them is discouraged. See the applicable classes for more information. + * The following permissions have been superseded by newer permissions or are + * associated with classes that have been deprecated: {@link Identity}, + * {@link IdentityScope}, {@link Signer}. Use of them is discouraged. See the + * applicable classes for more information. * <P> * * <table border=1 cellpadding=5 summary="target name,what the permission allows, and associated risks"> @@ -199,6 +203,23 @@ * </tr> * * <tr> + * <td>insertProvider.{provider name}</td> + * <td>Addition of a new provider, with the specified name</td> + * <td>Use of this permission is discouraged from further use because it is + * possible to circumvent the name restrictions by overriding the + * {@link java.security.Provider#getName} method. Also, there is an equivalent + * level of risk associated with granting code permission to insert a provider + * with a specific name, or any name it chooses. Users should use the + * "insertProvider" permission instead. + * <p>This would allow somebody to introduce a possibly + * malicious provider (e.g., one that discloses the private keys passed + * to it) as the highest-priority provider. This would be possible + * because the Security object (which manages the installed providers) + * currently does not check the integrity or authenticity of a provider + * before attaching it.</td> + * </tr> + * + * <tr> * <td>setSystemScope</td> * <td>Setting of the system identity scope</td> * <td>This would allow an attacker to configure the system identity scope with @@ -306,7 +327,6 @@ * @throws NullPointerException if {@code name} is {@code null}. * @throws IllegalArgumentException if {@code name} is empty. */ - public SecurityPermission(String name) { super(name); @@ -323,7 +343,6 @@ * @throws NullPointerException if {@code name} is {@code null}. * @throws IllegalArgumentException if {@code name} is empty. */ - public SecurityPermission(String name, String actions) { super(name, actions);
--- a/jdk/src/share/classes/java/util/ArrayPrefixHelpers.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/ArrayPrefixHelpers.java Wed Jul 05 19:07:19 2017 +0200 @@ -128,6 +128,7 @@ this.lo = lo; this.hi = hi; } + @SuppressWarnings("unchecked") public final void compute() { final BinaryOperator<T> fn; final T[] a; @@ -692,6 +693,4 @@ } } } - - -} \ No newline at end of file +}
--- a/jdk/src/share/classes/java/util/Collections.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Collections.java Wed Jul 05 19:07:19 2017 +0200 @@ -1143,6 +1143,7 @@ public boolean removeIf(Predicate<? super E> filter) { throw new UnsupportedOperationException(); } + @SuppressWarnings("unchecked") @Override public Spliterator<E> spliterator() { return (Spliterator<E>)c.spliterator(); @@ -1900,7 +1901,7 @@ private static final long serialVersionUID = -2239321462712562324L; - EmptyNavigableMap() { super(new TreeMap()); } + EmptyNavigableMap() { super(new TreeMap<K,V>()); } @Override public NavigableSet<K> navigableKeySet() @@ -1928,46 +1929,52 @@ public K ceilingKey(K key) { return nm.ceilingKey(key); } public K higherKey(K key) { return nm.higherKey(key); } + @SuppressWarnings("unchecked") public Entry<K, V> lowerEntry(K key) { Entry<K,V> lower = (Entry<K, V>) nm.lowerEntry(key); return (null != lower) - ? new UnmodifiableEntrySet.UnmodifiableEntry(lower) + ? new UnmodifiableEntrySet.UnmodifiableEntry<>(lower) : null; } + @SuppressWarnings("unchecked") public Entry<K, V> floorEntry(K key) { Entry<K,V> floor = (Entry<K, V>) nm.floorEntry(key); return (null != floor) - ? new UnmodifiableEntrySet.UnmodifiableEntry(floor) + ? new UnmodifiableEntrySet.UnmodifiableEntry<>(floor) : null; } + @SuppressWarnings("unchecked") public Entry<K, V> ceilingEntry(K key) { Entry<K,V> ceiling = (Entry<K, V>) nm.ceilingEntry(key); return (null != ceiling) - ? new UnmodifiableEntrySet.UnmodifiableEntry(ceiling) + ? new UnmodifiableEntrySet.UnmodifiableEntry<>(ceiling) : null; } + @SuppressWarnings("unchecked") public Entry<K, V> higherEntry(K key) { Entry<K,V> higher = (Entry<K, V>) nm.higherEntry(key); return (null != higher) - ? new UnmodifiableEntrySet.UnmodifiableEntry(higher) + ? new UnmodifiableEntrySet.UnmodifiableEntry<>(higher) : null; } + @SuppressWarnings("unchecked") public Entry<K, V> firstEntry() { Entry<K,V> first = (Entry<K, V>) nm.firstEntry(); return (null != first) - ? new UnmodifiableEntrySet.UnmodifiableEntry(first) + ? new UnmodifiableEntrySet.UnmodifiableEntry<>(first) : null; } + @SuppressWarnings("unchecked") public Entry<K, V> lastEntry() { Entry<K,V> last = (Entry<K, V>) nm.lastEntry(); return (null != last) - ? new UnmodifiableEntrySet.UnmodifiableEntry(last) + ? new UnmodifiableEntrySet.UnmodifiableEntry<>(last) : null; } @@ -2360,7 +2367,7 @@ } public NavigableSet<E> tailSet(E fromElement) { synchronized (mutex) { - return new SynchronizedNavigableSet(ns.tailSet(fromElement, true), mutex); + return new SynchronizedNavigableSet<>(ns.tailSet(fromElement, true), mutex); } } @@ -2925,7 +2932,7 @@ public NavigableMap<K, V> descendingMap() { synchronized (mutex) { return - new SynchronizedNavigableMap(nm.descendingMap(), mutex); + new SynchronizedNavigableMap<>(nm.descendingMap(), mutex); } } @@ -2935,13 +2942,13 @@ public NavigableSet<K> navigableKeySet() { synchronized (mutex) { - return new SynchronizedNavigableSet(nm.navigableKeySet(), mutex); + return new SynchronizedNavigableSet<>(nm.navigableKeySet(), mutex); } } public NavigableSet<K> descendingKeySet() { synchronized (mutex) { - return new SynchronizedNavigableSet(nm.descendingKeySet(), mutex); + return new SynchronizedNavigableSet<>(nm.descendingKeySet(), mutex); } } @@ -2959,27 +2966,27 @@ } public SortedMap<K,V> tailMap(K fromKey) { synchronized (mutex) { - return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex); + return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex); } } public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { synchronized (mutex) { - return new SynchronizedNavigableMap( + return new SynchronizedNavigableMap<>( nm.subMap(fromKey, fromInclusive, toKey, toInclusive), mutex); } } public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { synchronized (mutex) { - return new SynchronizedNavigableMap( + return new SynchronizedNavigableMap<>( nm.headMap(toKey, inclusive), mutex); } } public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { synchronized (mutex) { - return new SynchronizedNavigableMap( + return new SynchronizedNavigableMap<>( nm.tailMap(fromKey, inclusive), mutex); } } @@ -4081,7 +4088,7 @@ public Entry<K, V> lowerEntry(K key) { Entry<K,V> lower = nm.lowerEntry(key); return (null != lower) - ? new CheckedMap.CheckedEntrySet.CheckedEntry(lower, valueType) + ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(lower, valueType) : null; } @@ -4090,7 +4097,7 @@ public Entry<K, V> floorEntry(K key) { Entry<K,V> floor = nm.floorEntry(key); return (null != floor) - ? new CheckedMap.CheckedEntrySet.CheckedEntry(floor, valueType) + ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(floor, valueType) : null; } @@ -4099,7 +4106,7 @@ public Entry<K, V> ceilingEntry(K key) { Entry<K,V> ceiling = nm.ceilingEntry(key); return (null != ceiling) - ? new CheckedMap.CheckedEntrySet.CheckedEntry(ceiling, valueType) + ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(ceiling, valueType) : null; } @@ -4108,7 +4115,7 @@ public Entry<K, V> higherEntry(K key) { Entry<K,V> higher = nm.higherEntry(key); return (null != higher) - ? new CheckedMap.CheckedEntrySet.CheckedEntry(higher, valueType) + ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(higher, valueType) : null; } @@ -4117,14 +4124,14 @@ public Entry<K, V> firstEntry() { Entry<K,V> first = nm.firstEntry(); return (null != first) - ? new CheckedMap.CheckedEntrySet.CheckedEntry(first, valueType) + ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(first, valueType) : null; } public Entry<K, V> lastEntry() { Entry<K,V> last = nm.lastEntry(); return (null != last) - ? new CheckedMap.CheckedEntrySet.CheckedEntry(last, valueType) + ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(last, valueType) : null; } @@ -4132,14 +4139,14 @@ Entry<K,V> entry = nm.pollFirstEntry(); return (null == entry) ? null - : new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType); + : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType); } public Entry<K, V> pollLastEntry() { Entry<K,V> entry = nm.pollLastEntry(); return (null == entry) ? null - : new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType); + : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType); } public NavigableMap<K, V> descendingMap() {
--- a/jdk/src/share/classes/java/util/Comparator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Comparator.java Wed Jul 05 19:07:19 2017 +0200 @@ -352,6 +352,7 @@ * @see Comparable * @since 1.8 */ + @SuppressWarnings("unchecked") public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() { return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE; } @@ -374,7 +375,7 @@ * @since 1.8 */ public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) { - return new Comparators.NullComparator(true, comparator); + return new Comparators.NullComparator<>(true, comparator); } /** @@ -395,7 +396,7 @@ * @since 1.8 */ public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) { - return new Comparators.NullComparator(false, comparator); + return new Comparators.NullComparator<>(false, comparator); } /**
--- a/jdk/src/share/classes/java/util/Comparators.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Comparators.java Wed Jul 05 19:07:19 2017 +0200 @@ -87,12 +87,12 @@ @Override public Comparator<T> thenComparing(Comparator<? super T> other) { Objects.requireNonNull(other); - return new NullComparator(nullFirst, real == null ? other : real.thenComparing(other)); + return new NullComparator<>(nullFirst, real == null ? other : real.thenComparing(other)); } @Override public Comparator<T> reversed() { - return new NullComparator(!nullFirst, real == null ? null : real.reversed()); + return new NullComparator<>(!nullFirst, real == null ? null : real.reversed()); } } }
--- a/jdk/src/share/classes/java/util/Deque.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Deque.java Wed Jul 05 19:07:19 2017 +0200 @@ -38,7 +38,7 @@ /** * A linear collection that supports element insertion and removal at * both ends. The name <i>deque</i> is short for "double ended queue" - * and is usually pronounced "deck". Most <tt>Deque</tt> + * and is usually pronounced "deck". Most {@code Deque} * implementations place no fixed limits on the number of elements * they may contain, but this interface supports capacity-restricted * deques as well as those with no fixed size limit. @@ -47,10 +47,10 @@ * ends of the deque. Methods are provided to insert, remove, and * examine the element. Each of these methods exists in two forms: * one throws an exception if the operation fails, the other returns a - * special value (either <tt>null</tt> or <tt>false</tt>, depending on + * special value (either {@code null} or {@code false}, depending on * the operation). The latter form of the insert operation is * designed specifically for use with capacity-restricted - * <tt>Deque</tt> implementations; in most implementations, insert + * {@code Deque} implementations; in most implementations, insert * operations cannot fail. * * <p>The twelve methods described above are summarized in the @@ -58,6 +58,7 @@ * * <p> * <table BORDER CELLPADDING=3 CELLSPACING=1> + * <caption>Summary of Deque methods</caption> * <tr> * <td></td> * <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td> @@ -72,38 +73,39 @@ * </tr> * <tr> * <td><b>Insert</b></td> - * <td>{@link #addFirst addFirst(e)}</td> - * <td>{@link #offerFirst offerFirst(e)}</td> - * <td>{@link #addLast addLast(e)}</td> - * <td>{@link #offerLast offerLast(e)}</td> + * <td>{@link Deque#addFirst addFirst(e)}</td> + * <td>{@link Deque#offerFirst offerFirst(e)}</td> + * <td>{@link Deque#addLast addLast(e)}</td> + * <td>{@link Deque#offerLast offerLast(e)}</td> * </tr> * <tr> * <td><b>Remove</b></td> - * <td>{@link #removeFirst removeFirst()}</td> - * <td>{@link #pollFirst pollFirst()}</td> - * <td>{@link #removeLast removeLast()}</td> - * <td>{@link #pollLast pollLast()}</td> + * <td>{@link Deque#removeFirst removeFirst()}</td> + * <td>{@link Deque#pollFirst pollFirst()}</td> + * <td>{@link Deque#removeLast removeLast()}</td> + * <td>{@link Deque#pollLast pollLast()}</td> * </tr> * <tr> * <td><b>Examine</b></td> - * <td>{@link #getFirst getFirst()}</td> - * <td>{@link #peekFirst peekFirst()}</td> - * <td>{@link #getLast getLast()}</td> - * <td>{@link #peekLast peekLast()}</td> + * <td>{@link Deque#getFirst getFirst()}</td> + * <td>{@link Deque#peekFirst peekFirst()}</td> + * <td>{@link Deque#getLast getLast()}</td> + * <td>{@link Deque#peekLast peekLast()}</td> * </tr> * </table> * * <p>This interface extends the {@link Queue} interface. When a deque is * used as a queue, FIFO (First-In-First-Out) behavior results. Elements are * added at the end of the deque and removed from the beginning. The methods - * inherited from the <tt>Queue</tt> interface are precisely equivalent to - * <tt>Deque</tt> methods as indicated in the following table: + * inherited from the {@code Queue} interface are precisely equivalent to + * {@code Deque} methods as indicated in the following table: * * <p> * <table BORDER CELLPADDING=3 CELLSPACING=1> + * <caption>Comparison of Queue and Deque methods</caption> * <tr> - * <td ALIGN=CENTER> <b><tt>Queue</tt> Method</b></td> - * <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td> + * <td ALIGN=CENTER> <b>{@code Queue} Method</b></td> + * <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td> * </tr> * <tr> * <td>{@link java.util.Queue#add add(e)}</td> @@ -135,13 +137,14 @@ * interface should be used in preference to the legacy {@link Stack} class. * When a deque is used as a stack, elements are pushed and popped from the * beginning of the deque. Stack methods are precisely equivalent to - * <tt>Deque</tt> methods as indicated in the table below: + * {@code Deque} methods as indicated in the table below: * * <p> * <table BORDER CELLPADDING=3 CELLSPACING=1> + * <caption>Comparison of Stack and Deque methods</caption> * <tr> * <td ALIGN=CENTER> <b>Stack Method</b></td> - * <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td> + * <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td> * </tr> * <tr> * <td>{@link #push push(e)}</td> @@ -168,18 +171,18 @@ * <p>Unlike the {@link List} interface, this interface does not * provide support for indexed access to elements. * - * <p>While <tt>Deque</tt> implementations are not strictly required + * <p>While {@code Deque} implementations are not strictly required * to prohibit the insertion of null elements, they are strongly - * encouraged to do so. Users of any <tt>Deque</tt> implementations + * encouraged to do so. Users of any {@code Deque} implementations * that do allow null elements are strongly encouraged <i>not</i> to * take advantage of the ability to insert nulls. This is so because - * <tt>null</tt> is used as a special return value by various methods + * {@code null} is used as a special return value by various methods * to indicated that the deque is empty. * - * <p><tt>Deque</tt> implementations generally do not define - * element-based versions of the <tt>equals</tt> and <tt>hashCode</tt> + * <p>{@code Deque} implementations generally do not define + * element-based versions of the {@code equals} and {@code hashCode} * methods, but instead inherit the identity-based versions from class - * <tt>Object</tt>. + * {@code Object}. * * <p>This interface is a member of the <a * href="{@docRoot}/../technotes/guides/collections/index.html"> Java Collections @@ -190,13 +193,13 @@ * @since 1.6 * @param <E> the type of elements held in this collection */ - public interface Deque<E> extends Queue<E> { /** * Inserts the specified element at the front of this deque if it is - * possible to do so immediately without violating capacity restrictions. - * When using a capacity-restricted deque, it is generally preferable to - * use method {@link #offerFirst}. + * possible to do so immediately without violating capacity restrictions, + * throwing an {@code IllegalStateException} if no space is currently + * available. When using a capacity-restricted deque, it is generally + * preferable to use method {@link #offerFirst}. * * @param e the element to add * @throws IllegalStateException if the element cannot be added at this @@ -212,9 +215,10 @@ /** * Inserts the specified element at the end of this deque if it is - * possible to do so immediately without violating capacity restrictions. - * When using a capacity-restricted deque, it is generally preferable to - * use method {@link #offerLast}. + * possible to do so immediately without violating capacity restrictions, + * throwing an {@code IllegalStateException} if no space is currently + * available. When using a capacity-restricted deque, it is generally + * preferable to use method {@link #offerLast}. * * <p>This method is equivalent to {@link #add}. * @@ -237,8 +241,8 @@ * which can fail to insert an element only by throwing an exception. * * @param e the element to add - * @return <tt>true</tt> if the element was added to this deque, else - * <tt>false</tt> + * @return {@code true} if the element was added to this deque, else + * {@code false} * @throws ClassCastException if the class of the specified element * prevents it from being added to this deque * @throws NullPointerException if the specified element is null and this @@ -255,8 +259,8 @@ * which can fail to insert an element only by throwing an exception. * * @param e the element to add - * @return <tt>true</tt> if the element was added to this deque, else - * <tt>false</tt> + * @return {@code true} if the element was added to this deque, else + * {@code false} * @throws ClassCastException if the class of the specified element * prevents it from being added to this deque * @throws NullPointerException if the specified element is null and this @@ -288,17 +292,17 @@ /** * Retrieves and removes the first element of this deque, - * or returns <tt>null</tt> if this deque is empty. + * or returns {@code null} if this deque is empty. * - * @return the head of this deque, or <tt>null</tt> if this deque is empty + * @return the head of this deque, or {@code null} if this deque is empty */ E pollFirst(); /** * Retrieves and removes the last element of this deque, - * or returns <tt>null</tt> if this deque is empty. + * or returns {@code null} if this deque is empty. * - * @return the tail of this deque, or <tt>null</tt> if this deque is empty + * @return the tail of this deque, or {@code null} if this deque is empty */ E pollLast(); @@ -325,31 +329,31 @@ /** * Retrieves, but does not remove, the first element of this deque, - * or returns <tt>null</tt> if this deque is empty. + * or returns {@code null} if this deque is empty. * - * @return the head of this deque, or <tt>null</tt> if this deque is empty + * @return the head of this deque, or {@code null} if this deque is empty */ E peekFirst(); /** * Retrieves, but does not remove, the last element of this deque, - * or returns <tt>null</tt> if this deque is empty. + * or returns {@code null} if this deque is empty. * - * @return the tail of this deque, or <tt>null</tt> if this deque is empty + * @return the tail of this deque, or {@code null} if this deque is empty */ E peekLast(); /** * Removes the first occurrence of the specified element from this deque. * If the deque does not contain the element, it is unchanged. - * More formally, removes the first element <tt>e</tt> such that + * More formally, removes the first element {@code e} such that * <tt>(o==null ? e==null : o.equals(e))</tt> * (if such an element exists). - * Returns <tt>true</tt> if this deque contained the specified element + * Returns {@code true} if this deque contained the specified element * (or equivalently, if this deque changed as a result of the call). * * @param o element to be removed from this deque, if present - * @return <tt>true</tt> if an element was removed as a result of this call + * @return {@code true} if an element was removed as a result of this call * @throws ClassCastException if the class of the specified element * is incompatible with this deque * (<a href="Collection.html#optional-restrictions">optional</a>) @@ -362,14 +366,14 @@ /** * Removes the last occurrence of the specified element from this deque. * If the deque does not contain the element, it is unchanged. - * More formally, removes the last element <tt>e</tt> such that + * More formally, removes the last element {@code e} such that * <tt>(o==null ? e==null : o.equals(e))</tt> * (if such an element exists). - * Returns <tt>true</tt> if this deque contained the specified element + * Returns {@code true} if this deque contained the specified element * (or equivalently, if this deque changed as a result of the call). * * @param o element to be removed from this deque, if present - * @return <tt>true</tt> if an element was removed as a result of this call + * @return {@code true} if an element was removed as a result of this call * @throws ClassCastException if the class of the specified element * is incompatible with this deque * (<a href="Collection.html#optional-restrictions">optional</a>) @@ -385,15 +389,15 @@ * Inserts the specified element into the queue represented by this deque * (in other words, at the tail of this deque) if it is possible to do so * immediately without violating capacity restrictions, returning - * <tt>true</tt> upon success and throwing an - * <tt>IllegalStateException</tt> if no space is currently available. + * {@code true} upon success and throwing an + * {@code IllegalStateException} if no space is currently available. * When using a capacity-restricted deque, it is generally preferable to * use {@link #offer(Object) offer}. * * <p>This method is equivalent to {@link #addLast}. * * @param e the element to add - * @return <tt>true</tt> (as specified by {@link Collection#add}) + * @return {@code true} (as specified by {@link Collection#add}) * @throws IllegalStateException if the element cannot be added at this * time due to capacity restrictions * @throws ClassCastException if the class of the specified element @@ -409,7 +413,7 @@ * Inserts the specified element into the queue represented by this deque * (in other words, at the tail of this deque) if it is possible to do so * immediately without violating capacity restrictions, returning - * <tt>true</tt> upon success and <tt>false</tt> if no space is currently + * {@code true} upon success and {@code false} if no space is currently * available. When using a capacity-restricted deque, this method is * generally preferable to the {@link #add} method, which can fail to * insert an element only by throwing an exception. @@ -417,8 +421,8 @@ * <p>This method is equivalent to {@link #offerLast}. * * @param e the element to add - * @return <tt>true</tt> if the element was added to this deque, else - * <tt>false</tt> + * @return {@code true} if the element was added to this deque, else + * {@code false} * @throws ClassCastException if the class of the specified element * prevents it from being added to this deque * @throws NullPointerException if the specified element is null and this @@ -444,11 +448,11 @@ /** * Retrieves and removes the head of the queue represented by this deque * (in other words, the first element of this deque), or returns - * <tt>null</tt> if this deque is empty. + * {@code null} if this deque is empty. * * <p>This method is equivalent to {@link #pollFirst()}. * - * @return the first element of this deque, or <tt>null</tt> if + * @return the first element of this deque, or {@code null} if * this deque is empty */ E poll(); @@ -469,12 +473,12 @@ /** * Retrieves, but does not remove, the head of the queue represented by * this deque (in other words, the first element of this deque), or - * returns <tt>null</tt> if this deque is empty. + * returns {@code null} if this deque is empty. * * <p>This method is equivalent to {@link #peekFirst()}. * * @return the head of the queue represented by this deque, or - * <tt>null</tt> if this deque is empty + * {@code null} if this deque is empty */ E peek(); @@ -484,9 +488,8 @@ /** * Pushes an element onto the stack represented by this deque (in other * words, at the head of this deque) if it is possible to do so - * immediately without violating capacity restrictions, returning - * <tt>true</tt> upon success and throwing an - * <tt>IllegalStateException</tt> if no space is currently available. + * immediately without violating capacity restrictions, throwing an + * {@code IllegalStateException} if no space is currently available. * * <p>This method is equivalent to {@link #addFirst}. * @@ -520,16 +523,16 @@ /** * Removes the first occurrence of the specified element from this deque. * If the deque does not contain the element, it is unchanged. - * More formally, removes the first element <tt>e</tt> such that + * More formally, removes the first element {@code e} such that * <tt>(o==null ? e==null : o.equals(e))</tt> * (if such an element exists). - * Returns <tt>true</tt> if this deque contained the specified element + * Returns {@code true} if this deque contained the specified element * (or equivalently, if this deque changed as a result of the call). * - * <p>This method is equivalent to {@link #removeFirstOccurrence}. + * <p>This method is equivalent to {@link #removeFirstOccurrence(Object)}. * * @param o element to be removed from this deque, if present - * @return <tt>true</tt> if an element was removed as a result of this call + * @return {@code true} if an element was removed as a result of this call * @throws ClassCastException if the class of the specified element * is incompatible with this deque * (<a href="Collection.html#optional-restrictions">optional</a>) @@ -540,13 +543,13 @@ boolean remove(Object o); /** - * Returns <tt>true</tt> if this deque contains the specified element. - * More formally, returns <tt>true</tt> if and only if this deque contains - * at least one element <tt>e</tt> such that + * Returns {@code true} if this deque contains the specified element. + * More formally, returns {@code true} if and only if this deque contains + * at least one element {@code e} such that * <tt>(o==null ? e==null : o.equals(e))</tt>. * * @param o element whose presence in this deque is to be tested - * @return <tt>true</tt> if this deque contains the specified element + * @return {@code true} if this deque contains the specified element * @throws ClassCastException if the type of the specified element * is incompatible with this deque * (<a href="Collection.html#optional-restrictions">optional</a>)
--- a/jdk/src/share/classes/java/util/DoubleSummaryStatistics.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/DoubleSummaryStatistics.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,6 +25,7 @@ package java.util; import java.util.function.DoubleConsumer; +import java.util.stream.Collector; /** * A state object for collecting statistics such as count, min, max, sum, and @@ -35,24 +36,24 @@ * summary statistics on a stream of doubles with: * <pre> {@code * DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new, - * DoubleSummaryStatistics::accept, - * DoubleSummaryStatistics::combine); + * DoubleSummaryStatistics::accept, + * DoubleSummaryStatistics::combine); * }</pre> * * <p>{@code DoubleSummaryStatistics} can be used as a - * {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} + * {@linkplain java.util.stream.Stream#collect(Collector) reduction} * target for a {@linkplain java.util.stream.Stream stream}. For example: * * <pre> {@code * DoubleSummaryStatistics stats = people.stream() - * .collect(Collectors.toDoubleSummaryStatistics(Person::getWeight)); + * .collect(Collectors.summarizingDouble(Person::getWeight)); *}</pre> * * This computes, in a single pass, the count of people, as well as the minimum, * maximum, sum, and average of their weights. * * @implNote This implementation is not thread safe. However, it is safe to use - * {@link java.util.stream.Collectors#toDoubleSummaryStatistics(java.util.function.ToDoubleFunction) + * {@link java.util.stream.Collectors#summarizingDouble(java.util.function.ToDoubleFunction) * Collectors.toDoubleStatistics()} on a parallel stream, because the parallel * implementation of {@link java.util.stream.Stream#collect Stream.collect()} * provides the necessary partitioning, isolation, and merging of results for @@ -152,7 +153,7 @@ } /** - * Returns the average of values recorded, or zero if no values have been + * Returns the arithmetic mean of values recorded, or zero if no values have been * recorded. The average returned can vary depending upon the order in * which values are recorded. This is due to accumulated rounding error in * addition of values of differing magnitudes. Values sorted by increasing @@ -160,7 +161,7 @@ * value is a {@code NaN} or the sum is at any point a {@code NaN} then the * average will be {@code NaN}. * - * @return the average of values, or zero if none + * @return the arithmetic mean of values, or zero if none */ public final double getAverage() { return getCount() > 0 ? getSum() / getCount() : 0.0d;
--- a/jdk/src/share/classes/java/util/Formatter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Formatter.java Wed Jul 05 19:07:19 2017 +0200 @@ -626,12 +626,11 @@ * <p> For general argument types, the precision is the maximum number of * characters to be written to the output. * - * <p> For the floating-point conversions {@code 'e'}, {@code 'E'}, and - * {@code 'f'} the precision is the number of digits after the decimal - * separator. If the conversion is {@code 'g'} or {@code 'G'}, then the + * <p> For the floating-point conversions {@code 'a'}, {@code 'A'}, {@code 'e'}, + * {@code 'E'}, and {@code 'f'} the precision is the number of digits after the + * radix point. If the conversion is {@code 'g'} or {@code 'G'}, then the * precision is the total number of digits in the resulting magnitude after - * rounding. If the conversion is {@code 'a'} or {@code 'A'}, then the - * precision must not be specified. + * rounding. * * <p> For character, integral, and date/time argument types and the percent * and line separator conversions, the precision is not applicable; if a @@ -1297,14 +1296,21 @@ * of the significand as a fraction. The exponent is represented by * {@code 'p'} (<tt>'\u0070'</tt>) followed by a decimal string of the * unbiased exponent as if produced by invoking {@link - * Integer#toString(int) Integer.toString} on the exponent value. + * Integer#toString(int) Integer.toString} on the exponent value. If the + * precision is specified, the value is rounded to the given number of + * hexadecimal digits. * * <li> If <i>m</i> is a {@code double} value with a subnormal - * representation then the significand is represented by the characters - * {@code '0x0.'} followed by the hexadecimal representation of the rest - * of the significand as a fraction. The exponent is represented by - * {@code 'p-1022'}. Note that there must be at least one nonzero digit - * in a subnormal significand. + * representation then, unless the precision is specified to be in the range + * 1 through 12, inclusive, the significand is represented by the characters + * {@code '0x0.'} followed by the hexadecimal representation of the rest of + * the significand as a fraction, and the exponent represented by + * {@code 'p-1022'}. If the precision is in the interval + * [1, 12], the subnormal value is normalized such that it + * begins with the characters {@code '0x1.'}, rounded to the number of + * hexadecimal digits of precision, and the exponent adjusted + * accordingly. Note that there must be at least one nonzero digit in a + * subnormal significand. * * </ul> * @@ -1367,7 +1373,7 @@ * {@code 1}. * * <p> If the conversion is {@code 'a'} or {@code 'A'}, then the precision - * is the number of hexadecimal digits after the decimal separator. If the + * is the number of hexadecimal digits after the radix point. If the * precision is not provided, then all of the digits as returned by {@link * Double#toHexString(double)} will be output. *
--- a/jdk/src/share/classes/java/util/HashMap.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/HashMap.java Wed Jul 05 19:07:19 2017 +0200 @@ -876,13 +876,9 @@ private static int roundUpToPowerOf2(int number) { // assert number >= 0 : "number must be non-negative"; - int rounded = number >= MAXIMUM_CAPACITY + return number >= MAXIMUM_CAPACITY ? MAXIMUM_CAPACITY - : (rounded = Integer.highestOneBit(number)) != 0 - ? (Integer.bitCount(number) > 1) ? rounded << 1 : rounded - : 1; - - return rounded; + : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1; } /**
--- a/jdk/src/share/classes/java/util/Hashtable.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Hashtable.java Wed Jul 05 19:07:19 2017 +0200 @@ -928,6 +928,7 @@ return (null == result) ? defaultValue : result; } + @SuppressWarnings("unchecked") @Override public synchronized void forEach(BiConsumer<? super K, ? super V> action) { Objects.requireNonNull(action); // explicit check required in case @@ -947,6 +948,7 @@ } } + @SuppressWarnings("unchecked") @Override public synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { Objects.requireNonNull(function); // explicit check required in case
--- a/jdk/src/share/classes/java/util/IdentityHashMap.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/IdentityHashMap.java Wed Jul 05 19:07:19 2017 +0200 @@ -1339,6 +1339,7 @@ tab[i + 1] = value; } + @SuppressWarnings("unchecked") @Override public void forEach(BiConsumer<? super K, ? super V> action) { Objects.requireNonNull(action); @@ -1357,6 +1358,7 @@ } } + @SuppressWarnings("unchecked") @Override public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { Objects.requireNonNull(function);
--- a/jdk/src/share/classes/java/util/IntSummaryStatistics.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/IntSummaryStatistics.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,6 +25,7 @@ package java.util; import java.util.function.IntConsumer; +import java.util.stream.Collector; /** * A state object for collecting statistics such as count, min, max, sum, and @@ -35,24 +36,24 @@ * summary statistics on a stream of ints with: * <pre> {@code * IntSummaryStatistics stats = intStream.collect(IntSummaryStatistics::new, - * IntSummaryStatistics::accept, - * IntSummaryStatistics::combine); + * IntSummaryStatistics::accept, + * IntSummaryStatistics::combine); * }</pre> * * <p>{@code IntSummaryStatistics} can be used as a - * {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} + * {@linkplain java.util.stream.Stream#collect(Collector) reduction} * target for a {@linkplain java.util.stream.Stream stream}. For example: * * <pre> {@code * IntSummaryStatistics stats = people.stream() - * .collect(Collectors.toIntSummaryStatistics(Person::getDependents)); + * .collect(Collectors.summarizingInt(Person::getDependents)); *}</pre> * * This computes, in a single pass, the count of people, as well as the minimum, * maximum, sum, and average of their number of dependents. * * @implNote This implementation is not thread safe. However, it is safe to use - * {@link java.util.stream.Collectors#toIntSummaryStatistics(java.util.function.ToIntFunction) + * {@link java.util.stream.Collectors#summarizingInt(java.util.function.ToIntFunction) * Collectors.toIntStatistics()} on a parallel stream, because the parallel * implementation of {@link java.util.stream.Stream#collect Stream.collect()} * provides the necessary partitioning, isolation, and merging of results for @@ -140,10 +141,10 @@ } /** - * Returns the average of values recorded, or zero if no values have been + * Returns the arithmetic mean of values recorded, or zero if no values have been * recorded. * - * @return the average of values, or zero if none + * @return the arithmetic mean of values, or zero if none */ public final double getAverage() { return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;
--- a/jdk/src/share/classes/java/util/LongSummaryStatistics.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/LongSummaryStatistics.java Wed Jul 05 19:07:19 2017 +0200 @@ -26,6 +26,7 @@ import java.util.function.IntConsumer; import java.util.function.LongConsumer; +import java.util.stream.Collector; /** * A state object for collecting statistics such as count, min, max, sum, and @@ -36,24 +37,24 @@ * summary statistics on a stream of longs with: * <pre> {@code * LongSummaryStatistics stats = longStream.collect(LongSummaryStatistics::new, - * LongSummaryStatistics::accept, - * LongSummaryStatistics::combine); + * LongSummaryStatistics::accept, + * LongSummaryStatistics::combine); * }</pre> * * <p>{@code LongSummaryStatistics} can be used as a - * {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} + * {@linkplain java.util.stream.Stream#collect(Collector)} reduction} * target for a {@linkplain java.util.stream.Stream stream}. For example: * * <pre> {@code * LongSummaryStatistics stats = people.stream() - * .collect(Collectors.toLongSummaryStatistics(Person::getAge)); + * .collect(Collectors.summarizingLong(Person::getAge)); *}</pre> * * This computes, in a single pass, the count of people, as well as the minimum, - * maximum, sum, and average of their ages in milliseconds. + * maximum, sum, and average of their ages. * * @implNote This implementation is not thread safe. However, it is safe to use - * {@link java.util.stream.Collectors#toLongSummaryStatistics(java.util.function.ToLongFunction) + * {@link java.util.stream.Collectors#summarizingLong(java.util.function.ToLongFunction) * Collectors.toLongStatistics()} on a parallel stream, because the parallel * implementation of {@link java.util.stream.Stream#collect Stream.collect()} * provides the necessary partitioning, isolation, and merging of results for @@ -152,10 +153,10 @@ } /** - * Returns the average of values recorded, or zero if no values have been + * Returns the arithmetic mean of values recorded, or zero if no values have been * recorded. * - * @return The average of values, or zero if none + * @return The arithmetic mean of values, or zero if none */ public final double getAverage() { return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;
--- a/jdk/src/share/classes/java/util/Optional.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Optional.java Wed Jul 05 19:07:19 2017 +0200 @@ -307,7 +307,7 @@ return false; } - Optional other = (Optional) obj; + Optional<?> other = (Optional<?>) obj; return Objects.equals(value, other.value); }
--- a/jdk/src/share/classes/java/util/Queue.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Queue.java Wed Jul 05 19:07:19 2017 +0200 @@ -41,14 +41,15 @@ * queues provide additional insertion, extraction, and inspection * operations. Each of these methods exists in two forms: one throws * an exception if the operation fails, the other returns a special - * value (either <tt>null</tt> or <tt>false</tt>, depending on the + * value (either {@code null} or {@code false}, depending on the * operation). The latter form of the insert operation is designed - * specifically for use with capacity-restricted <tt>Queue</tt> + * specifically for use with capacity-restricted {@code Queue} * implementations; in most implementations, insert operations cannot * fail. * * <p> * <table BORDER CELLPADDING=3 CELLSPACING=1> + * <caption>Summary of Queue methods</caption> * <tr> * <td></td> * <td ALIGN=CENTER><em>Throws exception</em></td> @@ -56,18 +57,18 @@ * </tr> * <tr> * <td><b>Insert</b></td> - * <td>{@link #add add(e)}</td> - * <td>{@link #offer offer(e)}</td> + * <td>{@link Queue#add add(e)}</td> + * <td>{@link Queue#offer offer(e)}</td> * </tr> * <tr> * <td><b>Remove</b></td> - * <td>{@link #remove remove()}</td> - * <td>{@link #poll poll()}</td> + * <td>{@link Queue#remove remove()}</td> + * <td>{@link Queue#poll poll()}</td> * </tr> * <tr> * <td><b>Examine</b></td> - * <td>{@link #element element()}</td> - * <td>{@link #peek peek()}</td> + * <td>{@link Queue#element element()}</td> + * <td>{@link Queue#peek peek()}</td> * </tr> * </table> * @@ -79,15 +80,15 @@ * Whatever the ordering used, the <em>head</em> of the queue is that * element which would be removed by a call to {@link #remove() } or * {@link #poll()}. In a FIFO queue, all new elements are inserted at - * the <em> tail</em> of the queue. Other kinds of queues may use - * different placement rules. Every <tt>Queue</tt> implementation + * the <em>tail</em> of the queue. Other kinds of queues may use + * different placement rules. Every {@code Queue} implementation * must specify its ordering properties. * * <p>The {@link #offer offer} method inserts an element if possible, - * otherwise returning <tt>false</tt>. This differs from the {@link + * otherwise returning {@code false}. This differs from the {@link * java.util.Collection#add Collection.add} method, which can fail to * add an element only by throwing an unchecked exception. The - * <tt>offer</tt> method is designed for use when failure is a normal, + * {@code offer} method is designed for use when failure is a normal, * rather than exceptional occurrence, for example, in fixed-capacity * (or "bounded") queues. * @@ -95,32 +96,32 @@ * return the head of the queue. * Exactly which element is removed from the queue is a * function of the queue's ordering policy, which differs from - * implementation to implementation. The <tt>remove()</tt> and - * <tt>poll()</tt> methods differ only in their behavior when the - * queue is empty: the <tt>remove()</tt> method throws an exception, - * while the <tt>poll()</tt> method returns <tt>null</tt>. + * implementation to implementation. The {@code remove()} and + * {@code poll()} methods differ only in their behavior when the + * queue is empty: the {@code remove()} method throws an exception, + * while the {@code poll()} method returns {@code null}. * * <p>The {@link #element()} and {@link #peek()} methods return, but do * not remove, the head of the queue. * - * <p>The <tt>Queue</tt> interface does not define the <i>blocking queue + * <p>The {@code Queue} interface does not define the <i>blocking queue * methods</i>, which are common in concurrent programming. These methods, * which wait for elements to appear or for space to become available, are * defined in the {@link java.util.concurrent.BlockingQueue} interface, which * extends this interface. * - * <p><tt>Queue</tt> implementations generally do not allow insertion - * of <tt>null</tt> elements, although some implementations, such as - * {@link LinkedList}, do not prohibit insertion of <tt>null</tt>. - * Even in the implementations that permit it, <tt>null</tt> should - * not be inserted into a <tt>Queue</tt>, as <tt>null</tt> is also - * used as a special return value by the <tt>poll</tt> method to + * <p>{@code Queue} implementations generally do not allow insertion + * of {@code null} elements, although some implementations, such as + * {@link LinkedList}, do not prohibit insertion of {@code null}. + * Even in the implementations that permit it, {@code null} should + * not be inserted into a {@code Queue}, as {@code null} is also + * used as a special return value by the {@code poll} method to * indicate that the queue contains no elements. * - * <p><tt>Queue</tt> implementations generally do not define - * element-based versions of methods <tt>equals</tt> and - * <tt>hashCode</tt> but instead inherit the identity based versions - * from class <tt>Object</tt>, because element-based equality is not + * <p>{@code Queue} implementations generally do not define + * element-based versions of methods {@code equals} and + * {@code hashCode} but instead inherit the identity based versions + * from class {@code Object}, because element-based equality is not * always well-defined for queues with the same elements but different * ordering properties. * @@ -145,11 +146,11 @@ /** * Inserts the specified element into this queue if it is possible to do so * immediately without violating capacity restrictions, returning - * <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt> + * {@code true} upon success and throwing an {@code IllegalStateException} * if no space is currently available. * * @param e the element to add - * @return <tt>true</tt> (as specified by {@link Collection#add}) + * @return {@code true} (as specified by {@link Collection#add}) * @throws IllegalStateException if the element cannot be added at this * time due to capacity restrictions * @throws ClassCastException if the class of the specified element @@ -169,8 +170,8 @@ * by throwing an exception. * * @param e the element to add - * @return <tt>true</tt> if the element was added to this queue, else - * <tt>false</tt> + * @return {@code true} if the element was added to this queue, else + * {@code false} * @throws ClassCastException if the class of the specified element * prevents it from being added to this queue * @throws NullPointerException if the specified element is null and @@ -192,9 +193,9 @@ /** * Retrieves and removes the head of this queue, - * or returns <tt>null</tt> if this queue is empty. + * or returns {@code null} if this queue is empty. * - * @return the head of this queue, or <tt>null</tt> if this queue is empty + * @return the head of this queue, or {@code null} if this queue is empty */ E poll(); @@ -210,9 +211,9 @@ /** * Retrieves, but does not remove, the head of this queue, - * or returns <tt>null</tt> if this queue is empty. + * or returns {@code null} if this queue is empty. * - * @return the head of this queue, or <tt>null</tt> if this queue is empty + * @return the head of this queue, or {@code null} if this queue is empty */ E peek(); }
--- a/jdk/src/share/classes/java/util/StringJoiner.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/StringJoiner.java Wed Jul 05 19:07:19 2017 +0200 @@ -49,16 +49,17 @@ * <p> * A {@code StringJoiner} may be employed to create formatted output from a * {@link java.util.stream.Stream} using - * {@link java.util.stream.Collectors#toStringJoiner}. For example: + * {@link java.util.stream.Collectors#joining(CharSequence)}. For example: * * <pre> {@code * List<Integer> numbers = Arrays.asList(1, 2, 3, 4); * String commaSeparatedNumbers = numbers.stream() * .map(i -> i.toString()) - * .collect(Collectors.toStringJoiner(", ")).toString(); + * .collect(Collectors.joining(", ")); * }</pre> * - * @see java.util.stream.Collectors#toStringJoiner + * @see java.util.stream.Collectors#joining(CharSequence) + * @see java.util.stream.Collectors#joining(CharSequence, CharSequence, CharSequence) * @since 1.8 */ public final class StringJoiner {
--- a/jdk/src/share/classes/java/util/Vector.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/Vector.java Wed Jul 05 19:07:19 2017 +0200 @@ -1164,12 +1164,13 @@ if (i >= size) { return; } - final Object[] elementData = Vector.this.elementData; + @SuppressWarnings("unchecked") + final E[] elementData = (E[]) Vector.this.elementData; if (i >= elementData.length) { throw new ConcurrentModificationException(); } while (i != size && modCount == expectedModCount) { - action.accept((E) elementData[i++]); + action.accept(elementData[i++]); } // update once at end of iteration to reduce heap write traffic cursor = i; @@ -1311,8 +1312,8 @@ modCount++; } + @SuppressWarnings("unchecked") @Override - @SuppressWarnings("unchecked") public synchronized void sort(Comparator<? super E> c) { final int expectedModCount = modCount; Arrays.sort((E[]) elementData, 0, elementCount, c);
--- a/jdk/src/share/classes/java/util/WeakHashMap.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/WeakHashMap.java Wed Jul 05 19:07:19 2017 +0200 @@ -1038,6 +1038,7 @@ } } + @SuppressWarnings("unchecked") @Override public void forEach(BiConsumer<? super K, ? super V> action) { Objects.requireNonNull(action); @@ -1059,6 +1060,7 @@ } } + @SuppressWarnings("unchecked") @Override public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { Objects.requireNonNull(function);
--- a/jdk/src/share/classes/java/util/concurrent/CompletableFuture.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/concurrent/CompletableFuture.java Wed Jul 05 19:07:19 2017 +0200 @@ -48,13 +48,16 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import java.util.concurrent.CancellationException; +import java.util.concurrent.CompletionException; +import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; /** * A {@link Future} that may be explicitly completed (setting its - * value and status), and may include dependent functions and actions - * that trigger upon its completion. + * value and status), and may be used as a {@link CompletionStage}, + * supporting dependent functions and actions that trigger upon its + * completion. * * <p>When two or more threads attempt to * {@link #complete complete}, @@ -62,64 +65,50 @@ * {@link #cancel cancel} * a CompletableFuture, only one of them succeeds. * - * <p>Methods are available for adding dependents based on - * user-provided Functions, Consumers, or Runnables. The appropriate - * form to use depends on whether actions require arguments and/or - * produce results. Completion of a dependent action will trigger the - * completion of another CompletableFuture. Actions may also be - * triggered after either or both the current and another - * CompletableFuture complete. Multiple CompletableFutures may also - * be grouped as one using {@link #anyOf(CompletableFuture...)} and - * {@link #allOf(CompletableFuture...)}. + * <p>In addition to these and related methods for directly + * manipulating status and results, CompletableFuture implements + * interface {@link CompletionStage} with the following policies: <ul> * - * <p>CompletableFutures themselves do not execute asynchronously. - * However, actions supplied for dependent completions of another - * CompletableFuture may do so, depending on whether they are provided - * via one of the <em>async</em> methods (that is, methods with names - * of the form <tt><var>xxx</var>Async</tt>). The <em>async</em> - * methods provide a way to commence asynchronous processing of an - * action using either a given {@link Executor} or by default the - * {@link ForkJoinPool#commonPool()}. To simplify monitoring, + * <li>Actions supplied for dependent completions of + * <em>non-async</em> methods may be performed by the thread that + * completes the current CompletableFuture, or by any other caller of + * a completion method.</li> + * + * <li>All <em>async</em> methods without an explicit Executor + * argument are performed using the {@link ForkJoinPool#commonPool()} + * (unless it does not support a parallelism level of at least two, in + * which case, a new Thread is used). To simplify monitoring, * debugging, and tracking, all generated asynchronous tasks are - * instances of the marker interface {@link AsynchronousCompletionTask}. + * instances of the marker interface {@link + * AsynchronousCompletionTask}. </li> * - * <p>Actions supplied for dependent completions of <em>non-async</em> - * methods may be performed by the thread that completes the current - * CompletableFuture, or by any other caller of these methods. There - * are no guarantees about the order of processing completions unless - * constrained by these methods. + * <li>All CompletionStage methods are implemented independently of + * other public methods, so the behavior of one method is not impacted + * by overrides of others in subclasses. </li> </ul> * - * <p>Since (unlike {@link FutureTask}) this class has no direct - * control over the computation that causes it to be completed, - * cancellation is treated as just another form of exceptional completion. - * Method {@link #cancel cancel} has the same effect as - * {@code completeExceptionally(new CancellationException())}. + * <p>CompletableFuture also implements {@link Future} with the following + * policies: <ul> * - * <p>Upon exceptional completion (including cancellation), or when a - * completion entails an additional computation which terminates - * abruptly with an (unchecked) exception or error, then all of their - * dependent completions (and their dependents in turn) generally act - * as {@code completeExceptionally} with a {@link CompletionException} - * holding that exception as its cause. However, the {@link - * #exceptionally exceptionally} and {@link #handle handle} - * completions <em>are</em> able to handle exceptional completions of - * the CompletableFutures they depend on. + * <li>Since (unlike {@link FutureTask}) this class has no direct + * control over the computation that causes it to be completed, + * cancellation is treated as just another form of exceptional + * completion. Method {@link #cancel cancel} has the same effect as + * {@code completeExceptionally(new CancellationException())}. Method + * {@link #isCompletedExceptionally} can be used to determine if a + * CompletableFuture completed in any exceptional fashion.</li> * - * <p>In case of exceptional completion with a CompletionException, + * <li>In case of exceptional completion with a CompletionException, * methods {@link #get()} and {@link #get(long, TimeUnit)} throw an * {@link ExecutionException} with the same cause as held in the - * corresponding CompletionException. However, in these cases, - * methods {@link #join()} and {@link #getNow} throw the - * CompletionException, which simplifies usage. - * - * <p>Arguments used to pass a completion result (that is, for parameters - * of type {@code T}) may be null, but passing a null value for any other - * parameter will result in a {@link NullPointerException} being thrown. + * corresponding CompletionException. To simplify usage in most + * contexts, this class also defines methods {@link #join()} and + * {@link #getNow} that instead throw the CompletionException directly + * in these cases.</li> </ul> * * @author Doug Lea * @since 1.8 */ -public class CompletableFuture<T> implements Future<T> { +public class CompletableFuture<T> implements Future<T>, CompletionStage<T> { /* * Overview: @@ -438,6 +427,19 @@ public final void run() { exec(); } } + /** + * Starts the given async task using the given executor, unless + * the executor is ForkJoinPool.commonPool and it has been + * disabled, in which case starts a new thread. + */ + static void execAsync(Executor e, Async r) { + if (e == ForkJoinPool.commonPool() && + ForkJoinPool.getCommonPoolParallelism() <= 1) + new Thread(r).start(); + else + e.execute(r); + } + static final class AsyncRun extends Async { final Runnable fn; final CompletableFuture<Void> dst; @@ -538,13 +540,13 @@ static final class AsyncAccept<T> extends Async { final T arg; final Consumer<? super T> fn; - final CompletableFuture<Void> dst; + final CompletableFuture<?> dst; AsyncAccept(T arg, Consumer<? super T> fn, - CompletableFuture<Void> dst) { + CompletableFuture<?> dst) { this.arg = arg; this.fn = fn; this.dst = dst; } public final boolean exec() { - CompletableFuture<Void> d; Throwable ex; + CompletableFuture<?> d; Throwable ex; if ((d = this.dst) != null && d.result == null) { try { fn.accept(arg); @@ -563,14 +565,14 @@ final T arg1; final U arg2; final BiConsumer<? super T,? super U> fn; - final CompletableFuture<Void> dst; + final CompletableFuture<?> dst; AsyncAcceptBoth(T arg1, U arg2, BiConsumer<? super T,? super U> fn, - CompletableFuture<Void> dst) { + CompletableFuture<?> dst) { this.arg1 = arg1; this.arg2 = arg2; this.fn = fn; this.dst = dst; } public final boolean exec() { - CompletableFuture<Void> d; Throwable ex; + CompletableFuture<?> d; Throwable ex; if ((d = this.dst) != null && d.result == null) { try { fn.accept(arg1, arg2); @@ -587,10 +589,10 @@ static final class AsyncCompose<T,U> extends Async { final T arg; - final Function<? super T, CompletableFuture<U>> fn; + final Function<? super T, ? extends CompletionStage<U>> fn; final CompletableFuture<U> dst; AsyncCompose(T arg, - Function<? super T, CompletableFuture<U>> fn, + Function<? super T, ? extends CompletionStage<U>> fn, CompletableFuture<U> dst) { this.arg = arg; this.fn = fn; this.dst = dst; } @@ -598,7 +600,8 @@ CompletableFuture<U> d, fr; U u; Throwable ex; if ((d = this.dst) != null && d.result == null) { try { - fr = fn.apply(arg); + CompletionStage<U> cs = fn.apply(arg); + fr = (cs == null) ? null : cs.toCompletableFuture(); ex = (fr == null) ? new NullPointerException() : null; } catch (Throwable rex) { ex = rex; @@ -626,6 +629,33 @@ private static final long serialVersionUID = 5232453952276885070L; } + static final class AsyncWhenComplete<T> extends Async { + final T arg1; + final Throwable arg2; + final BiConsumer<? super T,? super Throwable> fn; + final CompletableFuture<T> dst; + AsyncWhenComplete(T arg1, Throwable arg2, + BiConsumer<? super T,? super Throwable> fn, + CompletableFuture<T> dst) { + this.arg1 = arg1; this.arg2 = arg2; this.fn = fn; this.dst = dst; + } + public final boolean exec() { + CompletableFuture<T> d; + if ((d = this.dst) != null && d.result == null) { + Throwable ex = arg2; + try { + fn.accept(arg1, ex); + } catch (Throwable rex) { + if (ex == null) + ex = rex; + } + d.internalComplete(arg1, ex); + } + return true; + } + private static final long serialVersionUID = 5232453952276885070L; + } + /* ------------- Completions -------------- */ /** @@ -680,7 +710,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncApply<T,U>(t, fn, dst)); + execAsync(e, new AsyncApply<T,U>(t, fn, dst)); else u = fn.apply(t); } catch (Throwable rex) { @@ -697,11 +727,11 @@ static final class ThenAccept<T> extends Completion { final CompletableFuture<? extends T> src; final Consumer<? super T> fn; - final CompletableFuture<Void> dst; + final CompletableFuture<?> dst; final Executor executor; ThenAccept(CompletableFuture<? extends T> src, Consumer<? super T> fn, - CompletableFuture<Void> dst, + CompletableFuture<?> dst, Executor executor) { this.src = src; this.fn = fn; this.dst = dst; this.executor = executor; @@ -709,7 +739,7 @@ public final void run() { final CompletableFuture<? extends T> a; final Consumer<? super T> fn; - final CompletableFuture<Void> dst; + final CompletableFuture<?> dst; Object r; T t; Throwable ex; if ((dst = this.dst) != null && (fn = this.fn) != null && @@ -729,7 +759,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncAccept<T>(t, fn, dst)); + execAsync(e, new AsyncAccept<T>(t, fn, dst)); else fn.accept(t); } catch (Throwable rex) { @@ -773,7 +803,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncRun(fn, dst)); + execAsync(e, new AsyncRun(fn, dst)); else fn.run(); } catch (Throwable rex) { @@ -839,7 +869,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncCombine<T,U,V>(t, u, fn, dst)); + execAsync(e, new AsyncCombine<T,U,V>(t, u, fn, dst)); else v = fn.apply(t, u); } catch (Throwable rex) { @@ -904,7 +934,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncAcceptBoth<T,U>(t, u, fn, dst)); + execAsync(e, new AsyncAcceptBoth<T,U>(t, u, fn, dst)); else fn.accept(t, u); } catch (Throwable rex) { @@ -956,7 +986,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncRun(fn, dst)); + execAsync(e, new AsyncRun(fn, dst)); else fn.run(); } catch (Throwable rex) { @@ -1042,7 +1072,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncApply<T,U>(t, fn, dst)); + execAsync(e, new AsyncApply<T,U>(t, fn, dst)); else u = fn.apply(t); } catch (Throwable rex) { @@ -1095,7 +1125,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncAccept<T>(t, fn, dst)); + execAsync(e, new AsyncAccept<T>(t, fn, dst)); else fn.accept(t); } catch (Throwable rex) { @@ -1143,7 +1173,7 @@ if (ex == null) { try { if (e != null) - e.execute(new AsyncRun(fn, dst)); + execAsync(e, new AsyncRun(fn, dst)); else fn.run(); } catch (Throwable rex) { @@ -1226,6 +1256,54 @@ private static final long serialVersionUID = 5232453952276885070L; } + static final class WhenCompleteCompletion<T> extends Completion { + final CompletableFuture<? extends T> src; + final BiConsumer<? super T, ? super Throwable> fn; + final CompletableFuture<T> dst; + final Executor executor; + WhenCompleteCompletion(CompletableFuture<? extends T> src, + BiConsumer<? super T, ? super Throwable> fn, + CompletableFuture<T> dst, + Executor executor) { + this.src = src; this.fn = fn; this.dst = dst; + this.executor = executor; + } + public final void run() { + final CompletableFuture<? extends T> a; + final BiConsumer<? super T, ? super Throwable> fn; + final CompletableFuture<T> dst; + Object r; T t; Throwable ex; + if ((dst = this.dst) != null && + (fn = this.fn) != null && + (a = this.src) != null && + (r = a.result) != null && + compareAndSet(0, 1)) { + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + Executor e = executor; + Throwable dx = null; + try { + if (e != null) + execAsync(e, new AsyncWhenComplete<T>(t, ex, fn, dst)); + else + fn.accept(t, ex); + } catch (Throwable rex) { + dx = rex; + } + if (e == null || dx != null) + dst.internalComplete(t, ex != null ? ex : dx); + } + } + private static final long serialVersionUID = 5232453952276885070L; + } + static final class ThenCopy<T> extends Completion { final CompletableFuture<?> src; final CompletableFuture<T> dst; @@ -1286,10 +1364,13 @@ final CompletableFuture<? extends T> src; final BiFunction<? super T, Throwable, ? extends U> fn; final CompletableFuture<U> dst; + final Executor executor; HandleCompletion(CompletableFuture<? extends T> src, BiFunction<? super T, Throwable, ? extends U> fn, - CompletableFuture<U> dst) { + CompletableFuture<U> dst, + Executor executor) { this.src = src; this.fn = fn; this.dst = dst; + this.executor = executor; } public final void run() { final CompletableFuture<? extends T> a; @@ -1310,13 +1391,19 @@ @SuppressWarnings("unchecked") T tr = (T) r; t = tr; } - U u = null; Throwable dx = null; + Executor e = executor; + U u = null; + Throwable dx = null; try { - u = fn.apply(t, ex); + if (e != null) + execAsync(e, new AsyncCombine<T,Throwable,U>(t, ex, fn, dst)); + else + u = fn.apply(t, ex); } catch (Throwable rex) { dx = rex; } - dst.internalComplete(u, dx); + if (e == null || dx != null) + dst.internalComplete(u, dx); } } private static final long serialVersionUID = 5232453952276885070L; @@ -1324,11 +1411,11 @@ static final class ThenCompose<T,U> extends Completion { final CompletableFuture<? extends T> src; - final Function<? super T, CompletableFuture<U>> fn; + final Function<? super T, ? extends CompletionStage<U>> fn; final CompletableFuture<U> dst; final Executor executor; ThenCompose(CompletableFuture<? extends T> src, - Function<? super T, CompletableFuture<U>> fn, + Function<? super T, ? extends CompletionStage<U>> fn, CompletableFuture<U> dst, Executor executor) { this.src = src; this.fn = fn; this.dst = dst; @@ -1336,7 +1423,7 @@ } public final void run() { final CompletableFuture<? extends T> a; - final Function<? super T, CompletableFuture<U>> fn; + final Function<? super T, ? extends CompletionStage<U>> fn; final CompletableFuture<U> dst; Object r; T t; Throwable ex; Executor e; if ((dst = this.dst) != null && @@ -1358,10 +1445,12 @@ boolean complete = false; if (ex == null) { if ((e = executor) != null) - e.execute(new AsyncCompose<T,U>(t, fn, dst)); + execAsync(e, new AsyncCompose<T,U>(t, fn, dst)); else { try { - if ((c = fn.apply(t)) == null) + CompletionStage<U> cs = fn.apply(t); + c = (cs == null) ? null : cs.toCompletableFuture(); + if (c == null) ex = new NullPointerException(); } catch (Throwable rex) { ex = rex; @@ -1401,6 +1490,619 @@ private static final long serialVersionUID = 5232453952276885070L; } + // Implementations of stage methods with (plain, async, Executor) forms + + private <U> CompletableFuture<U> doThenApply + (Function<? super T,? extends U> fn, + Executor e) { + if (fn == null) throw new NullPointerException(); + CompletableFuture<U> dst = new CompletableFuture<U>(); + ThenApply<T,U> d = null; + Object r; + if ((r = result) == null) { + CompletionNode p = new CompletionNode + (d = new ThenApply<T,U>(this, fn, dst, e)); + while ((r = result) == null) { + if (UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) + break; + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + T t; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + U u = null; + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncApply<T,U>(t, fn, dst)); + else + u = fn.apply(t); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(u, ex); + } + helpPostComplete(); + return dst; + } + + private CompletableFuture<Void> doThenAccept(Consumer<? super T> fn, + Executor e) { + if (fn == null) throw new NullPointerException(); + CompletableFuture<Void> dst = new CompletableFuture<Void>(); + ThenAccept<T> d = null; + Object r; + if ((r = result) == null) { + CompletionNode p = new CompletionNode + (d = new ThenAccept<T>(this, fn, dst, e)); + while ((r = result) == null) { + if (UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) + break; + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + T t; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncAccept<T>(t, fn, dst)); + else + fn.accept(t); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(null, ex); + } + helpPostComplete(); + return dst; + } + + private CompletableFuture<Void> doThenRun(Runnable action, + Executor e) { + if (action == null) throw new NullPointerException(); + CompletableFuture<Void> dst = new CompletableFuture<Void>(); + ThenRun d = null; + Object r; + if ((r = result) == null) { + CompletionNode p = new CompletionNode + (d = new ThenRun(this, action, dst, e)); + while ((r = result) == null) { + if (UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) + break; + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + Throwable ex; + if (r instanceof AltResult) + ex = ((AltResult)r).ex; + else + ex = null; + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncRun(action, dst)); + else + action.run(); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(null, ex); + } + helpPostComplete(); + return dst; + } + + private <U,V> CompletableFuture<V> doThenCombine + (CompletableFuture<? extends U> other, + BiFunction<? super T,? super U,? extends V> fn, + Executor e) { + if (other == null || fn == null) throw new NullPointerException(); + CompletableFuture<V> dst = new CompletableFuture<V>(); + ThenCombine<T,U,V> d = null; + Object r, s = null; + if ((r = result) == null || (s = other.result) == null) { + d = new ThenCombine<T,U,V>(this, other, fn, dst, e); + CompletionNode q = null, p = new CompletionNode(d); + while ((r == null && (r = result) == null) || + (s == null && (s = other.result) == null)) { + if (q != null) { + if (s != null || + UNSAFE.compareAndSwapObject + (other, COMPLETIONS, q.next = other.completions, q)) + break; + } + else if (r != null || + UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) { + if (s != null) + break; + q = new CompletionNode(d); + } + } + } + if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) { + T t; U u; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + if (ex != null) + u = null; + else if (s instanceof AltResult) { + ex = ((AltResult)s).ex; + u = null; + } + else { + @SuppressWarnings("unchecked") U us = (U) s; + u = us; + } + V v = null; + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncCombine<T,U,V>(t, u, fn, dst)); + else + v = fn.apply(t, u); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(v, ex); + } + helpPostComplete(); + other.helpPostComplete(); + return dst; + } + + private <U> CompletableFuture<Void> doThenAcceptBoth + (CompletableFuture<? extends U> other, + BiConsumer<? super T,? super U> fn, + Executor e) { + if (other == null || fn == null) throw new NullPointerException(); + CompletableFuture<Void> dst = new CompletableFuture<Void>(); + ThenAcceptBoth<T,U> d = null; + Object r, s = null; + if ((r = result) == null || (s = other.result) == null) { + d = new ThenAcceptBoth<T,U>(this, other, fn, dst, e); + CompletionNode q = null, p = new CompletionNode(d); + while ((r == null && (r = result) == null) || + (s == null && (s = other.result) == null)) { + if (q != null) { + if (s != null || + UNSAFE.compareAndSwapObject + (other, COMPLETIONS, q.next = other.completions, q)) + break; + } + else if (r != null || + UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) { + if (s != null) + break; + q = new CompletionNode(d); + } + } + } + if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) { + T t; U u; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + if (ex != null) + u = null; + else if (s instanceof AltResult) { + ex = ((AltResult)s).ex; + u = null; + } + else { + @SuppressWarnings("unchecked") U us = (U) s; + u = us; + } + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncAcceptBoth<T,U>(t, u, fn, dst)); + else + fn.accept(t, u); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(null, ex); + } + helpPostComplete(); + other.helpPostComplete(); + return dst; + } + + private CompletableFuture<Void> doRunAfterBoth(CompletableFuture<?> other, + Runnable action, + Executor e) { + if (other == null || action == null) throw new NullPointerException(); + CompletableFuture<Void> dst = new CompletableFuture<Void>(); + RunAfterBoth d = null; + Object r, s = null; + if ((r = result) == null || (s = other.result) == null) { + d = new RunAfterBoth(this, other, action, dst, e); + CompletionNode q = null, p = new CompletionNode(d); + while ((r == null && (r = result) == null) || + (s == null && (s = other.result) == null)) { + if (q != null) { + if (s != null || + UNSAFE.compareAndSwapObject + (other, COMPLETIONS, q.next = other.completions, q)) + break; + } + else if (r != null || + UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) { + if (s != null) + break; + q = new CompletionNode(d); + } + } + } + if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) { + Throwable ex; + if (r instanceof AltResult) + ex = ((AltResult)r).ex; + else + ex = null; + if (ex == null && (s instanceof AltResult)) + ex = ((AltResult)s).ex; + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncRun(action, dst)); + else + action.run(); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(null, ex); + } + helpPostComplete(); + other.helpPostComplete(); + return dst; + } + + private <U> CompletableFuture<U> doApplyToEither + (CompletableFuture<? extends T> other, + Function<? super T, U> fn, + Executor e) { + if (other == null || fn == null) throw new NullPointerException(); + CompletableFuture<U> dst = new CompletableFuture<U>(); + ApplyToEither<T,U> d = null; + Object r; + if ((r = result) == null && (r = other.result) == null) { + d = new ApplyToEither<T,U>(this, other, fn, dst, e); + CompletionNode q = null, p = new CompletionNode(d); + while ((r = result) == null && (r = other.result) == null) { + if (q != null) { + if (UNSAFE.compareAndSwapObject + (other, COMPLETIONS, q.next = other.completions, q)) + break; + } + else if (UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) + q = new CompletionNode(d); + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + T t; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + U u = null; + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncApply<T,U>(t, fn, dst)); + else + u = fn.apply(t); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(u, ex); + } + helpPostComplete(); + other.helpPostComplete(); + return dst; + } + + private CompletableFuture<Void> doAcceptEither + (CompletableFuture<? extends T> other, + Consumer<? super T> fn, + Executor e) { + if (other == null || fn == null) throw new NullPointerException(); + CompletableFuture<Void> dst = new CompletableFuture<Void>(); + AcceptEither<T> d = null; + Object r; + if ((r = result) == null && (r = other.result) == null) { + d = new AcceptEither<T>(this, other, fn, dst, e); + CompletionNode q = null, p = new CompletionNode(d); + while ((r = result) == null && (r = other.result) == null) { + if (q != null) { + if (UNSAFE.compareAndSwapObject + (other, COMPLETIONS, q.next = other.completions, q)) + break; + } + else if (UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) + q = new CompletionNode(d); + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + T t; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncAccept<T>(t, fn, dst)); + else + fn.accept(t); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(null, ex); + } + helpPostComplete(); + other.helpPostComplete(); + return dst; + } + + private CompletableFuture<Void> doRunAfterEither + (CompletableFuture<?> other, + Runnable action, + Executor e) { + if (other == null || action == null) throw new NullPointerException(); + CompletableFuture<Void> dst = new CompletableFuture<Void>(); + RunAfterEither d = null; + Object r; + if ((r = result) == null && (r = other.result) == null) { + d = new RunAfterEither(this, other, action, dst, e); + CompletionNode q = null, p = new CompletionNode(d); + while ((r = result) == null && (r = other.result) == null) { + if (q != null) { + if (UNSAFE.compareAndSwapObject + (other, COMPLETIONS, q.next = other.completions, q)) + break; + } + else if (UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) + q = new CompletionNode(d); + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + Throwable ex; + if (r instanceof AltResult) + ex = ((AltResult)r).ex; + else + ex = null; + if (ex == null) { + try { + if (e != null) + execAsync(e, new AsyncRun(action, dst)); + else + action.run(); + } catch (Throwable rex) { + ex = rex; + } + } + if (e == null || ex != null) + dst.internalComplete(null, ex); + } + helpPostComplete(); + other.helpPostComplete(); + return dst; + } + + private <U> CompletableFuture<U> doThenCompose + (Function<? super T, ? extends CompletionStage<U>> fn, + Executor e) { + if (fn == null) throw new NullPointerException(); + CompletableFuture<U> dst = null; + ThenCompose<T,U> d = null; + Object r; + if ((r = result) == null) { + dst = new CompletableFuture<U>(); + CompletionNode p = new CompletionNode + (d = new ThenCompose<T,U>(this, fn, dst, e)); + while ((r = result) == null) { + if (UNSAFE.compareAndSwapObject + (this, COMPLETIONS, p.next = completions, p)) + break; + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + T t; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + if (ex == null) { + if (e != null) { + if (dst == null) + dst = new CompletableFuture<U>(); + execAsync(e, new AsyncCompose<T,U>(t, fn, dst)); + } + else { + try { + CompletionStage<U> cs = fn.apply(t); + if (cs == null || + (dst = cs.toCompletableFuture()) == null) + ex = new NullPointerException(); + } catch (Throwable rex) { + ex = rex; + } + } + } + if (dst == null) + dst = new CompletableFuture<U>(); + if (e == null || ex != null) + dst.internalComplete(null, ex); + } + helpPostComplete(); + dst.helpPostComplete(); + return dst; + } + + private CompletableFuture<T> doWhenComplete + (BiConsumer<? super T, ? super Throwable> fn, + Executor e) { + if (fn == null) throw new NullPointerException(); + CompletableFuture<T> dst = new CompletableFuture<T>(); + WhenCompleteCompletion<T> d = null; + Object r; + if ((r = result) == null) { + CompletionNode p = + new CompletionNode(d = new WhenCompleteCompletion<T> + (this, fn, dst, e)); + while ((r = result) == null) { + if (UNSAFE.compareAndSwapObject(this, COMPLETIONS, + p.next = completions, p)) + break; + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + T t; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + Throwable dx = null; + try { + if (e != null) + execAsync(e, new AsyncWhenComplete<T>(t, ex, fn, dst)); + else + fn.accept(t, ex); + } catch (Throwable rex) { + dx = rex; + } + if (e == null || dx != null) + dst.internalComplete(t, ex != null ? ex : dx); + } + helpPostComplete(); + return dst; + } + + private <U> CompletableFuture<U> doHandle + (BiFunction<? super T, Throwable, ? extends U> fn, + Executor e) { + if (fn == null) throw new NullPointerException(); + CompletableFuture<U> dst = new CompletableFuture<U>(); + HandleCompletion<T,U> d = null; + Object r; + if ((r = result) == null) { + CompletionNode p = + new CompletionNode(d = new HandleCompletion<T,U> + (this, fn, dst, e)); + while ((r = result) == null) { + if (UNSAFE.compareAndSwapObject(this, COMPLETIONS, + p.next = completions, p)) + break; + } + } + if (r != null && (d == null || d.compareAndSet(0, 1))) { + T t; Throwable ex; + if (r instanceof AltResult) { + ex = ((AltResult)r).ex; + t = null; + } + else { + ex = null; + @SuppressWarnings("unchecked") T tr = (T) r; + t = tr; + } + U u = null; + Throwable dx = null; + try { + if (e != null) + execAsync(e, new AsyncCombine<T,Throwable,U>(t, ex, fn, dst)); + else { + u = fn.apply(t, ex); + dx = null; + } + } catch (Throwable rex) { + dx = rex; + u = null; + } + if (e == null || dx != null) + dst.internalComplete(u, dx); + } + helpPostComplete(); + return dst; + } + + // public methods /** @@ -1416,13 +2118,13 @@ * * @param supplier a function returning the value to be used * to complete the returned CompletableFuture + * @param <U> the function's return type * @return the new CompletableFuture */ public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) { if (supplier == null) throw new NullPointerException(); CompletableFuture<U> f = new CompletableFuture<U>(); - ForkJoinPool.commonPool(). - execute((ForkJoinTask<?>)new AsyncSupply<U>(supplier, f)); + execAsync(ForkJoinPool.commonPool(), new AsyncSupply<U>(supplier, f)); return f; } @@ -1434,6 +2136,7 @@ * @param supplier a function returning the value to be used * to complete the returned CompletableFuture * @param executor the executor to use for asynchronous execution + * @param <U> the function's return type * @return the new CompletableFuture */ public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, @@ -1441,7 +2144,7 @@ if (executor == null || supplier == null) throw new NullPointerException(); CompletableFuture<U> f = new CompletableFuture<U>(); - executor.execute(new AsyncSupply<U>(supplier, f)); + execAsync(executor, new AsyncSupply<U>(supplier, f)); return f; } @@ -1457,8 +2160,7 @@ public static CompletableFuture<Void> runAsync(Runnable runnable) { if (runnable == null) throw new NullPointerException(); CompletableFuture<Void> f = new CompletableFuture<Void>(); - ForkJoinPool.commonPool(). - execute((ForkJoinTask<?>)new AsyncRun(runnable, f)); + execAsync(ForkJoinPool.commonPool(), new AsyncRun(runnable, f)); return f; } @@ -1477,7 +2179,7 @@ if (executor == null || runnable == null) throw new NullPointerException(); CompletableFuture<Void> f = new CompletableFuture<Void>(); - executor.execute(new AsyncRun(runnable, f)); + execAsync(executor, new AsyncRun(runnable, f)); return f; } @@ -1486,6 +2188,7 @@ * the given value. * * @param value the value + * @param <U> the type of the value * @return the completed CompletableFuture */ public static <U> CompletableFuture<U> completedFuture(U value) { @@ -1657,60 +2360,18 @@ return triggered; } - /** - * Returns a new CompletableFuture that is completed - * when this CompletableFuture completes, with the result of the - * given function of this CompletableFuture's result. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied function throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @return the new CompletableFuture - */ - public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) { + // CompletionStage methods + + public <U> CompletableFuture<U> thenApply + (Function<? super T,? extends U> fn) { return doThenApply(fn, null); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when this CompletableFuture completes, with the result of the - * given function of this CompletableFuture's result from a - * task running in the {@link ForkJoinPool#commonPool()}. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied function throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @return the new CompletableFuture - */ public <U> CompletableFuture<U> thenApplyAsync (Function<? super T,? extends U> fn) { return doThenApply(fn, ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when this CompletableFuture completes, with the result of the - * given function of this CompletableFuture's result from a - * task running in the given executor. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied function throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ public <U> CompletableFuture<U> thenApplyAsync (Function<? super T,? extends U> fn, Executor executor) { @@ -1718,1149 +2379,228 @@ return doThenApply(fn, executor); } - private <U> CompletableFuture<U> doThenApply - (Function<? super T,? extends U> fn, - Executor e) { - if (fn == null) throw new NullPointerException(); - CompletableFuture<U> dst = new CompletableFuture<U>(); - ThenApply<T,U> d = null; - Object r; - if ((r = result) == null) { - CompletionNode p = new CompletionNode - (d = new ThenApply<T,U>(this, fn, dst, e)); - while ((r = result) == null) { - if (UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) - break; - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - T t; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - U u = null; - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncApply<T,U>(t, fn, dst)); - else - u = fn.apply(t); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(u, ex); - } - helpPostComplete(); - return dst; + public CompletableFuture<Void> thenAccept + (Consumer<? super T> action) { + return doThenAccept(action, null); } - /** - * Returns a new CompletableFuture that is completed - * when this CompletableFuture completes, after performing the given - * action with this CompletableFuture's result. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied action throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param block the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> thenAccept(Consumer<? super T> block) { - return doThenAccept(block, null); + public CompletableFuture<Void> thenAcceptAsync + (Consumer<? super T> action) { + return doThenAccept(action, ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when this CompletableFuture completes, after performing the given - * action with this CompletableFuture's result from a task running - * in the {@link ForkJoinPool#commonPool()}. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied action throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param block the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> block) { - return doThenAccept(block, ForkJoinPool.commonPool()); - } - - /** - * Returns a new CompletableFuture that is asynchronously completed - * when this CompletableFuture completes, after performing the given - * action with this CompletableFuture's result from a task running - * in the given executor. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied action throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param block the action to perform before completing the - * returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ - public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> block, - Executor executor) { + public CompletableFuture<Void> thenAcceptAsync + (Consumer<? super T> action, + Executor executor) { if (executor == null) throw new NullPointerException(); - return doThenAccept(block, executor); + return doThenAccept(action, executor); } - private CompletableFuture<Void> doThenAccept(Consumer<? super T> fn, - Executor e) { - if (fn == null) throw new NullPointerException(); - CompletableFuture<Void> dst = new CompletableFuture<Void>(); - ThenAccept<T> d = null; - Object r; - if ((r = result) == null) { - CompletionNode p = new CompletionNode - (d = new ThenAccept<T>(this, fn, dst, e)); - while ((r = result) == null) { - if (UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) - break; - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - T t; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncAccept<T>(t, fn, dst)); - else - fn.accept(t); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(null, ex); - } - helpPostComplete(); - return dst; - } - - /** - * Returns a new CompletableFuture that is completed - * when this CompletableFuture completes, after performing the given - * action. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied action throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param action the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> thenRun(Runnable action) { + public CompletableFuture<Void> thenRun + (Runnable action) { return doThenRun(action, null); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when this CompletableFuture completes, after performing the given - * action from a task running in the {@link ForkJoinPool#commonPool()}. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied action throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param action the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> thenRunAsync(Runnable action) { + public CompletableFuture<Void> thenRunAsync + (Runnable action) { return doThenRun(action, ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when this CompletableFuture completes, after performing the given - * action from a task running in the given executor. - * - * <p>If this CompletableFuture completes exceptionally, or the - * supplied action throws an exception, then the returned - * CompletableFuture completes exceptionally with a - * CompletionException holding the exception as its cause. - * - * @param action the action to perform before completing the - * returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ - public CompletableFuture<Void> thenRunAsync(Runnable action, - Executor executor) { + public CompletableFuture<Void> thenRunAsync + (Runnable action, + Executor executor) { if (executor == null) throw new NullPointerException(); return doThenRun(action, executor); } - private CompletableFuture<Void> doThenRun(Runnable action, - Executor e) { - if (action == null) throw new NullPointerException(); - CompletableFuture<Void> dst = new CompletableFuture<Void>(); - ThenRun d = null; - Object r; - if ((r = result) == null) { - CompletionNode p = new CompletionNode - (d = new ThenRun(this, action, dst, e)); - while ((r = result) == null) { - if (UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) - break; - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - Throwable ex; - if (r instanceof AltResult) - ex = ((AltResult)r).ex; - else - ex = null; - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncRun(action, dst)); - else - action.run(); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(null, ex); - } - helpPostComplete(); - return dst; + public <U,V> CompletableFuture<V> thenCombine + (CompletionStage<? extends U> other, + BiFunction<? super T,? super U,? extends V> fn) { + return doThenCombine(other.toCompletableFuture(), fn, null); } - /** - * Returns a new CompletableFuture that is completed - * when both this and the other given CompletableFuture complete, - * with the result of the given function of the results of the two - * CompletableFutures. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied function throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @return the new CompletableFuture - */ - public <U,V> CompletableFuture<V> thenCombine - (CompletableFuture<? extends U> other, + public <U,V> CompletableFuture<V> thenCombineAsync + (CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn) { - return doThenCombine(other, fn, null); + return doThenCombine(other.toCompletableFuture(), fn, + ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when both this and the other given CompletableFuture complete, - * with the result of the given function of the results of the two - * CompletableFutures from a task running in the - * {@link ForkJoinPool#commonPool()}. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied function throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @return the new CompletableFuture - */ public <U,V> CompletableFuture<V> thenCombineAsync - (CompletableFuture<? extends U> other, - BiFunction<? super T,? super U,? extends V> fn) { - return doThenCombine(other, fn, ForkJoinPool.commonPool()); - } - - /** - * Returns a new CompletableFuture that is asynchronously completed - * when both this and the other given CompletableFuture complete, - * with the result of the given function of the results of the two - * CompletableFutures from a task running in the given executor. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied function throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ - public <U,V> CompletableFuture<V> thenCombineAsync - (CompletableFuture<? extends U> other, + (CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn, Executor executor) { if (executor == null) throw new NullPointerException(); - return doThenCombine(other, fn, executor); + return doThenCombine(other.toCompletableFuture(), fn, executor); + } + + public <U> CompletableFuture<Void> thenAcceptBoth + (CompletionStage<? extends U> other, + BiConsumer<? super T, ? super U> action) { + return doThenAcceptBoth(other.toCompletableFuture(), action, null); } - private <U,V> CompletableFuture<V> doThenCombine - (CompletableFuture<? extends U> other, - BiFunction<? super T,? super U,? extends V> fn, - Executor e) { - if (other == null || fn == null) throw new NullPointerException(); - CompletableFuture<V> dst = new CompletableFuture<V>(); - ThenCombine<T,U,V> d = null; - Object r, s = null; - if ((r = result) == null || (s = other.result) == null) { - d = new ThenCombine<T,U,V>(this, other, fn, dst, e); - CompletionNode q = null, p = new CompletionNode(d); - while ((r == null && (r = result) == null) || - (s == null && (s = other.result) == null)) { - if (q != null) { - if (s != null || - UNSAFE.compareAndSwapObject - (other, COMPLETIONS, q.next = other.completions, q)) - break; - } - else if (r != null || - UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) { - if (s != null) - break; - q = new CompletionNode(d); - } - } - } - if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) { - T t; U u; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - if (ex != null) - u = null; - else if (s instanceof AltResult) { - ex = ((AltResult)s).ex; - u = null; - } - else { - @SuppressWarnings("unchecked") U us = (U) s; - u = us; - } - V v = null; - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncCombine<T,U,V>(t, u, fn, dst)); - else - v = fn.apply(t, u); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(v, ex); - } - helpPostComplete(); - other.helpPostComplete(); - return dst; + public <U> CompletableFuture<Void> thenAcceptBothAsync + (CompletionStage<? extends U> other, + BiConsumer<? super T, ? super U> action) { + return doThenAcceptBoth(other.toCompletableFuture(), action, + ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is completed - * when both this and the other given CompletableFuture complete, - * after performing the given action with the results of the two - * CompletableFutures. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied action throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param block the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public <U> CompletableFuture<Void> thenAcceptBoth - (CompletableFuture<? extends U> other, - BiConsumer<? super T, ? super U> block) { - return doThenAcceptBoth(other, block, null); + public <U> CompletableFuture<Void> thenAcceptBothAsync + (CompletionStage<? extends U> other, + BiConsumer<? super T, ? super U> action, + Executor executor) { + if (executor == null) throw new NullPointerException(); + return doThenAcceptBoth(other.toCompletableFuture(), action, executor); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when both this and the other given CompletableFuture complete, - * after performing the given action with the results of the two - * CompletableFutures from a task running in the {@link - * ForkJoinPool#commonPool()}. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied action throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param block the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public <U> CompletableFuture<Void> thenAcceptBothAsync - (CompletableFuture<? extends U> other, - BiConsumer<? super T, ? super U> block) { - return doThenAcceptBoth(other, block, ForkJoinPool.commonPool()); - } - - /** - * Returns a new CompletableFuture that is asynchronously completed - * when both this and the other given CompletableFuture complete, - * after performing the given action with the results of the two - * CompletableFutures from a task running in the given executor. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied action throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param block the action to perform before completing the - * returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ - public <U> CompletableFuture<Void> thenAcceptBothAsync - (CompletableFuture<? extends U> other, - BiConsumer<? super T, ? super U> block, - Executor executor) { - if (executor == null) throw new NullPointerException(); - return doThenAcceptBoth(other, block, executor); + public CompletableFuture<Void> runAfterBoth + (CompletionStage<?> other, + Runnable action) { + return doRunAfterBoth(other.toCompletableFuture(), action, null); } - private <U> CompletableFuture<Void> doThenAcceptBoth - (CompletableFuture<? extends U> other, - BiConsumer<? super T,? super U> fn, - Executor e) { - if (other == null || fn == null) throw new NullPointerException(); - CompletableFuture<Void> dst = new CompletableFuture<Void>(); - ThenAcceptBoth<T,U> d = null; - Object r, s = null; - if ((r = result) == null || (s = other.result) == null) { - d = new ThenAcceptBoth<T,U>(this, other, fn, dst, e); - CompletionNode q = null, p = new CompletionNode(d); - while ((r == null && (r = result) == null) || - (s == null && (s = other.result) == null)) { - if (q != null) { - if (s != null || - UNSAFE.compareAndSwapObject - (other, COMPLETIONS, q.next = other.completions, q)) - break; - } - else if (r != null || - UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) { - if (s != null) - break; - q = new CompletionNode(d); - } - } - } - if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) { - T t; U u; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - if (ex != null) - u = null; - else if (s instanceof AltResult) { - ex = ((AltResult)s).ex; - u = null; - } - else { - @SuppressWarnings("unchecked") U us = (U) s; - u = us; - } - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncAcceptBoth<T,U>(t, u, fn, dst)); - else - fn.accept(t, u); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(null, ex); - } - helpPostComplete(); - other.helpPostComplete(); - return dst; + public CompletableFuture<Void> runAfterBothAsync + (CompletionStage<?> other, + Runnable action) { + return doRunAfterBoth(other.toCompletableFuture(), action, + ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is completed - * when both this and the other given CompletableFuture complete, - * after performing the given action. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied action throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param action the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> runAfterBoth(CompletableFuture<?> other, - Runnable action) { - return doRunAfterBoth(other, action, null); - } - - /** - * Returns a new CompletableFuture that is asynchronously completed - * when both this and the other given CompletableFuture complete, - * after performing the given action from a task running in the - * {@link ForkJoinPool#commonPool()}. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied action throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param action the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> runAfterBothAsync(CompletableFuture<?> other, - Runnable action) { - return doRunAfterBoth(other, action, ForkJoinPool.commonPool()); + public CompletableFuture<Void> runAfterBothAsync + (CompletionStage<?> other, + Runnable action, + Executor executor) { + if (executor == null) throw new NullPointerException(); + return doRunAfterBoth(other.toCompletableFuture(), action, executor); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when both this and the other given CompletableFuture complete, - * after performing the given action from a task running in the - * given executor. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, or the supplied action throws an exception, - * then the returned CompletableFuture completes exceptionally - * with a CompletionException holding the exception as its cause. - * - * @param other the other CompletableFuture - * @param action the action to perform before completing the - * returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ - public CompletableFuture<Void> runAfterBothAsync(CompletableFuture<?> other, - Runnable action, - Executor executor) { - if (executor == null) throw new NullPointerException(); - return doRunAfterBoth(other, action, executor); - } - private CompletableFuture<Void> doRunAfterBoth(CompletableFuture<?> other, - Runnable action, - Executor e) { - if (other == null || action == null) throw new NullPointerException(); - CompletableFuture<Void> dst = new CompletableFuture<Void>(); - RunAfterBoth d = null; - Object r, s = null; - if ((r = result) == null || (s = other.result) == null) { - d = new RunAfterBoth(this, other, action, dst, e); - CompletionNode q = null, p = new CompletionNode(d); - while ((r == null && (r = result) == null) || - (s == null && (s = other.result) == null)) { - if (q != null) { - if (s != null || - UNSAFE.compareAndSwapObject - (other, COMPLETIONS, q.next = other.completions, q)) - break; - } - else if (r != null || - UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) { - if (s != null) - break; - q = new CompletionNode(d); - } - } - } - if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) { - Throwable ex; - if (r instanceof AltResult) - ex = ((AltResult)r).ex; - else - ex = null; - if (ex == null && (s instanceof AltResult)) - ex = ((AltResult)s).ex; - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncRun(action, dst)); - else - action.run(); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(null, ex); - } - helpPostComplete(); - other.helpPostComplete(); - return dst; + public <U> CompletableFuture<U> applyToEither + (CompletionStage<? extends T> other, + Function<? super T, U> fn) { + return doApplyToEither(other.toCompletableFuture(), fn, null); } - /** - * Returns a new CompletableFuture that is completed - * when either this or the other given CompletableFuture completes, - * with the result of the given function of either this or the other - * CompletableFuture's result. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied function - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @return the new CompletableFuture - */ - public <U> CompletableFuture<U> applyToEither - (CompletableFuture<? extends T> other, + public <U> CompletableFuture<U> applyToEitherAsync + (CompletionStage<? extends T> other, Function<? super T, U> fn) { - return doApplyToEither(other, fn, null); + return doApplyToEither(other.toCompletableFuture(), fn, + ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when either this or the other given CompletableFuture completes, - * with the result of the given function of either this or the other - * CompletableFuture's result from a task running in the - * {@link ForkJoinPool#commonPool()}. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied function - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @return the new CompletableFuture - */ public <U> CompletableFuture<U> applyToEitherAsync - (CompletableFuture<? extends T> other, - Function<? super T, U> fn) { - return doApplyToEither(other, fn, ForkJoinPool.commonPool()); - } - - /** - * Returns a new CompletableFuture that is asynchronously completed - * when either this or the other given CompletableFuture completes, - * with the result of the given function of either this or the other - * CompletableFuture's result from a task running in the - * given executor. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied function - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param fn the function to use to compute the value of - * the returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ - public <U> CompletableFuture<U> applyToEitherAsync - (CompletableFuture<? extends T> other, + (CompletionStage<? extends T> other, Function<? super T, U> fn, Executor executor) { if (executor == null) throw new NullPointerException(); - return doApplyToEither(other, fn, executor); + return doApplyToEither(other.toCompletableFuture(), fn, executor); } - private <U> CompletableFuture<U> doApplyToEither - (CompletableFuture<? extends T> other, - Function<? super T, U> fn, - Executor e) { - if (other == null || fn == null) throw new NullPointerException(); - CompletableFuture<U> dst = new CompletableFuture<U>(); - ApplyToEither<T,U> d = null; - Object r; - if ((r = result) == null && (r = other.result) == null) { - d = new ApplyToEither<T,U>(this, other, fn, dst, e); - CompletionNode q = null, p = new CompletionNode(d); - while ((r = result) == null && (r = other.result) == null) { - if (q != null) { - if (UNSAFE.compareAndSwapObject - (other, COMPLETIONS, q.next = other.completions, q)) - break; - } - else if (UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) - q = new CompletionNode(d); - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - T t; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - U u = null; - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncApply<T,U>(t, fn, dst)); - else - u = fn.apply(t); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(u, ex); - } - helpPostComplete(); - other.helpPostComplete(); - return dst; + public CompletableFuture<Void> acceptEither + (CompletionStage<? extends T> other, + Consumer<? super T> action) { + return doAcceptEither(other.toCompletableFuture(), action, null); } - /** - * Returns a new CompletableFuture that is completed - * when either this or the other given CompletableFuture completes, - * after performing the given action with the result of either this - * or the other CompletableFuture's result. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied action - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param block the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> acceptEither - (CompletableFuture<? extends T> other, - Consumer<? super T> block) { - return doAcceptEither(other, block, null); - } - - /** - * Returns a new CompletableFuture that is asynchronously completed - * when either this or the other given CompletableFuture completes, - * after performing the given action with the result of either this - * or the other CompletableFuture's result from a task running in - * the {@link ForkJoinPool#commonPool()}. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied action - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param block the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ public CompletableFuture<Void> acceptEitherAsync - (CompletableFuture<? extends T> other, - Consumer<? super T> block) { - return doAcceptEither(other, block, ForkJoinPool.commonPool()); + (CompletionStage<? extends T> other, + Consumer<? super T> action) { + return doAcceptEither(other.toCompletableFuture(), action, + ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when either this or the other given CompletableFuture completes, - * after performing the given action with the result of either this - * or the other CompletableFuture's result from a task running in - * the given executor. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied action - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param block the action to perform before completing the - * returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ public CompletableFuture<Void> acceptEitherAsync - (CompletableFuture<? extends T> other, - Consumer<? super T> block, + (CompletionStage<? extends T> other, + Consumer<? super T> action, Executor executor) { if (executor == null) throw new NullPointerException(); - return doAcceptEither(other, block, executor); + return doAcceptEither(other.toCompletableFuture(), action, executor); } - private CompletableFuture<Void> doAcceptEither - (CompletableFuture<? extends T> other, - Consumer<? super T> fn, - Executor e) { - if (other == null || fn == null) throw new NullPointerException(); - CompletableFuture<Void> dst = new CompletableFuture<Void>(); - AcceptEither<T> d = null; - Object r; - if ((r = result) == null && (r = other.result) == null) { - d = new AcceptEither<T>(this, other, fn, dst, e); - CompletionNode q = null, p = new CompletionNode(d); - while ((r = result) == null && (r = other.result) == null) { - if (q != null) { - if (UNSAFE.compareAndSwapObject - (other, COMPLETIONS, q.next = other.completions, q)) - break; - } - else if (UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) - q = new CompletionNode(d); - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - T t; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncAccept<T>(t, fn, dst)); - else - fn.accept(t); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(null, ex); - } - helpPostComplete(); - other.helpPostComplete(); - return dst; + public CompletableFuture<Void> runAfterEither(CompletionStage<?> other, + Runnable action) { + return doRunAfterEither(other.toCompletableFuture(), action, null); } - /** - * Returns a new CompletableFuture that is completed - * when either this or the other given CompletableFuture completes, - * after performing the given action. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied action - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param action the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public CompletableFuture<Void> runAfterEither(CompletableFuture<?> other, - Runnable action) { - return doRunAfterEither(other, action, null); + public CompletableFuture<Void> runAfterEitherAsync + (CompletionStage<?> other, + Runnable action) { + return doRunAfterEither(other.toCompletableFuture(), action, + ForkJoinPool.commonPool()); } - /** - * Returns a new CompletableFuture that is asynchronously completed - * when either this or the other given CompletableFuture completes, - * after performing the given action from a task running in the - * {@link ForkJoinPool#commonPool()}. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied action - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param action the action to perform before completing the - * returned CompletableFuture - * @return the new CompletableFuture - */ public CompletableFuture<Void> runAfterEitherAsync - (CompletableFuture<?> other, - Runnable action) { - return doRunAfterEither(other, action, ForkJoinPool.commonPool()); - } - - /** - * Returns a new CompletableFuture that is asynchronously completed - * when either this or the other given CompletableFuture completes, - * after performing the given action from a task running in the - * given executor. - * - * <p>If this and/or the other CompletableFuture complete - * exceptionally, then the returned CompletableFuture may also do so, - * with a CompletionException holding one of these exceptions as its - * cause. No guarantees are made about which result or exception is - * used in the returned CompletableFuture. If the supplied action - * throws an exception, then the returned CompletableFuture completes - * exceptionally with a CompletionException holding the exception as - * its cause. - * - * @param other the other CompletableFuture - * @param action the action to perform before completing the - * returned CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the new CompletableFuture - */ - public CompletableFuture<Void> runAfterEitherAsync - (CompletableFuture<?> other, + (CompletionStage<?> other, Runnable action, Executor executor) { if (executor == null) throw new NullPointerException(); - return doRunAfterEither(other, action, executor); + return doRunAfterEither(other.toCompletableFuture(), action, executor); } - private CompletableFuture<Void> doRunAfterEither - (CompletableFuture<?> other, - Runnable action, - Executor e) { - if (other == null || action == null) throw new NullPointerException(); - CompletableFuture<Void> dst = new CompletableFuture<Void>(); - RunAfterEither d = null; - Object r; - if ((r = result) == null && (r = other.result) == null) { - d = new RunAfterEither(this, other, action, dst, e); - CompletionNode q = null, p = new CompletionNode(d); - while ((r = result) == null && (r = other.result) == null) { - if (q != null) { - if (UNSAFE.compareAndSwapObject - (other, COMPLETIONS, q.next = other.completions, q)) - break; - } - else if (UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) - q = new CompletionNode(d); - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - Throwable ex; - if (r instanceof AltResult) - ex = ((AltResult)r).ex; - else - ex = null; - if (ex == null) { - try { - if (e != null) - e.execute(new AsyncRun(action, dst)); - else - action.run(); - } catch (Throwable rex) { - ex = rex; - } - } - if (e == null || ex != null) - dst.internalComplete(null, ex); - } - helpPostComplete(); - other.helpPostComplete(); - return dst; - } - - /** - * Returns a CompletableFuture that upon completion, has the same - * value as produced by the given function of the result of this - * CompletableFuture. - * - * <p>If this CompletableFuture completes exceptionally, then the - * returned CompletableFuture also does so, with a - * CompletionException holding this exception as its cause. - * Similarly, if the computed CompletableFuture completes - * exceptionally, then so does the returned CompletableFuture. - * - * @param fn the function returning a new CompletableFuture - * @return the CompletableFuture - */ public <U> CompletableFuture<U> thenCompose - (Function<? super T, CompletableFuture<U>> fn) { + (Function<? super T, ? extends CompletionStage<U>> fn) { return doThenCompose(fn, null); } - /** - * Returns a CompletableFuture that upon completion, has the same - * value as that produced asynchronously using the {@link - * ForkJoinPool#commonPool()} by the given function of the result - * of this CompletableFuture. - * - * <p>If this CompletableFuture completes exceptionally, then the - * returned CompletableFuture also does so, with a - * CompletionException holding this exception as its cause. - * Similarly, if the computed CompletableFuture completes - * exceptionally, then so does the returned CompletableFuture. - * - * @param fn the function returning a new CompletableFuture - * @return the CompletableFuture - */ public <U> CompletableFuture<U> thenComposeAsync - (Function<? super T, CompletableFuture<U>> fn) { + (Function<? super T, ? extends CompletionStage<U>> fn) { return doThenCompose(fn, ForkJoinPool.commonPool()); } - /** - * Returns a CompletableFuture that upon completion, has the same - * value as that produced asynchronously using the given executor - * by the given function of this CompletableFuture. - * - * <p>If this CompletableFuture completes exceptionally, then the - * returned CompletableFuture also does so, with a - * CompletionException holding this exception as its cause. - * Similarly, if the computed CompletableFuture completes - * exceptionally, then so does the returned CompletableFuture. - * - * @param fn the function returning a new CompletableFuture - * @param executor the executor to use for asynchronous execution - * @return the CompletableFuture - */ public <U> CompletableFuture<U> thenComposeAsync - (Function<? super T, CompletableFuture<U>> fn, + (Function<? super T, ? extends CompletionStage<U>> fn, Executor executor) { if (executor == null) throw new NullPointerException(); return doThenCompose(fn, executor); } - private <U> CompletableFuture<U> doThenCompose - (Function<? super T, CompletableFuture<U>> fn, - Executor e) { - if (fn == null) throw new NullPointerException(); - CompletableFuture<U> dst = null; - ThenCompose<T,U> d = null; - Object r; - if ((r = result) == null) { - dst = new CompletableFuture<U>(); - CompletionNode p = new CompletionNode - (d = new ThenCompose<T,U>(this, fn, dst, e)); - while ((r = result) == null) { - if (UNSAFE.compareAndSwapObject - (this, COMPLETIONS, p.next = completions, p)) - break; - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - T t; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - if (ex == null) { - if (e != null) { - if (dst == null) - dst = new CompletableFuture<U>(); - e.execute(new AsyncCompose<T,U>(t, fn, dst)); - } - else { - try { - if ((dst = fn.apply(t)) == null) - ex = new NullPointerException(); - } catch (Throwable rex) { - ex = rex; - } - } - } - if (dst == null) - dst = new CompletableFuture<U>(); - if (e == null || ex != null) - dst.internalComplete(null, ex); - } - helpPostComplete(); - dst.helpPostComplete(); - return dst; + public CompletableFuture<T> whenComplete + (BiConsumer<? super T, ? super Throwable> action) { + return doWhenComplete(action, null); + } + + public CompletableFuture<T> whenCompleteAsync + (BiConsumer<? super T, ? super Throwable> action) { + return doWhenComplete(action, ForkJoinPool.commonPool()); + } + + public CompletableFuture<T> whenCompleteAsync + (BiConsumer<? super T, ? super Throwable> action, + Executor executor) { + if (executor == null) throw new NullPointerException(); + return doWhenComplete(action, executor); + } + + public <U> CompletableFuture<U> handle + (BiFunction<? super T, Throwable, ? extends U> fn) { + return doHandle(fn, null); } + public <U> CompletableFuture<U> handleAsync + (BiFunction<? super T, Throwable, ? extends U> fn) { + return doHandle(fn, ForkJoinPool.commonPool()); + } + + public <U> CompletableFuture<U> handleAsync + (BiFunction<? super T, Throwable, ? extends U> fn, + Executor executor) { + if (executor == null) throw new NullPointerException(); + return doHandle(fn, executor); + } + + /** + * Returns this CompletableFuture + * + * @return this CompletableFuture + */ + public CompletableFuture<T> toCompletableFuture() { + return this; + } + + // not in interface CompletionStage + /** * Returns a new CompletableFuture that is completed when this * CompletableFuture completes, with the result of the given @@ -2868,6 +2608,8 @@ * completion when it completes exceptionally; otherwise, if this * CompletableFuture completes normally, then the returned * CompletableFuture also completes normally with the same value. + * Note: More flexible versions of this functionality are + * available using methods {@code whenComplete} and {@code handle}. * * @param fn the function to use to compute the value of the * returned CompletableFuture if this CompletableFuture completed @@ -2882,7 +2624,8 @@ Object r; if ((r = result) == null) { CompletionNode p = - new CompletionNode(d = new ExceptionCompletion<T>(this, fn, dst)); + new CompletionNode(d = new ExceptionCompletion<T> + (this, fn, dst)); while ((r = result) == null) { if (UNSAFE.compareAndSwapObject(this, COMPLETIONS, p.next = completions, p)) @@ -2910,59 +2653,6 @@ return dst; } - /** - * Returns a new CompletableFuture that is completed when this - * CompletableFuture completes, with the result of the given - * function of the result and exception of this CompletableFuture's - * completion. The given function is invoked with the result (or - * {@code null} if none) and the exception (or {@code null} if none) - * of this CompletableFuture when complete. - * - * @param fn the function to use to compute the value of the - * returned CompletableFuture - * @return the new CompletableFuture - */ - public <U> CompletableFuture<U> handle - (BiFunction<? super T, Throwable, ? extends U> fn) { - if (fn == null) throw new NullPointerException(); - CompletableFuture<U> dst = new CompletableFuture<U>(); - HandleCompletion<T,U> d = null; - Object r; - if ((r = result) == null) { - CompletionNode p = - new CompletionNode(d = new HandleCompletion<T,U>(this, fn, dst)); - while ((r = result) == null) { - if (UNSAFE.compareAndSwapObject(this, COMPLETIONS, - p.next = completions, p)) - break; - } - } - if (r != null && (d == null || d.compareAndSet(0, 1))) { - T t; Throwable ex; - if (r instanceof AltResult) { - ex = ((AltResult)r).ex; - t = null; - } - else { - ex = null; - @SuppressWarnings("unchecked") T tr = (T) r; - t = tr; - } - U u; Throwable dx; - try { - u = fn.apply(t, ex); - dx = null; - } catch (Throwable rex) { - dx = rex; - u = null; - } - dst.internalComplete(u, dx); - } - helpPostComplete(); - return dst; - } - - /* ------------- Arbitrary-arity constructions -------------- */ /* @@ -3215,6 +2905,21 @@ } /** + * Returns {@code true} if this CompletableFuture completed + * exceptionally, in any way. Possible causes include + * cancellation, explicit invocation of {@code + * completeExceptionally}, and abrupt termination of a + * CompletionStage action. + * + * @return {@code true} if this CompletableFuture completed + * exceptionally + */ + public boolean isCompletedExceptionally() { + Object r; + return ((r = result) instanceof AltResult) && r != NIL; + } + + /** * Forcibly sets or resets the value subsequently returned by * method {@link #get()} and related methods, whether or not * already completed. This method is designed for use only in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/java/util/concurrent/CompletionStage.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,760 @@ +/* + * 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. + */ + +/* + * This file is available under and governed by the GNU General Public + * License version 2 only, as published by the Free Software Foundation. + * However, the following notice accompanied the original version of this + * file: + * + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +package java.util.concurrent; +import java.util.function.Supplier; +import java.util.function.Consumer; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.BiFunction; +import java.util.concurrent.Executor; + +/** + * A stage of a possibly asynchronous computation, that performs an + * action or computes a value when another CompletionStage completes. + * A stage completes upon termination of its computation, but this may + * in turn trigger other dependent stages. The functionality defined + * in this interface takes only a few basic forms, which expand out to + * a larger set of methods to capture a range of usage styles: <ul> + * + * <li>The computation performed by a stage may be expressed as a + * Function, Consumer, or Runnable (using methods with names including + * <em>apply</em>, <em>accept</em>, or <em>run</em>, respectively) + * depending on whether it requires arguments and/or produces results. + * For example, {@code stage.thenApply(x -> square(x)).thenAccept(x -> + * System.out.print(x)).thenRun(() -> System.out.println())}. An + * additional form (<em>compose</em>) applies functions of stages + * themselves, rather than their results. </li> + * + * <li> One stage's execution may be triggered by completion of a + * single stage, or both of two stages, or either of two stages. + * Dependencies on a single stage are arranged using methods with + * prefix <em>then</em>. Those triggered by completion of + * <em>both</em> of two stages may <em>combine</em> their results or + * effects, using correspondingly named methods. Those triggered by + * <em>either</em> of two stages make no guarantees about which of the + * results or effects are used for the dependent stage's + * computation.</li> + * + * <li> Dependencies among stages control the triggering of + * computations, but do not otherwise guarantee any particular + * ordering. Additionally, execution of a new stage's computations may + * be arranged in any of three ways: default execution, default + * asynchronous execution (using methods with suffix <em>async</em> + * that employ the stage's default asynchronous execution facility), + * or custom (via a supplied {@link Executor}). The execution + * properties of default and async modes are specified by + * CompletionStage implementations, not this interface. Methods with + * explicit Executor arguments may have arbitrary execution + * properties, and might not even support concurrent execution, but + * are arranged for processing in a way that accommodates asynchrony. + * + * <li> Two method forms support processing whether the triggering + * stage completed normally or exceptionally: Method {@link + * #whenComplete whenComplete} allows injection of an action + * regardless of outcome, otherwise preserving the outcome in its + * completion. Method {@link #handle handle} additionally allows the + * stage to compute a replacement result that may enable further + * processing by other dependent stages. In all other cases, if a + * stage's computation terminates abruptly with an (unchecked) + * exception or error, then all dependent stages requiring its + * completion complete exceptionally as well, with a {@link + * CompletionException} holding the exception as its cause. If a + * stage is dependent on <em>both</em> of two stages, and both + * complete exceptionally, then the CompletionException may correspond + * to either one of these exceptions. If a stage is dependent on + * <em>either</em> of two others, and only one of them completes + * exceptionally, no guarantees are made about whether the dependent + * stage completes normally or exceptionally. In the case of method + * {@code whenComplete}, when the supplied action itself encounters an + * exception, then the stage exceptionally completes with this + * exception if not already completed exceptionally.</li> + * + * </ul> + * + * <p>All methods adhere to the above triggering, execution, and + * exceptional completion specifications (which are not repeated in + * individual method specifications). Additionally, while arguments + * used to pass a completion result (that is, for parameters of type + * {@code T}) for methods accepting them may be null, passing a null + * value for any other parameter will result in a {@link + * NullPointerException} being thrown. + * + * <p>This interface does not define methods for initially creating, + * forcibly completing normally or exceptionally, probing completion + * status or results, or awaiting completion of a stage. + * Implementations of CompletionStage may provide means of achieving + * such effects, as appropriate. Method {@link #toCompletableFuture} + * enables interoperability among different implementations of this + * interface by providing a common conversion type. + * + * @author Doug Lea + * @since 1.8 + */ +public interface CompletionStage<T> { + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed with this stage's result as the argument + * to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed using this stage's default asynchronous + * execution facility, with this stage's result as the argument to + * the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> thenApplyAsync + (Function<? super T,? extends U> fn); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed using the supplied Executor, with this + * stage's result as the argument to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> thenApplyAsync + (Function<? super T,? extends U> fn, + Executor executor); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed with this stage's result as the argument + * to the supplied action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> thenAccept(Consumer<? super T> action); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed using this stage's default asynchronous + * execution facility, with this stage's result as the argument to + * the supplied action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed using the supplied Executor, with this + * stage's result as the argument to the supplied action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param action the action to perform before completing the + * returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @return the new CompletionStage + */ + public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action, + Executor executor); + /** + * Returns a new CompletionStage that, when this stage completes + * normally, executes the given action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> thenRun(Runnable action); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, executes the given action using this stage's default + * asynchronous execution facility. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> thenRunAsync(Runnable action); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, executes the given action using the supplied Executor. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param action the action to perform before completing the + * returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @return the new CompletionStage + */ + public CompletionStage<Void> thenRunAsync(Runnable action, + Executor executor); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage both complete normally, is executed with the two + * results as arguments to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param <U> the type of the other CompletionStage's result + * @param <V> the function's return type + * @return the new CompletionStage + */ + public <U,V> CompletionStage<V> thenCombine + (CompletionStage<? extends U> other, + BiFunction<? super T,? super U,? extends V> fn); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage complete normally, is executed using this stage's + * default asynchronous execution facility, with the two results + * as arguments to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param <U> the type of the other CompletionStage's result + * @param <V> the function's return type + * @return the new CompletionStage + */ + public <U,V> CompletionStage<V> thenCombineAsync + (CompletionStage<? extends U> other, + BiFunction<? super T,? super U,? extends V> fn); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage complete normally, is executed using the supplied + * executor, with the two results as arguments to the supplied + * function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @param <U> the type of the other CompletionStage's result + * @param <V> the function's return type + * @return the new CompletionStage + */ + public <U,V> CompletionStage<V> thenCombineAsync + (CompletionStage<? extends U> other, + BiFunction<? super T,? super U,? extends V> fn, + Executor executor); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage both complete normally, is executed with the two + * results as arguments to the supplied action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @param <U> the type of the other CompletionStage's result + * @return the new CompletionStage + */ + public <U> CompletionStage<Void> thenAcceptBoth + (CompletionStage<? extends U> other, + BiConsumer<? super T, ? super U> action); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage complete normally, is executed using this stage's + * default asynchronous execution facility, with the two results + * as arguments to the supplied action. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @param <U> the type of the other CompletionStage's result + * @return the new CompletionStage + */ + public <U> CompletionStage<Void> thenAcceptBothAsync + (CompletionStage<? extends U> other, + BiConsumer<? super T, ? super U> action); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage complete normally, is executed using the supplied + * executor, with the two results as arguments to the supplied + * function. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @param <U> the type of the other CompletionStage's result + * @return the new CompletionStage + */ + public <U> CompletionStage<Void> thenAcceptBothAsync + (CompletionStage<? extends U> other, + BiConsumer<? super T, ? super U> action, + Executor executor); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage both complete normally, executes the given action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> runAfterBoth(CompletionStage<?> other, + Runnable action); + /** + * Returns a new CompletionStage that, when this and the other + * given stage complete normally, executes the given action using + * this stage's default asynchronous execution facility. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other, + Runnable action); + + /** + * Returns a new CompletionStage that, when this and the other + * given stage complete normally, executes the given action using + * the supplied executor + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @return the new CompletionStage + */ + public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other, + Runnable action, + Executor executor); + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, is executed with the + * corresponding result as argument to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> applyToEither + (CompletionStage<? extends T> other, + Function<? super T, U> fn); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, is executed using this + * stage's default asynchronous execution facility, with the + * corresponding result as argument to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> applyToEitherAsync + (CompletionStage<? extends T> other, + Function<? super T, U> fn); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, is executed using the + * supplied executor, with the corresponding result as argument to + * the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param fn the function to use to compute the value of + * the returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> applyToEitherAsync + (CompletionStage<? extends T> other, + Function<? super T, U> fn, + Executor executor); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, is executed with the + * corresponding result as argument to the supplied action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> acceptEither + (CompletionStage<? extends T> other, + Consumer<? super T> action); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, is executed using this + * stage's default asynchronous execution facility, with the + * corresponding result as argument to the supplied action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> acceptEitherAsync + (CompletionStage<? extends T> other, + Consumer<? super T> action); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, is executed using the + * supplied executor, with the corresponding result as argument to + * the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @return the new CompletionStage + */ + public CompletionStage<Void> acceptEitherAsync + (CompletionStage<? extends T> other, + Consumer<? super T> action, + Executor executor); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, executes the given action. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> runAfterEither(CompletionStage<?> other, + Runnable action); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, executes the given action + * using this stage's default asynchronous execution facility. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @return the new CompletionStage + */ + public CompletionStage<Void> runAfterEitherAsync + (CompletionStage<?> other, + Runnable action); + + /** + * Returns a new CompletionStage that, when either this or the + * other given stage complete normally, executes the given action + * using supplied executor. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param other the other CompletionStage + * @param action the action to perform before completing the + * returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @return the new CompletionStage + */ + public CompletionStage<Void> runAfterEitherAsync + (CompletionStage<?> other, + Runnable action, + Executor executor); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed with this stage as the argument + * to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param fn the function returning a new CompletionStage + * @param <U> the type of the returned CompletionStage's result + * @return the CompletionStage + */ + public <U> CompletionStage<U> thenCompose + (Function<? super T, ? extends CompletionStage<U>> fn); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed using this stage's default asynchronous + * execution facility, with this stage as the argument to the + * supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param fn the function returning a new CompletionStage + * @param <U> the type of the returned CompletionStage's result + * @return the CompletionStage + */ + public <U> CompletionStage<U> thenComposeAsync + (Function<? super T, ? extends CompletionStage<U>> fn); + + /** + * Returns a new CompletionStage that, when this stage completes + * normally, is executed using the supplied Executor, with this + * stage's result as the argument to the supplied function. + * + * See the {@link CompletionStage} documentation for rules + * covering exceptional completion. + * + * @param fn the function returning a new CompletionStage + * @param executor the executor to use for asynchronous execution + * @param <U> the type of the returned CompletionStage's result + * @return the CompletionStage + */ + public <U> CompletionStage<U> thenComposeAsync + (Function<? super T, ? extends CompletionStage<U>> fn, + Executor executor); + + /** + * Returns a new CompletionStage that, when this stage completes + * exceptionally, is executed with this stage's exception as the + * argument to the supplied function. Otherwise, if this stage + * completes normally, then the returned stage also completes + * normally with the same value. + * + * @param fn the function to use to compute the value of the + * returned CompletionStage if this CompletionStage completed + * exceptionally + * @return the new CompletionStage + */ + public CompletionStage<T> exceptionally + (Function<Throwable, ? extends T> fn); + + /** + * Returns a new CompletionStage with the same result or exception + * as this stage, and when this stage completes, executes the + * given action with the result (or {@code null} if none) and the + * exception (or {@code null} if none) of this stage. + * + * @param action the action to perform + * @return the new CompletionStage + */ + public CompletionStage<T> whenComplete + (BiConsumer<? super T, ? super Throwable> action); + + /** + * Returns a new CompletionStage with the same result or exception + * as this stage, and when this stage completes, executes the + * given action executes the given action using this stage's + * default asynchronous execution facility, with the result (or + * {@code null} if none) and the exception (or {@code null} if + * none) of this stage as arguments. + * + * @param action the action to perform + * @return the new CompletionStage + */ + public CompletionStage<T> whenCompleteAsync + (BiConsumer<? super T, ? super Throwable> action); + + /** + * Returns a new CompletionStage with the same result or exception + * as this stage, and when this stage completes, executes using + * the supplied Executor, the given action with the result (or + * {@code null} if none) and the exception (or {@code null} if + * none) of this stage as arguments. + * + * @param action the action to perform + * @param executor the executor to use for asynchronous execution + * @return the new CompletionStage + */ + public CompletionStage<T> whenCompleteAsync + (BiConsumer<? super T, ? super Throwable> action, + Executor executor); + + /** + * Returns a new CompletionStage that, when this stage completes + * either normally or exceptionally, is executed with this stage's + * result and exception as arguments to the supplied function. + * The given function is invoked with the result (or {@code null} + * if none) and the exception (or {@code null} if none) of this + * stage when complete as arguments. + * + * @param fn the function to use to compute the value of the + * returned CompletionStage + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> handle + (BiFunction<? super T, Throwable, ? extends U> fn); + + /** + * Returns a new CompletionStage that, when this stage completes + * either normally or exceptionally, is executed using this stage's + * default asynchronous execution facility, with this stage's + * result and exception as arguments to the supplied function. + * The given function is invoked with the result (or {@code null} + * if none) and the exception (or {@code null} if none) of this + * stage when complete as arguments. + * + * @param fn the function to use to compute the value of the + * returned CompletionStage + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> handleAsync + (BiFunction<? super T, Throwable, ? extends U> fn); + + /** + * Returns a new CompletionStage that, when this stage completes + * either normally or exceptionally, is executed using the + * supplied executor, with this stage's result and exception as + * arguments to the supplied function. The given function is + * invoked with the result (or {@code null} if none) and the + * exception (or {@code null} if none) of this stage when complete + * as arguments. + * + * @param fn the function to use to compute the value of the + * returned CompletionStage + * @param executor the executor to use for asynchronous execution + * @param <U> the function's return type + * @return the new CompletionStage + */ + public <U> CompletionStage<U> handleAsync + (BiFunction<? super T, Throwable, ? extends U> fn, + Executor executor); + + /** + * Returns a {@link CompletableFuture} maintaining the same + * completion properties as this stage. If this stage is already a + * CompletableFuture, this method may return this stage itself. + * Otherwise, invocation of this method may be equivalent in + * effect to {@code thenApply(x -> x)}, but returning an instance + * of type {@code CompletableFuture}. A CompletionStage + * implementation that does not choose to interoperate with others + * may throw {@code UnsupportedOperationException}. + * + * @return the CompletableFuture + * @throws UnsupportedOperationException if this implementation + * does not interoperate with CompletableFuture + */ + public CompletableFuture<T> toCompletableFuture(); + +}
--- a/jdk/src/share/classes/java/util/logging/XMLFormatter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/logging/XMLFormatter.java Wed Jul 05 19:07:19 2017 +0200 @@ -47,7 +47,7 @@ private LogManager manager = LogManager.getLogManager(); // Append a two digit number. - private void a2(StringBuffer sb, int x) { + private void a2(StringBuilder sb, int x) { if (x < 10) { sb.append('0'); } @@ -55,25 +55,26 @@ } // Append the time and date in ISO 8601 format - private void appendISO8601(StringBuffer sb, long millis) { - Date date = new Date(millis); - sb.append(date.getYear() + 1900); + private void appendISO8601(StringBuilder sb, long millis) { + GregorianCalendar cal = new GregorianCalendar(); + cal.setTimeInMillis(millis); + sb.append(cal.get(Calendar.YEAR) + 1900); sb.append('-'); - a2(sb, date.getMonth() + 1); + a2(sb, cal.get(Calendar.MONTH) + 1); sb.append('-'); - a2(sb, date.getDate()); + a2(sb, cal.get(Calendar.DAY_OF_MONTH)); sb.append('T'); - a2(sb, date.getHours()); + a2(sb, cal.get(Calendar.HOUR_OF_DAY)); sb.append(':'); - a2(sb, date.getMinutes()); + a2(sb, cal.get(Calendar.MINUTE)); sb.append(':'); - a2(sb, date.getSeconds()); + a2(sb, cal.get(Calendar.SECOND)); } - // Append to the given StringBuffer an escaped version of the + // Append to the given StringBuilder an escaped version of the // given text string where XML special characters have been escaped. // For a null string we append "<null>" - private void escape(StringBuffer sb, String text) { + private void escape(StringBuilder sb, String text) { if (text == null) { text = "<null>"; } @@ -102,7 +103,7 @@ * @return a formatted log record */ public String format(LogRecord record) { - StringBuffer sb = new StringBuffer(500); + StringBuilder sb = new StringBuilder(500); sb.append("<record>\n"); sb.append(" <date>"); @@ -224,7 +225,7 @@ * @return a valid XML string */ public String getHead(Handler h) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); String encoding; sb.append("<?xml version=\"1.0\"");
--- a/jdk/src/share/classes/java/util/stream/AbstractPipeline.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/AbstractPipeline.java Wed Jul 05 19:07:19 2017 +0200 @@ -75,11 +75,13 @@ * Backlink to the head of the pipeline chain (self if this is the source * stage). */ + @SuppressWarnings("rawtypes") private final AbstractPipeline sourceStage; /** * The "upstream" pipeline, or null if this is the source stage. */ + @SuppressWarnings("rawtypes") private final AbstractPipeline previousStage; /** @@ -92,6 +94,7 @@ * The next stage in the pipeline, or null if this is the last stage. * Effectively final at the point of linking to the next pipeline. */ + @SuppressWarnings("rawtypes") private AbstractPipeline nextStage; /** @@ -222,8 +225,8 @@ linkedOrConsumed = true; return isParallel() - ? (R) terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags())) - : (R) terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags())); + ? terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags())) + : terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags())); } /** @@ -232,6 +235,7 @@ * @param generator the array generator to be used to create array instances * @return a flat array-backed Node that holds the collected output elements */ + @SuppressWarnings("unchecked") final Node<E_OUT> evaluateToArrayNode(IntFunction<E_OUT[]> generator) { if (linkedOrConsumed) throw new IllegalStateException("stream has already been operated upon"); @@ -256,6 +260,7 @@ * @throws IllegalStateException if this pipeline stage is not the source * stage. */ + @SuppressWarnings("unchecked") final Spliterator<E_OUT> sourceStageSpliterator() { if (this != sourceStage) throw new IllegalStateException(); @@ -265,11 +270,13 @@ linkedOrConsumed = true; if (sourceStage.sourceSpliterator != null) { + @SuppressWarnings("unchecked") Spliterator<E_OUT> s = sourceStage.sourceSpliterator; sourceStage.sourceSpliterator = null; return s; } else if (sourceStage.sourceSupplier != null) { + @SuppressWarnings("unchecked") Spliterator<E_OUT> s = (Spliterator<E_OUT>) sourceStage.sourceSupplier.get(); sourceStage.sourceSupplier = null; return s; @@ -282,12 +289,14 @@ // BaseStream @Override + @SuppressWarnings("unchecked") public final S sequential() { sourceStage.parallel = false; return (S) this; } @Override + @SuppressWarnings("unchecked") public final S parallel() { sourceStage.parallel = true; return (S) this; @@ -295,6 +304,7 @@ // Primitive specialization use co-variant overrides, hence is not final @Override + @SuppressWarnings("unchecked") public Spliterator<E_OUT> spliterator() { if (linkedOrConsumed) throw new IllegalStateException("stream has already been operated upon"); @@ -302,12 +312,14 @@ if (this == sourceStage) { if (sourceStage.sourceSpliterator != null) { - Spliterator<E_OUT> s = sourceStage.sourceSpliterator; + @SuppressWarnings("unchecked") + Spliterator<E_OUT> s = (Spliterator<E_OUT>) sourceStage.sourceSpliterator; sourceStage.sourceSpliterator = null; return s; } else if (sourceStage.sourceSupplier != null) { - Supplier<Spliterator<E_OUT>> s = sourceStage.sourceSupplier; + @SuppressWarnings("unchecked") + Supplier<Spliterator<E_OUT>> s = (Supplier<Spliterator<E_OUT>>) sourceStage.sourceSupplier; sourceStage.sourceSupplier = null; return lazySpliterator(s); } @@ -349,10 +361,11 @@ * @param terminalFlags Operation flags for the terminal operation */ private void parallelPrepare(int terminalFlags) { + @SuppressWarnings("rawtypes") AbstractPipeline backPropagationHead = sourceStage; if (sourceStage.sourceAnyStateful) { int depth = 1; - for (AbstractPipeline u = sourceStage, p = sourceStage.nextStage; + for ( @SuppressWarnings("rawtypes") AbstractPipeline u = sourceStage, p = sourceStage.nextStage; p != null; u = p, p = p.nextStage) { int thisOpFlags = p.sourceOrOpFlags; @@ -383,7 +396,7 @@ // Apply the upstream terminal flags if (terminalFlags != 0) { int upstreamTerminalFlags = terminalFlags & StreamOpFlag.UPSTREAM_TERMINAL_OP_MASK; - for (AbstractPipeline p = backPropagationHead; p.nextStage != null; p = p.nextStage) { + for ( @SuppressWarnings("rawtypes") AbstractPipeline p = backPropagationHead; p.nextStage != null; p = p.nextStage) { p.combinedFlags = StreamOpFlag.combineOpFlags(upstreamTerminalFlags, p.combinedFlags); } @@ -398,6 +411,7 @@ * of all computations up to and including the most recent stateful * operation. */ + @SuppressWarnings("unchecked") private Spliterator<?> sourceSpliterator(int terminalFlags) { // Get the source spliterator of the pipeline Spliterator<?> spliterator = null; @@ -421,7 +435,7 @@ // Adapt the source spliterator, evaluating each stateful op // in the pipeline up to and including this pipeline stage - for (AbstractPipeline u = sourceStage, p = sourceStage.nextStage, e = this; + for ( @SuppressWarnings("rawtypes") AbstractPipeline u = sourceStage, p = sourceStage.nextStage, e = this; u != e; u = p, p = p.nextStage) { @@ -442,6 +456,7 @@ @Override final StreamShape getSourceShape() { + @SuppressWarnings("rawtypes") AbstractPipeline p = AbstractPipeline.this; while (p.depth > 0) { p = p.previousStage; @@ -475,7 +490,9 @@ } @Override + @SuppressWarnings("unchecked") final <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) { + @SuppressWarnings({"rawtypes","unchecked"}) AbstractPipeline p = AbstractPipeline.this; while (p.depth > 0) { p = p.previousStage; @@ -495,16 +512,18 @@ } @Override + @SuppressWarnings("unchecked") final <P_IN> Sink<P_IN> wrapSink(Sink<E_OUT> sink) { Objects.requireNonNull(sink); - for (AbstractPipeline p=AbstractPipeline.this; p.depth > 0; p=p.previousStage) { + for ( @SuppressWarnings("rawtypes") AbstractPipeline p=AbstractPipeline.this; p.depth > 0; p=p.previousStage) { sink = p.opWrapSink(p.previousStage.combinedFlags, sink); } return (Sink<P_IN>) sink; } @Override + @SuppressWarnings("unchecked") final <P_IN> Spliterator<E_OUT> wrapSpliterator(Spliterator<P_IN> sourceSpliterator) { if (depth == 0) { return (Spliterator<E_OUT>) sourceSpliterator; @@ -591,16 +610,19 @@ /** * Make a node builder compatible with this stream shape. * - * @param exactSizeIfKnown if {@literal >=0}, then a node builder will be created that - * has a fixed capacity of at most sizeIfKnown elements. If {@literal < 0}, - * then the node builder has an unfixed capacity. A fixed capacity node - * builder will throw exceptions if an element is added after builder has - * reached capacity, or is built before the builder has reached capacity. + * @param exactSizeIfKnown if {@literal >=0}, then a node builder will be + * created that has a fixed capacity of at most sizeIfKnown elements. If + * {@literal < 0}, then the node builder has an unfixed capacity. A fixed + * capacity node builder will throw exceptions if an element is added after + * builder has reached capacity, or is built before the builder has reached + * capacity. + * * @param generator the array generator to be used to create instances of a * T[] array. For implementations supporting primitive nodes, this parameter * may be ignored. * @return a node builder */ + @Override abstract Node.Builder<E_OUT> makeNodeBuilder(long exactSizeIfKnown, IntFunction<E_OUT[]> generator); @@ -679,6 +701,7 @@ * @param spliterator the source {@code Spliterator} * @return a {@code Spliterator} describing the result of the evaluation */ + @SuppressWarnings("unchecked") <P_IN> Spliterator<E_OUT> opEvaluateParallelLazy(PipelineHelper<E_OUT> helper, Spliterator<P_IN> spliterator) { return opEvaluateParallel(helper, spliterator, i -> (E_OUT[]) new Object[i]).spliterator();
--- a/jdk/src/share/classes/java/util/stream/AbstractShortCircuitTask.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/AbstractShortCircuitTask.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,6 +39,7 @@ * @param <K> type of child and sibling tasks * @since 1.8 */ +@SuppressWarnings("serial") abstract class AbstractShortCircuitTask<P_IN, P_OUT, R, K extends AbstractShortCircuitTask<P_IN, P_OUT, R, K>> extends AbstractTask<P_IN, P_OUT, R, K> { @@ -219,7 +220,8 @@ */ protected void cancelLaterNodes() { // Go up the tree, cancel right siblings of this node and all parents - for (K parent = getParent(), node = (K) this; parent != null; + for (@SuppressWarnings("unchecked") K parent = getParent(), node = (K) this; + parent != null; node = parent, parent = parent.getParent()) { // If node is a left child of parent, then has a right sibling if (parent.leftChild == node) {
--- a/jdk/src/share/classes/java/util/stream/AbstractTask.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/AbstractTask.java Wed Jul 05 19:07:19 2017 +0200 @@ -73,6 +73,9 @@ * } * }</pre> * + * <p>Serialization is not supported as there is no intention to serialize + * tasks managed by stream ops. + * * @param <P_IN> Type of elements input to the pipeline * @param <P_OUT> Type of elements output from the pipeline * @param <R> Type of intermediate result, which may be different from operation @@ -80,6 +83,7 @@ * @param <K> Type of parent, child and sibling tasks * @since 1.8 */ +@SuppressWarnings("serial") abstract class AbstractTask<P_IN, P_OUT, R, K extends AbstractTask<P_IN, P_OUT, R, K>> extends CountedCompleter<R> {
--- a/jdk/src/share/classes/java/util/stream/Collector.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/Collector.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,40 +25,45 @@ package java.util.stream; import java.util.Collections; +import java.util.EnumSet; import java.util.Set; -import java.util.function.BiFunction; +import java.util.function.BiConsumer; import java.util.function.BinaryOperator; +import java.util.function.Function; import java.util.function.Supplier; /** * A <a href="package-summary.html#Reduction">reduction operation</a> that - * supports folding input elements into a cumulative result. The result may be - * a value or may be a mutable result container. Examples of operations - * accumulating results into a mutable result container include: accumulating - * input elements into a {@code Collection}; concatenating strings into a - * {@code StringBuilder}; computing summary information about elements such as - * sum, min, max, or average; computing "pivot table" summaries such as "maximum - * valued transaction by seller", etc. Reduction operations can be performed - * either sequentially or in parallel. + * folds input elements into a mutable result container, optionally transforming + * the accumulated result into a final representation after all input elements + * have been processed. + * + * <p>Examples of mutable reduction operations include: + * accumulating elements into a {@code Collection}; concatenating + * strings using a {@code StringBuilder}; computing summary information about + * elements such as sum, min, max, or average; computing "pivot table" summaries + * such as "maximum valued transaction by seller", etc. Reduction operations + * can be performed either sequentially or in parallel. * * <p>The following are examples of using the predefined {@code Collector} * implementations in {@link Collectors} with the {@code Stream} API to perform * mutable reduction tasks: * <pre>{@code - * // Accumulate elements into a List - * List<String> list = stream.collect(Collectors.toList()); + * // Accumulate names into a List + * List<String> list = people.stream().map(Person::getName).collect(Collectors.toList()); * - * // Accumulate elements into a TreeSet - * Set<String> list = stream.collect(Collectors.toCollection(TreeSet::new)); + * // Accumulate names into a TreeSet + * Set<String> list = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new)); * * // Convert elements to strings and concatenate them, separated by commas - * String joined = stream.map(Object::toString) - * .collect(Collectors.toStringJoiner(", ")) - * .toString(); + * String joined = things.stream() + * .map(Object::toString) + * .collect(Collectors.joining(", ")); * * // Find highest-paid employee * Employee highestPaid = employees.stream() - * .collect(Collectors.maxBy(Comparators.comparing(Employee::getSalary))); + * .collect(Collectors.maxBy(Comparators.comparing(Employee::getSalary))) + * .get(); * * // Group employees by department * Map<Department, List<Employee>> byDept @@ -66,7 +71,7 @@ * .collect(Collectors.groupingBy(Employee::getDepartment)); * * // Find highest-paid employee by department - * Map<Department, Employee> highestPaidByDept + * Map<Department, Optional<Employee>> highestPaidByDept * = employees.stream() * .collect(Collectors.groupingBy(Employee::getDepartment, * Collectors.maxBy(Comparators.comparing(Employee::getSalary)))); @@ -74,43 +79,42 @@ * // Partition students into passing and failing * Map<Boolean, List<Student>> passingFailing = * students.stream() - * .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD); + * .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD)); * * }</pre> * - * <p>A {@code Collector} is specified by three functions that work together to - * manage a result or result container. They are: creation of an initial - * result, incorporating a new data element into a result, and combining two - * results into one. The last function -- combining two results into one -- is - * used during parallel operations, where subsets of the input are accumulated - * in parallel, and then the subresults merged into a combined result. The - * result may be a mutable container or a value. If the result is mutable, the - * accumulation and combination functions may either mutate their left argument - * and return that (such as adding elements to a collection), or return a new - * result, in which case it should not perform any mutation. + * <p>A {@code Collector} is specified by four functions that work together to + * accumulate entries into a mutable result container, and optionally perform + * a final transform on the result. They are: creation of a new result container, + * incorporating a new data element into a result container, combining two + * result containers into one, and performing a final transform on the container. + * The combiner function is used during parallel operations, where + * subsets of the input are accumulated into separate result + * containers, and then the subresults merged into a combined result. The + * combiner function may merge one set of subresults into the other and return + * that, or it may return a new object to describe the combined results. * - * <p>Collectors also have a set of characteristics, including - * {@link Characteristics#CONCURRENT} and - * {@link Characteristics#STRICTLY_MUTATIVE}. These characteristics provide + * <p>Collectors also have a set of characteristics, such as + * {@link Characteristics#CONCURRENT}. These characteristics provide * hints that can be used by a reduction implementation to provide better * performance. * * <p>Libraries that implement reduction based on {@code Collector}, such as * {@link Stream#collect(Collector)}, must adhere to the following constraints: * <ul> - * <li>The first argument passed to the accumulator function, and both - * arguments passed to the combiner function, must be the result of a - * previous invocation of {@link #resultSupplier()}, {@link #accumulator()}, - * or {@link #combiner()}.</li> + * <li>The first argument passed to the accumulator function, both + * arguments passed to the combiner function, and the argument passed to the + * finisher function must be the result of a previous invocation of the + * result supplier, accumulator, or combiner functions.</li> * <li>The implementation should not do anything with the result of any of * the result supplier, accumulator, or combiner functions other than to - * pass them again to the accumulator or combiner functions, or return them - * to the caller of the reduction operation.</li> - * <li>If a result is passed to the accumulator or combiner function, and - * the same object is not returned from that function, it is never used - * again.</li> - * <li>Once a result is passed to the combiner function, it is never passed - * to the accumulator function again.</li> + * pass them again to the accumulator, combiner, or finisher functions, + * or return them to the caller of the reduction operation.</li> + * <li>If a result is passed to the combiner or finisher + * function, and the same object is not returned from that function, it is + * never used again.</li> + * <li>Once a result is passed to the combiner or finisher function, it + * is never passed to the accumulator function again.</li> * <li>For non-concurrent collectors, any result returned from the result * supplier, accumulator, or combiner functions must be serially * thread-confined. This enables collection to occur in parallel without @@ -132,11 +136,10 @@ * Performing a reduction operation with a {@code Collector} should produce a * result equivalent to: * <pre>{@code - * BiFunction<R,T,R> accumulator = collector.accumulator(); - * R result = collector.resultSupplier().get(); + * R container = collector.supplier().get(); * for (T t : data) - * result = accumulator.apply(result, t); - * return result; + * collector.accumulator().accept(container, t); + * return collector.finisher().apply(container); * }</pre> * * <p>However, the library is free to partition the input, perform the reduction @@ -149,7 +152,7 @@ * is accumulating elements into a {@code TreeSet}. In this case, the {@code * resultSupplier()} function is {@code () -> new Treeset<T>()}, the * {@code accumulator} function is - * {@code (set, element) -> { set.add(element); return set; }}, and the combiner + * {@code (set, element) -> set.add(element) }, and the combiner * function is {@code (left, right) -> { left.addAll(right); return left; }}. * (This behavior is implemented by * {@code Collectors.toCollection(TreeSet::new)}). @@ -159,51 +162,49 @@ * @see Stream#collect(Collector) * @see Collectors * - * @param <T> the type of input element to the collect operation - * @param <R> the result type of the collect operation + * @param <T> the type of input elements to the reduction operation + * @param <A> the mutable accumulation type of the reduction operation (often + * hidden as an implementation detail) + * @param <R> the result type of the reduction operation * @since 1.8 */ -public interface Collector<T, R> { +public interface Collector<T, A, R> { /** - * A function that creates and returns a new result that represents - * "no values". If the accumulator or combiner functions may mutate their - * arguments, this must be a new, empty result container. + * A function that creates and returns a new mutable result container. * - * @return a function which, when invoked, returns a result representing - * "no values" + * @return a function which returns a new, mutable result container */ - Supplier<R> resultSupplier(); + Supplier<A> supplier(); /** - * A function that folds a new value into a cumulative result. The result - * may be a mutable result container or a value. The accumulator function - * may modify a mutable container and return it, or create a new result and - * return that, but if it returns a new result object, it must not modify - * any of its arguments. + * A function that folds a new value into a mutable result container. * - * <p>If the collector has the {@link Characteristics#STRICTLY_MUTATIVE} - * characteristic, then the accumulator function <em>must</em> always return - * its first argument, after possibly mutating its state. - * - * @return a function which folds a new value into a cumulative result + * @return a function which folds a new value into a mutable result container */ - BiFunction<R, T, R> accumulator(); + BiConsumer<A, T> accumulator(); /** * A function that accepts two partial results and merges them. The * combiner function may fold state from one argument into the other and - * return that, or may return a new result object, but if it returns - * a new result object, it must not modify the state of either of its - * arguments. - * - * <p>If the collector has the {@link Characteristics#STRICTLY_MUTATIVE} - * characteristic, then the combiner function <em>must</em> always return - * its first argument, after possibly mutating its state. + * return that, or may return a new result object. * * @return a function which combines two partial results into a cumulative * result */ - BinaryOperator<R> combiner(); + BinaryOperator<A> combiner(); + + /** + * Perform the final transformation from the intermediate accumulation type + * {@code A} to the final result representation {@code R}. + * + * <p>If the characteristic {@code IDENTITY_TRANSFORM} is + * set, this function may be presumed to be an identity transform with an + * unchecked cast from {@code A} to {@code R}. + * + * @return a function which transforms the intermediate result to the final + * result + */ + Function<A, R> finisher(); /** * Returns a {@code Set} of {@code Collector.Characteristics} indicating @@ -214,6 +215,62 @@ Set<Characteristics> characteristics(); /** + * Returns a new {@code Collector} described by the given {@code supplier}, + * {@code accumulator}, and {@code combiner} functions. The resulting + * {@code Collector} has the {@code Collector.Characteristics.IDENTITY_FINISH} + * characteristic. + * + * @param supplier The supplier function for the new collector + * @param accumulator The accumulator function for the new collector + * @param combiner The combiner function for the new collector + * @param characteristics The collector characteristics for the new + * collector + * @param <T> The type of input elements for the new collector + * @param <R> The type of intermediate accumulation result, and final result, + * for the new collector + * @return the new {@code Collector} + */ + public static<T, R> Collector<T, R, R> of(Supplier<R> supplier, + BiConsumer<R, T> accumulator, + BinaryOperator<R> combiner, + Characteristics... characteristics) { + Set<Characteristics> cs = (characteristics.length == 0) + ? Collectors.CH_ID + : Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH, + characteristics)); + return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, cs); + } + + /** + * Returns a new {@code Collector} described by the given {@code supplier}, + * {@code accumulator}, {@code combiner}, and {@code finisher} functions. + * + * @param supplier The supplier function for the new collector + * @param accumulator The accumulator function for the new collector + * @param combiner The combiner function for the new collector + * @param finisher The finisher function for the new collector + * @param characteristics The collector characteristics for the new + * collector + * @param <T> The type of input elements for the new collector + * @param <A> The intermediate accumulation type of the new collector + * @param <R> The final result type of the new collector + * @return the new {@code Collector} + */ + public static<T, A, R> Collector<T, A, R> of(Supplier<A> supplier, + BiConsumer<A, T> accumulator, + BinaryOperator<A> combiner, + Function<A, R> finisher, + Characteristics... characteristics) { + Set<Characteristics> cs = Collectors.CH_NOID; + if (characteristics.length > 0) { + cs = EnumSet.noneOf(Characteristics.class); + Collections.addAll(cs, characteristics); + cs = Collections.unmodifiableSet(cs); + } + return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, finisher, cs); + } + + /** * Characteristics indicating properties of a {@code Collector}, which can * be used to optimize reduction implementations. */ @@ -222,8 +279,7 @@ * Indicates that this collector is <em>concurrent</em>, meaning that * the result container can support the accumulator function being * called concurrently with the same result container from multiple - * threads. Concurrent collectors must also always have the - * {@code STRICTLY_MUTATIVE} characteristic. + * threads. * * <p>If a {@code CONCURRENT} collector is not also {@code UNORDERED}, * then it should only be evaluated concurrently if applied to an @@ -238,12 +294,10 @@ UNORDERED, /** - * Indicates that this collector operates by strict mutation of its - * result container. This means that the {@link #accumulator()} and - * {@link #combiner()} functions will always modify the state of and - * return their first argument, rather than returning a different result - * container. + * Indicates that the finisher function is the identity function and + * can be elided. If set, it must be the case that an unchecked cast + * from A to R will succeed. */ - STRICTLY_MUTATIVE + IDENTITY_FINISH } }
--- a/jdk/src/share/classes/java/util/stream/Collectors.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/Collectors.java Wed Jul 05 19:07:19 2017 +0200 @@ -27,6 +27,7 @@ import java.util.AbstractMap; import java.util.AbstractSet; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -39,14 +40,16 @@ import java.util.List; import java.util.LongSummaryStatistics; import java.util.Map; -import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.StringJoiner; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.BinaryOperator; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -64,20 +67,21 @@ * mutable reduction tasks: * * <pre>{@code - * // Accumulate elements into a List - * List<Person> list = people.collect(Collectors.toList()); + * // Accumulate names into a List + * List<String> list = people.stream().map(Person::getName).collect(Collectors.toList()); * - * // Accumulate elements into a TreeSet - * List<Person> list = people.collect(Collectors.toCollection(TreeSet::new)); + * // Accumulate names into a TreeSet + * Set<String> list = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new)); * * // Convert elements to strings and concatenate them, separated by commas - * String joined = stream.map(Object::toString) - * .collect(Collectors.toStringJoiner(", ")) - * .toString(); + * String joined = things.stream() + * .map(Object::toString) + * .collect(Collectors.joining(", ")); * * // Find highest-paid employee * Employee highestPaid = employees.stream() - * .collect(Collectors.maxBy(Comparator.comparing(Employee::getSalary))); + * .collect(Collectors.maxBy(Comparator.comparing(Employee::getSalary))) + * .get(); * * // Group employees by department * Map<Department, List<Employee>> byDept @@ -85,7 +89,7 @@ * .collect(Collectors.groupingBy(Employee::getDepartment)); * * // Find highest-paid employee by department - * Map<Department, Employee> highestPaidByDept + * Map<Department, Optional<Employee>> highestPaidByDept * = employees.stream() * .collect(Collectors.groupingBy(Employee::getDepartment, * Collectors.maxBy(Comparator.comparing(Employee::getSalary)))); @@ -93,7 +97,7 @@ * // Partition students into passing and failing * Map<Boolean, List<Student>> passingFailing = * students.stream() - * .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD); + * .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD)); * * }</pre> * @@ -103,15 +107,19 @@ */ public final class Collectors { - private static final Set<Collector.Characteristics> CH_CONCURRENT + static final Set<Collector.Characteristics> CH_CONCURRENT_ID = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.CONCURRENT, - Collector.Characteristics.STRICTLY_MUTATIVE, + Collector.Characteristics.UNORDERED, + Collector.Characteristics.IDENTITY_FINISH)); + static final Set<Collector.Characteristics> CH_CONCURRENT_NOID + = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.CONCURRENT, Collector.Characteristics.UNORDERED)); - private static final Set<Collector.Characteristics> CH_STRICT - = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.STRICTLY_MUTATIVE)); - private static final Set<Collector.Characteristics> CH_STRICT_UNORDERED - = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.STRICTLY_MUTATIVE, - Collector.Characteristics.UNORDERED)); + static final Set<Collector.Characteristics> CH_ID + = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)); + static final Set<Collector.Characteristics> CH_UNORDERED_ID + = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.UNORDERED, + Collector.Characteristics.IDENTITY_FINISH)); + static final Set<Collector.Characteristics> CH_NOID = Collections.emptySet(); private Collectors() { } @@ -124,88 +132,64 @@ * * @param <T> the type of input arguments to the merge function * @return a merge function which always throw {@code IllegalStateException} - * - * @see #firstWinsMerger() - * @see #lastWinsMerger() */ - public static <T> BinaryOperator<T> throwingMerger() { + private static <T> BinaryOperator<T> throwingMerger() { return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); }; } /** - * Returns a merge function, suitable for use in - * {@link Map#merge(Object, Object, BiFunction) Map.merge()} or - * {@link #toMap(Function, Function, BinaryOperator) toMap()}, - * which implements a "first wins" policy. - * - * @param <T> the type of input arguments to the merge function - * @return a merge function which always returns its first argument - * @see #lastWinsMerger() - * @see #throwingMerger() - */ - public static <T> BinaryOperator<T> firstWinsMerger() { - return (u,v) -> u; - } - - /** - * Returns a merge function, suitable for use in - * {@link Map#merge(Object, Object, BiFunction) Map.merge()} or - * {@link #toMap(Function, Function, BinaryOperator) toMap()}, - * which implements a "last wins" policy. - * - * @param <T> the type of input arguments to the merge function - * @return a merge function which always returns its second argument - * @see #firstWinsMerger() - * @see #throwingMerger() - */ - public static <T> BinaryOperator<T> lastWinsMerger() { - return (u,v) -> v; - } - - /** * Simple implementation class for {@code Collector}. * * @param <T> the type of elements to be collected * @param <R> the type of the result */ - private static final class CollectorImpl<T, R> implements Collector<T,R> { - private final Supplier<R> resultSupplier; - private final BiFunction<R, T, R> accumulator; - private final BinaryOperator<R> combiner; + static class CollectorImpl<T, A, R> implements Collector<T, A, R> { + private final Supplier<A> supplier; + private final BiConsumer<A, T> accumulator; + private final BinaryOperator<A> combiner; + private final Function<A, R> finisher; private final Set<Characteristics> characteristics; - CollectorImpl(Supplier<R> resultSupplier, - BiFunction<R, T, R> accumulator, - BinaryOperator<R> combiner, + CollectorImpl(Supplier<A> supplier, + BiConsumer<A, T> accumulator, + BinaryOperator<A> combiner, + Function<A,R> finisher, Set<Characteristics> characteristics) { - this.resultSupplier = resultSupplier; + this.supplier = supplier; this.accumulator = accumulator; this.combiner = combiner; + this.finisher = finisher; this.characteristics = characteristics; } - CollectorImpl(Supplier<R> resultSupplier, - BiFunction<R, T, R> accumulator, - BinaryOperator<R> combiner) { - this(resultSupplier, accumulator, combiner, Collections.emptySet()); + CollectorImpl(Supplier<A> supplier, + BiConsumer<A, T> accumulator, + BinaryOperator<A> combiner, + Set<Characteristics> characteristics) { + this(supplier, accumulator, combiner, i -> (R) i, characteristics); } @Override - public BiFunction<R, T, R> accumulator() { + public BiConsumer<A, T> accumulator() { return accumulator; } @Override - public Supplier<R> resultSupplier() { - return resultSupplier; + public Supplier<A> supplier() { + return supplier; } @Override - public BinaryOperator<R> combiner() { + public BinaryOperator<A> combiner() { return combiner; } @Override + public Function<A, R> finisher() { + return finisher; + } + + @Override public Set<Characteristics> characteristics() { return characteristics; } @@ -224,11 +208,10 @@ * {@code Collection}, in encounter order */ public static <T, C extends Collection<T>> - Collector<T, C> toCollection(Supplier<C> collectionFactory) { - return new CollectorImpl<>(collectionFactory, - (r, t) -> { r.add(t); return r; }, + Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) { + return new CollectorImpl<>(collectionFactory, Collection::add, (r1, r2) -> { r1.addAll(r2); return r1; }, - CH_STRICT); + CH_ID); } /** @@ -241,36 +224,10 @@ * {@code List}, in encounter order */ public static <T> - Collector<T, List<T>> toList() { - BiFunction<List<T>, T, List<T>> accumulator = (list, t) -> { - switch (list.size()) { - case 0: - return Collections.singletonList(t); - case 1: - List<T> newList = new ArrayList<>(); - newList.add(list.get(0)); - newList.add(t); - return newList; - default: - list.add(t); - return list; - } - }; - BinaryOperator<List<T>> combiner = (left, right) -> { - switch (left.size()) { - case 0: - return right; - case 1: - List<T> newList = new ArrayList<>(left.size() + right.size()); - newList.addAll(left); - newList.addAll(right); - return newList; - default: - left.addAll(right); - return left; - } - }; - return new CollectorImpl<>(Collections::emptyList, accumulator, combiner); + Collector<T, ?, List<T>> toList() { + return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add, + (left, right) -> { left.addAll(right); return left; }, + CH_ID); } /** @@ -286,44 +243,58 @@ * {@code Set} */ public static <T> - Collector<T, Set<T>> toSet() { - return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, - (r, t) -> { r.add(t); return r; }, - (r1, r2) -> { r1.addAll(r2); return r1; }, - CH_STRICT_UNORDERED); + Collector<T, ?, Set<T>> toSet() { + return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add, + (left, right) -> { left.addAll(right); return left; }, + CH_UNORDERED_ID); } /** * Returns a {@code Collector} that concatenates the input elements into a - * new {@link StringBuilder}. + * {@code String}, in encounter order. * - * @return a {@code Collector} which collects String elements into a - * {@code StringBuilder}, in encounter order + * @return a {@code Collector} that concatenates the input elements into a + * {@code String}, in encounter order */ - public static Collector<String, StringBuilder> toStringBuilder() { - return new CollectorImpl<>(StringBuilder::new, - (r, t) -> { r.append(t); return r; }, - (r1, r2) -> { r1.append(r2); return r1; }, - CH_STRICT); + public static Collector<CharSequence, ?, String> joining() { + return new CollectorImpl<CharSequence, StringBuilder, String>( + StringBuilder::new, StringBuilder::append, + (r1, r2) -> { r1.append(r2); return r1; }, + StringBuilder::toString, CH_NOID); } /** - * Returns a {@code Collector} that concatenates the input elements into a - * new {@link StringJoiner}, using the specified delimiter. + * Returns a {@code Collector} that concatenates the input elements, + * separated by the specified delimiter, in encounter order. * * @param delimiter the delimiter to be used between each element - * @return A {@code Collector} which collects String elements into a - * {@code StringJoiner}, in encounter order + * @return A {@code Collector} which concatenates CharSequence elements, + * separated by the specified delimiter, in encounter order */ - public static Collector<CharSequence, StringJoiner> toStringJoiner(CharSequence delimiter) { - BinaryOperator<StringJoiner> merger = (sj, other) -> { - if (other.length() > 0) - sj.add(other.toString()); - return sj; - }; - return new CollectorImpl<>(() -> new StringJoiner(delimiter), - (r, t) -> { r.add(t); return r; }, - merger, CH_STRICT); + public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) { + return joining(delimiter, "", ""); + } + + /** + * Returns a {@code Collector} that concatenates the input elements, + * separated by the specified delimiter, with the specified prefix and + * suffix, in encounter order. + * + * @param delimiter the delimiter to be used between each element + * @param prefix the sequence of characters to be used at the beginning + * of the joined result + * @param suffix the sequence of characters to be used at the end + * of the joined result + * @return A {@code Collector} which concatenates CharSequence elements, + * separated by the specified delimiter, in encounter order + */ + public static Collector<CharSequence, ?, String> joining(CharSequence delimiter, + CharSequence prefix, + CharSequence suffix) { + return new CollectorImpl<>( + () -> new StringJoiner(delimiter, prefix, suffix), + StringJoiner::add, StringJoiner::merge, + StringJoiner::toString, CH_NOID); } /** @@ -348,12 +319,13 @@ } /** - * Adapts a {@code Collector<U,R>} to a {@code Collector<T,R>} by applying - * a mapping function to each input element before accumulation. + * Adapts a {@code Collector} accepting elements of type {@code U} to one + * accepting elements of type {@code T} by applying a mapping function to + * each input element before accumulation. * * @apiNote * The {@code mapping()} collectors are most useful when used in a - * multi-level reduction, downstream of {@code groupingBy} or + * multi-level reduction, such as downstream of a {@code groupingBy} or * {@code partitioningBy}. For example, given a stream of * {@code Person}, to accumulate the set of last names in each city: * <pre>{@code @@ -364,23 +336,27 @@ * * @param <T> the type of the input elements * @param <U> type of elements accepted by downstream collector + * @param <A> intermediate accumulation type of the downstream collector * @param <R> result type of collector * @param mapper a function to be applied to the input elements * @param downstream a collector which will accept mapped values * @return a collector which applies the mapping function to the input * elements and provides the mapped results to the downstream collector */ - public static <T, U, R> Collector<T, R> - mapping(Function<? super T, ? extends U> mapper, Collector<? super U, R> downstream) { - BiFunction<R, ? super U, R> downstreamAccumulator = downstream.accumulator(); - return new CollectorImpl<>(downstream.resultSupplier(), - (r, t) -> downstreamAccumulator.apply(r, mapper.apply(t)), - downstream.combiner(), downstream.characteristics()); + public static <T, U, A, R> + Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper, + Collector<? super U, A, R> downstream) { + BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator(); + return new CollectorImpl<>(downstream.supplier(), + (r, t) -> downstreamAccumulator.accept(r, mapper.apply(t)), + downstream.combiner(), downstream.finisher(), + downstream.characteristics()); } /** - * Returns a {@code Collector<T, Long>} that counts the number of input - * elements. + * 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. * * @implSpec * This produces a result equivalent to: @@ -391,14 +367,14 @@ * @param <T> the type of the input elements * @return a {@code Collector} that counts the input elements */ - public static <T> Collector<T, Long> + public static <T> Collector<T, ?, Long> counting() { return reducing(0L, e -> 1L, Long::sum); } /** - * Returns a {@code Collector<T, T>} that produces the minimal element - * according to a given {@code Comparator}. + * Returns a {@code Collector} that produces the minimal element according + * to a given {@code Comparator}, described as an {@code Optional<T>}. * * @implSpec * This produces a result equivalent to: @@ -410,14 +386,14 @@ * @param comparator a {@code Comparator} for comparing elements * @return a {@code Collector} that produces the minimal value */ - public static <T> Collector<T, T> + public static <T> Collector<T, ?, Optional<T>> minBy(Comparator<? super T> comparator) { return reducing(BinaryOperator.minBy(comparator)); } /** - * Returns a {@code Collector<T, T>} that produces the maximal element - * according to a given {@code Comparator}. + * Returns a {@code Collector} that produces the maximal element according + * to a given {@code Comparator}, described as an {@code Optional<T>}. * * @implSpec * This produces a result equivalent to: @@ -429,39 +405,143 @@ * @param comparator a {@code Comparator} for comparing elements * @return a {@code Collector} that produces the maximal value */ - public static <T> Collector<T, T> + public static <T> Collector<T, ?, Optional<T>> maxBy(Comparator<? super T> comparator) { return reducing(BinaryOperator.maxBy(comparator)); } /** - * Returns a {@code Collector<T, Long>} that produces the sum of a - * long-valued function applied to the input element. + * Returns a {@code Collector} that produces the sum of a integer-valued + * function applied to the input elements. If no elements are present, + * the result is 0. + * + * @param <T> the type of the input elements + * @param mapper a function extracting the property to be summed + * @return a {@code Collector} that produces the sum of a derived property + */ + public static <T> Collector<T, ?, Integer> + summingInt(ToIntFunction<? super T> mapper) { + return new CollectorImpl<T, int[], Integer>( + () -> new int[1], + (a, t) -> { a[0] += mapper.applyAsInt(t); }, + (a, b) -> { a[0] += b[0]; return a; }, + a -> a[0], CH_NOID); + } + + /** + * Returns a {@code Collector} that produces the sum of a long-valued + * function applied to the input elements. If no elements are present, + * the result is 0. * - * @implSpec - * This produces a result equivalent to: - * <pre>{@code - * reducing(0L, mapper, Long::sum) - * }</pre> + * @param <T> the type of the input elements + * @param mapper a function extracting the property to be summed + * @return a {@code Collector} that produces the sum of a derived property + */ + public static <T> Collector<T, ?, Long> + summingLong(ToLongFunction<? super T> mapper) { + return new CollectorImpl<T, long[], Long>( + () -> new long[1], + (a, t) -> { a[0] += mapper.applyAsLong(t); }, + (a, b) -> { a[0] += b[0]; return a; }, + a -> a[0], CH_NOID); + } + + /** + * Returns a {@code Collector} that produces the sum of a double-valued + * function applied to the input elements. If no elements are present, + * the result is 0. + * + * <p>The sum returned can vary depending upon the order in which + * values are recorded, due to accumulated rounding error in + * addition of values of differing magnitudes. Values sorted by increasing + * absolute magnitude tend to yield more accurate results. If any recorded + * value is a {@code NaN} or the sum is at any point a {@code NaN} then the + * sum will be {@code NaN}. * * @param <T> the type of the input elements * @param mapper a function extracting the property to be summed * @return a {@code Collector} that produces the sum of a derived property */ - public static <T> Collector<T, Long> - sumBy(Function<? super T, Long> mapper) { - return reducing(0L, mapper, Long::sum); + public static <T> Collector<T, ?, Double> + summingDouble(ToDoubleFunction<? super T> mapper) { + return new CollectorImpl<T, double[], Double>( + () -> new double[1], + (a, t) -> { a[0] += mapper.applyAsDouble(t); }, + (a, b) -> { a[0] += b[0]; return a; }, + a -> a[0], CH_NOID); + } + + /** + * Returns a {@code Collector} that produces the arithmetic mean of an integer-valued + * function applied to the input elements. If no elements are present, + * the result is 0. + * + * @param <T> the type of the input elements + * @param mapper a function extracting the property to be summed + * @return a {@code Collector} that produces the sum of a derived property + */ + public static <T> Collector<T, ?, Double> + averagingInt(ToIntFunction<? super T> mapper) { + return new CollectorImpl<T, long[], Double>( + () -> new long[2], + (a, t) -> { a[0] += mapper.applyAsInt(t); a[1]++; }, + (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; }, + a -> (a[1] == 0) ? 0.0d : (double) a[0] / a[1], CH_NOID); } /** - * Returns a {@code Collector<T,T>} which performs a reduction of its - * input elements under a specified {@code BinaryOperator}. + * Returns a {@code Collector} that produces the arithmetic mean of a long-valued + * function applied to the input elements. If no elements are present, + * the result is 0. + * + * @param <T> the type of the input elements + * @param mapper a function extracting the property to be summed + * @return a {@code Collector} that produces the sum of a derived property + */ + public static <T> Collector<T, ?, Double> + averagingLong(ToLongFunction<? super T> mapper) { + return new CollectorImpl<T, long[], Double>( + () -> new long[2], + (a, t) -> { a[0] += mapper.applyAsLong(t); a[1]++; }, + (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; }, + a -> (a[1] == 0) ? 0.0d : (double) a[0] / a[1], CH_NOID); + } + + /** + * Returns a {@code Collector} that produces the arithmetic mean of a double-valued + * function applied to the input elements. If no elements are present, + * the result is 0. + * + * <p>The average returned can vary depending upon the order in which + * values are recorded, due to accumulated rounding error in + * addition of values of differing magnitudes. Values sorted by increasing + * absolute magnitude tend to yield more accurate results. If any recorded + * value is a {@code NaN} or the sum is at any point a {@code NaN} then the + * average will be {@code NaN}. + * + * @param <T> the type of the input elements + * @param mapper a function extracting the property to be summed + * @return a {@code Collector} that produces the sum of a derived property + */ + public static <T> Collector<T, ?, Double> + averagingDouble(ToDoubleFunction<? super T> mapper) { + return new CollectorImpl<T, double[], Double>( + () -> new double[2], + (a, t) -> { a[0] += mapper.applyAsDouble(t); a[1]++; }, + (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; }, + a -> (a[1] == 0) ? 0.0d : a[0] / a[1], CH_NOID); + } + + /** + * Returns a {@code Collector} which performs a reduction of its + * input elements under a specified {@code BinaryOperator} using the + * provided identity. * * @apiNote * The {@code reducing()} collectors are most useful when used in a * multi-level reduction, downstream of {@code groupingBy} or * {@code partitioningBy}. To perform a simple reduction on a stream, - * use {@link Stream#reduce(BinaryOperator)} instead. + * use {@link Stream#reduce(Object, BinaryOperator)}} instead. * * @param <T> element type for the input and output of the reduction * @param identity the identity value for the reduction (also, the value @@ -472,14 +552,25 @@ * @see #reducing(BinaryOperator) * @see #reducing(Object, Function, BinaryOperator) */ - public static <T> Collector<T, T> + public static <T> Collector<T, ?, T> reducing(T identity, BinaryOperator<T> op) { - return new CollectorImpl<>(() -> identity, (r, t) -> (r == null ? t : op.apply(r, t)), op); + return new CollectorImpl<>( + boxSupplier(identity), + (a, t) -> { a[0] = op.apply(a[0], t); }, + (a, b) -> { a[0] = op.apply(a[0], b[0]); return a; }, + a -> a[0], + CH_NOID); + } + + @SuppressWarnings("unchecked") + private static <T> Supplier<T[]> boxSupplier(T identity) { + return () -> (T[]) new Object[] { identity }; } /** - * Returns a {@code Collector<T,T>} which performs a reduction of its - * input elements under a specified {@code BinaryOperator}. + * Returns a {@code Collector} which performs a reduction of its + * input elements under a specified {@code BinaryOperator}. The result + * is described as an {@code Optional<T>}. * * @apiNote * The {@code reducing()} collectors are most useful when used in a @@ -491,15 +582,8 @@ * person in each city: * <pre>{@code * Comparator<Person> byHeight = Comparator.comparing(Person::getHeight); - * BinaryOperator<Person> tallerOf = BinaryOperator.greaterOf(byHeight); * Map<City, Person> tallestByCity - * = people.stream().collect(groupingBy(Person::getCity, reducing(tallerOf))); - * }</pre> - * - * @implSpec - * The default implementation is equivalent to: - * <pre>{@code - * reducing(null, op); + * = people.stream().collect(groupingBy(Person::getCity, reducing(BinaryOperator.maxBy(byHeight)))); * }</pre> * * @param <T> element type for the input and output of the reduction @@ -509,13 +593,32 @@ * @see #reducing(Object, BinaryOperator) * @see #reducing(Object, Function, BinaryOperator) */ - public static <T> Collector<T, T> + public static <T> Collector<T, ?, Optional<T>> reducing(BinaryOperator<T> op) { - return reducing(null, op); + class OptionalBox implements Consumer<T> { + T value = null; + boolean present = false; + + @Override + public void accept(T t) { + if (present) { + value = op.apply(value, t); + } + else { + value = t; + present = true; + } + } + } + + return new CollectorImpl<T, OptionalBox, Optional<T>>( + OptionalBox::new, OptionalBox::accept, + (a, b) -> { if (b.present) a.accept(b.value); return a; }, + a -> Optional.ofNullable(a.value), CH_NOID); } /** - * Returns a {@code Collector<T,U>} which performs a reduction of its + * Returns a {@code Collector} which performs a reduction of its * input elements under a specified mapping function and * {@code BinaryOperator}. This is a generalization of * {@link #reducing(Object, BinaryOperator)} which allows a transformation @@ -524,17 +627,17 @@ * @apiNote * The {@code reducing()} collectors are most useful when used in a * multi-level reduction, downstream of {@code groupingBy} or - * {@code partitioningBy}. To perform a simple reduction on a stream, - * use {@link Stream#reduce(BinaryOperator)} instead. + * {@code partitioningBy}. To perform a simple map-reduce on a stream, + * use {@link Stream#map(Function)} and {@link Stream#reduce(Object, BinaryOperator)} + * instead. * * <p>For example, given a stream of {@code Person}, to calculate the longest * last name of residents in each city: * <pre>{@code * Comparator<String> byLength = Comparator.comparing(String::length); - * BinaryOperator<String> longerOf = BinaryOperator.greaterOf(byLength); * Map<City, String> longestLastNameByCity * = people.stream().collect(groupingBy(Person::getCity, - * reducing(Person::getLastName, longerOf))); + * reducing(Person::getLastName, BinaryOperator.maxBy(byLength)))); * }</pre> * * @param <T> the type of the input elements @@ -549,18 +652,20 @@ * @see #reducing(BinaryOperator) */ public static <T, U> - Collector<T, U> reducing(U identity, - Function<? super T, ? extends U> mapper, - BinaryOperator<U> op) { - return new CollectorImpl<>(() -> identity, - (r, t) -> (r == null ? mapper.apply(t) : op.apply(r, mapper.apply(t))), - op); + Collector<T, ?, U> reducing(U identity, + Function<? super T, ? extends U> mapper, + BinaryOperator<U> op) { + return new CollectorImpl<>( + boxSupplier(identity), + (a, t) -> { a[0] = op.apply(a[0], mapper.apply(t)); }, + (a, b) -> { a[0] = op.apply(a[0], b[0]); return a; }, + a -> a[0], CH_NOID); } /** * Returns a {@code Collector} implementing a "group by" operation on * input elements of type {@code T}, grouping elements according to a - * classification function. + * classification function, and returning the results in a {@code Map}. * * <p>The classification function maps elements to some key type {@code K}. * The collector produces a {@code Map<K, List<T>>} whose keys are the @@ -586,9 +691,9 @@ * @see #groupingBy(Function, Supplier, Collector) * @see #groupingByConcurrent(Function) */ - public static <T, K> - Collector<T, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier) { - return groupingBy(classifier, HashMap::new, toList()); + public static <T, K> Collector<T, ?, Map<K, List<T>>> + groupingBy(Function<? super T, ? extends K> classifier) { + return groupingBy(classifier, toList()); } /** @@ -615,6 +720,7 @@ * * @param <T> the type of the input elements * @param <K> the type of the keys + * @param <A> the intermediate accumulation type of the downstream collector * @param <D> the result type of the downstream reduction * @param classifier a classifier function mapping input elements to keys * @param downstream a {@code Collector} implementing the downstream reduction @@ -624,9 +730,9 @@ * @see #groupingBy(Function, Supplier, Collector) * @see #groupingByConcurrent(Function, Collector) */ - public static <T, K, D> - Collector<T, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier, - Collector<? super T, D> downstream) { + public static <T, K, A, D> + Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier, + Collector<? super T, A, D> downstream) { return groupingBy(classifier, HashMap::new, downstream); } @@ -653,6 +759,7 @@ * * @param <T> the type of the input elements * @param <K> the type of the keys + * @param <A> the intermediate accumulation type of the downstream collector * @param <D> the result type of the downstream reduction * @param <M> the type of the resulting {@code Map} * @param classifier a classifier function mapping input elements to keys @@ -665,25 +772,39 @@ * @see #groupingBy(Function) * @see #groupingByConcurrent(Function, Supplier, Collector) */ - public static <T, K, D, M extends Map<K, D>> - Collector<T, M> groupingBy(Function<? super T, ? extends K> classifier, - Supplier<M> mapFactory, - Collector<? super T, D> downstream) { - Supplier<D> downstreamSupplier = downstream.resultSupplier(); - BiFunction<D, ? super T, D> downstreamAccumulator = downstream.accumulator(); - BiFunction<M, T, M> accumulator = (m, t) -> { + public static <T, K, D, A, M extends Map<K, D>> + Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier, + Supplier<M> mapFactory, + Collector<? super T, A, D> downstream) { + Supplier<A> downstreamSupplier = downstream.supplier(); + BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator(); + BiConsumer<Map<K, A>, T> accumulator = (m, t) -> { K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key"); - D oldContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get()); - D newContainer = downstreamAccumulator.apply(oldContainer, t); - if (newContainer != oldContainer) - m.put(key, newContainer); - return m; + A container = m.computeIfAbsent(key, k -> downstreamSupplier.get()); + downstreamAccumulator.accept(container, t); }; - return new CollectorImpl<>(mapFactory, accumulator, mapMerger(downstream.combiner()), CH_STRICT); + BinaryOperator<Map<K, A>> merger = Collectors.<K, A, Map<K, A>>mapMerger(downstream.combiner()); + @SuppressWarnings("unchecked") + Supplier<Map<K, A>> mangledFactory = (Supplier<Map<K, A>>) mapFactory; + + if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) { + return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_ID); + } + else { + @SuppressWarnings("unchecked") + Function<A, A> downstreamFinisher = (Function<A, A>) downstream.finisher(); + Function<Map<K, A>, M> finisher = intermediate -> { + intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v)); + @SuppressWarnings("unchecked") + M castResult = (M) intermediate; + return castResult; + }; + return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_NOID); + } } /** - * Returns a {@code Collector} implementing a concurrent "group by" + * Returns a concurrent {@code Collector} implementing a "group by" * operation on input elements of type {@code T}, grouping elements * according to a classification function. * @@ -716,12 +837,13 @@ * @see #groupingByConcurrent(Function, Supplier, Collector) */ public static <T, K> - Collector<T, ConcurrentMap<K, List<T>>> groupingByConcurrent(Function<? super T, ? extends K> classifier) { + Collector<T, ?, ConcurrentMap<K, List<T>>> + groupingByConcurrent(Function<? super T, ? extends K> classifier) { return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList()); } /** - * Returns a {@code Collector} implementing a concurrent cascaded "group by" + * Returns a concurrent {@code Collector} implementing a cascaded "group by" * operation on input elements of type {@code T}, grouping elements * according to a classification function, and then performing a reduction * operation on the values associated with a given key using the specified @@ -739,12 +861,13 @@ * where the city names are sorted: * <pre>{@code * ConcurrentMap<City, Set<String>> namesByCity - * = people.stream().collect(groupingByConcurrent(Person::getCity, TreeMap::new, + * = people.stream().collect(groupingByConcurrent(Person::getCity, ConcurrentSkipListMap::new, * mapping(Person::getLastName, toSet()))); * }</pre> * * @param <T> the type of the input elements * @param <K> the type of the keys + * @param <A> the intermediate accumulation type of the downstream collector * @param <D> the result type of the downstream reduction * @param classifier a classifier function mapping input elements to keys * @param downstream a {@code Collector} implementing the downstream reduction @@ -754,9 +877,9 @@ * @see #groupingByConcurrent(Function) * @see #groupingByConcurrent(Function, Supplier, Collector) */ - public static <T, K, D> - Collector<T, ConcurrentMap<K, D>> groupingByConcurrent(Function<? super T, ? extends K> classifier, - Collector<? super T, D> downstream) { + public static <T, K, A, D> + Collector<T, ?, ConcurrentMap<K, D>> groupingByConcurrent(Function<? super T, ? extends K> classifier, + Collector<? super T, A, D> downstream) { return groupingByConcurrent(classifier, ConcurrentHashMap::new, downstream); } @@ -787,6 +910,7 @@ * * @param <T> the type of the input elements * @param <K> the type of the keys + * @param <A> the intermediate accumulation type of the downstream collector * @param <D> the result type of the downstream reduction * @param <M> the type of the resulting {@code ConcurrentMap} * @param classifier a classifier function mapping input elements to keys @@ -799,51 +923,46 @@ * @see #groupingByConcurrent(Function, Collector) * @see #groupingBy(Function, Supplier, Collector) */ - public static <T, K, D, M extends ConcurrentMap<K, D>> - Collector<T, M> groupingByConcurrent(Function<? super T, ? extends K> classifier, - Supplier<M> mapFactory, - Collector<? super T, D> downstream) { - Supplier<D> downstreamSupplier = downstream.resultSupplier(); - BiFunction<D, ? super T, D> downstreamAccumulator = downstream.accumulator(); - BinaryOperator<M> combiner = mapMerger(downstream.combiner()); + public static <T, K, A, D, M extends ConcurrentMap<K, D>> + Collector<T, ?, M> groupingByConcurrent(Function<? super T, ? extends K> classifier, + Supplier<M> mapFactory, + Collector<? super T, A, D> downstream) { + Supplier<A> downstreamSupplier = downstream.supplier(); + BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator(); + BinaryOperator<ConcurrentMap<K, A>> merger = Collectors.<K, A, ConcurrentMap<K, A>>mapMerger(downstream.combiner()); + @SuppressWarnings("unchecked") + Supplier<ConcurrentMap<K, A>> mangledFactory = (Supplier<ConcurrentMap<K, A>>) mapFactory; + BiConsumer<ConcurrentMap<K, A>, T> accumulator; if (downstream.characteristics().contains(Collector.Characteristics.CONCURRENT)) { - BiFunction<M, T, M> accumulator = (m, t) -> { + accumulator = (m, t) -> { K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key"); - downstreamAccumulator.apply(m.computeIfAbsent(key, k -> downstreamSupplier.get()), t); - return m; - }; - return new CollectorImpl<>(mapFactory, accumulator, combiner, CH_CONCURRENT); - } else if (downstream.characteristics().contains(Collector.Characteristics.STRICTLY_MUTATIVE)) { - BiFunction<M, T, M> accumulator = (m, t) -> { - K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key"); - D resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get()); - synchronized (resultContainer) { - downstreamAccumulator.apply(resultContainer, t); - } - return m; + A resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get()); + downstreamAccumulator.accept(resultContainer, t); }; - return new CollectorImpl<>(mapFactory, accumulator, combiner, CH_CONCURRENT); - } else { - BiFunction<M, T, M> accumulator = (m, t) -> { + } + else { + accumulator = (m, t) -> { K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key"); - do { - D oldResult = m.computeIfAbsent(key, k -> downstreamSupplier.get()); - if (oldResult == null) { - if (m.putIfAbsent(key, downstreamAccumulator.apply(null, t)) == null) - return m; - } else { - synchronized (oldResult) { - if (m.get(key) != oldResult) - continue; - D newResult = downstreamAccumulator.apply(oldResult, t); - if (oldResult != newResult) - m.put(key, newResult); - return m; - } - } - } while (true); + A resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get()); + synchronized (resultContainer) { + downstreamAccumulator.accept(resultContainer, t); + } }; - return new CollectorImpl<>(mapFactory, accumulator, combiner, CH_CONCURRENT); + } + + if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) { + return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_CONCURRENT_ID); + } + else { + @SuppressWarnings("unchecked") + Function<A, A> downstreamFinisher = (Function<A, A>) downstream.finisher(); + Function<ConcurrentMap<K, A>, M> finisher = intermediate -> { + intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v)); + @SuppressWarnings("unchecked") + M castResult = (M) intermediate; + return castResult; + }; + return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_CONCURRENT_NOID); } } @@ -862,7 +981,7 @@ * @see #partitioningBy(Predicate, Collector) */ public static <T> - Collector<T, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) { + Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) { return partitioningBy(predicate, toList()); } @@ -877,6 +996,7 @@ * serializability, or thread-safety of the {@code Map} returned. * * @param <T> the type of the input elements + * @param <A> the intermediate accumulation type of the downstream collector * @param <D> the result type of the downstream reduction * @param predicate a predicate used for classifying input elements * @param downstream a {@code Collector} implementing the downstream @@ -886,52 +1006,43 @@ * * @see #partitioningBy(Predicate) */ - public static <T, D> - Collector<T, Map<Boolean, D>> partitioningBy(Predicate<? super T> predicate, - Collector<? super T, D> downstream) { - BiFunction<D, ? super T, D> downstreamAccumulator = downstream.accumulator(); - BiFunction<Map<Boolean, D>, T, Map<Boolean, D>> accumulator = (result, t) -> { + public static <T, D, A> + Collector<T, ?, Map<Boolean, D>> partitioningBy(Predicate<? super T> predicate, + Collector<? super T, A, D> downstream) { + @SuppressWarnings("unchecked") + BiConsumer<D, ? super T> downstreamAccumulator = (BiConsumer<D, ? super T>) downstream.accumulator(); + BiConsumer<Map<Boolean, A>, T> accumulator = (result, t) -> { Partition<D> asPartition = ((Partition<D>) result); - if (predicate.test(t)) { - D newResult = downstreamAccumulator.apply(asPartition.forTrue, t); - if (newResult != asPartition.forTrue) - asPartition.forTrue = newResult; - } else { - D newResult = downstreamAccumulator.apply(asPartition.forFalse, t); - if (newResult != asPartition.forFalse) - asPartition.forFalse = newResult; - } - return result; + downstreamAccumulator.accept(predicate.test(t) ? asPartition.forTrue : asPartition.forFalse, t); + }; + BinaryOperator<A> op = downstream.combiner(); + BinaryOperator<Map<Boolean, A>> merger = (m1, m2) -> { + Partition<A> left = (Partition<A>) m1; + Partition<A> right = (Partition<A>) m2; + return new Partition<>(op.apply(left.forTrue, right.forTrue), + op.apply(left.forFalse, right.forFalse)); }; - return new CollectorImpl<>(() -> new Partition<>(downstream.resultSupplier().get(), - downstream.resultSupplier().get()), - accumulator, partitionMerger(downstream.combiner()), CH_STRICT); + Supplier<Map<Boolean, A>> supplier = () -> new Partition<>(downstream.supplier().get(), + downstream.supplier().get()); + if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) { + return new CollectorImpl<>(supplier, accumulator, merger, CH_ID); + } + else { + Function<Map<Boolean, A>, Map<Boolean, D>> finisher = (Map<Boolean, A> par) -> { + Partition<A> asAPartition = (Partition<A>) par; + return new Partition<>(downstream.finisher().apply(asAPartition.forTrue), + downstream.finisher().apply(asAPartition.forFalse)); + }; + return new CollectorImpl<>(supplier, accumulator, merger, finisher, CH_NOID); + } } /** - * Merge function for two partitions, given a merge function for the - * elements. - */ - private static <D> BinaryOperator<Map<Boolean, D>> partitionMerger(BinaryOperator<D> op) { - return (m1, m2) -> { - Partition<D> left = (Partition<D>) m1; - Partition<D> right = (Partition<D>) m2; - if (left.forFalse == null) - left.forFalse = right.forFalse; - else if (right.forFalse != null) - left.forFalse = op.apply(left.forFalse, right.forFalse); - if (left.forTrue == null) - left.forTrue = right.forTrue; - else if (right.forTrue != null) - left.forTrue = op.apply(left.forTrue, right.forTrue); - return left; - }; - } - - /** - * Accumulate elements into a {@code Map} whose keys and values are the - * result of applying mapping functions to the input elements. - * If the mapped keys contains duplicates (according to + * Returns a {@code Collector} that accumulate elements into a + * {@code Map} whose keys and values are the result of applying the provided + * mapping functions to the input elements. + * + * <p>If the mapped keys contains duplicates (according to * {@link Object#equals(Object)}), an {@code IllegalStateException} is * thrown when the collection operation is performed. If the mapped keys * may have duplicates, use {@link #toMap(Function, Function, BinaryOperator)} @@ -970,24 +1081,26 @@ * @see #toConcurrentMap(Function, Function) */ public static <T, K, U> - Collector<T, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, - Function<? super T, ? extends U> valueMapper) { + Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, + Function<? super T, ? extends U> valueMapper) { return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new); } /** - * Accumulate elements into a {@code Map} whose keys and values are the - * result of applying mapping functions to the input elements. If the mapped + * Returns a {@code Collector} that accumulate elements into a + * {@code Map} whose keys and values are the result of applying the provided + * mapping functions to the input elements. + * + * <p>If the mapped * keys contains duplicates (according to {@link Object#equals(Object)}), * the value mapping function is applied to each equal element, and the * results are merged using the provided merging function. * * @apiNote * There are multiple ways to deal with collisions between multiple elements - * mapping to the same key. There are some predefined merging functions, - * such as {@link #throwingMerger()}, {@link #firstWinsMerger()}, and - * {@link #lastWinsMerger()}, that implement common policies, or you can - * implement custom policies easily. For example, if you have a stream + * mapping to the same key. The other forms of {@code toMap} simply use + * a merge function that throws unconditionally, but you can easily write + * more flexible merge policies. For example, if you have a stream * of {@code Person}, and you want to produce a "phone book" mapping name to * address, but it is possible that two persons have the same name, you can * do as follows to gracefully deals with these collisions, and produce a @@ -1018,15 +1131,18 @@ * @see #toConcurrentMap(Function, Function, BinaryOperator) */ public static <T, K, U> - Collector<T, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, - Function<? super T, ? extends U> valueMapper, - BinaryOperator<U> mergeFunction) { + Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, + Function<? super T, ? extends U> valueMapper, + BinaryOperator<U> mergeFunction) { return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); } /** - * Accumulate elements into a {@code Map} whose keys and values are the - * result of applying mapping functions to the input elements. If the mapped + * Returns a {@code Collector} that accumulate elements into a + * {@code Map} whose keys and values are the result of applying the provided + * mapping functions to the input elements. + * + * <p>If the mapped * keys contains duplicates (according to {@link Object#equals(Object)}), * the value mapping function is applied to each equal element, and the * results are merged using the provided merging function. The {@code Map} @@ -1054,22 +1170,22 @@ * @see #toConcurrentMap(Function, Function, BinaryOperator, Supplier) */ public static <T, K, U, M extends Map<K, U>> - Collector<T, M> toMap(Function<? super T, ? extends K> keyMapper, - Function<? super T, ? extends U> valueMapper, - BinaryOperator<U> mergeFunction, - Supplier<M> mapSupplier) { - BiFunction<M, T, M> accumulator - = (map, element) -> { - map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction); - return map; - }; - return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_STRICT); + Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, + Function<? super T, ? extends U> valueMapper, + BinaryOperator<U> mergeFunction, + Supplier<M> mapSupplier) { + BiConsumer<M, T> accumulator + = (map, element) -> map.merge(keyMapper.apply(element), + valueMapper.apply(element), mergeFunction); + return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); } /** - * Accumulate elements into a {@code ConcurrentMap} whose keys and values - * are the result of applying mapping functions to the input elements. - * If the mapped keys contains duplicates (according to + * Returns a {@code Collector} that accumulate elements into a + * {@code ConcurrentMap} whose keys and values are the result of applying + * the provided mapping functions to the input elements. + * + * <p>If the mapped keys contains duplicates (according to * {@link Object#equals(Object)}), an {@code IllegalStateException} is * thrown when the collection operation is performed. If the mapped keys * may have duplicates, use @@ -1112,24 +1228,25 @@ * @see #toConcurrentMap(Function, Function, BinaryOperator, Supplier) */ public static <T, K, U> - Collector<T, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper, - Function<? super T, ? extends U> valueMapper) { + Collector<T, ?, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper, + Function<? super T, ? extends U> valueMapper) { return toConcurrentMap(keyMapper, valueMapper, throwingMerger(), ConcurrentHashMap::new); } /** - * Accumulate elements into a {@code ConcurrentMap} whose keys and values - * are the result of applying mapping functions to the input elements. If - * the mapped keys contains duplicates (according to {@link Object#equals(Object)}), + * Returns a {@code Collector} that accumulate elements into a + * {@code ConcurrentMap} whose keys and values are the result of applying + * the provided mapping functions to the input elements. + * + * <p>If the mapped keys contains duplicates (according to {@link Object#equals(Object)}), * the value mapping function is applied to each equal element, and the * results are merged using the provided merging function. * * @apiNote * There are multiple ways to deal with collisions between multiple elements - * mapping to the same key. There are some predefined merging functions, - * such as {@link #throwingMerger()}, {@link #firstWinsMerger()}, and - * {@link #lastWinsMerger()}, that implement common policies, or you can - * implement custom policies easily. For example, if you have a stream + * mapping to the same key. The other forms of {@code toConcurrentMap} simply use + * a merge function that throws unconditionally, but you can easily write + * more flexible merge policies. For example, if you have a stream * of {@code Person}, and you want to produce a "phone book" mapping name to * address, but it is possible that two persons have the same name, you can * do as follows to gracefully deals with these collisions, and produce a @@ -1163,16 +1280,19 @@ * @see #toMap(Function, Function, BinaryOperator) */ public static <T, K, U> - Collector<T, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper, - Function<? super T, ? extends U> valueMapper, - BinaryOperator<U> mergeFunction) { + Collector<T, ?, ConcurrentMap<K,U>> + toConcurrentMap(Function<? super T, ? extends K> keyMapper, + Function<? super T, ? extends U> valueMapper, + BinaryOperator<U> mergeFunction) { return toConcurrentMap(keyMapper, valueMapper, mergeFunction, ConcurrentHashMap::new); } /** - * Accumulate elements into a {@code ConcurrentMap} whose keys and values - * are the result of applying mapping functions to the input elements. If - * the mapped keys contains duplicates (according to {@link Object#equals(Object)}), + * Returns a {@code Collector} that accumulate elements into a + * {@code ConcurrentMap} whose keys and values are the result of applying + * the provided mapping functions to the input elements. + * + * <p>If the mapped keys contains duplicates (according to {@link Object#equals(Object)}), * the value mapping function is applied to each equal element, and the * results are merged using the provided merging function. The * {@code ConcurrentMap} is created by a provided supplier function. @@ -1202,15 +1322,14 @@ * @see #toMap(Function, Function, BinaryOperator, Supplier) */ public static <T, K, U, M extends ConcurrentMap<K, U>> - Collector<T, M> toConcurrentMap(Function<? super T, ? extends K> keyMapper, - Function<? super T, ? extends U> valueMapper, - BinaryOperator<U> mergeFunction, - Supplier<M> mapSupplier) { - BiFunction<M, T, M> accumulator = (map, element) -> { - map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction); - return map; - }; - return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_CONCURRENT); + Collector<T, ?, M> toConcurrentMap(Function<? super T, ? extends K> keyMapper, + Function<? super T, ? extends U> valueMapper, + BinaryOperator<U> mergeFunction, + Supplier<M> mapSupplier) { + BiConsumer<M, T> accumulator + = (map, element) -> map.merge(keyMapper.apply(element), + valueMapper.apply(element), mergeFunction); + return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_CONCURRENT_ID); } /** @@ -1222,14 +1341,15 @@ * @param mapper a mapping function to apply to each element * @return a {@code Collector} implementing the summary-statistics reduction * - * @see #toDoubleSummaryStatistics(ToDoubleFunction) - * @see #toLongSummaryStatistics(ToLongFunction) + * @see #summarizingDouble(ToDoubleFunction) + * @see #summarizingLong(ToLongFunction) */ public static <T> - Collector<T, IntSummaryStatistics> toIntSummaryStatistics(ToIntFunction<? super T> mapper) { - return new CollectorImpl<>(IntSummaryStatistics::new, - (r, t) -> { r.accept(mapper.applyAsInt(t)); return r; }, - (l, r) -> { l.combine(r); return l; }, CH_STRICT); + Collector<T, ?, IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper) { + return new CollectorImpl<T, IntSummaryStatistics, IntSummaryStatistics>( + IntSummaryStatistics::new, + (r, t) -> r.accept(mapper.applyAsInt(t)), + (l, r) -> { l.combine(r); return l; }, CH_ID); } /** @@ -1241,14 +1361,15 @@ * @param mapper the mapping function to apply to each element * @return a {@code Collector} implementing the summary-statistics reduction * - * @see #toDoubleSummaryStatistics(ToDoubleFunction) - * @see #toIntSummaryStatistics(ToIntFunction) + * @see #summarizingDouble(ToDoubleFunction) + * @see #summarizingInt(ToIntFunction) */ public static <T> - Collector<T, LongSummaryStatistics> toLongSummaryStatistics(ToLongFunction<? super T> mapper) { - return new CollectorImpl<>(LongSummaryStatistics::new, - (r, t) -> { r.accept(mapper.applyAsLong(t)); return r; }, - (l, r) -> { l.combine(r); return l; }, CH_STRICT); + Collector<T, ?, LongSummaryStatistics> summarizingLong(ToLongFunction<? super T> mapper) { + return new CollectorImpl<T, LongSummaryStatistics, LongSummaryStatistics>( + LongSummaryStatistics::new, + (r, t) -> r.accept(mapper.applyAsLong(t)), + (l, r) -> { l.combine(r); return l; }, CH_ID); } /** @@ -1260,14 +1381,15 @@ * @param mapper a mapping function to apply to each element * @return a {@code Collector} implementing the summary-statistics reduction * - * @see #toLongSummaryStatistics(ToLongFunction) - * @see #toIntSummaryStatistics(ToIntFunction) + * @see #summarizingLong(ToLongFunction) + * @see #summarizingInt(ToIntFunction) */ public static <T> - Collector<T, DoubleSummaryStatistics> toDoubleSummaryStatistics(ToDoubleFunction<? super T> mapper) { - return new CollectorImpl<>(DoubleSummaryStatistics::new, - (r, t) -> { r.accept(mapper.applyAsDouble(t)); return r; }, - (l, r) -> { l.combine(r); return l; }, CH_STRICT); + Collector<T, ?, DoubleSummaryStatistics> summarizingDouble(ToDoubleFunction<? super T> mapper) { + return new CollectorImpl<T, DoubleSummaryStatistics, DoubleSummaryStatistics>( + DoubleSummaryStatistics::new, + (r, t) -> r.accept(mapper.applyAsDouble(t)), + (l, r) -> { l.combine(r); return l; }, CH_ID); } /** @@ -1276,8 +1398,8 @@ private static final class Partition<T> extends AbstractMap<Boolean, T> implements Map<Boolean, T> { - T forTrue; - T forFalse; + final T forTrue; + final T forFalse; Partition(T forTrue, T forFalse) { this.forTrue = forTrue; @@ -1289,24 +1411,9 @@ return new AbstractSet<Map.Entry<Boolean, T>>() { @Override public Iterator<Map.Entry<Boolean, T>> iterator() { - - return new Iterator<Map.Entry<Boolean, T>>() { - int state = 0; - - @Override - public boolean hasNext() { - return state < 2; - } - - @Override - public Map.Entry<Boolean, T> next() { - if (state >= 2) - throw new NoSuchElementException(); - return (state++ == 0) - ? new SimpleImmutableEntry<>(false, forFalse) - : new SimpleImmutableEntry<>(true, forTrue); - } - }; + Map.Entry<Boolean, T> falseEntry = new SimpleImmutableEntry<>(false, forFalse); + Map.Entry<Boolean, T> trueEntry = new SimpleImmutableEntry<>(true, forTrue); + return Arrays.asList(falseEntry, trueEntry).iterator(); } @Override
--- a/jdk/src/share/classes/java/util/stream/DelegatingStream.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/DelegatingStream.java Wed Jul 05 19:07:19 2017 +0200 @@ -209,7 +209,7 @@ } @Override - public <R> R collect(Collector<? super T, R> collector) { + public <R, A> R collect(Collector<? super T, A, ? extends R> collector) { return delegate.collect(collector); }
--- a/jdk/src/share/classes/java/util/stream/DoublePipeline.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/DoublePipeline.java Wed Jul 05 19:07:19 2017 +0200 @@ -147,6 +147,7 @@ } @Override + @SuppressWarnings("unchecked") final Spliterator.OfDouble lazySpliterator(Supplier<? extends Spliterator<Double>> supplier) { return new StreamSpliterators.DelegatingSpliterator.OfDouble((Supplier<Spliterator.OfDouble>) supplier); } @@ -209,6 +210,7 @@ Sink<Double> opWrapSink(int flags, Sink<U> sink) { return new Sink.ChainedDouble(sink) { @Override + @SuppressWarnings("unchecked") public void accept(double t) { downstream.accept(mapper.apply(t)); }
--- a/jdk/src/share/classes/java/util/stream/DoubleStream.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/DoubleStream.java Wed Jul 05 19:07:19 2017 +0200 @@ -527,7 +527,7 @@ long count(); /** - * Returns an {@code OptionalDouble} describing the average of elements of + * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of * this stream, or an empty optional if this stream is empty. The average * returned can vary depending upon the order in which elements are * encountered. This is due to accumulated rounding error in addition of
--- a/jdk/src/share/classes/java/util/stream/FindOps.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/FindOps.java Wed Jul 05 19:07:19 2017 +0200 @@ -246,6 +246,7 @@ * @param <P_OUT> Output element type from the stream pipeline * @param <O> Result type from the find operation */ + @SuppressWarnings("serial") private static final class FindTask<P_IN, P_OUT, O> extends AbstractShortCircuitTask<P_IN, P_OUT, O, FindTask<P_IN, P_OUT, O>> { private final FindOp<P_OUT, O> op;
--- a/jdk/src/share/classes/java/util/stream/ForEachOps.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/ForEachOps.java Wed Jul 05 19:07:19 2017 +0200 @@ -249,6 +249,7 @@ } /** A {@code ForkJoinTask} for performing a parallel for-each operation */ + @SuppressWarnings("serial") static final class ForEachTask<S, T> extends CountedCompleter<Void> { private Spliterator<S> spliterator; private final Sink<S> sink; @@ -314,6 +315,7 @@ * A {@code ForkJoinTask} for performing a parallel for-each operation * which visits the elements in encounter order */ + @SuppressWarnings("serial") static final class ForEachOrderedTask<S, T> extends CountedCompleter<Void> { private final PipelineHelper<T> helper; private Spliterator<S> spliterator;
--- a/jdk/src/share/classes/java/util/stream/IntPipeline.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/IntPipeline.java Wed Jul 05 19:07:19 2017 +0200 @@ -150,6 +150,7 @@ } @Override + @SuppressWarnings("unchecked") final Spliterator.OfInt lazySpliterator(Supplier<? extends Spliterator<Integer>> supplier) { return new StreamSpliterators.DelegatingSpliterator.OfInt((Supplier<Spliterator.OfInt>) supplier); } @@ -190,6 +191,7 @@ Sink<Integer> opWrapSink(int flags, Sink<Long> sink) { return new Sink.ChainedInt(sink) { @Override + @SuppressWarnings("unchecked") public void accept(int t) { downstream.accept((long) t); } @@ -206,6 +208,7 @@ Sink<Integer> opWrapSink(int flags, Sink<Double> sink) { return new Sink.ChainedInt(sink) { @Override + @SuppressWarnings("unchecked") public void accept(int t) { downstream.accept((double) t); } @@ -245,6 +248,7 @@ Sink<Integer> opWrapSink(int flags, Sink<U> sink) { return new Sink.ChainedInt(sink) { @Override + @SuppressWarnings("unchecked") public void accept(int t) { downstream.accept(mapper.apply(t)); }
--- a/jdk/src/share/classes/java/util/stream/IntStream.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/IntStream.java Wed Jul 05 19:07:19 2017 +0200 @@ -517,7 +517,7 @@ long count(); /** - * Returns an {@code OptionalDouble} describing the average of elements of + * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of * this stream, or an empty optional if this stream is empty. This is a * special case of a * <a href="package-summary.html#MutableReduction">reduction</a>.
--- a/jdk/src/share/classes/java/util/stream/LongPipeline.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/LongPipeline.java Wed Jul 05 19:07:19 2017 +0200 @@ -148,6 +148,7 @@ } @Override + @SuppressWarnings("unchecked") final Spliterator.OfLong lazySpliterator(Supplier<? extends Spliterator<Long>> supplier) { return new StreamSpliterators.DelegatingSpliterator.OfLong((Supplier<Spliterator.OfLong>) supplier); } @@ -209,6 +210,7 @@ Sink<Long> opWrapSink(int flags, Sink<Long> sink) { return new Sink.ChainedLong(sink) { @Override + @SuppressWarnings("unchecked") public void accept(long t) { downstream.accept(mapper.applyAsLong(t)); } @@ -226,6 +228,7 @@ Sink<Long> opWrapSink(int flags, Sink<U> sink) { return new Sink.ChainedLong(sink) { @Override + @SuppressWarnings("unchecked") public void accept(long t) { downstream.accept(mapper.apply(t)); } @@ -243,6 +246,7 @@ Sink<Long> opWrapSink(int flags, Sink<Integer> sink) { return new Sink.ChainedLong(sink) { @Override + @SuppressWarnings("unchecked") public void accept(long t) { downstream.accept(mapper.applyAsInt(t)); }
--- a/jdk/src/share/classes/java/util/stream/LongStream.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/LongStream.java Wed Jul 05 19:07:19 2017 +0200 @@ -517,7 +517,7 @@ long count(); /** - * Returns an {@code OptionalDouble} describing the average of elements of + * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of * this stream, or an empty optional if this stream is empty. This is a * special case of a * <a href="package-summary.html#MutableReduction">reduction</a>.
--- a/jdk/src/share/classes/java/util/stream/MatchOps.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/MatchOps.java Wed Jul 05 19:07:19 2017 +0200 @@ -274,6 +274,7 @@ * @param <P_IN> the type of source elements for the pipeline * @param <P_OUT> the type of output elements for the pipeline */ + @SuppressWarnings("serial") private static final class MatchTask<P_IN, P_OUT> extends AbstractShortCircuitTask<P_IN, P_OUT, Boolean, MatchTask<P_IN, P_OUT>> { private final MatchOp<P_OUT> op;
--- a/jdk/src/share/classes/java/util/stream/Nodes.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/Nodes.java Wed Jul 05 19:07:19 2017 +0200 @@ -60,6 +60,7 @@ */ static final long MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + @SuppressWarnings("raw") private static final Node EMPTY_NODE = new EmptyNode.OfRef(); private static final Node.OfInt EMPTY_INT_NODE = new EmptyNode.OfInt(); private static final Node.OfLong EMPTY_LONG_NODE = new EmptyNode.OfLong(); @@ -1786,6 +1787,10 @@ } } + /* + * This and subclasses are not intended to be serializable + */ + @SuppressWarnings("serial") private static abstract class SizedCollectorTask<P_IN, P_OUT, T_SINK extends Sink<P_OUT>, K extends SizedCollectorTask<P_IN, P_OUT, T_SINK, K>> extends CountedCompleter<Void> @@ -1855,6 +1860,7 @@ fence = (int) offset + (int) length; } + @SuppressWarnings("serial") static final class OfRef<P_IN, P_OUT> extends SizedCollectorTask<P_IN, P_OUT, Sink<P_OUT>, OfRef<P_IN, P_OUT>> implements Sink<P_OUT> { @@ -1886,6 +1892,7 @@ } } + @SuppressWarnings("serial") static final class OfInt<P_IN> extends SizedCollectorTask<P_IN, Integer, Sink.OfInt, OfInt<P_IN>> implements Sink.OfInt { @@ -1917,6 +1924,7 @@ } } + @SuppressWarnings("serial") static final class OfLong<P_IN> extends SizedCollectorTask<P_IN, Long, Sink.OfLong, OfLong<P_IN>> implements Sink.OfLong { @@ -1948,6 +1956,7 @@ } } + @SuppressWarnings("serial") static final class OfDouble<P_IN> extends SizedCollectorTask<P_IN, Double, Sink.OfDouble, OfDouble<P_IN>> implements Sink.OfDouble { @@ -1980,6 +1989,7 @@ } } + @SuppressWarnings("serial") private static abstract class ToArrayTask<T, T_NODE extends Node<T>, K extends ToArrayTask<T, T_NODE, K>> extends CountedCompleter<Void> { @@ -2025,6 +2035,7 @@ } } + @SuppressWarnings("serial") private static final class OfRef<T> extends ToArrayTask<T, Node<T>, OfRef<T>> { private final T[] array; @@ -2050,6 +2061,7 @@ } } + @SuppressWarnings("serial") private static class OfPrimitive<T, T_CONS, T_ARR, T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>, T_NODE extends Node.OfPrimitive<T, T_CONS, T_ARR, T_SPLITR, T_NODE>> @@ -2077,6 +2089,7 @@ } } + @SuppressWarnings("serial") private static final class OfInt extends OfPrimitive<Integer, IntConsumer, int[], Spliterator.OfInt, Node.OfInt> { private OfInt(Node.OfInt node, int[] array, int offset) { @@ -2084,6 +2097,7 @@ } } + @SuppressWarnings("serial") private static final class OfLong extends OfPrimitive<Long, LongConsumer, long[], Spliterator.OfLong, Node.OfLong> { private OfLong(Node.OfLong node, long[] array, int offset) { @@ -2091,6 +2105,7 @@ } } + @SuppressWarnings("serial") private static final class OfDouble extends OfPrimitive<Double, DoubleConsumer, double[], Spliterator.OfDouble, Node.OfDouble> { private OfDouble(Node.OfDouble node, double[] array, int offset) { @@ -2099,6 +2114,7 @@ } } + @SuppressWarnings("serial") private static class CollectorTask<P_IN, P_OUT, T_NODE extends Node<P_OUT>, T_BUILDER extends Node.Builder<P_OUT>> extends AbstractTask<P_IN, P_OUT, T_NODE, CollectorTask<P_IN, P_OUT, T_NODE, T_BUILDER>> { protected final PipelineHelper<P_OUT> helper; @@ -2135,12 +2151,13 @@ } @Override - public void onCompletion(CountedCompleter caller) { + public void onCompletion(CountedCompleter<?> caller) { if (!isLeaf()) setLocalResult(concFactory.apply(leftChild.getLocalResult(), rightChild.getLocalResult())); super.onCompletion(caller); } + @SuppressWarnings("serial") private static final class OfRef<P_IN, P_OUT> extends CollectorTask<P_IN, P_OUT, Node<P_OUT>, Node.Builder<P_OUT>> { OfRef(PipelineHelper<P_OUT> helper, @@ -2150,6 +2167,7 @@ } } + @SuppressWarnings("serial") private static final class OfInt<P_IN> extends CollectorTask<P_IN, Integer, Node.OfInt, Node.Builder.OfInt> { OfInt(PipelineHelper<Integer> helper, Spliterator<P_IN> spliterator) { @@ -2157,6 +2175,7 @@ } } + @SuppressWarnings("serial") private static final class OfLong<P_IN> extends CollectorTask<P_IN, Long, Node.OfLong, Node.Builder.OfLong> { OfLong(PipelineHelper<Long> helper, Spliterator<P_IN> spliterator) { @@ -2164,6 +2183,7 @@ } } + @SuppressWarnings("serial") private static final class OfDouble<P_IN> extends CollectorTask<P_IN, Double, Node.OfDouble, Node.Builder.OfDouble> { OfDouble(PipelineHelper<Double> helper, Spliterator<P_IN> spliterator) {
--- a/jdk/src/share/classes/java/util/stream/ReduceOps.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/ReduceOps.java Wed Jul 05 19:07:19 2017 +0200 @@ -43,7 +43,7 @@ import java.util.function.Supplier; /** - * Factory for the creating instances of {@code TerminalOp) that implement + * Factory for creating instances of {@code TerminalOp} that implement * reductions. * * @since 1.8 @@ -148,17 +148,17 @@ * reference values. * * @param <T> the type of the input elements - * @param <R> the type of the result + * @param <I> the type of the intermediate reduction result * @param collector a {@code Collector} defining the reduction * @return a {@code ReduceOp} implementing the reduction */ - public static <T,R> TerminalOp<T, R> - makeRef(Collector<? super T,R> collector) { - Supplier<R> supplier = Objects.requireNonNull(collector).resultSupplier(); - BiFunction<R, ? super T, R> accumulator = collector.accumulator(); - BinaryOperator<R> combiner = collector.combiner(); - class ReducingSink extends Box<R> - implements AccumulatingSink<T, R, ReducingSink> { + public static <T, I> TerminalOp<T, I> + makeRef(Collector<? super T, I, ?> collector) { + Supplier<I> supplier = Objects.requireNonNull(collector).supplier(); + BiConsumer<I, ? super T> accumulator = collector.accumulator(); + BinaryOperator<I> combiner = collector.combiner(); + class ReducingSink extends Box<I> + implements AccumulatingSink<T, I, ReducingSink> { @Override public void begin(long size) { state = supplier.get(); @@ -166,9 +166,7 @@ @Override public void accept(T t) { - R newResult = accumulator.apply(state, t); - if (state != newResult) - state = newResult; + accumulator.accept(state, t); } @Override @@ -176,7 +174,7 @@ state = combiner.apply(state, other.state); } } - return new ReduceOp<T, R, ReducingSink>(StreamShape.REFERENCE) { + return new ReduceOp<T, I, ReducingSink>(StreamShape.REFERENCE) { @Override public ReducingSink makeSink() { return new ReducingSink(); @@ -720,6 +718,7 @@ /** * A {@code ForkJoinTask} for performing a parallel reduce operation. */ + @SuppressWarnings("serial") private static final class ReduceTask<P_IN, P_OUT, R, S extends AccumulatingSink<P_OUT, R, S>> extends AbstractTask<P_IN, P_OUT, S, ReduceTask<P_IN, P_OUT, R, S>> { @@ -749,7 +748,7 @@ } @Override - public void onCompletion(CountedCompleter caller) { + public void onCompletion(CountedCompleter<?> caller) { if (!isLeaf()) { S leftResult = leftChild.getLocalResult(); leftResult.combine(rightChild.getLocalResult());
--- a/jdk/src/share/classes/java/util/stream/ReferencePipeline.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/ReferencePipeline.java Wed Jul 05 19:07:19 2017 +0200 @@ -170,9 +170,10 @@ } @Override + @SuppressWarnings("unchecked") public void accept(P_OUT u) { if (predicate.test(u)) - downstream.accept(u); + downstream.accept((Object) u); } }; } @@ -180,6 +181,7 @@ } @Override + @SuppressWarnings("unchecked") public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) { Objects.requireNonNull(mapper); return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE, @@ -262,6 +264,7 @@ } @Override + @SuppressWarnings("unchecked") public void accept(P_OUT u) { // We can do better that this too; optimize for depth=0 case and just grab spliterator and forEach it Stream<? extends R> result = mapper.apply(u); @@ -363,6 +366,7 @@ Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) { return new Sink.ChainedReference<P_OUT>(sink) { @Override + @SuppressWarnings("unchecked") public void accept(P_OUT u) { tee.accept(u); downstream.accept(u); @@ -439,6 +443,7 @@ // The runtime type of U is never checked for equality with the component type of the runtime type of A[]. // Runtime checking will be performed when an element is stored in A[], thus if A is not a // super type of U an ArrayStoreException will be thrown. + @SuppressWarnings("rawtypes") IntFunction rawGenerator = (IntFunction) generator; return (A[]) Nodes.flatten(evaluateToArrayNode(rawGenerator), rawGenerator) .asArray(rawGenerator); @@ -490,16 +495,21 @@ } @Override - public final <R> R collect(Collector<? super P_OUT, R> collector) { + public final <R, A> R collect(Collector<? super P_OUT, A, ? extends R> collector) { + A container; if (isParallel() && (collector.characteristics().contains(Collector.Characteristics.CONCURRENT)) && (!isOrdered() || collector.characteristics().contains(Collector.Characteristics.UNORDERED))) { - R container = collector.resultSupplier().get(); - BiFunction<R, ? super P_OUT, R> accumulator = collector.accumulator(); - forEach(u -> accumulator.apply(container, u)); - return container; + container = collector.supplier().get(); + BiConsumer<A, ? super P_OUT> accumulator = collector.accumulator(); + forEach(u -> accumulator.accept(container, u)); } - return evaluate(ReduceOps.makeRef(collector)); + else { + container = evaluate(ReduceOps.makeRef(collector)); + } + return collector.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH) + ? (R) container + : collector.finisher().apply(container); } @Override
--- a/jdk/src/share/classes/java/util/stream/Sink.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/Sink.java Wed Jul 05 19:07:19 2017 +0200 @@ -242,6 +242,7 @@ * {@code accept()} method on the downstream {@code Sink}. */ static abstract class ChainedReference<T> implements Sink<T> { + @SuppressWarnings("rawtypes") protected final Sink downstream; public ChainedReference(Sink downstream) { @@ -274,6 +275,7 @@ * {@code accept()} method on the downstream {@code Sink}. */ static abstract class ChainedInt implements Sink.OfInt { + @SuppressWarnings("rawtypes") protected final Sink downstream; public ChainedInt(Sink downstream) { @@ -306,6 +308,7 @@ * {@code accept()} method on the downstream {@code Sink}. */ static abstract class ChainedLong implements Sink.OfLong { + @SuppressWarnings("rawtypes") protected final Sink downstream; public ChainedLong(Sink downstream) { @@ -338,6 +341,7 @@ * {@code accept()} method on the downstream {@code Sink}. */ static abstract class ChainedDouble implements Sink.OfDouble { + @SuppressWarnings("rawtypes") protected final Sink downstream; public ChainedDouble(Sink downstream) {
--- a/jdk/src/share/classes/java/util/stream/SliceOps.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/SliceOps.java Wed Jul 05 19:07:19 2017 +0200 @@ -550,6 +550,7 @@ * @param <P_IN> Input element type to the stream pipeline * @param <P_OUT> Output element type from the stream pipeline */ + @SuppressWarnings("serial") private static final class SliceTask<P_IN, P_OUT> extends AbstractShortCircuitTask<P_IN, P_OUT, Node<P_OUT>, SliceTask<P_IN, P_OUT>> { private final AbstractPipeline<P_OUT, P_OUT, ?> op;
--- a/jdk/src/share/classes/java/util/stream/SortedOps.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/SortedOps.java Wed Jul 05 19:07:19 2017 +0200 @@ -209,7 +209,7 @@ } @Override - public Sink<Long> opWrapSink(int flags, Sink sink) { + public Sink<Long> opWrapSink(int flags, Sink<Long> sink) { Objects.requireNonNull(sink); if (StreamOpFlag.SORTED.isKnown(flags)) @@ -248,7 +248,7 @@ } @Override - public Sink<Double> opWrapSink(int flags, Sink sink) { + public Sink<Double> opWrapSink(int flags, Sink<Double> sink) { Objects.requireNonNull(sink); if (StreamOpFlag.SORTED.isKnown(flags)) @@ -285,7 +285,7 @@ private T[] array; private int offset; - SizedRefSortingSink(Sink sink, Comparator<? super T> comparator) { + SizedRefSortingSink(Sink<T> sink, Comparator<? super T> comparator) { super(sink); this.comparator = comparator; } @@ -324,7 +324,7 @@ private final Comparator<? super T> comparator; private ArrayList<T> list; - RefSortingSink(Sink sink, Comparator<? super T> comparator) { + RefSortingSink(Sink<T> sink, Comparator<? super T> comparator) { super(sink); this.comparator = comparator; }
--- a/jdk/src/share/classes/java/util/stream/SpinedBuffer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/SpinedBuffer.java Wed Jul 05 19:07:19 2017 +0200 @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.Objects; import java.util.PrimitiveIterator; import java.util.Spliterator; import java.util.Spliterators; @@ -317,6 +318,8 @@ @Override public boolean tryAdvance(Consumer<? super E> consumer) { + Objects.requireNonNull(consumer); + if (splSpineIndex < lastSpineIndex || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { consumer.accept(splChunk[splElementIndex++]); @@ -334,6 +337,8 @@ @Override public void forEachRemaining(Consumer<? super E> consumer) { + Objects.requireNonNull(consumer); + if (splSpineIndex < lastSpineIndex || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { int i = splElementIndex; @@ -634,6 +639,8 @@ @Override public boolean tryAdvance(T_CONS consumer) { + Objects.requireNonNull(consumer); + if (splSpineIndex < lastSpineIndex || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { arrayForOne(splChunk, splElementIndex++, consumer); @@ -651,6 +658,8 @@ @Override public void forEachRemaining(T_CONS consumer) { + Objects.requireNonNull(consumer); + if (splSpineIndex < lastSpineIndex || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) { int i = splElementIndex;
--- a/jdk/src/share/classes/java/util/stream/Stream.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/Stream.java Wed Jul 05 19:07:19 2017 +0200 @@ -651,12 +651,13 @@ * }</pre> * * @param <R> the type of the result + * @param <A> the intermediate accumulation type of the {@code Collector} * @param collector the {@code Collector} describing the reduction * @return the result of the reduction * @see #collect(Supplier, BiConsumer, BiConsumer) * @see Collectors */ - <R> R collect(Collector<? super T, R> collector); + <R, A> R collect(Collector<? super T, A, ? extends R> collector); /** * Returns the minimum element of this stream according to the provided @@ -827,6 +828,7 @@ * @return the new stream */ @SafeVarargs + @SuppressWarnings("varargs") // Creating a stream from an array is safe public static<T> Stream<T> of(T... values) { return Arrays.stream(values); }
--- a/jdk/src/share/classes/java/util/stream/StreamSpliterators.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/StreamSpliterators.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,6 +25,7 @@ package java.util.stream; import java.util.Comparator; +import java.util.Objects; import java.util.Spliterator; import java.util.concurrent.atomic.AtomicLong; import java.util.function.BooleanSupplier; @@ -294,6 +295,7 @@ @Override public boolean tryAdvance(Consumer<? super P_OUT> consumer) { + Objects.requireNonNull(consumer); boolean hasNext = doAdvance(); if (hasNext) consumer.accept(buffer.get(nextToConsume)); @@ -303,6 +305,7 @@ @Override public void forEachRemaining(Consumer<? super P_OUT> consumer) { if (buffer == null && !finished) { + Objects.requireNonNull(consumer); init(); ph.wrapAndCopyInto((Sink<P_OUT>) consumer::accept, spliterator); @@ -350,6 +353,7 @@ @Override public boolean tryAdvance(IntConsumer consumer) { + Objects.requireNonNull(consumer); boolean hasNext = doAdvance(); if (hasNext) consumer.accept(buffer.get(nextToConsume)); @@ -359,6 +363,7 @@ @Override public void forEachRemaining(IntConsumer consumer) { if (buffer == null && !finished) { + Objects.requireNonNull(consumer); init(); ph.wrapAndCopyInto((Sink.OfInt) consumer::accept, spliterator); @@ -406,6 +411,7 @@ @Override public boolean tryAdvance(LongConsumer consumer) { + Objects.requireNonNull(consumer); boolean hasNext = doAdvance(); if (hasNext) consumer.accept(buffer.get(nextToConsume)); @@ -415,6 +421,7 @@ @Override public void forEachRemaining(LongConsumer consumer) { if (buffer == null && !finished) { + Objects.requireNonNull(consumer); init(); ph.wrapAndCopyInto((Sink.OfLong) consumer::accept, spliterator); @@ -462,6 +469,7 @@ @Override public boolean tryAdvance(DoubleConsumer consumer) { + Objects.requireNonNull(consumer); boolean hasNext = doAdvance(); if (hasNext) consumer.accept(buffer.get(nextToConsume)); @@ -471,6 +479,7 @@ @Override public void forEachRemaining(DoubleConsumer consumer) { if (buffer == null && !finished) { + Objects.requireNonNull(consumer); init(); ph.wrapAndCopyInto((Sink.OfDouble) consumer::accept, spliterator); @@ -696,6 +705,8 @@ @Override public boolean tryAdvance(Consumer<? super T> action) { + Objects.requireNonNull(action); + if (sliceOrigin >= fence) return false; @@ -713,6 +724,8 @@ @Override public void forEachRemaining(Consumer<? super T> action) { + Objects.requireNonNull(action); + if (sliceOrigin >= fence) return; @@ -754,6 +767,8 @@ @Override public boolean tryAdvance(T_CONS action) { + Objects.requireNonNull(action); + if (sliceOrigin >= fence) return false; @@ -771,6 +786,8 @@ @Override public void forEachRemaining(T_CONS action) { + Objects.requireNonNull(action); + if (sliceOrigin >= fence) return; @@ -895,7 +912,8 @@ this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip); } - UnorderedSliceSpliterator(T_SPLITR s, UnorderedSliceSpliterator parent) { + UnorderedSliceSpliterator(T_SPLITR s, + UnorderedSliceSpliterator<T, T_SPLITR> parent) { this.s = s; this.unlimited = parent.unlimited; this.permits = parent.permits; @@ -974,7 +992,7 @@ super(s, skip, limit); } - OfRef(Spliterator<T> s, OfRef parent) { + OfRef(Spliterator<T> s, OfRef<T> parent) { super(s, parent); } @@ -985,6 +1003,8 @@ @Override public boolean tryAdvance(Consumer<? super T> action) { + Objects.requireNonNull(action); + while (permitStatus() != PermitStatus.NO_MORE) { if (!s.tryAdvance(this)) return false; @@ -999,6 +1019,8 @@ @Override public void forEachRemaining(Consumer<? super T> action) { + Objects.requireNonNull(action); + ArrayBuffer.OfRef<T> sb = null; PermitStatus permitStatus; while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) { @@ -1051,6 +1073,8 @@ @Override public boolean tryAdvance(T_CONS action) { + Objects.requireNonNull(action); + while (permitStatus() != PermitStatus.NO_MORE) { if (!s.tryAdvance((T_CONS) this)) return false; @@ -1066,6 +1090,8 @@ @Override public void forEachRemaining(T_CONS action) { + Objects.requireNonNull(action); + T_BUFF sb = null; PermitStatus permitStatus; while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) { @@ -1237,6 +1263,8 @@ @Override public boolean tryAdvance(Consumer<? super T> action) { + Objects.requireNonNull(action); + action.accept(s.get()); return true; } @@ -1260,6 +1288,8 @@ @Override public boolean tryAdvance(IntConsumer action) { + Objects.requireNonNull(action); + action.accept(s.getAsInt()); return true; } @@ -1283,6 +1313,8 @@ @Override public boolean tryAdvance(LongConsumer action) { + Objects.requireNonNull(action); + action.accept(s.getAsLong()); return true; } @@ -1306,6 +1338,8 @@ @Override public boolean tryAdvance(DoubleConsumer action) { + Objects.requireNonNull(action); + action.accept(s.getAsDouble()); return true; }
--- a/jdk/src/share/classes/java/util/stream/Streams.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/Streams.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,6 +25,7 @@ package java.util.stream; import java.util.Comparator; +import java.util.Objects; import java.util.Spliterator; import java.util.function.Consumer; import java.util.function.DoubleConsumer; @@ -80,6 +81,8 @@ @Override public boolean tryAdvance(IntConsumer consumer) { + Objects.requireNonNull(consumer); + final int i = from; if (i < upTo) { from++; @@ -96,6 +99,8 @@ @Override public void forEachRemaining(IntConsumer consumer) { + Objects.requireNonNull(consumer); + int i = from; final int hUpTo = upTo; int hLast = last; @@ -199,6 +204,8 @@ @Override public boolean tryAdvance(LongConsumer consumer) { + Objects.requireNonNull(consumer); + final long i = from; if (i < upTo) { from++; @@ -215,6 +222,8 @@ @Override public void forEachRemaining(LongConsumer consumer) { + Objects.requireNonNull(consumer); + long i = from; final long hUpTo = upTo; int hLast = last; @@ -388,6 +397,8 @@ @Override public boolean tryAdvance(Consumer<? super T> action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1; @@ -400,6 +411,8 @@ @Override public void forEachRemaining(Consumer<? super T> action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1; @@ -475,6 +488,8 @@ @Override public boolean tryAdvance(IntConsumer action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1; @@ -487,6 +502,8 @@ @Override public void forEachRemaining(IntConsumer action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1; @@ -562,6 +579,8 @@ @Override public boolean tryAdvance(LongConsumer action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1; @@ -574,6 +593,8 @@ @Override public void forEachRemaining(LongConsumer action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1; @@ -649,6 +670,8 @@ @Override public boolean tryAdvance(DoubleConsumer action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1; @@ -661,6 +684,8 @@ @Override public void forEachRemaining(DoubleConsumer action) { + Objects.requireNonNull(action); + if (count == -2) { action.accept(first); count = -1;
--- a/jdk/src/share/classes/java/util/stream/package-info.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/java/util/stream/package-info.java Wed Jul 05 19:07:19 2017 +0200 @@ -547,7 +547,7 @@ * List<String> l = new ArrayList(Arrays.asList("one", "two")); * Stream<String> sl = l.stream(); * l.add("three"); - * String s = sl.collect(toStringJoiner(" ")).toString(); + * String s = sl.collect(joining(" ")); * }</pre> * First a list is created consisting of two strings: "one"; and "two". Then a stream is created from that list. * Next the list is modified by adding a third string: "three". Finally the elements of the stream are collected @@ -557,7 +557,7 @@ * <pre>{@code * List<String> l = new ArrayList(Arrays.asList("one", "two")); * Stream<String> sl = l.stream(); - * String s = sl.peek(s -> l.add("BAD LAMBDA")).collect(toStringJoiner(" ")).toString(); + * String s = sl.peek(s -> l.add("BAD LAMBDA")).collect(joining(" ")); * }</pre> * then a {@code ConcurrentModificationException} will be thrown since the {@code peek} operation will attempt * to add the string "BAD LAMBDA" to the list after the terminal operation has commenced.
--- a/jdk/src/share/classes/javax/accessibility/Accessible.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/Accessible.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 1999, 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 @@ -45,6 +45,7 @@ * of an object that implements Accessible, and that subclass * is not Accessible, the developer should override the * getAccessibleContext method to return null. + * @return the AccessibleContext associated with this object */ public AccessibleContext getAccessibleContext(); }
--- a/jdk/src/share/classes/javax/accessibility/AccessibleBundle.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/AccessibleBundle.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2002, 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 @@ -53,6 +53,9 @@ private final String defaultResourceBundleName = "com.sun.accessibility.internal.resources.accessibility"; + /** + * Construct an {@code AccessibleBundle}. + */ public AccessibleBundle() { }
--- a/jdk/src/share/classes/javax/accessibility/AccessibleExtendedTable.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/AccessibleExtendedTable.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -60,7 +60,7 @@ */ public int getAccessibleColumn(int index); - /* + /** * Returns the index at a row and column in the table. * * @param r zero-based row of the table
--- a/jdk/src/share/classes/javax/accessibility/AccessibleRelationSet.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/AccessibleRelationSet.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -163,6 +163,7 @@ /** * Returns the number of relations in the relation set. + * @return the number of relations in the relation set */ public int size() { if (relations == null) {
--- a/jdk/src/share/classes/javax/accessibility/AccessibleTable.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/AccessibleTable.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -90,6 +90,8 @@ * Returns the number of rows occupied by the Accessible at * a specified row and column in the table. * + * @param r zero-based row of the table + * @param c zero-based column of the table * @return the number of rows occupied by the Accessible at a * given specified (row, column) */ @@ -99,6 +101,8 @@ * Returns the number of columns occupied by the Accessible at * a specified row and column in the table. * + * @param r zero-based row of the table + * @param c zero-based column of the table * @return the number of columns occupied by the Accessible at a * given specified row and column */
--- a/jdk/src/share/classes/javax/accessibility/AccessibleTableModelChange.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/AccessibleTableModelChange.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -71,8 +71,8 @@ public static final int DELETE = -1; /** - * Returns the type of event - * + * Returns the type of event. + * @return the type of event * @see #INSERT * @see #UPDATE * @see #DELETE @@ -81,21 +81,25 @@ /** * Returns the first row that changed. + * @return the first row that changed */ public int getFirstRow(); /** * Returns the last row that changed. + * @return the last row that changed */ public int getLastRow(); /** * Returns the first column that changed. + * @return the first column that changed */ public int getFirstColumn(); /** * Returns the last column that changed. + * @return the last column that changed */ public int getLastColumn(); }
--- a/jdk/src/share/classes/javax/accessibility/AccessibleTextSequence.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/AccessibleTextSequence.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, 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 @@ -49,7 +49,7 @@ */ public class AccessibleTextSequence { - /* The start index of the text sequence */ + /** The start index of the text sequence */ public int startIndex; /** The end index of the text sequence */
--- a/jdk/src/share/classes/javax/accessibility/AccessibleValue.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/accessibility/AccessibleValue.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 1999, 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 @@ -60,6 +60,7 @@ /** * Set the value of this object as a Number. * + * @param n the number to use for the value * @return True if the value was set; else False * @see #getCurrentAccessibleValue */
--- a/jdk/src/share/classes/javax/imageio/ImageIO.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/ImageIO.java Wed Jul 05 19:07:19 2017 +0200 @@ -228,7 +228,7 @@ * be used when creating <code>ImageInputStream</code>s and * <code>ImageOutputStream</code>s. * - * <p> When reading from a standard <code>InputStream</code>>, it + * <p> When reading from a standard <code>InputStream</code>, it * may be necessary to save previously read information in a cache * since the underlying stream does not allow data to be re-read. * Similarly, when writing to a standard
--- a/jdk/src/share/classes/javax/imageio/ImageReadParam.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/ImageReadParam.java Wed Jul 05 19:07:19 2017 +0200 @@ -80,7 +80,7 @@ * * <p> The resulting region is then subsampled according to the * factors given in {@link IIOParam#setSourceSubsampling - * <code>IIOParam.setSourceSubsampling</code>}. The first pixel, + * IIOParam.setSourceSubsampling}. The first pixel, * the number of pixels per row, and the number of rows all depend * on the subsampling settings. * Call the minimum X and Y coordinates of the resulting rectangle
--- a/jdk/src/share/classes/javax/imageio/ImageReader.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/ImageReader.java Wed Jul 05 19:07:19 2017 +0200 @@ -230,8 +230,8 @@ * increased as each image (or thumbnail, or image metadata) is * read. If <code>seekForwardOnly</code> is true, then a call to * <code>read(index)</code> will throw an - * <code>IndexOutOfBoundsException</code> if <code>index < - * this.minIndex</code>; otherwise, the value of + * <code>IndexOutOfBoundsException</code> if {@code index < this.minIndex}; + * otherwise, the value of * <code>minIndex</code> will be set to <code>index</code>. If * <code>seekForwardOnly</code> is <code>false</code>, the value of * <code>minIndex</code> will remain 0 regardless of any read @@ -328,8 +328,8 @@ * increased as each image (or thumbnail, or image metadata) is * read. If <code>seekForwardOnly</code> is true, then a call to * <code>read(index)</code> will throw an - * <code>IndexOutOfBoundsException</code> if <code>index < - * this.minIndex</code>; otherwise, the value of + * <code>IndexOutOfBoundsException</code> if {@code index < this.minIndex}; + * otherwise, the value of * <code>minIndex</code> will be set to <code>index</code>. If * <code>seekForwardOnly</code> is <code>false</code>, the value of * <code>minIndex</code> will remain 0 regardless of any read @@ -600,8 +600,7 @@ * <p> Note that formats that return <code>false</code> from * this method may nonetheless allow tiling (<i>e.g.</i> Restart * Markers in JPEG), and random access will likely be reasonably - * efficient on tiles. See {@link #isImageTiled - * <code>isImageTiled</code>}. + * efficient on tiles. See {@link #isImageTiled isImageTiled}. * * <p> A reader for which all images are guaranteed to support * easy random access, or are guaranteed not to support easy @@ -1212,11 +1211,10 @@ /** * Returns <code>true</code> if this plug-in supports reading - * just a {@link java.awt.image.Raster <code>Raster</code>} of pixel data. + * just a {@link java.awt.image.Raster Raster} of pixel data. * If this method returns <code>false</code>, calls to - * {@link #readRaster <code>readRaster</code>} or {@link #readTileRaster - * <code>readTileRaster</code>} will throw an - * <code>UnsupportedOperationException</code>. + * {@link #readRaster readRaster} or {@link #readTileRaster readTileRaster} + * will throw an <code>UnsupportedOperationException</code>. * * <p> The default implementation returns <code>false</code>. * @@ -1236,7 +1234,7 @@ * application must determine how to interpret the pixel data by other * means. Any destination or image-type parameters in the supplied * <code>ImageReadParam</code> object are ignored, but all other - * parameters are used exactly as in the {@link #read <code>read</code>} + * parameters are used exactly as in the {@link #read read} * method, except that any destination offset is used as a logical rather * than a physical offset. The size of the returned <code>Raster</code> * will always be that of the source region clipped to the actual image. @@ -1249,10 +1247,9 @@ * * <p> Any registered <code>readUpdateListener</code>s are ignored, as * there is no <code>BufferedImage</code>, but all other listeners are - * called exactly as they are for the {@link #read <code>read</code>} - * method. + * called exactly as they are for the {@link #read read} method. * - * <p> If {@link #canReadRaster <code>canReadRaster()</code>} returns + * <p> If {@link #canReadRaster canReadRaster()} returns * <code>false</code>, this method throws an * <code>UnsupportedOperationException</code>. * @@ -1481,13 +1478,13 @@ * The application must determine how to interpret the pixel data by other * means. * - * <p> If {@link #canReadRaster <code>canReadRaster()</code>} returns + * <p> If {@link #canReadRaster canReadRaster()} returns * <code>false</code>, this method throws an * <code>UnsupportedOperationException</code>. * * <p> The default implementation checks if reading * <code>Raster</code>s is supported, and if so calls {@link - * #readRaster <code>readRaster(imageIndex, null)</code>} if + * #readRaster readRaster(imageIndex, null)} if * <code>tileX</code> and <code>tileY</code> are 0, or throws an * <code>IllegalArgumentException</code> otherwise. * @@ -1548,8 +1545,8 @@ * source render size or any format-specific settings), they will * be ignored. * - * <p> The default implementation just calls {@link #read - * <code>read(imageIndex, param)</code>}. + * <p> The default implementation just calls + * {@link #read read(imageIndex, param)}. * * @param imageIndex the index of the image to be retrieved. * @param param an <code>ImageReadParam</code> used to control @@ -2544,9 +2541,8 @@ * the supplied <code>ImageReadParam</code>. The actual * subsampling factors, destination size, and destination offset * are <em>not</em> taken into consideration, thus further - * clipping must take place. The {@link #computeRegions - * <code>computeRegions</code>} method performs all necessary - * clipping. + * clipping must take place. The {@link #computeRegions computeRegions} + * method performs all necessary clipping. * * @param param the <code>ImageReadParam</code> being used, or * <code>null</code>. @@ -2601,7 +2597,7 @@ * width or height of 0, an <code>IllegalArgumentException</code> * is thrown. * - * <p> The {@link #getSourceRegion <code>getSourceRegion</code>} + * <p> The {@link #getSourceRegion getSourceRegion>} * method may be used if only source clipping is desired. * * @param param an <code>ImageReadParam</code>, or <code>null</code>.
--- a/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java Wed Jul 05 19:07:19 2017 +0200 @@ -840,7 +840,7 @@ * not one of 1, 2, 4, 8, or 16. * @exception IllegalArgumentException if the * non-<code>null</code> LUT parameters do not have lengths of - * exactly <code>1 << bits</code>. + * exactly {@code 1 << bits}. * @exception IllegalArgumentException if <code>dataType</code> is * not one of <code>DataBuffer.TYPE_BYTE</code>, * <code>DataBuffer.TYPE_SHORT</code>,
--- a/jdk/src/share/classes/javax/imageio/ImageWriteParam.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/ImageWriteParam.java Wed Jul 05 19:07:19 2017 +0200 @@ -49,7 +49,7 @@ * and include additional pixels within the intersected bounds * according to the horizontal and vertical subsampling factors * specified by {@link IIOParam#setSourceSubsampling - * <code>IIOParam.setSourceSubsampling</code>}. + * IIOParam.setSourceSubsampling}. * * <p> Individual features such as tiling, progressive encoding, and * compression may be set in one of four modes. @@ -462,9 +462,8 @@ * <code>IllegalStateException</code>. * * <li><code>MODE_EXPLICIT</code> - The image will be tiled - * according to parameters given in the {@link #setTiling - * <code>setTiling</code>} method. Any previously set tiling - * parameters are discarded. + * according to parameters given in the {@link #setTiling setTiling} + * method. Any previously set tiling parameters are discarded. * * <li><code>MODE_COPY_FROM_METADATA</code> - The image will * conform to the metadata object passed in to a write. @@ -1421,7 +1420,7 @@ * with <code>getCompressionQualityDescriptions</code> as part of a user * interface for setting or displaying the compression quality * level. See {@link #getCompressionQualityDescriptions - * <code>getCompressionQualityDescriptions</code>} for more information. + * getCompressionQualityDescriptions} for more information. * * <p> If no descriptions are available, <code>null</code> is * returned. If <code>null</code> is returned from
--- a/jdk/src/share/classes/javax/imageio/ImageWriter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/ImageWriter.java Wed Jul 05 19:07:19 2017 +0200 @@ -692,7 +692,7 @@ * output prior to the current seek position may be flushed, and * need not be readable or writable, unless the plug-in needs to * be able to patch up the header information when - * <code>endWriteSequence</code> is called (<italic>e.g.</italic> TIFF). + * <code>endWriteSequence</code> is called (<i>e.g.</i> TIFF). * * <p> If <code>canWriteSequence</code> returns <code>false</code>, * this method will throw an
--- a/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormatImpl.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormatImpl.java Wed Jul 05 19:07:19 2017 +0200 @@ -729,6 +729,7 @@ * @param required <code>true</code> if an object value must be present. * @param defaultValue the default value for the * <code>Object</code> reference, or <code>null</code>. + * @param <T> the type of the object. * * @exception IllegalArgumentException if <code>elementName</code> * is <code>null</code>, or is not a legal element name for this format. @@ -765,6 +766,7 @@ * @param enumeratedValues a <code>List</code> of * <code>Object</code>s containing the legal values for the * object reference. + * @param <T> the type of the object. * * @exception IllegalArgumentException if <code>elementName</code> * is <code>null</code>, or is not a legal element name for this format. @@ -836,6 +838,7 @@ * is inclusive. * @param maxInclusive <code>true</code> if <code>maxValue</code> * is inclusive. + * @param <T> the type of the object. * * @exception IllegalArgumentException if <code>elementName</code> * is <code>null</code>, or is not a legal element name for this
--- a/jdk/src/share/classes/javax/imageio/plugins/bmp/BMPImageWriteParam.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/plugins/bmp/BMPImageWriteParam.java Wed Jul 05 19:07:19 2017 +0200 @@ -56,9 +56,9 @@ * <p><table border=1> * <caption><b>Compression Types</b></caption> * <tr><th>Type String</th> <th>Description</th> <th>Image Types</th></tr> - * <tr><td>BI_RGB</td> <td>Uncompressed RLE</td> <td><= 8-bits/sample</td></tr> - * <tr><td>BI_RLE8</td> <td>8-bit Run Length Encoding</td> <td><= 8-bits/sample</td></tr> - * <tr><td>BI_RLE4</td> <td>4-bit Run Length Encoding</td> <td><= 4-bits/sample</td></tr> + * <tr><td>BI_RGB</td> <td>Uncompressed RLE</td> <td>{@literal <= } 8-bits/sample</td></tr> + * <tr><td>BI_RLE8</td> <td>8-bit Run Length Encoding</td> <td>{@literal <=} 8-bits/sample</td></tr> + * <tr><td>BI_RLE4</td> <td>4-bit Run Length Encoding</td> <td>{@literal <=} 4-bits/sample</td></tr> * <tr><td>BI_BITFIELDS</td> <td>Packed data</td> <td> 16 or 32 bits/sample</td></tr> * </table> */
--- a/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageReadParam.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageReadParam.java Wed Jul 05 19:07:19 2017 +0200 @@ -46,16 +46,15 @@ * This class allows the tables to be specified directly from client * code. If no tables are specified either in the stream or in a * <code>JPEGImageReadParam</code>, then the stream is presumed to use - * the "standard" visually lossless tables. See {@link JPEGQTable - * <code>JPEGQTable</code>} and {@link JPEGHuffmanTable - * <code>JPEGHuffmanTable</code>} for more information on the default - * tables. + * the "standard" visually lossless tables. See {@link JPEGQTable JPEGQTable} + * and {@link JPEGHuffmanTable JPEGHuffmanTable} for more information + * on the default tables. * * <p> The default <code>JPEGImageReadParam</code> returned by the * <code>getDefaultReadParam</code> method of the builtin JPEG reader * contains no tables. Default tables may be obtained from the table - * classes {@link JPEGQTable <code>JPEGQTable</code>} and {@link - * JPEGHuffmanTable <code>JPEGHuffmanTable</code>}. + * classes {@link JPEGQTable JPEGQTable} and + * {@link JPEGHuffmanTable JPEGHuffmanTable}. * * <p> If a stream does contain tables, the tables given in a * <code>JPEGImageReadParam</code> are ignored. Furthermore, if the @@ -64,13 +63,12 @@ * abbreviated images. Once tables have been read from a stream, they * can be overridden only by tables subsequently read from the same * stream. In order to specify new tables, the {@link - * javax.imageio.ImageReader#setInput <code>setInput</code>} method of + * javax.imageio.ImageReader#setInput setInput} method of * the reader must be called to change the stream. * * <p> Note that this class does not provide a means for obtaining the * tables found in a stream. These may be extracted from a stream by - * consulting the <code>IIOMetadata</code> object returned by the - * reader. + * consulting the IIOMetadata object returned by the reader. * * <p> * For more information about the operation of the built-in JPEG plug-ins,
--- a/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java Wed Jul 05 19:07:19 2017 +0200 @@ -66,8 +66,8 @@ * when an abbreviated stream must be written without writing any tables * to a stream first. In order to use this class, the metadata object * passed into the writer must contain no tables, and no stream metadata - * must be provided. See {@link JPEGQTable <code>JPEGQTable</code>} and - * {@link JPEGHuffmanTable <code>JPEGHuffmanTable</code>} for more + * must be provided. See {@link JPEGQTable JPEGQTable} and + * {@link JPEGHuffmanTable JPEGHuffmanTable} for more * information on the default tables. * * <p> The default <code>JPEGImageWriteParam</code> returned by the @@ -80,7 +80,7 @@ * set of tables has been written, only tables in the metadata can * override them for subsequent writes, whether to the same stream or * a different one. In order to specify new tables using this class, - * the {@link javax.imageio.ImageWriter#reset <code>reset</code>} + * the {@link javax.imageio.ImageWriter#reset reset} * method of the writer must be called. * * <p>
--- a/jdk/src/share/classes/javax/imageio/spi/ImageReaderSpi.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/spi/ImageReaderSpi.java Wed Jul 05 19:07:19 2017 +0200 @@ -78,7 +78,7 @@ * <code>ImageInputStream.class</code>, to be returned from * <code>getInputTypes</code>. * @deprecated Instead of using this field, directly create - * the equivalent array <code>{ ImageInputStream.class }<code>. + * the equivalent array <code>{ ImageInputStream.class }</code>. */ @Deprecated public static final Class[] STANDARD_INPUT_TYPE =
--- a/jdk/src/share/classes/javax/imageio/spi/ImageWriterSpi.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/spi/ImageWriterSpi.java Wed Jul 05 19:07:19 2017 +0200 @@ -80,7 +80,7 @@ * <code>ImageOutputStream.class</code>, to be returned from * <code>getOutputTypes</code>. * @deprecated Instead of using this field, directly create - * the equivalent array <code>{ ImageOutputStream.class }<code>. + * the equivalent array <code>{ ImageOutputStream.class }</code>. */ @Deprecated public static final Class[] STANDARD_OUTPUT_TYPE =
--- a/jdk/src/share/classes/javax/imageio/spi/ServiceRegistry.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/spi/ServiceRegistry.java Wed Jul 05 19:07:19 2017 +0200 @@ -157,6 +157,8 @@ * or <code>null</code> if the system class loader (or, failing that * the bootstrap class loader) is to be used. * + * @param <T> the type of the providerClass. + * * @return An <code>Iterator</code> that yields provider objects * for the given service, in some arbitrary order. The iterator * will throw an <code>Error</code> if a provider-configuration @@ -188,6 +190,8 @@ * @param providerClass a <code>Class</code>object indicating the * class or interface of the service providers being detected. * + * @param <T> the type of the providerClass. + * * @return An <code>Iterator</code> that yields provider objects * for the given service, in some arbitrary order. The iterator * will throw an <code>Error</code> if a provider-configuration @@ -247,6 +251,7 @@ * @param provider the service provide object to be registered. * @param category the category under which to register the * provider. + * @param <T> the type of the provider. * * @return true if no provider of the same class was previously * registered in the same category category. @@ -348,6 +353,7 @@ * @param provider the service provider object to be deregistered. * @param category the category from which to deregister the * provider. + * @param <T> the type of the provider. * * @return <code>true</code> if the provider was previously * registered in the same category category, @@ -435,6 +441,7 @@ * @param category the category to be retrieved from. * @param useOrdering <code>true</code> if pairwise orderings * should be taken account in ordering the returned objects. + * @param <T> the type of the category. * * @return an <code>Iterator</code> containing service provider * objects from the given category, possibly in order. @@ -490,6 +497,7 @@ * whose <code>filter</code> method will be invoked. * @param useOrdering <code>true</code> if pairwise orderings * should be taken account in ordering the returned objects. + * @param <T> the type of the category. * * @return an <code>Iterator</code> containing service provider * objects from the given category, possibly in order. @@ -517,6 +525,7 @@ * * @param providerClass the <code>Class</code> of the desired * service provider object. + * @param <T> the type of the provider. * * @return a currently registered service provider object with the * desired <code>Class</code>type, or <code>null</code> is none is @@ -561,6 +570,7 @@ * @param firstProvider the preferred provider. * @param secondProvider the provider to which * <code>firstProvider</code> is preferred. + * @param <T> the type of the category. * * @return <code>true</code> if a previously unset ordering * was established. @@ -606,6 +616,7 @@ * @param firstProvider the formerly preferred provider. * @param secondProvider the provider to which * <code>firstProvider</code> was formerly preferred. + * @param <T> the type of the category. * * @return <code>true</code> if a previously set ordering was * disestablished.
--- a/jdk/src/share/classes/javax/imageio/stream/ImageInputStream.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/stream/ImageInputStream.java Wed Jul 05 19:07:19 2017 +0200 @@ -183,7 +183,7 @@ * * @return a boolean value from the stream. * - * @exception EOFException if the end of the stream is reached. + * @exception java.io.EOFException if the end of the stream is reached. * @exception IOException if an I/O error occurs. */ boolean readBoolean() throws IOException; @@ -201,7 +201,7 @@ * * @return a signed byte value from the stream. * - * @exception EOFException if the end of the stream is reached. + * @exception java.io.EOFException if the end of the stream is reached. * @exception IOException if an I/O error occurs. */ byte readByte() throws IOException; @@ -225,7 +225,7 @@ * * @return an unsigned byte value from the stream. * - * @exception EOFException if the end of the stream is reached. + * @exception java.io.EOFException if the end of the stream is reached. * @exception IOException if an I/O error occurs. */ int readUnsignedByte() throws IOException; @@ -240,7 +240,7 @@ * * @return a signed short value from the stream. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -261,7 +261,7 @@ * * @return an unsigned short value from the stream, as an int. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -278,7 +278,7 @@ * * @return an unsigned char value from the stream. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -296,7 +296,7 @@ * * @return a signed int value from the stream. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -316,7 +316,7 @@ * * @return an unsigned int value from the stream, as a long. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -334,7 +334,7 @@ * * @return a signed long value from the stream. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -352,7 +352,7 @@ * * @return a float value from the stream. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -370,7 +370,7 @@ * * @return a double value from the stream. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @@ -469,7 +469,7 @@ * then a <code>UTFDataFormatException</code> is thrown. * * <p> If end of file is encountered at any time during this - * entire process, then an <code>EOFException</code> is thrown. + * entire process, then an <code>java.io.EOFException</code> is thrown. * * <p> After every group has been converted to a character by this * process, the characters are gathered, in the same order in @@ -488,10 +488,10 @@ * * @return a String read from the stream. * - * @exception EOFException if this stream reaches the end + * @exception java.io.EOFException if this stream reaches the end * before reading all the bytes. - * @exception UTFDataFormatException if the bytes do not represent a - * valid modified UTF-8 encoding of a string. + * @exception java.io.UTFDataFormatException if the bytes do not represent + * a valid modified UTF-8 encoding of a string. * @exception IOException if an I/O error occurs. */ String readUTF() throws IOException; @@ -499,7 +499,7 @@ /** * Reads <code>len</code> bytes from the stream, and stores them * into <code>b</code> starting at index <code>off</code>. - * If the end of the stream is reached, an <code>EOFException</code> + * If the end of the stream is reached, an <code>java.io.EOFException</code> * will be thrown. * * <p> The bit offset within the stream is reset to zero before @@ -514,7 +514,7 @@ * len</code> is greater than <code>b.length</code>. * @exception NullPointerException if <code>b</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -523,7 +523,7 @@ /** * Reads <code>b.length</code> bytes from the stream, and stores them * into <code>b</code> starting at index <code>0</code>. - * If the end of the stream is reached, an <code>EOFException</code> + * If the end of the stream is reached, an <code>java.io.EOFException</code> * will be thrown. * * <p> The bit offset within the stream is reset to zero before @@ -533,7 +533,7 @@ * * @exception NullPointerException if <code>b</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -544,7 +544,7 @@ * stream according to the current byte order, and * stores them into <code>s</code> starting at index * <code>off</code>. If the end of the stream is reached, an - * <code>EOFException</code> will be thrown. + * <code>java.io.EOFException</code> will be thrown. * * <p> The bit offset within the stream is reset to zero before * the read occurs. @@ -558,7 +558,7 @@ * len</code> is greater than <code>s.length</code>. * @exception NullPointerException if <code>s</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -569,7 +569,7 @@ * stream according to the current byte order, and * stores them into <code>c</code> starting at index * <code>off</code>. If the end of the stream is reached, an - * <code>EOFException</code> will be thrown. + * <code>java.io.EOFException</code> will be thrown. * * <p> The bit offset within the stream is reset to zero before * the read occurs. @@ -583,7 +583,7 @@ * len</code> is greater than <code>c.length</code>. * @exception NullPointerException if <code>c</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -594,7 +594,7 @@ * stream according to the current byte order, and * stores them into <code>i</code> starting at index * <code>off</code>. If the end of the stream is reached, an - * <code>EOFException</code> will be thrown. + * <code>java.io.EOFException</code> will be thrown. * * <p> The bit offset within the stream is reset to zero before * the read occurs. @@ -608,7 +608,7 @@ * len</code> is greater than <code>i.length</code>. * @exception NullPointerException if <code>i</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -619,7 +619,7 @@ * stream according to the current byte order, and * stores them into <code>l</code> starting at index * <code>off</code>. If the end of the stream is reached, an - * <code>EOFException</code> will be thrown. + * <code>java.io.EOFException</code> will be thrown. * * <p> The bit offset within the stream is reset to zero before * the read occurs. @@ -633,7 +633,7 @@ * len</code> is greater than <code>l.length</code>. * @exception NullPointerException if <code>l</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -644,7 +644,7 @@ * floats) from the stream according to the current byte order, * and stores them into <code>f</code> starting at * index <code>off</code>. If the end of the stream is reached, - * an <code>EOFException</code> will be thrown. + * an <code>java.io.EOFException</code> will be thrown. * * <p> The bit offset within the stream is reset to zero before * the read occurs. @@ -658,7 +658,7 @@ * len</code> is greater than <code>f.length</code>. * @exception NullPointerException if <code>f</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -669,7 +669,7 @@ * floats) from the stream according to the current byte order, * and stores them into <code>d</code> starting at * index <code>off</code>. If the end of the stream is reached, - * an <code>EOFException</code> will be thrown. + * an <code>java.io.EOFException</code> will be thrown. * * <p> The bit offset within the stream is reset to zero before * the read occurs. @@ -683,7 +683,7 @@ * len</code> is greater than <code>d.length</code>. * @exception NullPointerException if <code>d</code> is * <code>null</code>. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. */ @@ -748,7 +748,7 @@ * @return an <code>int</code> containing the value <code>0</code> * or <code>1</code>. * - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bits. * @exception IOException if an I/O error occurs. */ @@ -768,13 +768,13 @@ * the right side of the return value, as shown by the following * pseudo-code: * - * <pre> + * <pre>{@code * long accum = 0L; * for (int i = 0; i < numBits; i++) { * accum <<= 1; // Shift left one bit to make room * accum |= readBit(); * } - * </pre> + * }</pre> * * Note that the result of <code>readBits(32)</code> may thus not * be equal to that of <code>readInt()</code> if a reverse network @@ -782,7 +782,7 @@ * false</code>). * * <p> If the end of the stream is encountered before all the bits - * have been read, an <code>EOFException</code> is thrown. + * have been read, an <code>java.io.EOFException</code> is thrown. * * @param numBits the number of bits to read, as an <code>int</code> * between 0 and 64, inclusive. @@ -791,7 +791,7 @@ * * @exception IllegalArgumentException if <code>numBits</code> * is not between 0 and 64, inclusive. - * @exception EOFException if the stream reaches the end before + * @exception java.io.EOFException if the stream reaches the end before * reading all the bits. * @exception IOException if an I/O error occurs. */ @@ -850,7 +850,7 @@ * returned by <code>getflushedPosition</code>). * * <p> It is legal to seek past the end of the file; an - * <code>EOFException</code> will be thrown only if a read is + * <code>java.io.EOFException</code> will be thrown only if a read is * performed. * * @param pos a <code>long</code> containing the desired file
--- a/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java Wed Jul 05 19:07:19 2017 +0200 @@ -88,7 +88,7 @@ /** * The position prior to which data may be discarded. Seeking * to a smaller position is not allowed. <code>flushedPos</code> - * will always be >= 0. + * will always be {@literal >= 0}. */ protected long flushedPos = 0;
--- a/jdk/src/share/classes/javax/imageio/stream/ImageOutputStream.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/imageio/stream/ImageOutputStream.java Wed Jul 05 19:07:19 2017 +0200 @@ -59,9 +59,9 @@ * remainder of the current byte is padded with 0s * and written out first. The bit offset will be 0 after the * write. Implementers can use the - * {@link ImageOutputStreamImpl#flushBits <code>flushBits</code>} - * method of {@link ImageOutputStreamImpl - * <code>ImageOutputStreamImpl</code>} to guarantee this. + * {@link ImageOutputStreamImpl#flushBits flushBits} + * method of {@link ImageOutputStreamImpl ImageOutputStreamImpl} + * to guarantee this. * * @param b an <code>int</code> whose lower 8 bits are to be * written. @@ -99,9 +99,9 @@ * remainder of the current byte is padded with 0s * and written out first. The bit offset will be 0 after the * write. Implementers can use the - * {@link ImageOutputStreamImpl#flushBits <code>flushBits</code>} - * method of {@link ImageOutputStreamImpl - * <code>ImageOutputStreamImpl</code>} to guarantee this. + * {@link ImageOutputStreamImpl#flushBits flushBits} + * method of {@link ImageOutputStreamImpl ImageOutputStreamImpl} + * to guarantee this. * * @param b an array of <code>byte</code>s to be written. * @param off the start offset in the data. @@ -182,8 +182,7 @@ void writeShort(int v) throws IOException; /** - * This method is a synonym for - * {@link #writeShort <code>writeShort</code>}. + * This method is a synonym for {@link #writeShort writeShort}. * * @param v an <code>int</code> containing the char (unsigned * short) value to be written. @@ -430,7 +429,7 @@ * * @exception NullPointerException if <code>s</code> is * <code>null</code>. - * @exception UTFDataFormatException if the modified UTF-8 + * @exception java.io.UTFDataFormatException if the modified UTF-8 * representation of <code>s</code> requires more than 65536 bytes. * @exception IOException if an I/O error occurs. */
--- a/jdk/src/share/classes/javax/management/relation/RelationNotification.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/management/relation/RelationNotification.java Wed Jul 05 19:07:19 2017 +0200 @@ -260,7 +260,7 @@ super(notifType, sourceObj, sequence, timeStamp, message); - if (!isValidBasic(notifType,sourceObj,id,typeName) || !isValidCreate(notifType)) { + if (!isValidBasicStrict(notifType,sourceObj,id,typeName) || !isValidCreate(notifType)) { throw new IllegalArgumentException("Invalid parameter."); } @@ -310,7 +310,7 @@ super(notifType, sourceObj, sequence, timeStamp, message); - if (!isValidBasic(notifType,sourceObj,id,typeName) || !isValidUpdate(notifType,name,newValue,oldValue)) { + if (!isValidBasicStrict(notifType,sourceObj,id,typeName) || !isValidUpdate(notifType,name,newValue,oldValue)) { throw new IllegalArgumentException("Invalid parameter."); } @@ -457,14 +457,26 @@ // - no role old value (for role update) // - no role new value (for role update) + // Despite the fact, that validation in constructor of RelationNotification prohibit + // creation of the class instance with null sourceObj its possible to set it to null later + // by public setSource() method. + // So we should relax validation rules to preserve serialization behavior compatibility. + + private boolean isValidBasicStrict(String notifType, Object sourceObj, String id, String typeName){ + if (sourceObj == null) { + return false; + } + return isValidBasic(notifType,sourceObj,id,typeName); + } + private boolean isValidBasic(String notifType, Object sourceObj, String id, String typeName){ - if (notifType == null || sourceObj == null || - id == null || typeName == null) { + if (notifType == null || id == null || typeName == null) { return false; } - if (!(sourceObj instanceof RelationService) && - !(sourceObj instanceof ObjectName)) { + if (sourceObj != null && ( + !(sourceObj instanceof RelationService) && + !(sourceObj instanceof ObjectName))) { return false; }
--- a/jdk/src/share/classes/javax/print/DocFlavor.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/DocFlavor.java Wed Jul 05 19:07:19 2017 +0200 @@ -286,7 +286,7 @@ * "autosensing" works is implementation dependent. In general, preformatted * autosense print data is provided in a byte oriented representation class * (byte array, InputStream, URL). - * + * </UL> * <P> * <HR> * <H3>Service Formatted Print Data</H3> @@ -545,7 +545,7 @@ * the match. * @return String representing a mime parameter, or * null if that parameter is not in the mime type string. - * @exception throws NullPointerException if paramName is null. + * @exception NullPointerException if paramName is null. */ public String getParameter(String paramName) { return
--- a/jdk/src/share/classes/javax/print/MultiDocPrintJob.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/MultiDocPrintJob.java Wed Jul 05 19:07:19 2017 +0200 @@ -47,7 +47,7 @@ * PrintJobListener. * * @param multiDoc The documents to be printed. ALL must be a flavor - * supported by the PrintJob & PrintService. + * supported by the PrintJob {@literal &} PrintService. * * @param attributes The job attributes to be applied to this print job. * If this parameter is null then the default attributes are used.
--- a/jdk/src/share/classes/javax/print/PrintService.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/PrintService.java Wed Jul 05 19:07:19 2017 +0200 @@ -40,7 +40,7 @@ * a printer's supported attributes. * <P> * Example: - * <PRE> + * <PRE>{@code * DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT; * PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); * aset.add(MediaSizeName.ISO_A4); @@ -56,7 +56,7 @@ * } catch (PrintException e) { * } * } - * </PRE> + * }</PRE> */ public interface PrintService {
--- a/jdk/src/share/classes/javax/print/ServiceUI.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/ServiceUI.java Wed Jul 05 19:07:19 2017 +0200 @@ -118,7 +118,7 @@ * any changes made by the user. * * A typical basic usage of this method may be : - * <pre> + * <pre>{@code * PrintService[] services = PrintServiceLookup.lookupPrintServices( * DocFlavor.INPUT_STREAM.JPEG, null); * PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); @@ -131,7 +131,7 @@ * ... print ... * } * } - * </pre> + * }</pre> * <p> * @param gc used to select screen. null means primary or default screen.
--- a/jdk/src/share/classes/javax/print/ServiceUIFactory.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/ServiceUIFactory.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,8 +39,8 @@ * initialize services only when needed without any API dependencies * except in an environment in which they are used. * <p> - * Swing UIs are preferred as they provide a more consistent L&F and - * can support accessibility APIs. + * Swing UIs are preferred as they provide a more consistent {@literal L&F} + * and can support accessibility APIs. * <p> * Example usage: * <pre>
--- a/jdk/src/share/classes/javax/print/attribute/AttributeSet.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/AttributeSet.java Wed Jul 05 19:07:19 2017 +0200 @@ -42,7 +42,7 @@ * class rather than the attribute object's class itself. An attribute * object's * category is determined by calling the {@link Attribute#getCategory() - * <CODE>getCategory()</CODE>} method defined in interface {@link Attribute + * getCategory()} method defined in interface {@link Attribute * Attribute}. * <P> * The interfaces of an AttributeSet resemble those of the Java Collections @@ -217,7 +217,7 @@ /** * Adds all of the elements in the specified set to this attribute. * The outcome is the same as if the = - * {@link #add(Attribute) <CODE>add(Attribute)</CODE>} + * {@link #add(Attribute) add(Attribute)} * operation had been applied to this attribute set successively with each * element from the specified set. * The behavior of the <CODE>addAll(AttributeSet)</CODE> @@ -301,7 +301,7 @@ * This ensures that <tt>t1.equals(t2)</tt> implies that * <tt>t1.hashCode()==t2.hashCode()</tt> for any two attribute sets * <tt>t1</tt> and <tt>t2</tt>, as required by the general contract of - * {@link java.lang.Object#hashCode() <CODE>Object.hashCode()</CODE>}. + * {@link java.lang.Object#hashCode() Object.hashCode()}. * * @return The hash code value for this attribute set. */
--- a/jdk/src/share/classes/javax/print/attribute/DateTimeSyntax.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/DateTimeSyntax.java Wed Jul 05 19:07:19 2017 +0200 @@ -36,9 +36,9 @@ * <P> * Under the hood, a date-time attribute is stored as a value of class <code> * java.util.Date</code>. You can get a date-time attribute's Date value by - * calling {@link #getValue() <CODE>getValue()</CODE>}. A date-time attribute's + * calling {@link #getValue() getValue()}. A date-time attribute's * Date value is established when it is constructed (see {@link - * #DateTimeSyntax(Date) <CODE>DateTimeSyntax(Date)</CODE>}). Once + * #DateTimeSyntax(Date) DateTimeSyntax(Date)}). Once * constructed, a date-time attribute's value is immutable. * <P> * To construct a date-time attribute from separate values of the year, month,
--- a/jdk/src/share/classes/javax/print/attribute/DocAttributeSet.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/DocAttributeSet.java Wed Jul 05 19:07:19 2017 +0200 @@ -37,8 +37,8 @@ * constructors and mutating operations guarantee an additional invariant, * namely that all attribute values in the DocAttributeSet must be instances * of interface {@link DocAttribute DocAttribute}. - * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and - * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations + * The {@link #add(Attribute) add(Attribute)}, and + * {@link #addAll(AttributeSet) addAll(AttributeSet)} operations * are respecified below to guarantee this additional invariant. * <P> * @@ -74,7 +74,7 @@ /** * Adds all of the elements in the specified set to this attribute. * The outcome is the same as if the - * {@link #add(Attribute) <CODE>add(Attribute)</CODE>} + * {@link #add(Attribute) add(Attribute)} * operation had been applied to this attribute set successively with * each element from the specified set. If none of the categories in the * specified set are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/EnumSyntax.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/EnumSyntax.java Wed Jul 05 19:07:19 2017 +0200 @@ -81,15 +81,15 @@ * for identical objects (<CODE>==</CODE>). * <P> * You can convert an enumeration value to a string by calling {@link - * #toString() <CODE>toString()</CODE>}. The string is obtained from a table + * #toString() toString()}. The string is obtained from a table * supplied by the enumeration class. * <P> * Under the hood, an enumeration value is just an integer, a different integer * for each enumeration value within an enumeration class. You can get an * enumeration value's integer value by calling {@link #getValue() - * <CODE>getValue()</CODE>}. An enumeration value's integer value is established + * getValue()}. An enumeration value's integer value is established * when it is constructed (see {@link #EnumSyntax(int) - * <CODE>EnumSyntax(int)</CODE>}). Since the constructor is protected, the only + * EnumSyntax(int)}). Since the constructor is protected, the only * possible enumeration values are the singleton objects declared in the * enumeration class; additional enumeration values cannot be created at run * time. @@ -170,10 +170,10 @@ * * @return The enumeration singleton value stored at index * <I>i</I>-<I>L</I> in the enumeration value table returned by - * {@link #getEnumValueTable() <CODE>getEnumValueTable()</CODE>}, + * {@link #getEnumValueTable() getEnumValueTable()}, * where <I>i</I> is this enumeration value's integer value and * <I>L</I> is the value returned by {@link #getOffset() - * <CODE>getOffset()</CODE>}. + * getOffset()}. * * @throws ObjectStreamException if the stream can't be deserialised * @throws InvalidObjectException @@ -220,18 +220,18 @@ * Returns the string table for this enumeration value's enumeration class. * The enumeration class's integer values are assumed to lie in the range * <I>L</I>..<I>L</I>+<I>N</I>-1, where <I>L</I> is the value returned by - * {@link #getOffset() <CODE>getOffset()</CODE>} and <I>N</I> is the length + * {@link #getOffset() getOffset()} and <I>N</I> is the length * of the string table. The element in the string table at index * <I>i</I>-<I>L</I> is the value returned by {@link #toString() - * <CODE>toString()</CODE>} for the enumeration value whose integer value + * toString()} for the enumeration value whose integer value * is <I>i</I>. If an integer within the above range is not used by any * enumeration value, leave the corresponding table element null. * <P> * The default implementation returns null. If the enumeration class (a * subclass of class EnumSyntax) does not override this method to return a * non-null string table, and the subclass does not override the {@link - * #toString() <CODE>toString()</CODE>} method, the base class {@link - * #toString() <CODE>toString()</CODE>} method will return just a string + * #toString() toString()} method, the base class {@link + * #toString() toString()} method will return just a string * representation of this enumeration value's integer value. * @return the string table */ @@ -243,11 +243,11 @@ * Returns the enumeration value table for this enumeration value's * enumeration class. The enumeration class's integer values are assumed to * lie in the range <I>L</I>..<I>L</I>+<I>N</I>-1, where <I>L</I> is the - * value returned by {@link #getOffset() <CODE>getOffset()</CODE>} and + * value returned by {@link #getOffset() getOffset()} and * <I>N</I> is the length of the enumeration value table. The element in the * enumeration value table at index <I>i</I>-<I>L</I> is the enumeration * value object whose integer value is <I>i</I>; the {@link #readResolve() - * <CODE>readResolve()</CODE>} method needs this to preserve singleton + * readResolve()} method needs this to preserve singleton * semantics during deserialization of an enumeration instance. If an * integer within the above range is not used by any enumeration value, * leave the corresponding table element null. @@ -255,8 +255,8 @@ * The default implementation returns null. If the enumeration class (a * subclass of class EnumSyntax) does not override this method to return * a non-null enumeration value table, and the subclass does not override - * the {@link #readResolve() <CODE>readResolve()</CODE>} method, the base - * class {@link #readResolve() <CODE>readResolve()</CODE>} method will throw + * the {@link #readResolve() readResolve()} method, the base + * class {@link #readResolve() readResolve()} method will throw * an exception whenever an enumeration instance is deserialized from an * object input stream. * @return the value table
--- a/jdk/src/share/classes/javax/print/attribute/HashAttributeSet.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/HashAttributeSet.java Wed Jul 05 19:07:19 2017 +0200 @@ -388,7 +388,7 @@ /** * Adds all of the elements in the specified set to this attribute. * The outcome is the same as if the - * {@link #add(Attribute) <CODE>add(Attribute)</CODE>} + * {@link #add(Attribute) add(Attribute)} * operation had been applied to this attribute set successively with * each element from the specified set. * The behavior of the <CODE>addAll(AttributeSet)</CODE> @@ -512,7 +512,7 @@ * This ensures that <tt>t1.equals(t2)</tt> implies that * <tt>t1.hashCode()==t2.hashCode()</tt> for any two attribute sets * <tt>t1</tt> and <tt>t2</tt>, as required by the general contract of - * {@link java.lang.Object#hashCode() <CODE>Object.hashCode()</CODE>}. + * {@link java.lang.Object#hashCode() Object.hashCode()}. * * @return The hash code value for this attribute set. */
--- a/jdk/src/share/classes/javax/print/attribute/IntegerSyntax.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/IntegerSyntax.java Wed Jul 05 19:07:19 2017 +0200 @@ -33,9 +33,9 @@ * <P> * Under the hood, an integer attribute is just an integer. You can get an * integer attribute's integer value by calling {@link #getValue() - * <CODE>getValue()</CODE>}. An integer attribute's integer value is + * getValue()}. An integer attribute's integer value is * established when it is constructed (see {@link #IntegerSyntax(int) - * <CODE>IntegerSyntax(int)</CODE>}). Once constructed, an integer attribute's + * IntegerSyntax(int)}). Once constructed, an integer attribute's * value is immutable. * <P> *
--- a/jdk/src/share/classes/javax/print/attribute/PrintJobAttributeSet.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/PrintJobAttributeSet.java Wed Jul 05 19:07:19 2017 +0200 @@ -36,8 +36,8 @@ * constructors and mutating operations guarantee an additional invariant, * namely that all attribute values in the PrintJobAttributeSet must be * instances of interface {@link PrintJobAttribute PrintJobAttribute}. - * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and - * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations + * The {@link #add(Attribute) add(Attribute)}, and + * {@link #addAll(AttributeSet) >addAll(AttributeSet)} operations * are respecified below to guarantee this additional invariant. * <P> * @@ -72,7 +72,7 @@ /** * Adds all of the elements in the specified set to this attribute. * The outcome is the same as if the - * {@link #add(Attribute) <CODE>add(Attribute)</CODE>} + * {@link #add(Attribute) add(Attribute)} * operation had been applied to this attribute set successively with * each element from the specified set. If none of the categories in the * specified set are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/PrintRequestAttributeSet.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/PrintRequestAttributeSet.java Wed Jul 05 19:07:19 2017 +0200 @@ -37,8 +37,8 @@ * constructors and mutating operations guarantee an additional invariant, * namely that all attribute values in the PrintRequestAttributeSet must be * instances of interface {@link PrintRequestAttribute PrintRequestAttribute}. - * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and - * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations + * The {@link #add(Attribute) add(Attribute)}, and + * {@link #addAll(AttributeSet) addAll(AttributeSet)} operations * are respecified below to guarantee this additional invariant. * <P> * @@ -73,7 +73,7 @@ /** * Adds all of the elements in the specified set to this attribute. * The outcome is the same as if the - * {@link #add(Attribute) <CODE>add(Attribute)</CODE>} + * {@link #add(Attribute) add(Attribute)} * operation had been applied to this attribute set successively with * each element from the specified set. If none of the categories in the * specified set are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/PrintServiceAttributeSet.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/PrintServiceAttributeSet.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,8 +39,8 @@ * invariant, * namely that all attribute values in the PrintServiceAttributeSet must be * instances of interface {@link PrintServiceAttribute PrintServiceAttribute}. - * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and - * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations + * The {@link #add(Attribute) add(Attribute)}, and + * {@link #addAll(AttributeSet) addAll(AttributeSet)} operations * are respecified below to guarantee this additional invariant. * <P> * @@ -77,7 +77,7 @@ /** * Adds all of the elements in the specified set to this attribute. * The outcome is the same as if the - * {@link #add(Attribute) <CODE>add(Attribute)</CODE>} + * {@link #add(Attribute) add(Attribute)} * operation had been applied to this attribute set successively with * each element from the specified set. If none of the categories in the * specified set are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/ResolutionSyntax.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/ResolutionSyntax.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,7 +39,7 @@ * resolution attribute's values, indicating the units in which the values are * to be returned. The two most common resolution units are dots per inch (dpi) * and dots per centimeter (dpcm), and exported constants {@link #DPI - * <CODE>DPI</CODE>} and {@link #DPCM <CODE>DPCM</CODE>} are provided for + * DPI} and {@link #DPCM DPCM} are provided for * indicating those units. * <P> * Once constructed, a resolution attribute's value is immutable. @@ -68,9 +68,9 @@ * done, which would not be guaranteed if a floating point representation were * used. * <P> - * The exported constant {@link #DPI <CODE>DPI</CODE>} is actually the + * The exported constant {@link #DPI DPI} is actually the * conversion factor by which to multiply a value in dpi to get the value in - * dphi. Likewise, the exported constant {@link #DPCM <CODE>DPCM</CODE>} is the + * dphi. Likewise, the exported constant {@link #DPCM DPCM} is the * conversion factor by which to multiply a value in dpcm to get the value in * dphi. A client can specify a resolution value in units other than dpi or dpcm * by supplying its own conversion factor. However, since the internal units of @@ -120,12 +120,12 @@ * @param feedResolution * Feed direction resolution. * @param units - * Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or - * {@link #DPCM <CODE>DPCM</CODE>}. + * Unit conversion factor, e.g. {@link #DPI DPI} or + * {@link #DPCM DPCM}. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>crossFeedResolution</CODE> < - * 1 or <CODE>feedResolution</CODE> < 1 or <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code crossFeedResolution < 1} + * or {@code feedResolution < 1} or {@code units < 1}. */ public ResolutionSyntax(int crossFeedResolution, int feedResolution, int units) { @@ -172,14 +172,14 @@ * The values are rounded to the nearest integer. * * @param units - * Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or - * {@link #DPCM <CODE>DPCM</CODE>}. + * Unit conversion factor, e.g. {@link #DPI DPI} or + * {@link #DPCM DPCM}. * * @return A two-element array with the cross feed direction resolution * at index 0 and the feed direction resolution at index 1. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public int[] getResolution(int units) { return new int[] { getCrossFeedResolution(units), @@ -192,13 +192,13 @@ * the given units. The value is rounded to the nearest integer. * * @param units - * Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or - * {@link #DPCM <CODE>DPCM</CODE>}. + * Unit conversion factor, e.g. {@link #DPI DPI} or + * {@link #DPCM DPCM}. * * @return Cross feed direction resolution. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public int getCrossFeedResolution(int units) { return convertFromDphi (crossFeedResolution, units); @@ -209,13 +209,13 @@ * given units. The value is rounded to the nearest integer. * * @param units - * Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or {@link - * #DPCM <CODE>DPCM</CODE>}. + * Unit conversion factor, e.g. {@link #DPI DPI} or {@link + * #DPCM DPCM}. * * @return Feed direction resolution. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public int getFeedResolution(int units) { return convertFromDphi (feedResolution, units); @@ -229,8 +229,8 @@ * rounded to the nearest integer. * * @param units - * Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or {@link - * #DPCM <CODE>DPCM</CODE>}. + * Unit conversion factor, e.g. {@link #DPI CODE>DPI} or {@link + * #DPCM DPCM}. * @param unitsName * Units name string, e.g. <CODE>"dpi"</CODE> or <CODE>"dpcm"</CODE>. If * null, no units name is appended to the result. @@ -238,7 +238,7 @@ * @return String version of this resolution attribute. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public String toString(int units, String unitsName) { StringBuffer result = new StringBuffer();
--- a/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java Wed Jul 05 19:07:19 2017 +0200 @@ -38,8 +38,8 @@ * values are measured. Methods are provided to return a two-dimensional size * attribute's values, indicating the units in which the values are to be * returned. The two most common size units are inches (in) and millimeters - * (mm), and exported constants {@link #INCH <CODE>INCH</CODE>} and {@link #MM - * <CODE>MM</CODE>} are provided for indicating those units. + * (mm), and exported constants {@link #INCH INCH} and {@link #MM + * MM} are provided for indicating those units. * <P> * Once constructed, a two-dimensional size attribute's value is immutable. * <P> @@ -66,9 +66,9 @@ * units, you have to search for a media size of 215.9 x 279.4 mm; rounding off * to an integral 216 x 279 mm will not match. * <P> - * The exported constant {@link #INCH <CODE>INCH</CODE>} is actually the + * The exported constant {@link #INCH INCH} is actually the * conversion factor by which to multiply a value in inches to get the value in - * µm. Likewise, the exported constant {@link #MM <CODE>MM</CODE>} is the + * µm. Likewise, the exported constant {@link #MM MM} is the * conversion factor by which to multiply a value in mm to get the value in * µm. A client can specify a resolution value in units other than inches * or mm by supplying its own conversion factor. However, since the internal @@ -117,12 +117,12 @@ * @param x X dimension. * @param y Y dimension. * @param units - * Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or - * {@link #MM <CODE>MM</CODE>}. + * Unit conversion factor, e.g. {@link #INCH INCH} or + * {@link #MM MM}. * * @exception IllegalArgumentException - * (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> - * < 0 or <CODE>units</CODE> < 1. + * (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or + * {@code units < 1}. */ protected Size2DSyntax(float x, float y, int units) { if (x < 0.0f) { @@ -145,12 +145,12 @@ * @param x X dimension. * @param y Y dimension. * @param units - * Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or - * {@link #MM <CODE>MM</CODE>}. + * Unit conversion factor, e.g. {@link #INCH INCH} or + * {@link #MM MM}. * * @exception IllegalArgumentException - * (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> - * < 0 or <CODE>units</CODE> < 1. + * (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} + * or {@code units < 1}. */ protected Size2DSyntax(int x, int y, int units) { if (x < 0) { @@ -193,14 +193,13 @@ * as floating-point values. * * @param units - * Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or - * {@link #MM <CODE>MM</CODE>}. + * Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}. * * @return A two-element array with the X dimension at index 0 and the Y * dimension at index 1. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float[] getSize(int units) { return new float[] {getX(units), getY(units)}; @@ -211,13 +210,12 @@ * units as a floating-point value. * * @param units - * Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or - * {@link #MM <CODE>MM</CODE>}. + * Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}. * * @return X dimension. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float getX(int units) { return convertFromMicrometers(x, units); @@ -228,13 +226,12 @@ * units as a floating-point value. * * @param units - * Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or - * {@link #MM <CODE>MM</CODE>}. + * Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}. * * @return Y dimension. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float getY(int units) { return convertFromMicrometers(y, units); @@ -248,16 +245,16 @@ * floating point. * * @param units - * Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or - * {@link #MM <CODE>MM</CODE>}. + * Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}. + * * @param unitsName - * Units name string, e.g. <CODE>"in"</CODE> or <CODE>"mm"</CODE>. If + * Units name string, e.g. {@code in} or {@code mm}. If * null, no units name is appended to the result. * * @return String version of this two-dimensional size attribute. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public String toString(int units, String unitsName) { StringBuffer result = new StringBuffer();
--- a/jdk/src/share/classes/javax/print/attribute/standard/Chromaticity.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/Chromaticity.java Wed Jul 05 19:07:19 2017 +0200 @@ -40,11 +40,11 @@ * can be verified to support color printing. * <P> * The table below shows the effects of specifying a Chromaticity attribute of - * {@link #MONOCHROME <CODE>MONOCHROME</CODE>} or {@link #COLOR - * <CODE>COLOR</CODE>} for a monochrome or color document. + * {@link #MONOCHROME MONOCHROME} or {@link #COLOR COLOR} + * for a monochrome or color document. * <P> * <TABLE BORDER=1 CELLPADDING=2 CELLSPACING=1 SUMMARY="Shows effects of specifying MONOCHROME or COLOR Chromaticity attributes"> - * <TR BGCOLOR="#E5E5E5"> + * <TR> * <TH> * Chromaticity<BR>Attribute * </TH> @@ -57,7 +57,7 @@ * </TR> * <TR> * <TD> - * {@link #MONOCHROME <CODE>MONOCHROME</CODE>} + * {@link #MONOCHROME MONOCHROME} * </TD> * <TD> * Printed as is, in monochrome @@ -68,7 +68,7 @@ * </TR> * <TR> * <TD> - * {@link #COLOR <CODE>COLOR</CODE>} + * {@link #COLOR COLOR} * </TD> * <TD> * Printed as is, in monochrome
--- a/jdk/src/share/classes/javax/print/attribute/standard/Compression.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/Compression.java Wed Jul 05 19:07:19 2017 +0200 @@ -34,7 +34,7 @@ * print data (the doc), not of the Print Job. If a Compression attribute is not * specified for a doc, the printer assumes the doc's print data is uncompressed * (i.e., the default Compression value is always {@link #NONE - * <CODE>NONE</CODE>}). + * NONE}). * <P> * <B>IPP Compatibility:</B> The category name returned by * <CODE>getName()</CODE> is the IPP attribute name. The enumeration's
--- a/jdk/src/share/classes/javax/print/attribute/standard/Finishings.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/Finishings.java Wed Jul 05 19:07:19 2017 +0200 @@ -46,13 +46,13 @@ * * </TD> * <TD WIDTH=27%> - * {@link #NONE <CODE>NONE</CODE>} + * {@link #NONE NONE} * </TD> * <TD WIDTH=27%> - * {@link #STAPLE <CODE>STAPLE</CODE>} + * {@link #STAPLE STAPLE} * </TD> * <TD WIDTH=36%> - * {@link #EDGE_STITCH <CODE>EDGE_STITCH</CODE>} + * {@link #EDGE_STITCH EDGE_STITCH} * </TD> * </TR> * <TR> @@ -60,13 +60,13 @@ * * </TD> * <TD> - * {@link #BIND <CODE>BIND</CODE>} + * {@link #BIND BIND} * </TD> * <TD> - * {@link #SADDLE_STITCH <CODE>SADDLE_STITCH</CODE>} + * {@link #SADDLE_STITCH SADDLE_STITCH} * </TD> * <TD> - * {@link #COVER <CODE>COVER</CODE>} + * {@link #COVER COVER} * </TD> * <TD> * @@ -82,13 +82,13 @@ * * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_TOP_LEFT <CODE>STAPLE_TOP_LEFT</CODE>} + * {@link #STAPLE_TOP_LEFT STAPLE_TOP_LEFT} * </TD> * <TD WIDTH=27%> - * {@link #EDGE_STITCH_LEFT <CODE>EDGE_STITCH_LEFT</CODE>} + * {@link #EDGE_STITCH_LEFT EDGE_STITCH_LEFT} * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_DUAL_LEFT <CODE>STAPLE_DUAL_LEFT</CODE>} + * {@link #STAPLE_DUAL_LEFT STAPLE_DUAL_LEFT} * </TD> * <TD WIDTH=9%> * @@ -99,13 +99,13 @@ * * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_BOTTOM_LEFT <CODE>STAPLE_BOTTOM_LEFT</CODE>} + * {@link #STAPLE_BOTTOM_LEFT STAPLE_BOTTOM_LEFT} * </TD> * <TD WIDTH=27%> - * {@link #EDGE_STITCH_TOP <CODE>EDGE_STITCH_TOP</CODE>} + * {@link #EDGE_STITCH_TOP EDGE_STITCH_TOP} * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_DUAL_TOP <CODE>STAPLE_DUAL_TOP</CODE>} + * {@link #STAPLE_DUAL_TOP STAPLE_DUAL_TOP} * </TD> * <TD WIDTH=9%> * @@ -116,13 +116,13 @@ * * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_TOP_RIGHT <CODE>STAPLE_TOP_RIGHT</CODE>} + * {@link #STAPLE_TOP_RIGHT STAPLE_TOP_RIGHT} * </TD> * <TD WIDTH=27%> - * {@link #EDGE_STITCH_RIGHT <CODE>EDGE_STITCH_RIGHT</CODE>} + * {@link #EDGE_STITCH_RIGHT EDGE_STITCH_RIGHT} * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_DUAL_RIGHT <CODE>STAPLE_DUAL_RIGHT</CODE>} + * {@link #STAPLE_DUAL_RIGHT STAPLE_DUAL_RIGHT} * </TD> * <TD WIDTH=9%> * @@ -133,13 +133,13 @@ * * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_BOTTOM_RIGHT <CODE>STAPLE_BOTTOM_RIGHT</CODE>} + * {@link #STAPLE_BOTTOM_RIGHT STAPLE_BOTTOM_RIGHT} * </TD> * <TD WIDTH=27%> - * {@link #EDGE_STITCH_BOTTOM <CODE>EDGE_STITCH_BOTTOM</CODE>} + * {@link #EDGE_STITCH_BOTTOM EDGE_STITCH_BOTTOM} * </TD> * <TD WIDTH=27%> - * {@link #STAPLE_DUAL_BOTTOM <CODE>STAPLE_DUAL_BOTTOM</CODE>} + * {@link #STAPLE_DUAL_BOTTOM STAPLE_DUAL_BOTTOM} * </TD> * <TD WIDTH=9%> * @@ -147,16 +147,16 @@ * </TR> * </TABLE> * <P> - * The <CODE>STAPLE_<I>XXX</I></CODE> values are specified with respect to the + * The STAPLE_<I>XXX</I> values are specified with respect to the * document as if the document were a portrait document. If the document is * actually a landscape or a reverse-landscape document, the client supplies the * appropriate transformed value. For example, to position a staple in the upper * left hand corner of a landscape document when held for reading, the client - * supplies the <CODE>STAPLE_BOTTOM_LEFT</CODE> value (since landscape is + * supplies the STAPLE_BOTTOM_LEFT value (since landscape is * defined as a +90 degree rotation from portrait, i.e., anti-clockwise). On the * other hand, to position a staple in the upper left hand corner of a * reverse-landscape document when held for reading, the client supplies the - * <CODE>STAPLE_TOP_RIGHT</CODE> value (since reverse-landscape is defined as a + * STAPLE_TOP_RIGHT value (since reverse-landscape is defined as a * -90 degree rotation from portrait, i.e., clockwise). * <P> * The angle (vertical, horizontal, angled) of each staple with respect to the
--- a/jdk/src/share/classes/javax/print/attribute/standard/JobKOctets.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/JobKOctets.java Wed Jul 05 19:07:19 2017 +0200 @@ -67,7 +67,7 @@ * shown in the table below. * <P> * <TABLE BORDER=1 CELLPADDING=2 CELLSPACING=1 SUMMARY="Table showing computation of doc sizes"> - * <TR BGCOLOR="#E5E5E5"> + * <TR> * <TH>Representation Class</TH> * <TH>Document Size</TH> * </TR>
--- a/jdk/src/share/classes/javax/print/attribute/standard/MediaPrintableArea.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/MediaPrintableArea.java Wed Jul 05 19:07:19 2017 +0200 @@ -62,7 +62,7 @@ * The (x,y) origin is positioned at the top-left of the paper in portrait * mode regardless of the orientation specified in the requesting context. * For example a printable area for A4 paper in portrait or landscape - * orientation will have height > width. + * orientation will have height {@literal >} width. * <p> * A printable area attribute's values are stored * internally as integers in units of micrometers (µm), where 1 micrometer @@ -107,9 +107,9 @@ * @param units in which the values are expressed. * * @exception IllegalArgumentException - * Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> < 0 - * or <CODE>w</CODE> <= 0 or <CODE>h</CODE> <= 0 or - * <CODE>units</CODE> < 1. + * Thrown if {@code x < 0} or {@code y < 0} + * or {@code w <= 0} or {@code h <= 0} or + * {@code units < 1}. */ public MediaPrintableArea(float x, float y, float w, float h, int units) { if ((x < 0.0) || (y < 0.0) || (w <= 0.0) || (h <= 0.0) || @@ -133,9 +133,9 @@ * @param units in which the values are expressed. * * @exception IllegalArgumentException - * Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> < 0 - * or <CODE>w</CODE> <= 0 or <CODE>h</CODE> <= 0 or - * <CODE>units</CODE> < 1. + * Thrown if {@code x < 0} or {@code y < 0} + * or {@code w <= 0} or {@code h <= 0} or + * {@code units < 1}. */ public MediaPrintableArea(int x, int y, int w, int h, int units) { if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) || @@ -159,7 +159,7 @@ * @return printable area as array of x, y, w, h in the specified units. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float[] getPrintableArea(int units) { return new float[] { getX(units), getY(units), @@ -177,7 +177,7 @@ * specified units. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float getX(int units) { return convertFromMicrometers(x, units); @@ -194,7 +194,7 @@ * specified units. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float getY(int units) { return convertFromMicrometers(y, units); @@ -209,7 +209,7 @@ * @return width of the printable area in the specified units. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float getWidth(int units) { return convertFromMicrometers(w, units); @@ -224,7 +224,7 @@ * @return height of the printable area in the specified units. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public float getHeight(int units) { return convertFromMicrometers(h, units); @@ -301,7 +301,7 @@ * @return String version of this two-dimensional size attribute. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code units < 1}. */ public String toString(int units, String unitsName) { if (unitsName == null) {
--- a/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java Wed Jul 05 19:07:19 2017 +0200 @@ -45,7 +45,7 @@ * <code>MediaSize.getMediaSizeForName(MediaSizeName)</code> * to find the physical dimensions of the MediaSizeName instances * enumerated in this API. This is useful for clients which need this - * information to format & paginate printing. + * information to format {@literal &} paginate printing. * <P> * * @author Phil Race, Alan Kaminsky @@ -71,8 +71,8 @@ * <CODE>Size2DSyntax.MM</CODE>. * * @exception IllegalArgumentException - * (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> - * < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>. + * (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or + * {@code units < 1} or {@code x > y}. */ public MediaSize(float x, float y,int units) { super (x, y, units); @@ -92,8 +92,8 @@ * <CODE>Size2DSyntax.MM</CODE>. * * @exception IllegalArgumentException - * (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> - * < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>. + * (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or + * {@code units < 1} or {@code x > y}. */ public MediaSize(int x, int y,int units) { super (x, y, units); @@ -115,8 +115,8 @@ * @param media a media name to associate with this MediaSize * * @exception IllegalArgumentException - * (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> - * < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>. + * (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or + * {@code units < 1} or {@code x > y}. */ public MediaSize(float x, float y,int units, MediaSizeName media) { super (x, y, units); @@ -141,8 +141,8 @@ * @param media a media name to associate with this MediaSize * * @exception IllegalArgumentException - * (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> - * < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>. + * (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or + * {@code units < 1} or {@code x > y}. */ public MediaSize(int x, int y,int units, MediaSizeName media) { super (x, y, units); @@ -194,7 +194,8 @@ * Unit conversion factor, e.g. <CODE>Size2DSyntax.INCH</CODE> or * <CODE>Size2DSyntax.MM</CODE> * @return MediaSizeName matching these dimensions, or null. - * @exception IllegalArgumentException if x <= 0, y <= 0, or units < 1 + * @exception IllegalArgumentException if {@code x <= 0}, + * {@code y <= 0}, or {@code units < 1}. * */ public static MediaSizeName findMedia(float x, float y, int units) {
--- a/jdk/src/share/classes/javax/print/attribute/standard/PresentationDirection.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/PresentationDirection.java Wed Jul 05 19:07:19 2017 +0200 @@ -56,56 +56,56 @@ /** * Pages are laid out in columns starting at the top left, - * proceeeding towards the bottom & right. + * proceeeding towards the bottom {@literal &} right. */ public static final PresentationDirection TOBOTTOM_TORIGHT = new PresentationDirection(0); /** * Pages are laid out in columns starting at the top right, - * proceeeding towards the bottom & left. + * proceeeding towards the bottom {@literal &} left. */ public static final PresentationDirection TOBOTTOM_TOLEFT = new PresentationDirection(1); /** * Pages are laid out in columns starting at the bottom left, - * proceeeding towards the top & right. + * proceeeding towards the top {@literal &} right. */ public static final PresentationDirection TOTOP_TORIGHT = new PresentationDirection(2); /** * Pages are laid out in columns starting at the bottom right, - * proceeeding towards the top & left. + * proceeeding towards the top {@literal &} left. */ public static final PresentationDirection TOTOP_TOLEFT = new PresentationDirection(3); /** * Pages are laid out in rows starting at the top left, - * proceeeding towards the right & bottom. + * proceeeding towards the right {@literal &} bottom. */ public static final PresentationDirection TORIGHT_TOBOTTOM = new PresentationDirection(4); /** * Pages are laid out in rows starting at the bottom left, - * proceeeding towards the right & top. + * proceeeding towards the right {@literal &} top. */ public static final PresentationDirection TORIGHT_TOTOP = new PresentationDirection(5); /** * Pages are laid out in rows starting at the top right, - * proceeeding towards the left & bottom. + * proceeeding towards the left {@literal &} bottom. */ public static final PresentationDirection TOLEFT_TOBOTTOM = new PresentationDirection(6); /** * Pages are laid out in rows starting at the bottom right, - * proceeeding towards the left & top. + * proceeeding towards the left {@literal &} top. */ public static final PresentationDirection TOLEFT_TOTOP = new PresentationDirection(7);
--- a/jdk/src/share/classes/javax/print/attribute/standard/PrinterMoreInfoManufacturer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/PrinterMoreInfoManufacturer.java Wed Jul 05 19:07:19 2017 +0200 @@ -40,7 +40,7 @@ * details on color support). The information is intended to be germane to * this kind of printer without regard to site specific modifications or * services. - * <P + * <P> * In contrast, the {@link PrinterMoreInfo PrinterMoreInfo} attribute is used * to find out more information about this specific printer rather than this * general kind of printer.
--- a/jdk/src/share/classes/javax/print/attribute/standard/PrinterResolution.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/print/attribute/standard/PrinterResolution.java Wed Jul 05 19:07:19 2017 +0200 @@ -84,11 +84,11 @@ * Feed direction resolution. * @param units * Unit conversion factor, e.g. <code>ResolutionSyntax.DPI</CODE> - * or <code>ResolutionSyntax.>DPCM</CODE>. + * or <code>ResolutionSyntax.DPCM</CODE>. * * @exception IllegalArgumentException - * (unchecked exception) Thrown if <CODE>crossFeedResolution</CODE> < - * 1 or <CODE>feedResolution</CODE> < 1 or <CODE>units</CODE> < 1. + * (unchecked exception) Thrown if {@code crossFeedResolution < 1} or + * {@code feedResolution < 1} or {@code units < 1}. */ public PrinterResolution(int crossFeedResolution, int feedResolution, int units) {
--- a/jdk/src/share/classes/javax/sound/midi/MetaMessage.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/MetaMessage.java Wed Jul 05 19:07:19 2017 +0200 @@ -149,7 +149,7 @@ * @param data the data bytes in the MIDI message * @param length the number of bytes in the <code>data</code> * byte array - * @throws <code>InvalidMidiDataException</code> if the + * @throws InvalidMidiDataException if the * parameter values do not specify a valid MIDI meta message */ public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException {
--- a/jdk/src/share/classes/javax/sound/midi/MidiDevice.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/MidiDevice.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -86,13 +86,13 @@ * To detect if a MidiDevice represents a hardware MIDI port, the * following programming technique can be used: * - * <pre> + * <pre>{@code * MidiDevice device = ...; * if ( ! (device instanceof Sequencer) && ! (device instanceof Synthesizer)) { * // we're now sure that device represents a MIDI port * // ... * } - * </pre> + * }</pre> * * <p> * A <code>MidiDevice</code> includes a <code>{@link MidiDevice.Info}</code> object
--- a/jdk/src/share/classes/javax/sound/midi/MidiDeviceReceiver.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/MidiDeviceReceiver.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -33,7 +33,9 @@ * @since 1.7 */ public interface MidiDeviceReceiver extends Receiver { - /** Obtains a MidiDevice object which is an owner of this Receiver. + /** + * Obtains a MidiDevice object which is an owner of this Receiver. + * @return a MidiDevice object which is an owner of this Receiver */ public MidiDevice getMidiDevice(); }
--- a/jdk/src/share/classes/javax/sound/midi/MidiDeviceTransmitter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/MidiDeviceTransmitter.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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,7 +35,9 @@ */ public interface MidiDeviceTransmitter extends Transmitter { - /** Obtains a MidiDevice object which is an owner of this Transmitter. + /** + * Obtains a MidiDevice object which is an owner of this Transmitter. + * @return a MidiDevice object which is an owner of this Transmitter */ public MidiDevice getMidiDevice(); }
--- a/jdk/src/share/classes/javax/sound/midi/MidiFileFormat.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/MidiFileFormat.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -50,6 +50,7 @@ * be used in implementations: * * <table border=1> + <caption>MIDI File Format Properties</caption> * <tr> * <th>Property key</th> * <th>Value type</th>
--- a/jdk/src/share/classes/javax/sound/midi/MidiMessage.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/MidiMessage.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2002, 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 @@ -55,7 +55,7 @@ * processing MIDI data that originated outside Java Sound and now * is encoded as signed bytes, the bytes can * can be converted to integers using this conversion: - * <center><code>int i = (int)(byte & 0xFF)</code></center> + * <center>{@code int i = (int)(byte & 0xFF)}</center> * <p> * If you simply need to pass a known MIDI byte value as a method parameter, * it can be expressed directly as an integer, using (for example) decimal or @@ -118,6 +118,10 @@ * method is called by concrete subclasses, which should * ensure that the data array specifies a complete, valid MIDI * message. + * + * @param data the data bytes in the MIDI message + * @param length the number of bytes in the data byte array + * @throws InvalidMidiDataException if the parameter values do not specify a valid MIDI meta message */ protected void setMessage(byte[] data, int length) throws InvalidMidiDataException { if (length < 0 || (length > 0 && length > data.length)) {
--- a/jdk/src/share/classes/javax/sound/midi/MidiSystem.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/MidiSystem.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -80,6 +80,7 @@ * consider them: * * <table border=0> + * <caption>MIDI System Property Keys</caption> * <tr> * <th>Property Key</th> * <th>Interface</th> @@ -425,6 +426,8 @@ * it is used to identify the default sequencer. * For details, refer to the {@link MidiSystem class description}. * + * @param connected whether or not the returned {@code Sequencer} + * is connected to the default {@code Synthesizer} * @return the default sequencer * @throws MidiUnavailableException if the sequencer is not * available due to resource restrictions,
--- a/jdk/src/share/classes/javax/sound/midi/ShortMessage.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/ShortMessage.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2005, 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 @@ -283,7 +283,7 @@ /** * Sets the parameters for a MIDI message that takes no data bytes. * @param status the MIDI status byte - * @throws <code>InvalidMidiDataException</code> if <code>status</code> does not + * @throws InvalidMidiDataException if <code>status</code> does not * specify a valid MIDI status byte for a message that requires no data bytes. * @see #setMessage(int, int, int) * @see #setMessage(int, int, int, int) @@ -307,7 +307,7 @@ * @param status the MIDI status byte * @param data1 the first data byte * @param data2 the second data byte - * @throws <code>InvalidMidiDataException</code> if the + * @throws InvalidMidiDataException if the * the status byte, or all data bytes belonging to the message, do * not specify a valid MIDI message. * @see #setMessage(int, int, int, int) @@ -357,7 +357,7 @@ * @param channel the channel associated with the message * @param data1 the first data byte * @param data2 the second data byte - * @throws <code>InvalidMidiDataException</code> if the + * @throws InvalidMidiDataException if the * status byte or all data bytes belonging to the message, do * not specify a valid MIDI message * @@ -397,6 +397,7 @@ * Obtains the MIDI command associated with this event. This method * assumes that the event is a MIDI channel message; if not, the return * value will not be meaningful. + * @return the MIDI command associated with this event * @see #setMessage(int, int, int, int) */ public int getCommand() { @@ -450,7 +451,7 @@ * status byte value. * @param status status byte value, which must represent a short MIDI message * @return data length in bytes (0, 1, or 2) - * @throws <code>InvalidMidiDataException</code> if the + * @throws InvalidMidiDataException if the * <code>status</code> argument does not represent the status byte for any * short message */
--- a/jdk/src/share/classes/javax/sound/midi/Synthesizer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/Synthesizer.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -170,7 +170,7 @@ * already had been), <code>false</code> if the instrument could not be * loaded (for example, if the synthesizer has insufficient * memory to load it) - * @throws <code>IllegalArgumentException</code> if this + * @throws IllegalArgumentException if this * <code>Synthesizer</code> doesn't support the specified instrument's * soundbank * @see #unloadInstrument @@ -186,7 +186,7 @@ /** * Unloads a particular instrument. * @param instrument instrument to unload - * @throws <code>IllegalArgumentException</code> if this + * @throws IllegalArgumentException if this * <code>Synthesizer</code> doesn't support the specified instrument's * soundbank * @see #loadInstrument @@ -214,10 +214,10 @@ * of the old instrument, it should be loaded into the synthesizer * @return <code>true</code> if the instrument succeessfully remapped, * <code>false</code> if feature is not implemented by synthesizer - * @throws <code>IllegalArgumentException</code> if instrument + * @throws IllegalArgumentException if instrument * <code>from</code> or instrument <code>to</code> aren't supported by * synthesizer or if instrument <code>to</code> is not loaded - * @throws <code>NullPointerException</code> if <code>from</code> or + * @throws NullPointerException if <code>from</code> or * <code>to</code> parameters have null value * @see #loadInstrument * @see #loadInstruments
--- a/jdk/src/share/classes/javax/sound/midi/SysexMessage.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/SysexMessage.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2002, 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 @@ -204,6 +204,7 @@ * @param data the system exclusive message data * @param length the length of the valid message data in * the array + * @throws InvalidMidiDataException if the status byte is invalid for a sysex message */ public void setMessage(int status, byte[] data, int length) throws InvalidMidiDataException { if ( (status != 0xF0) && (status != 0xF7) ) {
--- a/jdk/src/share/classes/javax/sound/midi/Track.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/midi/Track.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -211,10 +211,11 @@ /** * Obtains the event at the specified index. * @param index the location of the desired event in the event vector - * @throws <code>ArrayIndexOutOfBoundsException</code> if the + * @throws ArrayIndexOutOfBoundsException if the * specified index is negative or not less than the current size of * this track. * @see #size + * @return the event at the specified index */ public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException { try {
--- a/jdk/src/share/classes/javax/sound/sampled/AudioFileFormat.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/sampled/AudioFileFormat.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -57,6 +57,7 @@ * be used in implementations: * * <table border=1> + * <caption>Audio File Format Property Keys</caption> * <tr> * <th>Property key</th> * <th>Value type</th>
--- a/jdk/src/share/classes/javax/sound/sampled/AudioFormat.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/sampled/AudioFormat.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -85,6 +85,7 @@ * service providers should use, if applicable: * * <table border=0> + * <caption>Audio Format Property Keys</caption> * <tr> * <th>Property key</th> * <th>Value type</th>
--- a/jdk/src/share/classes/javax/sound/sampled/AudioSystem.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/sampled/AudioSystem.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -75,6 +75,7 @@ * consider them: * * <table border=0> + * <caption>Audio System Property Keys</caption> * <tr> * <th>Property Key</th> * <th>Interface</th>
--- a/jdk/src/share/classes/javax/sound/sampled/BooleanControl.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/sampled/BooleanControl.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -125,6 +125,7 @@ /** * Obtains the label for the specified state. + * @param state the state whose label will be returned * @return the label for the specified state, such as "true" or "on" * for <code>true</code>, or "false" or "off" for <code>false</code>. */
--- a/jdk/src/share/classes/javax/sound/sampled/Mixer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/sampled/Mixer.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -133,6 +133,8 @@ * <code>DataLine</code>. * * @param info describes the desired line + * @return a line that is available for use and that matches the description + * in the specified {@code Line.Info} object * @throws LineUnavailableException if a matching line * is not available due to resource restrictions * @throws IllegalArgumentException if this mixer does
--- a/jdk/src/share/classes/javax/sound/sampled/spi/FormatConversionProvider.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/sound/sampled/spi/FormatConversionProvider.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -116,6 +116,7 @@ * given a particular source format. * If no target format encodings are supported for this source format, * an array of length 0 is returned. + * @param sourceFormat format of the incoming data * @return array of supported target format encodings. */ public abstract AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat); @@ -146,6 +147,8 @@ * supported by the format converter * If no target formats with the specified encoding are supported * for this source format, an array of length 0 is returned. + * @param targetEncoding desired encoding of the stream after processing + * @param sourceFormat format of the incoming data * @return array of supported target formats. */ public abstract AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat);
--- a/jdk/src/share/classes/javax/swing/SwingWorker.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/swing/SwingWorker.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, 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 @@ -405,6 +405,7 @@ * */ @SafeVarargs + @SuppressWarnings("varargs") // Passing chunks to add is safe protected final void publish(V... chunks) { synchronized (this) { if (doProcess == null) {
--- a/jdk/src/share/classes/javax/swing/text/GlyphView.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/javax/swing/text/GlyphView.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -514,7 +514,7 @@ int x1 = x0 + (int) painter.getSpan(this, p0, p1, getTabExpander(), x0); // calculate y coordinate - int y = alloc.y + alloc.height - (int) painter.getDescent(this); + int y = alloc.y + (int)(painter.getHeight(this) - painter.getDescent(this)); if (underline) { int yTmp = y + 1; g.drawLine(x0, yTmp, x1, yTmp);
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java Wed Jul 05 19:07:19 2017 +0200 @@ -75,7 +75,10 @@ throw new ClassCastException ("context must be of type DOMCryptoContext"); } - if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) { + if (parent == null) { + throw new NullPointerException(); + } + if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) { throw new ClassCastException("parent must be of type DOMStructure"); } transformElem = (Element) @@ -90,7 +93,10 @@ throw new ClassCastException ("context must be of type DOMCryptoContext"); } - if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) { + if (parent == null) { + throw new NullPointerException(); + } + if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) { throw new ClassCastException("parent must be of type DOMStructure"); } transformElem = (Element)
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheTransform.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheTransform.java Wed Jul 05 19:07:19 2017 +0200 @@ -76,7 +76,10 @@ throw new ClassCastException ("context must be of type DOMCryptoContext"); } - if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) { + if (parent == null) { + throw new NullPointerException(); + } + if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) { throw new ClassCastException("parent must be of type DOMStructure"); } transformElem = (Element) @@ -91,7 +94,10 @@ throw new ClassCastException ("context must be of type DOMCryptoContext"); } - if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) { + if (parent == null) { + throw new NullPointerException(); + } + if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) { throw new ClassCastException("parent must be of type DOMStructure"); } transformElem = (Element)
--- a/jdk/src/share/classes/sun/awt/AppContext.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/awt/AppContext.java Wed Jul 05 19:07:19 2017 +0200 @@ -310,11 +310,13 @@ // and excludes applets because by the time applet starts // a number of contexts have already been created by the plugin. if (numAppContexts.get() == 0) { - // This check is not necessary, its purpose is to help - // Plugin devs to catch all the cases of main AC creation. if (System.getProperty("javaplugin.version") == null && System.getProperty("javawebstart.version") == null) { initMainAppContext(); + } else if (System.getProperty("javafx.version") != null && + threadGroup.getParent() != null) { + // Swing inside JavaFX case + SunToolkit.createNewAppContext(); } }
--- a/jdk/src/share/classes/sun/invoke/anon/ConstantPoolPatch.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/invoke/anon/ConstantPoolPatch.java Wed Jul 05 19:07:19 2017 +0200 @@ -418,7 +418,7 @@ private static final Map<Class<?>, Byte> CONSTANT_VALUE_CLASS_TAG = new IdentityHashMap<Class<?>, Byte>(); - private static final Class[] CONSTANT_VALUE_CLASS = new Class[16]; + private static final Class<?>[] CONSTANT_VALUE_CLASS = new Class<?>[16]; static { Object[][] values = { {Integer.class, CONSTANT_Integer},
--- a/jdk/src/share/classes/sun/net/www/protocol/http/AuthCacheValue.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthCacheValue.java Wed Jul 05 19:07:19 2017 +0200 @@ -37,6 +37,8 @@ public abstract class AuthCacheValue implements Serializable { + static final long serialVersionUID = 735249334068211611L; + public enum Type { Proxy, Server
--- a/jdk/src/share/classes/sun/net/www/protocol/http/AuthenticationInfo.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthenticationInfo.java Wed Jul 05 19:07:19 2017 +0200 @@ -51,6 +51,8 @@ public abstract class AuthenticationInfo extends AuthCacheValue implements Cloneable { + static final long serialVersionUID = -2588378268010453259L; + // Constants saying what kind of authroization this is. This determines // the namespace in the hash table lookup. public static final char SERVER_AUTHENTICATION = 's';
--- a/jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java Wed Jul 05 19:07:19 2017 +0200 @@ -88,6 +88,7 @@ * @param selectAnnotationClasses an array of annotation types to select when parsing */ @SafeVarargs + @SuppressWarnings("varargs") // selectAnnotationClasses is used safely static Map<Class<? extends Annotation>, Annotation> parseSelectAnnotations( byte[] rawAnnotations, ConstantPool constPool,
--- a/jdk/src/share/classes/sun/rmi/runtime/Log.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/runtime/Log.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -61,6 +61,7 @@ * @author Laird Dornin * @since 1.4 */ +@SuppressWarnings("deprecation") public abstract class Log { /** Logger re-definition of old RMI log values */
--- a/jdk/src/share/classes/sun/rmi/server/ActivatableRef.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/server/ActivatableRef.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -41,6 +41,7 @@ import java.rmi.server.RemoteRef; import java.rmi.server.RemoteStub; +@SuppressWarnings("deprecation") public class ActivatableRef implements RemoteRef { private static final long serialVersionUID = 7579060052569229166L;
--- a/jdk/src/share/classes/sun/rmi/server/Dispatcher.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/server/Dispatcher.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 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 @@ -31,6 +31,7 @@ * The Dispatcher interface allows the transport to make * the upcall to the server side remote reference. */ +@SuppressWarnings("deprecation") public interface Dispatcher { /**
--- a/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -67,6 +67,7 @@ * @author Peter Jones * @author Laird Dornin */ +@SuppressWarnings("deprecation") public final class LoaderHandler { /** RMI class loader log level */
--- a/jdk/src/share/classes/sun/rmi/server/UnicastRef.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/server/UnicastRef.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -49,7 +49,8 @@ * NOTE: There is a JDK-internal dependency on the existence of this * class's getLiveRef method (as it is inherited by UnicastRef2) in * the implementation of javax.management.remote.rmi.RMIConnector. - **/ + */ +@SuppressWarnings("deprecation") public class UnicastRef implements RemoteRef { /**
--- a/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -67,6 +67,7 @@ * @author Roger Riggs * @author Peter Jones */ +@SuppressWarnings("deprecation") public class UnicastServerRef extends UnicastRef implements ServerRef, Dispatcher {
--- a/jdk/src/share/classes/sun/rmi/server/Util.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/server/Util.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -64,6 +64,7 @@ * A utility class with static methods for creating stubs/proxies and * skeletons for remote objects. */ +@SuppressWarnings("deprecation") public final class Util { /** "server" package log level */
--- a/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -59,6 +59,7 @@ * * @author Ann Wollrath */ +@SuppressWarnings("deprecation") final class DGCImpl implements DGC { /* dgc system log */
--- a/jdk/src/share/classes/sun/rmi/transport/StreamRemoteCall.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/transport/StreamRemoteCall.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -45,6 +45,7 @@ * * @author Ann Wollrath */ +@SuppressWarnings("deprecation") public class StreamRemoteCall implements RemoteCall { private ConnectionInputStream in = null; private ConnectionOutputStream out = null;
--- a/jdk/src/share/classes/sun/rmi/transport/Transport.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/transport/Transport.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -47,6 +47,7 @@ * * @author Ann Wollrath */ +@SuppressWarnings("deprecation") public abstract class Transport { /** "transport" package log level */
--- a/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -44,6 +44,7 @@ * connect to the same host will automatically use the same * mechanism. */ +@SuppressWarnings("deprecation") public class RMIMasterSocketFactory extends RMISocketFactory { /** "proxy" package log level */
--- a/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -43,6 +43,7 @@ * * @author Peter Jones */ +@SuppressWarnings("deprecation") final class ConnectionMultiplexer { /** "multiplex" log level */
--- a/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 @@ -84,6 +84,7 @@ * @author Ann Wollrath * @author Peter Jones */ +@SuppressWarnings("deprecation") public class TCPTransport extends Transport { /* tcp package log */
--- a/jdk/src/share/classes/sun/security/ec/ECDSASignature.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/security/ec/ECDSASignature.java Wed Jul 05 19:07:19 2017 +0200 @@ -323,6 +323,7 @@ // set parameter, not supported. See JCA doc @Override + @Deprecated protected void engineSetParameter(String param, Object value) throws InvalidParameterException { throw new UnsupportedOperationException("setParameter() not supported"); @@ -330,6 +331,7 @@ // get parameter, not supported. See JCA doc @Override + @Deprecated protected Object engineGetParameter(String param) throws InvalidParameterException { throw new UnsupportedOperationException("getParameter() not supported");
--- a/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, 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 @@ -96,10 +96,15 @@ } } - // SecretKeySpec does not allow zero length keys, so we define our own class. + // SecretKeySpec does not allow zero length keys, so we define our + // own class. + // + // As an anonymous class cannot make any guarantees about serialization + // compatibility, it is nonsensical for an anonymous class to define a + // serialVersionUID. Suppress warnings relative to missing serialVersionUID + // field in the anonymous subclass of serializable SecretKey. + @SuppressWarnings("serial") private static final SecretKey NULL_KEY = new SecretKey() { - private static final long serialVersionUID = -8090049519656411362L; - public byte[] getEncoded() { return new byte[0]; }
--- a/jdk/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java Wed Jul 05 19:07:19 2017 +0200 @@ -775,7 +775,7 @@ } } if (params != null) { - if (algorithm.equals(pbes2_OID)) { + if (algorithm.equals((Object)pbes2_OID)) { algParams = AlgorithmParameters.getInstance("PBES2"); } else { algParams = AlgorithmParameters.getInstance("PBE"); @@ -912,7 +912,7 @@ private static String mapPBEParamsToAlgorithm(ObjectIdentifier algorithm, AlgorithmParameters algParams) throws NoSuchAlgorithmException { // Check for PBES2 algorithms - if (algorithm.equals(pbes2_OID) && algParams != null) { + if (algorithm.equals((Object)pbes2_OID) && algParams != null) { return algParams.toString(); } return algorithm.toString(); @@ -1921,7 +1921,7 @@ } safeContentsData = safeContents.getData(); - } else if (contentType.equals(ContentInfo.ENCRYPTED_DATA_OID)) { + } else if (contentType.equals((Object)ContentInfo.ENCRYPTED_DATA_OID)) { if (password == null) { continue; }
--- a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Wed Jul 05 19:07:19 2017 +0200 @@ -169,7 +169,7 @@ /* * Drives the protocol state machine. */ - private int connectionState; + private volatile int connectionState; /* * Flag indicating if the next record we receive MUST be a Finished @@ -1467,7 +1467,7 @@ */ @Override public boolean isClosed() { - return getConnectionState() == cs_APP_CLOSED; + return connectionState == cs_APP_CLOSED; } /**
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Wed Jul 05 19:07:19 2017 +0200 @@ -291,7 +291,8 @@ String flags = args[n]; String modifier = null; - if (flags.charAt(0) == '-') { + + if (flags.startsWith("-")) { int pos = flags.indexOf(':'); if (pos > 0) { modifier = flags.substring(pos+1); @@ -299,7 +300,14 @@ } } - if (collator.compare(flags, "-keystore") == 0) { + if (!flags.startsWith("-")) { + if (jarfile == null) { + jarfile = flags; + } else { + alias = flags; + ckaliases.add(alias); + } + } else if (collator.compare(flags, "-keystore") == 0) { if (++n == args.length) usageNoArg(); keystore = args[n]; } else if (collator.compare(flags, "-storepass") ==0) { @@ -380,18 +388,9 @@ collator.compare(flags, "-help") == 0) { fullusage(); } else { - if (!flags.startsWith("-")) { - if (jarfile == null) { - jarfile = flags; - } else { - alias = flags; - ckaliases.add(alias); - } - } else { - System.err.println( - rb.getString("Illegal.option.") + flags); - usage(); - } + System.err.println( + rb.getString("Illegal.option.") + flags); + usage(); } }
--- a/jdk/src/share/classes/sun/swing/AccumulativeRunnable.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/swing/AccumulativeRunnable.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, 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 @@ -121,6 +121,7 @@ * @param args the arguments to accumulate */ @SafeVarargs + @SuppressWarnings("varargs") // Copying args is safe public final synchronized void add(T... args) { boolean isSubmitted = true; if (arguments == null) {
--- a/jdk/src/share/classes/sun/tools/asm/Assembler.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/tools/asm/Assembler.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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,9 +91,9 @@ add(new Instruction(where, opc, flagNoCovered)); } - static Vector SourceClassList = new Vector(); + static Vector<String> SourceClassList = new Vector<>(); - static Vector TmpCovTable = new Vector(); + static Vector<String> TmpCovTable = new Vector<>(); static int[] JcovClassCountArray = new int[CT_LAST_KIND + 1]; @@ -177,8 +177,8 @@ case opc_lookupswitch: { SwitchData sw = (SwitchData)inst.value; optimize(env, sw.defaultLabel); - for (Enumeration e = sw.tab.elements() ; e.hasMoreElements();) { - optimize(env, (Label)e.nextElement()); + for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) { + optimize(env, e.nextElement()); } return; } @@ -186,8 +186,8 @@ case opc_try: { TryData td = (TryData)inst.value; td.getEndLabel().pc = NEEDED; - for (Enumeration e = td.catches.elements() ; e.hasMoreElements();) { - CatchData cd = (CatchData)e.nextElement(); + for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) { + CatchData cd = e.nextElement(); optimize(env, cd.getLabel()); } break; @@ -237,9 +237,11 @@ // Collect constants for arguments only // if a local variable table is generated if ((field != null) && env.debug_vars()) { - if (field.getArguments() != null) { - for (Enumeration e = field.getArguments().elements() ; e.hasMoreElements() ;) { - MemberDefinition f = (MemberDefinition)e.nextElement(); + @SuppressWarnings("unchecked") + Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments(); + if (v != null) { + for (Enumeration<MemberDefinition> e = v.elements() ; e.hasMoreElements() ;) { + MemberDefinition f = e.nextElement(); tab.put(f.getName().toString()); tab.put(f.getType().getTypeSignature()); } @@ -355,16 +357,16 @@ case opc_lookupswitch: { SwitchData sw = (SwitchData)inst.value; balance(sw.defaultLabel, depth); - for (Enumeration e = sw.tab.elements() ; e.hasMoreElements();) { - balance((Label)e.nextElement(), depth); + for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) { + balance(e.nextElement(), depth); } return; } case opc_try: { TryData td = (TryData)inst.value; - for (Enumeration e = td.catches.elements() ; e.hasMoreElements();) { - CatchData cd = (CatchData)e.nextElement(); + for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) { + CatchData cd = e.nextElement(); balance(cd.getLabel(), depth + 1); } break; @@ -383,9 +385,10 @@ if ((field != null) && field.getArguments() != null) { int sum = 0; - Vector v = field.getArguments(); - for (Enumeration e = v.elements(); e.hasMoreElements(); ) { - MemberDefinition f = ((MemberDefinition)e.nextElement()); + @SuppressWarnings("unchecked") + Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments(); + for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) { + MemberDefinition f = e.nextElement(); sum += f.getType().stackSize(); } maxvar = sum; @@ -441,8 +444,8 @@ if (inst.opc == opc_try) { TryData td = (TryData)inst.value; writeExceptions(env, out, tab, inst.next, td.getEndLabel()); - for (Enumeration e = td.catches.elements() ; e.hasMoreElements();) { - CatchData cd = (CatchData)e.nextElement(); + for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) { + CatchData cd = e.nextElement(); //System.out.println("EXCEPTION: " + env.getSource() + ", pc=" + inst.pc + ", end=" + td.getEndLabel().pc + ", hdl=" + cd.getLabel().pc + ", tp=" + cd.getType()); out.writeShort(inst.pc); out.writeShort(td.getEndLabel().pc); @@ -463,11 +466,12 @@ * Write the coverage table */ public void writeCoverageTable(Environment env, ClassDefinition c, DataOutputStream out, ConstantPool tab, long whereField) throws IOException { - Vector TableLot = new Vector(); /* Coverage table */ + Vector<Cover> TableLot = new Vector<>(); /* Coverage table */ boolean begseg = false; boolean begmeth = false; + @SuppressWarnings("deprecation") long whereClass = ((SourceClass)c).getWhere(); - Vector whereTry = new Vector(); + Vector<Long> whereTry = new Vector<>(); int numberTry = 0; int count = 0; @@ -484,8 +488,8 @@ } if (!begseg && !inst.flagNoCovered ) { boolean findTry = false; - for (Enumeration e = whereTry.elements(); e.hasMoreElements();) { - if ( ((Long)(e.nextElement())).longValue() == inst.where) { + for (Enumeration<Long> e = whereTry.elements(); e.hasMoreElements();) { + if (e.nextElement().longValue() == inst.where) { findTry = true; break; } @@ -546,7 +550,7 @@ } case opc_try: { - whereTry.addElement(new Long(inst.where)); + whereTry.addElement(Long.valueOf(inst.where)); begseg = false; break; } @@ -569,8 +573,8 @@ } case opc_lookupswitch: { SwitchData sw = (SwitchData)inst.value; - for (Enumeration e = sw.sortedKeys(); e.hasMoreElements() ; ) { - Integer v = (Integer)e.nextElement(); + for (Enumeration<Integer> e = sw.sortedKeys(); e.hasMoreElements() ; ) { + Integer v = e.nextElement(); TableLot.addElement(new Cover(CT_CASE, sw.whereCase(v), inst.pc)); count++; } @@ -591,7 +595,7 @@ out.writeShort(count); for (int i = 0; i < count; i++) { - Lot = (Cover)TableLot.elementAt(i); + Lot = TableLot.elementAt(i); ln = (Lot.Addr >> WHEREOFFSETBITS); pos = (Lot.Addr << (64 - WHEREOFFSETBITS)) >> (64 - WHEREOFFSETBITS); out.writeShort(Lot.NumCommand); @@ -646,6 +650,7 @@ */ public void GenVecJCov(Environment env, ClassDefinition c, long Time) { + @SuppressWarnings("deprecation") String SourceFile = ((SourceClass)c).getAbsoluteName(); TmpCovTable.addElement(createClassJcovElement(env, c)); @@ -667,6 +672,7 @@ * generate file of coverage data */ +@SuppressWarnings("deprecation") // for JCovd.readLine() calls public void GenJCov(Environment env) { try { @@ -686,14 +692,14 @@ while((CurrLine = JCovd.readLine()) != null ) { if ( CurrLine.startsWith(JcovClassLine) ) { first = true; - for(Enumeration e = SourceClassList.elements(); e.hasMoreElements();) { + for(Enumeration<String> e = SourceClassList.elements(); e.hasMoreElements();) { String clsName = CurrLine.substring(JcovClassLine.length()); int idx = clsName.indexOf(' '); if (idx != -1) { clsName = clsName.substring(0, idx); } - Class = (String)e.nextElement(); + Class = e.nextElement(); if ( Class.compareTo(clsName) == 0) { first = false; break; @@ -708,7 +714,7 @@ } PrintStream CovFile = new PrintStream(new DataOutputStream(new FileOutputStream(outFile))); CovFile.println(JcovMagicLine); - for(Enumeration e = TmpCovTable.elements(); e.hasMoreElements();) { + for(Enumeration<String> e = TmpCovTable.elements(); e.hasMoreElements();) { CovFile.println(e.nextElement()); } CovFile.close(); @@ -821,16 +827,16 @@ case opc_lookupswitch: { SwitchData sw = (SwitchData)inst.value; flowFields(env, sw.defaultLabel, locals); - for (Enumeration e = sw.tab.elements() ; e.hasMoreElements();) { - flowFields(env, (Label)e.nextElement(), locals); + for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) { + flowFields(env, e.nextElement(), locals); } return; } case opc_try: { - Vector catches = ((TryData)inst.value).catches; - for (Enumeration e = catches.elements(); e.hasMoreElements();) { - CatchData cd = (CatchData)e.nextElement(); + Vector<CatchData> catches = ((TryData)inst.value).catches; + for (Enumeration<CatchData> e = catches.elements(); e.hasMoreElements();) { + CatchData cd = e.nextElement(); flowFields(env, cd.getLabel(), locals); } break; @@ -851,9 +857,10 @@ // Initialize arguments if ((field != null) && (field.getArguments() != null)) { int reg = 0; - Vector v = field.getArguments(); - for (Enumeration e = v.elements(); e.hasMoreElements(); ) { - MemberDefinition f = ((MemberDefinition)e.nextElement()); + @SuppressWarnings("unchecked") + Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments(); + for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) { + MemberDefinition f = e.nextElement(); locals[reg] = f; reg += f.getType().stackSize(); } @@ -867,9 +874,10 @@ locals[i] = null; if ((field != null) && (field.getArguments() != null)) { int reg = 0; - Vector v = field.getArguments(); - for (Enumeration e = v.elements(); e.hasMoreElements(); ) { - MemberDefinition f = ((MemberDefinition)e.nextElement()); + @SuppressWarnings("unchecked") + Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments(); + for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) { + MemberDefinition f = e.nextElement(); locals[reg] = f; lvtab.define(f, reg, 0, maxpc); reg += f.getType().stackSize();
--- a/jdk/src/share/classes/sun/tools/asm/ConstantPool.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/tools/asm/ConstantPool.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -42,20 +42,20 @@ */ public final class ConstantPool implements RuntimeConstants { - Hashtable hash = new Hashtable(101); + Hashtable<Object,ConstantPoolData> hash = new Hashtable<>(101); /** * Find an entry, may return 0 */ public int index(Object obj) { - return ((ConstantPoolData)hash.get(obj)).index; + return hash.get(obj).index; } /** * Add an entry */ public void put(Object obj) { - ConstantPoolData data = (ConstantPoolData)hash.get(obj); + ConstantPoolData data = hash.get(obj); if (data == null) { if (obj instanceof String) { data = new StringConstantData(this, (String)obj); @@ -87,8 +87,8 @@ // Make a list of all the constant pool items for (int n = 0 ; n < 5 ; n++) { int first = count; - for (Enumeration e = hash.elements() ; e.hasMoreElements() ;) { - ConstantPoolData data = (ConstantPoolData)e.nextElement(); + for (Enumeration<ConstantPoolData> e = hash.elements() ; e.hasMoreElements() ;) { + ConstantPoolData data = e.nextElement(); if (data.order() == n) { keys[count] = sortKey(data); list[count++] = data;
--- a/jdk/src/share/classes/sun/tools/asm/Instruction.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/tools/asm/Instruction.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -274,9 +274,9 @@ case opc_lookupswitch: { SwitchData sw = (SwitchData)value; sw.defaultLabel = sw.defaultLabel.getDestination(); - for (Enumeration e = sw.tab.keys() ; e.hasMoreElements() ; ) { - Integer k = (Integer)e.nextElement(); - Label lbl = (Label)sw.tab.get(k); + for (Enumeration<Integer> e = sw.tab.keys() ; e.hasMoreElements() ; ) { + Integer k = e.nextElement(); + Label lbl = sw.tab.get(k); sw.tab.put(k, lbl.getDestination()); } @@ -389,8 +389,8 @@ return; case opc_try: - for (Enumeration e = ((TryData)value).catches.elements() ; e.hasMoreElements() ;) { - CatchData cd = (CatchData)e.nextElement(); + for (Enumeration<CatchData> e = ((TryData)value).catches.elements() ; e.hasMoreElements() ;) { + CatchData cd = e.nextElement(); if (cd.getType() != null) { tab.put(cd.getType()); } @@ -641,6 +641,7 @@ /** * Generate code */ + @SuppressWarnings("fallthrough") void write(DataOutputStream out, ConstantPool tab) throws IOException { switch (opc) { case opc_try: case opc_label: case opc_dead: @@ -770,8 +771,8 @@ } out.writeInt(sw.defaultLabel.pc - pc); out.writeInt(sw.tab.size()); - for (Enumeration e = sw.sortedKeys(); e.hasMoreElements() ; ) { - Integer v = (Integer)e.nextElement(); + for (Enumeration<Integer> e = sw.sortedKeys(); e.hasMoreElements() ; ) { + Integer v = e.nextElement(); out.writeInt(v.intValue()); out.writeInt(sw.get(v).pc - pc); }
--- a/jdk/src/share/classes/sun/tools/asm/SwitchData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/tools/asm/SwitchData.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -39,23 +39,23 @@ class SwitchData { int minValue, maxValue; Label defaultLabel = new Label(); - Hashtable tab = new Hashtable(); + Hashtable<Integer,Label> tab = new Hashtable<>(); // JCOV - Hashtable whereCaseTab = null; + Hashtable<Integer,Long> whereCaseTab = null; // end JCOV /** * Get a label */ public Label get(int n) { - return (Label)tab.get(new Integer(n)); + return tab.get(n); } /** * Get a label */ public Label get(Integer n) { - return (Label)tab.get(n); + return tab.get(n); } /** @@ -73,7 +73,7 @@ maxValue = n; } } - tab.put(new Integer(n), lbl); + tab.put(Integer.valueOf(n), lbl); } /** @@ -86,33 +86,35 @@ /** * Return the keys of this enumaration sorted in ascending order */ - public synchronized Enumeration sortedKeys() { + public synchronized Enumeration<Integer> sortedKeys() { return new SwitchDataEnumeration(tab); } // JCOV public void initTableCase() { - whereCaseTab = new Hashtable(); + whereCaseTab = new Hashtable<Integer,Long>(); } public void addTableCase(int index, long where) { if (whereCaseTab != null) - whereCaseTab.put(new Integer(index), new Long(where)); + whereCaseTab.put(Integer.valueOf(index), Long.valueOf(where)); } + // this puts String key into Hashtable<Integer,Long> + @SuppressWarnings("unchecked") public void addTableDefault(long where) { if (whereCaseTab != null) - whereCaseTab.put("default", new Long(where)); + ((Hashtable)whereCaseTab).put("default", Long.valueOf(where)); } public long whereCase(Object key) { - Long i = (Long) whereCaseTab.get(key); - return (i == null) ? 0 : i.longValue(); + Long i = whereCaseTab.get(key); + return (i == null) ? 0L : i.longValue(); } public boolean getDefault() { - return (whereCase("default") != 0); + return (whereCase("default") != 0L); } // end JCOV } -class SwitchDataEnumeration implements Enumeration { +class SwitchDataEnumeration implements Enumeration<Integer> { private Integer table[]; private int current_index = 0; @@ -121,11 +123,11 @@ * hash table will be an Integer, with the value being a label. The * enumeration returns the keys in sorted order. */ - SwitchDataEnumeration(Hashtable tab) { + SwitchDataEnumeration(Hashtable<Integer,Label> tab) { table = new Integer[tab.size()]; int i = 0; - for (Enumeration e = tab.keys() ; e.hasMoreElements() ; ) { - table[i++] = (Integer)e.nextElement(); + for (Enumeration<Integer> e = tab.keys() ; e.hasMoreElements() ; ) { + table[i++] = e.nextElement(); } Arrays.sort(table); current_index = 0; @@ -141,7 +143,7 @@ /** * Return the next key. */ - public Object nextElement() { + public Integer nextElement() { return table[current_index++]; } }
--- a/jdk/src/share/classes/sun/tools/asm/TryData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/tools/asm/TryData.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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,7 +35,7 @@ */ public final class TryData { - Vector catches = new Vector(); + Vector<CatchData> catches = new Vector<>(); Label endLabel = new Label(); /** @@ -51,7 +51,7 @@ * Get a label */ public CatchData getCatch(int n) { - return (CatchData)catches.elementAt(n); + return catches.elementAt(n); } /**
--- a/jdk/src/share/classes/sun/tools/jar/JarException.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/classes/sun/tools/jar/JarException.java Wed Jul 05 19:07:19 2017 +0200 @@ -29,6 +29,9 @@ public class JarException extends IOException { + + static final long serialVersionUID = -4351820108009811497L; + public JarException() { super(); }
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/com/sun/demo/scripting/jconsole/ScriptShellPanel.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/com/sun/demo/scripting/jconsole/ScriptShellPanel.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -54,7 +54,7 @@ * jconsole's script console. */ -class ScriptShellPanel extends JPanel { +public class ScriptShellPanel extends JPanel { private static final long serialVersionUID = 4116273141148726319L;
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/resources/jconsole.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/resources/jconsole.js Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -77,12 +77,37 @@ function jcontext() { return plugin.getContext(); } -jcontext.docString = "returns JConsoleContext for the current jconsole plugin" +jcontext.docString = "returns JConsoleContext for the current jconsole plugin"; function mbeanConnection() { return jcontext().getMBeanServerConnection(); } -mbeanConnection.docString = "returns current MBeanServer connection" +mbeanConnection.docString = "returns current MBeanServer connection"; + +// check if there is a build in sync function, define one if missing +if (typeof sync === "undefined") { + var sync = function(func, obj) { + if (arguments.length < 1 || arguments.length > 2 ) { + throw "sync(function [,object]) parameter count mismatch"; + } + + var syncobj = (arguments.length == 2 ? obj : this); + + if (!syncobj._syncLock) { + syncobj._syncLock = new Lock(); + } + + return function() { + syncobj._syncLock.lock(); + try { + func.apply(null, arguments); + } finally { + syncobj._syncLock.unlock(); + } + }; + }; + sync.docString = "synchronize a function, optionally on an object"; +} /** * Prints one liner help message for each function exposed here @@ -188,22 +213,12 @@ // wraps a script array as java.lang.Object[] function objectArray(array) { - var len = array.length; - var res = java.lang.reflect.Array.newInstance(java.lang.Object, len); - for (var i = 0; i < array.length; i++) { - res[i] = array[i]; - } - return res; + return Java.to(array, "java.lang.Object[]"); } // wraps a script (string) array as java.lang.String[] function stringArray(array) { - var len = array.length; - var res = java.lang.reflect.Array.newInstance(java.lang.String, len); - for (var i = 0; i < array.length; i++) { - res[i] = String(array[i]); - } - return res; + return Java.to(array, "java.lang.String[]"); } // script array to Java List @@ -286,16 +301,18 @@ * will be of type FutureTask. When you need value, call 'get' on it. */ function mbean(objName, async) { + var index; + objName = objectName(objName); var info = mbeanInfo(objName); var attrs = info.attributes; var attrMap = new Object; - for (var index in attrs) { + for (index in attrs) { attrMap[attrs[index].name] = attrs[index]; } var opers = info.operations; var operMap = new Object; - for (var index in opers) { + for (index in opers) { operMap[opers[index].name] = opers[index]; } @@ -318,21 +335,30 @@ } else { return getMBeanAttribute(objName, name); } - } else if (isOperation(name)) { + } else { + return undefined; + } + }, + __call__: function(name) { + if (isOperation(name)) { var oper = operMap[name]; - return function() { - var params = objectArray(arguments); - var sigs = oper.signature; - var sigNames = new Array(sigs.length); - for (var index in sigs) { - sigNames[index] = sigs[index].getType(); - } - if (async) { - return invokeMBean.future(objName, name, - params, sigNames); - } else { - return invokeMBean(objName, name, params, sigNames); - } + + var params = []; + for (var j = 1; j < arguments.length; j++) { + params[j-1]= arguments[j]; + } + + var sigs = oper.signature; + + var sigNames = new Array(sigs.length); + for (var index in sigs) { + sigNames[index] = sigs[index].getType(); + } + + if (async) { + return invokeMBean.future(objName, name, params, sigNames); + } else { + return invokeMBean(objName, name, params, sigNames); } } else { return undefined; @@ -520,7 +546,7 @@ } finally { lock.unlock(); } -} +}; /** * Causes current thread to sleep for specified @@ -534,8 +560,7 @@ sleep.docString = "wrapper for java.lang.Thread.sleep method"; /** - * Schedules a task to be executed once in - * every N milliseconds specified. + * Schedules a task to be executed once in N milliseconds specified. * * @param callback function or expression to evaluate * @param interval in milliseconds to sleep @@ -549,15 +574,15 @@ // start a new thread that sleeps given time // and calls callback in an infinite loop return (function() { - while (true) { + try { sleep(interval); - callback(); - } + } catch (x) { } + callback(); }).daemon(); } -setTimeout.docString = "calls given callback once after specified interval" +setTimeout.docString = "calls given callback once after specified interval"; -/** +/** * Cancels a timeout set earlier. * @param tid timeout ID returned from setTimeout */ @@ -565,6 +590,45 @@ // we just interrupt the timer thread tid.interrupt(); } +clearTimeout.docString = "interrupt a setTimeout timer"; + +/** + * Schedules a task to be executed once in + * every N milliseconds specified. + * + * @param callback function or expression to evaluate + * @param interval in milliseconds to sleep + * @return timeout ID (which is nothing but Thread instance) + */ +function setInterval(callback, interval) { + if (! (callback instanceof Function)) { + callback = new Function(callback); + } + + // start a new thread that sleeps given time + // and calls callback in an infinite loop + return (function() { + while (true) { + try { + sleep(interval); + } catch (x) { + break; + } + callback(); + } + }).daemon(); +} +setInterval.docString = "calls given callback every specified interval"; + +/** + * Cancels a timeout set earlier. + * @param tid timeout ID returned from setTimeout + */ +function clearInterval(tid) { + // we just interrupt the timer thread + tid.interrupt(); +} +clearInterval.docString = "interrupt a setInterval timer"; /** * Simple access to thread local storage. @@ -680,7 +744,7 @@ if (msg === undefined) msg = "undefined"; if (msg === null) msg = "null"; if (title == undefined) title = msg; - if (msgType == undefined) type = JOptionPane.INFORMATION_MESSAGE; + if (msgType == undefined) msgType = JOptionPane.INFORMATION_MESSAGE; JOptionPane.showMessageDialog(window, msg, title, msgType); } if (isEventThread()) { @@ -800,7 +864,7 @@ * Clear the screen */ function clear() { - (function() { window.clear(false) }).invokeLater(); + (function() { window.clear(false); }).invokeLater(); } clear.docString = "clears interactive console screen";
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/invoke.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/invoke.js Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -53,6 +53,6 @@ * */ function resetPeakThreadCount() { - return invokeMBean("java.lang:type=Threading", "resetPeakThreadCount", [], ""); + return invokeMBean("java.lang:type=Threading", "resetPeakThreadCount", [], {}); }
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jstack.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jstack.js Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -43,16 +43,16 @@ * threads.'jstack' function which can be called once or periodically * from a timer thread (calling it periodically would slow down the target * application). To call this once, just call 'jstack()' in script - * console prompt. To call jtop in a timer thread, you can use + * console prompt. To call jstack in a timer thread, you can use * - * var t = setTimeout(function () { jstack(print); }, 5000); + * var t = setInterval(function () { jstack(print); }, 5000); * * The above call prints threads in sorted order for every 5 seconds. * The print output goes to OS console window from which jconsole was * started. The timer can be cancelled later by clearTimeout() function * as shown below: * - * clearTimeout(t); + * clearInterval(t); */ @@ -87,7 +87,7 @@ var tmbean = newPlatformMXBeanProxy( "java.lang:type=Threading", - java.lang.management.ThreadMXBean); + java.lang.management.ThreadMXBean.class); var tids = tmbean.allThreadIds; var tinfos = tmbean["getThreadInfo(long[],int)"](tids, maxFrames);
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jtop.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jtop.js Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -45,14 +45,14 @@ * To call this once, just call 'jtop()' in script console prompt. * To call jtop in a timer thread, you can use * - * var t = setTimeout(function () { jtop(print); }, 2000); + * var t = setInterval(function () { jtop(print); }, 2000); * * The above call prints threads in sorted order for every 2 seconds. * The print output goes to OS console window from which jconsole was * started. The timer can be cancelled later by clearTimeout() function * as shown below: - * - * clearTimeout(t); + * + * clearInterval(t); */ /** @@ -62,10 +62,10 @@ function getThreadList() { var tmbean = newPlatformMXBeanProxy( "java.lang:type=Threading", - java.lang.management.ThreadMXBean); + java.lang.management.ThreadMXBean.class); if (!tmbean.isThreadCpuTimeSupported()) { - return; + return java.util.Collections.EMPTY_LIST; } tmbean.setThreadCpuTimeEnabled(true);
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/sysprops.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/sysprops.js Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -43,16 +43,16 @@ * properties.'sysprops' function which can be called once or periodically * from a timer thread (calling it periodically would slow down the target * application). To call this once, just call 'sysprops()' in script - * console prompt. To call jtop in a timer thread, you can use + * console prompt. To call sysprops in a timer thread, you can use * - * var t = setTimeout(function () { sysprops(print); }, 5000); + * var t = setInterval(function () { sysprops(print); }, 5000); * * The above call prints threads in sorted order for every 5 seconds. * The print output goes to OS console window from which jconsole was * started. The timer can be cancelled later by clearTimeout() function * as shown below: * - * clearTimeout(t); + * clearInterval(t); */ @@ -62,7 +62,7 @@ function getSystemProps() { var runtimeBean = newPlatformMXBeanProxy( "java.lang:type=Runtime", - java.lang.management.RuntimeMXBean); + java.lang.management.RuntimeMXBean.class); return runtimeBean.systemProperties; }
--- a/jdk/src/share/sample/scripting/scriptpad/README.txt Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/sample/scripting/scriptpad/README.txt Wed Jul 05 19:07:19 2017 +0200 @@ -108,7 +108,7 @@ java -Dcom.sun.management.jmxremote.port=1090 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ - -jar $JDK_HOME/demo/jfc/Java2D/Java2Demo.jar + -jar $JDK_HOME/demo/jfc/Font2DTest/Font2DTest.jar (2) Start scriptpad and click on "Tools->JMX Connect" menu. In the prompt, enter "localhost:1090" to connect to the above
--- a/jdk/src/share/sample/scripting/scriptpad/src/resources/conc.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/sample/scripting/scriptpad/src/resources/conc.js Wed Jul 05 19:07:19 2017 +0200 @@ -221,7 +221,7 @@ * @return timeout ID (which is nothing but Thread instance) */ function setTimeout(callback, interval) { - if (! (callback instanceof Function) && typeof callback !== "function") { + if (! (callback instanceof Function)) { callback = new Function(callback); } @@ -255,7 +255,7 @@ * @return timeout ID (which is nothing but Thread instance) */ function setInterval(callback, interval) { - if (! (callback instanceof Function) && typeof callback !== "function") { + if (! (callback instanceof Function)) { callback = new Function(callback); }
--- a/jdk/src/share/sample/scripting/scriptpad/src/resources/mm.js Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/share/sample/scripting/scriptpad/src/resources/mm.js Wed Jul 05 19:07:19 2017 +0200 @@ -159,22 +159,12 @@ // wraps a script array as java.lang.Object[] function objectArray(array) { - var len = array.length; - var res = java.lang.reflect.Array.newInstance(java.lang.Object, len); - for (var i = 0; i < array.length; i++) { - res[i] = array[i]; - } - return res; + return Java.to(array, "java.lang.Object[]"); } // wraps a script (string) array as java.lang.String[] function stringArray(array) { - var len = array.length; - var res = java.lang.reflect.Array.newInstance(java.lang.String, len); - for (var i = 0; i < array.length; i++) { - res[i] = String(array[i]); - } - return res; + return Java.to(array, "java.lang.String[]"); } // script array to Java List @@ -284,26 +274,35 @@ __get__: function (name) { if (isAttribute(name)) { if (async) { - return getMBeanAttribute.future(objName, name); + return getMBeanAttribute.future(objName, name); } else { - return getMBeanAttribute(objName, name); + return getMBeanAttribute(objName, name); } - } else if (isOperation(name)) { + } else { + return undefined; + } + }, + __call__: function(name) { + if (isOperation(name)) { var oper = operMap[name]; - return function() { - var params = objectArray(arguments); - var sigs = oper.signature; - var sigNames = new Array(sigs.length); - for (var index in sigs) { - sigNames[index] = sigs[index].getType(); - } - if (async) { - return invokeMBean.future(objName, name, - params, sigNames); - } else { - return invokeMBean(objName, name, params, sigNames); - } - }; + + var params = []; + for (var j = 1; j < arguments.length; j++) { + params[j-1]= arguments[j]; + } + + var sigs = oper.signature; + + var sigNames = new Array(sigs.length); + for (var index in sigs) { + sigNames[index] = sigs[index].getType(); + } + + if (async) { + return invokeMBean.future(objName, name, params, sigNames); + } else { + return invokeMBean(objName, name, params, sigNames); + } } else { return undefined; }
--- a/jdk/src/solaris/classes/sun/print/UnixPrintJob.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/solaris/classes/sun/print/UnixPrintJob.java Wed Jul 05 19:07:19 2017 +0200 @@ -334,6 +334,10 @@ throw new PrintException("can't get print data: " + e.toString()); } + if (data == null) { + throw new PrintException("Null print data."); + } + if (flavor == null || (!service.isDocFlavorSupported(flavor))) { notifyEvent(PrintJobEvent.JOB_FAILED); throw new PrintJobFlavorException("invalid flavor", flavor);
--- a/jdk/src/solaris/native/java/lang/java_props_md.c Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/solaris/native/java/lang/java_props_md.c Wed Jul 05 19:07:19 2017 +0200 @@ -361,6 +361,25 @@ *std_encoding = "Big5-HKSCS-2001"; } #endif +#ifdef MACOSX + /* + * For the case on MacOS X where encoding is set to US-ASCII, but we + * don't have any encoding hints from LANG/LC_ALL/LC_CTYPE, use UTF-8 + * instead. + * + * The contents of ASCII files will still be read and displayed + * correctly, but so will files containing UTF-8 characters beyond the + * standard ASCII range. + * + * Specifically, this allows apps launched by double-clicking a .jar + * file to correctly read UTF-8 files using the default encoding (see + * 8011194). + */ + if (strcmp(p,"US-ASCII") == 0 && getenv("LANG") == NULL && + getenv("LC_ALL") == NULL && getenv("LC_CTYPE") == NULL) { + *std_encoding = "UTF-8"; + } +#endif } free(temp);
--- a/jdk/src/solaris/native/sun/awt/gtk2_interface.c Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/solaris/native/sun/awt/gtk2_interface.c Wed Jul 05 19:07:19 2017 +0200 @@ -794,6 +794,7 @@ } putenv (new_env); free (new_env); + free (tmp_env); } }
--- a/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Wed Jul 05 19:07:19 2017 +0200 @@ -269,6 +269,13 @@ static jboolean firstTime = JNI_TRUE; if (firstTime) { +#ifdef DISABLE_XRENDER_BY_DEFAULT + if (verbose == JNI_FALSE) { + xrenderAvailable = JNI_FALSE; + firstTime = JNI_FALSE; + return xrenderAvailable; + } +#endif AWT_LOCK(); xrenderAvailable = IsXRenderAvailable(verbose); AWT_UNLOCK();
--- a/jdk/src/windows/classes/sun/print/Win32PrintJob.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/windows/classes/sun/print/Win32PrintJob.java Wed Jul 05 19:07:19 2017 +0200 @@ -340,6 +340,10 @@ throw new PrintException("can't get print data: " + e.toString()); } + if (data == null) { + throw new PrintException("Null print data."); + } + if (flavor == null || (!service.isDocFlavorSupported(flavor))) { notifyEvent(PrintJobEvent.JOB_FAILED); throw new PrintJobFlavorException("invalid flavor", flavor);
--- a/jdk/src/windows/native/java/lang/java_props_md.c Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/windows/native/java/lang/java_props_md.c Wed Jul 05 19:07:19 2017 +0200 @@ -443,6 +443,7 @@ case 0: sprops.os_name = "Windows Vista"; break; case 1: sprops.os_name = "Windows 7"; break; case 2: sprops.os_name = "Windows 8"; break; + case 3: sprops.os_name = "Windows 8.1"; break; default: sprops.os_name = "Windows NT (unknown)"; } } else { @@ -450,6 +451,7 @@ case 0: sprops.os_name = "Windows Server 2008"; break; case 1: sprops.os_name = "Windows Server 2008 R2"; break; case 2: sprops.os_name = "Windows Server 2012"; break; + case 3: sprops.os_name = "Windows Server 2012 R2"; break; default: sprops.os_name = "Windows NT (unknown)"; } }
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Jul 05 19:07:19 2017 +0200 @@ -3528,8 +3528,12 @@ if (ops == SAVE) { transTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)), reinterpret_cast<void*>(static_cast<INT_PTR>(translation))); - deadKeyFlagTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)), - reinterpret_cast<void*>(static_cast<INT_PTR>(deadKeyFlag))); + if (deadKeyFlag) { + deadKeyFlagTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)), + reinterpret_cast<void*>(static_cast<INT_PTR>(deadKeyFlag))); + } else { + deadKeyFlagTable.remove(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey))); + } } isDeadKey = deadKeyFlag;
--- a/jdk/src/windows/resource/java.manifest Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/src/windows/resource/java.manifest Wed Jul 05 19:07:19 2017 +0200 @@ -44,8 +44,14 @@ <!-- Indicate this JDK version is Windows 7 compatible --> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> + <!-- Windows Vista --> + <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> + <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> - <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> + <!-- Windows 8 --> + <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> + <!-- Windows 8.1 --> + <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> </application> </compatibility>
--- a/jdk/test/ProblemList.txt Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/ProblemList.txt Wed Jul 05 19:07:19 2017 +0200 @@ -138,6 +138,9 @@ java/lang/instrument/RedefineBigClass.sh linux-x64 java/lang/instrument/RetransformBigClass.sh linux-x64 +# 8021230 +java/lang/ThreadLocal/ThreadLocalSupplierTest.java generic-all + ############################################################################ @@ -367,9 +370,6 @@ # Filed 6772009 java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all -# 8020435 -java/util/concurrent/CompletableFuture/Basic.java generic-all - # 7041639, Solaris DSA keypair generation bug java/util/TimeZone/TimeZoneDatePermissionCheck.sh solaris-all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/com/apple/eawt/DefaultMenuBar/DefaultMenuBarTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -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 8007267 + * @summary [macosx] com.apple.eawt.Application.setDefaultMenuBar is not working + * @author leonid.romanov@oracle.com + * @run main DefaultMenuBarTest + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import sun.awt.*; +import java.lang.reflect.Method; + + +public class DefaultMenuBarTest { + static KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.META_MASK); + + static volatile int listenerCallCounter = 0; + public static void main(String[] args) throws Exception { + if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) { + System.out.println("This test is for MacOS only. Automatically passed on other platforms."); + return; + } + + System.setProperty("apple.laf.useScreenMenuBar", "true"); + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + createAndShowGUI(); + } + }); + + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Robot robot = new Robot(); + robot.setAutoDelay(100); + + robot.keyPress(KeyEvent.VK_META); + robot.keyPress(ks.getKeyCode()); + robot.keyRelease(ks.getKeyCode()); + robot.keyRelease(KeyEvent.VK_META); + + toolkit.realSync(); + + if (listenerCallCounter != 1) { + throw new Exception("Test failed: ActionListener either wasn't called or was called more than once"); + } + } + + private static void createAndShowGUI() { + JMenu menu = new JMenu("File"); + JMenuItem newItem = new JMenuItem("Open"); + + newItem.setAccelerator(ks); + newItem.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e) { + listenerCallCounter++; + } + } + ); + menu.add(newItem); + + JMenuBar defaultMenu = new JMenuBar(); + defaultMenu.add(menu); + + // Application.getApplication().setDefaultMenuBar(defaultMenu); + try { + Class appClass = Class.forName("com.apple.eawt.Application"); + if (appClass != null) { + Method method = appClass.getMethod("getApplication"); + if (method != null) { + Object app = method.invoke(null, new Object[]{}); + if (app != null) { + method = appClass.getMethod("setDefaultMenuBar", new Class[]{JMenuBar.class}); + if (method != null) { + method.invoke(app, new Object[]{defaultMenu}); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +}
--- a/jdk/test/java/awt/EventDispatchThread/LoopRobustness/LoopRobustness.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/awt/EventDispatchThread/LoopRobustness/LoopRobustness.java Wed Jul 05 19:07:19 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, 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 @@ -49,6 +49,8 @@ public static volatile boolean otherExceptionsCaught = false; public static void main(String [] args) throws Exception { + SunToolkit.createNewAppContext(); + ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup(); long at;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/event/KeyEvent/DeadKey/DeadKeySystemAssertionDialog.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,65 @@ +/* + * 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.awt.Frame; +import java.awt.Robot; +import java.awt.TextField; +import java.awt.Toolkit; +import java.awt.event.KeyEvent; +import sun.awt.SunToolkit; +/* + * @test + * @bug 8013849 + * @summary Awt assert on Hashtable.cpp:124 + * @author alexandr.scherbatiy area=awt.event + * @run main/timeout=5 DeadKeySystemAssertionDialog + */ + +public class DeadKeySystemAssertionDialog { + + public static void main(String[] args) throws Exception { + + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Frame frame = new Frame(); + frame.setSize(300, 200); + + TextField textField = new TextField(); + frame.add(textField); + + frame.setVisible(true); + toolkit.realSync(); + + textField.requestFocus(); + toolkit.realSync(); + + // Check that the system assertion dialog does not block Java + Robot robot = new Robot(); + robot.setAutoDelay(50); + robot.keyPress(KeyEvent.VK_A); + robot.keyRelease(KeyEvent.VK_A); + toolkit.realSync(); + + frame.setVisible(false); + frame.dispose(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/MacEncoding/ExpectedEncoding.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,66 @@ +/* + * 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. + */ + +/** + * Check that the value of file.encoding and sun.jnu.encoding match the expected + * values passed in on the command-line. + */ +public class ExpectedEncoding { + public static void main(String[] args) { + boolean failed = false; + if (args.length != 2) { + System.out.println("Usage:"); + System.out.println("$ java ExpectedEncoding <expected file.encoding> <expected sun.jnu.encoding>"); + System.out.println("$ use \"skip\" to skip checking property's value"); + System.exit(1); + } + String expectFileEnc = args[0]; + String expectSunJnuEnc = args[1]; + + String fileEnc = System.getProperty("file.encoding"); + String jnuEnc = System.getProperty("sun.jnu.encoding"); + + if ("skip".equals(expectFileEnc)) { + System.err.println("Expected file.encoding is \"skip\", ignoring"); + } else { + System.err.println("Expected file.encoding: " + expectFileEnc); + System.err.println("Actual file.encoding: " + fileEnc); + if (fileEnc == null || !fileEnc.equals(expectFileEnc)) { + failed = true; + } + } + if ("skip".equals(expectSunJnuEnc)) { + System.err.println("Expected sun.jnu.encoding is \"skip\", ignoring"); + } else { + if (jnuEnc == null || !jnuEnc.equals(expectSunJnuEnc)) { + System.err.println("Expected sun.jnu.encoding: " + expectSunJnuEnc); + System.err.println("Actual sun.jnu.encoding: " + jnuEnc); + failed = true; + } + } + + if (failed) { + throw new RuntimeException("Test Failed"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/MacEncoding/MacJNUEncoding.sh Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,101 @@ +#!/bin/sh + +# +# 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 8003228 +# @summary Test the value of sun.jnu.encoding on Mac +# @author Brent Christian +# +# @run shell MacJNUEncoding.sh + +# Only run test on Mac +OS=`uname -s` +case "$OS" in + Darwin ) ;; + * ) + exit 0 + ;; +esac + +if [ "${TESTJAVA}" = "" ] +then + echo "TESTJAVA not set. Test cannot execute. Failed." + exit 1 +fi + +if [ "${COMPILEJAVA}" = "" ]; then + COMPILEJAVA="${TESTJAVA}" +fi + + +if [ "${TESTSRC}" = "" ] +then + echo "TESTSRC not set. Test cannot execute. Failed." + exit 1 +fi + +if [ "${TESTCLASSES}" = "" ] +then + echo "TESTCLASSES not set. Test cannot execute. Failed." + exit 1 +fi + +JAVAC="${COMPILEJAVA}"/bin/javac +JAVA="${TESTJAVA}"/bin/java + +echo "Building test classes..." +"$JAVAC" ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d "${TESTCLASSES}" "${TESTSRC}"/ExpectedEncoding.java + +echo "" +echo "Running test for C locale" +export LANG=C +export LC_ALL=C +"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding US-ASCII UTF-8 +result1=$? + +echo "" +echo "Running test for en_US.UTF-8 locale" +export LANG=en_US.UTF-8 +export LC_ALL=en_US.UTF-8 +"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding UTF-8 UTF-8 +result2=$? + +echo "" +echo "Cleanup" +rm ${TESTCLASSES}/ExpectedEncoding.class + +if [ ${result1} -ne 0 ] ; then + echo "Test failed for C locale" + echo " LANG=\"${LANG}\"" + echo " LC_ALL=\"${LC_ALL}\"" + exit ${result1} +fi +if [ ${result2} -ne 0 ] ; then + echo "Test failed for en_US.UTF-8 locale" + echo " LANG=\"${LANG}\"" + echo " LC_ALL=\"${LC_ALL}\"" + exit ${result2} +fi +exit 0 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/MacEncoding/TestFileEncoding.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,168 @@ +/* + * 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. + */ + +import java.util.*; + +/* + * @test + * @bug 8011194 + * @summary Test value of file.encoding for corresponding value of LANG, etc + * @library ../../../../tools/launcher/ ../ + * @build TestHelper TestFileEncoding ExpectedEncoding + * @run main TestFileEncoding UTF-8 + * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding + * @run main TestFileEncoding UTF-8 en_US.UTF-8 + * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding en_US.UTF-8 + * @run main TestFileEncoding US-ASCII C + * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding C + * @author Brent Christian + */ + +/** + * Setup the environment and run a sub-test to check the expected value of + * file.encoding, based on the value(s) of encoding-related environment vars + * (LANG, LC_ALL, LC_CTYPE). + * + * The first argument (required) is the expected value of the + * file.encoding System property. + * The second argument (optional) is the value to set to the LANG/etc env vars. + */ +public class TestFileEncoding { + private static final String TEST_NAME = "ExpectedEncoding"; + + private String expectedEncoding; // Expected value for file.encoding + private String langVar = null; // Value to set for LANG, etc + + private static Set<String> envToRm = new HashSet<>(3); + static { + // Take these vars out of the test's run environment, possibly adding + // our own value back in. + envToRm.add("LANG"); + envToRm.add("LC_ALL"); + envToRm.add("LC_CTYPE"); + } + + public TestFileEncoding(String expectedEncoding) { + this.expectedEncoding = expectedEncoding; + } + + public TestFileEncoding(String expectedEncoding, String langVar) { + this.expectedEncoding = expectedEncoding; + this.langVar = langVar; + } + + /* + * Launch ExpectedEncoding with the given parameters, check for the + * expected file.encoding. + */ + private void run() { + String testClasses = System.getProperty("test.classes"); + + // Pick up VM opts + String vmOptsStr = System.getProperty("test.vm.opts"); + System.out.println("test.vm.opts: " + vmOptsStr); + String[] vmOpts = new String[0]; + if (vmOptsStr != null && !"".equals(vmOptsStr)) { + vmOpts = vmOptsStr.split(" "); + System.out.println("found vm options:"); + for (String opt : vmOpts) { + System.out.println(" <" + opt + ">"); + } + } + + // Build java cmd + LinkedList<String> cmdList = new LinkedList<>(); + cmdList.add(TestHelper.javaCmd); + for (String vmOpt : vmOpts) { + if (vmOpt != null && !vmOpt.equals("")) { + cmdList.add(vmOpt); + } + } + + // See if the user specified a file.encoding that we should pass through + String userEncoding = System.getProperty("userEncoding"); + if (userEncoding != null) { + cmdList.add("-Dfile.encoding="+userEncoding); + } + + cmdList.add("-cp"); + cmdList.add(testClasses); + cmdList.add(TEST_NAME); + cmdList.add(expectedEncoding); + cmdList.add("skip"); // ignore sun.jnu.encoding for this test + + String cmdArray[] = new String[cmdList.size()]; + cmdList.toArray(cmdArray); + + // Run the test(s) + if (langVar == null) { + System.out.println("TestFileEncoding: Running with no envvars set"); + TestHelper.TestResult tr = TestHelper.doExec(null, envToRm, + cmdArray); + checkResult(tr); + } else { + runWithEnvVar("LANG", cmdArray); + runWithEnvVar("LC_ALL", cmdArray); + runWithEnvVar("LC_CTYPE", cmdArray); + } + } + + /* + * Run the test, setting the environment named by envVarName to the value + * in langVar. + */ + private void runWithEnvVar(String envVarName, String[] cmdArray) { + Map<String, String> envToAdd = new HashMap<>(1); + TestHelper.TestResult tr = null; + + System.out.println("TestFileEncoding: Running with " + envVarName + "=" + langVar); + envToAdd.put(envVarName, langVar); + tr = TestHelper.doExec(envToAdd, envToRm, cmdArray); + checkResult(tr); + } + + private void checkResult(TestHelper.TestResult tr) { + System.out.println(tr); + if (!tr.isOK()) { + throw new RuntimeException("TEST FAILED: !tr.isOK()"); + } + } + + public static void main(String[] args) { + TestFileEncoding cfe = null; + if (!TestHelper.isMacOSX) { + System.out.println("Test is currently only for Mac OS X - pass."); + return; + } + if (args.length == 1) { + cfe = new TestFileEncoding(args[0]); + } else if (args.length == 2) { + cfe = new TestFileEncoding(args[0], args[1]); + } else { + System.out.println("Usage: TestFileEncoding <expected file.encoding>"); + System.out.println(" TestFileEncoding <expected file.encoding> <value for LANG/etc env var>"); + return; + } + cfe.run(); + } +}
--- a/jdk/test/java/lang/System/MacJNUEncoding/ExpectedEncoding.java Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +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. - */ - -/** - * Check that the value of file.encoding and sun.jnu.encoding match the expected - * values passed in on the command-line. - */ -public class ExpectedEncoding { - public static void main(String[] args) { - boolean failed = false; - if (args.length != 2) { - System.out.println("Usage:"); - System.out.println("$ java ExpectedEncoding <expected file.encoding> <expected sun.jnu.encoding>"); - System.exit(1); - } - String expectFileEnc = args[0]; - String expectSunJnuEnc = args[1]; - - String fileEnc = System.getProperty("file.encoding"); - String jnuEnc = System.getProperty("sun.jnu.encoding"); - - if (fileEnc == null || !fileEnc.equals(expectFileEnc)) { - System.err.println("Expected file.encoding: " + expectFileEnc); - System.err.println("Actual file.encoding: " + fileEnc); - failed = true; - } - if (jnuEnc == null || !jnuEnc.equals(expectSunJnuEnc)) { - System.err.println("Expected sun.jnu.encoding: " + expectSunJnuEnc); - System.err.println("Actual sun.jnu.encoding: " + jnuEnc); - failed = true; - } - if (failed) { - throw new RuntimeException("Test Failed"); - } - } -}
--- a/jdk/test/java/lang/System/MacJNUEncoding/MacJNUEncoding.sh Thu Aug 08 10:10:37 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -#!/bin/sh - -# -# 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 8003228 -# @summary Test the value of sun.jnu.encoding on Mac -# @author Brent Christian -# -# @run shell MacJNUEncoding.sh - -# Only run test on Mac -OS=`uname -s` -case "$OS" in - Darwin ) ;; - * ) - exit 0 - ;; -esac - -if [ "${TESTJAVA}" = "" ] -then - echo "TESTJAVA not set. Test cannot execute. Failed." - exit 1 -fi - -if [ "${COMPILEJAVA}" = "" ]; then - COMPILEJAVA="${TESTJAVA}" -fi - - -if [ "${TESTSRC}" = "" ] -then - echo "TESTSRC not set. Test cannot execute. Failed." - exit 1 -fi - -if [ "${TESTCLASSES}" = "" ] -then - echo "TESTCLASSES not set. Test cannot execute. Failed." - exit 1 -fi - -JAVAC="${COMPILEJAVA}"/bin/javac -JAVA="${TESTJAVA}"/bin/java - -echo "Building test classes..." -"$JAVAC" ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d "${TESTCLASSES}" "${TESTSRC}"/ExpectedEncoding.java - -echo "" -echo "Running test for C locale" -export LANG=C -export LC_ALL=C -"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding US-ASCII UTF-8 -result1=$? - -echo "" -echo "Running test for en_US.UTF-8 locale" -export LANG=en_US.UTF-8 -export LC_ALL=en_US.UTF-8 -"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding UTF-8 UTF-8 -result2=$? - -echo "" -echo "Cleanup" -rm ${TESTCLASSES}/ExpectedEncoding.class - -if [ ${result1} -ne 0 ] ; then - echo "Test failed for C locale" - echo " LANG=\"${LANG}\"" - echo " LC_ALL=\"${LC_ALL}\"" - exit ${result1} -fi -if [ ${result2} -ne 0 ] ; then - echo "Test failed for en_US.UTF-8 locale" - echo " LANG=\"${LANG}\"" - echo " LC_ALL=\"${LC_ALL}\"" - exit ${result2} -fi -exit 0 -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/DefaultStaticTest/DefaultStaticInvokeTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,307 @@ +/* + * 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 + * @summary Test locating and invoking default/static method that defined + * in interfaces and/or in inheritance + * @bug 7184826 + * @build helper.Mod helper.Declared DefaultStaticTestData + * @run testng DefaultStaticInvokeTest + * @author Yong Lu + */ + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotNull; +import org.testng.annotations.Test; + +import static helper.Mod.*; +import static helper.Declared.*; +import helper.Mod; + +public class DefaultStaticInvokeTest { + + @Test(dataProvider = "testCasesAll", + dataProviderClass = DefaultStaticTestData.class) + public void testGetMethods(String testTarget, Object param) + throws Exception { + // test the methods retrieved by getMethods() + testMethods(ALL_METHODS, testTarget, param); + } + + @Test(dataProvider = "testCasesAll", + dataProviderClass = DefaultStaticTestData.class) + public void testGetDeclaredMethods(String testTarget, Object param) + throws Exception { + // test the methods retrieved by getDeclaredMethods() + testMethods(DECLARED_ONLY, testTarget, param); + } + + @Test(dataProvider = "testCasesAll", + dataProviderClass = DefaultStaticTestData.class) + public void testMethodInvoke(String testTarget, Object param) + throws Exception { + Class<?> typeUnderTest = Class.forName(testTarget); + MethodDesc[] expectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class); + + // test the method retrieved by Class.getMethod(String, Object[]) + for (MethodDesc toTest : expectedMethods) { + String name = toTest.name(); + Method m = getTestMethod(typeUnderTest, name, param); + testThisMethod(toTest, m, typeUnderTest, param); + } + } + + @Test(dataProvider = "testCasesAll", + dataProviderClass = DefaultStaticTestData.class) + public void testMethodHandleInvoke(String testTarget, Object param) + throws Throwable { + Class<?> typeUnderTest = Class.forName(testTarget); + MethodDesc[] expectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class); + + for (MethodDesc toTest : expectedMethods) { + String mName = toTest.name(); + Mod mod = toTest.mod(); + if (mod != STATIC && typeUnderTest.isInterface()) { + return; + } + + String result = null; + String expectedReturn = toTest.retval(); + + MethodHandle methodHandle = getTestMH(typeUnderTest, mName, param); + if (mName.equals("staticMethod")) { + result = (param == null) + ? (String) methodHandle.invoke() + : (String) methodHandle.invoke(param); + } else { + result = (param == null) + ? (String) methodHandle.invoke(typeUnderTest.newInstance()) + : (String) methodHandle.invoke(typeUnderTest.newInstance(), param); + } + + assertEquals(result, expectedReturn); + } + + } + + @Test(dataProvider = "testClasses", + dataProviderClass = DefaultStaticTestData.class) + public void testIAE(String testTarget, Object param) + throws ClassNotFoundException { + + Class<?> typeUnderTest = Class.forName(testTarget); + MethodDesc[] expectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class); + + for (MethodDesc toTest : expectedMethods) { + String mName = toTest.name(); + Mod mod = toTest.mod(); + if (mod != STATIC && typeUnderTest.isInterface()) { + return; + } + Exception caught = null; + try { + getTestMH(typeUnderTest, mName, param, true); + } catch (Exception e) { + caught = e; + } + assertTrue(caught != null); + assertEquals(caught.getClass(), IllegalAccessException.class); + } + } + private static final String[] OBJECT_METHOD_NAMES = { + "equals", + "hashCode", + "getClass", + "notify", + "notifyAll", + "toString", + "wait", + "wait", + "wait",}; + private static final String LAMBDA_METHOD_NAMES = "lambda$"; + private static final HashSet<String> OBJECT_NAMES = new HashSet<>(Arrays.asList(OBJECT_METHOD_NAMES)); + private static final boolean DECLARED_ONLY = true; + private static final boolean ALL_METHODS = false; + + private void testMethods(boolean declaredOnly, String testTarget, Object param) + throws Exception { + Class<?> typeUnderTest = Class.forName(testTarget); + Method[] methods = declaredOnly + ? typeUnderTest.getDeclaredMethods() + : typeUnderTest.getMethods(); + + MethodDesc[] baseExpectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class); + MethodDesc[] expectedMethods; + + // If only declared filter out non-declared from expected result + if (declaredOnly) { + int nonDeclared = 0; + for (MethodDesc desc : baseExpectedMethods) { + if (desc.declared() == NO) { + nonDeclared++; + } + } + expectedMethods = new MethodDesc[baseExpectedMethods.length - nonDeclared]; + int i = 0; + for (MethodDesc desc : baseExpectedMethods) { + if (desc.declared() == YES) { + expectedMethods[i++] = desc; + } + } + } else { + expectedMethods = baseExpectedMethods; + } + + HashMap<String, Method> myMethods = new HashMap<>(methods.length); + for (Method m : methods) { + String mName = m.getName(); + // don't add Object methods and method created from lambda expression + if ((!OBJECT_NAMES.contains(mName)) && (!mName.contains(LAMBDA_METHOD_NAMES))) { + myMethods.put(mName, m); + } + } + assertEquals(expectedMethods.length, myMethods.size()); + + for (MethodDesc toTest : expectedMethods) { + + String name = toTest.name(); + Method candidate = myMethods.get(name); + + assertNotNull(candidate); + myMethods.remove(name); + + testThisMethod(toTest, candidate, typeUnderTest, param); + + } + + // Should be no methods left since we remove all we expect to see + assertTrue(myMethods.isEmpty()); + } + + private void testThisMethod(MethodDesc toTest, Method method, + Class<?> typeUnderTest, Object param) throws Exception { + // Test modifiers, and invoke + Mod mod = toTest.mod(); + String expectedReturn = toTest.retval(); + switch (mod) { + case STATIC: + //assert candidate is static + assertTrue(Modifier.isStatic(method.getModifiers())); + assertFalse(method.isDefault()); + + // Test invoke it + assertEquals(tryInvoke(method, null, param), expectedReturn); + break; + case DEFAULT: + // if typeUnderTest is a class then instantiate and invoke + if (!typeUnderTest.isInterface()) { + assertEquals(tryInvoke( + method, + typeUnderTest, + param), + expectedReturn); + } + + //assert candidate is default + assertFalse(Modifier.isStatic(method.getModifiers())); + assertTrue(method.isDefault()); + break; + case REGULAR: + // if typeUnderTest must be a class + assertEquals(tryInvoke( + method, + typeUnderTest, + param), + expectedReturn); + + //assert candidate is neither default nor static + assertFalse(Modifier.isStatic(method.getModifiers())); + assertFalse(method.isDefault()); + break; + case ABSTRACT: + //assert candidate is neither default nor static + assertFalse(Modifier.isStatic(method.getModifiers())); + assertFalse(method.isDefault()); + break; + default: + assertFalse(true); //this should never happen + break; + } + + } + + private Object tryInvoke(Method m, Class<?> receiverType, Object param) + throws Exception { + Object receiver = receiverType == null ? null : receiverType.newInstance(); + Object result = null; + if (param == null) { + result = m.invoke(receiver); + } else { + result = m.invoke(receiver, param); + } + return result; + } + + private Method getTestMethod(Class clazz, String methodName, Object param) + throws NoSuchMethodException { + Class[] paramsType = (param != null) + ? new Class[]{Object.class} + : new Class[]{}; + return clazz.getMethod(methodName, paramsType); + } + + private MethodHandle getTestMH(Class clazz, String methodName, Object param) + throws Exception { + return getTestMH(clazz, methodName, param, false); + } + + private MethodHandle getTestMH(Class clazz, String methodName, + Object param, boolean isNegativeTest) + throws Exception { + MethodType mType = (param != null) + ? MethodType.genericMethodType(1) + : MethodType.methodType(String.class); + MethodHandles.Lookup lookup = MethodHandles.lookup(); + if (!isNegativeTest) { + return methodName.equals("staticMethod") + ? lookup.findStatic(clazz, methodName, mType) + : lookup.findVirtual(clazz, methodName, mType); + } else { + return methodName.equals("staticMethod") + ? lookup.findVirtual(clazz, methodName, mType) + : lookup.findStatic(clazz, methodName, mType); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/DefaultStaticTest/DefaultStaticTestData.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,401 @@ +/* + * 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 Data used for testing default/static method + * + * @author Yong Lu + */ + +import java.util.Arrays; +import java.util.List; + +import org.testng.annotations.DataProvider; +import org.testng.collections.Lists; + +import static helper.Mod.*; +import static helper.Declared.*; +import helper.Mod; +import helper.Declared; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = YES) +interface TestIF1 { + + default String defaultMethod() { + return "TestIF1.defaultMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass1 implements TestIF1 { +} + +@MethodDesc(name = "staticMethod", retval = "TestIF2.staticMethod", mod = STATIC, declared = YES) +interface TestIF2 { + + static String staticMethod() { + return "TestIF2.staticMethod"; + } +} + +@MethodDesc(name = "method", retval = "TestIF2.staticMethod", mod = REGULAR, declared = YES) +class TestClass2 implements TestIF2 { + + public String method() { + return TestIF2.staticMethod(); + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF3.defaultMethod", mod = DEFAULT, declared = YES) +@MethodDesc(name = "method", retval = "", mod = ABSTRACT, declared = YES) +interface TestIF3 { + + String method(); + + default String defaultMethod() { + return "TestIF3.defaultMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF3.defaultMethod", mod = DEFAULT, declared = NO) +@MethodDesc(name = "method", retval = "TestClass3.method", mod = REGULAR, declared = YES) +class TestClass3 implements TestIF3 { + + public String method() { + return "TestClass3.method"; + } +} + +@MethodDesc(name = "staticMethod", retval = "TestIF4.staticMethod", mod = STATIC, declared = YES) +@MethodDesc(name = "method", retval = "", mod = ABSTRACT, declared = YES) +interface TestIF4 { + + String method(); + + static String staticMethod() { + return "TestIF4.staticMethod"; + } +} + +@MethodDesc(name = "method", retval = "TestClass4.method", mod = REGULAR, declared = YES) +class TestClass4 implements TestIF4 { + + public String method() { + return "TestClass4.method"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF5.defaultMethod", mod = DEFAULT, declared = YES) +@MethodDesc(name = "staticMethod", retval = "TestIF5.staticMethod", mod = STATIC, declared = YES) +interface TestIF5 { + + default String defaultMethod() { + return "TestIF5.defaultMethod"; + } + + static String staticMethod() { + return "TestIF5.staticMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF5.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass5 implements TestIF5 { +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF6.defaultMethod", mod = DEFAULT, declared = YES) +@MethodDesc(name = "staticMethod", retval = "TestIF6.staticMethod", mod = STATIC, declared = YES) +@MethodDesc(name = "method", retval = "", mod = ABSTRACT, declared = YES) +interface TestIF6 { + + String method(); + + default String defaultMethod() { + return "TestIF6.defaultMethod"; + } + + static String staticMethod() { + return "TestIF6.staticMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF6.defaultMethod", mod = DEFAULT, declared = NO) +@MethodDesc(name = "method", retval = "TestClass6.method", mod = REGULAR, declared = YES) +class TestClass6 implements TestIF6 { + + public String method() { + return "TestClass6.method"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF7.TestClass7", mod = DEFAULT, declared = YES) +interface TestIF7<T> { + + default T defaultMethod(T t) { + return t; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF7.TestClass7", mod = DEFAULT, declared = NO) +class TestClass7<T> implements TestIF7<T> { +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF8.TestClass8", mod = DEFAULT, declared = YES) +interface TestIF8<E> { + + default <E> E defaultMethod(E e) { + return e; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF8.TestClass8", mod = DEFAULT, declared = NO) +class TestClass8<T> implements TestIF8<T> { +}; + +@MethodDesc(name = "defaultMethod", retval = "TestIF9.defaultMethod", mod = DEFAULT, declared = YES) +interface TestIF9 extends TestIF1 { + + default String defaultMethod() { + return "TestIF9.defaultMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF9.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass9 implements TestIF9 { +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF9.defaultMethod", mod = DEFAULT, declared = NO) +@MethodDesc(name = "method", retval = "TestIF9.defaultMethod", mod = REGULAR, declared = YES) +class TestClass91 implements TestIF9, TestIF1 { + + public String method() { + return defaultMethod(); + } +} + +@MethodDesc(name = "staticMethod", retval = "TestIF10.staticMethod", mod = STATIC, declared = YES) +interface TestIF10 extends TestIF2 { + + static String staticMethod() { + + return "TestIF10.staticMethod"; + } +} + +@MethodDesc(name = "staticMethod", retval = "TestIF11.staticMethod", mod = STATIC, declared = YES) +@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO) +interface TestIF11 extends TestIF1 { + + static String staticMethod() { + return "TestIF11.staticMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass11 implements TestIF11 { +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF12.defaultMethod", mod = DEFAULT, declared = YES) +@MethodDesc(name = "staticMethod", retval = "TestIF2.staticMethod", mod = STATIC, declared = NO) +interface TestIF12 extends TestIF2 { + + default String defaultMethod() { + return "TestIF12.defaultMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF12.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass12 implements TestIF12 { +} + +//Diamond Case +@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO) +interface TestIF1A extends TestIF1 { +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO) +interface TestIF1B extends TestIF1 { +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass13 implements TestIF1A, TestIF1B { +} + +//Diamond Override Case +@MethodDesc(name = "defaultMethod", retval = "TestIF1C.defaultMethod", mod = DEFAULT, declared = YES) +interface TestIF1C extends TestIF1 { + + default String defaultMethod() { + return "TestIF1C.defaultMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF1D.defaultMethod", mod = DEFAULT, declared = YES) +interface TestIF1D extends TestIF1 { + + default String defaultMethod() { + return "TestIF1D.defaultMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestClass14.defaultMethod", mod = REGULAR, declared = YES) +class TestClass14 implements TestIF1C, TestIF1D { + + public String defaultMethod() { + return "TestClass14.defaultMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "", mod = ABSTRACT, declared = YES) +interface TestIF15 extends TestIF1 { + + String defaultMethod(); +} + +@MethodDesc(name = "defaultMethod", retval = "TestClass15.defaultMethod", mod = REGULAR, declared = YES) +class TestClass15 implements TestIF15 { + + public String defaultMethod() { + return "TestClass15.defaultMethod"; + } +} + +interface FuncInterface<T> { + + String test(T t); +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF16.defaultMethod", mod = DEFAULT, declared = YES) +interface TestIF16 { + + default String defaultMethod() { + FuncInterface<Object> fi = o -> o.toString(); + Object o = "TestIF16.defaultMethod"; + return fi.test(o); + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF16.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass16 implements TestIF16 { +}; + +@MethodDesc(name = "defaultMethod", retval = "TestIF17.defaultMethod", mod = DEFAULT, declared = YES) +@MethodDesc(name = "staticMethod", retval = "TestIF17.staticMethod", mod = STATIC, declared = YES) +interface TestIF17 { + + default String defaultMethod() { + return staticMethod().replace("staticMethod", "defaultMethod"); + } + + public static String staticMethod() { + return "TestIF17.staticMethod"; + } +} + +@MethodDesc(name = "defaultMethod", retval = "TestIF17.defaultMethod", mod = DEFAULT, declared = NO) +class TestClass17 implements TestIF17 { +} + +@Retention(RetentionPolicy.RUNTIME) +@Repeatable(MethodDescs.class) +@interface MethodDesc { + String name(); + String retval(); + Mod mod(); + Declared declared(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface MethodDescs { + MethodDesc[] value(); +} + +public class DefaultStaticTestData { + + /** + * Test data for DefaultStaticInvokeTest The format of inner array is: First + * data is the name of the class under test Second data used in test as the + * arguments used for the method call. + */ + @DataProvider + static Object[][] testClasses() { + return new Object[][]{ + {"TestClass1", null}, + //{"TestClass2", null}, @ignore due to JDK-8009411 + {"TestClass3", null}, + //{"TestClass4", null}, @ignore due to JDK-8009411 + //{"TestClass5", null}, @ignore due to JDK-8009411 + //{"TestClass6", null}, @ignore due to JDK-8009411 + {"TestClass7", "TestIF7.TestClass7"}, + {"TestClass8", "TestIF8.TestClass8"}, + {"TestClass9", null}, + {"TestClass91", null}, + //{"TestClass11", null}, @ignore due to JDK-8009411 + //{"TestClass12", null}, @ignore due to JDK-8009411 + {"TestClass13", null}, + {"TestClass14", null}, + {"TestClass15", null}, + {"TestClass16", null} + //{"TestClass17", null} @ignore due to JDK-8009411 + }; + } + + /** + * Test data for DefaultStaticInvokeTest The format of inner array is: First + * data is the name of the interface under test Second data used in test as + * the arguments used for the method call. + */ + @DataProvider + static Object[][] testInterfaces() { + return new Object[][]{ + {"TestIF1", null}, + {"TestIF2", null}, + {"TestIF3", null}, + {"TestIF4", null}, + {"TestIF5", null}, + {"TestIF6", null}, + {"TestIF7", "TestIF7.TestClass7"}, + {"TestIF8", "TestIF8.TestClass8"}, + {"TestIF9", null}, + {"TestIF10", null}, + {"TestIF11", null}, + {"TestIF12", null}, + {"TestIF1A", null}, + {"TestIF1B", null}, + {"TestIF1C", null}, + {"TestIF1D", null}, + {"TestIF15", null}, + {"TestIF16", null}, + {"TestIF17", null},}; + } + + @DataProvider + static Object[][] testCasesAll() { + List<Object[]> result = Lists.newArrayList(); + result.addAll(Arrays.asList(testClasses())); + result.addAll(Arrays.asList(testInterfaces())); + return result.toArray(new Object[result.size()][]); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/DefaultStaticTest/helper/Declared.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,35 @@ +/* + * 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. + */ + +/* + * Helper class used for testing default/static method + * + * @author Yong Lu + */ + +package helper; + +public enum Declared { + YES, + NO +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/DefaultStaticTest/helper/Mod.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* + * Helper class used for testing default/static method + * + * @author Yong Lu + */ + +package helper; + +public enum Mod { + DEFAULT, + STATIC, + REGULAR, + ABSTRACT +}
--- a/jdk/test/java/lang/reflect/Method/DefaultMethodModeling.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/lang/reflect/Method/DefaultMethodModeling.java Wed Jul 05 19:07:19 2017 +0200 @@ -43,7 +43,7 @@ SuperIwithDefault.class, SuperIwithDefaultChild.class, Base.class, Combo1.class, Combo2.class, SonSuperIwithDefault.class, DaughterSuperIwithDefault.class, GrandchildSuperIwithDefault.class, D.class, - B.class, C.class + B.class, C.class, B1.class, D1.class }; for(Class<?> clazz : classes) { @@ -202,6 +202,17 @@ public void quux(){} } +class D1 implements SonSuperIwithDefault, DaughterSuperIwithDefault { + @ExpectedModel(declaringClass=D1.class) + public void foo(){} + + @ExpectedModel(declaringClass=D1.class) + public void baz(){} + + @ExpectedModel(declaringClass=D1.class) + public void quux(){} +} + // -=-=-=- // What does re-abstraction look like? @@ -222,3 +233,21 @@ @ExpectedModel(declaringClass=C.class) public void bar(){} } + +abstract class A1 implements SonSuperIwithDefault { + @ExpectedModel(modifiers=PUBLIC|ABSTRACT, declaringClass=A1.class) + public abstract void baz(); + + @ExpectedModel(modifiers=PUBLIC|ABSTRACT, declaringClass=A1.class) + public abstract void foo(); +} + +class B1 extends A1 { + @ExpectedModel(declaringClass=B1.class) + @Override + public void foo(){;} + + @ExpectedModel(declaringClass=B1.class) + @Override + public void baz(){} +}
--- a/jdk/test/java/lang/reflect/Method/IsDefaultTest.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/lang/reflect/Method/IsDefaultTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -42,6 +42,12 @@ classList.add(TestType2.class); classList.add(TestType3.class); classList.add(TestType4.class); + classList.add(TestType2.nestedTestType2.class); + classList.add(TestType5.class); + classList.add(TestType5.nestedTestType5.class); + classList.add(TestType6.class); + classList.add(TestType6.nestedTestType6.class); + classList.add(TestType7.class); for(Class<?> clazz: classList) { for(Method method: clazz.getDeclaredMethods()) { @@ -78,11 +84,22 @@ @ExpectedIsDefault(true) default void bar() {}; // Default method + + @ExpectedIsDefault(true) + default void bar(int i) {}; // Default method + + @ExpectedIsDefault(true) + default void bar(String i) {}; // Default method } class TestType2 { @ExpectedIsDefault(false) void bar() {}; + + interface nestedTestType2 { + @ExpectedIsDefault(true) + default void nestedBar() {}; + } } class TestType3 implements TestType1 { @@ -92,6 +109,10 @@ @ExpectedIsDefault(false) @Override public void bar() {}; + + @ExpectedIsDefault(false) + @Override + public void bar(int i) {}; } @interface TestType4 { @@ -102,6 +123,51 @@ String anotherValue() default ""; } +interface TestType5 { + @ExpectedIsDefault(false) + abstract void aFoo(); + + @ExpectedIsDefault(false) + static void sFoo() {}; + + @ExpectedIsDefault(true) + public default void pBar() {}; + + @ExpectedIsDefault(true) + public default String sBar() {return "";}; + + interface nestedTestType5{ + @ExpectedIsDefault(false) + void nestedFoo(); + + @ExpectedIsDefault(true) + default void nestedBar() {}; + } +} + +class TestType6{ + interface nestedTestType6 { + @ExpectedIsDefault(true) + default void nestedBar() {}; + + @ExpectedIsDefault(false) + void nestedFoo(); + } + + @ExpectedIsDefault(false) + void foo(nestedTestType6 n) {} +} + +class TestType7 implements TestType6.nestedTestType6 { + + @ExpectedIsDefault(false) + public void nestedFoo() {} + + @ExpectedIsDefault(false) + @Override + public void nestedBar() {}; +} + @Retention(RetentionPolicy.RUNTIME) @interface ExpectedIsDefault { boolean value();
--- a/jdk/test/java/math/BigDecimal/CompareToTests.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/math/BigDecimal/CompareToTests.java Wed Jul 05 19:07:19 2017 +0200 @@ -53,12 +53,29 @@ {valueOf(5,-1), valueOf(2), ONE}, // Boundary and near boundary values - {valueOf(Long.MAX_VALUE), valueOf(Long.MAX_VALUE), ZERO}, - {valueOf(Long.MAX_VALUE-1), valueOf(Long.MAX_VALUE), MINUS_ONE}, - {valueOf(Long.MIN_VALUE), valueOf(Long.MAX_VALUE), MINUS_ONE}, - {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), MINUS_ONE}, - {valueOf(Long.MIN_VALUE), valueOf(Long.MIN_VALUE), ZERO}, - {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), ONE}, + {valueOf(Long.MAX_VALUE), valueOf(Long.MAX_VALUE), ZERO}, + {valueOf(Long.MAX_VALUE).negate(), valueOf(Long.MAX_VALUE), MINUS_ONE}, + + {valueOf(Long.MAX_VALUE-1), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MAX_VALUE), MINUS_ONE}, + + {valueOf(Long.MIN_VALUE), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MIN_VALUE).negate(), valueOf(Long.MAX_VALUE), ONE}, + + {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MAX_VALUE), ZERO}, + + {valueOf(Long.MAX_VALUE), valueOf(Long.MIN_VALUE), ONE}, + {valueOf(Long.MAX_VALUE).negate(), valueOf(Long.MIN_VALUE), ONE}, + + {valueOf(Long.MAX_VALUE-1), valueOf(Long.MIN_VALUE), ONE}, + {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MIN_VALUE), ONE}, + + {valueOf(Long.MIN_VALUE), valueOf(Long.MIN_VALUE), ZERO}, + {valueOf(Long.MIN_VALUE).negate(), valueOf(Long.MIN_VALUE), ONE}, + + {valueOf(Long.MIN_VALUE+1), valueOf(Long.MIN_VALUE), ONE}, + {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MIN_VALUE), ONE}, }; for (BigDecimal[] testCase : testCases) { @@ -69,8 +86,6 @@ int expected = testCase[2].intValue(); failures += compareToTest(a, b, expected); - failures += compareToTest(a_negate, b, -1); - failures += compareToTest(a, b_negate, 1); failures += compareToTest(a_negate, b_negate, -expected); } @@ -81,11 +96,11 @@ private static int compareToTest(BigDecimal a, BigDecimal b, int expected) { int result = a.compareTo(b); int failed = (result==expected) ? 0 : 1; - if (result == 1) { + if (failed == 1) { System.err.println("(" + a + ").compareTo(" + b + ") => " + result + "\n\tExpected " + expected); } - return result; + return failed; } public static void main(String argv[]) {
--- a/jdk/test/java/math/BigInteger/CompareToTests.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/math/BigInteger/CompareToTests.java Wed Jul 05 19:07:19 2017 +0200 @@ -24,20 +24,23 @@ /* * @test * @bug 6473768 - * @summary Tests of BigDecimal.compareTo + * @summary Tests of BigInteger.compareTo * @author Joseph D. Darcy */ import java.math.*; -import static java.math.BigDecimal.*; +import static java.math.BigInteger.*; public class CompareToTests { private static int compareToTests() { int failures = 0; - final BigDecimal MINUS_ONE = BigDecimal.ONE.negate(); + final BigInteger MINUS_ONE = BigInteger.ONE.negate(); + final BigInteger TWO_POW_126 = ONE.shiftLeft(126); + final BigInteger TWO_POW_127 = ONE.shiftLeft(127); + final BigInteger TWO_POW_128 = ONE.shiftLeft(128); // First operand, second operand, expected compareTo result - BigDecimal [][] testCases = { + BigInteger [][] testCases = { // Basics {valueOf(0), valueOf(0), ZERO}, {valueOf(0), valueOf(1), MINUS_ONE}, @@ -45,32 +48,56 @@ {valueOf(2), valueOf(1), ONE}, {valueOf(10), valueOf(10), ZERO}, - // Significands would compare differently than scaled value - {valueOf(2,1), valueOf(2), MINUS_ONE}, - {valueOf(2,-1), valueOf(2), ONE}, - {valueOf(1,1), valueOf(2), MINUS_ONE}, - {valueOf(1,-1), valueOf(2), ONE}, - {valueOf(5,-1), valueOf(2), ONE}, + // Various relative lengths of internal mag array. + {TWO_POW_127, TWO_POW_127, ZERO}, + {TWO_POW_127.negate(), TWO_POW_127, MINUS_ONE}, + + {TWO_POW_128.or(TWO_POW_126), TWO_POW_128, ONE}, + {TWO_POW_128.or(TWO_POW_126), TWO_POW_128.negate(), ONE}, + + {TWO_POW_128, TWO_POW_128.or(TWO_POW_126), MINUS_ONE}, + {TWO_POW_128.negate(), TWO_POW_128.or(TWO_POW_126), MINUS_ONE}, + + {TWO_POW_127, TWO_POW_128, MINUS_ONE}, + {TWO_POW_127.negate(), TWO_POW_128, MINUS_ONE}, + + {TWO_POW_128, TWO_POW_127, ONE}, + {TWO_POW_128.negate(), TWO_POW_127, MINUS_ONE}, + + // Long boundary and near boundary values + {valueOf(Long.MAX_VALUE), valueOf(Long.MAX_VALUE), ZERO}, + {valueOf(Long.MAX_VALUE).negate(), valueOf(Long.MAX_VALUE), MINUS_ONE}, - // Boundary and near boundary values - {valueOf(Long.MAX_VALUE), valueOf(Long.MAX_VALUE), ZERO}, - {valueOf(Long.MAX_VALUE-1), valueOf(Long.MAX_VALUE), MINUS_ONE}, - {valueOf(Long.MIN_VALUE), valueOf(Long.MAX_VALUE), MINUS_ONE}, - {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), MINUS_ONE}, - {valueOf(Long.MIN_VALUE), valueOf(Long.MIN_VALUE), ZERO}, - {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), ONE}, + {valueOf(Long.MAX_VALUE-1), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MAX_VALUE), MINUS_ONE}, + + {valueOf(Long.MIN_VALUE), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MIN_VALUE).negate(), valueOf(Long.MAX_VALUE), ONE}, + + {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MAX_VALUE), ZERO}, + + {valueOf(Long.MAX_VALUE), valueOf(Long.MIN_VALUE), ONE}, + {valueOf(Long.MAX_VALUE).negate(), valueOf(Long.MIN_VALUE), ONE}, + + {valueOf(Long.MAX_VALUE-1), valueOf(Long.MIN_VALUE), ONE}, + {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MIN_VALUE), ONE}, + + {valueOf(Long.MIN_VALUE), valueOf(Long.MIN_VALUE), ZERO}, + {valueOf(Long.MIN_VALUE).negate(), valueOf(Long.MIN_VALUE), ONE}, + + {valueOf(Long.MIN_VALUE+1), valueOf(Long.MIN_VALUE), ONE}, + {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MIN_VALUE), ONE}, }; - for (BigDecimal[] testCase : testCases) { - BigDecimal a = testCase[0]; - BigDecimal a_negate = a.negate(); - BigDecimal b = testCase[1]; - BigDecimal b_negate = b.negate(); + for (BigInteger[] testCase : testCases) { + BigInteger a = testCase[0]; + BigInteger a_negate = a.negate(); + BigInteger b = testCase[1]; + BigInteger b_negate = b.negate(); int expected = testCase[2].intValue(); failures += compareToTest(a, b, expected); - failures += compareToTest(a_negate, b, -1); - failures += compareToTest(a, b_negate, 1); failures += compareToTest(a_negate, b_negate, -expected); } @@ -78,14 +105,14 @@ return failures; } - private static int compareToTest(BigDecimal a, BigDecimal b, int expected) { + private static int compareToTest(BigInteger a, BigInteger b, int expected) { int result = a.compareTo(b); int failed = (result==expected) ? 0 : 1; - if (result == 1) { + if (failed == 1) { System.err.println("(" + a + ").compareTo(" + b + ") => " + result + "\n\tExpected " + expected); } - return result; + return failed; } public static void main(String argv[]) {
--- a/jdk/test/java/net/NetworkInterface/IndexTest.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/net/NetworkInterface/IndexTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -27,7 +27,10 @@ */ import java.net.*; +import java.util.Arrays; +import java.util.Collections; import java.util.Enumeration; +import static java.lang.System.out; public class IndexTest { public static void main(String[] args) throws Exception { @@ -39,12 +42,17 @@ if (index >= 0) { NetworkInterface nif2 = NetworkInterface.getByIndex(index); if (! nif.equals(nif2)) { + out.printf("%nExpected interfaces to be the same, but got:%n"); + displayInterfaceInformation(nif); + displayInterfaceInformation(nif2); throw new RuntimeException("both interfaces should be equal"); } } } try { nif = NetworkInterface.getByIndex(-1); + out.printf("%ngetByIndex(-1) should have thrown, but instead returned:%n"); + displayInterfaceInformation(nif); throw new RuntimeException("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException e) { // OK @@ -52,7 +60,29 @@ // In all likelyhood, this interface should not exist. nif = NetworkInterface.getByIndex(Integer.MAX_VALUE - 1); if (nif != null) { + out.printf("%ngetByIndex(MAX_VALUE - 1), expected null, got:%n"); + displayInterfaceInformation(nif); throw new RuntimeException("getByIndex() should have returned null"); } } + + static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { + out.printf("Display name: %s%n", netint.getDisplayName()); + out.printf("Name: %s%n", netint.getName()); + Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); + + for (InetAddress inetAddress : Collections.list(inetAddresses)) + out.printf("InetAddress: %s%n", inetAddress); + + out.printf("Up? %s%n", netint.isUp()); + out.printf("Loopback? %s%n", netint.isLoopback()); + out.printf("PointToPoint? %s%n", netint.isPointToPoint()); + out.printf("Supports multicast? %s%n", netint.supportsMulticast()); + out.printf("Virtual? %s%n", netint.isVirtual()); + out.printf("Hardware address: %s%n", + Arrays.toString(netint.getHardwareAddress())); + out.printf("MTU: %s%n", netint.getMTU()); + out.printf("Index: %s%n", netint.getIndex()); + out.printf("%n"); + } }
--- a/jdk/test/java/nio/file/Files/BytesAndLines.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/nio/file/Files/BytesAndLines.java Wed Jul 05 19:07:19 2017 +0200 @@ -22,7 +22,7 @@ */ /* @test - * @bug 7006126 + * @bug 7006126 8020669 * @summary Unit test for methods for Files readAllBytes, readAllLines and * and write methods. */ @@ -82,6 +82,16 @@ write(file, lines, Charset.defaultCharset(), opts); throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } + + // read from procfs + if (System.getProperty("os.name").equals("Linux")) { + // Refer to the Linux proc(5) man page for details about /proc/self/stat file + // procfs reports it to be zero sized, even though data can be read from it + String statFile = "/proc/self/stat"; + Path pathStat = Paths.get(statFile); + byte[] data = Files.readAllBytes(pathStat); + assertTrue(data.length > 0, "Files.readAllBytes('" + statFile + "') failed to read"); + } } @@ -174,6 +184,16 @@ throw new RuntimeException("NullPointerException expected"); } catch (NullPointerException ignore) { } + // read from procfs + if (System.getProperty("os.name").equals("Linux")) { + // Refer to the Linux proc(5) man page for details about /proc/self/status file + // procfs reports this file to be zero sized, even though data can be read from it + String statusFile = "/proc/self/status"; + Path pathStatus = Paths.get(statusFile); + lines = Files.readAllLines(pathStatus, US_ASCII); + assertTrue(lines.size() > 0, "Files.readAllLines('" + pathStatus + "') failed to read"); + } + } finally { delete(tmpfile); } @@ -242,7 +262,6 @@ } finally { delete(tmpfile); } - } static void assertTrue(boolean expr, String errmsg) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/security/Security/AddProvider.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,59 @@ +/* + * 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 8001319 + * @summary check that SecurityPermission insertProvider permission is enforced + * correctly + * @run main/othervm/policy=AddProvider.policy.1 AddProvider 1 + * @run main/othervm/policy=AddProvider.policy.2 AddProvider 2 + * @run main/othervm/policy=AddProvider.policy.3 AddProvider 3 + */ +import java.security.Provider; +import java.security.Security; + +public class AddProvider { + + public static void main(String[] args) throws Exception { + boolean legacy = args[0].equals("2"); + Security.addProvider(new TestProvider("Test1")); + Security.insertProviderAt(new TestProvider("Test2"), 1); + try { + Security.addProvider(new TestProvider("Test3")); + if (legacy) { + throw new Exception("Expected SecurityException"); + } + } catch (SecurityException se) { + if (!legacy) { + throw se; + } + } + } + + private static class TestProvider extends Provider { + TestProvider(String name) { + super(name, 0.0, "Not for use in production systems!"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/security/Security/AddProvider.policy.1 Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,7 @@ +grant codeBase "file:${{java.ext.dirs}}/*" { + permission java.security.AllPermission; +}; + +grant { + permission java.security.SecurityPermission "insertProvider"; +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/security/Security/AddProvider.policy.2 Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,8 @@ +grant codeBase "file:${{java.ext.dirs}}/*" { + permission java.security.AllPermission; +}; + +grant { + permission java.security.SecurityPermission "insertProvider.Test1"; + permission java.security.SecurityPermission "insertProvider.Test2"; +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/security/Security/AddProvider.policy.3 Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,7 @@ +grant codeBase "file:${{java.ext.dirs}}/*" { + permission java.security.AllPermission; +}; + +grant { + permission java.security.SecurityPermission "insertProvider.*"; +};
--- a/jdk/test/java/util/Formatter/Basic-X.java.template Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/Formatter/Basic-X.java.template Wed Jul 05 19:07:19 2017 +0200 @@ -1319,10 +1319,8 @@ Math.nextDown(DoubleConsts.MIN_NORMAL)); test("%.1a", "0x1.0p-1022", Math.nextDown(DoubleConsts.MIN_NORMAL)); - test("%.11a", "0x1.ffffffffffep-1023", - Double.parseDouble("0x0.fffffffffffp-1022")); - test("%.1a", "0x1.0p-1022", - Double.parseDouble("0x0.fffffffffffp-1022")); + test("%.11a", "0x1.ffffffffffep-1023", 0x0.fffffffffffp-1022); + test("%.1a", "0x1.0p-1022", 0x0.fffffffffffp-1022); test("%.30a", "0x0.000000000000100000000000000000p-1022", Double.MIN_VALUE); test("%.13a", "0x0.0000000000001p-1022", Double.MIN_VALUE); test("%.11a", "0x1.00000000000p-1074", Double.MIN_VALUE); @@ -1336,19 +1334,50 @@ test("%.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE); test("%.11a", "0x1.00000000000p1024", Double.MAX_VALUE); test("%.1a", "0x1.0p1024", Double.MAX_VALUE); - test("%.11a", "0x1.18000000000p0", Double.parseDouble("0x1.18p0")); - test("%.1a", "0x1.2p0", Double.parseDouble("0x1.18p0")); + test("%.11a", "0x1.18000000000p0", 0x1.18p0); + test("%.1a", "0x1.2p0", 0x1.18p0); + + test("%.11a", "0x1.18000000000p0", 0x1.180000000001p0); + test("%.1a", "0x1.2p0", 0x1.180000000001p0); + test("%.11a", "0x1.28000000000p0", 0x1.28p0); + test("%.1a", "0x1.2p0", 0x1.28p0); + + test("%.11a", "0x1.28000000000p0", 0x1.280000000001p0); + test("%.1a", "0x1.3p0", 0x1.280000000001p0); + + test("%a", "0x0.123p-1022", 0x0.123p-1022); + test("%1.3a", "0x1.230p-1026", 0x0.123p-1022); + test("%1.12a", "0x1.230000000000p-1026", 0x0.123p-1022); + test("%1.15a", "0x0.123000000000000p-1022", 0x0.123p-1022); + test("%1.5a", "0x1.00000p-1074", 0x0.0000000000001p-1022); + test("%1.7a", "0x1.0000000p-1022", 0x0.fffffffffffffp-1022); - test("%.11a", "0x1.18000000000p0", - Double.parseDouble("0x1.180000000001p0")); - test("%.1a", "0x1.2p0", - Double.parseDouble("0x1.180000000001p0")); - test("%.11a", "0x1.28000000000p0", Double.parseDouble("0x1.28p0")); - test("%.1a", "0x1.2p0", Double.parseDouble("0x1.28p0")); + test("%1.6a", "0x1.230000p-1026", 0x0.123000057p-1022); + test("%1.7a", "0x1.2300005p-1026", 0x0.123000057p-1022); + test("%1.8a", "0x1.23000057p-1026", 0x0.123000057p-1022); + test("%1.9a", "0x1.230000570p-1026", 0x0.123000057p-1022); + + test("%1.6a", "0x1.230000p-1026", 0x0.123000058p-1022); + test("%1.7a", "0x1.2300006p-1026", 0x0.123000058p-1022); + test("%1.8a", "0x1.23000058p-1026", 0x0.123000058p-1022); + test("%1.9a", "0x1.230000580p-1026", 0x0.123000058p-1022); - test("%.11a", "0x1.28000000000p0", - Double.parseDouble("0x1.280000000001p0")); - test("%.1a", "0x1.3p0", Double.parseDouble("0x1.280000000001p0")); + test("%1.6a", "0x1.230000p-1026", 0x0.123000059p-1022); + test("%1.7a", "0x1.2300006p-1026", 0x0.123000059p-1022); + test("%1.8a", "0x1.23000059p-1026", 0x0.123000059p-1022); + test("%1.9a", "0x1.230000590p-1026", 0x0.123000059p-1022); + + test("%1.4a", "0x1.0000p-1022", Math.nextDown(Double.MIN_NORMAL)); + + test("%a", "0x1.fffffffffffffp1023", Double.MAX_VALUE); + test("%1.1a", "0x1.0p1024", Double.MAX_VALUE); + test("%1.2a", "0x1.00p1024", Double.MAX_VALUE); + test("%1.6a", "0x1.000000p1024", Double.MAX_VALUE); + test("%1.9a", "0x1.000000000p1024", Double.MAX_VALUE); + test("%1.11a", "0x1.00000000000p1024", Double.MAX_VALUE); + test("%1.12a", "0x1.000000000000p1024", Double.MAX_VALUE); + test("%1.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE); + #end[double] //---------------------------------------------------------------------
--- a/jdk/test/java/util/Formatter/Basic.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/Formatter/Basic.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,7 +25,7 @@ * @summary Unit test for formatter * @bug 4906370 4962433 4973103 4989961 5005818 5031150 4970931 4989491 5002937 * 5005104 5007745 5061412 5055180 5066788 5088703 6317248 6318369 6320122 - * 6344623 6369500 6534606 6282094 6286592 6476425 5063507 6469160 + * 6344623 6369500 6534606 6282094 6286592 6476425 5063507 6469160 6476168 * * @run shell/timeout=240 Basic.sh */
--- a/jdk/test/java/util/Formatter/BasicDouble.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/Formatter/BasicDouble.java Wed Jul 05 19:07:19 2017 +0200 @@ -1319,10 +1319,8 @@ Math.nextDown(DoubleConsts.MIN_NORMAL)); test("%.1a", "0x1.0p-1022", Math.nextDown(DoubleConsts.MIN_NORMAL)); - test("%.11a", "0x1.ffffffffffep-1023", - Double.parseDouble("0x0.fffffffffffp-1022")); - test("%.1a", "0x1.0p-1022", - Double.parseDouble("0x0.fffffffffffp-1022")); + test("%.11a", "0x1.ffffffffffep-1023", 0x0.fffffffffffp-1022); + test("%.1a", "0x1.0p-1022", 0x0.fffffffffffp-1022); test("%.30a", "0x0.000000000000100000000000000000p-1022", Double.MIN_VALUE); test("%.13a", "0x0.0000000000001p-1022", Double.MIN_VALUE); test("%.11a", "0x1.00000000000p-1074", Double.MIN_VALUE); @@ -1336,19 +1334,50 @@ test("%.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE); test("%.11a", "0x1.00000000000p1024", Double.MAX_VALUE); test("%.1a", "0x1.0p1024", Double.MAX_VALUE); - test("%.11a", "0x1.18000000000p0", Double.parseDouble("0x1.18p0")); - test("%.1a", "0x1.2p0", Double.parseDouble("0x1.18p0")); - - test("%.11a", "0x1.18000000000p0", - Double.parseDouble("0x1.180000000001p0")); - test("%.1a", "0x1.2p0", - Double.parseDouble("0x1.180000000001p0")); - test("%.11a", "0x1.28000000000p0", Double.parseDouble("0x1.28p0")); - test("%.1a", "0x1.2p0", Double.parseDouble("0x1.28p0")); - - test("%.11a", "0x1.28000000000p0", - Double.parseDouble("0x1.280000000001p0")); - test("%.1a", "0x1.3p0", Double.parseDouble("0x1.280000000001p0")); + test("%.11a", "0x1.18000000000p0", 0x1.18p0); + test("%.1a", "0x1.2p0", 0x1.18p0); + + test("%.11a", "0x1.18000000000p0", 0x1.180000000001p0); + test("%.1a", "0x1.2p0", 0x1.180000000001p0); + test("%.11a", "0x1.28000000000p0", 0x1.28p0); + test("%.1a", "0x1.2p0", 0x1.28p0); + + test("%.11a", "0x1.28000000000p0", 0x1.280000000001p0); + test("%.1a", "0x1.3p0", 0x1.280000000001p0); + + test("%a", "0x0.123p-1022", 0x0.123p-1022); + test("%1.3a", "0x1.230p-1026", 0x0.123p-1022); + test("%1.12a", "0x1.230000000000p-1026", 0x0.123p-1022); + test("%1.15a", "0x0.123000000000000p-1022", 0x0.123p-1022); + test("%1.5a", "0x1.00000p-1074", 0x0.0000000000001p-1022); + test("%1.7a", "0x1.0000000p-1022", 0x0.fffffffffffffp-1022); + + test("%1.6a", "0x1.230000p-1026", 0x0.123000057p-1022); + test("%1.7a", "0x1.2300005p-1026", 0x0.123000057p-1022); + test("%1.8a", "0x1.23000057p-1026", 0x0.123000057p-1022); + test("%1.9a", "0x1.230000570p-1026", 0x0.123000057p-1022); + + test("%1.6a", "0x1.230000p-1026", 0x0.123000058p-1022); + test("%1.7a", "0x1.2300006p-1026", 0x0.123000058p-1022); + test("%1.8a", "0x1.23000058p-1026", 0x0.123000058p-1022); + test("%1.9a", "0x1.230000580p-1026", 0x0.123000058p-1022); + + test("%1.6a", "0x1.230000p-1026", 0x0.123000059p-1022); + test("%1.7a", "0x1.2300006p-1026", 0x0.123000059p-1022); + test("%1.8a", "0x1.23000059p-1026", 0x0.123000059p-1022); + test("%1.9a", "0x1.230000590p-1026", 0x0.123000059p-1022); + + test("%1.4a", "0x1.0000p-1022", Math.nextDown(Double.MIN_NORMAL)); + + test("%a", "0x1.fffffffffffffp1023", Double.MAX_VALUE); + test("%1.1a", "0x1.0p1024", Double.MAX_VALUE); + test("%1.2a", "0x1.00p1024", Double.MAX_VALUE); + test("%1.6a", "0x1.000000p1024", Double.MAX_VALUE); + test("%1.9a", "0x1.000000000p1024", Double.MAX_VALUE); + test("%1.11a", "0x1.00000000000p1024", Double.MAX_VALUE); + test("%1.12a", "0x1.000000000000p1024", Double.MAX_VALUE); + test("%1.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE); + //---------------------------------------------------------------------
--- a/jdk/test/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,6 +25,7 @@ * @test * @summary Spliterator traversing and splitting tests * @run testng SpliteratorTraversingAndSplittingTest + * @bug 8020016 */ import org.testng.annotations.DataProvider; @@ -386,11 +387,23 @@ db.addCollection(CopyOnWriteArraySet::new); - if (size == 1) { + if (size == 0) { + db.addCollection(c -> Collections.<Integer>emptySet()); + db.addList(c -> Collections.<Integer>emptyList()); + } + else if (size == 1) { db.addCollection(c -> Collections.singleton(exp.get(0))); db.addCollection(c -> Collections.singletonList(exp.get(0))); } + { + Integer[] ai = new Integer[size]; + Arrays.fill(ai, 1); + db.add(String.format("Collections.nCopies(%d, 1)", exp.size()), + Arrays.asList(ai), + () -> Collections.nCopies(exp.size(), 1).spliterator()); + } + // Collections.synchronized/unmodifiable/checked wrappers db.addCollection(Collections::unmodifiableCollection); db.addCollection(c -> Collections.unmodifiableSet(new HashSet<>(c))); @@ -454,6 +467,13 @@ db.addMap(ConcurrentHashMap::new); db.addMap(ConcurrentSkipListMap::new); + + if (size == 0) { + db.addMap(m -> Collections.<Integer, Integer>emptyMap()); + } + else if (size == 1) { + db.addMap(m -> Collections.singletonMap(exp.get(0), exp.get(0))); + } } return spliteratorDataProvider = data.toArray(new Object[0][]);
--- a/jdk/test/java/util/concurrent/CompletableFuture/Basic.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/concurrent/CompletableFuture/Basic.java Wed Jul 05 19:07:19 2017 +0200 @@ -34,6 +34,8 @@ /* * @test * @bug 8005696 + * @run main Basic + * @run main/othervm -Djava.util.concurrent.ForkJoinPool.common.parallelism=0 Basic * @summary Basic tests for CompletableFuture * @author Chris Hegarty */
--- a/jdk/test/java/util/stream/bootlib/java/util/stream/SpliteratorTestHelper.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/stream/bootlib/java/util/stream/SpliteratorTestHelper.java Wed Jul 05 19:07:19 2017 +0200 @@ -22,6 +22,8 @@ */ package java.util.stream; +import org.testng.annotations.Test; + import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; @@ -154,6 +156,7 @@ Collection<T> exp = Collections.unmodifiableList(fromForEach); + testNullPointerException(supplier); testForEach(exp, supplier, boxingAdapter, asserter); testTryAdvance(exp, supplier, boxingAdapter, asserter); testMixedTryAdvanceForEach(exp, supplier, boxingAdapter, asserter); @@ -166,6 +169,31 @@ // + private static <T, S extends Spliterator<T>> void testNullPointerException(Supplier<S> s) { + S sp = s.get(); + // Have to check instances and use casts to avoid tripwire messages and + // directly test the primitive methods + if (sp instanceof Spliterator.OfInt) { + Spliterator.OfInt psp = (Spliterator.OfInt) sp; + executeAndCatch(NullPointerException.class, () -> psp.forEachRemaining((IntConsumer) null)); + executeAndCatch(NullPointerException.class, () -> psp.tryAdvance((IntConsumer) null)); + } + else if (sp instanceof Spliterator.OfLong) { + Spliterator.OfLong psp = (Spliterator.OfLong) sp; + executeAndCatch(NullPointerException.class, () -> psp.forEachRemaining((LongConsumer) null)); + executeAndCatch(NullPointerException.class, () -> psp.tryAdvance((LongConsumer) null)); + } + else if (sp instanceof Spliterator.OfDouble) { + Spliterator.OfDouble psp = (Spliterator.OfDouble) sp; + executeAndCatch(NullPointerException.class, () -> psp.forEachRemaining((DoubleConsumer) null)); + executeAndCatch(NullPointerException.class, () -> psp.tryAdvance((DoubleConsumer) null)); + } + else { + executeAndCatch(NullPointerException.class, () -> sp.forEachRemaining(null)); + executeAndCatch(NullPointerException.class, () -> sp.tryAdvance(null)); + } + } + private static <T, S extends Spliterator<T>> void testForEach( Collection<T> exp, Supplier<S> supplier, @@ -573,6 +601,23 @@ } } + private static void executeAndCatch(Class<? extends Exception> expected, Runnable r) { + Exception caught = null; + try { + r.run(); + } + catch (Exception e) { + caught = e; + } + + assertNotNull(caught, + String.format("No Exception was thrown, expected an Exception of %s to be thrown", + expected.getName())); + assertTrue(expected.isInstance(caught), + String.format("Exception thrown %s not an instance of %s", + caught.getClass().getName(), expected.getName())); + } + static<U> void mixedTraverseAndSplit(Consumer<U> b, Spliterator<U> splTop) { Spliterator<U> spl1, spl2, spl3; splTop.tryAdvance(b);
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/FillableStringTest.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/FillableStringTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -40,17 +40,17 @@ } public void testStringBuilder() { - String s = generate().collect(Collectors.toStringBuilder()).toString(); + String s = generate().collect(Collectors.joining()); assertEquals(s, "THREEFOURFIVE"); } public void testStringBuffer() { - String s = generate().collect(Collectors.toStringBuilder()).toString(); + String s = generate().collect(Collectors.joining()); assertEquals(s, "THREEFOURFIVE"); } public void testStringJoiner() { - String s = generate().collect(Collectors.toStringJoiner("-")).toString(); + String s = generate().collect(Collectors.joining("-")); assertEquals(s, "THREE-FOUR-FIVE"); } }
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/GroupByOpTest.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/GroupByOpTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -36,7 +36,6 @@ import java.util.stream.LambdaTestHelpers; import java.util.stream.OpTestCase; import java.util.stream.Stream; -import java.util.stream.StreamOpFlagTestHelper; import java.util.stream.StreamTestDataProvider; import java.util.stream.TestData; @@ -59,13 +58,14 @@ public class GroupByOpTest extends OpTestCase { public void testBypassCollect() { - Collector<Integer, Map<Boolean, List<Integer>>> collector - = Collectors.groupingBy(LambdaTestHelpers.forPredicate(pEven, true, false)); + @SuppressWarnings("unchecked") + Collector<Integer, Map<Boolean, List<Integer>>, Map<Boolean, List<Integer>>> collector + = (Collector<Integer, Map<Boolean, List<Integer>>, Map<Boolean, List<Integer>>>) Collectors.groupingBy(LambdaTestHelpers.forPredicate(pEven, true, false)); - Map<Boolean, List<Integer>> m = collector.resultSupplier().get(); + Map<Boolean, List<Integer>> m = collector.supplier().get(); int[] ints = countTo(10).stream().mapToInt(e -> (int) e).toArray(); for (int i : ints) - m = collector.accumulator().apply(m, i); + collector.accumulator().accept(m, i); assertEquals(2, m.keySet().size()); for(Collection<Integer> group : m.values()) { @@ -130,7 +130,7 @@ // - Total number of values equals size of data for (MapperData<Integer, ?> md : getMapperData(data)) { - Collector<Integer, Map<Object, List<Integer>>> tab = Collectors.groupingBy(md.m); + Collector<Integer, ?, Map<Object, List<Integer>>> tab = Collectors.groupingBy(md.m); Map<Object, List<Integer>> result = withData(data) .terminal(s -> s, s -> s.collect(tab))
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/SummaryStatisticsTest.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/SummaryStatisticsTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -43,9 +43,9 @@ public class SummaryStatisticsTest extends OpTestCase { public void testIntStatistics() { List<IntSummaryStatistics> instances = new ArrayList<>(); - instances.add(countTo(1000).stream().collect(Collectors.toIntSummaryStatistics(i -> i))); + instances.add(countTo(1000).stream().collect(Collectors.summarizingInt(i -> i))); instances.add(countTo(1000).stream().mapToInt(i -> i).summaryStatistics()); - instances.add(countTo(1000).parallelStream().collect(Collectors.toIntSummaryStatistics(i -> i))); + instances.add(countTo(1000).parallelStream().collect(Collectors.summarizingInt(i -> i))); instances.add(countTo(1000).parallelStream().mapToInt(i -> i).summaryStatistics()); for (IntSummaryStatistics stats : instances) { @@ -58,9 +58,9 @@ public void testLongStatistics() { List<LongSummaryStatistics> instances = new ArrayList<>(); - instances.add(countTo(1000).stream().collect(Collectors.toLongSummaryStatistics(i -> i))); + instances.add(countTo(1000).stream().collect(Collectors.summarizingLong(i -> i))); instances.add(countTo(1000).stream().mapToLong(i -> i).summaryStatistics()); - instances.add(countTo(1000).parallelStream().collect(Collectors.toLongSummaryStatistics(i -> i))); + instances.add(countTo(1000).parallelStream().collect(Collectors.summarizingLong(i -> i))); instances.add(countTo(1000).parallelStream().mapToLong(i -> i).summaryStatistics()); for (LongSummaryStatistics stats : instances) { @@ -73,9 +73,9 @@ public void testDoubleStatistics() { List<DoubleSummaryStatistics> instances = new ArrayList<>(); - instances.add(countTo(1000).stream().collect(Collectors.toDoubleSummaryStatistics(i -> i))); + instances.add(countTo(1000).stream().collect(Collectors.summarizingDouble(i -> i))); instances.add(countTo(1000).stream().mapToDouble(i -> i).summaryStatistics()); - instances.add(countTo(1000).parallelStream().collect(Collectors.toDoubleSummaryStatistics(i -> i))); + instances.add(countTo(1000).parallelStream().collect(Collectors.summarizingDouble(i -> i))); instances.add(countTo(1000).parallelStream().mapToDouble(i -> i).summaryStatistics()); for (DoubleSummaryStatistics stats : instances) {
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java Wed Jul 05 19:07:19 2017 +0200 @@ -23,13 +23,17 @@ package org.openjdk.tests.java.util.stream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; +import java.util.StringJoiner; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListMap; @@ -53,7 +57,10 @@ import static java.util.stream.Collectors.partitioningBy; import static java.util.stream.Collectors.reducing; import static java.util.stream.Collectors.toCollection; +import static java.util.stream.Collectors.toConcurrentMap; import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; +import static java.util.stream.Collectors.toSet; import static java.util.stream.LambdaTestHelpers.assertContents; import static java.util.stream.LambdaTestHelpers.assertContentsUnordered; import static java.util.stream.LambdaTestHelpers.mDoubler; @@ -65,16 +72,6 @@ */ @SuppressWarnings({"rawtypes", "unchecked"}) public class TabulatorsTest extends OpTestCase { - // There are 8 versions of groupingBy: - // groupingBy: { map supplier, not } x { downstream collector, not } x { concurrent, not } - // There are 2 versions of partition: { map supplier, not } - // There are 4 versions of toMap - // mappedTo(function, mapSupplier?, mergeFunction?) - // Each variety needs at least one test - // Plus a variety of multi-level tests (groupBy(..., partition), partition(..., groupBy)) - // Plus negative tests for mapping to null - // Each test should be matched by a nest of asserters (see TabulationAssertion...) - private static abstract class TabulationAssertion<T, U> { abstract void assertValue(U value, @@ -101,7 +98,7 @@ boolean ordered) throws ReflectiveOperationException { if (!clazz.isAssignableFrom(map.getClass())) fail(String.format("Class mismatch in GroupedMapAssertion: %s, %s", clazz, map.getClass())); - assertContentsUnordered(map.keySet(), source.get().map(classifier).collect(Collectors.toSet())); + assertContentsUnordered(map.keySet(), source.get().map(classifier).collect(toSet())); for (Map.Entry<K, ? extends V> entry : map.entrySet()) { K key = entry.getKey(); downstream.assertValue(entry.getValue(), @@ -111,6 +108,39 @@ } } + static class ToMapAssertion<T, K, V, M extends Map<K,V>> extends TabulationAssertion<T, M> { + private final Class<? extends Map> clazz; + private final Function<T, K> keyFn; + private final Function<T, V> valueFn; + private final BinaryOperator<V> mergeFn; + + ToMapAssertion(Function<T, K> keyFn, + Function<T, V> valueFn, + BinaryOperator<V> mergeFn, + Class<? extends Map> clazz) { + this.clazz = clazz; + this.keyFn = keyFn; + this.valueFn = valueFn; + this.mergeFn = mergeFn; + } + + @Override + void assertValue(M map, Supplier<Stream<T>> source, boolean ordered) throws ReflectiveOperationException { + Set<K> uniqueKeys = source.get().map(keyFn).collect(toSet()); + assertTrue(clazz.isAssignableFrom(map.getClass())); + assertEquals(uniqueKeys, map.keySet()); + source.get().forEach(t -> { + K key = keyFn.apply(t); + V v = source.get() + .filter(e -> key.equals(keyFn.apply(e))) + .map(valueFn) + .reduce(mergeFn) + .get(); + assertEquals(map.get(key), v); + }); + } + } + static class PartitionAssertion<T, D> extends TabulationAssertion<T, Map<Boolean,D>> { private final Predicate<T> predicate; private final TabulationAssertion<T,D> downstream; @@ -204,7 +234,7 @@ private <T> ResultAsserter<T> mapTabulationAsserter(boolean ordered) { return (act, exp, ord, par) -> { - if (par & (!ordered || !ord)) { + if (par && (!ordered || !ord)) { TabulatorsTest.nestedMapEqualityAssertion(act, exp); } else { @@ -215,7 +245,7 @@ private<T, M extends Map> void exerciseMapTabulation(TestData<T, Stream<T>> data, - Collector<T, ? extends M> collector, + Collector<T, ?, ? extends M> collector, TabulationAssertion<T, M> assertion) throws ReflectiveOperationException { boolean ordered = !collector.characteristics().contains(Collector.Characteristics.UNORDERED); @@ -248,6 +278,172 @@ assertEquals(o1, o2); } + private<T, R> void assertCollect(TestData.OfRef<T> data, + Collector<T, ?, R> collector, + Function<Stream<T>, R> streamReduction) { + R check = streamReduction.apply(data.stream()); + withData(data).terminal(s -> s.collect(collector)).expectedResult(check).exercise(); + } + + @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) + public void testReduce(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException { + assertCollect(data, Collectors.reducing(0, Integer::sum), + s -> s.reduce(0, Integer::sum)); + assertCollect(data, Collectors.reducing(Integer.MAX_VALUE, Integer::min), + s -> s.min(Integer::compare).orElse(Integer.MAX_VALUE)); + assertCollect(data, Collectors.reducing(Integer.MIN_VALUE, Integer::max), + s -> s.max(Integer::compare).orElse(Integer.MIN_VALUE)); + + assertCollect(data, Collectors.reducing(Integer::sum), + s -> s.reduce(Integer::sum)); + assertCollect(data, Collectors.minBy(Comparator.naturalOrder()), + s -> s.min(Integer::compare)); + assertCollect(data, Collectors.maxBy(Comparator.naturalOrder()), + s -> s.max(Integer::compare)); + + assertCollect(data, Collectors.reducing(0, x -> x*2, Integer::sum), + s -> s.map(x -> x*2).reduce(0, Integer::sum)); + + assertCollect(data, Collectors.summingLong(x -> x * 2L), + s -> s.map(x -> x*2L).reduce(0L, Long::sum)); + assertCollect(data, Collectors.summingInt(x -> x * 2), + s -> s.map(x -> x*2).reduce(0, Integer::sum)); + assertCollect(data, Collectors.summingDouble(x -> x * 2.0d), + s -> s.map(x -> x * 2.0d).reduce(0.0d, Double::sum)); + + assertCollect(data, Collectors.averagingInt(x -> x * 2), + s -> s.mapToInt(x -> x * 2).average().orElse(0)); + assertCollect(data, Collectors.averagingLong(x -> x * 2), + s -> s.mapToLong(x -> x * 2).average().orElse(0)); + assertCollect(data, Collectors.averagingDouble(x -> x * 2), + s -> s.mapToDouble(x -> x * 2).average().orElse(0)); + + // Test explicit Collector.of + Collector<Integer, long[], Double> avg2xint = Collector.of(() -> new long[2], + (a, b) -> { + a[0] += b * 2; + a[1]++; + }, + (a, b) -> { + a[0] += b[0]; + a[1] += b[1]; + return a; + }, + a -> a[1] == 0 ? 0.0d : (double) a[0] / a[1]); + assertCollect(data, avg2xint, + s -> s.mapToInt(x -> x * 2).average().orElse(0)); + } + + @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) + public void testJoin(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException { + withData(data) + .terminal(s -> s.map(Object::toString).collect(Collectors.joining())) + .expectedResult(join(data, "")) + .exercise(); + + Collector<String, StringBuilder, String> likeJoining = Collector.of(StringBuilder::new, StringBuilder::append, (sb1, sb2) -> sb1.append(sb2.toString()), StringBuilder::toString); + withData(data) + .terminal(s -> s.map(Object::toString).collect(likeJoining)) + .expectedResult(join(data, "")) + .exercise(); + + withData(data) + .terminal(s -> s.map(Object::toString).collect(Collectors.joining(","))) + .expectedResult(join(data, ",")) + .exercise(); + + withData(data) + .terminal(s -> s.map(Object::toString).collect(Collectors.joining(",", "[", "]"))) + .expectedResult("[" + join(data, ",") + "]") + .exercise(); + + withData(data) + .terminal(s -> s.map(Object::toString) + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString()) + .expectedResult(join(data, "")) + .exercise(); + + withData(data) + .terminal(s -> s.map(Object::toString) + .collect(() -> new StringJoiner(","), + (sj, cs) -> sj.add(cs), + (j1, j2) -> j1.merge(j2)) + .toString()) + .expectedResult(join(data, ",")) + .exercise(); + + withData(data) + .terminal(s -> s.map(Object::toString) + .collect(() -> new StringJoiner(",", "[", "]"), + (sj, cs) -> sj.add(cs), + (j1, j2) -> j1.merge(j2)) + .toString()) + .expectedResult("[" + join(data, ",") + "]") + .exercise(); + } + + private<T> String join(TestData.OfRef<T> data, String delim) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (T i : data) { + if (!first) + sb.append(delim); + sb.append(i.toString()); + first = false; + } + return sb.toString(); + } + + @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) + public void testSimpleToMap(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException { + Function<Integer, Integer> keyFn = i -> i * 2; + Function<Integer, Integer> valueFn = i -> i * 4; + + List<Integer> dataAsList = Arrays.asList(data.stream().toArray(Integer[]::new)); + Set<Integer> dataAsSet = new HashSet<>(dataAsList); + + BinaryOperator<Integer> sum = Integer::sum; + for (BinaryOperator<Integer> op : Arrays.asList((u, v) -> u, + (u, v) -> v, + sum)) { + try { + exerciseMapTabulation(data, toMap(keyFn, valueFn), + new ToMapAssertion<>(keyFn, valueFn, op, HashMap.class)); + if (dataAsList.size() != dataAsSet.size()) + fail("Expected ISE on input with duplicates"); + } + catch (IllegalStateException e) { + if (dataAsList.size() == dataAsSet.size()) + fail("Expected no ISE on input without duplicates"); + } + + exerciseMapTabulation(data, toMap(keyFn, valueFn, op), + new ToMapAssertion<>(keyFn, valueFn, op, HashMap.class)); + + exerciseMapTabulation(data, toMap(keyFn, valueFn, op, TreeMap::new), + new ToMapAssertion<>(keyFn, valueFn, op, TreeMap.class)); + } + + // For concurrent maps, only use commutative merge functions + try { + exerciseMapTabulation(data, toConcurrentMap(keyFn, valueFn), + new ToMapAssertion<>(keyFn, valueFn, sum, ConcurrentHashMap.class)); + if (dataAsList.size() != dataAsSet.size()) + fail("Expected ISE on input with duplicates"); + } + catch (IllegalStateException e) { + if (dataAsList.size() == dataAsSet.size()) + fail("Expected no ISE on input without duplicates"); + } + + exerciseMapTabulation(data, toConcurrentMap(keyFn, valueFn, sum), + new ToMapAssertion<>(keyFn, valueFn, sum, ConcurrentHashMap.class)); + + exerciseMapTabulation(data, toConcurrentMap(keyFn, valueFn, sum, ConcurrentSkipListMap::new), + new ToMapAssertion<>(keyFn, valueFn, sum, ConcurrentSkipListMap.class)); + } + @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) public void testSimpleGroupBy(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException { Function<Integer, Integer> classifier = i -> i % 3;
--- a/jdk/test/javax/print/attribute/autosense/PrintAutoSenseData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/javax/print/attribute/autosense/PrintAutoSenseData.java Wed Jul 05 19:07:19 2017 +0200 @@ -23,7 +23,7 @@ /* * @test - * @bug 4468109 + * @bug 4468109 8021583 * @summary Test for printing AUTOSENSE DocFlavor. No exception should be thrown. * @run main PrintAutoSenseData */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/print/attribute/autosense/sample.txt Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,1 @@ +This is a program for testing AutoSense data.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTabbedPane/4361477/bug4361477.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,100 @@ +/* + * 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. + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.event.*; +import sun.awt.SunToolkit; + +/* + * @test + * @bug 4361477 + * @summary JTabbedPane throws ArrayOutOfBoundsException + * @author Oleg Mokhovikov + * @run main bug4361477 + */ +public class bug4361477 { + + static JTabbedPane tabbedPane; + volatile static boolean bStateChanged = false; + volatile static Rectangle bounds; + + public static void main(String args[]) throws Exception { + + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Robot robot = new Robot(); + robot.setAutoDelay(50); + + SwingUtilities.invokeAndWait(new Runnable() { + + @Override + public void run() { + createAndShowUI(); + } + }); + + toolkit.realSync(); + + SwingUtilities.invokeAndWait(new Runnable() { + + @Override + public void run() { + bounds = tabbedPane.getUI().getTabBounds(tabbedPane, 0); + } + }); + + Point location = bounds.getLocation(); + SwingUtilities.convertPointToScreen(location, tabbedPane); + robot.mouseMove(location.x + 1, location.y + 1); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + + if (!bStateChanged) { + throw new RuntimeException("Tabbed pane state is not changed"); + } + } + + static void createAndShowUI() { + + final JFrame frame = new JFrame(); + tabbedPane = new JTabbedPane(); + tabbedPane.add("Tab0", new JPanel()); + tabbedPane.add("Tab1", new JPanel()); + tabbedPane.add("Tab2", new JPanel()); + tabbedPane.setSelectedIndex(2); + tabbedPane.addChangeListener(new ChangeListener() { + + public void stateChanged(final ChangeEvent pick) { + bStateChanged = true; + if (tabbedPane.getTabCount() == 3) { + tabbedPane.remove(2); + } + } + }); + + frame.getContentPane().add(tabbedPane); + frame.setSize(300, 200); + frame.setVisible(true); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTabbedPane/6495408/bug6495408.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,81 @@ +/* + * 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. + */ + +import javax.swing.*; +import java.awt.*; +import sun.awt.SunToolkit; +/* + * @test + * @bug 6495408 + * @summary REGRESSION: JTabbedPane throws ArrayIndexOutOfBoundsException + * @author Alexander Potochkin + * @run main bug6495408 + */ + +public class bug6495408 { + + static JTabbedPane tabbedPane; + + public static void main(String[] args) throws Exception { + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + final Robot robot = new Robot(); + robot.setAutoDelay(50); + + SwingUtilities.invokeAndWait(new Runnable() { + + public void run() { + final JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + tabbedPane = new JTabbedPane(); + tabbedPane.setTabPlacement(JTabbedPane.LEFT); + tabbedPane.addTab("Hello", null); + frame.add(tabbedPane); + frame.setSize(400, 400); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + }); + + toolkit.realSync(); + + final Rectangle d = new Rectangle(); + final Point p = new Point(); + + for (int i = 0; i < 7; i++) { + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + int tab = tabbedPane.getTabCount() - 1; + Rectangle bounds = tabbedPane.getBoundsAt(tab); + if (bounds != null) { + d.setBounds(bounds); + p.setLocation(d.x + d.width / 2, d.y + d.height / 2); + SwingUtilities.convertPointToScreen(p, tabbedPane); + robot.mouseMove(p.x, p.y + d.height); + tabbedPane.addTab("Hello", null); + } + } + }); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTabbedPane/7161568/bug7161568.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,90 @@ +/* + * 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. + */ +import java.awt.*; +import javax.swing.*; +import java.awt.event.*; +import sun.awt.SunToolkit; + +/** + * @test + * @bug 7161568 + * @author Alexander Scherbatiy + * @summary Tests that navigating tabs in the JTAbbedPane does not throw NPE + * @run main bug7161568 + */ +public class bug7161568 { + + private static final int N = 50; + private static JTabbedPane tabbedPane; + + public static void main(String[] args) throws Exception { + UIManager.put("TabbedPane.selectionFollowsFocus", Boolean.FALSE); + + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Robot robot = new Robot(); + robot.setAutoDelay(50); + + SwingUtilities.invokeAndWait(new Runnable() { + + @Override + public void run() { + createAndShowUI(); + } + }); + + toolkit.realSync(); + + SwingUtilities.invokeAndWait(new Runnable() { + + @Override + public void run() { + tabbedPane.requestFocus(); + } + }); + + toolkit.realSync(); + + for (int i = 0; i < N; i++) { + robot.keyPress(KeyEvent.VK_LEFT); + robot.keyRelease(KeyEvent.VK_LEFT); + toolkit.realSync(); + } + } + + static void createAndShowUI() { + JFrame frame = new JFrame("Test"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(100, 100); + + tabbedPane = new JTabbedPane(); + + for (int i = 0; i < N; i++) { + tabbedPane.addTab("Tab: " + i, new JLabel("Test")); + } + + tabbedPane.setSelectedIndex(0); + + frame.getContentPane().add(tabbedPane); + frame.setVisible(true); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/text/StyledEditorKit/8016833/bug8016833.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,270 @@ +/* + * 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 8016833 + @summary underlines and strikethroughs should be painted at the correct + positions for different kind of text styles: normal, superscript and subscript + @author Anton Nashatyrev + @run main bug8016833 +*/ +import javax.swing.*; +import javax.swing.text.BadLocationException; +import javax.swing.text.Style; +import javax.swing.text.StyleConstants; +import javax.swing.text.StyledDocument; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.lang.reflect.InvocationTargetException; + +public class bug8016833 { + + void drawText(final Graphics g, final boolean underline, final boolean strikethrough, final boolean background) { + drawText(g, "mama", underline, strikethrough, background); + } + + void drawText(final Graphics g, final String text, final boolean underline, final boolean strikethrough, final boolean background) { + try { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + final JTextPane comp = new JTextPane(); + final StyledDocument doc = comp.getStyledDocument(); + + Style style = comp.addStyle("superscript", null); + setNormalStyle(style); + + if (underline) { + StyleConstants.setUnderline(style, true); + } + if (strikethrough) { + StyleConstants.setStrikeThrough(style, true); + } + if (background) { + StyleConstants.setBackground(style, Color.BLUE); + } + try { + doc.insertString(doc.getLength(), "mama", style); + } catch (BadLocationException e) { + throw new RuntimeException(e); + } + + comp.setSize(200, 100); + comp.paint(g); + } + }); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + void setNormalStyle(Style style) { + StyleConstants.setSuperscript(style, true); + } + + int getEmptyPixel() { + return 0xFFFFFFFF; + } + + boolean isPixelEmpty(int argb) { + return (argb & 0x00FFFFFF) == (getEmptyPixel() & 0x00FFFFFF); + } + + boolean isLineEmpty(BufferedImage img, int coord, boolean isHorizontal) { + int len = isHorizontal ? img.getWidth() : img.getHeight(); + for (int i = 0; i < len; i++) { + int pixel = isHorizontal ? img.getRGB(i, coord) : img.getRGB(coord, i); + if (!isPixelEmpty(pixel)) { + return false; + } + } + return true; + } + + Rectangle getPixelsOutline(BufferedImage img) { + int x1 = 0; + while (x1 < img.getWidth() && isLineEmpty(img, x1, false)) { + x1++; + } + int x2 = img.getWidth() - 1; + while (x2 >= 0 && isLineEmpty(img, x2, false)) { + x2--; + } + int y1 = 0; + while (y1 < img.getHeight() && isLineEmpty(img, y1, true)) { + y1++; + } + int y2 = img.getHeight() - 1; + while (y2 >= 0 && isLineEmpty(img, y2, true)) { + y2--; + } + + return new Rectangle(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + } + + BufferedImage createImage() { + final BufferedImage img = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB); + try { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + Graphics g = img.getGraphics(); + g.setColor(new Color(getEmptyPixel())); + g.fillRect(0, 0, 10000, 10000); + } + }); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + return img; + } + + int subPixels(int pix1, int pix2) { + if (pix1 == pix2) { + return getEmptyPixel(); + } + return pix1; + } + + /** + * Subtracts img2 from img1 + */ + BufferedImage subImages(BufferedImage img1, BufferedImage img2) { + if (img1.getHeight() != img2.getHeight() || + img1.getWidth() != img2.getWidth()) { + throw new RuntimeException("Different sizes"); + } + BufferedImage ret = new BufferedImage(img1.getWidth(), img1.getHeight(), img1.getType()); + + for (int x = 0; x < ret.getWidth(); x++) { + for (int y = 0; y < ret.getHeight(); y++) { + ret.setRGB(x, y, subPixels(img1.getRGB(x, y), img2.getRGB(x, y))); + } + } + return ret; + } + + void testUnderline() { + System.out.println(" testUnderline()"); + + final BufferedImage img1 = createImage(); + drawText(img1.getGraphics(), true, false, false); + final Rectangle out1 = getPixelsOutline(img1); + System.out.println(" Underlined: " + out1); + + final BufferedImage img2 = createImage(); + drawText(img2.getGraphics(), false, false, false); + final Rectangle out2 = getPixelsOutline(img2); + System.out.println(" Normal: " + out2); + + final BufferedImage img3 = subImages(img1, img2); + final Rectangle out3 = getPixelsOutline(img3); + System.out.println(" Sub: " + out3); + + // underline is not too thick + assertTrue(out3.getHeight() <= 2); + // not too wide + assertTrue(out3.getWidth() * 0.8 < out2.getWidth()); + // not too low + assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 3); + // not too high + assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) > 0); + } + + void testStrikthrough() { + System.out.println(" testStrikthrough()"); + + final BufferedImage img1 = createImage(); + drawText(img1.getGraphics(), false, true, false); + final Rectangle out1 = getPixelsOutline(img1); + System.out.println(" Striked: " + out1); + + final BufferedImage img2 = createImage(); + drawText(img2.getGraphics(), false, false, false); + final Rectangle out2 = getPixelsOutline(img2); + System.out.println(" Normal: " + out2); + + final BufferedImage img3 = subImages(img1, img2); + final Rectangle out3 = getPixelsOutline(img3); + System.out.println(" Sub: " + out3); + + // strikethrough is not too thick + assertTrue(out3.getHeight() <= 2); + // not too wide + assertTrue(out3.getWidth() * 0.8 < out2.getWidth()); + // not too low + assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 0); + // not too high + assertTrue(out3.getY() - out1.getY() > 1); + } + void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("Assertion failed"); + } + } + + static void testSuperScript() { + System.out.println("testSuperScript()"); + bug8016833 b = new bug8016833() { + @Override + void setNormalStyle(Style style) { + StyleConstants.setSuperscript(style, true); + } + }; + b.testUnderline(); + b.testStrikthrough(); + } + + static void testSubScript() { + System.out.println("testSubScript()"); + bug8016833 b = new bug8016833() { + @Override + void setNormalStyle(Style style) { + StyleConstants.setSubscript(style, true); + } + }; + b.testUnderline(); + b.testStrikthrough(); + } + + static void testNormalScript() { + System.out.println("testNormalScript()"); + bug8016833 b = new bug8016833() { + @Override + void setNormalStyle(Style style) { + } + }; + b.testUnderline(); + b.testStrikthrough(); + } + + public static void main(String[] args) { + testSubScript(); + testSuperScript(); + testNormalScript(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/crypto/dsig/TransformService/NullParent.java Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,63 @@ +/* + * 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 8022120 + * @summary check that the init and marshalParams methods throw + * NullPointerException when the parent parameter is null + */ + +import javax.xml.crypto.dsig.CanonicalizationMethod; +import javax.xml.crypto.dsig.Transform; +import javax.xml.crypto.dsig.TransformService; + +public class NullParent { + + public static void main(String[] args) throws Exception { + String[] transforms = new String[] + { Transform.BASE64, Transform.ENVELOPED, Transform.XPATH, + Transform.XPATH2, Transform.XSLT, + CanonicalizationMethod.EXCLUSIVE, + CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS, + CanonicalizationMethod.INCLUSIVE, + CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS }; + + for (String transform : transforms) { + System.out.println("Testing " + transform); + TransformService ts = TransformService.getInstance(transform, + "DOM"); + try { + ts.init(null, null); + throw new Exception("init must throw NullPointerException " + + "when the parent parameter is null"); + } catch (NullPointerException npe) { } + try { + ts.marshalParams(null, null); + throw new Exception("marshalParams must throw " + + "NullPointerException when the parent " + + "parameter is null"); + } catch (NullPointerException npe) { } + } + } +}
--- a/jdk/test/jdk/lambda/MethodReferenceTestInstanceMethod.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/jdk/lambda/MethodReferenceTestInstanceMethod.java Wed Jul 05 19:07:19 2017 +0200 @@ -47,7 +47,7 @@ } public void testStringBuffer() { - String s = generate().collect(Collectors.toStringBuilder()).toString(); + String s = generate().collect(Collectors.joining()); assertEquals(s, "THREEFOURFIVE"); }
--- a/jdk/test/jdk/lambda/separate/TestHarness.java Thu Aug 08 10:10:37 2013 -0700 +++ b/jdk/test/jdk/lambda/separate/TestHarness.java Wed Jul 05 19:07:19 2017 +0200 @@ -119,7 +119,7 @@ Class stub = new Class(specimen.getName(), cm); String params = - Arrays.asList(args).stream().collect(Collectors.toStringJoiner(", ")).toString(); + Arrays.asList(args).stream().collect(Collectors.joining(", ")).toString(); ConcreteMethod sm = new ConcreteMethod( method.getReturnType(), method.getName(), @@ -150,7 +150,7 @@ null, Arrays.asList((Method)method)); Class cstub = new Class(specimen.getName()); - String params = Arrays.asList(args).stream().collect(Collectors.toStringJoiner(", ")).toString(); + String params = Arrays.asList(args).stream().collect(Collectors.joining(", ")).toString(); ConcreteMethod sm = new ConcreteMethod( "int", SourceModel.stdMethodName,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/tools/jarsigner/collator.sh Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,76 @@ +# +# 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 8021789 +# @summary jarsigner parses alias as command line option (depending on locale) +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + ;; + * ) + FS="/" + ;; +esac + +F=collator +KS=collator.jks +JFILE=collator.jar + +KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit \ + -keystore $KS" +JAR=$TESTJAVA${FS}bin${FS}jar +JARSIGNER="$TESTJAVA${FS}bin${FS}jarsigner -keystore $KS -storepass changeit" + +rm $F $KS $JFILE 2> /dev/null + +echo 12345 > $F +$JAR cvf $JFILE $F + +ERR="" + +$KT -alias debug -dname CN=debug -genkey -validity 300 || ERR="$ERR 1" + +# use "debug" as alias name +$JARSIGNER $JFILE debug || ERR="$ERR 2" + +# use "" as alias name (although there will be a warning) +$JARSIGNER -verify $JFILE "" || ERR="$ERR 3" + +if [ "$ERR" = "" ]; then + exit 0 +else + echo "ERR is $ERR" + exit 1 +fi + +
--- a/nashorn/.hgtags Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/.hgtags Wed Jul 05 19:07:19 2017 +0200 @@ -211,3 +211,4 @@ 10a1ab9e20a42d278aa1a89698f2a4cf5883d00d jdk8-b99 598321c438b52d9408a2671fb3fc2b2947d0f654 jdk8-b100 a302b05d0ee460679501dc01004f70eb395fadf5 jdk8-b101 +e966ff0a3ffef8a687eaf5a14167bb595b623d02 jdk8-b102
--- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Wed Jul 05 19:07:19 2017 +0200 @@ -45,6 +45,7 @@ import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup; import static jdk.nashorn.internal.codegen.CompilerConstants.staticField; import static jdk.nashorn.internal.codegen.CompilerConstants.typeDescriptor; +import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup; import static jdk.nashorn.internal.ir.Symbol.IS_INTERNAL; import static jdk.nashorn.internal.ir.Symbol.IS_TEMP; import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALLSITE_FAST_SCOPE; @@ -131,6 +132,7 @@ import jdk.nashorn.internal.runtime.ScriptRuntime; import jdk.nashorn.internal.runtime.Source; import jdk.nashorn.internal.runtime.Undefined; +import jdk.nashorn.internal.runtime.arrays.ArrayData; import jdk.nashorn.internal.runtime.linker.LinkerCallSite; /** @@ -1262,7 +1264,11 @@ classEmitter.needGetConstantMethod(cls); } else { method.loadConstants().load(index).arrayload(); - if (cls != Object.class) { + if (object instanceof ArrayData) { + // avoid cast to non-public ArrayData subclass + method.checkcast(ArrayData.class); + method.invoke(virtualCallNoLookup(ArrayData.class, "copy", ArrayData.class)); + } else if (cls != Object.class) { method.checkcast(cls); } }
--- a/nashorn/src/jdk/nashorn/internal/codegen/FieldObjectCreator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/codegen/FieldObjectCreator.java Wed Jul 05 19:07:19 2017 +0200 @@ -30,12 +30,15 @@ import static jdk.nashorn.internal.codegen.CompilerConstants.typeDescriptor; import static jdk.nashorn.internal.codegen.ObjectClassGenerator.getPaddedFieldCount; import static jdk.nashorn.internal.codegen.types.Type.OBJECT; +import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.getArrayIndex; +import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.isValidArrayIndex; import java.util.Iterator; import java.util.List; import jdk.nashorn.internal.codegen.types.Type; import jdk.nashorn.internal.ir.Symbol; import jdk.nashorn.internal.runtime.Context; +import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.PropertyMap; import jdk.nashorn.internal.runtime.ScriptObject; import jdk.nashorn.internal.runtime.arrays.ArrayIndex; @@ -129,12 +132,12 @@ final T value = valueIter.next(); if (symbol != null && value != null) { - final int index = ArrayIndex.getArrayIndex(key); + final int index = getArrayIndex(key); - if (index < 0) { + if (!isValidArrayIndex(index)) { putField(method, key, symbol.getFieldIndex(), value); } else { - putSlot(method, index, value); + putSlot(method, ArrayIndex.toLongIndex(index), value); } } } @@ -177,9 +180,13 @@ * @param index Slot index. * @param value Value to store. */ - private void putSlot(final MethodEmitter method, final int index, final T value) { + private void putSlot(final MethodEmitter method, final long index, final T value) { method.dup(); - method.load(index); + if (JSType.isRepresentableAsInt(index)) { + method.load((int) index); + } else { + method.load(index); + } loadValue(value); method.dynamicSetIndex(callSiteFlags); }
--- a/nashorn/src/jdk/nashorn/internal/codegen/MapCreator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/codegen/MapCreator.java Wed Jul 05 19:07:19 2017 +0200 @@ -25,13 +25,15 @@ package jdk.nashorn.internal.codegen; +import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.getArrayIndex; +import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.isValidArrayIndex; + import java.util.ArrayList; import java.util.List; import jdk.nashorn.internal.ir.Symbol; import jdk.nashorn.internal.runtime.AccessorProperty; import jdk.nashorn.internal.runtime.Property; import jdk.nashorn.internal.runtime.PropertyMap; -import jdk.nashorn.internal.runtime.arrays.ArrayIndex; /** * Class that creates PropertyMap sent to script object constructors. @@ -76,7 +78,7 @@ final String key = keys.get(i); final Symbol symbol = symbols.get(i); - if (symbol != null && !ArrayIndex.isIntArrayIndex(key)) { + if (symbol != null && !isValidArrayIndex(getArrayIndex(key))) { properties.add(new AccessorProperty(key, getPropertyFlags(symbol, hasArguments), structure, symbol.getFieldIndex())); } } @@ -93,7 +95,7 @@ final String key = keys.get(i); final Symbol symbol = symbols.get(i); - if (symbol != null && !ArrayIndex.isIntArrayIndex(key)) { + if (symbol != null && !isValidArrayIndex(getArrayIndex(key))) { properties.add(new AccessorProperty(key, getPropertyFlags(symbol, hasArguments), spillIndex++)); } }
--- a/nashorn/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java Wed Jul 05 19:07:19 2017 +0200 @@ -26,9 +26,13 @@ package jdk.nashorn.internal.codegen; import static jdk.nashorn.internal.codegen.CompilerConstants.constructorNoLookup; +import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup; import static jdk.nashorn.internal.codegen.types.Type.OBJECT; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; + import jdk.nashorn.internal.codegen.types.Type; import jdk.nashorn.internal.ir.Expression; import jdk.nashorn.internal.ir.LiteralNode; @@ -36,6 +40,8 @@ import jdk.nashorn.internal.runtime.Property; import jdk.nashorn.internal.runtime.PropertyMap; import jdk.nashorn.internal.runtime.ScriptObject; +import jdk.nashorn.internal.runtime.arrays.ArrayData; +import jdk.nashorn.internal.runtime.arrays.ArrayIndex; import jdk.nashorn.internal.scripts.JO; /** @@ -63,56 +69,82 @@ protected void makeObject(final MethodEmitter method) { assert !isScope() : "spill scope objects are not currently supported"; - final int length = keys.size(); - final Object[] presetValues = new Object[propertyMap.size()]; - final Class<?> clazz = JO.class; + final int length = keys.size(); + final Object[] presetValues = new Object[length]; + final Set<Integer> postsetValues = new LinkedHashSet<>(); + final int callSiteFlags = codegen.getCallSiteFlags(); + ArrayData arrayData = ArrayData.allocate(new Object[0]); - // Compute constant values + // Compute constant property values for (int i = 0; i < length; i++) { final String key = keys.get(i); - final Property property = propertyMap.findProperty(key); + final Expression value = values.get(i); + + if (value == null) { + continue; // getter or setter + } + + final Object constantValue = LiteralNode.objectAsConstant(value); + if (constantValue == LiteralNode.POSTSET_MARKER) { + postsetValues.add(i); + continue; + } + final Property property = propertyMap.findProperty(key); if (property != null) { - presetValues[property.getSlot()] = LiteralNode.objectAsConstant(values.get(i)); + // normal property key + presetValues[property.getSlot()] = constantValue; + } else { + // array index key + final long oldLength = arrayData.length(); + final int index = ArrayIndex.getArrayIndex(key); + assert ArrayIndex.isValidArrayIndex(index); + final long longIndex = ArrayIndex.toLongIndex(index); + if (longIndex >= oldLength) { + arrayData = arrayData.ensure(longIndex); + } + arrayData = arrayData.set(index, constantValue, false); + if (longIndex > oldLength) { + arrayData = arrayData.delete(oldLength, longIndex - 1); + } } } - method._new(clazz).dup(); + // create object and invoke constructor + method._new(JO.class).dup(); codegen.loadConstant(propertyMap); - method.invoke(constructorNoLookup(JO.class, PropertyMap.class)); + // Set spill array with preset values method.dup(); codegen.loadConstant(presetValues); + method.putField(Type.getInternalName(ScriptObject.class), "spill", Type.OBJECT_ARRAY.getDescriptor()); + + // Set array data if any + if (arrayData.length() > 0) { + method.dup(); + codegen.loadConstant(arrayData); + method.invoke(virtualCallNoLookup(ScriptObject.class, "setArray",void.class, ArrayData.class)); + } // Create properties with non-constant values - for (int i = 0; i < length; i++) { + for (int i : postsetValues) { final String key = keys.get(i); final Property property = propertyMap.findProperty(key); - if (property != null && presetValues[property.getSlot()] == LiteralNode.POSTSET_MARKER) { + if (property == null) { + final int index = ArrayIndex.getArrayIndex(key); + assert ArrayIndex.isValidArrayIndex(index); method.dup(); + method.load(ArrayIndex.toLongIndex(index)); + codegen.load(values.get(i)); + method.dynamicSetIndex(callSiteFlags); + } else { + method.dup(); + method.getField(Type.getInternalName(ScriptObject.class), "spill", Type.OBJECT_ARRAY.getDescriptor()); method.load(property.getSlot()); codegen.load(values.get(i)).convert(OBJECT); method.arraystore(); - presetValues[property.getSlot()] = null; - } - } - - method.putField(Type.typeFor(ScriptObject.class).getInternalName(), "spill", Type.OBJECT_ARRAY.getDescriptor()); - final int callSiteFlags = codegen.getCallSiteFlags(); - - // Assign properties with valid array index keys - for (int i = 0; i < length; i++) { - final String key = keys.get(i); - final Property property = propertyMap.findProperty(key); - final Expression value = values.get(i); - - if (property == null && value != null) { - method.dup(); - method.load(keys.get(i)); - codegen.load(value); - method.dynamicSetIndex(callSiteFlags); } } }
--- a/nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java Wed Jul 05 19:07:19 2017 +0200 @@ -116,6 +116,11 @@ } @Override + public ArrayData copy() { + throw new UnsupportedOperationException(); // Not used for ArrayBuffers + } + + @Override public Object[] asObjectArray() { final Object[] array = new Object[elementLength]; for (int i = 0; i < elementLength; i++) {
--- a/nashorn/src/jdk/nashorn/internal/runtime/NashornLoader.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/NashornLoader.java Wed Jul 05 19:07:19 2017 +0200 @@ -44,26 +44,29 @@ * */ abstract class NashornLoader extends SecureClassLoader { - private static final String OBJECTS_PKG = "jdk.nashorn.internal.objects"; - private static final String RUNTIME_PKG = "jdk.nashorn.internal.runtime"; + private static final String OBJECTS_PKG = "jdk.nashorn.internal.objects"; + private static final String RUNTIME_PKG = "jdk.nashorn.internal.runtime"; + private static final String RUNTIME_ARRAYS_PKG = "jdk.nashorn.internal.runtime.arrays"; private static final String RUNTIME_LINKER_PKG = "jdk.nashorn.internal.runtime.linker"; - private static final String SCRIPTS_PKG = "jdk.nashorn.internal.scripts"; + private static final String SCRIPTS_PKG = "jdk.nashorn.internal.scripts"; private static final Permission[] SCRIPT_PERMISSIONS; + static { - SCRIPT_PERMISSIONS = new Permission[4]; - /* * Generated classes get access to runtime, runtime.linker, objects, scripts packages. * Note that the actual scripts can not access these because Java.type, Packages * prevent these restricted packages. And Java reflection and JSR292 access is prevented * for scripts. In other words, nashorn generated portions of script classes can access - * clases in these implementation packages. + * classes in these implementation packages. */ - SCRIPT_PERMISSIONS[0] = new RuntimePermission("accessClassInPackage." + RUNTIME_PKG); - SCRIPT_PERMISSIONS[1] = new RuntimePermission("accessClassInPackage." + RUNTIME_LINKER_PKG); - SCRIPT_PERMISSIONS[2] = new RuntimePermission("accessClassInPackage." + OBJECTS_PKG); - SCRIPT_PERMISSIONS[3] = new RuntimePermission("accessClassInPackage." + SCRIPTS_PKG); + SCRIPT_PERMISSIONS = new Permission[] { + new RuntimePermission("accessClassInPackage." + RUNTIME_PKG), + new RuntimePermission("accessClassInPackage." + RUNTIME_LINKER_PKG), + new RuntimePermission("accessClassInPackage." + OBJECTS_PKG), + new RuntimePermission("accessClassInPackage." + SCRIPTS_PKG), + new RuntimePermission("accessClassInPackage." + RUNTIME_ARRAYS_PKG) + }; } private final Context context; @@ -97,6 +100,7 @@ final String pkgName = name.substring(0, i); switch (pkgName) { case RUNTIME_PKG: + case RUNTIME_ARRAYS_PKG: case RUNTIME_LINKER_PKG: case OBJECTS_PKG: case SCRIPTS_PKG:
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java Wed Jul 05 19:07:19 2017 +0200 @@ -56,7 +56,7 @@ * Constructor * @param length Virtual length of the array. */ - public ArrayData(final long length) { + protected ArrayData(final long length) { this.length = length; } @@ -183,6 +183,14 @@ } /** + * Return a copy of the array that can be modified without affecting this instance. + * It is safe to return themselves for immutable subclasses. + * + * @return a new array + */ + public abstract ArrayData copy(); + + /** * Return a copy of the array data as an Object array. * * @return an Object array
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java Wed Jul 05 19:07:19 2017 +0200 @@ -177,15 +177,5 @@ return index & JSType.MAX_UINT; } - /** - * Check whether a key string represents a valid array index in JavaScript and is small enough - * to fit into a positive int. - * - * @param key the key - * @return true if key works as a valid int array index - */ - public static boolean isIntArrayIndex(final String key) { - return getArrayIndex(key) >= 0; - } }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIterator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIterator.java Wed Jul 05 19:07:19 2017 +0200 @@ -30,7 +30,7 @@ /** * Iterator over a NativeArray */ -public class ArrayIterator extends ArrayLikeIterator<Object> { +class ArrayIterator extends ArrayLikeIterator<Object> { /** Array {@link ScriptObject} to iterate over */ protected final ScriptObject array;
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedArrayFilter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedArrayFilter.java Wed Jul 05 19:07:19 2017 +0200 @@ -44,6 +44,13 @@ } @Override + public ArrayData copy() { + DeletedArrayFilter copy = new DeletedArrayFilter(underlying.copy()); + copy.getDeleted().copy(deleted); + return copy; + } + + @Override public Object[] asObjectArray() { final Object[] value = super.asObjectArray();
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedRangeArrayFilter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedRangeArrayFilter.java Wed Jul 05 19:07:19 2017 +0200 @@ -50,6 +50,11 @@ } @Override + public ArrayData copy() { + return new DeletedRangeArrayFilter(underlying.copy(), lo, hi); + } + + @Override public Object[] asObjectArray() { final Object[] value = super.asObjectArray(); @@ -191,11 +196,7 @@ private ArrayData getDeletedArrayFilter() { final ArrayData deleteFilter = new DeletedArrayFilter(getUnderlying()); - - for (long i = lo; i <= hi; i++) { - deleteFilter.delete((int) i); - } - + deleteFilter.delete(lo, hi); return deleteFilter; }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,6 +39,11 @@ } @Override + public ArrayData copy() { + return this; + } + + @Override public PropertyDescriptor getDescriptor(final GlobalObject global, final int index) { return global.newDataDescriptor(getObject(index), false, true, false); }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java Wed Jul 05 19:07:19 2017 +0200 @@ -33,7 +33,7 @@ * Implementation of {@link ArrayData} as soon as an int has been * written to the array. This is the default data for new arrays */ -public final class IntArrayData extends ArrayData { +final class IntArrayData extends ArrayData { /** * The wrapped array */ @@ -55,10 +55,13 @@ */ IntArrayData(final int array[], final int length) { super(length); + assert array.length >= length; this.array = array; - if (array.length > length) { - Arrays.fill(array, length, array.length, 0); - } + } + + @Override + public ArrayData copy() { + return new IntArrayData(array.clone(), (int) length()); } @Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java Wed Jul 05 19:07:19 2017 +0200 @@ -46,10 +46,16 @@ */ LongArrayData(final long array[], final int length) { super(length); + assert array.length >= length; this.array = array; } @Override + public ArrayData copy() { + return new LongArrayData(array.clone(), (int) length()); + } + + @Override public Object[] asObjectArray() { return toObjectArray(array, (int) length()); }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/NoTypeArrayData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/NoTypeArrayData.java Wed Jul 05 19:07:19 2017 +0200 @@ -47,6 +47,11 @@ } @Override + public ArrayData copy() { + return new NoTypeArrayData(); + } + + @Override public Object asArrayOfType(final Class<?> componentType) { return Array.newInstance(componentType, 0); }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java Wed Jul 05 19:07:19 2017 +0200 @@ -46,10 +46,13 @@ */ NumberArrayData(final double array[], final int length) { super(length); + assert array.length >= length; this.array = array; - if (array.length > length) { - Arrays.fill(array, length, array.length, 0.0); - } + } + + @Override + public ArrayData copy() { + return new NumberArrayData(array.clone(), (int) length()); } @Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java Wed Jul 05 19:07:19 2017 +0200 @@ -47,10 +47,13 @@ */ ObjectArrayData(final Object array[], final int length) { super(length); + assert array.length >= length; this.array = array; - if (array.length > length) { - Arrays.fill(array, length, array.length, ScriptRuntime.UNDEFINED); - } + } + + @Override + public ArrayData copy() { + return new ObjectArrayData(array.clone(), (int) length()); } @Override @@ -109,9 +112,6 @@ @Override public ArrayData set(final int index, final Object value, final boolean strict) { - if (value == ScriptRuntime.UNDEFINED) { - return new UndefinedArrayFilter(this).set(index, value, strict); - } array[index] = value; setLength(Math.max(index + 1, length())); return this;
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ReverseArrayIterator.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ReverseArrayIterator.java Wed Jul 05 19:07:19 2017 +0200 @@ -30,7 +30,7 @@ /** * Reverse iterator over a NativeArray */ -public final class ReverseArrayIterator extends ArrayIterator { +final class ReverseArrayIterator extends ArrayIterator { /** * Constructor
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java Wed Jul 05 19:07:19 2017 +0200 @@ -39,6 +39,11 @@ } @Override + public ArrayData copy() { + return new SealedArrayFilter(underlying.copy()); + } + + @Override public ArrayData slice(final long from, final long to) { return getUnderlying().slice(from, to); }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Wed Jul 05 19:07:19 2017 +0200 @@ -41,22 +41,26 @@ private ArrayData underlying; /** Maximum length to be stored in the array. */ - private final long maxDenseLength; /** Sparse elements. */ - private TreeMap<Long, Object> sparseMap = new TreeMap<>(); + private TreeMap<Long, Object> sparseMap; - SparseArrayData(final ArrayData underlying) { - super(underlying.length()); + SparseArrayData(final ArrayData underlying, final long length) { + this(underlying, length, new TreeMap<Long, Object>()); + } + + SparseArrayData(final ArrayData underlying, final long length, final TreeMap<Long, Object> sparseMap) { + super(length); + assert underlying.length() <= length; this.underlying = underlying; this.maxDenseLength = Math.max(MAX_DENSE_LENGTH, underlying.length()); + this.sparseMap = sparseMap; } - SparseArrayData(final ArrayData array, final long length) { - this(array); - assert array.length() <= length; - super.setLength(length); + @Override + public ArrayData copy() { + return new SparseArrayData(underlying.copy(), length(), new TreeMap<Long, Object>(sparseMap)); } @Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java Thu Aug 08 10:10:37 2013 -0700 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java Wed Jul 05 19:07:19 2017 +0200 @@ -44,6 +44,13 @@ } @Override + public ArrayData copy() { + UndefinedArrayFilter copy = new UndefinedArrayFilter(underlying.copy()); + copy.getUndefined().copy(undefined); + return copy; + } + + @Override public Object[] asObjectArray() { final Object[] value = super.asObjectArray();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8020132.js Wed Jul 05 19:07:19 2017 +0200 @@ -0,0 +1,23992 @@ +/* + * Copyright (c) 2010, 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. + */ + +/** + * JDK-8020132: Big object literal with numerical keys exceeds method size + * + * @test + * @run + */ + +var last = 58565; + +function getObject() { + return { + 33209: 20246, + 33210: 20252, + 33211: 20253, + 33212: 20257, + 33213: 20259, + 33214: 20264, + 33215: 20265, + 33216: 20268, + 33217: 20269, + 33218: 20270, + 33219: 20273, + 33220: 20275, + 33221: 20277, + 33222: 20279, + 33223: 20281, + 33224: 20283, + 33225: 20286, + 33226: 20287, + 33227: 20288, + 33228: 20289, + 33229: 20290, + 33230: 20292, + 33231: 20293, + 33232: 20295, + 33233: 20296, + 33234: 20297, + 33235: 20298, + 33236: 20299, + 33237: 20300, + 33238: 20306, + 33239: 20308, + 33240: 20310, + 33241: 20321, + 33242: 20322, + 33243: 20326, + 33244: 20328, + 33245: 20330, + 33246: 20331, + 33247: 20333, + 33248: 20334, + 33249: 20337, + 33250: 20338, + 33251: 20341, + 33252: 20343, + 33253: 20344, + 33254: 20345, + 33255: 20346, + 33256: 20349, + 33257: 20352, + 33258: 20353, + 33259: 20354, + 33260: 20357, + 33261: 20358, + 33262: 20359, + 33263: 20362, + 33264: 20364, + 33265: 20366, + 33266: 20368, + 33267: 20370, + 33268: 20371, + 33269: 20373, + 33270: 20374, + 33271: 20376, + 33272: 20377, + 33273: 20378, + 33274: 20380, + 33275: 20382, + 33276: 20383, + 33277: 20385, + 33278: 20386, + 33344: 20388, + 33345: 20395, + 33346: 20397, + 33347: 20400, + 33348: 20401, + 33349: 20402, + 33350: 20403, + 33351: 20404, + 33352: 20406, + 33353: 20407, + 33354: 20408, + 33355: 20409, + 33356: 20410, + 33357: 20411, + 33358: 20412, + 33359: 20413, + 33360: 20414, + 33361: 20416, + 33362: 20417, + 33363: 20418, + 33364: 20422, + 33365: 20423, + 33366: 20424, + 33367: 20425, + 33368: 20427, + 33369: 20428, + 33370: 20429, + 33371: 20434, + 33372: 20435, + 33373: 20436, + 33374: 20437, + 33375: 20438, + 33376: 20441, + 33377: 20443, + 33378: 20448, + 33379: 20450, + 33380: 20452, + 33381: 20453, + 33382: 20455, + 33383: 20459, + 33384: 20460, + 33385: 20464, + 33386: 20466, + 33387: 20468, + 33388: 20469, + 33389: 20470, + 33390: 20471, + 33391: 20473, + 33392: 20475, + 33393: 20476, + 33394: 20477, + 33395: 20479, + 33396: 20480, + 33397: 20481, + 33398: 20482, + 33399: 20483, + 33400: 20484, + 33401: 20485, + 33402: 20486, + 33403: 20487, + 33404: 20488, + 33405: 20489, + 33406: 20490, + 33408: 20491, + 33409: 20494, + 33410: 20496, + 33411: 20497, + 33412: 20499, + 33413: 20501, + 33414: 20502, + 33415: 20503, + 33416: 20507, + 33417: 20509, + 33418: 20510, + 33419: 20512, + 33420: 20514, + 33421: 20515, + 33422: 20516, + 33423: 20519, + 33424: 20523, + 33425: 20527, + 33426: 20528, + 33427: 20529, + 33428: 20530, + 33429: 20531, + 33430: 20532, + 33431: 20533, + 33432: 20534, + 33433: 20535, + 33434: 20536, + 33435: 20537, + 33436: 20539, + 33437: 20541, + 33438: 20543, + 33439: 20544, + 33440: 20545, + 33441: 20546, + 33442: 20548, + 33443: 20549, + 33444: 20550, + 33445: 20553, + 33446: 20554, + 33447: 20555, + 33448: 20557, + 33449: 20560, + 33450: 20561, + 33451: 20562, + 33452: 20563, + 33453: 20564, + 33454: 20566, + 33455: 20567, + 33456: 20568, + 33457: 20569, + 33458: 20571, + 33459: 20573, + 33460: 20574, + 33461: 20575, + 33462: 20576, + 33463: 20577, + 33464: 20578, + 33465: 20579, + 33466: 20580, + 33467: 20582, + 33468: 20583, + 33469: 20584, + 33470: 20585, + 33471: 20586, + 33472: 20587, + 33473: 20589, + 33474: 20590, + 33475: 20591, + 33476: 20592, + 33477: 20593, + 33478: 20594, + 33479: 20595, + 33480: 20596, + 33481: 20597, + 33482: 20600, + 33483: 20601, + 33484: 20602, + 33485: 20604, + 33486: 20605, + 33487: 20609, + 33488: 20610, + 33489: 20611, + 33490: 20612, + 33491: 20614, + 33492: 20615, + 33493: 20617, + 33494: 20618, + 33495: 20619, + 33496: 20620, + 33497: 20622, + 33498: 20623, + 33499: 20624, + 33500: 20625, + 33501: 20626, + 33502: 20627, + 33503: 20628, + 33504: 20629, + 33505: 20630, + 33506: 20631, + 33507: 20632, + 33508: 20633, + 33509: 20634, + 33510: 20635, + 33511: 20636, + 33512: 20637, + 33513: 20638, + 33514: 20639, + 33515: 20640, + 33516: 20641, + 33517: 20642, + 33518: 20644, + 33519: 20646, + 33520: 20650, + 33521: 20651, + 33522: 20653, + 33523: 20654, + 33524: 20655, + 33525: 20656, + 33526: 20657, + 33527: 20659, + 33528: 20660, + 33529: 20661, + 33530: 20662, + 33531: 20663, + 33532: 20664, + 33533: 20665, + 33534: 20668, + 33600: 20669, + 33601: 20670, + 33602: 20671, + 33603: 20672, + 33604: 20673, + 33605: 20674, + 33606: 20675, + 33607: 20676, + 33608: 20677, + 33609: 20678, + 33610: 20679, + 33611: 20680, + 33612: 20681, + 33613: 20682, + 33614: 20683, + 33615: 20684, + 33616: 20685, + 33617: 20686, + 33618: 20688, + 33619: 20689, + 33620: 20690, + 33621: 20691, + 33622: 20692, + 33623: 20693, + 33624: 20695, + 33625: 20696, + 33626: 20697, + 33627: 20699, + 33628: 20700, + 33629: 20701, + 33630: 20702, + 33631: 20703, + 33632: 20704, + 33633: 20705, + 33634: 20706, + 33635: 20707, + 33636: 20708, + 33637: 20709, + 33638: 20712, + 33639: 20713, + 33640: 20714, + 33641: 20715, + 33642: 20719, + 33643: 20720, + 33644: 20721, + 33645: 20722, + 33646: 20724, + 33647: 20726, + 33648: 20727, + 33649: 20728, + 33650: 20729, + 33651: 20730, + 33652: 20732, + 33653: 20733, + 33654: 20734, + 33655: 20735, + 33656: 20736, + 33657: 20737, + 33658: 20738, + 33659: 20739, + 33660: 20740, + 33661: 20741, + 33662: 20744, + 33664: 20745, + 33665: 20746, + 33666: 20748, + 33667: 20749, + 33668: 20750, + 33669: 20751, + 33670: 20752, + 33671: 20753, + 33672: 20755, + 33673: 20756, + 33674: 20757, + 33675: 20758, + 33676: 20759, + 33677: 20760, + 33678: 20761, + 33679: 20762, + 33680: 20763, + 33681: 20764, + 33682: 20765, + 33683: 20766, + 33684: 20767, + 33685: 20768, + 33686: 20770, + 33687: 20771, + 33688: 20772, + 33689: 20773, + 33690: 20774, + 33691: 20775, + 33692: 20776, + 33693: 20777, + 33694: 20778, + 33695: 20779, + 33696: 20780, + 33697: 20781, + 33698: 20782, + 33699: 20783, + 33700: 20784, + 33701: 20785, + 33702: 20786, + 33703: 20787, + 33704: 20788, + 33705: 20789, + 33706: 20790, + 33707: 20791, + 33708: 20792, + 33709: 20793, + 33710: 20794, + 33711: 20795, + 33712: 20796, + 33713: 20797, + 33714: 20798, + 33715: 20802, + 33716: 20807, + 33717: 20810, + 33718: 20812, + 33719: 20814, + 33720: 20815, + 33721: 20816, + 33722: 20818, + 33723: 20819, + 33724: 20823, + 33725: 20824, + 33726: 20825, + 33727: 20827, + 33728: 20829, + 33729: 20830, + 33730: 20831, + 33731: 20832, + 33732: 20833, + 33733: 20835, + 33734: 20836, + 33735: 20838, + 33736: 20839, + 33737: 20841, + 33738: 20842, + 33739: 20847, + 33740: 20850, + 33741: 20858, + 33742: 20862, + 33743: 20863, + 33744: 20867, + 33745: 20868, + 33746: 20870, + 33747: 20871, + 33748: 20874, + 33749: 20875, + 33750: 20878, + 33751: 20879, + 33752: 20880, + 33753: 20881, + 33754: 20883, + 33755: 20884, + 33756: 20888, + 33757: 20890, + 33758: 20893, + 33759: 20894, + 33760: 20895, + 33761: 20897, + 33762: 20899, + 33763: 20902, + 33764: 20903, + 33765: 20904, + 33766: 20905, + 33767: 20906, + 33768: 20909, + 33769: 20910, + 33770: 20916, + 33771: 20920, + 33772: 20921, + 33773: 20922, + 33774: 20926, + 33775: 20927, + 33776: 20929, + 33777: 20930, + 33778: 20931, + 33779: 20933, + 33780: 20936, + 33781: 20938, + 33782: 20941, + 33783: 20942, + 33784: 20944, + 33785: 20946, + 33786: 20947, + 33787: 20948, + 33788: 20949, + 33789: 20950, + 33790: 20951, + 33856: 20952, + 33857: 20953, + 33858: 20954, + 33859: 20956, + 33860: 20958, + 33861: 20959, + 33862: 20962, + 33863: 20963, + 33864: 20965, + 33865: 20966, + 33866: 20967, + 33867: 20968, + 33868: 20969, + 33869: 20970, + 33870: 20972, + 33871: 20974, + 33872: 20977, + 33873: 20978, + 33874: 20980, + 33875: 20983, + 33876: 20990, + 33877: 20996, + 33878: 20997, + 33879: 21001, + 33880: 21003, + 33881: 21004, + 33882: 21007, + 33883: 21008, + 33884: 21011, + 33885: 21012, + 33886: 21013, + 33887: 21020, + 33888: 21022, + 33889: 21023, + 33890: 21025, + 33891: 21026, + 33892: 21027, + 33893: 21029, + 33894: 21030, + 33895: 21031, + 33896: 21034, + 33897: 21036, + 33898: 21039, + 33899: 21041, + 33900: 21042, + 33901: 21044, + 33902: 21045, + 33903: 21052, + 33904: 21054, + 33905: 21060, + 33906: 21061, + 33907: 21062, + 33908: 21063, + 33909: 21064, + 33910: 21065, + 33911: 21067, + 33912: 21070, + 33913: 21071, + 33914: 21074, + 33915: 21075, + 33916: 21077, + 33917: 21079, + 33918: 21080, + 33920: 21081, + 33921: 21082, + 33922: 21083, + 33923: 21085, + 33924: 21087, + 33925: 21088, + 33926: 21090, + 33927: 21091, + 33928: 21092, + 33929: 21094, + 33930: 21096, + 33931: 21099, + 33932: 21100, + 33933: 21101, + 33934: 21102, + 33935: 21104, + 33936: 21105, + 33937: 21107, + 33938: 21108, + 33939: 21109, + 33940: 21110, + 33941: 21111, + 33942: 21112, + 33943: 21113, + 33944: 21114, + 33945: 21115, + 33946: 21116, + 33947: 21118, + 33948: 21120, + 33949: 21123, + 33950: 21124, + 33951: 21125, + 33952: 21126, + 33953: 21127, + 33954: 21129, + 33955: 21130, + 33956: 21131, + 33957: 21132, + 33958: 21133, + 33959: 21134, + 33960: 21135, + 33961: 21137, + 33962: 21138, + 33963: 21140, + 33964: 21141, + 33965: 21142, + 33966: 21143, + 33967: 21144, + 33968: 21145, + 33969: 21146, + 33970: 21148, + 33971: 21156, + 33972: 21157, + 33973: 21158, + 33974: 21159, + 33975: 21166, + 33976: 21167, + 33977: 21168, + 33978: 21172, + 33979: 21173, + 33980: 21174, + 33981: 21175, + 33982: 21176, + 33983: 21177, + 33984: 21178, + 33985: 21179, + 33986: 21180, + 33987: 21181, + 33988: 21184, + 33989: 21185, + 33990: 21186, + 33991: 21188, + 33992: 21189, + 33993: 21190, + 33994: 21192, + 33995: 21194, + 33996: 21196, + 33997: 21197, + 33998: 21198, + 33999: 21199, + 34000: 21201, + 34001: 21203, + 34002: 21204, + 34003: 21205, + 34004: 21207, + 34005: 21209, + 34006: 21210, + 34007: 21211, + 34008: 21212, + 34009: 21213, + 34010: 21214, + 34011: 21216, + 34012: 21217, + 34013: 21218, + 34014: 21219, + 34015: 21221, + 34016: 21222, + 34017: 21223, + 34018: 21224, + 34019: 21225, + 34020: 21226, + 34021: 21227, + 34022: 21228, + 34023: 21229, + 34024: 21230, + 34025: 21231, + 34026: 21233, + 34027: 21234, + 34028: 21235, + 34029: 21236, + 34030: 21237, + 34031: 21238, + 34032: 21239, + 34033: 21240, + 34034: 21243, + 34035: 21244, + 34036: 21245, + 34037: 21249, + 34038: 21250, + 34039: 21251, + 34040: 21252, + 34041: 21255, + 34042: 21257, + 34043: 21258, + 34044: 21259, + 34045: 21260, + 34046: 21262, + 34112: 21265, + 34113: 21266, + 34114: 21267, + 34115: 21268, + 34116: 21272, + 34117: 21275, + 34118: 21276, + 34119: 21278, + 34120: 21279, + 34121: 21282, + 34122: 21284, + 34123: 21285, + 34124: 21287, + 34125: 21288, + 34126: 21289, + 34127: 21291, + 34128: 21292, + 34129: 21293, + 34130: 21295, + 34131: 21296, + 34132: 21297, + 34133: 21298, + 34134: 21299, + 34135: 21300, + 34136: 21301, + 34137: 21302, + 34138: 21303, + 34139: 21304, + 34140: 21308, + 34141: 21309, + 34142: 21312, + 34143: 21314, + 34144: 21316, + 34145: 21318, + 34146: 21323, + 34147: 21324, + 34148: 21325, + 34149: 21328, + 34150: 21332, + 34151: 21336, + 34152: 21337, + 34153: 21339, + 34154: 21341, + 34155: 21349, + 34156: 21352, + 34157: 21354, + 34158: 21356, + 34159: 21357, + 34160: 21362, + 34161: 21366, + 34162: 21369, + 34163: 21371, + 34164: 21372, + 34165: 21373, + 34166: 21374, + 34167: 21376, + 34168: 21377, + 34169: 21379, + 34170: 21383, + 34171: 21384, + 34172: 21386, + 34173: 21390, + 34174: 21391, + 34176: 21392, + 34177: 21393, + 34178: 21394, + 34179: 21395, + 34180: 21396, + 34181: 21398, + 34182: 21399, + 34183: 21401, + 34184: 21403, + 34185: 21404, + 34186: 21406, + 34187: 21408, + 34188: 21409, + 34189: 21412, + 34190: 21415, + 34191: 21418, + 34192: 21419, + 34193: 21420, + 34194: 21421, + 34195: 21423, + 34196: 21424, + 34197: 21425, + 34198: 21426, + 34199: 21427, + 34200: 21428, + 34201: 21429, + 34202: 21431, + 34203: 21432, + 34204: 21433, + 34205: 21434, + 34206: 21436, + 34207: 21437, + 34208: 21438, + 34209: 21440, + 34210: 21443, + 34211: 21444, + 34212: 21445, + 34213: 21446, + 34214: 21447, + 34215: 21454, + 34216: 21455, + 34217: 21456, + 34218: 21458, + 34219: 21459, + 34220: 21461, + 34221: 21466, + 34222: 21468, + 34223: 21469, + 34224: 21470, + 34225: 21473, + 34226: 21474, + 34227: 21479, + 34228: 21492, + 34229: 21498, + 34230: 21502, + 34231: 21503, + 34232: 21504, + 34233: 21506, + 34234: 21509, + 34235: 21511, + 34236: 21515, + 34237: 21524, + 34238: 21528, + 34239: 21529, + 33088: 19970, + 33089: 19972, + 33090: 19973, + 33091: 19974, + 33092: 19983, + 33093: 19986, + 33094: 19991, + 33095: 19999, + 33096: 20000, + 33097: 20001, + 33098: 20003, + 33099: 20006, + 33100: 20009, + 33101: 20014, + 33102: 20015, + 33103: 20017, + 33104: 20019, + 33105: 20021, + 33106: 20023, + 33107: 20028, + 33108: 20032, + 33109: 20033, + 33110: 20034, + 33111: 20036, + 33112: 20038, + 33113: 20042, + 33114: 20049, + 33115: 20053, + 33116: 20055, + 33117: 20058, + 33118: 20059, + 33119: 20066, + 33120: 20067, + 33121: 20068, + 33122: 20069, + 33123: 20071, + 33124: 20072, + 33125: 20074, + 33126: 20075, + 33127: 20076, + 33128: 20077, + 33129: 20078, + 33130: 20079, + 33131: 20082, + 33132: 20084, + 33133: 20085, + 33134: 20086, + 33135: 20087, + 33136: 20088, + 33137: 20089, + 33138: 20090, + 33139: 20091, + 33140: 20092, + 33141: 20093, + 33142: 20095, + 33143: 20096, + 33144: 20097, + 33145: 20098, + 33146: 20099, + 33147: 20100, + 33148: 20101, + 33149: 20103, + 33150: 20106, + 33152: 20112, + 33153: 20118, + 33154: 20119, + 33155: 20121, + 33156: 20124, + 33157: 20125, + 33158: 20126, + 33159: 20131, + 33160: 20138, + 33161: 20143, + 33162: 20144, + 33163: 20145, + 33164: 20148, + 33165: 20150, + 33166: 20151, + 33167: 20152, + 33168: 20153, + 33169: 20156, + 33170: 20157, + 33171: 20158, + 33172: 20168, + 33173: 20172, + 33174: 20175, + 33175: 20176, + 33176: 20178, + 33177: 20186, + 33178: 20187, + 33179: 20188, + 33180: 20192, + 33181: 20194, + 33182: 20198, + 33183: 20199, + 33184: 20201, + 33185: 20205, + 33186: 20206, + 33187: 20207, + 33188: 20209, + 33189: 20212, + 33190: 20216, + 33191: 20217, + 33192: 20218, + 33193: 20220, + 33194: 20222, + 33195: 20224, + 33196: 20226, + 33197: 20227, + 33198: 20228, + 33199: 20229, + 33200: 20230, + 33201: 20231, + 33202: 20232, + 33203: 20235, + 33204: 20236, + 33205: 20242, + 33206: 20243, + 33207: 20244, + 33208: 20245, + 34240: 21530, + 34241: 21532, + 34242: 21538, + 34243: 21540, + 34244: 21541, + 34245: 21546, + 34246: 21552, + 34247: 21555, + 34248: 21558, + 34249: 21559, + 34250: 21562, + 34251: 21565, + 34252: 21567, + 34253: 21569, + 34254: 21570, + 34255: 21572, + 34256: 21573, + 34257: 21575, + 34258: 21577, + 34259: 21580, + 34260: 21581, + 34261: 21582, + 34262: 21583, + 34263: 21585, + 34264: 21594, + 34265: 21597, + 34266: 21598, + 34267: 21599, + 34268: 21600, + 34269: 21601, + 34270: 21603, + 34271: 21605, + 34272: 21607, + 34273: 21609, + 34274: 21610, + 34275: 21611, + 34276: 21612, + 34277: 21613, + 34278: 21614, + 34279: 21615, + 34280: 21616, + 34281: 21620, + 34282: 21625, + 34283: 21626, + 34284: 21630, + 34285: 21631, + 34286: 21633, + 34287: 21635, + 34288: 21637, + 34289: 21639, + 34290: 21640, + 34291: 21641, + 34292: 21642, + 34293: 21645, + 34294: 21649, + 34295: 21651, + 34296: 21655, + 34297: 21656, + 34298: 21660, + 34299: 21662, + 34300: 21663, + 34301: 21664, + 34302: 21665, + 34368: 21666, + 34369: 21669, + 34370: 21678, + 34371: 21680, + 34372: 21682, + 34373: 21685, + 34374: 21686, + 34375: 21687, + 34376: 21689, + 34377: 21690, + 34378: 21692, + 34379: 21694, + 34380: 21699, + 34381: 21701, + 34382: 21706, + 34383: 21707, + 34384: 21718, + 34385: 21720, + 34386: 21723, + 34387: 21728, + 34388: 21729, + 34389: 21730, + 34390: 21731, + 34391: 21732, + 34392: 21739, + 34393: 21740, + 34394: 21743, + 34395: 21744, + 34396: 21745, + 34397: 21748, + 34398: 21749, + 34399: 21750, + 34400: 21751, + 34401: 21752, + 34402: 21753, + 34403: 21755, + 34404: 21758, + 34405: 21760, + 34406: 21762, + 34407: 21763, + 34408: 21764, + 34409: 21765, + 34410: 21768, + 34411: 21770, + 34412: 21771, + 34413: 21772, + 34414: 21773, + 34415: 21774, + 34416: 21778, + 34417: 21779, + 34418: 21781, + 34419: 21782, + 34420: 21783, + 34421: 21784, + 34422: 21785, + 34423: 21786, + 34424: 21788, + 34425: 21789, + 34426: 21790, + 34427: 21791, + 34428: 21793, + 34429: 21797, + 34430: 21798, + 34432: 21800, + 34433: 21801, + 34434: 21803, + 34435: 21805, + 34436: 21810, + 34437: 21812, + 34438: 21813, + 34439: 21814, + 34440: 21816, + 34441: 21817, + 34442: 21818, + 34443: 21819, + 34444: 21821, + 34445: 21824, + 34446: 21826, + 34447: 21829, + 34448: 21831, + 34449: 21832, + 34450: 21835, + 34451: 21836, + 34452: 21837, + 34453: 21838, + 34454: 21839, + 34455: 21841, + 34456: 21842, + 34457: 21843, + 34458: 21844, + 34459: 21847, + 34460: 21848, + 34461: 21849, + 34462: 21850, + 34463: 21851, + 34464: 21853, + 34465: 21854, + 34466: 21855, + 34467: 21856, + 34468: 21858, + 34469: 21859, + 34470: 21864, + 34471: 21865, + 34472: 21867, + 34473: 21871, + 34474: 21872, + 34475: 21873, + 34476: 21874, + 34477: 21875, + 34478: 21876, + 34479: 21881, + 34480: 21882, + 34481: 21885, + 34482: 21887, + 34483: 21893, + 34484: 21894, + 34485: 21900, + 34486: 21901, + 34487: 21902, + 34488: 21904, + 34489: 21906, + 34490: 21907, + 34491: 21909, + 34492: 21910, + 34493: 21911, + 34494: 21914, + 34495: 21915, + 34496: 21918, + 34497: 21920, + 34498: 21921, + 34499: 21922, + 34500: 21923, + 34501: 21924, + 34502: 21925, + 34503: 21926, + 34504: 21928, + 34505: 21929, + 34506: 21930, + 34507: 21931, + 34508: 21932, + 34509: 21933, + 34510: 21934, + 34511: 21935, + 34512: 21936, + 34513: 21938, + 34514: 21940, + 34515: 21942, + 34516: 21944, + 34517: 21946, + 34518: 21948, + 34519: 21951, + 34520: 21952, + 34521: 21953, + 34522: 21954, + 34523: 21955, + 34524: 21958, + 34525: 21959, + 34526: 21960, + 34527: 21962, + 34528: 21963, + 34529: 21966, + 34530: 21967, + 34531: 21968, + 34532: 21973, + 34533: 21975, + 34534: 21976, + 34535: 21977, + 34536: 21978, + 34537: 21979, + 34538: 21982, + 34539: 21984, + 34540: 21986, + 34541: 21991, + 34542: 21993, + 34543: 21997, + 34544: 21998, + 34545: 22000, + 34546: 22001, + 34547: 22004, + 34548: 22006, + 34549: 22008, + 34550: 22009, + 34551: 22010, + 34552: 22011, + 34553: 22012, + 34554: 22015, + 34555: 22018, + 34556: 22019, + 34557: 22020, + 34558: 22021, + 34624: 22022, + 34625: 22023, + 34626: 22026, + 34627: 22027, + 34628: 22029, + 34629: 22032, + 34630: 22033, + 34631: 22034, + 34632: 22035, + 34633: 22036, + 34634: 22037, + 34635: 22038, + 34636: 22039, + 34637: 22041, + 34638: 22042, + 34639: 22044, + 34640: 22045, + 34641: 22048, + 34642: 22049, + 34643: 22050, + 34644: 22053, + 34645: 22054, + 34646: 22056, + 34647: 22057, + 34648: 22058, + 34649: 22059, + 34650: 22062, + 34651: 22063, + 34652: 22064, + 34653: 22067, + 34654: 22069, + 34655: 22071, + 34656: 22072, + 34657: 22074, + 34658: 22076, + 34659: 22077, + 34660: 22078, + 34661: 22080, + 34662: 22081, + 34663: 22082, + 34664: 22083, + 34665: 22084, + 34666: 22085, + 34667: 22086, + 34668: 22087, + 34669: 22088, + 34670: 22089, + 34671: 22090, + 34672: 22091, + 34673: 22095, + 34674: 22096, + 34675: 22097, + 34676: 22098, + 34677: 22099, + 34678: 22101, + 34679: 22102, + 34680: 22106, + 34681: 22107, + 34682: 22109, + 34683: 22110, + 34684: 22111, + 34685: 22112, + 34686: 22113, + 34688: 22115, + 34689: 22117, + 34690: 22118, + 34691: 22119, + 34692: 22125, + 34693: 22126, + 34694: 22127, + 34695: 22128, + 34696: 22130, + 34697: 22131, + 34698: 22132, + 34699: 22133, + 34700: 22135, + 34701: 22136, + 34702: 22137, + 34703: 22138, + 34704: 22141, + 34705: 22142, + 34706: 22143, + 34707: 22144, + 34708: 22145, + 34709: 22146, + 34710: 22147, + 34711: 22148, + 34712: 22151, + 34713: 22152, + 34714: 22153, + 34715: 22154, + 34716: 22155, + 34717: 22156, + 34718: 22157, + 34719: 22160, + 34720: 22161, + 34721: 22162, + 34722: 22164, + 34723: 22165, + 34724: 22166, + 34725: 22167, + 34726: 22168, + 34727: 22169, + 34728: 22170, + 34729: 22171, + 34730: 22172, + 34731: 22173, + 34732: 22174, + 34733: 22175, + 34734: 22176, + 34735: 22177, + 34736: 22178, + 34737: 22180, + 34738: 22181, + 34739: 22182, + 34740: 22183, + 34741: 22184, + 34742: 22185, + 34743: 22186, + 34744: 22187, + 34745: 22188, + 34746: 22189, + 34747: 22190, + 34748: 22192, + 34749: 22193, + 34750: 22194, + 34751: 22195, + 34752: 22196, + 34753: 22197, + 34754: 22198, + 34755: 22200, + 34756: 22201, + 34757: 22202, + 34758: 22203, + 34759: 22205, + 34760: 22206, + 34761: 22207, + 34762: 22208, + 34763: 22209, + 34764: 22210, + 34765: 22211, + 34766: 22212, + 34767: 22213, + 34768: 22214, + 34769: 22215, + 34770: 22216, + 34771: 22217, + 34772: 22219, + 34773: 22220, + 34774: 22221, + 34775: 22222, + 34776: 22223, + 34777: 22224, + 34778: 22225, + 34779: 22226, + 34780: 22227, + 34781: 22229, + 34782: 22230, + 34783: 22232, + 34784: 22233, + 34785: 22236, + 34786: 22243, + 34787: 22245, + 34788: 22246, + 34789: 22247, + 34790: 22248, + 34791: 22249, + 34792: 22250, + 34793: 22252, + 34794: 22254, + 34795: 22255, + 34796: 22258, + 34797: 22259, + 34798: 22262, + 34799: 22263, + 34800: 22264, + 34801: 22267, + 34802: 22268, + 34803: 22272, + 34804: 22273, + 34805: 22274, + 34806: 22277, + 34807: 22279, + 34808: 22283, + 34809: 22284, + 34810: 22285, + 34811: 22286, + 34812: 22287, + 34813: 22288, + 34814: 22289, + 34880: 22290, + 34881: 22291, + 34882: 22292, + 34883: 22293, + 34884: 22294, + 34885: 22295, + 34886: 22296, + 34887: 22297, + 34888: 22298, + 34889: 22299, + 34890: 22301, + 34891: 22302, + 34892: 22304, + 34893: 22305, + 34894: 22306, + 34895: 22308, + 34896: 22309, + 34897: 22310, + 34898: 22311, + 34899: 22315, + 34900: 22321, + 34901: 22322, + 34902: 22324, + 34903: 22325, + 34904: 22326, + 34905: 22327, + 34906: 22328, + 34907: 22332, + 34908: 22333, + 34909: 22335, + 34910: 22337, + 34911: 22339, + 34912: 22340, + 34913: 22341, + 34914: 22342, + 34915: 22344, + 34916: 22345, + 34917: 22347, + 34918: 22354, + 34919: 22355, + 34920: 22356, + 34921: 22357, + 34922: 22358, + 34923: 22360, + 34924: 22361, + 34925: 22370, + 34926: 22371, + 34927: 22373, + 34928: 22375, + 34929: 22380, + 34930: 22382, + 34931: 22384, + 34932: 22385, + 34933: 22386, + 34934: 22388, + 34935: 22389, + 34936: 22392, + 34937: 22393, + 34938: 22394, + 34939: 22397, + 34940: 22398, + 34941: 22399, + 34942: 22400, + 34944: 22401, + 34945: 22407, + 34946: 22408, + 34947: 22409, + 34948: 22410, + 34949: 22413, + 34950: 22414, + 34951: 22415, + 34952: 22416, + 34953: 22417, + 34954: 22420, + 34955: 22421, + 34956: 22422, + 34957: 22423, + 34958: 22424, + 34959: 22425, + 34960: 22426, + 34961: 22428, + 34962: 22429, + 34963: 22430, + 34964: 22431, + 34965: 22437, + 34966: 22440, + 34967: 22442, + 34968: 22444, + 34969: 22447, + 34970: 22448, + 34971: 22449, + 34972: 22451, + 34973: 22453, + 34974: 22454, + 34975: 22455, + 34976: 22457, + 34977: 22458, + 34978: 22459, + 34979: 22460, + 34980: 22461, + 34981: 22462, + 34982: 22463, + 34983: 22464, + 34984: 22465, + 34985: 22468, + 34986: 22469, + 34987: 22470, + 34988: 22471, + 34989: 22472, + 34990: 22473, + 34991: 22474, + 34992: 22476, + 34993: 22477, + 34994: 22480, + 34995: 22481, + 34996: 22483, + 34997: 22486, + 34998: 22487, + 34999: 22491, + 35000: 22492, + 35001: 22494, + 35002: 22497, + 35003: 22498, + 35004: 22499, + 35005: 22501, + 35006: 22502, + 35007: 22503, + 35008: 22504, + 35009: 22505, + 35010: 22506, + 35011: 22507, + 35012: 22508, + 35013: 22510, + 35014: 22512, + 35015: 22513, + 35016: 22514, + 35017: 22515, + 35018: 22517, + 35019: 22518, + 35020: 22519, + 35021: 22523, + 35022: 22524, + 35023: 22526, + 35024: 22527, + 35025: 22529, + 35026: 22531, + 35027: 22532, + 35028: 22533, + 35029: 22536, + 35030: 22537, + 35031: 22538, + 35032: 22540, + 35033: 22542, + 35034: 22543, + 35035: 22544, + 35036: 22546, + 35037: 22547, + 35038: 22548, + 35039: 22550, + 35040: 22551, + 35041: 22552, + 35042: 22554, + 35043: 22555, + 35044: 22556, + 35045: 22557, + 35046: 22559, + 35047: 22562, + 35048: 22563, + 35049: 22565, + 35050: 22566, + 35051: 22567, + 35052: 22568, + 35053: 22569, + 35054: 22571, + 35055: 22572, + 35056: 22573, + 35057: 22574, + 35058: 22575, + 35059: 22577, + 35060: 22578, + 35061: 22579, + 35062: 22580, + 35063: 22582, + 35064: 22583, + 35065: 22584, + 35066: 22585, + 35067: 22586, + 35068: 22587, + 35069: 22588, + 35070: 22589, + 35136: 22590, + 35137: 22591, + 35138: 22592, + 35139: 22593, + 35140: 22594, + 35141: 22595, + 35142: 22597, + 35143: 22598, + 35144: 22599, + 35145: 22600, + 35146: 22601, + 35147: 22602, + 35148: 22603, + 35149: 22606, + 35150: 22607, + 35151: 22608, + 35152: 22610, + 35153: 22611, + 35154: 22613, + 35155: 22614, + 35156: 22615, + 35157: 22617, + 35158: 22618, + 35159: 22619, + 35160: 22620, + 35161: 22621, + 35162: 22623, + 35163: 22624, + 35164: 22625, + 35165: 22626, + 35166: 22627, + 35167: 22628, + 35168: 22630, + 35169: 22631, + 35170: 22632, + 35171: 22633, + 35172: 22634, + 35173: 22637, + 35174: 22638, + 35175: 22639, + 35176: 22640, + 35177: 22641, + 35178: 22642, + 35179: 22643, + 35180: 22644, + 35181: 22645, + 35182: 22646, + 35183: 22647, + 35184: 22648, + 35185: 22649, + 35186: 22650, + 35187: 22651, + 35188: 22652, + 35189: 22653, + 35190: 22655, + 35191: 22658, + 35192: 22660, + 35193: 22662, + 35194: 22663, + 35195: 22664, + 35196: 22666, + 35197: 22667, + 35198: 22668, + 35200: 22669, + 35201: 22670, + 35202: 22671, + 35203: 22672, + 35204: 22673, + 35205: 22676, + 35206: 22677, + 35207: 22678, + 35208: 22679, + 35209: 22680, + 35210: 22683, + 35211: 22684, + 35212: 22685, + 35213: 22688, + 35214: 22689, + 35215: 22690, + 35216: 22691, + 35217: 22692, + 35218: 22693, + 35219: 22694, + 35220: 22695, + 35221: 22698, + 35222: 22699, + 35223: 22700, + 35224: 22701, + 35225: 22702, + 35226: 22703, + 35227: 22704, + 35228: 22705, + 35229: 22706, + 35230: 22707, + 35231: 22708, + 35232: 22709, + 35233: 22710, + 35234: 22711, + 35235: 22712, + 35236: 22713, + 35237: 22714, + 35238: 22715, + 35239: 22717, + 35240: 22718, + 35241: 22719, + 35242: 22720, + 35243: 22722, + 35244: 22723, + 35245: 22724, + 35246: 22726, + 35247: 22727, + 35248: 22728, + 35249: 22729, + 35250: 22730, + 35251: 22731, + 35252: 22732, + 35253: 22733, + 35254: 22734, + 35255: 22735, + 35256: 22736, + 35257: 22738, + 35258: 22739, + 35259: 22740, + 35260: 22742, + 35261: 22743, + 35262: 22744, + 35263: 22745, + 35264: 22746, + 35265: 22747, + 35266: 22748, + 35267: 22749, + 35268: 22750, + 35269: 22751, + 35270: 22752, + 35271: 22753, + 35272: 22754, + 35273: 22755, + 35274: 22757, + 35275: 22758, + 35276: 22759, + 35277: 22760, + 35278: 22761, + 35279: 22762, + 35280: 22765, + 35281: 22767, + 35282: 22769, + 35283: 22770, + 35284: 22772, + 35285: 22773, + 35286: 22775, + 35287: 22776, + 35288: 22778, + 35289: 22779, + 35290: 22780, + 35291: 22781, + 35292: 22782, + 35293: 22783, + 35294: 22784, + 35295: 22785, + 35296: 22787, + 35297: 22789, + 35298: 22790, + 35299: 22792, + 35300: 22793, + 35301: 22794, + 35302: 22795, + 35303: 22796, + 35304: 22798, + 35305: 22800, + 35306: 22801, + 35307: 22802, + 35308: 22803, + 35309: 22807, + 35310: 22808, + 35311: 22811, + 35312: 22813, + 35313: 22814, + 35314: 22816, + 35315: 22817, + 35316: 22818, + 35317: 22819, + 35318: 22822, + 35319: 22824, + 35320: 22828, + 35321: 22832, + 35322: 22834, + 35323: 22835, + 35324: 22837, + 35325: 22838, + 35326: 22843, + 35392: 22845, + 35393: 22846, + 35394: 22847, + 35395: 22848, + 35396: 22851, + 35397: 22853, + 35398: 22854, + 35399: 22858, + 35400: 22860, + 35401: 22861, + 35402: 22864, + 35403: 22866, + 35404: 22867, + 35405: 22873, + 35406: 22875, + 35407: 22876, + 35408: 22877, + 35409: 22878, + 35410: 22879, + 35411: 22881, + 35412: 22883, + 35413: 22884, + 35414: 22886, + 35415: 22887, + 35416: 22888, + 35417: 22889, + 35418: 22890, + 35419: 22891, + 35420: 22892, + 35421: 22893, + 35422: 22894, + 35423: 22895, + 35424: 22896, + 35425: 22897, + 35426: 22898, + 35427: 22901, + 35428: 22903, + 35429: 22906, + 35430: 22907, + 35431: 22908, + 35432: 22910, + 35433: 22911, + 35434: 22912, + 35435: 22917, + 35436: 22921, + 35437: 22923, + 35438: 22924, + 35439: 22926, + 35440: 22927, + 35441: 22928, + 35442: 22929, + 35443: 22932, + 35444: 22933, + 35445: 22936, + 35446: 22938, + 35447: 22939, + 35448: 22940, + 35449: 22941, + 35450: 22943, + 35451: 22944, + 35452: 22945, + 35453: 22946, + 35454: 22950, + 35456: 22951, + 35457: 22956, + 35458: 22957, + 35459: 22960, + 35460: 22961, + 35461: 22963, + 35462: 22964, + 35463: 22965, + 35464: 22966, + 35465: 22967, + 35466: 22968, + 35467: 22970, + 35468: 22972, + 35469: 22973, + 35470: 22975, + 35471: 22976, + 35472: 22977, + 35473: 22978, + 35474: 22979, + 35475: 22980, + 35476: 22981, + 35477: 22983, + 35478: 22984, + 35479: 22985, + 35480: 22988, + 35481: 22989, + 35482: 22990, + 35483: 22991, + 35484: 22997, + 35485: 22998, + 35486: 23001, + 35487: 23003, + 35488: 23006, + 35489: 23007, + 35490: 23008, + 35491: 23009, + 35492: 23010, + 35493: 23012, + 35494: 23014, + 35495: 23015, + 35496: 23017, + 35497: 23018, + 35498: 23019, + 35499: 23021, + 35500: 23022, + 35501: 23023, + 35502: 23024, + 35503: 23025, + 35504: 23026, + 35505: 23027, + 35506: 23028, + 35507: 23029, + 35508: 23030, + 35509: 23031, + 35510: 23032, + 35511: 23034, + 35512: 23036, + 35513: 23037, + 35514: 23038, + 35515: 23040, + 35516: 23042, + 35517: 23050, + 35518: 23051, + 35519: 23053, + 35520: 23054, + 35521: 23055, + 35522: 23056, + 35523: 23058, + 35524: 23060, + 35525: 23061, + 35526: 23062, + 35527: 23063, + 35528: 23065, + 35529: 23066, + 35530: 23067, + 35531: 23069, + 35532: 23070, + 35533: 23073, + 35534: 23074, + 35535: 23076, + 35536: 23078, + 35537: 23079, + 35538: 23080, + 35539: 23082, + 35540: 23083, + 35541: 23084, + 35542: 23085, + 35543: 23086, + 35544: 23087, + 35545: 23088, + 35546: 23091, + 35547: 23093, + 35548: 23095, + 35549: 23096, + 35550: 23097, + 35551: 23098, + 35552: 23099, + 35553: 23101, + 35554: 23102, + 35555: 23103, + 35556: 23105, + 35557: 23106, + 35558: 23107, + 35559: 23108, + 35560: 23109, + 35561: 23111, + 35562: 23112, + 35563: 23115, + 35564: 23116, + 35565: 23117, + 35566: 23118, + 35567: 23119, + 35568: 23120, + 35569: 23121, + 35570: 23122, + 35571: 23123, + 35572: 23124, + 35573: 23126, + 35574: 23127, + 35575: 23128, + 35576: 23129, + 35577: 23131, + 35578: 23132, + 35579: 23133, + 35580: 23134, + 35581: 23135, + 35582: 23136, + 35648: 23137, + 35649: 23139, + 35650: 23140, + 35651: 23141, + 35652: 23142, + 35653: 23144, + 35654: 23145, + 35655: 23147, + 35656: 23148, + 35657: 23149, + 35658: 23150, + 35659: 23151, + 35660: 23152, + 35661: 23153, + 35662: 23154, + 35663: 23155, + 35664: 23160, + 35665: 23161, + 35666: 23163, + 35667: 23164, + 35668: 23165, + 35669: 23166, + 35670: 23168, + 35671: 23169, + 35672: 23170, + 35673: 23171, + 35674: 23172, + 35675: 23173, + 35676: 23174, + 35677: 23175, + 35678: 23176, + 35679: 23177, + 35680: 23178, + 35681: 23179, + 35682: 23180, + 35683: 23181, + 35684: 23182, + 35685: 23183, + 35686: 23184, + 35687: 23185, + 35688: 23187, + 35689: 23188, + 35690: 23189, + 35691: 23190, + 35692: 23191, + 35693: 23192, + 35694: 23193, + 35695: 23196, + 35696: 23197, + 35697: 23198, + 35698: 23199, + 35699: 23200, + 35700: 23201, + 35701: 23202, + 35702: 23203, + 35703: 23204, + 35704: 23205, + 35705: 23206, + 35706: 23207, + 35707: 23208, + 35708: 23209, + 35709: 23211, + 35710: 23212, + 35712: 23213, + 35713: 23214, + 35714: 23215, + 35715: 23216, + 35716: 23217, + 35717: 23220, + 35718: 23222, + 35719: 23223, + 35720: 23225, + 35721: 23226, + 35722: 23227, + 35723: 23228, + 35724: 23229, + 35725: 23231, + 35726: 23232, + 35727: 23235, + 35728: 23236, + 35729: 23237, + 35730: 23238, + 35731: 23239, + 35732: 23240, + 35733: 23242, + 35734: 23243, + 35735: 23245, + 35736: 23246, + 35737: 23247, + 35738: 23248, + 35739: 23249, + 35740: 23251, + 35741: 23253, + 35742: 23255, + 35743: 23257, + 35744: 23258, + 35745: 23259, + 35746: 23261, + 35747: 23262, + 35748: 23263, + 35749: 23266, + 35750: 23268, + 35751: 23269, + 35752: 23271, + 35753: 23272, + 35754: 23274, + 35755: 23276, + 35756: 23277, + 35757: 23278, + 35758: 23279, + 35759: 23280, + 35760: 23282, + 35761: 23283, + 35762: 23284, + 35763: 23285, + 35764: 23286, + 35765: 23287, + 35766: 23288, + 35767: 23289, + 35768: 23290, + 35769: 23291, + 35770: 23292, + 35771: 23293, + 35772: 23294, + 35773: 23295, + 35774: 23296, + 35775: 23297, + 35776: 23298, + 35777: 23299, + 35778: 23300, + 35779: 23301, + 35780: 23302, + 35781: 23303, + 35782: 23304, + 35783: 23306, + 35784: 23307, + 35785: 23308, + 35786: 23309, + 35787: 23310, + 35788: 23311, + 35789: 23312, + 35790: 23313, + 35791: 23314, + 35792: 23315, + 35793: 23316, + 35794: 23317, + 35795: 23320, + 35796: 23321, + 35797: 23322, + 35798: 23323, + 35799: 23324, + 35800: 23325, + 35801: 23326, + 35802: 23327, + 35803: 23328, + 35804: 23329, + 35805: 23330, + 35806: 23331, + 35807: 23332, + 35808: 23333, + 35809: 23334, + 35810: 23335, + 35811: 23336, + 35812: 23337, + 35813: 23338, + 35814: 23339, + 35815: 23340, + 35816: 23341, + 35817: 23342, + 35818: 23343, + 35819: 23344, + 35820: 23345, + 35821: 23347, + 35822: 23349, + 35823: 23350, + 35824: 23352, + 35825: 23353, + 35826: 23354, + 35827: 23355, + 35828: 23356, + 35829: 23357, + 35830: 23358, + 35831: 23359, + 35832: 23361, + 35833: 23362, + 35834: 23363, + 35835: 23364, + 35836: 23365, + 35837: 23366, + 35838: 23367, + 35904: 23368, + 35905: 23369, + 35906: 23370, + 35907: 23371, + 35908: 23372, + 35909: 23373, + 35910: 23374, + 35911: 23375, + 35912: 23378, + 35913: 23382, + 35914: 23390, + 35915: 23392, + 35916: 23393, + 35917: 23399, + 35918: 23400, + 35919: 23403, + 35920: 23405, + 35921: 23406, + 35922: 23407, + 35923: 23410, + 35924: 23412, + 35925: 23414, + 35926: 23415, + 35927: 23416, + 35928: 23417, + 35929: 23419, + 35930: 23420, + 35931: 23422, + 35932: 23423, + 35933: 23426, + 35934: 23430, + 35935: 23434, + 35936: 23437, + 35937: 23438, + 35938: 23440, + 35939: 23441, + 35940: 23442, + 35941: 23444, + 35942: 23446, + 35943: 23455, + 35944: 23463, + 35945: 23464, + 35946: 23465, + 35947: 23468, + 35948: 23469, + 35949: 23470, + 35950: 23471, + 35951: 23473, + 35952: 23474, + 35953: 23479, + 35954: 23482, + 35955: 23483, + 35956: 23484, + 35957: 23488, + 35958: 23489, + 35959: 23491, + 35960: 23496, + 35961: 23497, + 35962: 23498, + 35963: 23499, + 35964: 23501, + 35965: 23502, + 35966: 23503, + 35968: 23505, + 35969: 23508, + 35970: 23509, + 35971: 23510, + 35972: 23511, + 35973: 23512, + 35974: 23513, + 35975: 23514, + 35976: 23515, + 35977: 23516, + 35978: 23520, + 35979: 23522, + 35980: 23523, + 35981: 23526, + 35982: 23527, + 35983: 23529, + 35984: 23530, + 35985: 23531, + 35986: 23532, + 35987: 23533, + 35988: 23535, + 35989: 23537, + 35990: 23538, + 35991: 23539, + 35992: 23540, + 35993: 23541, + 35994: 23542, + 35995: 23543, + 35996: 23549, + 35997: 23550, + 35998: 23552, + 35999: 23554, + 36000: 23555, + 36001: 23557, + 36002: 23559, + 36003: 23560, + 36004: 23563, + 36005: 23564, + 36006: 23565, + 36007: 23566, + 36008: 23568, + 36009: 23570, + 36010: 23571, + 36011: 23575, + 36012: 23577, + 36013: 23579, + 36014: 23582, + 36015: 23583, + 36016: 23584, + 36017: 23585, + 36018: 23587, + 36019: 23590, + 36020: 23592, + 36021: 23593, + 36022: 23594, + 36023: 23595, + 36024: 23597, + 36025: 23598, + 36026: 23599, + 36027: 23600, + 36028: 23602, + 36029: 23603, + 36030: 23605, + 36031: 23606, + 36032: 23607, + 36033: 23619, + 36034: 23620, + 36035: 23622, + 36036: 23623, + 36037: 23628, + 36038: 23629, + 36039: 23634, + 36040: 23635, + 36041: 23636, + 36042: 23638, + 36043: 23639, + 36044: 23640, + 36045: 23642, + 36046: 23643, + 36047: 23644, + 36048: 23645, + 36049: 23647, + 36050: 23650, + 36051: 23652, + 36052: 23655, + 36053: 23656, + 36054: 23657, + 36055: 23658, + 36056: 23659, + 36057: 23660, + 36058: 23661, + 36059: 23664, + 36060: 23666, + 36061: 23667, + 36062: 23668, + 36063: 23669, + 36064: 23670, + 36065: 23671, + 36066: 23672, + 36067: 23675, + 36068: 23676, + 36069: 23677, + 36070: 23678, + 36071: 23680, + 36072: 23683, + 36073: 23684, + 36074: 23685, + 36075: 23686, + 36076: 23687, + 36077: 23689, + 36078: 23690, + 36079: 23691, + 36080: 23694, + 36081: 23695, + 36082: 23698, + 36083: 23699, + 36084: 23701, + 36085: 23709, + 36086: 23710, + 36087: 23711, + 36088: 23712, + 36089: 23713, + 36090: 23716, + 36091: 23717, + 36092: 23718, + 36093: 23719, + 36094: 23720, + 36160: 23722, + 36161: 23726, + 36162: 23727, + 36163: 23728, + 36164: 23730, + 36165: 23732, + 36166: 23734, + 36167: 23737, + 36168: 23738, + 36169: 23739, + 36170: 23740, + 36171: 23742, + 36172: 23744, + 36173: 23746, + 36174: 23747, + 36175: 23749, + 36176: 23750, + 36177: 23751, + 36178: 23752, + 36179: 23753, + 36180: 23754, + 36181: 23756, + 36182: 23757, + 36183: 23758, + 36184: 23759, + 36185: 23760, + 36186: 23761, + 36187: 23763, + 36188: 23764, + 36189: 23765, + 36190: 23766, + 36191: 23767, + 36192: 23768, + 36193: 23770, + 36194: 23771, + 36195: 23772, + 36196: 23773, + 36197: 23774, + 36198: 23775, + 36199: 23776, + 36200: 23778, + 36201: 23779, + 36202: 23783, + 36203: 23785, + 36204: 23787, + 36205: 23788, + 36206: 23790, + 36207: 23791, + 36208: 23793, + 36209: 23794, + 36210: 23795, + 36211: 23796, + 36212: 23797, + 36213: 23798, + 36214: 23799, + 36215: 23800, + 36216: 23801, + 36217: 23802, + 36218: 23804, + 36219: 23805, + 36220: 23806, + 36221: 23807, + 36222: 23808, + 36224: 23809, + 36225: 23812, + 36226: 23813, + 36227: 23816, + 36228: 23817, + 36229: 23818, + 36230: 23819, + 36231: 23820, + 36232: 23821, + 36233: 23823, + 36234: 23824, + 36235: 23825, + 36236: 23826, + 36237: 23827, + 36238: 23829, + 36239: 23831, + 36240: 23832, + 36241: 23833, + 36242: 23834, + 36243: 23836, + 36244: 23837, + 36245: 23839, + 36246: 23840, + 36247: 23841, + 36248: 23842, + 36249: 23843, + 36250: 23845, + 36251: 23848, + 36252: 23850, + 36253: 23851, + 36254: 23852, + 36255: 23855, + 36256: 23856, + 36257: 23857, + 36258: 23858, + 36259: 23859, + 36260: 23861, + 36261: 23862, + 36262: 23863, + 36263: 23864, + 36264: 23865, + 36265: 23866, + 36266: 23867, + 36267: 23868, + 36268: 23871, + 36269: 23872, + 36270: 23873, + 36271: 23874, + 36272: 23875, + 36273: 23876, + 36274: 23877, + 36275: 23878, + 36276: 23880, + 36277: 23881, + 36278: 23885, + 36279: 23886, + 36280: 23887, + 36281: 23888, + 36282: 23889, + 36283: 23890, + 36284: 23891, + 36285: 23892, + 36286: 23893, + 36287: 23894, + 36288: 23895, + 36289: 23897, + 36290: 23898, + 36291: 23900, + 36292: 23902, + 36293: 23903, + 36294: 23904, + 36295: 23905, + 36296: 23906, + 36297: 23907, + 36298: 23908, + 36299: 23909, + 36300: 23910, + 36301: 23911, + 36302: 23912, + 36303: 23914, + 36304: 23917, + 36305: 23918, + 36306: 23920, + 36307: 23921, + 36308: 23922, + 36309: 23923, + 36310: 23925, + 36311: 23926, + 36312: 23927, + 36313: 23928, + 36314: 23929, + 36315: 23930, + 36316: 23931, + 36317: 23932, + 36318: 23933, + 36319: 23934, + 36320: 23935, + 36321: 23936, + 36322: 23937, + 36323: 23939, + 36324: 23940, + 36325: 23941, + 36326: 23942, + 36327: 23943, + 36328: 23944, + 36329: 23945, + 36330: 23946, + 36331: 23947, + 36332: 23948, + 36333: 23949, + 36334: 23950, + 36335: 23951, + 36336: 23952, + 36337: 23953, + 36338: 23954, + 36339: 23955, + 36340: 23956, + 36341: 23957, + 36342: 23958, + 36343: 23959, + 36344: 23960, + 36345: 23962, + 36346: 23963, + 36347: 23964, + 36348: 23966, + 36349: 23967, + 36350: 23968, + 36416: 23969, + 36417: 23970, + 36418: 23971, + 36419: 23972, + 36420: 23973, + 36421: 23974, + 36422: 23975, + 36423: 23976, + 36424: 23977, + 36425: 23978, + 36426: 23979, + 36427: 23980, + 36428: 23981, + 36429: 23982, + 36430: 23983, + 36431: 23984, + 36432: 23985, + 36433: 23986, + 36434: 23987, + 36435: 23988, + 36436: 23989, + 36437: 23990, + 36438: 23992, + 36439: 23993, + 36440: 23994, + 36441: 23995, + 36442: 23996, + 36443: 23997, + 36444: 23998, + 36445: 23999, + 36446: 24000, + 36447: 24001, + 36448: 24002, + 36449: 24003, + 36450: 24004, + 36451: 24006, + 36452: 24007, + 36453: 24008, + 36454: 24009, + 36455: 24010, + 36456: 24011, + 36457: 24012, + 36458: 24014, + 36459: 24015, + 36460: 24016, + 36461: 24017, + 36462: 24018, + 36463: 24019, + 36464: 24020, + 36465: 24021, + 36466: 24022, + 36467: 24023, + 36468: 24024, + 36469: 24025, + 36470: 24026, + 36471: 24028, + 36472: 24031, + 36473: 24032, + 36474: 24035, + 36475: 24036, + 36476: 24042, + 36477: 24044, + 36478: 24045, + 36480: 24048, + 36481: 24053, + 36482: 24054, + 36483: 24056, + 36484: 24057, + 36485: 24058, + 36486: 24059, + 36487: 24060, + 36488: 24063, + 36489: 24064, + 36490: 24068, + 36491: 24071, + 36492: 24073, + 36493: 24074, + 36494: 24075, + 36495: 24077, + 36496: 24078, + 36497: 24082, + 36498: 24083, + 36499: 24087, + 36500: 24094, + 36501: 24095, + 36502: 24096, + 36503: 24097, + 36504: 24098, + 36505: 24099, + 36506: 24100, + 36507: 24101, + 36508: 24104, + 36509: 24105, + 36510: 24106, + 36511: 24107, + 36512: 24108, + 36513: 24111, + 36514: 24112, + 36515: 24114, + 36516: 24115, + 36517: 24116, + 36518: 24117, + 36519: 24118, + 36520: 24121, + 36521: 24122, + 36522: 24126, + 36523: 24127, + 36524: 24128, + 36525: 24129, + 36526: 24131, + 36527: 24134, + 36528: 24135, + 36529: 24136, + 36530: 24137, + 36531: 24138, + 36532: 24139, + 36533: 24141, + 36534: 24142, + 36535: 24143, + 36536: 24144, + 36537: 24145, + 36538: 24146, + 36539: 24147, + 36540: 24150, + 36541: 24151, + 36542: 24152, + 36543: 24153, + 36544: 24154, + 36545: 24156, + 36546: 24157, + 36547: 24159, + 36548: 24160, + 36549: 24163, + 36550: 24164, + 36551: 24165, + 36552: 24166, + 36553: 24167, + 36554: 24168, + 36555: 24169, + 36556: 24170, + 36557: 24171, + 36558: 24172, + 36559: 24173, + 36560: 24174, + 36561: 24175, + 36562: 24176, + 36563: 24177, + 36564: 24181, + 36565: 24183, + 36566: 24185, + 36567: 24190, + 36568: 24193, + 36569: 24194, + 36570: 24195, + 36571: 24197, + 36572: 24200, + 36573: 24201, + 36574: 24204, + 36575: 24205, + 36576: 24206, + 36577: 24210, + 36578: 24216, + 36579: 24219, + 36580: 24221, + 36581: 24225, + 36582: 24226, + 36583: 24227, + 36584: 24228, + 36585: 24232, + 36586: 24233, + 36587: 24234, + 36588: 24235, + 36589: 24236, + 36590: 24238, + 36591: 24239, + 36592: 24240, + 36593: 24241, + 36594: 24242, + 36595: 24244, + 36596: 24250, + 36597: 24251, + 36598: 24252, + 36599: 24253, + 36600: 24255, + 36601: 24256, + 36602: 24257, + 36603: 24258, + 36604: 24259, + 36605: 24260, + 36606: 24261, + 36672: 24262, + 36673: 24263, + 36674: 24264, + 36675: 24267, + 36676: 24268, + 36677: 24269, + 36678: 24270, + 36679: 24271, + 36680: 24272, + 36681: 24276, + 36682: 24277, + 36683: 24279, + 36684: 24280, + 36685: 24281, + 36686: 24282, + 36687: 24284, + 36688: 24285, + 36689: 24286, + 36690: 24287, + 36691: 24288, + 36692: 24289, + 36693: 24290, + 36694: 24291, + 36695: 24292, + 36696: 24293, + 36697: 24294, + 36698: 24295, + 36699: 24297, + 36700: 24299, + 36701: 24300, + 36702: 24301, + 36703: 24302, + 36704: 24303, + 36705: 24304, + 36706: 24305, + 36707: 24306, + 36708: 24307, + 36709: 24309, + 36710: 24312, + 36711: 24313, + 36712: 24315, + 36713: 24316, + 36714: 24317, + 36715: 24325, + 36716: 24326, + 36717: 24327, + 36718: 24329, + 36719: 24332, + 36720: 24333, + 36721: 24334, + 36722: 24336, + 36723: 24338, + 36724: 24340, + 36725: 24342, + 36726: 24345, + 36727: 24346, + 36728: 24348, + 36729: 24349, + 36730: 24350, + 36731: 24353, + 36732: 24354, + 36733: 24355, + 36734: 24356, + 36736: 24360, + 36737: 24363, + 36738: 24364, + 36739: 24366, + 36740: 24368, + 36741: 24370, + 36742: 24371, + 36743: 24372, + 36744: 24373, + 36745: 24374, + 36746: 24375, + 36747: 24376, + 36748: 24379, + 36749: 24381, + 36750: 24382, + 36751: 24383, + 36752: 24385, + 36753: 24386, + 36754: 24387, + 36755: 24388, + 36756: 24389, + 36757: 24390, + 36758: 24391, + 36759: 24392, + 36760: 24393, + 36761: 24394, + 36762: 24395, + 36763: 24396, + 36764: 24397, + 36765: 24398, + 36766: 24399, + 36767: 24401, + 36768: 24404, + 36769: 24409, + 36770: 24410, + 36771: 24411, + 36772: 24412, + 36773: 24414, + 36774: 24415, + 36775: 24416, + 36776: 24419, + 36777: 24421, + 36778: 24423, + 36779: 24424, + 36780: 24427, + 36781: 24430, + 36782: 24431, + 36783: 24434, + 36784: 24436, + 36785: 24437, + 36786: 24438, + 36787: 24440, + 36788: 24442, + 36789: 24445, + 36790: 24446, + 36791: 24447, + 36792: 24451, + 36793: 24454, + 36794: 24461, + 36795: 24462, + 36796: 24463, + 36797: 24465, + 36798: 24467, + 36799: 24468, + 36800: 24470, + 36801: 24474, + 36802: 24475, + 36803: 24477, + 36804: 24478, + 36805: 24479, + 36806: 24480, + 36807: 24482, + 36808: 24483, + 36809: 24484, + 36810: 24485, + 36811: 24486, + 36812: 24487, + 36813: 24489, + 36814: 24491, + 36815: 24492, + 36816: 24495, + 36817: 24496, + 36818: 24497, + 36819: 24498, + 36820: 24499, + 36821: 24500, + 36822: 24502, + 36823: 24504, + 36824: 24505, + 36825: 24506, + 36826: 24507, + 36827: 24510, + 36828: 24511, + 36829: 24512, + 36830: 24513, + 36831: 24514, + 36832: 24519, + 36833: 24520, + 36834: 24522, + 36835: 24523, + 36836: 24526, + 36837: 24531, + 36838: 24532, + 36839: 24533, + 36840: 24538, + 36841: 24539, + 36842: 24540, + 36843: 24542, + 36844: 24543, + 36845: 24546, + 36846: 24547, + 36847: 24549, + 36848: 24550, + 36849: 24552, + 36850: 24553, + 36851: 24556, + 36852: 24559, + 36853: 24560, + 36854: 24562, + 36855: 24563, + 36856: 24564, + 36857: 24566, + 36858: 24567, + 36859: 24569, + 36860: 24570, + 36861: 24572, + 36862: 24583, + 36928: 24584, + 36929: 24585, + 36930: 24587, + 36931: 24588, + 36932: 24592, + 36933: 24593, + 36934: 24595, + 36935: 24599, + 36936: 24600, + 36937: 24602, + 36938: 24606, + 36939: 24607, + 36940: 24610, + 36941: 24611, + 36942: 24612, + 36943: 24620, + 36944: 24621, + 36945: 24622, + 36946: 24624, + 36947: 24625, + 36948: 24626, + 36949: 24627, + 36950: 24628, + 36951: 24630, + 36952: 24631, + 36953: 24632, + 36954: 24633, + 36955: 24634, + 36956: 24637, + 36957: 24638, + 36958: 24640, + 36959: 24644, + 36960: 24645, + 36961: 24646, + 36962: 24647, + 36963: 24648, + 36964: 24649, + 36965: 24650, + 36966: 24652, + 36967: 24654, + 36968: 24655, + 36969: 24657, + 36970: 24659, + 36971: 24660, + 36972: 24662, + 36973: 24663, + 36974: 24664, + 36975: 24667, + 36976: 24668, + 36977: 24670, + 36978: 24671, + 36979: 24672, + 36980: 24673, + 36981: 24677, + 36982: 24678, + 36983: 24686, + 36984: 24689, + 36985: 24690, + 36986: 24692, + 36987: 24693, + 36988: 24695, + 36989: 24702, + 36990: 24704, + 36992: 24705, + 36993: 24706, + 36994: 24709, + 36995: 24710, + 36996: 24711, + 36997: 24712, + 36998: 24714, + 36999: 24715, + 37000: 24718, + 37001: 24719, + 37002: 24720, + 37003: 24721, + 37004: 24723, + 37005: 24725, + 37006: 24727, + 37007: 24728, + 37008: 24729, + 37009: 24732, + 37010: 24734, + 37011: 24737, + 37012: 24738, + 37013: 24740, + 37014: 24741, + 37015: 24743, + 37016: 24745, + 37017: 24746, + 37018: 24750, + 37019: 24752, + 37020: 24755, + 37021: 24757, + 37022: 24758, + 37023: 24759, + 37024: 24761, + 37025: 24762, + 37026: 24765, + 37027: 24766, + 37028: 24767, + 37029: 24768, + 37030: 24769, + 37031: 24770, + 37032: 24771, + 37033: 24772, + 37034: 24775, + 37035: 24776, + 37036: 24777, + 37037: 24780, + 37038: 24781, + 37039: 24782, + 37040: 24783, + 37041: 24784, + 37042: 24786, + 37043: 24787, + 37044: 24788, + 37045: 24790, + 37046: 24791, + 37047: 24793, + 37048: 24795, + 37049: 24798, + 37050: 24801, + 37051: 24802, + 37052: 24803, + 37053: 24804, + 37054: 24805, + 37055: 24810, + 37056: 24817, + 37057: 24818, + 37058: 24821, + 37059: 24823, + 37060: 24824, + 37061: 24827, + 37062: 24828, + 37063: 24829, + 37064: 24830, + 37065: 24831, + 37066: 24834, + 37067: 24835, + 37068: 24836, + 37069: 24837, + 37070: 24839, + 37071: 24842, + 37072: 24843, + 37073: 24844, + 37074: 24848, + 37075: 24849, + 37076: 24850, + 37077: 24851, + 37078: 24852, + 37079: 24854, + 37080: 24855, + 37081: 24856, + 37082: 24857, + 37083: 24859, + 37084: 24860, + 37085: 24861, + 37086: 24862, + 37087: 24865, + 37088: 24866, + 37089: 24869, + 37090: 24872, + 37091: 24873, + 37092: 24874, + 37093: 24876, + 37094: 24877, + 37095: 24878, + 37096: 24879, + 37097: 24880, + 37098: 24881, + 37099: 24882, + 37100: 24883, + 37101: 24884, + 37102: 24885, + 37103: 24886, + 37104: 24887, + 37105: 24888, + 37106: 24889, + 37107: 24890, + 37108: 24891, + 37109: 24892, + 37110: 24893, + 37111: 24894, + 37112: 24896, + 37113: 24897, + 37114: 24898, + 37115: 24899, + 37116: 24900, + 37117: 24901, + 37118: 24902, + 37184: 24903, + 37185: 24905, + 37186: 24907, + 37187: 24909, + 37188: 24911, + 37189: 24912, + 37190: 24914, + 37191: 24915, + 37192: 24916, + 37193: 24918, + 37194: 24919, + 37195: 24920, + 37196: 24921, + 37197: 24922, + 37198: 24923, + 37199: 24924, + 37200: 24926, + 37201: 24927, + 37202: 24928, + 37203: 24929, + 37204: 24931, + 37205: 24932, + 37206: 24933, + 37207: 24934, + 37208: 24937, + 37209: 24938, + 37210: 24939, + 37211: 24940, + 37212: 24941, + 37213: 24942, + 37214: 24943, + 37215: 24945, + 37216: 24946, + 37217: 24947, + 37218: 24948, + 37219: 24950, + 37220: 24952, + 37221: 24953, + 37222: 24954, + 37223: 24955, + 37224: 24956, + 37225: 24957, + 37226: 24958, + 37227: 24959, + 37228: 24960, + 37229: 24961, + 37230: 24962, + 37231: 24963, + 37232: 24964, + 37233: 24965, + 37234: 24966, + 37235: 24967, + 37236: 24968, + 37237: 24969, + 37238: 24970, + 37239: 24972, + 37240: 24973, + 37241: 24975, + 37242: 24976, + 37243: 24977, + 37244: 24978, + 37245: 24979, + 37246: 24981, + 37248: 24982, + 37249: 24983, + 37250: 24984, + 37251: 24985, + 37252: 24986, + 37253: 24987, + 37254: 24988, + 37255: 24990, + 37256: 24991, + 37257: 24992, + 37258: 24993, + 37259: 24994, + 37260: 24995, + 37261: 24996, + 37262: 24997, + 37263: 24998, + 37264: 25002, + 37265: 25003, + 37266: 25005, + 37267: 25006, + 37268: 25007, + 37269: 25008, + 37270: 25009, + 37271: 25010, + 37272: 25011, + 37273: 25012, + 37274: 25013, + 37275: 25014, + 37276: 25016, + 37277: 25017, + 37278: 25018, + 37279: 25019, + 37280: 25020, + 37281: 25021, + 37282: 25023, + 37283: 25024, + 37284: 25025, + 37285: 25027, + 37286: 25028, + 37287: 25029, + 37288: 25030, + 37289: 25031, + 37290: 25033, + 37291: 25036, + 37292: 25037, + 37293: 25038, + 37294: 25039, + 37295: 25040, + 37296: 25043, + 37297: 25045, + 37298: 25046, + 37299: 25047, + 37300: 25048, + 37301: 25049, + 37302: 25050, + 37303: 25051, + 37304: 25052, + 37305: 25053, + 37306: 25054, + 37307: 25055, + 37308: 25056, + 37309: 25057, + 37310: 25058, + 37311: 25059, + 37312: 25060, + 37313: 25061, + 37314: 25063, + 37315: 25064, + 37316: 25065, + 37317: 25066, + 37318: 25067, + 37319: 25068, + 37320: 25069, + 37321: 25070, + 37322: 25071, + 37323: 25072, + 37324: 25073, + 37325: 25074, + 37326: 25075, + 37327: 25076, + 37328: 25078, + 37329: 25079, + 37330: 25080, + 37331: 25081, + 37332: 25082, + 37333: 25083, + 37334: 25084, + 37335: 25085, + 37336: 25086, + 37337: 25088, + 37338: 25089, + 37339: 25090, + 37340: 25091, + 37341: 25092, + 37342: 25093, + 37343: 25095, + 37344: 25097, + 37345: 25107, + 37346: 25108, + 37347: 25113, + 37348: 25116, + 37349: 25117, + 37350: 25118, + 37351: 25120, + 37352: 25123, + 37353: 25126, + 37354: 25127, + 37355: 25128, + 37356: 25129, + 37357: 25131, + 37358: 25133, + 37359: 25135, + 37360: 25136, + 37361: 25137, + 37362: 25138, + 37363: 25141, + 37364: 25142, + 37365: 25144, + 37366: 25145, + 37367: 25146, + 37368: 25147, + 37369: 25148, + 37370: 25154, + 37371: 25156, + 37372: 25157, + 37373: 25158, + 37374: 25162, + 37440: 25167, + 37441: 25168, + 37442: 25173, + 37443: 25174, + 37444: 25175, + 37445: 25177, + 37446: 25178, + 37447: 25180, + 37448: 25181, + 37449: 25182, + 37450: 25183, + 37451: 25184, + 37452: 25185, + 37453: 25186, + 37454: 25188, + 37455: 25189, + 37456: 25192, + 37457: 25201, + 37458: 25202, + 37459: 25204, + 37460: 25205, + 37461: 25207, + 37462: 25208, + 37463: 25210, + 37464: 25211, + 37465: 25213, + 37466: 25217, + 37467: 25218, + 37468: 25219, + 37469: 25221, + 37470: 25222, + 37471: 25223, + 37472: 25224, + 37473: 25227, + 37474: 25228, + 37475: 25229, + 37476: 25230, + 37477: 25231, + 37478: 25232, + 37479: 25236, + 37480: 25241, + 37481: 25244, + 37482: 25245, + 37483: 25246, + 37484: 25251, + 37485: 25254, + 37486: 25255, + 37487: 25257, + 37488: 25258, + 37489: 25261, + 37490: 25262, + 37491: 25263, + 37492: 25264, + 37493: 25266, + 37494: 25267, + 37495: 25268, + 37496: 25270, + 37497: 25271, + 37498: 25272, + 37499: 25274, + 37500: 25278, + 37501: 25280, + 37502: 25281, + 37504: 25283, + 37505: 25291, + 37506: 25295, + 37507: 25297, + 37508: 25301, + 37509: 25309, + 37510: 25310, + 37511: 25312, + 37512: 25313, + 37513: 25316, + 37514: 25322, + 37515: 25323, + 37516: 25328, + 37517: 25330, + 37518: 25333, + 37519: 25336, + 37520: 25337, + 37521: 25338, + 37522: 25339, + 37523: 25344, + 37524: 25347, + 37525: 25348, + 37526: 25349, + 37527: 25350, + 37528: 25354, + 37529: 25355, + 37530: 25356, + 37531: 25357, + 37532: 25359, + 37533: 25360, + 37534: 25362, + 37535: 25363, + 37536: 25364, + 37537: 25365, + 37538: 25367, + 37539: 25368, + 37540: 25369, + 37541: 25372, + 37542: 25382, + 37543: 25383, + 37544: 25385, + 37545: 25388, + 37546: 25389, + 37547: 25390, + 37548: 25392, + 37549: 25393, + 37550: 25395, + 37551: 25396, + 37552: 25397, + 37553: 25398, + 37554: 25399, + 37555: 25400, + 37556: 25403, + 37557: 25404, + 37558: 25406, + 37559: 25407, + 37560: 25408, + 37561: 25409, + 37562: 25412, + 37563: 25415, + 37564: 25416, + 37565: 25418, + 37566: 25425, + 37567: 25426, + 37568: 25427, + 37569: 25428, + 37570: 25430, + 37571: 25431, + 37572: 25432, + 37573: 25433, + 37574: 25434, + 37575: 25435, + 37576: 25436, + 37577: 25437, + 37578: 25440, + 37579: 25444, + 37580: 25445, + 37581: 25446, + 37582: 25448, + 37583: 25450, + 37584: 25451, + 37585: 25452, + 37586: 25455, + 37587: 25456, + 37588: 25458, + 37589: 25459, + 37590: 25460, + 37591: 25461, + 37592: 25464, + 37593: 25465, + 37594: 25468, + 37595: 25469, + 37596: 25470, + 37597: 25471, + 37598: 25473, + 37599: 25475, + 37600: 25476, + 37601: 25477, + 37602: 25478, + 37603: 25483, + 37604: 25485, + 37605: 25489, + 37606: 25491, + 37607: 25492, + 37608: 25493, + 37609: 25495, + 37610: 25497, + 37611: 25498, + 37612: 25499, + 37613: 25500, + 37614: 25501, + 37615: 25502, + 37616: 25503, + 37617: 25505, + 37618: 25508, + 37619: 25510, + 37620: 25515, + 37621: 25519, + 37622: 25521, + 37623: 25522, + 37624: 25525, + 37625: 25526, + 37626: 25529, + 37627: 25531, + 37628: 25533, + 37629: 25535, + 37630: 25536, + 37696: 25537, + 37697: 25538, + 37698: 25539, + 37699: 25541, + 37700: 25543, + 37701: 25544, + 37702: 25546, + 37703: 25547, + 37704: 25548, + 37705: 25553, + 37706: 25555, + 37707: 25556, + 37708: 25557, + 37709: 25559, + 37710: 25560, + 37711: 25561, + 37712: 25562, + 37713: 25563, + 37714: 25564, + 37715: 25565, + 37716: 25567, + 37717: 25570, + 37718: 25572, + 37719: 25573, + 37720: 25574, + 37721: 25575, + 37722: 25576, + 37723: 25579, + 37724: 25580, + 37725: 25582, + 37726: 25583, + 37727: 25584, + 37728: 25585, + 37729: 25587, + 37730: 25589, + 37731: 25591, + 37732: 25593, + 37733: 25594, + 37734: 25595, + 37735: 25596, + 37736: 25598, + 37737: 25603, + 37738: 25604, + 37739: 25606, + 37740: 25607, + 37741: 25608, + 37742: 25609, + 37743: 25610, + 37744: 25613, + 37745: 25614, + 37746: 25617, + 37747: 25618, + 37748: 25621, + 37749: 25622, + 37750: 25623, + 37751: 25624, + 37752: 25625, + 37753: 25626, + 37754: 25629, + 37755: 25631, + 37756: 25634, + 37757: 25635, + 37758: 25636, + 37760: 25637, + 37761: 25639, + 37762: 25640, + 37763: 25641, + 37764: 25643, + 37765: 25646, + 37766: 25647, + 37767: 25648, + 37768: 25649, + 37769: 25650, + 37770: 25651, + 37771: 25653, + 37772: 25654, + 37773: 25655, + 37774: 25656, + 37775: 25657, + 37776: 25659, + 37777: 25660, + 37778: 25662, + 37779: 25664, + 37780: 25666, + 37781: 25667, + 37782: 25673, + 37783: 25675, + 37784: 25676, + 37785: 25677, + 37786: 25678, + 37787: 25679, + 37788: 25680, + 37789: 25681, + 37790: 25683, + 37791: 25685, + 37792: 25686, + 37793: 25687, + 37794: 25689, + 37795: 25690, + 37796: 25691, + 37797: 25692, + 37798: 25693, + 37799: 25695, + 37800: 25696, + 37801: 25697, + 37802: 25698, + 37803: 25699, + 37804: 25700, + 37805: 25701, + 37806: 25702, + 37807: 25704, + 37808: 25706, + 37809: 25707, + 37810: 25708, + 37811: 25710, + 37812: 25711, + 37813: 25712, + 37814: 25713, + 37815: 25714, + 37816: 25715, + 37817: 25716, + 37818: 25717, + 37819: 25718, + 37820: 25719, + 37821: 25723, + 37822: 25724, + 37823: 25725, + 37824: 25726, + 37825: 25727, + 37826: 25728, + 37827: 25729, + 37828: 25731, + 37829: 25734, + 37830: 25736, + 37831: 25737, + 37832: 25738, + 37833: 25739, + 37834: 25740, + 37835: 25741, + 37836: 25742, + 37837: 25743, + 37838: 25744, + 37839: 25747, + 37840: 25748, + 37841: 25751, + 37842: 25752, + 37843: 25754, + 37844: 25755, + 37845: 25756, + 37846: 25757, + 37847: 25759, + 37848: 25760, + 37849: 25761, + 37850: 25762, + 37851: 25763, + 37852: 25765, + 37853: 25766, + 37854: 25767, + 37855: 25768, + 37856: 25770, + 37857: 25771, + 37858: 25775, + 37859: 25777, + 37860: 25778, + 37861: 25779, + 37862: 25780, + 37863: 25782, + 37864: 25785, + 37865: 25787, + 37866: 25789, + 37867: 25790, + 37868: 25791, + 37869: 25793, + 37870: 25795, + 37871: 25796, + 37872: 25798, + 37873: 25799, + 37874: 25800, + 37875: 25801, + 37876: 25802, + 37877: 25803, + 37878: 25804, + 37879: 25807, + 37880: 25809, + 37881: 25811, + 37882: 25812, + 37883: 25813, + 37884: 25814, + 37885: 25817, + 37886: 25818, + 37952: 25819, + 37953: 25820, + 37954: 25821, + 37955: 25823, + 37956: 25824, + 37957: 25825, + 37958: 25827, + 37959: 25829, + 37960: 25831, + 37961: 25832, + 37962: 25833, + 37963: 25834, + 37964: 25835, + 37965: 25836, + 37966: 25837, + 37967: 25838, + 37968: 25839, + 37969: 25840, + 37970: 25841, + 37971: 25842, + 37972: 25843, + 37973: 25844, + 37974: 25845, + 37975: 25846, + 37976: 25847, + 37977: 25848, + 37978: 25849, + 37979: 25850, + 37980: 25851, + 37981: 25852, + 37982: 25853, + 37983: 25854, + 37984: 25855, + 37985: 25857, + 37986: 25858, + 37987: 25859, + 37988: 25860, + 37989: 25861, + 37990: 25862, + 37991: 25863, + 37992: 25864, + 37993: 25866, + 37994: 25867, + 37995: 25868, + 37996: 25869, + 37997: 25870, + 37998: 25871, + 37999: 25872, + 38000: 25873, + 38001: 25875, + 38002: 25876, + 38003: 25877, + 38004: 25878, + 38005: 25879, + 38006: 25881, + 38007: 25882, + 38008: 25883, + 38009: 25884, + 38010: 25885, + 38011: 25886, + 38012: 25887, + 38013: 25888, + 38014: 25889, + 38016: 25890, + 38017: 25891, + 38018: 25892, + 38019: 25894, + 38020: 25895, + 38021: 25896, + 38022: 25897, + 38023: 25898, + 38024: 25900, + 38025: 25901, + 38026: 25904, + 38027: 25905, + 38028: 25906, + 38029: 25907, + 38030: 25911, + 38031: 25914, + 38032: 25916, + 38033: 25917, + 38034: 25920, + 38035: 25921, + 38036: 25922, + 38037: 25923, + 38038: 25924, + 38039: 25926, + 38040: 25927, + 38041: 25930, + 38042: 25931, + 38043: 25933, + 38044: 25934, + 38045: 25936, + 38046: 25938, + 38047: 25939, + 38048: 25940, + 38049: 25943, + 38050: 25944, + 38051: 25946, + 38052: 25948, + 38053: 25951, + 38054: 25952, + 38055: 25953, + 38056: 25956, + 38057: 25957, + 38058: 25959, + 38059: 25960, + 38060: 25961, + 38061: 25962, + 38062: 25965, + 38063: 25966, + 38064: 25967, + 38065: 25969, + 38066: 25971, + 38067: 25973, + 38068: 25974, + 38069: 25976, + 38070: 25977, + 38071: 25978, + 38072: 25979, + 38073: 25980, + 38074: 25981, + 38075: 25982, + 38076: 25983, + 38077: 25984, + 38078: 25985, + 38079: 25986, + 38080: 25987, + 38081: 25988, + 38082: 25989, + 38083: 25990, + 38084: 25992, + 38085: 25993, + 38086: 25994, + 38087: 25997, + 38088: 25998, + 38089: 25999, + 38090: 26002, + 38091: 26004, + 38092: 26005, + 38093: 26006, + 38094: 26008, + 38095: 26010, + 38096: 26013, + 38097: 26014, + 38098: 26016, + 38099: 26018, + 38100: 26019, + 38101: 26022, + 38102: 26024, + 38103: 26026, + 38104: 26028, + 38105: 26030, + 38106: 26033, + 38107: 26034, + 38108: 26035, + 38109: 26036, + 38110: 26037, + 38111: 26038, + 38112: 26039, + 38113: 26040, + 38114: 26042, + 38115: 26043, + 38116: 26046, + 38117: 26047, + 38118: 26048, + 38119: 26050, + 38120: 26055, + 38121: 26056, + 38122: 26057, + 38123: 26058, + 38124: 26061, + 38125: 26064, + 38126: 26065, + 38127: 26067, + 38128: 26068, + 38129: 26069, + 38130: 26072, + 38131: 26073, + 38132: 26074, + 38133: 26075, + 38134: 26076, + 38135: 26077, + 38136: 26078, + 38137: 26079, + 38138: 26081, + 38139: 26083, + 38140: 26084, + 38141: 26090, + 38142: 26091, + 38208: 26098, + 38209: 26099, + 38210: 26100, + 38211: 26101, + 38212: 26104, + 38213: 26105, + 38214: 26107, + 38215: 26108, + 38216: 26109, + 38217: 26110, + 38218: 26111, + 38219: 26113, + 38220: 26116, + 38221: 26117, + 38222: 26119, + 38223: 26120, + 38224: 26121, + 38225: 26123, + 38226: 26125, + 38227: 26128, + 38228: 26129, + 38229: 26130, + 38230: 26134, + 38231: 26135, + 38232: 26136, + 38233: 26138, + 38234: 26139, + 38235: 26140, + 38236: 26142, + 38237: 26145, + 38238: 26146, + 38239: 26147, + 38240: 26148, + 38241: 26150, + 38242: 26153, + 38243: 26154, + 38244: 26155, + 38245: 26156, + 38246: 26158, + 38247: 26160, + 38248: 26162, + 38249: 26163, + 38250: 26167, + 38251: 26168, + 38252: 26169, + 38253: 26170, + 38254: 26171, + 38255: 26173, + 38256: 26175, + 38257: 26176, + 38258: 26178, + 38259: 26180, + 38260: 26181, + 38261: 26182, + 38262: 26183, + 38263: 26184, + 38264: 26185, + 38265: 26186, + 38266: 26189, + 38267: 26190, + 38268: 26192, + 38269: 26193, + 38270: 26200, + 38272: 26201, + 38273: 26203, + 38274: 26204, + 38275: 26205, + 38276: 26206, + 38277: 26208, + 38278: 26210, + 38279: 26211, + 38280: 26213, + 38281: 26215, + 38282: 26217, + 38283: 26218, + 38284: 26219, + 38285: 26220, + 38286: 26221, + 38287: 26225, + 38288: 26226, + 38289: 26227, + 38290: 26229, + 38291: 26232, + 38292: 26233, + 38293: 26235, + 38294: 26236, + 38295: 26237, + 38296: 26239, + 38297: 26240, + 38298: 26241, + 38299: 26243, + 38300: 26245, + 38301: 26246, + 38302: 26248, + 38303: 26249, + 38304: 26250, + 38305: 26251, + 38306: 26253, + 38307: 26254, + 38308: 26255, + 38309: 26256, + 38310: 26258, + 38311: 26259, + 38312: 26260, + 38313: 26261, + 38314: 26264, + 38315: 26265, + 38316: 26266, + 38317: 26267, + 38318: 26268, + 38319: 26270, + 38320: 26271, + 38321: 26272, + 38322: 26273, + 38323: 26274, + 38324: 26275, + 38325: 26276, + 38326: 26277, + 38327: 26278, + 38328: 26281, + 38329: 26282, + 38330: 26283, + 38331: 26284, + 38332: 26285, + 38333: 26287, + 38334: 26288, + 38335: 26289, + 38336: 26290, + 38337: 26291, + 38338: 26293, + 38339: 26294, + 38340: 26295, + 38341: 26296, + 38342: 26298, + 38343: 26299, + 38344: 26300, + 38345: 26301, + 38346: 26303, + 38347: 26304, + 38348: 26305, + 38349: 26306, + 38350: 26307, + 38351: 26308, + 38352: 26309, + 38353: 26310, + 38354: 26311, + 38355: 26312, + 38356: 26313, + 38357: 26314, + 38358: 26315, + 38359: 26316, + 38360: 26317, + 38361: 26318, + 38362: 26319, + 38363: 26320, + 38364: 26321, + 38365: 26322, + 38366: 26323, + 38367: 26324, + 38368: 26325, + 38369: 26326, + 38370: 26327, + 38371: 26328, + 38372: 26330, + 38373: 26334, + 38374: 26335, + 38375: 26336, + 38376: 26337, + 38377: 26338, + 38378: 26339, + 38379: 26340, + 38380: 26341, + 38381: 26343, + 38382: 26344, + 38383: 26346, + 38384: 26347, + 38385: 26348, + 38386: 26349, + 38387: 26350, + 38388: 26351, + 38389: 26353, + 38390: 26357, + 38391: 26358, + 38392: 26360, + 38393: 26362, + 38394: 26363, + 38395: 26365, + 38396: 26369, + 38397: 26370, + 38398: 26371, + 38464: 26372, + 38465: 26373, + 38466: 26374, + 38467: 26375, + 38468: 26380, + 38469: 26382, + 38470: 26383, + 38471: 26385, + 38472: 26386, + 38473: 26387, + 38474: 26390, + 38475: 26392, + 38476: 26393, + 38477: 26394, + 38478: 26396, + 38479: 26398, + 38480: 26400, + 38481: 26401, + 38482: 26402, + 38483: 26403, + 38484: 26404, + 38485: 26405, + 38486: 26407, + 38487: 26409, + 38488: 26414, + 38489: 26416, + 38490: 26418, + 38491: 26419, + 38492: 26422, + 38493: 26423, + 38494: 26424, + 38495: 26425, + 38496: 26427, + 38497: 26428, + 38498: 26430, + 38499: 26431, + 38500: 26433, + 38501: 26436, + 38502: 26437, + 38503: 26439, + 38504: 26442, + 38505: 26443, + 38506: 26445, + 38507: 26450, + 38508: 26452, + 38509: 26453, + 38510: 26455, + 38511: 26456, + 38512: 26457, + 38513: 26458, + 38514: 26459, + 38515: 26461, + 38516: 26466, + 38517: 26467, + 38518: 26468, + 38519: 26470, + 38520: 26471, + 38521: 26475, + 38522: 26476, + 38523: 26478, + 38524: 26481, + 38525: 26484, + 38526: 26486, + 38528: 26488, + 38529: 26489, + 38530: 26490, + 38531: 26491, + 38532: 26493, + 38533: 26496, + 38534: 26498, + 38535: 26499, + 38536: 26501, + 38537: 26502, + 38538: 26504, + 38539: 26506, + 38540: 26508, + 38541: 26509, + 38542: 26510, + 38543: 26511, + 38544: 26513, + 38545: 26514, + 38546: 26515, + 38547: 26516, + 38548: 26518, + 38549: 26521, + 38550: 26523, + 38551: 26527, + 38552: 26528, + 38553: 26529, + 38554: 26532, + 38555: 26534, + 38556: 26537, + 38557: 26540, + 38558: 26542, + 38559: 26545, + 38560: 26546, + 38561: 26548, + 38562: 26553, + 38563: 26554, + 38564: 26555, + 38565: 26556, + 38566: 26557, + 38567: 26558, + 38568: 26559, + 38569: 26560, + 38570: 26562, + 38571: 26565, + 38572: 26566, + 38573: 26567, + 38574: 26568, + 38575: 26569, + 38576: 26570, + 38577: 26571, + 38578: 26572, + 38579: 26573, + 38580: 26574, + 38581: 26581, + 38582: 26582, + 38583: 26583, + 38584: 26587, + 38585: 26591, + 38586: 26593, + 38587: 26595, + 38588: 26596, + 38589: 26598, + 38590: 26599, + 38591: 26600, + 38592: 26602, + 38593: 26603, + 38594: 26605, + 38595: 26606, + 38596: 26610, + 38597: 26613, + 38598: 26614, + 38599: 26615, + 38600: 26616, + 38601: 26617, + 38602: 26618, + 38603: 26619, + 38604: 26620, + 38605: 26622, + 38606: 26625, + 38607: 26626, + 38608: 26627, + 38609: 26628, + 38610: 26630, + 38611: 26637, + 38612: 26640, + 38613: 26642, + 38614: 26644, + 38615: 26645, + 38616: 26648, + 38617: 26649, + 38618: 26650, + 38619: 26651, + 38620: 26652, + 38621: 26654, + 38622: 26655, + 38623: 26656, + 38624: 26658, + 38625: 26659, + 38626: 26660, + 38627: 26661, + 38628: 26662, + 38629: 26663, + 38630: 26664, + 38631: 26667, + 38632: 26668, + 38633: 26669, + 38634: 26670, + 38635: 26671, + 38636: 26672, + 38637: 26673, + 38638: 26676, + 38639: 26677, + 38640: 26678, + 38641: 26682, + 38642: 26683, + 38643: 26687, + 38644: 26695, + 38645: 26699, + 38646: 26701, + 38647: 26703, + 38648: 26706, + 38649: 26710, + 38650: 26711, + 38651: 26712, + 38652: 26713, + 38653: 26714, + 38654: 26715, + 38720: 26716, + 38721: 26717, + 38722: 26718, + 38723: 26719, + 38724: 26730, + 38725: 26732, + 38726: 26733, + 38727: 26734, + 38728: 26735, + 38729: 26736, + 38730: 26737, + 38731: 26738, + 38732: 26739, + 38733: 26741, + 38734: 26744, + 38735: 26745, + 38736: 26746, + 38737: 26747, + 38738: 26748, + 38739: 26749, + 38740: 26750, + 38741: 26751, + 38742: 26752, + 38743: 26754, + 38744: 26756, + 38745: 26759, + 38746: 26760, + 38747: 26761, + 38748: 26762, + 38749: 26763, + 38750: 26764, + 38751: 26765, + 38752: 26766, + 38753: 26768, + 38754: 26769, + 38755: 26770, + 38756: 26772, + 38757: 26773, + 38758: 26774, + 38759: 26776, + 38760: 26777, + 38761: 26778, + 38762: 26779, + 38763: 26780, + 38764: 26781, + 38765: 26782, + 38766: 26783, + 38767: 26784, + 38768: 26785, + 38769: 26787, + 38770: 26788, + 38771: 26789, + 38772: 26793, + 38773: 26794, + 38774: 26795, + 38775: 26796, + 38776: 26798, + 38777: 26801, + 38778: 26802, + 38779: 26804, + 38780: 26806, + 38781: 26807, + 38782: 26808, + 38784: 26809, + 38785: 26810, + 38786: 26811, + 38787: 26812, + 38788: 26813, + 38789: 26814, + 38790: 26815, + 38791: 26817, + 38792: 26819, + 38793: 26820, + 38794: 26821, + 38795: 26822, + 38796: 26823, + 38797: 26824, + 38798: 26826, + 38799: 26828, + 38800: 26830, + 38801: 26831, + 38802: 26832, + 38803: 26833, + 38804: 26835, + 38805: 26836, + 38806: 26838, + 38807: 26839, + 38808: 26841, + 38809: 26843, + 38810: 26844, + 38811: 26845, + 38812: 26846, + 38813: 26847, + 38814: 26849, + 38815: 26850, + 38816: 26852, + 38817: 26853, + 38818: 26854, + 38819: 26855, + 38820: 26856, + 38821: 26857, + 38822: 26858, + 38823: 26859, + 38824: 26860, + 38825: 26861, + 38826: 26863, + 38827: 26866, + 38828: 26867, + 38829: 26868, + 38830: 26870, + 38831: 26871, + 38832: 26872, + 38833: 26875, + 38834: 26877, + 38835: 26878, + 38836: 26879, + 38837: 26880, + 38838: 26882, + 38839: 26883, + 38840: 26884, + 38841: 26886, + 38842: 26887, + 38843: 26888, + 38844: 26889, + 38845: 26890, + 38846: 26892, + 38847: 26895, + 38848: 26897, + 38849: 26899, + 38850: 26900, + 38851: 26901, + 38852: 26902, + 38853: 26903, + 38854: 26904, + 38855: 26905, + 38856: 26906, + 38857: 26907, + 38858: 26908, + 38859: 26909, + 38860: 26910, + 38861: 26913, + 38862: 26914, + 38863: 26915, + 38864: 26917, + 38865: 26918, + 38866: 26919, + 38867: 26920, + 38868: 26921, + 38869: 26922, + 38870: 26923, + 38871: 26924, + 38872: 26926, + 38873: 26927, + 38874: 26929, + 38875: 26930, + 38876: 26931, + 38877: 26933, + 38878: 26934, + 38879: 26935, + 38880: 26936, + 38881: 26938, + 38882: 26939, + 38883: 26940, + 38884: 26942, + 38885: 26944, + 38886: 26945, + 38887: 26947, + 38888: 26948, + 38889: 26949, + 38890: 26950, + 38891: 26951, + 38892: 26952, + 38893: 26953, + 38894: 26954, + 38895: 26955, + 38896: 26956, + 38897: 26957, + 38898: 26958, + 38899: 26959, + 38900: 26960, + 38901: 26961, + 38902: 26962, + 38903: 26963, + 38904: 26965, + 38905: 26966, + 38906: 26968, + 38907: 26969, + 38908: 26971, + 38909: 26972, + 38910: 26975, + 38976: 26977, + 38977: 26978, + 38978: 26980, + 38979: 26981, + 38980: 26983, + 38981: 26984, + 38982: 26985, + 38983: 26986, + 38984: 26988, + 38985: 26989, + 38986: 26991, + 38987: 26992, + 38988: 26994, + 38989: 26995, + 38990: 26996, + 38991: 26997, + 38992: 26998, + 38993: 27002, + 38994: 27003, + 38995: 27005, + 38996: 27006, + 38997: 27007, + 38998: 27009, + 38999: 27011, + 39000: 27013, + 39001: 27018, + 39002: 27019, + 39003: 27020, + 39004: 27022, + 39005: 27023, + 39006: 27024, + 39007: 27025, + 39008: 27026, + 39009: 27027, + 39010: 27030, + 39011: 27031, + 39012: 27033, + 39013: 27034, + 39014: 27037, + 39015: 27038, + 39016: 27039, + 39017: 27040, + 39018: 27041, + 39019: 27042, + 39020: 27043, + 39021: 27044, + 39022: 27045, + 39023: 27046, + 39024: 27049, + 39025: 27050, + 39026: 27052, + 39027: 27054, + 39028: 27055, + 39029: 27056, + 39030: 27058, + 39031: 27059, + 39032: 27061, + 39033: 27062, + 39034: 27064, + 39035: 27065, + 39036: 27066, + 39037: 27068, + 39038: 27069, + 39040: 27070, + 39041: 27071, + 39042: 27072, + 39043: 27074, + 39044: 27075, + 39045: 27076, + 39046: 27077, + 39047: 27078, + 39048: 27079, + 39049: 27080, + 39050: 27081, + 39051: 27083, + 39052: 27085, + 39053: 27087, + 39054: 27089, + 39055: 27090, + 39056: 27091, + 39057: 27093, + 39058: 27094, + 39059: 27095, + 39060: 27096, + 39061: 27097, + 39062: 27098, + 39063: 27100, + 39064: 27101, + 39065: 27102, + 39066: 27105, + 39067: 27106, + 39068: 27107, + 39069: 27108, + 39070: 27109, + 39071: 27110, + 39072: 27111, + 39073: 27112, + 39074: 27113, + 39075: 27114, + 39076: 27115, + 39077: 27116, + 39078: 27118, + 39079: 27119, + 39080: 27120, + 39081: 27121, + 39082: 27123, + 39083: 27124, + 39084: 27125, + 39085: 27126, + 39086: 27127, + 39087: 27128, + 39088: 27129, + 39089: 27130, + 39090: 27131, + 39091: 27132, + 39092: 27134, + 39093: 27136, + 39094: 27137, + 39095: 27138, + 39096: 27139, + 39097: 27140, + 39098: 27141, + 39099: 27142, + 39100: 27143, + 39101: 27144, + 39102: 27145, + 39103: 27147, + 39104: 27148, + 39105: 27149, + 39106: 27150, + 39107: 27151, + 39108: 27152, + 39109: 27153, + 39110: 27154, + 39111: 27155, + 39112: 27156, + 39113: 27157, + 39114: 27158, + 39115: 27161, + 39116: 27162, + 39117: 27163, + 39118: 27164, + 39119: 27165, + 39120: 27166, + 39121: 27168, + 39122: 27170, + 39123: 27171, + 39124: 27172, + 39125: 27173, + 39126: 27174, + 39127: 27175, + 39128: 27177, + 39129: 27179, + 39130: 27180, + 39131: 27181, + 39132: 27182, + 39133: 27184, + 39134: 27186, + 39135: 27187, + 39136: 27188, + 39137: 27190, + 39138: 27191, + 39139: 27192, + 39140: 27193, + 39141: 27194, + 39142: 27195, + 39143: 27196, + 39144: 27199, + 39145: 27200, + 39146: 27201, + 39147: 27202, + 39148: 27203, + 39149: 27205, + 39150: 27206, + 39151: 27208, + 39152: 27209, + 39153: 27210, + 39154: 27211, + 39155: 27212, + 39156: 27213, + 39157: 27214, + 39158: 27215, + 39159: 27217, + 39160: 27218, + 39161: 27219, + 39162: 27220, + 39163: 27221, + 39164: 27222, + 39165: 27223, + 39166: 27226, + 39232: 27228, + 39233: 27229, + 39234: 27230, + 39235: 27231, + 39236: 27232, + 39237: 27234, + 39238: 27235, + 39239: 27236, + 39240: 27238, + 39241: 27239, + 39242: 27240, + 39243: 27241, + 39244: 27242, + 39245: 27243, + 39246: 27244, + 39247: 27245, + 39248: 27246, + 39249: 27247, + 39250: 27248, + 39251: 27250, + 39252: 27251, + 39253: 27252, + 39254: 27253, + 39255: 27254, + 39256: 27255, + 39257: 27256, + 39258: 27258, + 39259: 27259, + 39260: 27261, + 39261: 27262, + 39262: 27263, + 39263: 27265, + 39264: 27266, + 39265: 27267, + 39266: 27269, + 39267: 27270, + 39268: 27271, + 39269: 27272, + 39270: 27273, + 39271: 27274, + 39272: 27275, + 39273: 27276, + 39274: 27277, + 39275: 27279, + 39276: 27282, + 39277: 27283, + 39278: 27284, + 39279: 27285, + 39280: 27286, + 39281: 27288, + 39282: 27289, + 39283: 27290, + 39284: 27291, + 39285: 27292, + 39286: 27293, + 39287: 27294, + 39288: 27295, + 39289: 27297, + 39290: 27298, + 39291: 27299, + 39292: 27300, + 39293: 27301, + 39294: 27302, + 39296: 27303, + 39297: 27304, + 39298: 27306, + 39299: 27309, + 39300: 27310, + 39301: 27311, + 39302: 27312, + 39303: 27313, + 39304: 27314, + 39305: 27315, + 39306: 27316, + 39307: 27317, + 39308: 27318, + 39309: 27319, + 39310: 27320, + 39311: 27321, + 39312: 27322, + 39313: 27323, + 39314: 27324, + 39315: 27325, + 39316: 27326, + 39317: 27327, + 39318: 27328, + 39319: 27329, + 39320: 27330, + 39321: 27331, + 39322: 27332, + 39323: 27333, + 39324: 27334, + 39325: 27335, + 39326: 27336, + 39327: 27337, + 39328: 27338, + 39329: 27339, + 39330: 27340, + 39331: 27341, + 39332: 27342, + 39333: 27343, + 39334: 27344, + 39335: 27345, + 39336: 27346, + 39337: 27347, + 39338: 27348, + 39339: 27349, + 39340: 27350, + 39341: 27351, + 39342: 27352, + 39343: 27353, + 39344: 27354, + 39345: 27355, + 39346: 27356, + 39347: 27357, + 39348: 27358, + 39349: 27359, + 39350: 27360, + 39351: 27361, + 39352: 27362, + 39353: 27363, + 39354: 27364, + 39355: 27365, + 39356: 27366, + 39357: 27367, + 39358: 27368, + 39359: 27369, + 39360: 27370, + 39361: 27371, + 39362: 27372, + 39363: 27373, + 39364: 27374, + 39365: 27375, + 39366: 27376, + 39367: 27377, + 39368: 27378, + 39369: 27379, + 39370: 27380, + 39371: 27381, + 39372: 27382, + 39373: 27383, + 39374: 27384, + 39375: 27385, + 39376: 27386, + 39377: 27387, + 39378: 27388, + 39379: 27389, + 39380: 27390, + 39381: 27391, + 39382: 27392, + 39383: 27393, + 39384: 27394, + 39385: 27395, + 39386: 27396, + 39387: 27397, + 39388: 27398, + 39389: 27399, + 39390: 27400, + 39391: 27401, + 39392: 27402, + 39393: 27403, + 39394: 27404, + 39395: 27405, + 39396: 27406, + 39397: 27407, + 39398: 27408, + 39399: 27409, + 39400: 27410, + 39401: 27411, + 39402: 27412, + 39403: 27413, + 39404: 27414, + 39405: 27415, + 39406: 27416, + 39407: 27417, + 39408: 27418, + 39409: 27419, + 39410: 27420, + 39411: 27421, + 39412: 27422, + 39413: 27423, + 39414: 27429, + 39415: 27430, + 39416: 27432, + 39417: 27433, + 39418: 27434, + 39419: 27435, + 39420: 27436, + 39421: 27437, + 39422: 27438, + 39488: 27439, + 39489: 27440, + 39490: 27441, + 39491: 27443, + 39492: 27444, + 39493: 27445, + 39494: 27446, + 39495: 27448, + 39496: 27451, + 39497: 27452, + 39498: 27453, + 39499: 27455, + 39500: 27456, + 39501: 27457, + 39502: 27458, + 39503: 27460, + 39504: 27461, + 39505: 27464, + 39506: 27466, + 39507: 27467, + 39508: 27469, + 39509: 27470, + 39510: 27471, + 39511: 27472, + 39512: 27473, + 39513: 27474, + 39514: 27475, + 39515: 27476, + 39516: 27477, + 39517: 27478, + 39518: 27479, + 39519: 27480, + 39520: 27482, + 39521: 27483, + 39522: 27484, + 39523: 27485, + 39524: 27486, + 39525: 27487, + 39526: 27488, + 39527: 27489, + 39528: 27496, + 39529: 27497, + 39530: 27499, + 39531: 27500, + 39532: 27501, + 39533: 27502, + 39534: 27503, + 39535: 27504, + 39536: 27505, + 39537: 27506, + 39538: 27507, + 39539: 27508, + 39540: 27509, + 39541: 27510, + 39542: 27511, + 39543: 27512, + 39544: 27514, + 39545: 27517, + 39546: 27518, + 39547: 27519, + 39548: 27520, + 39549: 27525, + 39550: 27528, + 39552: 27532, + 39553: 27534, + 39554: 27535, + 39555: 27536, + 39556: 27537, + 39557: 27540, + 39558: 27541, + 39559: 27543, + 39560: 27544, + 39561: 27545, + 39562: 27548, + 39563: 27549, + 39564: 27550, + 39565: 27551, + 39566: 27552, + 39567: 27554, + 39568: 27555, + 39569: 27556, + 39570: 27557, + 39571: 27558, + 39572: 27559, + 39573: 27560, + 39574: 27561, + 39575: 27563, + 39576: 27564, + 39577: 27565, + 39578: 27566, + 39579: 27567, + 39580: 27568, + 39581: 27569, + 39582: 27570, + 39583: 27574, + 39584: 27576, + 39585: 27577, + 39586: 27578, + 39587: 27579, + 39588: 27580, + 39589: 27581, + 39590: 27582, + 39591: 27584, + 39592: 27587, + 39593: 27588, + 39594: 27590, + 39595: 27591, + 39596: 27592, + 39597: 27593, + 39598: 27594, + 39599: 27596, + 39600: 27598, + 39601: 27600, + 39602: 27601, + 39603: 27608, + 39604: 27610, + 39605: 27612, + 39606: 27613, + 39607: 27614, + 39608: 27615, + 39609: 27616, + 39610: 27618, + 39611: 27619, + 39612: 27620, + 39613: 27621, + 39614: 27622, + 39615: 27623, + 39616: 27624, + 39617: 27625, + 39618: 27628, + 39619: 27629, + 39620: 27630, + 39621: 27632, + 39622: 27633, + 39623: 27634, + 39624: 27636, + 39625: 27638, + 39626: 27639, + 39627: 27640, + 39628: 27642, + 39629: 27643, + 39630: 27644, + 39631: 27646, + 39632: 27647, + 39633: 27648, + 39634: 27649, + 39635: 27650, + 39636: 27651, + 39637: 27652, + 39638: 27656, + 39639: 27657, + 39640: 27658, + 39641: 27659, + 39642: 27660, + 39643: 27662, + 39644: 27666, + 39645: 27671, + 39646: 27676, + 39647: 27677, + 39648: 27678, + 39649: 27680, + 39650: 27683, + 39651: 27685, + 39652: 27691, + 39653: 27692, + 39654: 27693, + 39655: 27697, + 39656: 27699, + 39657: 27702, + 39658: 27703, + 39659: 27705, + 39660: 27706, + 39661: 27707, + 39662: 27708, + 39663: 27710, + 39664: 27711, + 39665: 27715, + 39666: 27716, + 39667: 27717, + 39668: 27720, + 39669: 27723, + 39670: 27724, + 39671: 27725, + 39672: 27726, + 39673: 27727, + 39674: 27729, + 39675: 27730, + 39676: 27731, + 39677: 27734, + 39678: 27736, + 39744: 27737, + 39745: 27738, + 39746: 27746, + 39747: 27747, + 39748: 27749, + 39749: 27750, + 39750: 27751, + 39751: 27755, + 39752: 27756, + 39753: 27757, + 39754: 27758, + 39755: 27759, + 39756: 27761, + 39757: 27763, + 39758: 27765, + 39759: 27767, + 39760: 27768, + 39761: 27770, + 39762: 27771, + 39763: 27772, + 39764: 27775, + 39765: 27776, + 39766: 27780, + 39767: 27783, + 39768: 27786, + 39769: 27787, + 39770: 27789, + 39771: 27790, + 39772: 27793, + 39773: 27794, + 39774: 27797, + 39775: 27798, + 39776: 27799, + 39777: 27800, + 39778: 27802, + 39779: 27804, + 39780: 27805, + 39781: 27806, + 39782: 27808, + 39783: 27810, + 39784: 27816, + 39785: 27820, + 39786: 27823, + 39787: 27824, + 39788: 27828, + 39789: 27829, + 39790: 27830, + 39791: 27831, + 39792: 27834, + 39793: 27840, + 39794: 27841, + 39795: 27842, + 39796: 27843, + 39797: 27846, + 39798: 27847, + 39799: 27848, + 39800: 27851, + 39801: 27853, + 39802: 27854, + 39803: 27855, + 39804: 27857, + 39805: 27858, + 39806: 27864, + 39808: 27865, + 39809: 27866, + 39810: 27868, + 39811: 27869, + 39812: 27871, + 39813: 27876, + 39814: 27878, + 39815: 27879, + 39816: 27881, + 39817: 27884, + 39818: 27885, + 39819: 27890, + 39820: 27892, + 39821: 27897, + 39822: 27903, + 39823: 27904, + 39824: 27906, + 39825: 27907, + 39826: 27909, + 39827: 27910, + 39828: 27912, + 39829: 27913, + 39830: 27914, + 39831: 27917, + 39832: 27919, + 39833: 27920, + 39834: 27921, + 39835: 27923, + 39836: 27924, + 39837: 27925, + 39838: 27926, + 39839: 27928, + 39840: 27932, + 39841: 27933, + 39842: 27935, + 39843: 27936, + 39844: 27937, + 39845: 27938, + 39846: 27939, + 39847: 27940, + 39848: 27942, + 39849: 27944, + 39850: 27945, + 39851: 27948, + 39852: 27949, + 39853: 27951, + 39854: 27952, + 39855: 27956, + 39856: 27958, + 39857: 27959, + 39858: 27960, + 39859: 27962, + 39860: 27967, + 39861: 27968, + 39862: 27970, + 39863: 27972, + 39864: 27977, + 39865: 27980, + 39866: 27984, + 39867: 27989, + 39868: 27990, + 39869: 27991, + 39870: 27992, + 39871: 27995, + 39872: 27997, + 39873: 27999, + 39874: 28001, + 39875: 28002, + 39876: 28004, + 39877: 28005, + 39878: 28007, + 39879: 28008, + 39880: 28011, + 39881: 28012, + 39882: 28013, + 39883: 28016, + 39884: 28017, + 39885: 28018, + 39886: 28019, + 39887: 28021, + 39888: 28022, + 39889: 28025, + 39890: 28026, + 39891: 28027, + 39892: 28029, + 39893: 28030, + 39894: 28031, + 39895: 28032, + 39896: 28033, + 39897: 28035, + 39898: 28036, + 39899: 28038, + 39900: 28039, + 39901: 28042, + 39902: 28043, + 39903: 28045, + 39904: 28047, + 39905: 28048, + 39906: 28050, + 39907: 28054, + 39908: 28055, + 39909: 28056, + 39910: 28057, + 39911: 28058, + 39912: 28060, + 39913: 28066, + 39914: 28069, + 39915: 28076, + 39916: 28077, + 39917: 28080, + 39918: 28081, + 39919: 28083, + 39920: 28084, + 39921: 28086, + 39922: 28087, + 39923: 28089, + 39924: 28090, + 39925: 28091, + 39926: 28092, + 39927: 28093, + 39928: 28094, + 39929: 28097, + 39930: 28098, + 39931: 28099, + 39932: 28104, + 39933: 28105, + 39934: 28106, + 40000: 28109, + 40001: 28110, + 40002: 28111, + 40003: 28112, + 40004: 28114, + 40005: 28115, + 40006: 28116, + 40007: 28117, + 40008: 28119, + 40009: 28122, + 40010: 28123, + 40011: 28124, + 40012: 28127, + 40013: 28130, + 40014: 28131, + 40015: 28133, + 40016: 28135, + 40017: 28136, + 40018: 28137, + 40019: 28138, + 40020: 28141, + 40021: 28143, + 40022: 28144, + 40023: 28146, + 40024: 28148, + 40025: 28149, + 40026: 28150, + 40027: 28152, + 40028: 28154, + 40029: 28157, + 40030: 28158, + 40031: 28159, + 40032: 28160, + 40033: 28161, + 40034: 28162, + 40035: 28163, + 40036: 28164, + 40037: 28166, + 40038: 28167, + 40039: 28168, + 40040: 28169, + 40041: 28171, + 40042: 28175, + 40043: 28178, + 40044: 28179, + 40045: 28181, + 40046: 28184, + 40047: 28185, + 40048: 28187, + 40049: 28188, + 40050: 28190, + 40051: 28191, + 40052: 28194, + 40053: 28198, + 40054: 28199, + 40055: 28200, + 40056: 28202, + 40057: 28204, + 40058: 28206, + 40059: 28208, + 40060: 28209, + 40061: 28211, + 40062: 28213, + 40064: 28214, + 40065: 28215, + 40066: 28217, + 40067: 28219, + 40068: 28220, + 40069: 28221, + 40070: 28222, + 40071: 28223, + 40072: 28224, + 40073: 28225, + 40074: 28226, + 40075: 28229, + 40076: 28230, + 40077: 28231, + 40078: 28232, + 40079: 28233, + 40080: 28234, + 40081: 28235, + 40082: 28236, + 40083: 28239, + 40084: 28240, + 40085: 28241, + 40086: 28242, + 40087: 28245, + 40088: 28247, + 40089: 28249, + 40090: 28250, + 40091: 28252, + 40092: 28253, + 40093: 28254, + 40094: 28256, + 40095: 28257, + 40096: 28258, + 40097: 28259, + 40098: 28260, + 40099: 28261, + 40100: 28262, + 40101: 28263, + 40102: 28264, + 40103: 28265, + 40104: 28266, + 40105: 28268, + 40106: 28269, + 40107: 28271, + 40108: 28272, + 40109: 28273, + 40110: 28274, + 40111: 28275, + 40112: 28276, + 40113: 28277, + 40114: 28278, + 40115: 28279, + 40116: 28280, + 40117: 28281, + 40118: 28282, + 40119: 28283, + 40120: 28284, + 40121: 28285, + 40122: 28288, + 40123: 28289, + 40124: 28290, + 40125: 28292, + 40126: 28295, + 40127: 28296, + 40128: 28298, + 40129: 28299, + 40130: 28300, + 40131: 28301, + 40132: 28302, + 40133: 28305, + 40134: 28306, + 40135: 28307, + 40136: 28308, + 40137: 28309, + 40138: 28310, + 40139: 28311, + 40140: 28313, + 40141: 28314, + 40142: 28315, + 40143: 28317, + 40144: 28318, + 40145: 28320, + 40146: 28321, + 40147: 28323, + 40148: 28324, + 40149: 28326, + 40150: 28328, + 40151: 28329, + 40152: 28331, + 40153: 28332, + 40154: 28333, + 40155: 28334, + 40156: 28336, + 40157: 28339, + 40158: 28341, + 40159: 28344, + 40160: 28345, + 40161: 28348, + 40162: 28350, + 40163: 28351, + 40164: 28352, + 40165: 28355, + 40166: 28356, + 40167: 28357, + 40168: 28358, + 40169: 28360, + 40170: 28361, + 40171: 28362, + 40172: 28364, + 40173: 28365, + 40174: 28366, + 40175: 28368, + 40176: 28370, + 40177: 28374, + 40178: 28376, + 40179: 28377, + 40180: 28379, + 40181: 28380, + 40182: 28381, + 40183: 28387, + 40184: 28391, + 40185: 28394, + 40186: 28395, + 40187: 28396, + 40188: 28397, + 40189: 28398, + 40190: 28399, + 40256: 28400, + 40257: 28401, + 40258: 28402, + 40259: 28403, + 40260: 28405, + 40261: 28406, + 40262: 28407, + 40263: 28408, + 40264: 28410, + 40265: 28411, + 40266: 28412, + 40267: 28413, + 40268: 28414, + 40269: 28415, + 40270: 28416, + 40271: 28417, + 40272: 28419, + 40273: 28420, + 40274: 28421, + 40275: 28423, + 40276: 28424, + 40277: 28426, + 40278: 28427, + 40279: 28428, + 40280: 28429, + 40281: 28430, + 40282: 28432, + 40283: 28433, + 40284: 28434, + 40285: 28438, + 40286: 28439, + 40287: 28440, + 40288: 28441, + 40289: 28442, + 40290: 28443, + 40291: 28444, + 40292: 28445, + 40293: 28446, + 40294: 28447, + 40295: 28449, + 40296: 28450, + 40297: 28451, + 40298: 28453, + 40299: 28454, + 40300: 28455, + 40301: 28456, + 40302: 28460, + 40303: 28462, + 40304: 28464, + 40305: 28466, + 40306: 28468, + 40307: 28469, + 40308: 28471, + 40309: 28472, + 40310: 28473, + 40311: 28474, + 40312: 28475, + 40313: 28476, + 40314: 28477, + 40315: 28479, + 40316: 28480, + 40317: 28481, + 40318: 28482, + 40320: 28483, + 40321: 28484, + 40322: 28485, + 40323: 28488, + 40324: 28489, + 40325: 28490, + 40326: 28492, + 40327: 28494, + 40328: 28495, + 40329: 28496, + 40330: 28497, + 40331: 28498, + 40332: 28499, + 40333: 28500, + 40334: 28501, + 40335: 28502, + 40336: 28503, + 40337: 28505, + 40338: 28506, + 40339: 28507, + 40340: 28509, + 40341: 28511, + 40342: 28512, + 40343: 28513, + 40344: 28515, + 40345: 28516, + 40346: 28517, + 40347: 28519, + 40348: 28520, + 40349: 28521, + 40350: 28522, + 40351: 28523, + 40352: 28524, + 40353: 28527, + 40354: 28528, + 40355: 28529, + 40356: 28531, + 40357: 28533, + 40358: 28534, + 40359: 28535, + 40360: 28537, + 40361: 28539, + 40362: 28541, + 40363: 28542, + 40364: 28543, + 40365: 28544, + 40366: 28545, + 40367: 28546, + 40368: 28547, + 40369: 28549, + 40370: 28550, + 40371: 28551, + 40372: 28554, + 40373: 28555, + 40374: 28559, + 40375: 28560, + 40376: 28561, + 40377: 28562, + 40378: 28563, + 40379: 28564, + 40380: 28565, + 40381: 28566, + 40382: 28567, + 40383: 28568, + 40384: 28569, + 40385: 28570, + 40386: 28571, + 40387: 28573, + 40388: 28574, + 40389: 28575, + 40390: 28576, + 40391: 28578, + 40392: 28579, + 40393: 28580, + 40394: 28581, + 40395: 28582, + 40396: 28584, + 40397: 28585, + 40398: 28586, + 40399: 28587, + 40400: 28588, + 40401: 28589, + 40402: 28590, + 40403: 28591, + 40404: 28592, + 40405: 28593, + 40406: 28594, + 40407: 28596, + 40408: 28597, + 40409: 28599, + 40410: 28600, + 40411: 28602, + 40412: 28603, + 40413: 28604, + 40414: 28605, + 40415: 28606, + 40416: 28607, + 40417: 28609, + 40418: 28611, + 40419: 28612, + 40420: 28613, + 40421: 28614, + 40422: 28615, + 40423: 28616, + 40424: 28618, + 40425: 28619, + 40426: 28620, + 40427: 28621, + 40428: 28622, + 40429: 28623, + 40430: 28624, + 40431: 28627, + 40432: 28628, + 40433: 28629, + 40434: 28630, + 40435: 28631, + 40436: 28632, + 40437: 28633, + 40438: 28634, + 40439: 28635, + 40440: 28636, + 40441: 28637, + 40442: 28639, + 40443: 28642, + 40444: 28643, + 40445: 28644, + 40446: 28645, + 40512: 28646, + 40513: 28647, + 40514: 28648, + 40515: 28649, + 40516: 28650, + 40517: 28651, + 40518: 28652, + 40519: 28653, + 40520: 28656, + 40521: 28657, + 40522: 28658, + 40523: 28659, + 40524: 28660, + 40525: 28661, + 40526: 28662, + 40527: 28663, + 40528: 28664, + 40529: 28665, + 40530: 28666, + 40531: 28667, + 40532: 28668, + 40533: 28669, + 40534: 28670, + 40535: 28671, + 40536: 28672, + 40537: 28673, + 40538: 28674, + 40539: 28675, + 40540: 28676, + 40541: 28677, + 40542: 28678, + 40543: 28679, + 40544: 28680, + 40545: 28681, + 40546: 28682, + 40547: 28683, + 40548: 28684, + 40549: 28685, + 40550: 28686, + 40551: 28687, + 40552: 28688, + 40553: 28690, + 40554: 28691, + 40555: 28692, + 40556: 28693, + 40557: 28694, + 40558: 28695, + 40559: 28696, + 40560: 28697, + 40561: 28700, + 40562: 28701, + 40563: 28702, + 40564: 28703, + 40565: 28704, + 40566: 28705, + 40567: 28706, + 40568: 28708, + 40569: 28709, + 40570: 28710, + 40571: 28711, + 40572: 28712, + 40573: 28713, + 40574: 28714, + 40576: 28715, + 40577: 28716, + 40578: 28717, + 40579: 28718, + 40580: 28719, + 40581: 28720, + 40582: 28721, + 40583: 28722, + 40584: 28723, + 40585: 28724, + 40586: 28726, + 40587: 28727, + 40588: 28728, + 40589: 28730, + 40590: 28731, + 40591: 28732, + 40592: 28733, + 40593: 28734, + 40594: 28735, + 40595: 28736, + 40596: 28737, + 40597: 28738, + 40598: 28739, + 40599: 28740, + 40600: 28741, + 40601: 28742, + 40602: 28743, + 40603: 28744, + 40604: 28745, + 40605: 28746, + 40606: 28747, + 40607: 28749, + 40608: 28750, + 40609: 28752, + 40610: 28753, + 40611: 28754, + 40612: 28755, + 40613: 28756, + 40614: 28757, + 40615: 28758, + 40616: 28759, + 40617: 28760, + 40618: 28761, + 40619: 28762, + 40620: 28763, + 40621: 28764, + 40622: 28765, + 40623: 28767, + 40624: 28768, + 40625: 28769, + 40626: 28770, + 40627: 28771, + 40628: 28772, + 40629: 28773, + 40630: 28774, + 40631: 28775, + 40632: 28776, + 40633: 28777, + 40634: 28778, + 40635: 28782, + 40636: 28785, + 40637: 28786, + 40638: 28787, + 40639: 28788, + 40640: 28791, + 40641: 28793, + 40642: 28794, + 40643: 28795, + 40644: 28797, + 40645: 28801, + 40646: 28802, + 40647: 28803, + 40648: 28804, + 40649: 28806, + 40650: 28807, + 40651: 28808, + 40652: 28811, + 40653: 28812, + 40654: 28813, + 40655: 28815, + 40656: 28816, + 40657: 28817, + 40658: 28819, + 40659: 28823, + 40660: 28824, + 40661: 28826, + 40662: 28827, + 40663: 28830, + 40664: 28831, + 40665: 28832, + 40666: 28833, + 40667: 28834, + 40668: 28835, + 40669: 28836, + 40670: 28837, + 40671: 28838, + 40672: 28839, + 40673: 28840, + 40674: 28841, + 40675: 28842, + 40676: 28848, + 40677: 28850, + 40678: 28852, + 40679: 28853, + 40680: 28854, + 40681: 28858, + 40682: 28862, + 40683: 28863, + 40684: 28868, + 40685: 28869, + 40686: 28870, + 40687: 28871, + 40688: 28873, + 40689: 28875, + 40690: 28876, + 40691: 28877, + 40692: 28878, + 40693: 28879, + 40694: 28880, + 40695: 28881, + 40696: 28882, + 40697: 28883, + 40698: 28884, + 40699: 28885, + 40700: 28886, + 40701: 28887, + 40702: 28890, + 40768: 28892, + 40769: 28893, + 40770: 28894, + 40771: 28896, + 40772: 28897, + 40773: 28898, + 40774: 28899, + 40775: 28901, + 40776: 28906, + 40777: 28910, + 40778: 28912, + 40779: 28913, + 40780: 28914, + 40781: 28915, + 40782: 28916, + 40783: 28917, + 40784: 28918, + 40785: 28920, + 40786: 28922, + 40787: 28923, + 40788: 28924, + 40789: 28926, + 40790: 28927, + 40791: 28928, + 40792: 28929, + 40793: 28930, + 40794: 28931, + 40795: 28932, + 40796: 28933, + 40797: 28934, + 40798: 28935, + 40799: 28936, + 40800: 28939, + 40801: 28940, + 40802: 28941, + 40803: 28942, + 40804: 28943, + 40805: 28945, + 40806: 28946, + 40807: 28948, + 40808: 28951, + 40809: 28955, + 40810: 28956, + 40811: 28957, + 40812: 28958, + 40813: 28959, + 40814: 28960, + 40815: 28961, + 40816: 28962, + 40817: 28963, + 40818: 28964, + 40819: 28965, + 40820: 28967, + 40821: 28968, + 40822: 28969, + 40823: 28970, + 40824: 28971, + 40825: 28972, + 40826: 28973, + 40827: 28974, + 40828: 28978, + 40829: 28979, + 40830: 28980, + 40832: 28981, + 40833: 28983, + 40834: 28984, + 40835: 28985, + 40836: 28986, + 40837: 28987, + 40838: 28988, + 40839: 28989, + 40840: 28990, + 40841: 28991, + 40842: 28992, + 40843: 28993, + 40844: 28994, + 40845: 28995, + 40846: 28996, + 40847: 28998, + 40848: 28999, + 40849: 29000, + 40850: 29001, + 40851: 29003, + 40852: 29005, + 40853: 29007, + 40854: 29008, + 40855: 29009, + 40856: 29010, + 40857: 29011, + 40858: 29012, + 40859: 29013, + 40860: 29014, + 40861: 29015, + 40862: 29016, + 40863: 29017, + 40864: 29018, + 40865: 29019, + 40866: 29021, + 40867: 29023, + 40868: 29024, + 40869: 29025, + 40870: 29026, + 40871: 29027, + 40872: 29029, + 40873: 29033, + 40874: 29034, + 40875: 29035, + 40876: 29036, + 40877: 29037, + 40878: 29039, + 40879: 29040, + 40880: 29041, + 40881: 29044, + 40882: 29045, + 40883: 29046, + 40884: 29047, + 40885: 29049, + 40886: 29051, + 40887: 29052, + 40888: 29054, + 40889: 29055, + 40890: 29056, + 40891: 29057, + 40892: 29058, + 40893: 29059, + 40894: 29061, + 40895: 29062, + 40896: 29063, + 40897: 29064, + 40898: 29065, + 40899: 29067, + 40900: 29068, + 40901: 29069, + 40902: 29070, + 40903: 29072, + 40904: 29073, + 40905: 29074, + 40906: 29075, + 40907: 29077, + 40908: 29078, + 40909: 29079, + 40910: 29082, + 40911: 29083, + 40912: 29084, + 40913: 29085, + 40914: 29086, + 40915: 29089, + 40916: 29090, + 40917: 29091, + 40918: 29092, + 40919: 29093, + 40920: 29094, + 40921: 29095, + 40922: 29097, + 40923: 29098, + 40924: 29099, + 40925: 29101, + 40926: 29102, + 40927: 29103, + 40928: 29104, + 40929: 29105, + 40930: 29106, + 40931: 29108, + 40932: 29110, + 40933: 29111, + 40934: 29112, + 40935: 29114, + 40936: 29115, + 40937: 29116, + 40938: 29117, + 40939: 29118, + 40940: 29119, + 40941: 29120, + 40942: 29121, + 40943: 29122, + 40944: 29124, + 40945: 29125, + 40946: 29126, + 40947: 29127, + 40948: 29128, + 40949: 29129, + 40950: 29130, + 40951: 29131, + 40952: 29132, + 40953: 29133, + 40954: 29135, + 40955: 29136, + 40956: 29137, + 40957: 29138, + 40958: 29139, + 41024: 29142, + 41025: 29143, + 41026: 29144, + 41027: 29145, + 41028: 29146, + 41029: 29147, + 41030: 29148, + 41031: 29149, + 41032: 29150, + 41033: 29151, + 41034: 29153, + 41035: 29154, + 41036: 29155, + 41037: 29156, + 41038: 29158, + 41039: 29160, + 41040: 29161, + 41041: 29162, + 41042: 29163, + 41043: 29164, + 41044: 29165, + 41045: 29167, + 41046: 29168, + 41047: 29169, + 41048: 29170, + 41049: 29171, + 41050: 29172, + 41051: 29173, + 41052: 29174, + 41053: 29175, + 41054: 29176, + 41055: 29178, + 41056: 29179, + 41057: 29180, + 41058: 29181, + 41059: 29182, + 41060: 29183, + 41061: 29184, + 41062: 29185, + 41063: 29186, + 41064: 29187, + 41065: 29188, + 41066: 29189, + 41067: 29191, + 41068: 29192, + 41069: 29193, + 41070: 29194, + 41071: 29195, + 41072: 29196, + 41073: 29197, + 41074: 29198, + 41075: 29199, + 41076: 29200, + 41077: 29201, + 41078: 29202, + 41079: 29203, + 41080: 29204, + 41081: 29205, + 41082: 29206, + 41083: 29207, + 41084: 29208, + 41085: 29209, + 41086: 29210, + 41088: 29211, + 41089: 29212, + 41090: 29214, + 41091: 29215, + 41092: 29216, + 41093: 29217, + 41094: 29218, + 41095: 29219, + 41096: 29220, + 41097: 29221, + 41098: 29222, + 41099: 29223, + 41100: 29225, + 41101: 29227, + 41102: 29229, + 41103: 29230, + 41104: 29231, + 41105: 29234, + 41106: 29235, + 41107: 29236, + 41108: 29242, + 41109: 29244, + 41110: 29246, + 41111: 29248, + 41112: 29249, + 41113: 29250, + 41114: 29251, + 41115: 29252, + 41116: 29253, + 41117: 29254, + 41118: 29257, + 41119: 29258, + 41120: 29259, + 41121: 29262, + 41122: 29263, + 41123: 29264, + 41124: 29265, + 41125: 29267, + 41126: 29268, + 41127: 29269, + 41128: 29271, + 41129: 29272, + 41130: 29274, + 41131: 29276, + 41132: 29278, + 41133: 29280, + 41134: 29283, + 41135: 29284, + 41136: 29285, + 41137: 29288, + 41138: 29290, + 41139: 29291, + 41140: 29292, + 41141: 29293, + 41142: 29296, + 41143: 29297, + 41144: 29299, + 41145: 29300, + 41146: 29302, + 41147: 29303, + 41148: 29304, + 41149: 29307, + 41150: 29308, + 41151: 29309, + 41152: 29314, + 41153: 29315, + 41154: 29317, + 41155: 29318, + 41156: 29319, + 41157: 29320, + 41158: 29321, + 41159: 29324, + 41160: 29326, + 41161: 29328, + 41162: 29329, + 41163: 29331, + 41164: 29332, + 41165: 29333, + 41166: 29334, + 41167: 29335, + 41168: 29336, + 41169: 29337, + 41170: 29338, + 41171: 29339, + 41172: 29340, + 41173: 29341, + 41174: 29342, + 41175: 29344, + 41176: 29345, + 41177: 29346, + 41178: 29347, + 41179: 29348, + 41180: 29349, + 41181: 29350, + 41182: 29351, + 41183: 29352, + 41184: 29353, + 41185: 29354, + 41186: 29355, + 41187: 29358, + 41188: 29361, + 41189: 29362, + 41190: 29363, + 41191: 29365, + 41192: 29370, + 41193: 29371, + 41194: 29372, + 41195: 29373, + 41196: 29374, + 41197: 29375, + 41198: 29376, + 41199: 29381, + 41200: 29382, + 41201: 29383, + 41202: 29385, + 41203: 29386, + 41204: 29387, + 41205: 29388, + 41206: 29391, + 41207: 29393, + 41208: 29395, + 41209: 29396, + 41210: 29397, + 41211: 29398, + 41212: 29400, + 41213: 29402, + 41214: 29403, + 41280: 58566, + 41281: 58567, + 41282: 58568, + 41283: 58569, + 41284: 58570, + 41285: 58571, + 41286: 58572, + 41287: 58573, + 41288: 58574, + 41289: 58575, + 41290: 58576, + 41291: 58577, + 41292: 58578, + 41293: 58579, + 41294: 58580, + 41295: 58581, + 41296: 58582, + 41297: 58583, + 41298: 58584, + 41299: 58585, + 41300: 58586, + 41301: 58587, + 41302: 58588, + 41303: 58589, + 41304: 58590, + 41305: 58591, + 41306: 58592, + 41307: 58593, + 41308: 58594, + 41309: 58595, + 41310: 58596, + 41311: 58597, + 41312: 58598, + 41313: 58599, + 41314: 58600, + 41315: 58601, + 41316: 58602, + 41317: 58603, + 41318: 58604, + 41319: 58605, + 41320: 58606, + 41321: 58607, + 41322: 58608, + 41323: 58609, + 41324: 58610, + 41325: 58611, + 41326: 58612, + 41327: 58613, + 41328: 58614, + 41329: 58615, + 41330: 58616, + 41331: 58617, + 41332: 58618, + 41333: 58619, + 41334: 58620, + 41335: 58621, + 41336: 58622, + 41337: 58623, + 41338: 58624, + 41339: 58625, + 41340: 58626, + 41341: 58627, + 41342: 58628, + 41344: 58629, + 41345: 58630, + 41346: 58631, + 41347: 58632, + 41348: 58633, + 41349: 58634, + 41350: 58635, + 41351: 58636, + 41352: 58637, + 41353: 58638, + 41354: 58639, + 41355: 58640, + 41356: 58641, + 41357: 58642, + 41358: 58643, + 41359: 58644, + 41360: 58645, + 41361: 58646, + 41362: 58647, + 41363: 58648, + 41364: 58649, + 41365: 58650, + 41366: 58651, + 41367: 58652, + 41368: 58653, + 41369: 58654, + 41370: 58655, + 41371: 58656, + 41372: 58657, + 41373: 58658, + 41374: 58659, + 41375: 58660, + 41376: 58661, + 41377: 12288, + 41378: 12289, + 41379: 12290, + 41380: 183, + 41381: 713, + 41382: 711, + 41383: 168, + 41384: 12291, + 41385: 12293, + 41386: 8212, + 41387: 65374, + 41388: 8214, + 41389: 8230, + 41390: 8216, + 41391: 8217, + 41392: 8220, + 41393: 8221, + 41394: 12308, + 41395: 12309, + 41396: 12296, + 41397: 12297, + 41398: 12298, + 41399: 12299, + 41400: 12300, + 41401: 12301, + 41402: 12302, + 41403: 12303, + 41404: 12310, + 41405: 12311, + 41406: 12304, + 41407: 12305, + 41408: 177, + 41409: 215, + 41410: 247, + 41411: 8758, + 41412: 8743, + 41413: 8744, + 41414: 8721, + 41415: 8719, + 41416: 8746, + 41417: 8745, + 41418: 8712, + 41419: 8759, + 41420: 8730, + 41421: 8869, + 41422: 8741, + 41423: 8736, + 41424: 8978, + 41425: 8857, + 41426: 8747, + 41427: 8750, + 41428: 8801, + 41429: 8780, + 41430: 8776, + 41431: 8765, + 41432: 8733, + 41433: 8800, + 41434: 8814, + 41435: 8815, + 41436: 8804, + 41437: 8805, + 41438: 8734, + 41439: 8757, + 41440: 8756, + 41441: 9794, + 41442: 9792, + 41443: 176, + 41444: 8242, + 41445: 8243, + 41446: 8451, + 41447: 65284, + 41448: 164, + 41449: 65504, + 41450: 65505, + 41451: 8240, + 41452: 167, + 41453: 8470, + 41454: 9734, + 41455: 9733, + 41456: 9675, + 41457: 9679, + 41458: 9678, + 41459: 9671, + 41460: 9670, + 41461: 9633, + 41462: 9632, + 41463: 9651, + 41464: 9650, + 41465: 8251, + 41466: 8594, + 41467: 8592, + 41468: 8593, + 41469: 8595, + 41470: 12307, + 41536: 58662, + 41537: 58663, + 41538: 58664, + 41539: 58665, + 41540: 58666, + 41541: 58667, + 41542: 58668, + 41543: 58669, + 41544: 58670, + 41545: 58671, + 41546: 58672, + 41547: 58673, + 41548: 58674, + 41549: 58675, + 41550: 58676, + 41551: 58677, + 41552: 58678, + 41553: 58679, + 41554: 58680, + 41555: 58681, + 41556: 58682, + 41557: 58683, + 41558: 58684, + 41559: 58685, + 41560: 58686, + 41561: 58687, + 41562: 58688, + 41563: 58689, + 41564: 58690, + 41565: 58691, + 41566: 58692, + 41567: 58693, + 41568: 58694, + 41569: 58695, + 41570: 58696, + 41571: 58697, + 41572: 58698, + 41573: 58699, + 41574: 58700, + 41575: 58701, + 41576: 58702, + 41577: 58703, + 41578: 58704, + 41579: 58705, + 41580: 58706, + 41581: 58707, + 41582: 58708, + 41583: 58709, + 41584: 58710, + 41585: 58711, + 41586: 58712, + 41587: 58713, + 41588: 58714, + 41589: 58715, + 41590: 58716, + 41591: 58717, + 41592: 58718, + 41593: 58719, + 41594: 58720, + 41595: 58721, + 41596: 58722, + 41597: 58723, + 41598: 58724, + 41600: 58725, + 41601: 58726, + 41602: 58727, + 41603: 58728, + 41604: 58729, + 41605: 58730, + 41606: 58731, + 41607: 58732, + 41608: 58733, + 41609: 58734, + 41610: 58735, + 41611: 58736, + 41612: 58737, + 41613: 58738, + 41614: 58739, + 41615: 58740, + 41616: 58741, + 41617: 58742, + 41618: 58743, + 41619: 58744, + 41620: 58745, + 41621: 58746, + 41622: 58747, + 41623: 58748, + 41624: 58749, + 41625: 58750, + 41626: 58751, + 41627: 58752, + 41628: 58753, + 41629: 58754, + 41630: 58755, + 41631: 58756, + 41632: 58757, + 41633: 8560, + 41634: 8561, + 41635: 8562, + 41636: 8563, + 41637: 8564, + 41638: 8565, + 41639: 8566, + 41640: 8567, + 41641: 8568, + 41642: 8569, + 41643: 59238, + 41644: 59239, + 41645: 59240, + 41646: 59241, + 41647: 59242, + 41648: 59243, + 41649: 9352, + 41650: 9353, + 41651: 9354, + 41652: 9355, + 41653: 9356, + 41654: 9357, + 41655: 9358, + 41656: 9359, + 41657: 9360, + 41658: 9361, + 41659: 9362, + 41660: 9363, + 41661: 9364, + 41662: 9365, + 41663: 9366, + 41664: 9367, + 41665: 9368, + 41666: 9369, + 41667: 9370, + 41668: 9371, + 41669: 9332, + 41670: 9333, + 41671: 9334, + 41672: 9335, + 41673: 9336, + 41674: 9337, + 41675: 9338, + 41676: 9339, + 41677: 9340, + 41678: 9341, + 41679: 9342, + 41680: 9343, + 41681: 9344, + 41682: 9345, + 41683: 9346, + 41684: 9347, + 41685: 9348, + 41686: 9349, + 41687: 9350, + 41688: 9351, + 41689: 9312, + 41690: 9313, + 41691: 9314, + 41692: 9315, + 41693: 9316, + 41694: 9317, + 41695: 9318, + 41696: 9319, + 41697: 9320, + 41698: 9321, + 41699: 8364, + 41700: 59245, + 41701: 12832, + 41702: 12833, + 41703: 12834, + 41704: 12835, + 41705: 12836, + 41706: 12837, + 41707: 12838, + 41708: 12839, + 41709: 12840, + 41710: 12841, + 41711: 59246, + 41712: 59247, + 41713: 8544, + 41714: 8545, + 41715: 8546, + 41716: 8547, + 41717: 8548, + 41718: 8549, + 41719: 8550, + 41720: 8551, + 41721: 8552, + 41722: 8553, + 41723: 8554, + 41724: 8555, + 41725: 59248, + 41726: 59249, + 41792: 58758, + 41793: 58759, + 41794: 58760, + 41795: 58761, + 41796: 58762, + 41797: 58763, + 41798: 58764, + 41799: 58765, + 41800: 58766, + 41801: 58767, + 41802: 58768, + 41803: 58769, + 41804: 58770, + 41805: 58771, + 41806: 58772, + 41807: 58773, + 41808: 58774, + 41809: 58775, + 41810: 58776, + 41811: 58777, + 41812: 58778, + 41813: 58779, + 41814: 58780, + 41815: 58781, + 41816: 58782, + 41817: 58783, + 41818: 58784, + 41819: 58785, + 41820: 58786, + 41821: 58787, + 41822: 58788, + 41823: 58789, + 41824: 58790, + 41825: 58791, + 41826: 58792, + 41827: 58793, + 41828: 58794, + 41829: 58795, + 41830: 58796, + 41831: 58797, + 41832: 58798, + 41833: 58799, + 41834: 58800, + 41835: 58801, + 41836: 58802, + 41837: 58803, + 41838: 58804, + 41839: 58805, + 41840: 58806, + 41841: 58807, + 41842: 58808, + 41843: 58809, + 41844: 58810, + 41845: 58811, + 41846: 58812, + 41847: 58813, + 41848: 58814, + 41849: 58815, + 41850: 58816, + 41851: 58817, + 41852: 58818, + 41853: 58819, + 41854: 58820, + 41856: 58821, + 41857: 58822, + 41858: 58823, + 41859: 58824, + 41860: 58825, + 41861: 58826, + 41862: 58827, + 41863: 58828, + 41864: 58829, + 41865: 58830, + 41866: 58831, + 41867: 58832, + 41868: 58833, + 41869: 58834, + 41870: 58835, + 41871: 58836, + 41872: 58837, + 41873: 58838, + 41874: 58839, + 41875: 58840, + 41876: 58841, + 41877: 58842, + 41878: 58843, + 41879: 58844, + 41880: 58845, + 41881: 58846, + 41882: 58847, + 41883: 58848, + 41884: 58849, + 41885: 58850, + 41886: 58851, + 41887: 58852, + 41888: 58853, + 41889: 65281, + 41890: 65282, + 41891: 65283, + 41892: 65509, + 41893: 65285, + 41894: 65286, + 41895: 65287, + 41896: 65288, + 41897: 65289, + 41898: 65290, + 41899: 65291, + 41900: 65292, + 41901: 65293, + 41902: 65294, + 41903: 65295, + 41904: 65296, + 41905: 65297, + 41906: 65298, + 41907: 65299, + 41908: 65300, + 41909: 65301, + 41910: 65302, + 41911: 65303, + 41912: 65304, + 41913: 65305, + 41914: 65306, + 41915: 65307, + 41916: 65308, + 41917: 65309, + 41918: 65310, + 41919: 65311, + 41920: 65312, + 41921: 65313, + 41922: 65314, + 41923: 65315, + 41924: 65316, + 41925: 65317, + 41926: 65318, + 41927: 65319, + 41928: 65320, + 41929: 65321, + 41930: 65322, + 41931: 65323, + 41932: 65324, + 41933: 65325, + 41934: 65326, + 41935: 65327, + 41936: 65328, + 41937: 65329, + 41938: 65330, + 41939: 65331, + 41940: 65332, + 41941: 65333, + 41942: 65334, + 41943: 65335, + 41944: 65336, + 41945: 65337, + 41946: 65338, + 41947: 65339, + 41948: 65340, + 41949: 65341, + 41950: 65342, + 41951: 65343, + 41952: 65344, + 41953: 65345, + 41954: 65346, + 41955: 65347, + 41956: 65348, + 41957: 65349, + 41958: 65350, + 41959: 65351, + 41960: 65352, + 41961: 65353, + 41962: 65354, + 41963: 65355, + 41964: 65356, + 41965: 65357, + 41966: 65358, + 41967: 65359, + 41968: 65360, + 41969: 65361, + 41970: 65362, + 41971: 65363, + 41972: 65364, + 41973: 65365, + 41974: 65366, + 41975: 65367, + 41976: 65368, + 41977: 65369, + 41978: 65370, + 41979: 65371, + 41980: 65372, + 41981: 65373, + 41982: 65507, + 42048: 58854, + 42049: 58855, + 42050: 58856, + 42051: 58857, + 42052: 58858, + 42053: 58859, + 42054: 58860, + 42055: 58861, + 42056: 58862, + 42057: 58863, + 42058: 58864, + 42059: 58865, + 42060: 58866, + 42061: 58867, + 42062: 58868, + 42063: 58869, + 42064: 58870, + 42065: 58871, + 42066: 58872, + 42067: 58873, + 42068: 58874, + 42069: 58875, + 42070: 58876, + 42071: 58877, + 42072: 58878, + 42073: 58879, + 42074: 58880, + 42075: 58881, + 42076: 58882, + 42077: 58883, + 42078: 58884, + 42079: 58885, + 42080: 58886, + 42081: 58887, + 42082: 58888, + 42083: 58889, + 42084: 58890, + 42085: 58891, + 42086: 58892, + 42087: 58893, + 42088: 58894, + 42089: 58895, + 42090: 58896, + 42091: 58897, + 42092: 58898, + 42093: 58899, + 42094: 58900, + 42095: 58901, + 42096: 58902, + 42097: 58903, + 42098: 58904, + 42099: 58905, + 42100: 58906, + 42101: 58907, + 42102: 58908, + 42103: 58909, + 42104: 58910, + 42105: 58911, + 42106: 58912, + 42107: 58913, + 42108: 58914, + 42109: 58915, + 42110: 58916, + 42112: 58917, + 42113: 58918, + 42114: 58919, + 42115: 58920, + 42116: 58921, + 42117: 58922, + 42118: 58923, + 42119: 58924, + 42120: 58925, + 42121: 58926, + 42122: 58927, + 42123: 58928, + 42124: 58929, + 42125: 58930, + 42126: 58931, + 42127: 58932, + 42128: 58933, + 42129: 58934, + 42130: 58935, + 42131: 58936, + 42132: 58937, + 42133: 58938, + 42134: 58939, + 42135: 58940, + 42136: 58941, + 42137: 58942, + 42138: 58943, + 42139: 58944, + 42140: 58945, + 42141: 58946, + 42142: 58947, + 42143: 58948, + 42144: 58949, + 42145: 12353, + 42146: 12354, + 42147: 12355, + 42148: 12356, + 42149: 12357, + 42150: 12358, + 42151: 12359, + 42152: 12360, + 42153: 12361, + 42154: 12362, + 42155: 12363, + 42156: 12364, + 42157: 12365, + 42158: 12366, + 42159: 12367, + 42160: 12368, + 42161: 12369, + 42162: 12370, + 42163: 12371, + 42164: 12372, + 42165: 12373, + 42166: 12374, + 42167: 12375, + 42168: 12376, + 42169: 12377, + 42170: 12378, + 42171: 12379, + 42172: 12380, + 42173: 12381, + 42174: 12382, + 42175: 12383, + 42176: 12384, + 42177: 12385, + 42178: 12386, + 42179: 12387, + 42180: 12388, + 42181: 12389, + 42182: 12390, + 42183: 12391, + 42184: 12392, + 42185: 12393, + 42186: 12394, + 42187: 12395, + 42188: 12396, + 42189: 12397, + 42190: 12398, + 42191: 12399, + 42192: 12400, + 42193: 12401, + 42194: 12402, + 42195: 12403, + 42196: 12404, + 42197: 12405, + 42198: 12406, + 42199: 12407, + 42200: 12408, + 42201: 12409, + 42202: 12410, + 42203: 12411, + 42204: 12412, + 42205: 12413, + 42206: 12414, + 42207: 12415, + 42208: 12416, + 42209: 12417, + 42210: 12418, + 42211: 12419, + 42212: 12420, + 42213: 12421, + 42214: 12422, + 42215: 12423, + 42216: 12424, + 42217: 12425, + 42218: 12426, + 42219: 12427, + 42220: 12428, + 42221: 12429, + 42222: 12430, + 42223: 12431, + 42224: 12432, + 42225: 12433, + 42226: 12434, + 42227: 12435, + 42228: 59250, + 42229: 59251, + 42230: 59252, + 42231: 59253, + 42232: 59254, + 42233: 59255, + 42234: 59256, + 42235: 59257, + 42236: 59258, + 42237: 59259, + 42238: 59260, + 42304: 58950, + 42305: 58951, + 42306: 58952, + 42307: 58953, + 42308: 58954, + 42309: 58955, + 42310: 58956, + 42311: 58957, + 42312: 58958, + 42313: 58959, + 42314: 58960, + 42315: 58961, + 42316: 58962, + 42317: 58963, + 42318: 58964, + 42319: 58965, + 42320: 58966, + 42321: 58967, + 42322: 58968, + 42323: 58969, + 42324: 58970, + 42325: 58971, + 42326: 58972, + 42327: 58973, + 42328: 58974, + 42329: 58975, + 42330: 58976, + 42331: 58977, + 42332: 58978, + 42333: 58979, + 42334: 58980, + 42335: 58981, + 42336: 58982, + 42337: 58983, + 42338: 58984, + 42339: 58985, + 42340: 58986, + 42341: 58987, + 42342: 58988, + 42343: 58989, + 42344: 58990, + 42345: 58991, + 42346: 58992, + 42347: 58993, + 42348: 58994, + 42349: 58995, + 42350: 58996, + 42351: 58997, + 42352: 58998, + 42353: 58999, + 42354: 59000, + 42355: 59001, + 42356: 59002, + 42357: 59003, + 42358: 59004, + 42359: 59005, + 42360: 59006, + 42361: 59007, + 42362: 59008, + 42363: 59009, + 42364: 59010, + 42365: 59011, + 42366: 59012, + 42368: 59013, + 42369: 59014, + 42370: 59015, + 42371: 59016, + 42372: 59017, + 42373: 59018, + 42374: 59019, + 42375: 59020, + 42376: 59021, + 42377: 59022, + 42378: 59023, + 42379: 59024, + 42380: 59025, + 42381: 59026, + 42382: 59027, + 42383: 59028, + 42384: 59029, + 42385: 59030, + 42386: 59031, + 42387: 59032, + 42388: 59033, + 42389: 59034, + 42390: 59035, + 42391: 59036, + 42392: 59037, + 42393: 59038, + 42394: 59039, + 42395: 59040, + 42396: 59041, + 42397: 59042, + 42398: 59043, + 42399: 59044, + 42400: 59045, + 42401: 12449, + 42402: 12450, + 42403: 12451, + 42404: 12452, + 42405: 12453, + 42406: 12454, + 42407: 12455, + 42408: 12456, + 42409: 12457, + 42410: 12458, + 42411: 12459, + 42412: 12460, + 42413: 12461, + 42414: 12462, + 42415: 12463, + 42416: 12464, + 42417: 12465, + 42418: 12466, + 42419: 12467, + 42420: 12468, + 42421: 12469, + 42422: 12470, + 42423: 12471, + 42424: 12472, + 42425: 12473, + 42426: 12474, + 42427: 12475, + 42428: 12476, + 42429: 12477, + 42430: 12478, + 42431: 12479, + 42432: 12480, + 42433: 12481, + 42434: 12482, + 42435: 12483, + 42436: 12484, + 42437: 12485, + 42438: 12486, + 42439: 12487, + 42440: 12488, + 42441: 12489, + 42442: 12490, + 42443: 12491, + 42444: 12492, + 42445: 12493, + 42446: 12494, + 42447: 12495, + 42448: 12496, + 42449: 12497, + 42450: 12498, + 42451: 12499, + 42452: 12500, + 42453: 12501, + 42454: 12502, + 42455: 12503, + 42456: 12504, + 42457: 12505, + 42458: 12506, + 42459: 12507, + 42460: 12508, + 42461: 12509, + 42462: 12510, + 42463: 12511, + 42464: 12512, + 42465: 12513, + 42466: 12514, + 42467: 12515, + 42468: 12516, + 42469: 12517, + 42470: 12518, + 42471: 12519, + 42472: 12520, + 42473: 12521, + 42474: 12522, + 42475: 12523, + 42476: 12524, + 42477: 12525, + 42478: 12526, + 42479: 12527, + 42480: 12528, + 42481: 12529, + 42482: 12530, + 42483: 12531, + 42484: 12532, + 42485: 12533, + 42486: 12534, + 42487: 59261, + 42488: 59262, + 42489: 59263, + 42490: 59264, + 42491: 59265, + 42492: 59266, + 42493: 59267, + 42494: 59268, + 42560: 59046, + 42561: 59047, + 42562: 59048, + 42563: 59049, + 42564: 59050, + 42565: 59051, + 42566: 59052, + 42567: 59053, + 42568: 59054, + 42569: 59055, + 42570: 59056, + 42571: 59057, + 42572: 59058, + 42573: 59059, + 42574: 59060, + 42575: 59061, + 42576: 59062, + 42577: 59063, + 42578: 59064, + 42579: 59065, + 42580: 59066, + 42581: 59067, + 42582: 59068, + 42583: 59069, + 42584: 59070, + 42585: 59071, + 42586: 59072, + 42587: 59073, + 42588: 59074, + 42589: 59075, + 42590: 59076, + 42591: 59077, + 42592: 59078, + 42593: 59079, + 42594: 59080, + 42595: 59081, + 42596: 59082, + 42597: 59083, + 42598: 59084, + 42599: 59085, + 42600: 59086, + 42601: 59087, + 42602: 59088, + 42603: 59089, + 42604: 59090, + 42605: 59091, + 42606: 59092, + 42607: 59093, + 42608: 59094, + 42609: 59095, + 42610: 59096, + 42611: 59097, + 42612: 59098, + 42613: 59099, + 42614: 59100, + 42615: 59101, + 42616: 59102, + 42617: 59103, + 42618: 59104, + 42619: 59105, + 42620: 59106, + 42621: 59107, + 42622: 59108, + 42624: 59109, + 42625: 59110, + 42626: 59111, + 42627: 59112, + 42628: 59113, + 42629: 59114, + 42630: 59115, + 42631: 59116, + 42632: 59117, + 42633: 59118, + 42634: 59119, + 42635: 59120, + 42636: 59121, + 42637: 59122, + 42638: 59123, + 42639: 59124, + 42640: 59125, + 42641: 59126, + 42642: 59127, + 42643: 59128, + 42644: 59129, + 42645: 59130, + 42646: 59131, + 42647: 59132, + 42648: 59133, + 42649: 59134, + 42650: 59135, + 42651: 59136, + 42652: 59137, + 42653: 59138, + 42654: 59139, + 42655: 59140, + 42656: 59141, + 42657: 913, + 42658: 914, + 42659: 915, + 42660: 916, + 42661: 917, + 42662: 918, + 42663: 919, + 42664: 920, + 42665: 921, + 42666: 922, + 42667: 923, + 42668: 924, + 42669: 925, + 42670: 926, + 42671: 927, + 42672: 928, + 42673: 929, + 42674: 931, + 42675: 932, + 42676: 933, + 42677: 934, + 42678: 935, + 42679: 936, + 42680: 937, + 42681: 59269, + 42682: 59270, + 42683: 59271, + 42684: 59272, + 42685: 59273, + 42686: 59274, + 42687: 59275, + 42688: 59276, + 42689: 945, + 42690: 946, + 42691: 947, + 42692: 948, + 42693: 949, + 42694: 950, + 42695: 951, + 42696: 952, + 42697: 953, + 42698: 954, + 42699: 955, + 42700: 956, + 42701: 957, + 42702: 958, + 42703: 959, + 42704: 960, + 42705: 961, + 42706: 963, + 42707: 964, + 42708: 965, + 42709: 966, + 42710: 967, + 42711: 968, + 42712: 969, + 42713: 59277, + 42714: 59278, + 42715: 59279, + 42716: 59280, + 42717: 59281, + 42718: 59282, + 42719: 59283, + 42720: 65077, + 42721: 65078, + 42722: 65081, + 42723: 65082, + 42724: 65087, + 42725: 65088, + 42726: 65085, + 42727: 65086, + 42728: 65089, + 42729: 65090, + 42730: 65091, + 42731: 65092, + 42732: 59284, + 42733: 59285, + 42734: 65083, + 42735: 65084, + 42736: 65079, + 42737: 65080, + 42738: 65073, + 42739: 59286, + 42740: 65075, + 42741: 65076, + 42742: 59287, + 42743: 59288, + 42744: 59289, + 42745: 59290, + 42746: 59291, + 42747: 59292, + 42748: 59293, + 42749: 59294, + 42750: 59295, + 42816: 59142, + 42817: 59143, + 42818: 59144, + 42819: 59145, + 42820: 59146, + 42821: 59147, + 42822: 59148, + 42823: 59149, + 42824: 59150, + 42825: 59151, + 42826: 59152, + 42827: 59153, + 42828: 59154, + 42829: 59155, + 42830: 59156, + 42831: 59157, + 42832: 59158, + 42833: 59159, + 42834: 59160, + 42835: 59161, + 42836: 59162, + 42837: 59163, + 42838: 59164, + 42839: 59165, + 42840: 59166, + 42841: 59167, + 42842: 59168, + 42843: 59169, + 42844: 59170, + 42845: 59171, + 42846: 59172, + 42847: 59173, + 42848: 59174, + 42849: 59175, + 42850: 59176, + 42851: 59177, + 42852: 59178, + 42853: 59179, + 42854: 59180, + 42855: 59181, + 42856: 59182, + 42857: 59183, + 42858: 59184, + 42859: 59185, + 42860: 59186, + 42861: 59187, + 42862: 59188, + 42863: 59189, + 42864: 59190, + 42865: 59191, + 42866: 59192, + 42867: 59193, + 42868: 59194, + 42869: 59195, + 42870: 59196, + 42871: 59197, + 42872: 59198, + 42873: 59199, + 42874: 59200, + 42875: 59201, + 42876: 59202, + 42877: 59203, + 42878: 59204, + 42880: 59205, + 42881: 59206, + 42882: 59207, + 42883: 59208, + 42884: 59209, + 42885: 59210, + 42886: 59211, + 42887: 59212, + 42888: 59213, + 42889: 59214, + 42890: 59215, + 42891: 59216, + 42892: 59217, + 42893: 59218, + 42894: 59219, + 42895: 59220, + 42896: 59221, + 42897: 59222, + 42898: 59223, + 42899: 59224, + 42900: 59225, + 42901: 59226, + 42902: 59227, + 42903: 59228, + 42904: 59229, + 42905: 59230, + 42906: 59231, + 42907: 59232, + 42908: 59233, + 42909: 59234, + 42910: 59235, + 42911: 59236, + 42912: 59237, + 42913: 1040, + 42914: 1041, + 42915: 1042, + 42916: 1043, + 42917: 1044, + 42918: 1045, + 42919: 1025, + 42920: 1046, + 42921: 1047, + 42922: 1048, + 42923: 1049, + 42924: 1050, + 42925: 1051, + 42926: 1052, + 42927: 1053, + 42928: 1054, + 42929: 1055, + 42930: 1056, + 42931: 1057, + 42932: 1058, + 42933: 1059, + 42934: 1060, + 42935: 1061, + 42936: 1062, + 42937: 1063, + 42938: 1064, + 42939: 1065, + 42940: 1066, + 42941: 1067, + 42942: 1068, + 42943: 1069, + 42944: 1070, + 42945: 1071, + 42946: 59296, + 42947: 59297, + 42948: 59298, + 42949: 59299, + 42950: 59300, + 42951: 59301, + 42952: 59302, + 42953: 59303, + 42954: 59304, + 42955: 59305, + 42956: 59306, + 42957: 59307, + 42958: 59308, + 42959: 59309, + 42960: 59310, + 42961: 1072, + 42962: 1073, + 42963: 1074, + 42964: 1075, + 42965: 1076, + 42966: 1077, + 42967: 1105, + 42968: 1078, + 42969: 1079, + 42970: 1080, + 42971: 1081, + 42972: 1082, + 42973: 1083, + 42974: 1084, + 42975: 1085, + 42976: 1086, + 42977: 1087, + 42978: 1088, + 42979: 1089, + 42980: 1090, + 42981: 1091, + 42982: 1092, + 42983: 1093, + 42984: 1094, + 42985: 1095, + 42986: 1096, + 42987: 1097, + 42988: 1098, + 42989: 1099, + 42990: 1100, + 42991: 1101, + 42992: 1102, + 42993: 1103, + 42994: 59311, + 42995: 59312, + 42996: 59313, + 42997: 59314, + 42998: 59315, + 42999: 59316, + 43000: 59317, + 43001: 59318, + 43002: 59319, + 43003: 59320, + 43004: 59321, + 43005: 59322, + 43006: 59323, + 43072: 714, + 43073: 715, + 43074: 729, + 43075: 8211, + 43076: 8213, + 43077: 8229, + 43078: 8245, + 43079: 8453, + 43080: 8457, + 43081: 8598, + 43082: 8599, + 43083: 8600, + 43084: 8601, + 43085: 8725, + 43086: 8735, + 43087: 8739, + 43088: 8786, + 43089: 8806, + 43090: 8807, + 43091: 8895, + 43092: 9552, + 43093: 9553, + 43094: 9554, + 43095: 9555, + 43096: 9556, + 43097: 9557, + 43098: 9558, + 43099: 9559, + 43100: 9560, + 43101: 9561, + 43102: 9562, + 43103: 9563, + 43104: 9564, + 43105: 9565, + 43106: 9566, + 43107: 9567, + 43108: 9568, + 43109: 9569, + 43110: 9570, + 43111: 9571, + 43112: 9572, + 43113: 9573, + 43114: 9574, + 43115: 9575, + 43116: 9576, + 43117: 9577, + 43118: 9578, + 43119: 9579, + 43120: 9580, + 43121: 9581, + 43122: 9582, + 43123: 9583, + 43124: 9584, + 43125: 9585, + 43126: 9586, + 43127: 9587, + 43128: 9601, + 43129: 9602, + 43130: 9603, + 43131: 9604, + 43132: 9605, + 43133: 9606, + 43134: 9607, + 43136: 9608, + 43137: 9609, + 43138: 9610, + 43139: 9611, + 43140: 9612, + 43141: 9613, + 43142: 9614, + 43143: 9615, + 43144: 9619, + 43145: 9620, + 43146: 9621, + 43147: 9660, + 43148: 9661, + 43149: 9698, + 43150: 9699, + 43151: 9700, + 43152: 9701, + 43153: 9737, + 43154: 8853, + 43155: 12306, + 43156: 12317, + 43157: 12318, + 43158: 59324, + 43159: 59325, + 43160: 59326, + 43161: 59327, + 43162: 59328, + 43163: 59329, + 43164: 59330, + 43165: 59331, + 43166: 59332, + 43167: 59333, + 43168: 59334, + 43169: 257, + 43170: 225, + 43171: 462, + 43172: 224, + 43173: 275, + 43174: 233, + 43175: 283, + 43176: 232, + 43177: 299, + 43178: 237, + 43179: 464, + 43180: 236, + 43181: 333, + 43182: 243, + 43183: 466, + 43184: 242, + 43185: 363, + 43186: 250, + 43187: 468, + 43188: 249, + 43189: 470, + 43190: 472, + 43191: 474, + 43192: 476, + 43193: 252, + 43194: 234, + 43195: 593, + 43196: 59335, + 43197: 324, + 43198: 328, + 43199: 505, + 43200: 609, + 43201: 59337, + 43202: 59338, + 43203: 59339, + 43204: 59340, + 43205: 12549, + 43206: 12550, + 43207: 12551, + 43208: 12552, + 43209: 12553, + 43210: 12554, + 43211: 12555, + 43212: 12556, + 43213: 12557, + 43214: 12558, + 43215: 12559, + 43216: 12560, + 43217: 12561, + 43218: 12562, + 43219: 12563, + 43220: 12564, + 43221: 12565, + 43222: 12566, + 43223: 12567, + 43224: 12568, + 43225: 12569, + 43226: 12570, + 43227: 12571, + 43228: 12572, + 43229: 12573, + 43230: 12574, + 43231: 12575, + 43232: 12576, + 43233: 12577, + 43234: 12578, + 43235: 12579, + 43236: 12580, + 43237: 12581, + 43238: 12582, + 43239: 12583, + 43240: 12584, + 43241: 12585, + 43242: 59341, + 43243: 59342, + 43244: 59343, + 43245: 59344, + 43246: 59345, + 43247: 59346, + 43248: 59347, + 43249: 59348, + 43250: 59349, + 43251: 59350, + 43252: 59351, + 43253: 59352, + 43254: 59353, + 43255: 59354, + 43256: 59355, + 43257: 59356, + 43258: 59357, + 43259: 59358, + 43260: 59359, + 43261: 59360, + 43262: 59361, + 43328: 12321, + 43329: 12322, + 43330: 12323, + 43331: 12324, + 43332: 12325, + 43333: 12326, + 43334: 12327, + 43335: 12328, + 43336: 12329, + 43337: 12963, + 43338: 13198, + 43339: 13199, + 43340: 13212, + 43341: 13213, + 43342: 13214, + 43343: 13217, + 43344: 13252, + 43345: 13262, + 43346: 13265, + 43347: 13266, + 43348: 13269, + 43349: 65072, + 43350: 65506, + 43351: 65508, + 43352: 59362, + 43353: 8481, + 43354: 12849, + 43355: 59363, + 43356: 8208, + 43357: 59364, + 43358: 59365, + 43359: 59366, + 43360: 12540, + 43361: 12443, + 43362: 12444, + 43363: 12541, + 43364: 12542, + 43365: 12294, + 43366: 12445, + 43367: 12446, + 43368: 65097, + 43369: 65098, + 43370: 65099, + 43371: 65100, + 43372: 65101, + 43373: 65102, + 43374: 65103, + 43375: 65104, + 43376: 65105, + 43377: 65106, + 43378: 65108, + 43379: 65109, + 43380: 65110, + 43381: 65111, + 43382: 65113, + 43383: 65114, + 43384: 65115, + 43385: 65116, + 43386: 65117, + 43387: 65118, + 43388: 65119, + 43389: 65120, + 43390: 65121, + 43392: 65122, + 43393: 65123, + 43394: 65124, + 43395: 65125, + 43396: 65126, + 43397: 65128, + 43398: 65129, + 43399: 65130, + 43400: 65131, + 43401: 12350, + 43402: 12272, + 43403: 12273, + 43404: 12274, + 43405: 12275, + 43406: 12276, + 43407: 12277, + 43408: 12278, + 43409: 12279, + 43410: 12280, + 43411: 12281, + 43412: 12282, + 43413: 12283, + 43414: 12295, + 43415: 59380, + 43416: 59381, + 43417: 59382, + 43418: 59383, + 43419: 59384, + 43420: 59385, + 43421: 59386, + 43422: 59387, + 43423: 59388, + 43424: 59389, + 43425: 59390, + 43426: 59391, + 43427: 59392, + 43428: 9472, + 43429: 9473, + 43430: 9474, + 43431: 9475, + 43432: 9476, + 43433: 9477, + 43434: 9478, + 43435: 9479, + 43436: 9480, + 43437: 9481, + 43438: 9482, + 43439: 9483, + 43440: 9484, + 43441: 9485, + 43442: 9486, + 43443: 9487, + 43444: 9488, + 43445: 9489, + 43446: 9490, + 43447: 9491, + 43448: 9492, + 43449: 9493, + 43450: 9494, + 43451: 9495, + 43452: 9496, + 43453: 9497, + 43454: 9498, + 43455: 9499, + 43456: 9500, + 43457: 9501, + 43458: 9502, + 43459: 9503, + 43460: 9504, + 43461: 9505, + 43462: 9506, + 43463: 9507, + 43464: 9508, + 43465: 9509, + 43466: 9510, + 43467: 9511, + 43468: 9512, + 43469: 9513, + 43470: 9514, + 43471: 9515, + 43472: 9516, + 43473: 9517, + 43474: 9518, + 43475: 9519, + 43476: 9520, + 43477: 9521, + 43478: 9522, + 43479: 9523, + 43480: 9524, + 43481: 9525, + 43482: 9526, + 43483: 9527, + 43484: 9528, + 43485: 9529, + 43486: 9530, + 43487: 9531, + 43488: 9532, + 43489: 9533, + 43490: 9534, + 43491: 9535, + 43492: 9536, + 43493: 9537, + 43494: 9538, + 43495: 9539, + 43496: 9540, + 43497: 9541, + 43498: 9542, + 43499: 9543, + 43500: 9544, + 43501: 9545, + 43502: 9546, + 43503: 9547, + 43504: 59393, + 43505: 59394, + 43506: 59395, + 43507: 59396, + 43508: 59397, + 43509: 59398, + 43510: 59399, + 43511: 59400, + 43512: 59401, + 43513: 59402, + 43514: 59403, + 43515: 59404, + 43516: 59405, + 43517: 59406, + 43518: 59407, + 43584: 29404, + 43585: 29405, + 43586: 29407, + 43587: 29410, + 43588: 29411, + 43589: 29412, + 43590: 29413, + 43591: 29414, + 43592: 29415, + 43593: 29418, + 43594: 29419, + 43595: 29429, + 43596: 29430, + 43597: 29433, + 43598: 29437, + 43599: 29438, + 43600: 29439, + 43601: 29440, + 43602: 29442, + 43603: 29444, + 43604: 29445, + 43605: 29446, + 43606: 29447, + 43607: 29448, + 43608: 29449, + 43609: 29451, + 43610: 29452, + 43611: 29453, + 43612: 29455, + 43613: 29456, + 43614: 29457, + 43615: 29458, + 43616: 29460, + 43617: 29464, + 43618: 29465, + 43619: 29466, + 43620: 29471, + 43621: 29472, + 43622: 29475, + 43623: 29476, + 43624: 29478, + 43625: 29479, + 43626: 29480, + 43627: 29485, + 43628: 29487, + 43629: 29488, + 43630: 29490, + 43631: 29491, + 43632: 29493, + 43633: 29494, + 43634: 29498, + 43635: 29499, + 43636: 29500, + 43637: 29501, + 43638: 29504, + 43639: 29505, + 43640: 29506, + 43641: 29507, + 43642: 29508, + 43643: 29509, + 43644: 29510, + 43645: 29511, + 43646: 29512, + 43648: 29513, + 43649: 29514, + 43650: 29515, + 43651: 29516, + 43652: 29518, + 43653: 29519, + 43654: 29521, + 43655: 29523, + 43656: 29524, + 43657: 29525, + 43658: 29526, + 43659: 29528, + 43660: 29529, + 43661: 29530, + 43662: 29531, + 43663: 29532, + 43664: 29533, + 43665: 29534, + 43666: 29535, + 43667: 29537, + 43668: 29538, + 43669: 29539, + 43670: 29540, + 43671: 29541, + 43672: 29542, + 43673: 29543, + 43674: 29544, + 43675: 29545, + 43676: 29546, + 43677: 29547, + 43678: 29550, + 43679: 29552, + 43680: 29553, + 43681: 57344, + 43682: 57345, + 43683: 57346, + 43684: 57347, + 43685: 57348, + 43686: 57349, + 43687: 57350, + 43688: 57351, + 43689: 57352, + 43690: 57353, + 43691: 57354, + 43692: 57355, + 43693: 57356, + 43694: 57357, + 43695: 57358, + 43696: 57359, + 43697: 57360, + 43698: 57361, + 43699: 57362, + 43700: 57363, + 43701: 57364, + 43702: 57365, + 43703: 57366, + 43704: 57367, + 43705: 57368, + 43706: 57369, + 43707: 57370, + 43708: 57371, + 43709: 57372, + 43710: 57373, + 43711: 57374, + 43712: 57375, + 43713: 57376, + 43714: 57377, + 43715: 57378, + 43716: 57379, + 43717: 57380, + 43718: 57381, + 43719: 57382, + 43720: 57383, + 43721: 57384, + 43722: 57385, + 43723: 57386, + 43724: 57387, + 43725: 57388, + 43726: 57389, + 43727: 57390, + 43728: 57391, + 43729: 57392, + 43730: 57393, + 43731: 57394, + 43732: 57395, + 43733: 57396, + 43734: 57397, + 43735: 57398, + 43736: 57399, + 43737: 57400, + 43738: 57401, + 43739: 57402, + 43740: 57403, + 43741: 57404, + 43742: 57405, + 43743: 57406, + 43744: 57407, + 43745: 57408, + 43746: 57409, + 43747: 57410, + 43748: 57411, + 43749: 57412, + 43750: 57413, + 43751: 57414, + 43752: 57415, + 43753: 57416, + 43754: 57417, + 43755: 57418, + 43756: 57419, + 43757: 57420, + 43758: 57421, + 43759: 57422, + 43760: 57423, + 43761: 57424, + 43762: 57425, + 43763: 57426, + 43764: 57427, + 43765: 57428, + 43766: 57429, + 43767: 57430, + 43768: 57431, + 43769: 57432, + 43770: 57433, + 43771: 57434, + 43772: 57435, + 43773: 57436, + 43774: 57437, + 43840: 29554, + 43841: 29555, + 43842: 29556, + 43843: 29557, + 43844: 29558, + 43845: 29559, + 43846: 29560, + 43847: 29561, + 43848: 29562, + 43849: 29563, + 43850: 29564, + 43851: 29565, + 43852: 29567, + 43853: 29568, + 43854: 29569, + 43855: 29570, + 43856: 29571, + 43857: 29573, + 43858: 29574, + 43859: 29576, + 43860: 29578, + 43861: 29580, + 43862: 29581, + 43863: 29583, + 43864: 29584, + 43865: 29586, + 43866: 29587, + 43867: 29588, + 43868: 29589, + 43869: 29591, + 43870: 29592, + 43871: 29593, + 43872: 29594, + 43873: 29596, + 43874: 29597, + 43875: 29598, + 43876: 29600, + 43877: 29601, + 43878: 29603, + 43879: 29604, + 43880: 29605, + 43881: 29606, + 43882: 29607, + 43883: 29608, + 43884: 29610, + 43885: 29612, + 43886: 29613, + 43887: 29617, + 43888: 29620, + 43889: 29621, + 43890: 29622, + 43891: 29624, + 43892: 29625, + 43893: 29628, + 43894: 29629, + 43895: 29630, + 43896: 29631, + 43897: 29633, + 43898: 29635, + 43899: 29636, + 43900: 29637, + 43901: 29638, + 43902: 29639, + 43904: 29643, + 43905: 29644, + 43906: 29646, + 43907: 29650, + 43908: 29651, + 43909: 29652, + 43910: 29653, + 43911: 29654, + 43912: 29655, + 43913: 29656, + 43914: 29658, + 43915: 29659, + 43916: 29660, + 43917: 29661, + 43918: 29663, + 43919: 29665, + 43920: 29666, + 43921: 29667, + 43922: 29668, + 43923: 29670, + 43924: 29672, + 43925: 29674, + 43926: 29675, + 43927: 29676, + 43928: 29678, + 43929: 29679, + 43930: 29680, + 43931: 29681, + 43932: 29683, + 43933: 29684, + 43934: 29685, + 43935: 29686, + 43936: 29687, + 43937: 57438, + 43938: 57439, + 43939: 57440, + 43940: 57441, + 43941: 57442, + 43942: 57443, + 43943: 57444, + 43944: 57445, + 43945: 57446, + 43946: 57447, + 43947: 57448, + 43948: 57449, + 43949: 57450, + 43950: 57451, + 43951: 57452, + 43952: 57453, + 43953: 57454, + 43954: 57455, + 43955: 57456, + 43956: 57457, + 43957: 57458, + 43958: 57459, + 43959: 57460, + 43960: 57461, + 43961: 57462, + 43962: 57463, + 43963: 57464, + 43964: 57465, + 43965: 57466, + 43966: 57467, + 43967: 57468, + 43968: 57469, + 43969: 57470, + 43970: 57471, + 43971: 57472, + 43972: 57473, + 43973: 57474, + 43974: 57475, + 43975: 57476, + 43976: 57477, + 43977: 57478, + 43978: 57479, + 43979: 57480, + 43980: 57481, + 43981: 57482, + 43982: 57483, + 43983: 57484, + 43984: 57485, + 43985: 57486, + 43986: 57487, + 43987: 57488, + 43988: 57489, + 43989: 57490, + 43990: 57491, + 43991: 57492, + 43992: 57493, + 43993: 57494, + 43994: 57495, + 43995: 57496, + 43996: 57497, + 43997: 57498, + 43998: 57499, + 43999: 57500, + 44000: 57501, + 44001: 57502, + 44002: 57503, + 44003: 57504, + 44004: 57505, + 44005: 57506, + 44006: 57507, + 44007: 57508, + 44008: 57509, + 44009: 57510, + 44010: 57511, + 44011: 57512, + 44012: 57513, + 44013: 57514, + 44014: 57515, + 44015: 57516, + 44016: 57517, + 44017: 57518, + 44018: 57519, + 44019: 57520, + 44020: 57521, + 44021: 57522, + 44022: 57523, + 44023: 57524, + 44024: 57525, + 44025: 57526, + 44026: 57527, + 44027: 57528, + 44028: 57529, + 44029: 57530, + 44030: 57531, + 44096: 29688, + 44097: 29689, + 44098: 29690, + 44099: 29691, + 44100: 29692, + 44101: 29693, + 44102: 29694, + 44103: 29695, + 44104: 29696, + 44105: 29697, + 44106: 29698, + 44107: 29700, + 44108: 29703, + 44109: 29704, + 44110: 29707, + 44111: 29708, + 44112: 29709, + 44113: 29710, + 44114: 29713, + 44115: 29714, + 44116: 29715, + 44117: 29716, + 44118: 29717, + 44119: 29718, + 44120: 29719, + 44121: 29720, + 44122: 29721, + 44123: 29724, + 44124: 29725, + 44125: 29726, + 44126: 29727, + 44127: 29728, + 44128: 29729, + 44129: 29731, + 44130: 29732, + 44131: 29735, + 44132: 29737, + 44133: 29739, + 44134: 29741, + 44135: 29743, + 44136: 29745, + 44137: 29746, + 44138: 29751, + 44139: 29752, + 44140: 29753, + 44141: 29754, + 44142: 29755, + 44143: 29757, + 44144: 29758, + 44145: 29759, + 44146: 29760, + 44147: 29762, + 44148: 29763, + 44149: 29764, + 44150: 29765, + 44151: 29766, + 44152: 29767, + 44153: 29768, + 44154: 29769, + 44155: 29770, + 44156: 29771, + 44157: 29772, + 44158: 29773, + 44160: 29774, + 44161: 29775, + 44162: 29776, + 44163: 29777, + 44164: 29778, + 44165: 29779, + 44166: 29780, + 44167: 29782, + 44168: 29784, + 44169: 29789, + 44170: 29792, + 44171: 29793, + 44172: 29794, + 44173: 29795, + 44174: 29796, + 44175: 29797, + 44176: 29798, + 44177: 29799, + 44178: 29800, + 44179: 29801, + 44180: 29802, + 44181: 29803, + 44182: 29804, + 44183: 29806, + 44184: 29807, + 44185: 29809, + 44186: 29810, + 44187: 29811, + 44188: 29812, + 44189: 29813, + 44190: 29816, + 44191: 29817, + 44192: 29818, + 44193: 57532, + 44194: 57533, + 44195: 57534, + 44196: 57535, + 44197: 57536, + 44198: 57537, + 44199: 57538, + 44200: 57539, + 44201: 57540, + 44202: 57541, + 44203: 57542, + 44204: 57543, + 44205: 57544, + 44206: 57545, + 44207: 57546, + 44208: 57547, + 44209: 57548, + 44210: 57549, + 44211: 57550, + 44212: 57551, + 44213: 57552, + 44214: 57553, + 44215: 57554, + 44216: 57555, + 44217: 57556, + 44218: 57557, + 44219: 57558, + 44220: 57559, + 44221: 57560, + 44222: 57561, + 44223: 57562, + 44224: 57563, + 44225: 57564, + 44226: 57565, + 44227: 57566, + 44228: 57567, + 44229: 57568, + 44230: 57569, + 44231: 57570, + 44232: 57571, + 44233: 57572, + 44234: 57573, + 44235: 57574, + 44236: 57575, + 44237: 57576, + 44238: 57577, + 44239: 57578, + 44240: 57579, + 44241: 57580, + 44242: 57581, + 44243: 57582, + 44244: 57583, + 44245: 57584, + 44246: 57585, + 44247: 57586, + 44248: 57587, + 44249: 57588, + 44250: 57589, + 44251: 57590, + 44252: 57591, + 44253: 57592, + 44254: 57593, + 44255: 57594, + 44256: 57595, + 44257: 57596, + 44258: 57597, + 44259: 57598, + 44260: 57599, + 44261: 57600, + 44262: 57601, + 44263: 57602, + 44264: 57603, + 44265: 57604, + 44266: 57605, + 44267: 57606, + 44268: 57607, + 44269: 57608, + 44270: 57609, + 44271: 57610, + 44272: 57611, + 44273: 57612, + 44274: 57613, + 44275: 57614, + 44276: 57615, + 44277: 57616, + 44278: 57617, + 44279: 57618, + 44280: 57619, + 44281: 57620, + 44282: 57621, + 44283: 57622, + 44284: 57623, + 44285: 57624, + 44286: 57625, + 44352: 29819, + 44353: 29820, + 44354: 29821, + 44355: 29823, + 44356: 29826, + 44357: 29828, + 44358: 29829, + 44359: 29830, + 44360: 29832, + 44361: 29833, + 44362: 29834, + 44363: 29836, + 44364: 29837, + 44365: 29839, + 44366: 29841, + 44367: 29842, + 44368: 29843, + 44369: 29844, + 44370: 29845, + 44371: 29846, + 44372: 29847, + 44373: 29848, + 44374: 29849, + 44375: 29850, + 44376: 29851, + 44377: 29853, + 44378: 29855, + 44379: 29856, + 44380: 29857, + 44381: 29858, + 44382: 29859, + 44383: 29860, + 44384: 29861, + 44385: 29862, + 44386: 29866, + 44387: 29867, + 44388: 29868, + 44389: 29869, + 44390: 29870, + 44391: 29871, + 44392: 29872, + 44393: 29873, + 44394: 29874, + 44395: 29875, + 44396: 29876, + 44397: 29877, + 44398: 29878, + 44399: 29879, + 44400: 29880, + 44401: 29881, + 44402: 29883, + 44403: 29884, + 44404: 29885, + 44405: 29886, + 44406: 29887, + 44407: 29888, + 44408: 29889, + 44409: 29890, + 44410: 29891, + 44411: 29892, + 44412: 29893, + 44413: 29894, + 44414: 29895, + 44416: 29896, + 44417: 29897, + 44418: 29898, + 44419: 29899, + 44420: 29900, + 44421: 29901, + 44422: 29902, + 44423: 29903, + 44424: 29904, + 44425: 29905, + 44426: 29907, + 44427: 29908, + 44428: 29909, + 44429: 29910, + 44430: 29911, + 44431: 29912, + 44432: 29913, + 44433: 29914, + 44434: 29915, + 44435: 29917, + 44436: 29919, + 44437: 29921, + 44438: 29925, + 44439: 29927, + 44440: 29928, + 44441: 29929, + 44442: 29930, + 44443: 29931, + 44444: 29932, + 44445: 29933, + 44446: 29936, + 44447: 29937, + 44448: 29938, + 44449: 57626, + 44450: 57627, + 44451: 57628, + 44452: 57629, + 44453: 57630, + 44454: 57631, + 44455: 57632, + 44456: 57633, + 44457: 57634, + 44458: 57635, + 44459: 57636, + 44460: 57637, + 44461: 57638, + 44462: 57639, + 44463: 57640, + 44464: 57641, + 44465: 57642, + 44466: 57643, + 44467: 57644, + 44468: 57645, + 44469: 57646, + 44470: 57647, + 44471: 57648, + 44472: 57649, + 44473: 57650, + 44474: 57651, + 44475: 57652, + 44476: 57653, + 44477: 57654, + 44478: 57655, + 44479: 57656, + 44480: 57657, + 44481: 57658, + 44482: 57659, + 44483: 57660, + 44484: 57661, + 44485: 57662, + 44486: 57663, + 44487: 57664, + 44488: 57665, + 44489: 57666, + 44490: 57667, + 44491: 57668, + 44492: 57669, + 44493: 57670, + 44494: 57671, + 44495: 57672, + 44496: 57673, + 44497: 57674, + 44498: 57675, + 44499: 57676, + 44500: 57677, + 44501: 57678, + 44502: 57679, + 44503: 57680, + 44504: 57681, + 44505: 57682, + 44506: 57683, + 44507: 57684, + 44508: 57685, + 44509: 57686, + 44510: 57687, + 44511: 57688, + 44512: 57689, + 44513: 57690, + 44514: 57691, + 44515: 57692, + 44516: 57693, + 44517: 57694, + 44518: 57695, + 44519: 57696, + 44520: 57697, + 44521: 57698, + 44522: 57699, + 44523: 57700, + 44524: 57701, + 44525: 57702, + 44526: 57703, + 44527: 57704, + 44528: 57705, + 44529: 57706, + 44530: 57707, + 44531: 57708, + 44532: 57709, + 44533: 57710, + 44534: 57711, + 44535: 57712, + 44536: 57713, + 44537: 57714, + 44538: 57715, + 44539: 57716, + 44540: 57717, + 44541: 57718, + 44542: 57719, + 44608: 29939, + 44609: 29941, + 44610: 29944, + 44611: 29945, + 44612: 29946, + 44613: 29947, + 44614: 29948, + 44615: 29949, + 44616: 29950, + 44617: 29952, + 44618: 29953, + 44619: 29954, + 44620: 29955, + 44621: 29957, + 44622: 29958, + 44623: 29959, + 44624: 29960, + 44625: 29961, + 44626: 29962, + 44627: 29963, + 44628: 29964, + 44629: 29966, + 44630: 29968, + 44631: 29970, + 44632: 29972, + 44633: 29973, + 44634: 29974, + 44635: 29975, + 44636: 29979, + 44637: 29981, + 44638: 29982, + 44639: 29984, + 44640: 29985, + 44641: 29986, + 44642: 29987, + 44643: 29988, + 44644: 29990, + 44645: 29991, + 44646: 29994, + 44647: 29998, + 44648: 30004, + 44649: 30006, + 44650: 30009, + 44651: 30012, + 44652: 30013, + 44653: 30015, + 44654: 30017, + 44655: 30018, + 44656: 30019, + 44657: 30020, + 44658: 30022, + 44659: 30023, + 44660: 30025, + 44661: 30026, + 44662: 30029, + 44663: 30032, + 44664: 30033, + 44665: 30034, + 44666: 30035, + 44667: 30037, + 44668: 30038, + 44669: 30039, + 44670: 30040, + 44672: 30045, + 44673: 30046, + 44674: 30047, + 44675: 30048, + 44676: 30049, + 44677: 30050, + 44678: 30051, + 44679: 30052, + 44680: 30055, + 44681: 30056, + 44682: 30057, + 44683: 30059, + 44684: 30060, + 44685: 30061, + 44686: 30062, + 44687: 30063, + 44688: 30064, + 44689: 30065, + 44690: 30067, + 44691: 30069, + 44692: 30070, + 44693: 30071, + 44694: 30074, + 44695: 30075, + 44696: 30076, + 44697: 30077, + 44698: 30078, + 44699: 30080, + 44700: 30081, + 44701: 30082, + 44702: 30084, + 44703: 30085, + 44704: 30087, + 44705: 57720, + 44706: 57721, + 44707: 57722, + 44708: 57723, + 44709: 57724, + 44710: 57725, + 44711: 57726, + 44712: 57727, + 44713: 57728, + 44714: 57729, + 44715: 57730, + 44716: 57731, + 44717: 57732, + 44718: 57733, + 44719: 57734, + 44720: 57735, + 44721: 57736, + 44722: 57737, + 44723: 57738, + 44724: 57739, + 44725: 57740, + 44726: 57741, + 44727: 57742, + 44728: 57743, + 44729: 57744, + 44730: 57745, + 44731: 57746, + 44732: 57747, + 44733: 57748, + 44734: 57749, + 44735: 57750, + 44736: 57751, + 44737: 57752, + 44738: 57753, + 44739: 57754, + 44740: 57755, + 44741: 57756, + 44742: 57757, + 44743: 57758, + 44744: 57759, + 44745: 57760, + 44746: 57761, + 44747: 57762, + 44748: 57763, + 44749: 57764, + 44750: 57765, + 44751: 57766, + 44752: 57767, + 44753: 57768, + 44754: 57769, + 44755: 57770, + 44756: 57771, + 44757: 57772, + 44758: 57773, + 44759: 57774, + 44760: 57775, + 44761: 57776, + 44762: 57777, + 44763: 57778, + 44764: 57779, + 44765: 57780, + 44766: 57781, + 44767: 57782, + 44768: 57783, + 44769: 57784, + 44770: 57785, + 44771: 57786, + 44772: 57787, + 44773: 57788, + 44774: 57789, + 44775: 57790, + 44776: 57791, + 44777: 57792, + 44778: 57793, + 44779: 57794, + 44780: 57795, + 44781: 57796, + 44782: 57797, + 44783: 57798, + 44784: 57799, + 44785: 57800, + 44786: 57801, + 44787: 57802, + 44788: 57803, + 44789: 57804, + 44790: 57805, + 44791: 57806, + 44792: 57807, + 44793: 57808, + 44794: 57809, + 44795: 57810, + 44796: 57811, + 44797: 57812, + 44798: 57813, + 44864: 30088, + 44865: 30089, + 44866: 30090, + 44867: 30092, + 44868: 30093, + 44869: 30094, + 44870: 30096, + 44871: 30099, + 44872: 30101, + 44873: 30104, + 44874: 30107, + 44875: 30108, + 44876: 30110, + 44877: 30114, + 44878: 30118, + 44879: 30119, + 44880: 30120, + 44881: 30121, + 44882: 30122, + 44883: 30125, + 44884: 30134, + 44885: 30135, + 44886: 30138, + 44887: 30139, + 44888: 30143, + 44889: 30144, + 44890: 30145, + 44891: 30150, + 44892: 30155, + 44893: 30156, + 44894: 30158, + 44895: 30159, + 44896: 30160, + 44897: 30161, + 44898: 30163, + 44899: 30167, + 44900: 30169, + 44901: 30170, + 44902: 30172, + 44903: 30173, + 44904: 30175, + 44905: 30176, + 44906: 30177, + 44907: 30181, + 44908: 30185, + 44909: 30188, + 44910: 30189, + 44911: 30190, + 44912: 30191, + 44913: 30194, + 44914: 30195, + 44915: 30197, + 44916: 30198, + 44917: 30199, + 44918: 30200, + 44919: 30202, + 44920: 30203, + 44921: 30205, + 44922: 30206, + 44923: 30210, + 44924: 30212, + 44925: 30214, + 44926: 30215, + 44928: 30216, + 44929: 30217, + 44930: 30219, + 44931: 30221, + 44932: 30222, + 44933: 30223, + 44934: 30225, + 44935: 30226, + 44936: 30227, + 44937: 30228, + 44938: 30230, + 44939: 30234, + 44940: 30236, + 44941: 30237, + 44942: 30238, + 44943: 30241, + 44944: 30243, + 44945: 30247, + 44946: 30248, + 44947: 30252, + 44948: 30254, + 44949: 30255, + 44950: 30257, + 44951: 30258, + 44952: 30262, + 44953: 30263, + 44954: 30265, + 44955: 30266, + 44956: 30267, + 44957: 30269, + 44958: 30273, + 44959: 30274, + 44960: 30276, + 44961: 57814, + 44962: 57815, + 44963: 57816, + 44964: 57817, + 44965: 57818, + 44966: 57819, + 44967: 57820, + 44968: 57821, + 44969: 57822, + 44970: 57823, + 44971: 57824, + 44972: 57825, + 44973: 57826, + 44974: 57827, + 44975: 57828, + 44976: 57829, + 44977: 57830, + 44978: 57831, + 44979: 57832, + 44980: 57833, + 44981: 57834, + 44982: 57835, + 44983: 57836, + 44984: 57837, + 44985: 57838, + 44986: 57839, + 44987: 57840, + 44988: 57841, + 44989: 57842, + 44990: 57843, + 44991: 57844, + 44992: 57845, + 44993: 57846, + 44994: 57847, + 44995: 57848, + 44996: 57849, + 44997: 57850, + 44998: 57851, + 44999: 57852, + 45000: 57853, + 45001: 57854, + 45002: 57855, + 45003: 57856, + 45004: 57857, + 45005: 57858, + 45006: 57859, + 45007: 57860, + 45008: 57861, + 45009: 57862, + 45010: 57863, + 45011: 57864, + 45012: 57865, + 45013: 57866, + 45014: 57867, + 45015: 57868, + 45016: 57869, + 45017: 57870, + 45018: 57871, + 45019: 57872, + 45020: 57873, + 45021: 57874, + 45022: 57875, + 45023: 57876, + 45024: 57877, + 45025: 57878, + 45026: 57879, + 45027: 57880, + 45028: 57881, + 45029: 57882, + 45030: 57883, + 45031: 57884, + 45032: 57885, + 45033: 57886, + 45034: 57887, + 45035: 57888, + 45036: 57889, + 45037: 57890, + 45038: 57891, + 45039: 57892, + 45040: 57893, + 45041: 57894, + 45042: 57895, + 45043: 57896, + 45044: 57897, + 45045: 57898, + 45046: 57899, + 45047: 57900, + 45048: 57901, + 45049: 57902, + 45050: 57903, + 45051: 57904, + 45052: 57905, + 45053: 57906, + 45054: 57907, + 45120: 30277, + 45121: 30278, + 45122: 30279, + 45123: 30280, + 45124: 30281, + 45125: 30282, + 45126: 30283, + 45127: 30286, + 45128: 30287, + 45129: 30288, + 45130: 30289, + 45131: 30290, + 45132: 30291, + 45133: 30293, + 45134: 30295, + 45135: 30296, + 45136: 30297, + 45137: 30298, + 45138: 30299, + 45139: 30301, + 45140: 30303, + 45141: 30304, + 45142: 30305, + 45143: 30306, + 45144: 30308, + 45145: 30309, + 45146: 30310, + 45147: 30311, + 45148: 30312, + 45149: 30313, + 45150: 30314, + 45151: 30316, + 45152: 30317, + 45153: 30318, + 45154: 30320, + 45155: 30321, + 45156: 30322, + 45157: 30323, + 45158: 30324, + 45159: 30325, + 45160: 30326, + 45161: 30327, + 45162: 30329, + 45163: 30330, + 45164: 30332, + 45165: 30335, + 45166: 30336, + 45167: 30337, + 45168: 30339, + 45169: 30341, + 45170: 30345, + 45171: 30346, + 45172: 30348, + 45173: 30349, + 45174: 30351, + 45175: 30352, + 45176: 30354, + 45177: 30356, + 45178: 30357, + 45179: 30359, + 45180: 30360, + 45181: 30362, + 45182: 30363, + 45184: 30364, + 45185: 30365, + 45186: 30366, + 45187: 30367, + 45188: 30368, + 45189: 30369, + 45190: 30370, + 45191: 30371, + 45192: 30373, + 45193: 30374, + 45194: 30375, + 45195: 30376, + 45196: 30377, + 45197: 30378, + 45198: 30379, + 45199: 30380, + 45200: 30381, + 45201: 30383, + 45202: 30384, + 45203: 30387, + 45204: 30389, + 45205: 30390, + 45206: 30391, + 45207: 30392, + 45208: 30393, + 45209: 30394, + 45210: 30395, + 45211: 30396, + 45212: 30397, + 45213: 30398, + 45214: 30400, + 45215: 30401, + 45216: 30403, + 45217: 21834, + 45218: 38463, + 45219: 22467, + 45220: 25384, + 45221: 21710, + 45222: 21769, + 45223: 21696, + 45224: 30353, + 45225: 30284, + 45226: 34108, + 45227: 30702, + 45228: 33406, + 45229: 30861, + 45230: 29233, + 45231: 38552, + 45232: 38797, + 45233: 27688, + 45234: 23433, + 45235: 20474, + 45236: 25353, + 45237: 26263, + 45238: 23736, + 45239: 33018, + 45240: 26696, + 45241: 32942, + 45242: 26114, + 45243: 30414, + 45244: 20985, + 45245: 25942, + 45246: 29100, + 45247: 32753, + 45248: 34948, + 45249: 20658, + 45250: 22885, + 45251: 25034, + 45252: 28595, + 45253: 33453, + 45254: 25420, + 45255: 25170, + 45256: 21485, + 45257: 21543, + 45258: 31494, + 45259: 20843, + 45260: 30116, + 45261: 24052, + 45262: 25300, + 45263: 36299, + 45264: 38774, + 45265: 25226, + 45266: 32793, + 45267: 22365, + 45268: 38712, + 45269: 32610, + 45270: 29240, + 45271: 30333, + 45272: 26575, + 45273: 30334, + 45274: 25670, + 45275: 20336, + 45276: 36133, + 45277: 25308, + 45278: 31255, + 45279: 26001, + 45280: 29677, + 45281: 25644, + 45282: 25203, + 45283: 33324, + 45284: 39041, + 45285: 26495, + 45286: 29256, + 45287: 25198, + 45288: 25292, + 45289: 20276, + 45290: 29923, + 45291: 21322, + 45292: 21150, + 45293: 32458, + 45294: 37030, + 45295: 24110, + 45296: 26758, + 45297: 27036, + 45298: 33152, + 45299: 32465, + 45300: 26834, + 45301: 30917, + 45302: 34444, + 45303: 38225, + 45304: 20621, + 45305: 35876, + 45306: 33502, + 45307: 32990, + 45308: 21253, + 45309: 35090, + 45310: 21093, + 45376: 30404, + 45377: 30407, + 45378: 30409, + 45379: 30411, + 45380: 30412, + 45381: 30419, + 45382: 30421, + 45383: 30425, + 45384: 30426, + 45385: 30428, + 45386: 30429, + 45387: 30430, + 45388: 30432, + 45389: 30433, + 45390: 30434, + 45391: 30435, + 45392: 30436, + 45393: 30438, + 45394: 30439, + 45395: 30440, + 45396: 30441, + 45397: 30442, + 45398: 30443, + 45399: 30444, + 45400: 30445, + 45401: 30448, + 45402: 30451, + 45403: 30453, + 45404: 30454, + 45405: 30455, + 45406: 30458, + 45407: 30459, + 45408: 30461, + 45409: 30463, + 45410: 30464, + 45411: 30466, + 45412: 30467, + 45413: 30469, + 45414: 30470, + 45415: 30474, + 45416: 30476, + 45417: 30478, + 45418: 30479, + 45419: 30480, + 45420: 30481, + 45421: 30482, + 45422: 30483, + 45423: 30484, + 45424: 30485, + 45425: 30486, + 45426: 30487, + 45427: 30488, + 45428: 30491, + 45429: 30492, + 45430: 30493, + 45431: 30494, + 45432: 30497, + 45433: 30499, + 45434: 30500, + 45435: 30501, + 45436: 30503, + 45437: 30506, + 45438: 30507, + 45440: 30508, + 45441: 30510, + 45442: 30512, + 45443: 30513, + 45444: 30514, + 45445: 30515, + 45446: 30516, + 45447: 30521, + 45448: 30523, + 45449: 30525, + 45450: 30526, + 45451: 30527, + 45452: 30530, + 45453: 30532, + 45454: 30533, + 45455: 30534, + 45456: 30536, + 45457: 30537, + 45458: 30538, + 45459: 30539, + 45460: 30540, + 45461: 30541, + 45462: 30542, + 45463: 30543, + 45464: 30546, + 45465: 30547, + 45466: 30548, + 45467: 30549, + 45468: 30550, + 45469: 30551, + 45470: 30552, + 45471: 30553, + 45472: 30556, + 45473: 34180, + 45474: 38649, + 45475: 20445, + 45476: 22561, + 45477: 39281, + 45478: 23453, + 45479: 25265, + 45480: 25253, + 45481: 26292, + 45482: 35961, + 45483: 40077, + 45484: 29190, + 45485: 26479, + 45486: 30865, + 45487: 24754, + 45488: 21329, + 45489: 21271, + 45490: 36744, + 45491: 32972, + 45492: 36125, + 45493: 38049, + 45494: 20493, + 45495: 29384, + 45496: 22791, + 45497: 24811, + 45498: 28953, + 45499: 34987, + 45500: 22868, + 45501: 33519, + 45502: 26412, + 45503: 31528, + 45504: 23849, + 45505: 32503, + 45506: 29997, + 45507: 27893, + 45508: 36454, + 45509: 36856, + 45510: 36924, + 45511: 40763, + 45512: 27604, + 45513: 37145, + 45514: 31508, + 45515: 24444, + 45516: 30887, + 45517: 34006, + 45518: 34109, + 45519: 27605, + 45520: 27609, + 45521: 27606, + 45522: 24065, + 45523: 24199, + 45524: 30201, + 45525: 38381, + 45526: 25949, + 45527: 24330, + 45528: 24517, + 45529: 36767, + 45530: 22721, + 45531: 33218, + 45532: 36991, + 45533: 38491, + 45534: 38829, + 45535: 36793, + 45536: 32534, + 45537: 36140, + 45538: 25153, + 45539: 20415, + 45540: 21464, + 45541: 21342, + 45542: 36776, + 45543: 36777, + 45544: 36779, + 45545: 36941, + 45546: 26631, + 45547: 24426, + 45548: 33176, + 45549: 34920, + 45550: 40150, + 45551: 24971, + 45552: 21035, + 45553: 30250, + 45554: 24428, + 45555: 25996, + 45556: 28626, + 45557: 28392, + 45558: 23486, + 45559: 25672, + 45560: 20853, + 45561: 20912, + 45562: 26564, + 45563: 19993, + 45564: 31177, + 45565: 39292, + 45566: 28851, + 45632: 30557, + 45633: 30558, + 45634: 30559, + 45635: 30560, + 45636: 30564, + 45637: 30567, + 45638: 30569, + 45639: 30570, + 45640: 30573, + 45641: 30574, + 45642: 30575, + 45643: 30576, + 45644: 30577, + 45645: 30578, + 45646: 30579, + 45647: 30580, + 45648: 30581, + 45649: 30582, + 45650: 30583, + 45651: 30584, + 45652: 30586, + 45653: 30587, + 45654: 30588, + 45655: 30593, + 45656: 30594, + 45657: 30595, + 45658: 30598, + 45659: 30599, + 45660: 30600, + 45661: 30601, + 45662: 30602, + 45663: 30603, + 45664: 30607, + 45665: 30608, + 45666: 30611, + 45667: 30612, + 45668: 30613, + 45669: 30614, + 45670: 30615, + 45671: 30616, + 45672: 30617, + 45673: 30618, + 45674: 30619, + 45675: 30620, + 45676: 30621, + 45677: 30622, + 45678: 30625, + 45679: 30627, + 45680: 30628, + 45681: 30630, + 45682: 30632, + 45683: 30635, + 45684: 30637, + 45685: 30638, + 45686: 30639, + 45687: 30641, + 45688: 30642, + 45689: 30644, + 45690: 30646, + 45691: 30647, + 45692: 30648, + 45693: 30649, + 45694: 30650, + 45696: 30652, + 45697: 30654, + 45698: 30656, + 45699: 30657, + 45700: 30658, + 45701: 30659, + 45702: 30660, + 45703: 30661, + 45704: 30662, + 45705: 30663, + 45706: 30664, + 45707: 30665, + 45708: 30666, + 45709: 30667, + 45710: 30668, + 45711: 30670, + 45712: 30671, + 45713: 30672, + 45714: 30673, + 45715: 30674, + 45716: 30675, + 45717: 30676, + 45718: 30677, + 45719: 30678, + 45720: 30680, + 45721: 30681, + 45722: 30682, + 45723: 30685, + 45724: 30686, + 45725: 30687, + 45726: 30688, + 45727: 30689, + 45728: 30692, + 45729: 30149, + 45730: 24182, + 45731: 29627, + 45732: 33760, + 45733: 25773, + 45734: 25320, + 45735: 38069, + 45736: 27874, + 45737: 21338, + 45738: 21187, + 45739: 25615, + 45740: 38082, + 45741: 31636, + 45742: 20271, + 45743: 24091, + 45744: 33334, + 45745: 33046, + 45746: 33162, + 45747: 28196, + 45748: 27850, + 45749: 39539, + 45750: 25429, + 45751: 21340, + 45752: 21754, + 45753: 34917, + 45754: 22496, + 45755: 19981, + 45756: 24067, + 45757: 27493, + 45758: 31807, + 45759: 37096, + 45760: 24598, + 45761: 25830, + 45762: 29468, + 45763: 35009, + 45764: 26448, + 45765: 25165, + 45766: 36130, + 45767: 30572, + 45768: 36393, + 45769: 37319, + 45770: 24425, + 45771: 33756, + 45772: 34081, + 45773: 39184, + 45774: 21442, + 45775: 34453, + 45776: 27531, + 45777: 24813, + 45778: 24808, + 45779: 28799, + 45780: 33485, + 45781: 33329, + 45782: 20179, + 45783: 27815, + 45784: 34255, + 45785: 25805, + 45786: 31961, + 45787: 27133, + 45788: 26361, + 45789: 33609, + 45790: 21397, + 45791: 31574, + 45792: 20391, + 45793: 20876, + 45794: 27979, + 45795: 23618, + 45796: 36461, + 45797: 25554, + 45798: 21449, + 45799: 33580, + 45800: 33590, + 45801: 26597, + 45802: 30900, + 45803: 25661, + 45804: 23519, + 45805: 23700, + 45806: 24046, + 45807: 35815, + 45808: 25286, + 45809: 26612, + 45810: 35962, + 45811: 25600, + 45812: 25530, + 45813: 34633, + 45814: 39307, + 45815: 35863, + 45816: 32544, + 45817: 38130, + 45818: 20135, + 45819: 38416, + 45820: 39076, + 45821: 26124, + 45822: 29462, + 45888: 30694, + 45889: 30696, + 45890: 30698, + 45891: 30703, + 45892: 30704, + 45893: 30705, + 45894: 30706, + 45895: 30708, + 45896: 30709, + 45897: 30711, + 45898: 30713, + 45899: 30714, + 45900: 30715, + 45901: 30716, + 45902: 30723, + 45903: 30724, + 45904: 30725, + 45905: 30726, + 45906: 30727, + 45907: 30728, + 45908: 30730, + 45909: 30731, + 45910: 30734, + 45911: 30735, + 45912: 30736, + 45913: 30739, + 45914: 30741, + 45915: 30745, + 45916: 30747, + 45917: 30750, + 45918: 30752, + 45919: 30753, + 45920: 30754, + 45921: 30756, + 45922: 30760, + 45923: 30762, + 45924: 30763, + 45925: 30766, + 45926: 30767, + 45927: 30769, + 45928: 30770, + 45929: 30771, + 45930: 30773, + 45931: 30774, + 45932: 30781, + 45933: 30783, + 45934: 30785, + 45935: 30786, + 45936: 30787, + 45937: 30788, + 45938: 30790, + 45939: 30792, + 45940: 30793, + 45941: 30794, + 45942: 30795, + 45943: 30797, + 45944: 30799, + 45945: 30801, + 45946: 30803, + 45947: 30804, + 45948: 30808, + 45949: 30809, + 45950: 30810, + 45952: 30811, + 45953: 30812, + 45954: 30814, + 45955: 30815, + 45956: 30816, + 45957: 30817, + 45958: 30818, + 45959: 30819, + 45960: 30820, + 45961: 30821, + 45962: 30822, + 45963: 30823, + 45964: 30824, + 45965: 30825, + 45966: 30831, + 45967: 30832, + 45968: 30833, + 45969: 30834, + 45970: 30835, + 45971: 30836, + 45972: 30837, + 45973: 30838, + 45974: 30840, + 45975: 30841, + 45976: 30842, + 45977: 30843, + 45978: 30845, + 45979: 30846, + 45980: 30847, + 45981: 30848, + 45982: 30849, + 45983: 30850, + 45984: 30851, + 45985: 22330, + 45986: 23581, + 45987: 24120, + 45988: 38271, + 45989: 20607, + 45990: 32928, + 45991: 21378, + 45992: 25950, + 45993: 30021, + 45994: 21809, + 45995: 20513, + 45996: 36229, + 45997: 25220, + 45998: 38046, + 45999: 26397, + 46000: 22066, + 46001: 28526, + 46002: 24034, + 46003: 21557, + 46004: 28818, + 46005: 36710, + 46006: 25199, + 46007: 25764, + 46008: 25507, + 46009: 24443, + 46010: 28552, + 46011: 37108, + 46012: 33251, + 46013: 36784, + 46014: 23576, + 46015: 26216, + 46016: 24561, + 46017: 27785, + 46018: 38472, + 46019: 36225, + 46020: 34924, + 46021: 25745, + 46022: 31216, + 46023: 22478, + 46024: 27225, + 46025: 25104, + 46026: 21576, + 46027: 20056, + 46028: 31243, + 46029: 24809, + 46030: 28548, + 46031: 35802, + 46032: 25215, + 46033: 36894, + 46034: 39563, + 46035: 31204, + 46036: 21507, + 46037: 30196, + 46038: 25345, + 46039: 21273, + 46040: 27744, + 46041: 36831, + 46042: 24347, + 46043: 39536, + 46044: 32827, + 46045: 40831, + 46046: 20360, + 46047: 23610, + 46048: 36196, + 46049: 32709, + 46050: 26021, + 46051: 28861, + 46052: 20805, + 46053: 20914, + 46054: 34411, + 46055: 23815, + 46056: 23456, + 46057: 25277, + 46058: 37228, + 46059: 30068, + 46060: 36364, + 46061: 31264, + 46062: 24833, + 46063: 31609, + 46064: 20167, + 46065: 32504, + 46066: 30597, + 46067: 19985, + 46068: 33261, + 46069: 21021, + 46070: 20986, + 46071: 27249, + 46072: 21416, + 46073: 36487, + 46074: 38148, + 46075: 38607, + 46076: 28353, + 46077: 38500, + 46078: 26970, + 46144: 30852, + 46145: 30853, + 46146: 30854, + 46147: 30856, + 46148: 30858, + 46149: 30859, + 46150: 30863, + 46151: 30864, + 46152: 30866, + 46153: 30868, + 46154: 30869, + 46155: 30870, + 46156: 30873, + 46157: 30877, + 46158: 30878, + 46159: 30880, + 46160: 30882, + 46161: 30884, + 46162: 30886, + 46163: 30888, + 46164: 30889, + 46165: 30890, + 46166: 30891, + 46167: 30892, + 46168: 30893, + 46169: 30894, + 46170: 30895, + 46171: 30901, + 46172: 30902, + 46173: 30903, + 46174: 30904, + 46175: 30906, + 46176: 30907, + 46177: 30908, + 46178: 30909, + 46179: 30911, + 46180: 30912, + 46181: 30914, + 46182: 30915, + 46183: 30916, + 46184: 30918, + 46185: 30919, + 46186: 30920, + 46187: 30924, + 46188: 30925, + 46189: 30926, + 46190: 30927, + 46191: 30929, + 46192: 30930, + 46193: 30931, + 46194: 30934, + 46195: 30935, + 46196: 30936, + 46197: 30938, + 46198: 30939, + 46199: 30940, + 46200: 30941, + 46201: 30942, + 46202: 30943, + 46203: 30944, + 46204: 30945, + 46205: 30946, + 46206: 30947, + 46208: 30948, + 46209: 30949, + 46210: 30950, + 46211: 30951, + 46212: 30953, + 46213: 30954, + 46214: 30955, + 46215: 30957, + 46216: 30958, + 46217: 30959, + 46218: 30960, + 46219: 30961, + 46220: 30963, + 46221: 30965, + 46222: 30966, + 46223: 30968, + 46224: 30969, + 46225: 30971, + 46226: 30972, + 46227: 30973, + 46228: 30974, + 46229: 30975, + 46230: 30976, + 46231: 30978, + 46232: 30979, + 46233: 30980, + 46234: 30982, + 46235: 30983, + 46236: 30984, + 46237: 30985, + 46238: 30986, + 46239: 30987, + 46240: 30988, + 46241: 30784, + 46242: 20648, + 46243: 30679, + 46244: 25616, + 46245: 35302, + 46246: 22788, + 46247: 25571, + 46248: 24029, + 46249: 31359, + 46250: 26941, + 46251: 20256, + 46252: 33337, + 46253: 21912, + 46254: 20018, + 46255: 30126, + 46256: 31383, + 46257: 24162, + 46258: 24202, + 46259: 38383, + 46260: 21019, + 46261: 21561, + 46262: 28810, + 46263: 25462, + 46264: 38180, + 46265: 22402, + 46266: 26149, + 46267: 26943, + 46268: 37255, + 46269: 21767, + 46270: 28147, + 46271: 32431, + 46272: 34850, + 46273: 25139, + 46274: 32496, + 46275: 30133, + 46276: 33576, + 46277: 30913, + 46278: 38604, + 46279: 36766, + 46280: 24904, + 46281: 29943, + 46282: 35789, + 46283: 27492, + 46284: 21050, + 46285: 36176, + 46286: 27425, + 46287: 32874, + 46288: 33905, + 46289: 22257, + 46290: 21254, + 46291: 20174, + 46292: 19995, + 46293: 20945, + 46294: 31895, + 46295: 37259, + 46296: 31751, + 46297: 20419, + 46298: 36479, + 46299: 31713, + 46300: 31388, + 46301: 25703, + 46302: 23828, + 46303: 20652, + 46304: 33030, + 46305: 30209, + 46306: 31929, + 46307: 28140, + 46308: 32736, + 46309: 26449, + 46310: 23384, + 46311: 23544, + 46312: 30923, + 46313: 25774, + 46314: 25619, + 46315: 25514, + 46316: 25387, + 46317: 38169, + 46318: 25645, + 46319: 36798, + 46320: 31572, + 46321: 30249, + 46322: 25171, + 46323: 22823, + 46324: 21574, + 46325: 27513, + 46326: 20643, + 46327: 25140, + 46328: 24102, + 46329: 27526, + 46330: 20195, + 46331: 36151, + 46332: 34955, + 46333: 24453, + 46334: 36910, + 46400: 30989, + 46401: 30990, + 46402: 30991, + 46403: 30992, + 46404: 30993, + 46405: 30994, + 46406: 30996, + 46407: 30997, + 46408: 30998, + 46409: 30999, + 46410: 31000, + 46411: 31001, + 46412: 31002, + 46413: 31003, + 46414: 31004, + 46415: 31005, + 46416: 31007, + 46417: 31008, + 46418: 31009, + 46419: 31010, + 46420: 31011, + 46421: 31013, + 46422: 31014, + 46423: 31015, + 46424: 31016, + 46425: 31017, + 46426: 31018, + 46427: 31019, + 46428: 31020, + 46429: 31021, + 46430: 31022, + 46431: 31023, + 46432: 31024, + 46433: 31025, + 46434: 31026, + 46435: 31027, + 46436: 31029, + 46437: 31030, + 46438: 31031, + 46439: 31032, + 46440: 31033, + 46441: 31037, + 46442: 31039, + 46443: 31042, + 46444: 31043, + 46445: 31044, + 46446: 31045, + 46447: 31047, + 46448: 31050, + 46449: 31051, + 46450: 31052, + 46451: 31053, + 46452: 31054, + 46453: 31055, + 46454: 31056, + 46455: 31057, + 46456: 31058, + 46457: 31060, + 46458: 31061, + 46459: 31064, + 46460: 31065, + 46461: 31073, + 46462: 31075, + 46464: 31076, + 46465: 31078, + 46466: 31081, + 46467: 31082, + 46468: 31083, + 46469: 31084, + 46470: 31086, + 46471: 31088, + 46472: 31089, + 46473: 31090, + 46474: 31091, + 46475: 31092, + 46476: 31093, + 46477: 31094, + 46478: 31097, + 46479: 31099, + 46480: 31100, + 46481: 31101, + 46482: 31102, + 46483: 31103, + 46484: 31106, + 46485: 31107, + 46486: 31110, + 46487: 31111, + 46488: 31112, + 46489: 31113, + 46490: 31115, + 46491: 31116, + 46492: 31117, + 46493: 31118, + 46494: 31120, + 46495: 31121, + 46496: 31122, + 46497: 24608, + 46498: 32829, + 46499: 25285, + 46500: 20025, + 46501: 21333, + 46502: 37112, + 46503: 25528, + 46504: 32966, + 46505: 26086, + 46506: 27694, + 46507: 20294, + 46508: 24814, + 46509: 28129, + 46510: 35806, + 46511: 24377, + 46512: 34507, + 46513: 24403, + 46514: 25377, + 46515: 20826, + 46516: 33633, + 46517: 26723, + 46518: 20992, + 46519: 25443, + 46520: 36424, + 46521: 20498, + 46522: 23707, + 46523: 31095, + 46524: 23548, + 46525: 21040, + 46526: 31291, + 46527: 24764, + 46528: 36947, + 46529: 30423, + 46530: 24503, + 46531: 24471, + 46532: 30340, + 46533: 36460, + 46534: 28783, + 46535: 30331, + 46536: 31561, + 46537: 30634, + 46538: 20979, + 46539: 37011, + 46540: 22564, + 46541: 20302, + 46542: 28404, + 46543: 36842, + 46544: 25932, + 46545: 31515, + 46546: 29380, + 46547: 28068, + 46548: 32735, + 46549: 23265, + 46550: 25269, + 46551: 24213, + 46552: 22320, + 46553: 33922, + 46554: 31532, + 46555: 24093, + 46556: 24351, + 46557: 36882, + 46558: 32532, + 46559: 39072, + 46560: 25474, + 46561: 28359, + 46562: 30872, + 46563: 28857, + 46564: 20856, + 46565: 38747, + 46566: 22443, + 46567: 30005, + 46568: 20291, + 46569: 30008, + 46570: 24215, + 46571: 24806, + 46572: 22880, + 46573: 28096, + 46574: 27583, + 46575: 30857, + 46576: 21500, + 46577: 38613, + 46578: 20939, + 46579: 20993, + 46580: 25481, + 46581: 21514, + 46582: 38035, + 46583: 35843, + 46584: 36300, + 46585: 29241, + 46586: 30879, + 46587: 34678, + 46588: 36845, + 46589: 35853, + 46590: 21472, + 46656: 31123, + 46657: 31124, + 46658: 31125, + 46659: 31126, + 46660: 31127, + 46661: 31128, + 46662: 31129, + 46663: 31131, + 46664: 31132, + 46665: 31133, + 46666: 31134, + 46667: 31135, + 46668: 31136, + 46669: 31137, + 46670: 31138, + 46671: 31139, + 46672: 31140, + 46673: 31141, + 46674: 31142, + 46675: 31144, + 46676: 31145, + 46677: 31146, + 46678: 31147, + 46679: 31148, + 46680: 31149, + 46681: 31150, + 46682: 31151, + 46683: 31152, + 46684: 31153, + 46685: 31154, + 46686: 31156, + 46687: 31157, + 46688: 31158, + 46689: 31159, + 46690: 31160, + 46691: 31164, + 46692: 31167, + 46693: 31170, + 46694: 31172, + 46695: 31173, + 46696: 31175, + 46697: 31176, + 46698: 31178, + 46699: 31180, + 46700: 31182, + 46701: 31183, + 46702: 31184, + 46703: 31187, + 46704: 31188, + 46705: 31190, + 46706: 31191, + 46707: 31193, + 46708: 31194, + 46709: 31195, + 46710: 31196, + 46711: 31197, + 46712: 31198, + 46713: 31200, + 46714: 31201, + 46715: 31202, + 46716: 31205, + 46717: 31208, + 46718: 31210, + 46720: 31212, + 46721: 31214, + 46722: 31217, + 46723: 31218, + 46724: 31219, + 46725: 31220, + 46726: 31221, + 46727: 31222, + 46728: 31223, + 46729: 31225, + 46730: 31226, + 46731: 31228, + 46732: 31230, + 46733: 31231, + 46734: 31233, + 46735: 31236, + 46736: 31237, + 46737: 31239, + 46738: 31240, + 46739: 31241, + 46740: 31242, + 46741: 31244, + 46742: 31247, + 46743: 31248, + 46744: 31249, + 46745: 31250, + 46746: 31251, + 46747: 31253, + 46748: 31254, + 46749: 31256, + 46750: 31257, + 46751: 31259, + 46752: 31260, + 46753: 19969, + 46754: 30447, + 46755: 21486, + 46756: 38025, + 46757: 39030, + 46758: 40718, + 46759: 38189, + 46760: 23450, + 46761: 35746, + 46762: 20002, + 46763: 19996, + 46764: 20908, + 46765: 33891, + 46766: 25026, + 46767: 21160, + 46768: 26635, + 46769: 20375, + 46770: 24683, + 46771: 20923, + 46772: 27934, + 46773: 20828, + 46774: 25238, + 46775: 26007, + 46776: 38497, + 46777: 35910, + 46778: 36887, + 46779: 30168, + 46780: 37117, + 46781: 30563, + 46782: 27602, + 46783: 29322, + 46784: 29420, + 46785: 35835, + 46786: 22581, + 46787: 30585, + 46788: 36172, + 46789: 26460, + 46790: 38208, + 46791: 32922, + 46792: 24230, + 46793: 28193, + 46794: 22930, + 46795: 31471, + 46796: 30701, + 46797: 38203, + 46798: 27573, + 46799: 26029, + 46800: 32526, + 46801: 22534, + 46802: 20817, + 46803: 38431, + 46804: 23545, + 46805: 22697, + 46806: 21544, + 46807: 36466, + 46808: 25958, + 46809: 39039, + 46810: 22244, + 46811: 38045, + 46812: 30462, + 46813: 36929, + 46814: 25479, + 46815: 21702, + 46816: 22810, + 46817: 22842, + 46818: 22427, + 46819: 36530, + 46820: 26421, + 46821: 36346, + 46822: 33333, + 46823: 21057, + 46824: 24816, + 46825: 22549, + 46826: 34558, + 46827: 23784, + 46828: 40517, + 46829: 20420, + 46830: 39069, + 46831: 35769, + 46832: 23077, + 46833: 24694, + 46834: 21380, + 46835: 25212, + 46836: 36943, + 46837: 37122, + 46838: 39295, + 46839: 24681, + 46840: 32780, + 46841: 20799, + 46842: 32819, + 46843: 23572, + 46844: 39285, + 46845: 27953, + 46846: 20108, + 46912: 31261, + 46913: 31263, + 46914: 31265, + 46915: 31266, + 46916: 31268, + 46917: 31269, + 46918: 31270, + 46919: 31271, + 46920: 31272, + 46921: 31273, + 46922: 31274, + 46923: 31275, + 46924: 31276, + 46925: 31277, + 46926: 31278, + 46927: 31279, + 46928: 31280, + 46929: 31281, + 46930: 31282, + 46931: 31284, + 46932: 31285, + 46933: 31286, + 46934: 31288, + 46935: 31290, + 46936: 31294, + 46937: 31296, + 46938: 31297, + 46939: 31298, + 46940: 31299, + 46941: 31300, + 46942: 31301, + 46943: 31303, + 46944: 31304, + 46945: 31305, + 46946: 31306, + 46947: 31307, + 46948: 31308, + 46949: 31309, + 46950: 31310, + 46951: 31311, + 46952: 31312, + 46953: 31314, + 46954: 31315, + 46955: 31316, + 46956: 31317, + 46957: 31318, + 46958: 31320, + 46959: 31321, + 46960: 31322, + 46961: 31323, + 46962: 31324, + 46963: 31325, + 46964: 31326, + 46965: 31327, + 46966: 31328, + 46967: 31329, + 46968: 31330, + 46969: 31331, + 46970: 31332, + 46971: 31333, + 46972: 31334, + 46973: 31335, + 46974: 31336, + 46976: 31337, + 46977: 31338, + 46978: 31339, + 46979: 31340, + 46980: 31341, + 46981: 31342, + 46982: 31343, + 46983: 31345, + 46984: 31346, + 46985: 31347, + 46986: 31349, + 46987: 31355, + 46988: 31356, + 46989: 31357, + 46990: 31358, + 46991: 31362, + 46992: 31365, + 46993: 31367, + 46994: 31369, + 46995: 31370, + 46996: 31371, + 46997: 31372, + 46998: 31374, + 46999: 31375, + 47000: 31376, + 47001: 31379, + 47002: 31380, + 47003: 31385, + 47004: 31386, + 47005: 31387, + 47006: 31390, + 47007: 31393, + 47008: 31394, + 47009: 36144, + 47010: 21457, + 47011: 32602, + 47012: 31567, + 47013: 20240, + 47014: 20047, + 47015: 38400, + 47016: 27861, + 47017: 29648, + 47018: 34281, + 47019: 24070, + 47020: 30058, + 47021: 32763, + 47022: 27146, + 47023: 30718, + 47024: 38034, + 47025: 32321, + 47026: 20961, + 47027: 28902, + 47028: 21453, + 47029: 36820, + 47030: 33539, + 47031: 36137, + 47032: 29359, + 47033: 39277, + 47034: 27867, + 47035: 22346, + 47036: 33459, + 47037: 26041, + 47038: 32938, + 47039: 25151, + 47040: 38450, + 47041: 22952, + 47042: 20223, + 47043: 35775, + 47044: 32442, + 47045: 25918, + 47046: 33778, + 47047: 38750, + 47048: 21857, + 47049: 39134, + 47050: 32933, + 47051: 21290, + 47052: 35837, + 47053: 21536, + 47054: 32954, + 47055: 24223, + 47056: 27832, + 47057: 36153, + 47058: 33452, + 47059: 37210, + 47060: 21545, + 47061: 27675, + 47062: 20998, + 47063: 32439, + 47064: 22367, + 47065: 28954, + 47066: 27774, + 47067: 31881, + 47068: 22859, + 47069: 20221, + 47070: 24575, + 47071: 24868, + 47072: 31914, + 47073: 20016, + 47074: 23553, + 47075: 26539, + 47076: 34562, + 47077: 23792, + 47078: 38155, + 47079: 39118, + 47080: 30127, + 47081: 28925, + 47082: 36898, + 47083: 20911, + 47084: 32541, + 47085: 35773, + 47086: 22857, + 47087: 20964, + 47088: 20315, + 47089: 21542, + 47090: 22827, + 47091: 25975, + 47092: 32932, + 47093: 23413, + 47094: 25206, + 47095: 25282, + 47096: 36752, + 47097: 24133, + 47098: 27679, + 47099: 31526, + 47100: 20239, + 47101: 20440, + 47102: 26381, + 47168: 31395, + 47169: 31396, + 47170: 31399, + 47171: 31401, + 47172: 31402, + 47173: 31403, + 47174: 31406, + 47175: 31407, + 47176: 31408, + 47177: 31409, + 47178: 31410, + 47179: 31412, + 47180: 31413, + 47181: 31414, + 47182: 31415, + 47183: 31416, + 47184: 31417, + 47185: 31418, + 47186: 31419, + 47187: 31420, + 47188: 31421, + 47189: 31422, + 47190: 31424, + 47191: 31425, + 47192: 31426, + 47193: 31427, + 47194: 31428, + 47195: 31429, + 47196: 31430, + 47197: 31431, + 47198: 31432, + 47199: 31433, + 47200: 31434, + 47201: 31436, + 47202: 31437, + 47203: 31438, + 47204: 31439, + 47205: 31440, + 47206: 31441, + 47207: 31442, + 47208: 31443, + 47209: 31444, + 47210: 31445, + 47211: 31447, + 47212: 31448, + 47213: 31450, + 47214: 31451, + 47215: 31452, + 47216: 31453, + 47217: 31457, + 47218: 31458, + 47219: 31460, + 47220: 31463, + 47221: 31464, + 47222: 31465, + 47223: 31466, + 47224: 31467, + 47225: 31468, + 47226: 31470, + 47227: 31472, + 47228: 31473, + 47229: 31474, + 47230: 31475, + 47232: 31476, + 47233: 31477, + 47234: 31478, + 47235: 31479, + 47236: 31480, + 47237: 31483, + 47238: 31484, + 47239: 31486, + 47240: 31488, + 47241: 31489, + 47242: 31490, + 47243: 31493, + 47244: 31495, + 47245: 31497, + 47246: 31500, + 47247: 31501, + 47248: 31502, + 47249: 31504, + 47250: 31506, + 47251: 31507, + 47252: 31510, + 47253: 31511, + 47254: 31512, + 47255: 31514, + 47256: 31516, + 47257: 31517, + 47258: 31519, + 47259: 31521, + 47260: 31522, + 47261: 31523, + 47262: 31527, + 47263: 31529, + 47264: 31533, + 47265: 28014, + 47266: 28074, + 47267: 31119, + 47268: 34993, + 47269: 24343, + 47270: 29995, + 47271: 25242, + 47272: 36741, + 47273: 20463, + 47274: 37340, + 47275: 26023, + 47276: 33071, + 47277: 33105, + 47278: 24220, + 47279: 33104, + 47280: 36212, + 47281: 21103, + 47282: 35206, + 47283: 36171, + 47284: 22797, + 47285: 20613, + 47286: 20184, + 47287: 38428, + 47288: 29238, + 47289: 33145, + 47290: 36127, + 47291: 23500, + 47292: 35747, + 47293: 38468, + 47294: 22919, + 47295: 32538, + 47296: 21648, + 47297: 22134, + 47298: 22030, + 47299: 35813, + 47300: 25913, + 47301: 27010, + 47302: 38041, + 47303: 30422, + 47304: 28297, + 47305: 24178, + 47306: 29976, + 47307: 26438, + 47308: 26577, + 47309: 31487, + 47310: 32925, + 47311: 36214, + 47312: 24863, + 47313: 31174, + 47314: 25954, + 47315: 36195, + 47316: 20872, + 47317: 21018, + 47318: 38050, + 47319: 32568, + 47320: 32923, + 47321: 32434, + 47322: 23703, + 47323: 28207, + 47324: 26464, + 47325: 31705, + 47326: 30347, + 47327: 39640, + 47328: 33167, + 47329: 32660, + 47330: 31957, + 47331: 25630, + 47332: 38224, + 47333: 31295, + 47334: 21578, + 47335: 21733, + 47336: 27468, + 47337: 25601, + 47338: 25096, + 47339: 40509, + 47340: 33011, + 47341: 30105, + 47342: 21106, + 47343: 38761, + 47344: 33883, + 47345: 26684, + 47346: 34532, + 47347: 38401, + 47348: 38548, + 47349: 38124, + 47350: 20010, + 47351: 21508, + 47352: 32473, + 47353: 26681, + 47354: 36319, + 47355: 32789, + 47356: 26356, + 47357: 24218, + 47358: 32697, + 47424: 31535, + 47425: 31536, + 47426: 31538, + 47427: 31540, + 47428: 31541, + 47429: 31542, + 47430: 31543, + 47431: 31545, + 47432: 31547, + 47433: 31549, + 47434: 31551, + 47435: 31552, + 47436: 31553, + 47437: 31554, + 47438: 31555, + 47439: 31556, + 47440: 31558, + 47441: 31560, + 47442: 31562, + 47443: 31565, + 47444: 31566, + 47445: 31571, + 47446: 31573, + 47447: 31575, + 47448: 31577, + 47449: 31580, + 47450: 31582, + 47451: 31583, + 47452: 31585, + 47453: 31587, + 47454: 31588, + 47455: 31589, + 47456: 31590, + 47457: 31591, + 47458: 31592, + 47459: 31593, + 47460: 31594, + 47461: 31595, + 47462: 31596, + 47463: 31597, + 47464: 31599, + 47465: 31600, + 47466: 31603, + 47467: 31604, + 47468: 31606, + 47469: 31608, + 47470: 31610, + 47471: 31612, + 47472: 31613, + 47473: 31615, + 47474: 31617, + 47475: 31618, + 47476: 31619, + 47477: 31620, + 47478: 31622, + 47479: 31623, + 47480: 31624, + 47481: 31625, + 47482: 31626, + 47483: 31627, + 47484: 31628, + 47485: 31630, + 47486: 31631, + 47488: 31633, + 47489: 31634, + 47490: 31635, + 47491: 31638, + 47492: 31640, + 47493: 31641, + 47494: 31642, + 47495: 31643, + 47496: 31646, + 47497: 31647, + 47498: 31648, + 47499: 31651, + 47500: 31652, + 47501: 31653, + 47502: 31662, + 47503: 31663, + 47504: 31664, + 47505: 31666, + 47506: 31667, + 47507: 31669, + 47508: 31670, + 47509: 31671, + 47510: 31673, + 47511: 31674, + 47512: 31675, + 47513: 31676, + 47514: 31677, + 47515: 31678, + 47516: 31679, + 47517: 31680, + 47518: 31682, + 47519: 31683, + 47520: 31684, + 47521: 22466, + 47522: 32831, + 47523: 26775, + 47524: 24037, + 47525: 25915, + 47526: 21151, + 47527: 24685, + 47528: 40858, + 47529: 20379, + 47530: 36524, + 47531: 20844, + 47532: 23467, + 47533: 24339, + 47534: 24041, + 47535: 27742, + 47536: 25329, + 47537: 36129, + 47538: 20849, + 47539: 38057, + 47540: 21246, + 47541: 27807, + 47542: 33503, + 47543: 29399, + 47544: 22434, + 47545: 26500, + 47546: 36141, + 47547: 22815, + 47548: 36764, + 47549: 33735, + 47550: 21653, + 47551: 31629, + 47552: 20272, + 47553: 27837, + 47554: 23396, + 47555: 22993, + 47556: 40723, + 47557: 21476, + 47558: 34506, + 47559: 39592, + 47560: 35895, + 47561: 32929, + 47562: 25925, + 47563: 39038, + 47564: 22266, + 47565: 38599, + 47566: 21038, + 47567: 29916, + 47568: 21072, + 47569: 23521, + 47570: 25346, + 47571: 35074, + 47572: 20054, + 47573: 25296, + 47574: 24618, + 47575: 26874, + 47576: 20851, + 47577: 23448, + 47578: 20896, + 47579: 35266, + 47580: 31649, + 47581: 39302, + 47582: 32592, + 47583: 24815, + 47584: 28748, + 47585: 36143, + 47586: 20809, + 47587: 24191, + 47588: 36891, + 47589: 29808, + 47590: 35268, + 47591: 22317, + 47592: 30789, + 47593: 24402, + 47594: 40863, + 47595: 38394, + 47596: 36712, + 47597: 39740, + 47598: 35809, + 47599: 30328, + 47600: 26690, + 47601: 26588, + 47602: 36330, + 47603: 36149, + 47604: 21053, + 47605: 36746, + 47606: 28378, + 47607: 26829, + 47608: 38149, + 47609: 37101, + 47610: 22269, + 47611: 26524, + 47612: 35065, + 47613: 36807, + 47614: 21704, + 47680: 31685, + 47681: 31688, + 47682: 31689, + 47683: 31690, + 47684: 31691, + 47685: 31693, + 47686: 31694, + 47687: 31695, + 47688: 31696, + 47689: 31698, + 47690: 31700, + 47691: 31701, + 47692: 31702, + 47693: 31703, + 47694: 31704, + 47695: 31707, + 47696: 31708, + 47697: 31710, + 47698: 31711, + 47699: 31712, + 47700: 31714, + 47701: 31715, + 47702: 31716, + 47703: 31719, + 47704: 31720, + 47705: 31721, + 47706: 31723, + 47707: 31724, + 47708: 31725, + 47709: 31727, + 47710: 31728, + 47711: 31730, + 47712: 31731, + 47713: 31732, + 47714: 31733, + 47715: 31734, + 47716: 31736, + 47717: 31737, + 47718: 31738, + 47719: 31739, + 47720: 31741, + 47721: 31743, + 47722: 31744, + 47723: 31745, + 47724: 31746, + 47725: 31747, + 47726: 31748, + 47727: 31749, + 47728: 31750, + 47729: 31752, + 47730: 31753, + 47731: 31754, + 47732: 31757, + 47733: 31758, + 47734: 31760, + 47735: 31761, + 47736: 31762, + 47737: 31763, + 47738: 31764, + 47739: 31765, + 47740: 31767, + 47741: 31768, + 47742: 31769, + 47744: 31770, + 47745: 31771, + 47746: 31772, + 47747: 31773, + 47748: 31774, + 47749: 31776, + 47750: 31777, + 47751: 31778, + 47752: 31779, + 47753: 31780, + 47754: 31781, + 47755: 31784, + 47756: 31785, + 47757: 31787, + 47758: 31788, + 47759: 31789, + 47760: 31790, + 47761: 31791, + 47762: 31792, + 47763: 31793, + 47764: 31794, + 47765: 31795, + 47766: 31796, + 47767: 31797, + 47768: 31798, + 47769: 31799, + 47770: 31801, + 47771: 31802, + 47772: 31803, + 47773: 31804, + 47774: 31805, + 47775: 31806, + 47776: 31810, + 47777: 39608, + 47778: 23401, + 47779: 28023, + 47780: 27686, + 47781: 20133, + 47782: 23475, + 47783: 39559, + 47784: 37219, + 47785: 25000, + 47786: 37039, + 47787: 38889, + 47788: 21547, + 47789: 28085, + 47790: 23506, + 47791: 20989, + 47792: 21898, + 47793: 32597, + 47794: 32752, + 47795: 25788, + 47796: 25421, + 47797: 26097, + 47798: 25022, + 47799: 24717, + 47800: 28938, + 47801: 27735, + 47802: 27721, + 47803: 22831, + 47804: 26477, + 47805: 33322, + 47806: 22741, + 47807: 22158, + 47808: 35946, + 47809: 27627, + 47810: 37085, + 47811: 22909, + 47812: 32791, + 47813: 21495, + 47814: 28009, + 47815: 21621, + 47816: 21917, + 47817: 33655, + 47818: 33743, + 47819: 26680, + 47820: 31166, + 47821: 21644, + 47822: 20309, + 47823: 21512, + 47824: 30418, + 47825: 35977, + 47826: 38402, + 47827: 27827, + 47828: 28088, + 47829: 36203, + 47830: 35088, + 47831: 40548, + 47832: 36154, + 47833: 22079, + 47834: 40657, + 47835: 30165, + 47836: 24456, + 47837: 29408, + 47838: 24680, + 47839: 21756, + 47840: 20136, + 47841: 27178, + 47842: 34913, + 47843: 24658, + 47844: 36720, + 47845: 21700, + 47846: 28888, + 47847: 34425, + 47848: 40511, + 47849: 27946, + 47850: 23439, + 47851: 24344, + 47852: 32418, + 47853: 21897, + 47854: 20399, + 47855: 29492, + 47856: 21564, + 47857: 21402, + 47858: 20505, + 47859: 21518, + 47860: 21628, + 47861: 20046, + 47862: 24573, + 47863: 29786, + 47864: 22774, + 47865: 33899, + 47866: 32993, + 47867: 34676, + 47868: 29392, + 47869: 31946, + 47870: 28246, + 47936: 31811, + 47937: 31812, + 47938: 31813, + 47939: 31814, + 47940: 31815, + 47941: 31816, + 47942: 31817, + 47943: 31818, + 47944: 31819, + 47945: 31820, + 47946: 31822, + 47947: 31823, + 47948: 31824, + 47949: 31825, + 47950: 31826, + 47951: 31827, + 47952: 31828, + 47953: 31829, + 47954: 31830, + 47955: 31831, + 47956: 31832, + 47957: 31833, + 47958: 31834, + 47959: 31835, + 47960: 31836, + 47961: 31837, + 47962: 31838, + 47963: 31839, + 47964: 31840, + 47965: 31841, + 47966: 31842, + 47967: 31843, + 47968: 31844, + 47969: 31845, + 47970: 31846, + 47971: 31847, + 47972: 31848, + 47973: 31849, + 47974: 31850, + 47975: 31851, + 47976: 31852, + 47977: 31853, + 47978: 31854, + 47979: 31855, + 47980: 31856, + 47981: 31857, + 47982: 31858, + 47983: 31861, + 47984: 31862, + 47985: 31863, + 47986: 31864, + 47987: 31865, + 47988: 31866, + 47989: 31870, + 47990: 31871, + 47991: 31872, + 47992: 31873, + 47993: 31874, + 47994: 31875, + 47995: 31876, + 47996: 31877, + 47997: 31878, + 47998: 31879, + 48000: 31880, + 48001: 31882, + 48002: 31883, + 48003: 31884, + 48004: 31885, + 48005: 31886, + 48006: 31887, + 48007: 31888, + 48008: 31891, + 48009: 31892, + 48010: 31894, + 48011: 31897, + 48012: 31898, + 48013: 31899, + 48014: 31904, + 48015: 31905, + 48016: 31907, + 48017: 31910, + 48018: 31911, + 48019: 31912, + 48020: 31913, + 48021: 31915, + 48022: 31916, + 48023: 31917, + 48024: 31919, + 48025: 31920, + 48026: 31924, + 48027: 31925, + 48028: 31926, + 48029: 31927, + 48030: 31928, + 48031: 31930, + 48032: 31931, + 48033: 24359, + 48034: 34382, + 48035: 21804, + 48036: 25252, + 48037: 20114, + 48038: 27818, + 48039: 25143, + 48040: 33457, + 48041: 21719, + 48042: 21326, + 48043: 29502, + 48044: 28369, + 48045: 30011, + 48046: 21010, + 48047: 21270, + 48048: 35805, + 48049: 27088, + 48050: 24458, + 48051: 24576, + 48052: 28142, + 48053: 22351, + 48054: 27426, + 48055: 29615, + 48056: 26707, + 48057: 36824, + 48058: 32531, + 48059: 25442, + 48060: 24739, + 48061: 21796, + 48062: 30186, + 48063: 35938, + 48064: 28949, + 48065: 28067, + 48066: 23462, + 48067: 24187, + 48068: 33618, + 48069: 24908, + 48070: 40644, + 48071: 30970, + 48072: 34647, + 48073: 31783, + 48074: 30343, + 48075: 20976, + 48076: 24822, + 48077: 29004, + 48078: 26179, + 48079: 24140, + 48080: 24653, + 48081: 35854, + 48082: 28784, + 48083: 25381, + 48084: 36745, + 48085: 24509, + 48086: 24674, + 48087: 34516, + 48088: 22238, + 48089: 27585, + 48090: 24724, + 48091: 24935, + 48092: 21321, + 48093: 24800, + 48094: 26214, + 48095: 36159, + 48096: 31229, + 48097: 20250, + 48098: 28905, + 48099: 27719, + 48100: 35763, + 48101: 35826, + 48102: 32472, + 48103: 33636, + 48104: 26127, + 48105: 23130, + 48106: 39746, + 48107: 27985, + 48108: 28151, + 48109: 35905, + 48110: 27963, + 48111: 20249, + 48112: 28779, + 48113: 33719, + 48114: 25110, + 48115: 24785, + 48116: 38669, + 48117: 36135, + 48118: 31096, + 48119: 20987, + 48120: 22334, + 48121: 22522, + 48122: 26426, + 48123: 30072, + 48124: 31293, + 48125: 31215, + 48126: 31637, + 48192: 31935, + 48193: 31936, + 48194: 31938, + 48195: 31939, + 48196: 31940, + 48197: 31942, + 48198: 31945, + 48199: 31947, + 48200: 31950, + 48201: 31951, + 48202: 31952, + 48203: 31953, + 48204: 31954, + 48205: 31955, + 48206: 31956, + 48207: 31960, + 48208: 31962, + 48209: 31963, + 48210: 31965, + 48211: 31966, + 48212: 31969, + 48213: 31970, + 48214: 31971, + 48215: 31972, + 48216: 31973, + 48217: 31974, + 48218: 31975, + 48219: 31977, + 48220: 31978, + 48221: 31979, + 48222: 31980, + 48223: 31981, + 48224: 31982, + 48225: 31984, + 48226: 31985, + 48227: 31986, + 48228: 31987, + 48229: 31988, + 48230: 31989, + 48231: 31990, + 48232: 31991, + 48233: 31993, + 48234: 31994, + 48235: 31996, + 48236: 31997, + 48237: 31998, + 48238: 31999, + 48239: 32000, + 48240: 32001, + 48241: 32002, + 48242: 32003, + 48243: 32004, + 48244: 32005, + 48245: 32006, + 48246: 32007, + 48247: 32008, + 48248: 32009, + 48249: 32011, + 48250: 32012, + 48251: 32013, + 48252: 32014, + 48253: 32015, + 48254: 32016, + 48256: 32017, + 48257: 32018, + 48258: 32019, + 48259: 32020, + 48260: 32021, + 48261: 32022, + 48262: 32023, + 48263: 32024, + 48264: 32025, + 48265: 32026, + 48266: 32027, + 48267: 32028, + 48268: 32029, + 48269: 32030, + 48270: 32031, + 48271: 32033, + 48272: 32035, + 48273: 32036, + 48274: 32037, + 48275: 32038, + 48276: 32040, + 48277: 32041, + 48278: 32042, + 48279: 32044, + 48280: 32045, + 48281: 32046, + 48282: 32048, + 48283: 32049, + 48284: 32050, + 48285: 32051, + 48286: 32052, + 48287: 32053, + 48288: 32054, + 48289: 32908, + 48290: 39269, + 48291: 36857, + 48292: 28608, + 48293: 35749, + 48294: 40481, + 48295: 23020, + 48296: 32489, + 48297: 32521, + 48298: 21513, + 48299: 26497, + 48300: 26840, + 48301: 36753, + 48302: 31821, + 48303: 38598, + 48304: 21450, + 48305: 24613, + 48306: 30142, + 48307: 27762, + 48308: 21363, + 48309: 23241, + 48310: 32423, + 48311: 25380, + 48312: 20960, + 48313: 33034, + 48314: 24049, + 48315: 34015, + 48316: 25216, + 48317: 20864, + 48318: 23395, + 48319: 20238, + 48320: 31085, + 48321: 21058, + 48322: 24760, + 48323: 27982, + 48324: 23492, + 48325: 23490, + 48326: 35745, + 48327: 35760, + 48328: 26082, + 48329: 24524, + 48330: 38469, + 48331: 22931, + 48332: 32487, + 48333: 32426, + 48334: 22025, + 48335: 26551, + 48336: 22841, + 48337: 20339, + 48338: 23478, + 48339: 21152, + 48340: 33626, + 48341: 39050, + 48342: 36158, + 48343: 30002, + 48344: 38078, + 48345: 20551, + 48346: 31292, + 48347: 20215, + 48348: 26550, + 48349: 39550, + 48350: 23233, + 48351: 27516, + 48352: 30417, + 48353: 22362, + 48354: 23574, + 48355: 31546, + 48356: 38388, + 48357: 29006, + 48358: 20860, + 48359: 32937, + 48360: 33392, + 48361: 22904, + 48362: 32516, + 48363: 33575, + 48364: 26816, + 48365: 26604, + 48366: 30897, + 48367: 30839, + 48368: 25315, + 48369: 25441, + 48370: 31616, + 48371: 20461, + 48372: 21098, + 48373: 20943, + 48374: 33616, + 48375: 27099, + 48376: 37492, + 48377: 36341, + 48378: 36145, + 48379: 35265, + 48380: 38190, + 48381: 31661, + 48382: 20214, + 48448: 32055, + 48449: 32056, + 48450: 32057, + 48451: 32058, + 48452: 32059, + 48453: 32060, + 48454: 32061, + 48455: 32062, + 48456: 32063, + 48457: 32064, + 48458: 32065, + 48459: 32066, + 48460: 32067, + 48461: 32068, + 48462: 32069, + 48463: 32070, + 48464: 32071, + 48465: 32072, + 48466: 32073, + 48467: 32074, + 48468: 32075, + 48469: 32076, + 48470: 32077, + 48471: 32078, + 48472: 32079, + 48473: 32080, + 48474: 32081, + 48475: 32082, + 48476: 32083, + 48477: 32084, + 48478: 32085, + 48479: 32086, + 48480: 32087, + 48481: 32088, + 48482: 32089, + 48483: 32090, + 48484: 32091, + 48485: 32092, + 48486: 32093, + 48487: 32094, + 48488: 32095, + 48489: 32096, + 48490: 32097, + 48491: 32098, + 48492: 32099, + 48493: 32100, + 48494: 32101, + 48495: 32102, + 48496: 32103, + 48497: 32104, + 48498: 32105, + 48499: 32106, + 48500: 32107, + 48501: 32108, + 48502: 32109, + 48503: 32111, + 48504: 32112, + 48505: 32113, + 48506: 32114, + 48507: 32115, + 48508: 32116, + 48509: 32117, + 48510: 32118, + 48512: 32120, + 48513: 32121, + 48514: 32122, + 48515: 32123, + 48516: 32124, + 48517: 32125, + 48518: 32126, + 48519: 32127, + 48520: 32128, + 48521: 32129, + 48522: 32130, + 48523: 32131, + 48524: 32132, + 48525: 32133, + 48526: 32134, + 48527: 32135, + 48528: 32136, + 48529: 32137, + 48530: 32138, + 48531: 32139, + 48532: 32140, + 48533: 32141, + 48534: 32142, + 48535: 32143, + 48536: 32144, + 48537: 32145, + 48538: 32146, + 48539: 32147, + 48540: 32148, + 48541: 32149, + 48542: 32150, + 48543: 32151, + 48544: 32152, + 48545: 20581, + 48546: 33328, + 48547: 21073, + 48548: 39279, + 48549: 28176, + 48550: 28293, + 48551: 28071, + 48552: 24314, + 48553: 20725, + 48554: 23004, + 48555: 23558, + 48556: 27974, + 48557: 27743, + 48558: 30086, + 48559: 33931, + 48560: 26728, + 48561: 22870, + 48562: 35762, + 48563: 21280, + 48564: 37233, + 48565: 38477, + 48566: 34121, + 48567: 26898, + 48568: 30977, + 48569: 28966, + 48570: 33014, + 48571: 20132, + 48572: 37066, + 48573: 27975, + 48574: 39556, + 48575: 23047, + 48576: 22204, + 48577: 25605, + 48578: 38128, + 48579: 30699, + 48580: 20389, + 48581: 33050, + 48582: 29409, + 48583: 35282, + 48584: 39290, + 48585: 32564, + 48586: 32478, + 48587: 21119, + 48588: 25945, + 48589: 37237, + 48590: 36735, + 48591: 36739, + 48592: 21483, + 48593: 31382, + 48594: 25581, + 48595: 25509, + 48596: 30342, + 48597: 31224, + 48598: 34903, + 48599: 38454, + 48600: 25130, + 48601: 21163, + 48602: 33410, + 48603: 26708, + 48604: 26480, + 48605: 25463, + 48606: 30571, + 48607: 31469, + 48608: 27905, + 48609: 32467, + 48610: 35299, + 48611: 22992, + 48612: 25106, + 48613: 34249, + 48614: 33445, + 48615: 30028, + 48616: 20511, + 48617: 20171, + 48618: 30117, + 48619: 35819, + 48620: 23626, + 48621: 24062, + 48622: 31563, + 48623: 26020, + 48624: 37329, + 48625: 20170, + 48626: 27941, + 48627: 35167, + 48628: 32039, + 48629: 38182, + 48630: 20165, + 48631: 35880, + 48632: 36827, + 48633: 38771, + 48634: 26187, + 48635: 31105, + 48636: 36817, + 48637: 28908, + 48638: 28024, + 48704: 32153, + 48705: 32154, + 48706: 32155, + 48707: 32156, + 48708: 32157, + 48709: 32158, + 48710: 32159, + 48711: 32160, + 48712: 32161, + 48713: 32162, + 48714: 32163, + 48715: 32164, + 48716: 32165, + 48717: 32167, + 48718: 32168, + 48719: 32169, + 48720: 32170, + 48721: 32171, + 48722: 32172, + 48723: 32173, + 48724: 32175, + 48725: 32176, + 48726: 32177, + 48727: 32178, + 48728: 32179, + 48729: 32180, + 48730: 32181, + 48731: 32182, + 48732: 32183, + 48733: 32184, + 48734: 32185, + 48735: 32186, + 48736: 32187, + 48737: 32188, + 48738: 32189, + 48739: 32190, + 48740: 32191, + 48741: 32192, + 48742: 32193, + 48743: 32194, + 48744: 32195, + 48745: 32196, + 48746: 32197, + 48747: 32198, + 48748: 32199, + 48749: 32200, + 48750: 32201, + 48751: 32202, + 48752: 32203, + 48753: 32204, + 48754: 32205, + 48755: 32206, + 48756: 32207, + 48757: 32208, + 48758: 32209, + 48759: 32210, + 48760: 32211, + 48761: 32212, + 48762: 32213, + 48763: 32214, + 48764: 32215, + 48765: 32216, + 48766: 32217, + 48768: 32218, + 48769: 32219, + 48770: 32220, + 48771: 32221, + 48772: 32222, + 48773: 32223, + 48774: 32224, + 48775: 32225, + 48776: 32226, + 48777: 32227, + 48778: 32228, + 48779: 32229, + 48780: 32230, + 48781: 32231, + 48782: 32232, + 48783: 32233, + 48784: 32234, + 48785: 32235, + 48786: 32236, + 48787: 32237, + 48788: 32238, + 48789: 32239, + 48790: 32240, + 48791: 32241, + 48792: 32242, + 48793: 32243, + 48794: 32244, + 48795: 32245, + 48796: 32246, + 48797: 32247, + 48798: 32248, + 48799: 32249, + 48800: 32250, + 48801: 23613, + 48802: 21170, + 48803: 33606, + 48804: 20834, + 48805: 33550, + 48806: 30555, + 48807: 26230, + 48808: 40120, + 48809: 20140, + 48810: 24778, + 48811: 31934, + 48812: 31923, + 48813: 32463, + 48814: 20117, + 48815: 35686, + 48816: 26223, + 48817: 39048, + 48818: 38745, + 48819: 22659, + 48820: 25964, + 48821: 38236, + 48822: 24452, + 48823: 30153, + 48824: 38742, + 48825: 31455, + 48826: 31454, + 48827: 20928, + 48828: 28847, + 48829: 31384, + 48830: 25578, + 48831: 31350, + 48832: 32416, + 48833: 29590, + 48834: 38893, + 48835: 20037, + 48836: 28792, + 48837: 20061, + 48838: 37202, + 48839: 21417, + 48840: 25937, + 48841: 26087, + 48842: 33276, + 48843: 33285, + 48844: 21646, + 48845: 23601, + 48846: 30106, + 48847: 38816, + 48848: 25304, + 48849: 29401, + 48850: 30141, + 48851: 23621, + 48852: 39545, + 48853: 33738, + 48854: 23616, + 48855: 21632, + 48856: 30697, + 48857: 20030, + 48858: 27822, + 48859: 32858, + 48860: 25298, + 48861: 25454, + 48862: 24040, + 48863: 20855, + 48864: 36317, + 48865: 36382, + 48866: 38191, + 48867: 20465, + 48868: 21477, + 48869: 24807, + 48870: 28844, + 48871: 21095, + 48872: 25424, + 48873: 40515, + 48874: 23071, + 48875: 20518, + 48876: 30519, + 48877: 21367, + 48878: 32482, + 48879: 25733, + 48880: 25899, + 48881: 25225, + 48882: 25496, + 48883: 20500, + 48884: 29237, + 48885: 35273, + 48886: 20915, + 48887: 35776, + 48888: 32477, + 48889: 22343, + 48890: 33740, + 48891: 38055, + 48892: 20891, + 48893: 21531, + 48894: 23803, + 48960: 32251, + 48961: 32252, + 48962: 32253, + 48963: 32254, + 48964: 32255, + 48965: 32256, + 48966: 32257, + 48967: 32258, + 48968: 32259, + 48969: 32260, + 48970: 32261, + 48971: 32262, + 48972: 32263, + 48973: 32264, + 48974: 32265, + 48975: 32266, + 48976: 32267, + 48977: 32268, + 48978: 32269, + 48979: 32270, + 48980: 32271, + 48981: 32272, + 48982: 32273, + 48983: 32274, + 48984: 32275, + 48985: 32276, + 48986: 32277, + 48987: 32278, + 48988: 32279, + 48989: 32280, + 48990: 32281, + 48991: 32282, + 48992: 32283, + 48993: 32284, + 48994: 32285, + 48995: 32286, + 48996: 32287, + 48997: 32288, + 48998: 32289, + 48999: 32290, + 49000: 32291, + 49001: 32292, + 49002: 32293, + 49003: 32294, + 49004: 32295, + 49005: 32296, + 49006: 32297, + 49007: 32298, + 49008: 32299, + 49009: 32300, + 49010: 32301, + 49011: 32302, + 49012: 32303, + 49013: 32304, + 49014: 32305, + 49015: 32306, + 49016: 32307, + 49017: 32308, + 49018: 32309, + 49019: 32310, + 49020: 32311, + 49021: 32312, + 49022: 32313, + 49024: 32314, + 49025: 32316, + 49026: 32317, + 49027: 32318, + 49028: 32319, + 49029: 32320, + 49030: 32322, + 49031: 32323, + 49032: 32324, + 49033: 32325, + 49034: 32326, + 49035: 32328, + 49036: 32329, + 49037: 32330, + 49038: 32331, + 49039: 32332, + 49040: 32333, + 49041: 32334, + 49042: 32335, + 49043: 32336, + 49044: 32337, + 49045: 32338, + 49046: 32339, + 49047: 32340, + 49048: 32341, + 49049: 32342, + 49050: 32343, + 49051: 32344, + 49052: 32345, + 49053: 32346, + 49054: 32347, + 49055: 32348, + 49056: 32349, + 49057: 20426, + 49058: 31459, + 49059: 27994, + 49060: 37089, + 49061: 39567, + 49062: 21888, + 49063: 21654, + 49064: 21345, + 49065: 21679, + 49066: 24320, + 49067: 25577, + 49068: 26999, + 49069: 20975, + 49070: 24936, + 49071: 21002, + 49072: 22570, + 49073: 21208, + 49074: 22350, + 49075: 30733, + 49076: 30475, + 49077: 24247, + 49078: 24951, + 49079: 31968, + 49080: 25179, + 49081: 25239, + 49082: 20130, + 49083: 28821, + 49084: 32771, + 49085: 25335, + 49086: 28900, + 49087: 38752, + 49088: 22391, + 49089: 33499, + 49090: 26607, + 49091: 26869, + 49092: 30933, + 49093: 39063, + 49094: 31185, + 49095: 22771, + 49096: 21683, + 49097: 21487, + 49098: 28212, + 49099: 20811, + 49100: 21051, + 49101: 23458, + 49102: 35838, + 49103: 32943, + 49104: 21827, + 49105: 22438, + 49106: 24691, + 49107: 22353, + 49108: 21549, + 49109: 31354, + 49110: 24656, + 49111: 23380, + 49112: 25511, + 49113: 25248, + 49114: 21475, + 49115: 25187, + 49116: 23495, + 49117: 26543, + 49118: 21741, + 49119: 31391, + 49120: 33510, + 49121: 37239, + 49122: 24211, + 49123: 35044, + 49124: 22840, + 49125: 22446, + 49126: 25358, + 49127: 36328, + 49128: 33007, + 49129: 22359, + 49130: 31607, + 49131: 20393, + 49132: 24555, + 49133: 23485, + 49134: 27454, + 49135: 21281, + 49136: 31568, + 49137: 29378, + 49138: 26694, + 49139: 30719, + 49140: 30518, + 49141: 26103, + 49142: 20917, + 49143: 20111, + 49144: 30420, + 49145: 23743, + 49146: 31397, + 49147: 33909, + 49148: 22862, + 49149: 39745, + 49150: 20608, + 49216: 32350, + 49217: 32351, + 49218: 32352, + 49219: 32353, + 49220: 32354, + 49221: 32355, + 49222: 32356, + 49223: 32357, + 49224: 32358, + 49225: 32359, + 49226: 32360, + 49227: 32361, + 49228: 32362, + 49229: 32363, + 49230: 32364, + 49231: 32365, + 49232: 32366, + 49233: 32367, + 49234: 32368, + 49235: 32369, + 49236: 32370, + 49237: 32371, + 49238: 32372, + 49239: 32373, + 49240: 32374, + 49241: 32375, + 49242: 32376, + 49243: 32377, + 49244: 32378, + 49245: 32379, + 49246: 32380, + 49247: 32381, + 49248: 32382, + 49249: 32383, + 49250: 32384, + 49251: 32385, + 49252: 32387, + 49253: 32388, + 49254: 32389, + 49255: 32390, + 49256: 32391, + 49257: 32392, + 49258: 32393, + 49259: 32394, + 49260: 32395, + 49261: 32396, + 49262: 32397, + 49263: 32398, + 49264: 32399, + 49265: 32400, + 49266: 32401, + 49267: 32402, + 49268: 32403, + 49269: 32404, + 49270: 32405, + 49271: 32406, + 49272: 32407, + 49273: 32408, + 49274: 32409, + 49275: 32410, + 49276: 32412, + 49277: 32413, + 49278: 32414, + 49280: 32430, + 49281: 32436, + 49282: 32443, + 49283: 32444, + 49284: 32470, + 49285: 32484, + 49286: 32492, + 49287: 32505, + 49288: 32522, + 49289: 32528, + 49290: 32542, + 49291: 32567, + 49292: 32569, + 49293: 32571, + 49294: 32572, + 49295: 32573, + 49296: 32574, + 49297: 32575, + 49298: 32576, + 49299: 32577, + 49300: 32579, + 49301: 32582, + 49302: 32583, + 49303: 32584, + 49304: 32585, + 49305: 32586, + 49306: 32587, + 49307: 32588, + 49308: 32589, + 49309: 32590, + 49310: 32591, + 49311: 32594, + 49312: 32595, + 49313: 39304, + 49314: 24871, + 49315: 28291, + 49316: 22372, + 49317: 26118, + 49318: 25414, + 49319: 22256, + 49320: 25324, + 49321: 25193, + 49322: 24275, + 49323: 38420, + 49324: 22403, + 49325: 25289, + 49326: 21895, + 49327: 34593, + 49328: 33098, + 49329: 36771, + 49330: 21862, + 49331: 33713, + 49332: 26469, + 49333: 36182, + 49334: 34013, + 49335: 23146, + 49336: 26639, + 49337: 25318, + 49338: 31726, + 49339: 38417, + 49340: 20848, + 49341: 28572, + 49342: 35888, + 49343: 25597, + 49344: 35272, + 49345: 25042, + 49346: 32518, + 49347: 28866, + 49348: 28389, + 49349: 29701, + 49350: 27028, + 49351: 29436, + 49352: 24266, + 49353: 37070, + 49354: 26391, + 49355: 28010, + 49356: 25438, + 49357: 21171, + 49358: 29282, + 49359: 32769, + 49360: 20332, + 49361: 23013, + 49362: 37226, + 49363: 28889, + 49364: 28061, + 49365: 21202, + 49366: 20048, + 49367: 38647, + 49368: 38253, + 49369: 34174, + 49370: 30922, + 49371: 32047, + 49372: 20769, + 49373: 22418, + 49374: 25794, + 49375: 32907, + 49376: 31867, + 49377: 27882, + 49378: 26865, + 49379: 26974, + 49380: 20919, + 49381: 21400, + 49382: 26792, + 49383: 29313, + 49384: 40654, + 49385: 31729, + 49386: 29432, + 49387: 31163, + 49388: 28435, + 49389: 29702, + 49390: 26446, + 49391: 37324, + 49392: 40100, + 49393: 31036, + 49394: 33673, + 49395: 33620, + 49396: 21519, + 49397: 26647, + 49398: 20029, + 49399: 21385, + 49400: 21169, + 49401: 30782, + 49402: 21382, + 49403: 21033, + 49404: 20616, + 49405: 20363, + 49406: 20432, + 49472: 32598, + 49473: 32601, + 49474: 32603, + 49475: 32604, + 49476: 32605, + 49477: 32606, + 49478: 32608, + 49479: 32611, + 49480: 32612, + 49481: 32613, + 49482: 32614, + 49483: 32615, + 49484: 32619, + 49485: 32620, + 49486: 32621, + 49487: 32623, + 49488: 32624, + 49489: 32627, + 49490: 32629, + 49491: 32630, + 49492: 32631, + 49493: 32632, + 49494: 32634, + 49495: 32635, + 49496: 32636, + 49497: 32637, + 49498: 32639, + 49499: 32640, + 49500: 32642, + 49501: 32643, + 49502: 32644, + 49503: 32645, + 49504: 32646, + 49505: 32647, + 49506: 32648, + 49507: 32649, + 49508: 32651, + 49509: 32653, + 49510: 32655, + 49511: 32656, + 49512: 32657, + 49513: 32658, + 49514: 32659, + 49515: 32661, + 49516: 32662, + 49517: 32663, + 49518: 32664, + 49519: 32665, + 49520: 32667, + 49521: 32668, + 49522: 32672, + 49523: 32674, + 49524: 32675, + 49525: 32677, + 49526: 32678, + 49527: 32680, + 49528: 32681, + 49529: 32682, + 49530: 32683, + 49531: 32684, + 49532: 32685, + 49533: 32686, + 49534: 32689, + 49536: 32691, + 49537: 32692, + 49538: 32693, + 49539: 32694, + 49540: 32695, + 49541: 32698, + 49542: 32699, + 49543: 32702, + 49544: 32704, + 49545: 32706, + 49546: 32707, + 49547: 32708, + 49548: 32710, + 49549: 32711, + 49550: 32712, + 49551: 32713, + 49552: 32715, + 49553: 32717, + 49554: 32719, + 49555: 32720, + 49556: 32721, + 49557: 32722, + 49558: 32723, + 49559: 32726, + 49560: 32727, + 49561: 32729, + 49562: 32730, + 49563: 32731, + 49564: 32732, + 49565: 32733, + 49566: 32734, + 49567: 32738, + 49568: 32739, + 49569: 30178, + 49570: 31435, + 49571: 31890, + 49572: 27813, + 49573: 38582, + 49574: 21147, + 49575: 29827, + 49576: 21737, + 49577: 20457, + 49578: 32852, + 49579: 33714, + 49580: 36830, + 49581: 38256, + 49582: 24265, + 49583: 24604, + 49584: 28063, + 49585: 24088, + 49586: 25947, + 49587: 33080, + 49588: 38142, + 49589: 24651, + 49590: 28860, + 49591: 32451, + 49592: 31918, + 49593: 20937, + 49594: 26753, + 49595: 31921, + 49596: 33391, + 49597: 20004, + 49598: 36742, + 49599: 37327, + 49600: 26238, + 49601: 20142, + 49602: 35845, + 49603: 25769, + 49604: 32842, + 49605: 20698, + 49606: 30103, + 49607: 29134, + 49608: 23525, + 49609: 36797, + 49610: 28518, + 49611: 20102, + 49612: 25730, + 49613: 38243, + 49614: 24278, + 49615: 26009, + 49616: 21015, + 49617: 35010, + 49618: 28872, + 49619: 21155, + 49620: 29454, + 49621: 29747, + 49622: 26519, + 49623: 30967, + 49624: 38678, + 49625: 20020, + 49626: 37051, + 49627: 40158, + 49628: 28107, + 49629: 20955, + 49630: 36161, + 49631: 21533, + 49632: 25294, + 49633: 29618, + 49634: 33777, + 49635: 38646, + 49636: 40836, + 49637: 38083, + 49638: 20278, + 49639: 32666, + 49640: 20940, + 49641: 28789, + 49642: 38517, + 49643: 23725, + 49644: 39046, + 49645: 21478, + 49646: 20196, + 49647: 28316, + 49648: 29705, + 49649: 27060, + 49650: 30827, + 49651: 39311, + 49652: 30041, + 49653: 21016, + 49654: 30244, + 49655: 27969, + 49656: 26611, + 49657: 20845, + 49658: 40857, + 49659: 32843, + 49660: 21657, + 49661: 31548, + 49662: 31423, + 49728: 32740, + 49729: 32743, + 49730: 32744, + 49731: 32746, + 49732: 32747, + 49733: 32748, + 49734: 32749, + 49735: 32751, + 49736: 32754, + 49737: 32756, + 49738: 32757, + 49739: 32758, + 49740: 32759, + 49741: 32760, + 49742: 32761, + 49743: 32762, + 49744: 32765, + 49745: 32766, + 49746: 32767, + 49747: 32770, + 49748: 32775, + 49749: 32776, + 49750: 32777, + 49751: 32778, + 49752: 32782, + 49753: 32783, + 49754: 32785, + 49755: 32787, + 49756: 32794, + 49757: 32795, + 49758: 32797, + 49759: 32798, + 49760: 32799, + 49761: 32801, + 49762: 32803, + 49763: 32804, + 49764: 32811, + 49765: 32812, + 49766: 32813, + 49767: 32814, + 49768: 32815, + 49769: 32816, + 49770: 32818, + 49771: 32820, + 49772: 32825, + 49773: 32826, + 49774: 32828, + 49775: 32830, + 49776: 32832, + 49777: 32833, + 49778: 32836, + 49779: 32837, + 49780: 32839, + 49781: 32840, + 49782: 32841, + 49783: 32846, + 49784: 32847, + 49785: 32848, + 49786: 32849, + 49787: 32851, + 49788: 32853, + 49789: 32854, + 49790: 32855, + 49792: 32857, + 49793: 32859, + 49794: 32860, + 49795: 32861, + 49796: 32862, + 49797: 32863, + 49798: 32864, + 49799: 32865, + 49800: 32866, + 49801: 32867, + 49802: 32868, + 49803: 32869, + 49804: 32870, + 49805: 32871, + 49806: 32872, + 49807: 32875, + 49808: 32876, + 49809: 32877, + 49810: 32878, + 49811: 32879, + 49812: 32880, + 49813: 32882, + 49814: 32883, + 49815: 32884, + 49816: 32885, + 49817: 32886, + 49818: 32887, + 49819: 32888, + 49820: 32889, + 49821: 32890, + 49822: 32891, + 49823: 32892, + 49824: 32893, + 49825: 38534, + 49826: 22404, + 49827: 25314, + 49828: 38471, + 49829: 27004, + 49830: 23044, + 49831: 25602, + 49832: 31699, + 49833: 28431, + 49834: 38475, + 49835: 33446, + 49836: 21346, + 49837: 39045, + 49838: 24208, + 49839: 28809, + 49840: 25523, + 49841: 21348, + 49842: 34383, + 49843: 40065, + 49844: 40595, + 49845: 30860, + 49846: 38706, + 49847: 36335, + 49848: 36162, + 49849: 40575, + 49850: 28510, + 49851: 31108, + 49852: 24405, + 49853: 38470, + 49854: 25134, + 49855: 39540, + 49856: 21525, + 49857: 38109, + 49858: 20387, + 49859: 26053, + 49860: 23653, + 49861: 23649, + 49862: 32533, + 49863: 34385, + 49864: 27695, + 49865: 24459, + 49866: 29575, + 49867: 28388, + 49868: 32511, + 49869: 23782, + 49870: 25371, + 49871: 23402, + 49872: 28390, + 49873: 21365, + 49874: 20081, + 49875: 25504, + 49876: 30053, + 49877: 25249, + 49878: 36718, + 49879: 20262, + 49880: 20177, + 49881: 27814, + 49882: 32438, + 49883: 35770, + 49884: 33821, + 49885: 34746, + 49886: 32599, + 49887: 36923, + 49888: 38179, + 49889: 31657, + 49890: 39585, + 49891: 35064, + 49892: 33853, + 49893: 27931, + 49894: 39558, + 49895: 32476, + 49896: 22920, + 49897: 40635, + 49898: 29595, + 49899: 30721, + 49900: 34434, + 49901: 39532, + 49902: 39554, + 49903: 22043, + 49904: 21527, + 49905: 22475, + 49906: 20080, + 49907: 40614, + 49908: 21334, + 49909: 36808, + 49910: 33033, + 49911: 30610, + 49912: 39314, + 49913: 34542, + 49914: 28385, + 49915: 34067, + 49916: 26364, + 49917: 24930, + 49918: 28459, + 49984: 32894, + 49985: 32897, + 49986: 32898, + 49987: 32901, + 49988: 32904, + 49989: 32906, + 49990: 32909, + 49991: 32910, + 49992: 32911, + 49993: 32912, + 49994: 32913, + 49995: 32914, + 49996: 32916, + 49997: 32917, + 49998: 32919, + 49999: 32921, + 50000: 32926, + 50001: 32931, + 50002: 32934, + 50003: 32935, + 50004: 32936, + 50005: 32940, + 50006: 32944, + 50007: 32947, + 50008: 32949, + 50009: 32950, + 50010: 32952, + 50011: 32953, + 50012: 32955, + 50013: 32965, + 50014: 32967, + 50015: 32968, + 50016: 32969, + 50017: 32970, + 50018: 32971, + 50019: 32975, + 50020: 32976, + 50021: 32977, + 50022: 32978, + 50023: 32979, + 50024: 32980, + 50025: 32981, + 50026: 32984, + 50027: 32991, + 50028: 32992, + 50029: 32994, + 50030: 32995, + 50031: 32998, + 50032: 33006, + 50033: 33013, + 50034: 33015, + 50035: 33017, + 50036: 33019, + 50037: 33022, + 50038: 33023, + 50039: 33024, + 50040: 33025, + 50041: 33027, + 50042: 33028, + 50043: 33029, + 50044: 33031, + 50045: 33032, + 50046: 33035, + 50048: 33036, + 50049: 33045, + 50050: 33047, + 50051: 33049, + 50052: 33051, + 50053: 33052, + 50054: 33053, + 50055: 33055, + 50056: 33056, + 50057: 33057, + 50058: 33058, + 50059: 33059, + 50060: 33060, + 50061: 33061, + 50062: 33062, + 50063: 33063, + 50064: 33064, + 50065: 33065, + 50066: 33066, + 50067: 33067, + 50068: 33069, + 50069: 33070, + 50070: 33072, + 50071: 33075, + 50072: 33076, + 50073: 33077, + 50074: 33079, + 50075: 33081, + 50076: 33082, + 50077: 33083, + 50078: 33084, + 50079: 33085, + 50080: 33087, + 50081: 35881, + 50082: 33426, + 50083: 33579, + 50084: 30450, + 50085: 27667, + 50086: 24537, + 50087: 33725, + 50088: 29483, + 50089: 33541, + 50090: 38170, + 50091: 27611, + 50092: 30683, + 50093: 38086, + 50094: 21359, + 50095: 33538, + 50096: 20882, + 50097: 24125, + 50098: 35980, + 50099: 36152, + 50100: 20040, + 50101: 29611, + 50102: 26522, + 50103: 26757, + 50104: 37238, + 50105: 38665, + 50106: 29028, + 50107: 27809, + 50108: 30473, + 50109: 23186, + 50110: 38209, + 50111: 27599, + 50112: 32654, + 50113: 26151, + 50114: 23504, + 50115: 22969, + 50116: 23194, + 50117: 38376, + 50118: 38391, + 50119: 20204, + 50120: 33804, + 50121: 33945, + 50122: 27308, + 50123: 30431, + 50124: 38192, + 50125: 29467, + 50126: 26790, + 50127: 23391, + 50128: 30511, + 50129: 37274, + 50130: 38753, + 50131: 31964, + 50132: 36855, + 50133: 35868, + 50134: 24357, + 50135: 31859, + 50136: 31192, + 50137: 35269, + 50138: 27852, + 50139: 34588, + 50140: 23494, + 50141: 24130, + 50142: 26825, + 50143: 30496, + 50144: 32501, + 50145: 20885, + 50146: 20813, + 50147: 21193, + 50148: 23081, + 50149: 32517, + 50150: 38754, + 50151: 33495, + 50152: 25551, + 50153: 30596, + 50154: 34256, + 50155: 31186, + 50156: 28218, + 50157: 24217, + 50158: 22937, + 50159: 34065, + 50160: 28781, + 50161: 27665, + 50162: 25279, + 50163: 30399, + 50164: 25935, + 50165: 24751, + 50166: 38397, + 50167: 26126, + 50168: 34719, + 50169: 40483, + 50170: 38125, + 50171: 21517, + 50172: 21629, + 50173: 35884, + 50174: 25720, + 50240: 33088, + 50241: 33089, + 50242: 33090, + 50243: 33091, + 50244: 33092, + 50245: 33093, + 50246: 33095, + 50247: 33097, + 50248: 33101, + 50249: 33102, + 50250: 33103, + 50251: 33106, + 50252: 33110, + 50253: 33111, + 50254: 33112, + 50255: 33115, + 50256: 33116, + 50257: 33117, + 50258: 33118, + 50259: 33119, + 50260: 33121, + 50261: 33122, + 50262: 33123, + 50263: 33124, + 50264: 33126, + 50265: 33128, + 50266: 33130, + 50267: 33131, + 50268: 33132, + 50269: 33135, + 50270: 33138, + 50271: 33139, + 50272: 33141, + 50273: 33142, + 50274: 33143, + 50275: 33144, + 50276: 33153, + 50277: 33155, + 50278: 33156, + 50279: 33157, + 50280: 33158, + 50281: 33159, + 50282: 33161, + 50283: 33163, + 50284: 33164, + 50285: 33165, + 50286: 33166, + 50287: 33168, + 50288: 33170, + 50289: 33171, + 50290: 33172, + 50291: 33173, + 50292: 33174, + 50293: 33175, + 50294: 33177, + 50295: 33178, + 50296: 33182, + 50297: 33183, + 50298: 33184, + 50299: 33185, + 50300: 33186, + 50301: 33188, + 50302: 33189, + 50304: 33191, + 50305: 33193, + 50306: 33195, + 50307: 33196, + 50308: 33197, + 50309: 33198, + 50310: 33199, + 50311: 33200, + 50312: 33201, + 50313: 33202, + 50314: 33204, + 50315: 33205, + 50316: 33206, + 50317: 33207, + 50318: 33208, + 50319: 33209, + 50320: 33212, + 50321: 33213, + 50322: 33214, + 50323: 33215, + 50324: 33220, + 50325: 33221, + 50326: 33223, + 50327: 33224, + 50328: 33225, + 50329: 33227, + 50330: 33229, + 50331: 33230, + 50332: 33231, + 50333: 33232, + 50334: 33233, + 50335: 33234, + 50336: 33235, + 50337: 25721, + 50338: 34321, + 50339: 27169, + 50340: 33180, + 50341: 30952, + 50342: 25705, + 50343: 39764, + 50344: 25273, + 50345: 26411, + 50346: 33707, + 50347: 22696, + 50348: 40664, + 50349: 27819, + 50350: 28448, + 50351: 23518, + 50352: 38476, + 50353: 35851, + 50354: 29279, + 50355: 26576, + 50356: 25287, + 50357: 29281, + 50358: 20137, + 50359: 22982, + 50360: 27597, + 50361: 22675, + 50362: 26286, + 50363: 24149, + 50364: 21215, + 50365: 24917, + 50366: 26408, + 50367: 30446, + 50368: 30566, + 50369: 29287, + 50370: 31302, + 50371: 25343, + 50372: 21738, + 50373: 21584, + 50374: 38048, + 50375: 37027, + 50376: 23068, + 50377: 32435, + 50378: 27670, + 50379: 20035, + 50380: 22902, + 50381: 32784, + 50382: 22856, + 50383: 21335, + 50384: 30007, + 50385: 38590, + 50386: 22218, + 50387: 25376, + 50388: 33041, + 50389: 24700, + 50390: 38393, + 50391: 28118, + 50392: 21602, + 50393: 39297, + 50394: 20869, + 50395: 23273, + 50396: 33021, + 50397: 22958, + 50398: 38675, + 50399: 20522, + 50400: 27877, + 50401: 23612, + 50402: 25311, + 50403: 20320, + 50404: 21311, + 50405: 33147, + 50406: 36870, + 50407: 28346, + 50408: 34091, + 50409: 25288, + 50410: 24180, + 50411: 30910, + 50412: 25781, + 50413: 25467, + 50414: 24565, + 50415: 23064, + 50416: 37247, + 50417: 40479, + 50418: 23615, + 50419: 25423, + 50420: 32834, + 50421: 23421, + 50422: 21870, + 50423: 38218, + 50424: 38221, + 50425: 28037, + 50426: 24744, + 50427: 26592, + 50428: 29406, + 50429: 20957, + 50430: 23425, + 50496: 33236, + 50497: 33237, + 50498: 33238, + 50499: 33239, + 50500: 33240, + 50501: 33241, + 50502: 33242, + 50503: 33243, + 50504: 33244, + 50505: 33245, + 50506: 33246, + 50507: 33247, + 50508: 33248, + 50509: 33249, + 50510: 33250, + 50511: 33252, + 50512: 33253, + 50513: 33254, + 50514: 33256, + 50515: 33257, + 50516: 33259, + 50517: 33262, + 50518: 33263, + 50519: 33264, + 50520: 33265, + 50521: 33266, + 50522: 33269, + 50523: 33270, + 50524: 33271, + 50525: 33272, + 50526: 33273, + 50527: 33274, + 50528: 33277, + 50529: 33279, + 50530: 33283, + 50531: 33287, + 50532: 33288, + 50533: 33289, + 50534: 33290, + 50535: 33291, + 50536: 33294, + 50537: 33295, + 50538: 33297, + 50539: 33299, + 50540: 33301, + 50541: 33302, + 50542: 33303, + 50543: 33304, + 50544: 33305, + 50545: 33306, + 50546: 33309, + 50547: 33312, + 50548: 33316, + 50549: 33317, + 50550: 33318, + 50551: 33319, + 50552: 33321, + 50553: 33326, + 50554: 33330, + 50555: 33338, + 50556: 33340, + 50557: 33341, + 50558: 33343, + 50560: 33344, + 50561: 33345, + 50562: 33346, + 50563: 33347, + 50564: 33349, + 50565: 33350, + 50566: 33352, + 50567: 33354, + 50568: 33356, + 50569: 33357, + 50570: 33358, + 50571: 33360, + 50572: 33361, + 50573: 33362, + 50574: 33363, + 50575: 33364, + 50576: 33365, + 50577: 33366, + 50578: 33367, + 50579: 33369, + 50580: 33371, + 50581: 33372, + 50582: 33373, + 50583: 33374, + 50584: 33376, + 50585: 33377, + 50586: 33378, + 50587: 33379, + 50588: 33380, + 50589: 33381, + 50590: 33382, + 50591: 33383, + 50592: 33385, + 50593: 25319, + 50594: 27870, + 50595: 29275, + 50596: 25197, + 50597: 38062, + 50598: 32445, + 50599: 33043, + 50600: 27987, + 50601: 20892, + 50602: 24324, + 50603: 22900, + 50604: 21162, + 50605: 24594, + 50606: 22899, + 50607: 26262, + 50608: 34384, + 50609: 30111, + 50610: 25386, + 50611: 25062, + 50612: 31983, + 50613: 35834, + 50614: 21734, + 50615: 27431, + 50616: 40485, + 50617: 27572, + 50618: 34261, + 50619: 21589, + 50620: 20598, + 50621: 27812, + 50622: 21866, + 50623: 36276, + 50624: 29228, + 50625: 24085, + 50626: 24597, + 50627: 29750, + 50628: 25293, + 50629: 25490, + 50630: 29260, + 50631: 24472, + 50632: 28227, + 50633: 27966, + 50634: 25856, + 50635: 28504, + 50636: 30424, + 50637: 30928, + 50638: 30460, + 50639: 30036, + 50640: 21028, + 50641: 21467, + 50642: 20051, + 50643: 24222, + 50644: 26049, + 50645: 32810, + 50646: 32982, + 50647: 25243, + 50648: 21638, + 50649: 21032, + 50650: 28846, + 50651: 34957, + 50652: 36305, + 50653: 27873, + 50654: 21624, + 50655: 32986, + 50656: 22521, + 50657: 35060, + 50658: 36180, + 50659: 38506, + 50660: 37197, + 50661: 20329, + 50662: 27803, + 50663: 21943, + 50664: 30406, + 50665: 30768, + 50666: 25256, + 50667: 28921, + 50668: 28558, + 50669: 24429, + 50670: 34028, + 50671: 26842, + 50672: 30844, + 50673: 31735, + 50674: 33192, + 50675: 26379, + 50676: 40527, + 50677: 25447, + 50678: 30896, + 50679: 22383, + 50680: 30738, + 50681: 38713, + 50682: 25209, + 50683: 25259, + 50684: 21128, + 50685: 29749, + 50686: 27607, + 50752: 33386, + 50753: 33387, + 50754: 33388, + 50755: 33389, + 50756: 33393, + 50757: 33397, + 50758: 33398, + 50759: 33399, + 50760: 33400, + 50761: 33403, + 50762: 33404, + 50763: 33408, + 50764: 33409, + 50765: 33411, + 50766: 33413, + 50767: 33414, + 50768: 33415, + 50769: 33417, + 50770: 33420, + 50771: 33424, + 50772: 33427, + 50773: 33428, + 50774: 33429, + 50775: 33430, + 50776: 33434, + 50777: 33435, + 50778: 33438, + 50779: 33440, + 50780: 33442, + 50781: 33443, + 50782: 33447, + 50783: 33458, + 50784: 33461, + 50785: 33462, + 50786: 33466, + 50787: 33467, + 50788: 33468, + 50789: 33471, + 50790: 33472, + 50791: 33474, + 50792: 33475, + 50793: 33477, + 50794: 33478, + 50795: 33481, + 50796: 33488, + 50797: 33494, + 50798: 33497, + 50799: 33498, + 50800: 33501, + 50801: 33506, + 50802: 33511, + 50803: 33512, + 50804: 33513, + 50805: 33514, + 50806: 33516, + 50807: 33517, + 50808: 33518, + 50809: 33520, + 50810: 33522, + 50811: 33523, + 50812: 33525, + 50813: 33526, + 50814: 33528, + 50816: 33530, + 50817: 33532, + 50818: 33533, + 50819: 33534, + 50820: 33535, + 50821: 33536, + 50822: 33546, + 50823: 33547, + 50824: 33549, + 50825: 33552, + 50826: 33554, + 50827: 33555, + 50828: 33558, + 50829: 33560, + 50830: 33561, + 50831: 33565, + 50832: 33566, + 50833: 33567, + 50834: 33568, + 50835: 33569, + 50836: 33570, + 50837: 33571, + 50838: 33572, + 50839: 33573, + 50840: 33574, + 50841: 33577, + 50842: 33578, + 50843: 33582, + 50844: 33584, + 50845: 33586, + 50846: 33591, + 50847: 33595, + 50848: 33597, + 50849: 21860, + 50850: 33086, + 50851: 30130, + 50852: 30382, + 50853: 21305, + 50854: 30174, + 50855: 20731, + 50856: 23617, + 50857: 35692, + 50858: 31687, + 50859: 20559, + 50860: 29255, + 50861: 39575, + 50862: 39128, + 50863: 28418, + 50864: 29922, + 50865: 31080, + 50866: 25735, + 50867: 30629, + 50868: 25340, + 50869: 39057, + 50870: 36139, + 50871: 21697, + 50872: 32856, + 50873: 20050, + 50874: 22378, + 50875: 33529, + 50876: 33805, + 50877: 24179, + 50878: 20973, + 50879: 29942, + 50880: 35780, + 50881: 23631, + 50882: 22369, + 50883: 27900, + 50884: 39047, + 50885: 23110, + 50886: 30772, + 50887: 39748, + 50888: 36843, + 50889: 31893, + 50890: 21078, + 50891: 25169, + 50892: 38138, + 50893: 20166, + 50894: 33670, + 50895: 33889, + 50896: 33769, + 50897: 33970, + 50898: 22484, + 50899: 26420, + 50900: 22275, + 50901: 26222, + 50902: 28006, + 50903: 35889, + 50904: 26333, + 50905: 28689, + 50906: 26399, + 50907: 27450, + 50908: 26646, + 50909: 25114, + 50910: 22971, + 50911: 19971, + 50912: 20932, + 50913: 28422, + 50914: 26578, + 50915: 27791, + 50916: 20854, + 50917: 26827, + 50918: 22855, + 50919: 27495, + 50920: 30054, + 50921: 23822, + 50922: 33040, + 50923: 40784, + 50924: 26071, + 50925: 31048, + 50926: 31041, + 50927: 39569, + 50928: 36215, + 50929: 23682, + 50930: 20062, + 50931: 20225, + 50932: 21551, + 50933: 22865, + 50934: 30732, + 50935: 22120, + 50936: 27668, + 50937: 36804, + 50938: 24323, + 50939: 27773, + 50940: 27875, + 50941: 35755, + 50942: 25488, + 51008: 33598, + 51009: 33599, + 51010: 33601, + 51011: 33602, + 51012: 33604, + 51013: 33605, + 51014: 33608, + 51015: 33610, + 51016: 33611, + 51017: 33612, + 51018: 33613, + 51019: 33614, + 51020: 33619, + 51021: 33621, + 51022: 33622, + 51023: 33623, + 51024: 33624, + 51025: 33625, + 51026: 33629, + 51027: 33634, + 51028: 33648, + 51029: 33649, + 51030: 33650, + 51031: 33651, + 51032: 33652, + 51033: 33653, + 51034: 33654, + 51035: 33657, + 51036: 33658, + 51037: 33662, + 51038: 33663, + 51039: 33664, + 51040: 33665, + 51041: 33666, + 51042: 33667, + 51043: 33668, + 51044: 33671, + 51045: 33672, + 51046: 33674, + 51047: 33675, + 51048: 33676, + 51049: 33677, + 51050: 33679, + 51051: 33680, + 51052: 33681, + 51053: 33684, + 51054: 33685, + 51055: 33686, + 51056: 33687, + 51057: 33689, + 51058: 33690, + 51059: 33693, + 51060: 33695, + 51061: 33697, + 51062: 33698, + 51063: 33699, + 51064: 33700, + 51065: 33701, + 51066: 33702, + 51067: 33703, + 51068: 33708, + 51069: 33709, + 51070: 33710, + 51072: 33711, + 51073: 33717, + 51074: 33723, + 51075: 33726, + 51076: 33727, + 51077: 33730, + 51078: 33731, + 51079: 33732, + 51080: 33734, + 51081: 33736, + 51082: 33737, + 51083: 33739, + 51084: 33741, + 51085: 33742, + 51086: 33744, + 51087: 33745, + 51088: 33746, + 51089: 33747, + 51090: 33749, + 51091: 33751, + 51092: 33753, + 51093: 33754, + 51094: 33755, + 51095: 33758, + 51096: 33762, + 51097: 33763, + 51098: 33764, + 51099: 33766, + 51100: 33767, + 51101: 33768, + 51102: 33771, + 51103: 33772, + 51104: 33773, + 51105: 24688, + 51106: 27965, + 51107: 29301, + 51108: 25190, + 51109: 38030, + 51110: 38085, + 51111: 21315, + 51112: 36801, + 51113: 31614, + 51114: 20191, + 51115: 35878, + 51116: 20094, + 51117: 40660, + 51118: 38065, + 51119: 38067, + 51120: 21069, + 51121: 28508, + 51122: 36963, + 51123: 27973, + 51124: 35892, + 51125: 22545, + 51126: 23884, + 51127: 27424, + 51128: 27465, + 51129: 26538, + 51130: 21595, + 51131: 33108, + 51132: 32652, + 51133: 22681, + 51134: 34103, + 51135: 24378, + 51136: 25250, + 51137: 27207, + 51138: 38201, + 51139: 25970, + 51140: 24708, + 51141: 26725, + 51142: 30631, + 51143: 20052, + 51144: 20392, + 51145: 24039, + 51146: 38808, + 51147: 25772, + 51148: 32728, + 51149: 23789, + 51150: 20431, + 51151: 31373, + 51152: 20999, + 51153: 33540, + 51154: 19988, + 51155: 24623, + 51156: 31363, + 51157: 38054, + 51158: 20405, + 51159: 20146, + 51160: 31206, + 51161: 29748, + 51162: 21220, + 51163: 33465, + 51164: 25810, + 51165: 31165, + 51166: 23517, + 51167: 27777, + 51168: 38738, + 51169: 36731, + 51170: 27682, + 51171: 20542, + 51172: 21375, + 51173: 28165, + 51174: 25806, + 51175: 26228, + 51176: 27696, + 51177: 24773, + 51178: 39031, + 51179: 35831, + 51180: 24198, + 51181: 29756, + 51182: 31351, + 51183: 31179, + 51184: 19992, + 51185: 37041, + 51186: 29699, + 51187: 27714, + 51188: 22234, + 51189: 37195, + 51190: 27845, + 51191: 36235, + 51192: 21306, + 51193: 34502, + 51194: 26354, + 51195: 36527, + 51196: 23624, + 51197: 39537, + 51198: 28192, + 51264: 33774, + 51265: 33775, + 51266: 33779, + 51267: 33780, + 51268: 33781, + 51269: 33782, + 51270: 33783, + 51271: 33786, + 51272: 33787, + 51273: 33788, + 51274: 33790, + 51275: 33791, + 51276: 33792, + 51277: 33794, + 51278: 33797, + 51279: 33799, + 51280: 33800, + 51281: 33801, + 51282: 33802, + 51283: 33808, + 51284: 33810, + 51285: 33811, + 51286: 33812, + 51287: 33813, + 51288: 33814, + 51289: 33815, + 51290: 33817, + 51291: 33818, + 51292: 33819, + 51293: 33822, + 51294: 33823, + 51295: 33824, + 51296: 33825, + 51297: 33826, + 51298: 33827, + 51299: 33833, + 51300: 33834, + 51301: 33835, + 51302: 33836, + 51303: 33837, + 51304: 33838, + 51305: 33839, + 51306: 33840, + 51307: 33842, + 51308: 33843, + 51309: 33844, + 51310: 33845, + 51311: 33846, + 51312: 33847, + 51313: 33849, + 51314: 33850, + 51315: 33851, + 51316: 33854, + 51317: 33855, + 51318: 33856, + 51319: 33857, + 51320: 33858, + 51321: 33859, + 51322: 33860, + 51323: 33861, + 51324: 33863, + 51325: 33864, + 51326: 33865, + 51328: 33866, + 51329: 33867, + 51330: 33868, + 51331: 33869, + 51332: 33870, + 51333: 33871, + 51334: 33872, + 51335: 33874, + 51336: 33875, + 51337: 33876, + 51338: 33877, + 51339: 33878, + 51340: 33880, + 51341: 33885, + 51342: 33886, + 51343: 33887, + 51344: 33888, + 51345: 33890, + 51346: 33892, + 51347: 33893, + 51348: 33894, + 51349: 33895, + 51350: 33896, + 51351: 33898, + 51352: 33902, + 51353: 33903, + 51354: 33904, + 51355: 33906, + 51356: 33908, + 51357: 33911, + 51358: 33913, + 51359: 33915, + 51360: 33916, + 51361: 21462, + 51362: 23094, + 51363: 40843, + 51364: 36259, + 51365: 21435, + 51366: 22280, + 51367: 39079, + 51368: 26435, + 51369: 37275, + 51370: 27849, + 51371: 20840, + 51372: 30154, + 51373: 25331, + 51374: 29356, + 51375: 21048, + 51376: 21149, + 51377: 32570, + 51378: 28820, + 51379: 30264, + 51380: 21364, + 51381: 40522, + 51382: 27063, + 51383: 30830, + 51384: 38592, + 51385: 35033, + 51386: 32676, + 51387: 28982, + 51388: 29123, + 51389: 20873, + 51390: 26579, + 51391: 29924, + 51392: 22756, + 51393: 25880, + 51394: 22199, + 51395: 35753, + 51396: 39286, + 51397: 25200, + 51398: 32469, + 51399: 24825, + 51400: 28909, + 51401: 22764, + 51402: 20161, + 51403: 20154, + 51404: 24525, + 51405: 38887, + 51406: 20219, + 51407: 35748, + 51408: 20995, + 51409: 22922, + 51410: 32427, + 51411: 25172, + 51412: 20173, + 51413: 26085, + 51414: 25102, + 51415: 33592, + 51416: 33993, + 51417: 33635, + 51418: 34701, + 51419: 29076, + 51420: 28342, + 51421: 23481, + 51422: 32466, + 51423: 20887, + 51424: 25545, + 51425: 26580, + 51426: 32905, + 51427: 33593, + 51428: 34837, + 51429: 20754, + 51430: 23418, + 51431: 22914, + 51432: 36785, + 51433: 20083, + 51434: 27741, + 51435: 20837, + 51436: 35109, + 51437: 36719, + 51438: 38446, + 51439: 34122, + 51440: 29790, + 51441: 38160, + 51442: 38384, + 51443: 28070, + 51444: 33509, + 51445: 24369, + 51446: 25746, + 51447: 27922, + 51448: 33832, + 51449: 33134, + 51450: 40131, + 51451: 22622, + 51452: 36187, + 51453: 19977, + 51454: 21441, + 51520: 33917, + 51521: 33918, + 51522: 33919, + 51523: 33920, + 51524: 33921, + 51525: 33923, + 51526: 33924, + 51527: 33925, + 51528: 33926, + 51529: 33930, + 51530: 33933, + 51531: 33935, + 51532: 33936, + 51533: 33937, + 51534: 33938, + 51535: 33939, + 51536: 33940, + 51537: 33941, + 51538: 33942, + 51539: 33944, + 51540: 33946, + 51541: 33947, + 51542: 33949, + 51543: 33950, + 51544: 33951, + 51545: 33952, + 51546: 33954, + 51547: 33955, + 51548: 33956, + 51549: 33957, + 51550: 33958, + 51551: 33959, + 51552: 33960, + 51553: 33961, + 51554: 33962, + 51555: 33963, + 51556: 33964, + 51557: 33965, + 51558: 33966, + 51559: 33968, + 51560: 33969, + 51561: 33971, + 51562: 33973, + 51563: 33974, + 51564: 33975, + 51565: 33979, + 51566: 33980, + 51567: 33982, + 51568: 33984, + 51569: 33986, + 51570: 33987, + 51571: 33989, + 51572: 33990, + 51573: 33991, + 51574: 33992, + 51575: 33995, + 51576: 33996, + 51577: 33998, + 51578: 33999, + 51579: 34002, + 51580: 34004, + 51581: 34005, + 51582: 34007, + 51584: 34008, + 51585: 34009, + 51586: 34010, + 51587: 34011, + 51588: 34012, + 51589: 34014, + 51590: 34017, + 51591: 34018, + 51592: 34020, + 51593: 34023, + 51594: 34024, + 51595: 34025, + 51596: 34026, + 51597: 34027, + 51598: 34029, + 51599: 34030, + 51600: 34031, + 51601: 34033, + 51602: 34034, + 51603: 34035, + 51604: 34036, + 51605: 34037, + 51606: 34038, + 51607: 34039, + 51608: 34040, + 51609: 34041, + 51610: 34042, + 51611: 34043, + 51612: 34045, + 51613: 34046, + 51614: 34048, + 51615: 34049, + 51616: 34050, + 51617: 20254, + 51618: 25955, + 51619: 26705, + 51620: 21971, + 51621: 20007, + 51622: 25620, + 51623: 39578, + 51624: 25195, + 51625: 23234, + 51626: 29791, + 51627: 33394, + 51628: 28073, + 51629: 26862, + 51630: 20711, + 51631: 33678, + 51632: 30722, + 51633: 26432, + 51634: 21049, + 51635: 27801, + 51636: 32433, + 51637: 20667, + 51638: 21861, + 51639: 29022, + 51640: 31579, + 51641: 26194, + 51642: 29642, + 51643: 33515, + 51644: 26441, + 51645: 23665, + 51646: 21024, + 51647: 29053, + 51648: 34923, + 51649: 38378, + 51650: 38485, + 51651: 25797, + 51652: 36193, + 51653: 33203, + 51654: 21892, + 51655: 27733, + 51656: 25159, + 51657: 32558, + 51658: 22674, + 51659: 20260, + 51660: 21830, + 51661: 36175, + 51662: 26188, + 51663: 19978, + 51664: 23578, + 51665: 35059, + 51666: 26786, + 51667: 25422, + 51668: 31245, + 51669: 28903, + 51670: 33421, + 51671: 21242, + 51672: 38902, + 51673: 23569, + 51674: 21736, + 51675: 37045, + 51676: 32461, + 51677: 22882, + 51678: 36170, + 51679: 34503, + 51680: 33292, + 51681: 33293, + 51682: 36198, + 51683: 25668, + 51684: 23556, + 51685: 24913, + 51686: 28041, + 51687: 31038, + 51688: 35774, + 51689: 30775, + 51690: 30003, + 51691: 21627, + 51692: 20280, + 51693: 36523, + 51694: 28145, + 51695: 23072, + 51696: 32453, + 51697: 31070, + 51698: 27784, + 51699: 23457, + 51700: 23158, + 51701: 29978, + 51702: 32958, + 51703: 24910, + 51704: 28183, + 51705: 22768, + 51706: 29983, + 51707: 29989, + 51708: 29298, + 51709: 21319, + 51710: 32499, + 51776: 34051, + 51777: 34052, + 51778: 34053, + 51779: 34054, + 51780: 34055, + 51781: 34056, + 51782: 34057, + 51783: 34058, + 51784: 34059, + 51785: 34061, + 51786: 34062, + 51787: 34063, + 51788: 34064, + 51789: 34066, + 51790: 34068, + 51791: 34069, + 51792: 34070, + 51793: 34072, + 51794: 34073, + 51795: 34075, + 51796: 34076, + 51797: 34077, + 51798: 34078, + 51799: 34080, + 51800: 34082, + 51801: 34083, + 51802: 34084, + 51803: 34085, + 51804: 34086, + 51805: 34087, + 51806: 34088, + 51807: 34089, + 51808: 34090, + 51809: 34093, + 51810: 34094, + 51811: 34095, + 51812: 34096, + 51813: 34097, + 51814: 34098, + 51815: 34099, + 51816: 34100, + 51817: 34101, + 51818: 34102, + 51819: 34110, + 51820: 34111, + 51821: 34112, + 51822: 34113, + 51823: 34114, + 51824: 34116, + 51825: 34117, + 51826: 34118, + 51827: 34119, + 51828: 34123, + 51829: 34124, + 51830: 34125, + 51831: 34126, + 51832: 34127, + 51833: 34128, + 51834: 34129, + 51835: 34130, + 51836: 34131, + 51837: 34132, + 51838: 34133, + 51840: 34135, + 51841: 34136, + 51842: 34138, + 51843: 34139, + 51844: 34140, + 51845: 34141, + 51846: 34143, + 51847: 34144, + 51848: 34145, + 51849: 34146, + 51850: 34147, + 51851: 34149, + 51852: 34150, + 51853: 34151, + 51854: 34153, + 51855: 34154, + 51856: 34155, + 51857: 34156, + 51858: 34157, + 51859: 34158, + 51860: 34159, + 51861: 34160, + 51862: 34161, + 51863: 34163, + 51864: 34165, + 51865: 34166, + 51866: 34167, + 51867: 34168, + 51868: 34172, + 51869: 34173, + 51870: 34175, + 51871: 34176, + 51872: 34177, + 51873: 30465, + 51874: 30427, + 51875: 21097, + 51876: 32988, + 51877: 22307, + 51878: 24072, + 51879: 22833, + 51880: 29422, + 51881: 26045, + 51882: 28287, + 51883: 35799, + 51884: 23608, + 51885: 34417, + 51886: 21313, + 51887: 30707, + 51888: 25342, + 51889: 26102, + 51890: 20160, + 51891: 39135, + 51892: 34432, + 51893: 23454, + 51894: 35782, + 51895: 21490, + 51896: 30690, + 51897: 20351, + 51898: 23630, + 51899: 39542, + 51900: 22987, + 51901: 24335, + 51902: 31034, + 51903: 22763, + 51904: 19990, + 51905: 26623, + 51906: 20107, + 51907: 25325, + 51908: 35475, + 51909: 36893, + 51910: 21183, + 51911: 26159, + 51912: 21980, + 51913: 22124, + 51914: 36866, + 51915: 20181, + 51916: 20365, + 51917: 37322, + 51918: 39280, + 51919: 27663, + 51920: 24066, + 51921: 24643, + 51922: 23460, + 51923: 35270, + 51924: 35797, + 51925: 25910, + 51926: 25163, + 51927: 39318, + 51928: 23432, + 51929: 23551, + 51930: 25480, + 51931: 21806, + 51932: 21463, + 51933: 30246, + 51934: 20861, + 51935: 34092, + 51936: 26530, + 51937: 26803, + 51938: 27530, + 51939: 25234, + 51940: 36755, + 51941: 21460, + 51942: 33298, + 51943: 28113, + 51944: 30095, + 51945: 20070, + 51946: 36174, + 51947: 23408, + 51948: 29087, + 51949: 34223, + 51950: 26257, + 51951: 26329, + 51952: 32626, + 51953: 34560, + 51954: 40653, + 51955: 40736, + 51956: 23646, + 51957: 26415, + 51958: 36848, + 51959: 26641, + 51960: 26463, + 51961: 25101, + 51962: 31446, + 51963: 22661, + 51964: 24246, + 51965: 25968, + 51966: 28465, + 52032: 34178, + 52033: 34179, + 52034: 34182, + 52035: 34184, + 52036: 34185, + 52037: 34186, + 52038: 34187, + 52039: 34188, + 52040: 34189, + 52041: 34190, + 52042: 34192, + 52043: 34193, + 52044: 34194, + 52045: 34195, + 52046: 34196, + 52047: 34197, + 52048: 34198, + 52049: 34199, + 52050: 34200, + 52051: 34201, + 52052: 34202, + 52053: 34205, + 52054: 34206, + 52055: 34207, + 52056: 34208, + 52057: 34209, + 52058: 34210, + 52059: 34211, + 52060: 34213, + 52061: 34214, + 52062: 34215, + 52063: 34217, + 52064: 34219, + 52065: 34220, + 52066: 34221, + 52067: 34225, + 52068: 34226, + 52069: 34227, + 52070: 34228, + 52071: 34229, + 52072: 34230, + 52073: 34232, + 52074: 34234, + 52075: 34235, + 52076: 34236, + 52077: 34237, + 52078: 34238, + 52079: 34239, + 52080: 34240, + 52081: 34242, + 52082: 34243, + 52083: 34244, + 52084: 34245, + 52085: 34246, + 52086: 34247, + 52087: 34248, + 52088: 34250, + 52089: 34251, + 52090: 34252, + 52091: 34253, + 52092: 34254, + 52093: 34257, + 52094: 34258, + 52096: 34260, + 52097: 34262, + 52098: 34263, + 52099: 34264, + 52100: 34265, + 52101: 34266, + 52102: 34267, + 52103: 34269, + 52104: 34270, + 52105: 34271, + 52106: 34272, + 52107: 34273, + 52108: 34274, + 52109: 34275, + 52110: 34277, + 52111: 34278, + 52112: 34279, + 52113: 34280, + 52114: 34282, + 52115: 34283, + 52116: 34284, + 52117: 34285, + 52118: 34286, + 52119: 34287, + 52120: 34288, + 52121: 34289, + 52122: 34290, + 52123: 34291, + 52124: 34292, + 52125: 34293, + 52126: 34294, + 52127: 34295, + 52128: 34296, + 52129: 24661, + 52130: 21047, + 52131: 32781, + 52132: 25684, + 52133: 34928, + 52134: 29993, + 52135: 24069, + 52136: 26643, + 52137: 25332, + 52138: 38684, + 52139: 21452, + 52140: 29245, + 52141: 35841, + 52142: 27700, + 52143: 30561, + 52144: 31246, + 52145: 21550, + 52146: 30636, + 52147: 39034, + 52148: 33308, + 52149: 35828, + 52150: 30805, + 52151: 26388, + 52152: 28865, + 52153: 26031, + 52154: 25749, + 52155: 22070, + 52156: 24605, + 52157: 31169, + 52158: 21496, + 52159: 19997, + 52160: 27515, + 52161: 32902, + 52162: 23546, + 52163: 21987, + 52164: 22235, + 52165: 20282, + 52166: 20284, + 52167: 39282, + 52168: 24051, + 52169: 26494, + 52170: 32824, + 52171: 24578, + 52172: 39042, + 52173: 36865, + 52174: 23435, + 52175: 35772, + 52176: 35829, + 52177: 25628, + 52178: 33368, + 52179: 25822, + 52180: 22013, + 52181: 33487, + 52182: 37221, + 52183: 20439, + 52184: 32032, + 52185: 36895, + 52186: 31903, + 52187: 20723, + 52188: 22609, + 52189: 28335, + 52190: 23487, + 52191: 35785, + 52192: 32899, + 52193: 37240, + 52194: 33948, + 52195: 31639, + 52196: 34429, + 52197: 38539, + 52198: 38543, + 52199: 32485, + 52200: 39635, + 52201: 30862, + 52202: 23681, + 52203: 31319, + 52204: 36930, + 52205: 38567, + 52206: 31071, + 52207: 23385, + 52208: 25439, + 52209: 31499, + 52210: 34001, + 52211: 26797, + 52212: 21766, + 52213: 32553, + 52214: 29712, + 52215: 32034, + 52216: 38145, + 52217: 25152, + 52218: 22604, + 52219: 20182, + 52220: 23427, + 52221: 22905, + 52222: 22612, + 52288: 34297, + 52289: 34298, + 52290: 34300, + 52291: 34301, + 52292: 34302, + 52293: 34304, + 52294: 34305, + 52295: 34306, + 52296: 34307, + 52297: 34308, + 52298: 34310, + 52299: 34311, + 52300: 34312, + 52301: 34313, + 52302: 34314, + 52303: 34315, + 52304: 34316, + 52305: 34317, + 52306: 34318, + 52307: 34319, + 52308: 34320, + 52309: 34322, + 52310: 34323, + 52311: 34324, + 52312: 34325, + 52313: 34327, + 52314: 34328, + 52315: 34329, + 52316: 34330, + 52317: 34331, + 52318: 34332, + 52319: 34333, + 52320: 34334, + 52321: 34335, + 52322: 34336, + 52323: 34337, + 52324: 34338, + 52325: 34339, + 52326: 34340, + 52327: 34341, + 52328: 34342, + 52329: 34344, + 52330: 34346, + 52331: 34347, + 52332: 34348, + 52333: 34349, + 52334: 34350, + 52335: 34351, + 52336: 34352, + 52337: 34353, + 52338: 34354, + 52339: 34355, + 52340: 34356, + 52341: 34357, + 52342: 34358, + 52343: 34359, + 52344: 34361, + 52345: 34362, + 52346: 34363, + 52347: 34365, + 52348: 34366, + 52349: 34367, + 52350: 34368, + 52352: 34369, + 52353: 34370, + 52354: 34371, + 52355: 34372, + 52356: 34373, + 52357: 34374, + 52358: 34375, + 52359: 34376, + 52360: 34377, + 52361: 34378, + 52362: 34379, + 52363: 34380, + 52364: 34386, + 52365: 34387, + 52366: 34389, + 52367: 34390, + 52368: 34391, + 52369: 34392, + 52370: 34393, + 52371: 34395, + 52372: 34396, + 52373: 34397, + 52374: 34399, + 52375: 34400, + 52376: 34401, + 52377: 34403, + 52378: 34404, + 52379: 34405, + 52380: 34406, + 52381: 34407, + 52382: 34408, + 52383: 34409, + 52384: 34410, + 52385: 29549, + 52386: 25374, + 52387: 36427, + 52388: 36367, + 52389: 32974, + 52390: 33492, + 52391: 25260, + 52392: 21488, + 52393: 27888, + 52394: 37214, + 52395: 22826, + 52396: 24577, + 52397: 27760, + 52398: 22349, + 52399: 25674, + 52400: 36138, + 52401: 30251, + 52402: 28393, + 52403: 22363, + 52404: 27264, + 52405: 30192, + 52406: 28525, + 52407: 35885, + 52408: 35848, + 52409: 22374, + 52410: 27631, + 52411: 34962, + 52412: 30899, + 52413: 25506, + 52414: 21497, + 52415: 28845, + 52416: 27748, + 52417: 22616, + 52418: 25642, + 52419: 22530, + 52420: 26848, + 52421: 33179, + 52422: 21776, + 52423: 31958, + 52424: 20504, + 52425: 36538, + 52426: 28108, + 52427: 36255, + 52428: 28907, + 52429: 25487, + 52430: 28059, + 52431: 28372, + 52432: 32486, + 52433: 33796, + 52434: 26691, + 52435: 36867, + 52436: 28120, + 52437: 38518, + 52438: 35752, + 52439: 22871, + 52440: 29305, + 52441: 34276, + 52442: 33150, + 52443: 30140, + 52444: 35466, + 52445: 26799, + 52446: 21076, + 52447: 36386, + 52448: 38161, + 52449: 25552, + 52450: 39064, + 52451: 36420, + 52452: 21884, + 52453: 20307, + 52454: 26367, + 52455: 22159, + 52456: 24789, + 52457: 28053, + 52458: 21059, + 52459: 23625, + 52460: 22825, + 52461: 28155, + 52462: 22635, + 52463: 30000, + 52464: 29980, + 52465: 24684, + 52466: 33300, + 52467: 33094, + 52468: 25361, + 52469: 26465, + 52470: 36834, + 52471: 30522, + 52472: 36339, + 52473: 36148, + 52474: 38081, + 52475: 24086, + 52476: 21381, + 52477: 21548, + 52478: 28867, + 52544: 34413, + 52545: 34415, + 52546: 34416, + 52547: 34418, + 52548: 34419, + 52549: 34420, + 52550: 34421, + 52551: 34422, + 52552: 34423, + 52553: 34424, + 52554: 34435, + 52555: 34436, + 52556: 34437, + 52557: 34438, + 52558: 34439, + 52559: 34440, + 52560: 34441, + 52561: 34446, + 52562: 34447, + 52563: 34448, + 52564: 34449, + 52565: 34450, + 52566: 34452, + 52567: 34454, + 52568: 34455, + 52569: 34456, + 52570: 34457, + 52571: 34458, + 52572: 34459, + 52573: 34462, + 52574: 34463, + 52575: 34464, + 52576: 34465, + 52577: 34466, + 52578: 34469, + 52579: 34470, + 52580: 34475, + 52581: 34477, + 52582: 34478, + 52583: 34482, + 52584: 34483, + 52585: 34487, + 52586: 34488, + 52587: 34489, + 52588: 34491, + 52589: 34492, + 52590: 34493, + 52591: 34494, + 52592: 34495, + 52593: 34497, + 52594: 34498, + 52595: 34499, + 52596: 34501, + 52597: 34504, + 52598: 34508, + 52599: 34509, + 52600: 34514, + 52601: 34515, + 52602: 34517, + 52603: 34518, + 52604: 34519, + 52605: 34522, + 52606: 34524, + 52608: 34525, + 52609: 34528, + 52610: 34529, + 52611: 34530, + 52612: 34531, + 52613: 34533, + 52614: 34534, + 52615: 34535, + 52616: 34536, + 52617: 34538, + 52618: 34539, + 52619: 34540, + 52620: 34543, + 52621: 34549, + 52622: 34550, + 52623: 34551, + 52624: 34554, + 52625: 34555, + 52626: 34556, + 52627: 34557, + 52628: 34559, + 52629: 34561, + 52630: 34564, + 52631: 34565, + 52632: 34566, + 52633: 34571, + 52634: 34572, + 52635: 34574, + 52636: 34575, + 52637: 34576, + 52638: 34577, + 52639: 34580, + 52640: 34582, + 52641: 27712, + 52642: 24311, + 52643: 20572, + 52644: 20141, + 52645: 24237, + 52646: 25402, + 52647: 33351, + 52648: 36890, + 52649: 26704, + 52650: 37230, + 52651: 30643, + 52652: 21516, + 52653: 38108, + 52654: 24420, + 52655: 31461, + 52656: 26742, + 52657: 25413, + 52658: 31570, + 52659: 32479, + 52660: 30171, + 52661: 20599, + 52662: 25237, + 52663: 22836, + 52664: 36879, + 52665: 20984, + 52666: 31171, + 52667: 31361, + 52668: 22270, + 52669: 24466, + 52670: 36884, + 52671: 28034, + 52672: 23648, + 52673: 22303, + 52674: 21520, + 52675: 20820, + 52676: 28237, + 52677: 22242, + 52678: 25512, + 52679: 39059, + 52680: 33151, + 52681: 34581, + 52682: 35114, + 52683: 36864, + 52684: 21534, + 52685: 23663, + 52686: 33216, + 52687: 25302, + 52688: 25176, + 52689: 33073, + 52690: 40501, + 52691: 38464, + 52692: 39534, + 52693: 39548, + 52694: 26925, + 52695: 22949, + 52696: 25299, + 52697: 21822, + 52698: 25366, + 52699: 21703, + 52700: 34521, + 52701: 27964, + 52702: 23043, + 52703: 29926, + 52704: 34972, + 52705: 27498, + 52706: 22806, + 52707: 35916, + 52708: 24367, + 52709: 28286, + 52710: 29609, + 52711: 39037, + 52712: 20024, + 52713: 28919, + 52714: 23436, + 52715: 30871, + 52716: 25405, + 52717: 26202, + 52718: 30358, + 52719: 24779, + 52720: 23451, + 52721: 23113, + 52722: 19975, + 52723: 33109, + 52724: 27754, + 52725: 29579, + 52726: 20129, + 52727: 26505, + 52728: 32593, + 52729: 24448, + 52730: 26106, + 52731: 26395, + 52732: 24536, + 52733: 22916, + 52734: 23041, + 52800: 34585, + 52801: 34587, + 52802: 34589, + 52803: 34591, + 52804: 34592, + 52805: 34596, + 52806: 34598, + 52807: 34599, + 52808: 34600, + 52809: 34602, + 52810: 34603, + 52811: 34604, + 52812: 34605, + 52813: 34607, + 52814: 34608, + 52815: 34610, + 52816: 34611, + 52817: 34613, + 52818: 34614, + 52819: 34616, + 52820: 34617, + 52821: 34618, + 52822: 34620, + 52823: 34621, + 52824: 34624, + 52825: 34625, + 52826: 34626, + 52827: 34627, + 52828: 34628, + 52829: 34629, + 52830: 34630, + 52831: 34634, + 52832: 34635, + 52833: 34637, + 52834: 34639, + 52835: 34640, + 52836: 34641, + 52837: 34642, + 52838: 34644, + 52839: 34645, + 52840: 34646, + 52841: 34648, + 52842: 34650, + 52843: 34651, + 52844: 34652, + 52845: 34653, + 52846: 34654, + 52847: 34655, + 52848: 34657, + 52849: 34658, + 52850: 34662, + 52851: 34663, + 52852: 34664, + 52853: 34665, + 52854: 34666, + 52855: 34667, + 52856: 34668, + 52857: 34669, + 52858: 34671, + 52859: 34673, + 52860: 34674, + 52861: 34675, + 52862: 34677, + 52864: 34679, + 52865: 34680, + 52866: 34681, + 52867: 34682, + 52868: 34687, + 52869: 34688, + 52870: 34689, + 52871: 34692, + 52872: 34694, + 52873: 34695, + 52874: 34697, + 52875: 34698, + 52876: 34700, + 52877: 34702, + 52878: 34703, + 52879: 34704, + 52880: 34705, + 52881: 34706, + 52882: 34708, + 52883: 34709, + 52884: 34710, + 52885: 34712, + 52886: 34713, + 52887: 34714, + 52888: 34715, + 52889: 34716, + 52890: 34717, + 52891: 34718, + 52892: 34720, + 52893: 34721, + 52894: 34722, + 52895: 34723, + 52896: 34724, + 52897: 24013, + 52898: 24494, + 52899: 21361, + 52900: 38886, + 52901: 36829, + 52902: 26693, + 52903: 22260, + 52904: 21807, + 52905: 24799, + 52906: 20026, + 52907: 28493, + 52908: 32500, + 52909: 33479, + 52910: 33806, + 52911: 22996, + 52912: 20255, + 52913: 20266, + 52914: 23614, + 52915: 32428, + 52916: 26410, + 52917: 34074, + 52918: 21619, + 52919: 30031, + 52920: 32963, + 52921: 21890, + 52922: 39759, + 52923: 20301, + 52924: 28205, + 52925: 35859, + 52926: 23561, + 52927: 24944, + 52928: 21355, + 52929: 30239, + 52930: 28201, + 52931: 34442, + 52932: 25991, + 52933: 38395, + 52934: 32441, + 52935: 21563, + 52936: 31283, + 52937: 32010, + 52938: 38382, + 52939: 21985, + 52940: 32705, + 52941: 29934, + 52942: 25373, + 52943: 34583, + 52944: 28065, + 52945: 31389, + 52946: 25105, + 52947: 26017, + 52948: 21351, + 52949: 25569, + 52950: 27779, + 52951: 24043, + 52952: 21596, + 52953: 38056, + 52954: 20044, + 52955: 27745, + 52956: 35820, + 52957: 23627, + 52958: 26080, + 52959: 33436, + 52960: 26791, + 52961: 21566, + 52962: 21556, + 52963: 27595, + 52964: 27494, + 52965: 20116, + 52966: 25410, + 52967: 21320, + 52968: 33310, + 52969: 20237, + 52970: 20398, + 52971: 22366, + 52972: 25098, + 52973: 38654, + 52974: 26212, + 52975: 29289, + 52976: 21247, + 52977: 21153, + 52978: 24735, + 52979: 35823, + 52980: 26132, + 52981: 29081, + 52982: 26512, + 52983: 35199, + 52984: 30802, + 52985: 30717, + 52986: 26224, + 52987: 22075, + 52988: 21560, + 52989: 38177, + 52990: 29306, + 53056: 34725, + 53057: 34726, + 53058: 34727, + 53059: 34729, + 53060: 34730, + 53061: 34734, + 53062: 34736, + 53063: 34737, + 53064: 34738, + 53065: 34740, + 53066: 34742, + 53067: 34743, + 53068: 34744, + 53069: 34745, + 53070: 34747, + 53071: 34748, + 53072: 34750, + 53073: 34751, + 53074: 34753, + 53075: 34754, + 53076: 34755, + 53077: 34756, + 53078: 34757, + 53079: 34759, + 53080: 34760, + 53081: 34761, + 53082: 34764, + 53083: 34765, + 53084: 34766, + 53085: 34767, + 53086: 34768, + 53087: 34772, + 53088: 34773, + 53089: 34774, + 53090: 34775, + 53091: 34776, + 53092: 34777, + 53093: 34778, + 53094: 34780, + 53095: 34781, + 53096: 34782, + 53097: 34783, + 53098: 34785, + 53099: 34786, + 53100: 34787, + 53101: 34788, + 53102: 34790, + 53103: 34791, + 53104: 34792, + 53105: 34793, + 53106: 34795, + 53107: 34796, + 53108: 34797, + 53109: 34799, + 53110: 34800, + 53111: 34801, + 53112: 34802, + 53113: 34803, + 53114: 34804, + 53115: 34805, + 53116: 34806, + 53117: 34807, + 53118: 34808, + 53120: 34810, + 53121: 34811, + 53122: 34812, + 53123: 34813, + 53124: 34815, + 53125: 34816, + 53126: 34817, + 53127: 34818, + 53128: 34820, + 53129: 34821, + 53130: 34822, + 53131: 34823, + 53132: 34824, + 53133: 34825, + 53134: 34827, + 53135: 34828, + 53136: 34829, + 53137: 34830, + 53138: 34831, + 53139: 34832, + 53140: 34833, + 53141: 34834, + 53142: 34836, + 53143: 34839, + 53144: 34840, + 53145: 34841, + 53146: 34842, + 53147: 34844, + 53148: 34845, + 53149: 34846, + 53150: 34847, + 53151: 34848, + 53152: 34851, + 53153: 31232, + 53154: 24687, + 53155: 24076, + 53156: 24713, + 53157: 33181, + 53158: 22805, + 53159: 24796, + 53160: 29060, + 53161: 28911, + 53162: 28330, + 53163: 27728, + 53164: 29312, + 53165: 27268, + 53166: 34989, + 53167: 24109, + 53168: 20064, + 53169: 23219, + 53170: 21916, + 53171: 38115, + 53172: 27927, + 53173: 31995, + 53174: 38553, + 53175: 25103, + 53176: 32454, + 53177: 30606, + 53178: 34430, + 53179: 21283, + 53180: 38686, + 53181: 36758, + 53182: 26247, + 53183: 23777, + 53184: 20384, + 53185: 29421, + 53186: 19979, + 53187: 21414, + 53188: 22799, + 53189: 21523, + 53190: 25472, + 53191: 38184, + 53192: 20808, + 53193: 20185, + 53194: 40092, + 53195: 32420, + 53196: 21688, + 53197: 36132, + 53198: 34900, + 53199: 33335, + 53200: 38386, + 53201: 28046, + 53202: 24358, + 53203: 23244, + 53204: 26174, + 53205: 38505, + 53206: 29616, + 53207: 29486, + 53208: 21439, + 53209: 33146, + 53210: 39301, + 53211: 32673, + 53212: 23466, + 53213: 38519, + 53214: 38480, + 53215: 32447, + 53216: 30456, + 53217: 21410, + 53218: 38262, + 53219: 39321, + 53220: 31665, + 53221: 35140, + 53222: 28248, + 53223: 20065, + 53224: 32724, + 53225: 31077, + 53226: 35814, + 53227: 24819, + 53228: 21709, + 53229: 20139, + 53230: 39033, + 53231: 24055, + 53232: 27233, + 53233: 20687, + 53234: 21521, + 53235: 35937, + 53236: 33831, + 53237: 30813, + 53238: 38660, + 53239: 21066, + 53240: 21742, + 53241: 22179, + 53242: 38144, + 53243: 28040, + 53244: 23477, + 53245: 28102, + 53246: 26195, + 53312: 34852, + 53313: 34853, + 53314: 34854, + 53315: 34855, + 53316: 34856, + 53317: 34857, + 53318: 34858, + 53319: 34859, + 53320: 34860, + 53321: 34861, + 53322: 34862, + 53323: 34863, + 53324: 34864, + 53325: 34865, + 53326: 34867, + 53327: 34868, + 53328: 34869, + 53329: 34870, + 53330: 34871, + 53331: 34872, + 53332: 34874, + 53333: 34875, + 53334: 34877, + 53335: 34878, + 53336: 34879, + 53337: 34881, + 53338: 34882, + 53339: 34883, + 53340: 34886, + 53341: 34887, + 53342: 34888, + 53343: 34889, + 53344: 34890, + 53345: 34891, + 53346: 34894, + 53347: 34895, + 53348: 34896, + 53349: 34897, + 53350: 34898, + 53351: 34899, + 53352: 34901, + 53353: 34902, + 53354: 34904, + 53355: 34906, + 53356: 34907, + 53357: 34908, + 53358: 34909, + 53359: 34910, + 53360: 34911, + 53361: 34912, + 53362: 34918, + 53363: 34919, + 53364: 34922, + 53365: 34925, + 53366: 34927, + 53367: 34929, + 53368: 34931, + 53369: 34932, + 53370: 34933, + 53371: 34934, + 53372: 34936, + 53373: 34937, + 53374: 34938, + 53376: 34939, + 53377: 34940, + 53378: 34944, + 53379: 34947, + 53380: 34950, + 53381: 34951, + 53382: 34953, + 53383: 34954, + 53384: 34956, + 53385: 34958, + 53386: 34959, + 53387: 34960, + 53388: 34961, + 53389: 34963, + 53390: 34964, + 53391: 34965, + 53392: 34967, + 53393: 34968, + 53394: 34969, + 53395: 34970, + 53396: 34971, + 53397: 34973, + 53398: 34974, + 53399: 34975, + 53400: 34976, + 53401: 34977, + 53402: 34979, + 53403: 34981, + 53404: 34982, + 53405: 34983, + 53406: 34984, + 53407: 34985, + 53408: 34986, + 53409: 23567, + 53410: 23389, + 53411: 26657, + 53412: 32918, + 53413: 21880, + 53414: 31505, + 53415: 25928, + 53416: 26964, + 53417: 20123, + 53418: 27463, + 53419: 34638, + 53420: 38795, + 53421: 21327, + 53422: 25375, + 53423: 25658, + 53424: 37034, + 53425: 26012, + 53426: 32961, + 53427: 35856, + 53428: 20889, + 53429: 26800, + 53430: 21368, + 53431: 34809, + 53432: 25032, + 53433: 27844, + 53434: 27899, + 53435: 35874, + 53436: 23633, + 53437: 34218, + 53438: 33455, + 53439: 38156, + 53440: 27427, + 53441: 36763, + 53442: 26032, + 53443: 24571, + 53444: 24515, + 53445: 20449, + 53446: 34885, + 53447: 26143, + 53448: 33125, + 53449: 29481, + 53450: 24826, + 53451: 20852, + 53452: 21009, + 53453: 22411, + 53454: 24418, + 53455: 37026, + 53456: 34892, + 53457: 37266, + 53458: 24184, + 53459: 26447, + 53460: 24615, + 53461: 22995, + 53462: 20804, + 53463: 20982, + 53464: 33016, + 53465: 21256, + 53466: 27769, + 53467: 38596, + 53468: 29066, + 53469: 20241, + 53470: 20462, + 53471: 32670, + 53472: 26429, + 53473: 21957, + 53474: 38152, + 53475: 31168, + 53476: 34966, + 53477: 32483, + 53478: 22687, + 53479: 25100, + 53480: 38656, + 53481: 34394, + 53482: 22040, + 53483: 39035, + 53484: 24464, + 53485: 35768, + 53486: 33988, + 53487: 37207, + 53488: 21465, + 53489: 26093, + 53490: 24207, + 53491: 30044, + 53492: 24676, + 53493: 32110, + 53494: 23167, + 53495: 32490, + 53496: 32493, + 53497: 36713, + 53498: 21927, + 53499: 23459, + 53500: 24748, + 53501: 26059, + 53502: 29572, + 53568: 34988, + 53569: 34990, + 53570: 34991, + 53571: 34992, + 53572: 34994, + 53573: 34995, + 53574: 34996, + 53575: 34997, + 53576: 34998, + 53577: 35000, + 53578: 35001, + 53579: 35002, + 53580: 35003, + 53581: 35005, + 53582: 35006, + 53583: 35007, + 53584: 35008, + 53585: 35011, + 53586: 35012, + 53587: 35015, + 53588: 35016, + 53589: 35018, + 53590: 35019, + 53591: 35020, + 53592: 35021, + 53593: 35023, + 53594: 35024, + 53595: 35025, + 53596: 35027, + 53597: 35030, + 53598: 35031, + 53599: 35034, + 53600: 35035, + 53601: 35036, + 53602: 35037, + 53603: 35038, + 53604: 35040, + 53605: 35041, + 53606: 35046, + 53607: 35047, + 53608: 35049, + 53609: 35050, + 53610: 35051, + 53611: 35052, + 53612: 35053, + 53613: 35054, + 53614: 35055, + 53615: 35058, + 53616: 35061, + 53617: 35062, + 53618: 35063, + 53619: 35066, + 53620: 35067, + 53621: 35069, + 53622: 35071, + 53623: 35072, + 53624: 35073, + 53625: 35075, + 53626: 35076, + 53627: 35077, + 53628: 35078, + 53629: 35079, + 53630: 35080, + 53632: 35081, + 53633: 35083, + 53634: 35084, + 53635: 35085, + 53636: 35086, + 53637: 35087, + 53638: 35089, + 53639: 35092, + 53640: 35093, + 53641: 35094, + 53642: 35095, + 53643: 35096, + 53644: 35100, + 53645: 35101, + 53646: 35102, + 53647: 35103, + 53648: 35104, + 53649: 35106, + 53650: 35107, + 53651: 35108, + 53652: 35110, + 53653: 35111, + 53654: 35112, + 53655: 35113, + 53656: 35116, + 53657: 35117, + 53658: 35118, + 53659: 35119, + 53660: 35121, + 53661: 35122, + 53662: 35123, + 53663: 35125, + 53664: 35127, + 53665: 36873, + 53666: 30307, + 53667: 30505, + 53668: 32474, + 53669: 38772, + 53670: 34203, + 53671: 23398, + 53672: 31348, + 53673: 38634, + 53674: 34880, + 53675: 21195, + 53676: 29071, + 53677: 24490, + 53678: 26092, + 53679: 35810, + 53680: 23547, + 53681: 39535, + 53682: 24033, + 53683: 27529, + 53684: 27739, + 53685: 35757, + 53686: 35759, + 53687: 36874, + 53688: 36805, + 53689: 21387, + 53690: 25276, + 53691: 40486, + 53692: 40493, + 53693: 21568, + 53694: 20011, + 53695: 33469, + 53696: 29273, + 53697: 34460, + 53698: 23830, + 53699: 34905, + 53700: 28079, + 53701: 38597, + 53702: 21713, + 53703: 20122, + 53704: 35766, + 53705: 28937, + 53706: 21693, + 53707: 38409, + 53708: 28895, + 53709: 28153, + 53710: 30416, + 53711: 20005, + 53712: 30740, + 53713: 34578, + 53714: 23721, + 53715: 24310, + 53716: 35328, + 53717: 39068, + 53718: 38414, + 53719: 28814, + 53720: 27839, + 53721: 22852, + 53722: 25513, + 53723: 30524, + 53724: 34893, + 53725: 28436, + 53726: 33395, + 53727: 22576, + 53728: 29141, + 53729: 21388, + 53730: 30746, + 53731: 38593, + 53732: 21761, + 53733: 24422, + 53734: 28976, + 53735: 23476, + 53736: 35866, + 53737: 39564, + 53738: 27523, + 53739: 22830, + 53740: 40495, + 53741: 31207, + 53742: 26472, + 53743: 25196, + 53744: 20335, + 53745: 30113, + 53746: 32650, + 53747: 27915, + 53748: 38451, + 53749: 27687, + 53750: 20208, + 53751: 30162, + 53752: 20859, + 53753: 26679, + 53754: 28478, + 53755: 36992, + 53756: 33136, + 53757: 22934, + 53758: 29814, + 53824: 35128, + 53825: 35129, + 53826: 35130, + 53827: 35131, + 53828: 35132, + 53829: 35133, + 53830: 35134, + 53831: 35135, + 53832: 35136, + 53833: 35138, + 53834: 35139, + 53835: 35141, + 53836: 35142, + 53837: 35143, + 53838: 35144, + 53839: 35145, + 53840: 35146, + 53841: 35147, + 53842: 35148, + 53843: 35149, + 53844: 35150, + 53845: 35151, + 53846: 35152, + 53847: 35153, + 53848: 35154, + 53849: 35155, + 53850: 35156, + 53851: 35157, + 53852: 35158, + 53853: 35159, + 53854: 35160, + 53855: 35161, + 53856: 35162, + 53857: 35163, + 53858: 35164, + 53859: 35165, + 53860: 35168, + 53861: 35169, + 53862: 35170, + 53863: 35171, + 53864: 35172, + 53865: 35173, + 53866: 35175, + 53867: 35176, + 53868: 35177, + 53869: 35178, + 53870: 35179, + 53871: 35180, + 53872: 35181, + 53873: 35182, + 53874: 35183, + 53875: 35184, + 53876: 35185, + 53877: 35186, + 53878: 35187, + 53879: 35188, + 53880: 35189, + 53881: 35190, + 53882: 35191, + 53883: 35192, + 53884: 35193, + 53885: 35194, + 53886: 35196, + 53888: 35197, + 53889: 35198, + 53890: 35200, + 53891: 35202, + 53892: 35204, + 53893: 35205, + 53894: 35207, + 53895: 35208, + 53896: 35209, + 53897: 35210, + 53898: 35211, + 53899: 35212, + 53900: 35213, + 53901: 35214, + 53902: 35215, + 53903: 35216, + 53904: 35217, + 53905: 35218, + 53906: 35219, + 53907: 35220, + 53908: 35221, + 53909: 35222, + 53910: 35223, + 53911: 35224, + 53912: 35225, + 53913: 35226, + 53914: 35227, + 53915: 35228, + 53916: 35229, + 53917: 35230, + 53918: 35231, + 53919: 35232, + 53920: 35233, + 53921: 25671, + 53922: 23591, + 53923: 36965, + 53924: 31377, + 53925: 35875, + 53926: 23002, + 53927: 21676, + 53928: 33280, + 53929: 33647, + 53930: 35201, + 53931: 32768, + 53932: 26928, + 53933: 22094, + 53934: 32822, + 53935: 29239, + 53936: 37326, + 53937: 20918, + 53938: 20063, + 53939: 39029, + 53940: 25494, + 53941: 19994, + 53942: 21494, + 53943: 26355, + 53944: 33099, + 53945: 22812, + 53946: 28082, + 53947: 19968, + 53948: 22777, + 53949: 21307, + 53950: 25558, + 53951: 38129, + 53952: 20381, + 53953: 20234, + 53954: 34915, + 53955: 39056, + 53956: 22839, + 53957: 36951, + 53958: 31227, + 53959: 20202, + 53960: 33008, + 53961: 30097, + 53962: 27778, + 53963: 23452, + 53964: 23016, + 53965: 24413, + 53966: 26885, + 53967: 34433, + 53968: 20506, + 53969: 24050, + 53970: 20057, + 53971: 30691, + 53972: 20197, + 53973: 33402, + 53974: 25233, + 53975: 26131, + 53976: 37009, + 53977: 23673, + 53978: 20159, + 53979: 24441, + 53980: 33222, + 53981: 36920, + 53982: 32900, + 53983: 30123, + 53984: 20134, + 53985: 35028, + 53986: 24847, + 53987: 27589, + 53988: 24518, + 53989: 20041, + 53990: 30410, + 53991: 28322, + 53992: 35811, + 53993: 35758, + 53994: 35850, + 53995: 35793, + 53996: 24322, + 53997: 32764, + 53998: 32716, + 53999: 32462, + 54000: 33589, + 54001: 33643, + 54002: 22240, + 54003: 27575, + 54004: 38899, + 54005: 38452, + 54006: 23035, + 54007: 21535, + 54008: 38134, + 54009: 28139, + 54010: 23493, + 54011: 39278, + 54012: 23609, + 54013: 24341, + 54014: 38544, + 54080: 35234, + 54081: 35235, + 54082: 35236, + 54083: 35237, + 54084: 35238, + 54085: 35239, + 54086: 35240, + 54087: 35241, + 54088: 35242, + 54089: 35243, + 54090: 35244, + 54091: 35245, + 54092: 35246, + 54093: 35247, + 54094: 35248, + 54095: 35249, + 54096: 35250, + 54097: 35251, + 54098: 35252, + 54099: 35253, + 54100: 35254, + 54101: 35255, + 54102: 35256, + 54103: 35257, + 54104: 35258, + 54105: 35259, + 54106: 35260, + 54107: 35261, + 54108: 35262, + 54109: 35263, + 54110: 35264, + 54111: 35267, + 54112: 35277, + 54113: 35283, + 54114: 35284, + 54115: 35285, + 54116: 35287, + 54117: 35288, + 54118: 35289, + 54119: 35291, + 54120: 35293, + 54121: 35295, + 54122: 35296, + 54123: 35297, + 54124: 35298, + 54125: 35300, + 54126: 35303, + 54127: 35304, + 54128: 35305, + 54129: 35306, + 54130: 35308, + 54131: 35309, + 54132: 35310, + 54133: 35312, + 54134: 35313, + 54135: 35314, + 54136: 35316, + 54137: 35317, + 54138: 35318, + 54139: 35319, + 54140: 35320, + 54141: 35321, + 54142: 35322, + 54144: 35323, + 54145: 35324, + 54146: 35325, + 54147: 35326, + 54148: 35327, + 54149: 35329, + 54150: 35330, + 54151: 35331, + 54152: 35332, + 54153: 35333, + 54154: 35334, + 54155: 35336, + 54156: 35337, + 54157: 35338, + 54158: 35339, + 54159: 35340, + 54160: 35341, + 54161: 35342, + 54162: 35343, + 54163: 35344, + 54164: 35345, + 54165: 35346, + 54166: 35347, + 54167: 35348, + 54168: 35349, + 54169: 35350, + 54170: 35351, + 54171: 35352, + 54172: 35353, + 54173: 35354, + 54174: 35355, + 54175: 35356, + 54176: 35357, + 54177: 21360, + 54178: 33521, + 54179: 27185, + 54180: 23156, + 54181: 40560, + 54182: 24212, + 54183: 32552, + 54184: 33721, + 54185: 33828, + 54186: 33829, + 54187: 33639, + 54188: 34631, + 54189: 36814, + 54190: 36194, + 54191: 30408, + 54192: 24433, + 54193: 39062, + 54194: 30828, + 54195: 26144, + 54196: 21727, + 54197: 25317, + 54198: 20323, + 54199: 33219, + 54200: 30152, + 54201: 24248, + 54202: 38605, + 54203: 36362, + 54204: 34553, + 54205: 21647, + 54206: 27891, + 54207: 28044, + 54208: 27704, + 54209: 24703, + 54210: 21191, + 54211: 29992, + 54212: 24189, + 54213: 20248, + 54214: 24736, + 54215: 24551, + 54216: 23588, + 54217: 30001, + 54218: 37038, + 54219: 38080, + 54220: 29369, + 54221: 27833, + 54222: 28216, + 54223: 37193, + 54224: 26377, + 54225: 21451, + 54226: 21491, + 54227: 20305, + 54228: 37321, + 54229: 35825, + 54230: 21448, + 54231: 24188, + 54232: 36802, + 54233: 28132, + 54234: 20110, + 54235: 30402, + 54236: 27014, + 54237: 34398, + 54238: 24858, + 54239: 33286, + 54240: 20313, + 54241: 20446, + 54242: 36926, + 54243: 40060, + 54244: 24841, + 54245: 28189, + 54246: 28180, + 54247: 38533, + 54248: 20104, + 54249: 23089, + 54250: 38632, + 54251: 19982, + 54252: 23679, + 54253: 31161, + 54254: 23431, + 54255: 35821, + 54256: 32701, + 54257: 29577, + 54258: 22495, + 54259: 33419, + 54260: 37057, + 54261: 21505, + 54262: 36935, + 54263: 21947, + 54264: 23786, + 54265: 24481, + 54266: 24840, + 54267: 27442, + 54268: 29425, + 54269: 32946, + 54270: 35465, + 54336: 35358, + 54337: 35359, + 54338: 35360, + 54339: 35361, + 54340: 35362, + 54341: 35363, + 54342: 35364, + 54343: 35365, + 54344: 35366, + 54345: 35367, + 54346: 35368, + 54347: 35369, + 54348: 35370, + 54349: 35371, + 54350: 35372, + 54351: 35373, + 54352: 35374, + 54353: 35375, + 54354: 35376, + 54355: 35377, + 54356: 35378, + 54357: 35379, + 54358: 35380, + 54359: 35381, + 54360: 35382, + 54361: 35383, + 54362: 35384, + 54363: 35385, + 54364: 35386, + 54365: 35387, + 54366: 35388, + 54367: 35389, + 54368: 35391, + 54369: 35392, + 54370: 35393, + 54371: 35394, + 54372: 35395, + 54373: 35396, + 54374: 35397, + 54375: 35398, + 54376: 35399, + 54377: 35401, + 54378: 35402, + 54379: 35403, + 54380: 35404, + 54381: 35405, + 54382: 35406, + 54383: 35407, + 54384: 35408, + 54385: 35409, + 54386: 35410, + 54387: 35411, + 54388: 35412, + 54389: 35413, + 54390: 35414, + 54391: 35415, + 54392: 35416, + 54393: 35417, + 54394: 35418, + 54395: 35419, + 54396: 35420, + 54397: 35421, + 54398: 35422, + 54400: 35423, + 54401: 35424, + 54402: 35425, + 54403: 35426, + 54404: 35427, + 54405: 35428, + 54406: 35429, + 54407: 35430, + 54408: 35431, + 54409: 35432, + 54410: 35433, + 54411: 35434, + 54412: 35435, + 54413: 35436, + 54414: 35437, + 54415: 35438, + 54416: 35439, + 54417: 35440, + 54418: 35441, + 54419: 35442, + 54420: 35443, + 54421: 35444, + 54422: 35445, + 54423: 35446, + 54424: 35447, + 54425: 35448, + 54426: 35450, + 54427: 35451, + 54428: 35452, + 54429: 35453, + 54430: 35454, + 54431: 35455, + 54432: 35456, + 54433: 28020, + 54434: 23507, + 54435: 35029, + 54436: 39044, + 54437: 35947, + 54438: 39533, + 54439: 40499, + 54440: 28170, + 54441: 20900, + 54442: 20803, + 54443: 22435, + 54444: 34945, + 54445: 21407, + 54446: 25588, + 54447: 36757, + 54448: 22253, + 54449: 21592, + 54450: 22278, + 54451: 29503, + 54452: 28304, + 54453: 32536, + 54454: 36828, + 54455: 33489, + 54456: 24895, + 54457: 24616, + 54458: 38498, + 54459: 26352, + 54460: 32422, + 54461: 36234, + 54462: 36291, + 54463: 38053, + 54464: 23731, + 54465: 31908, + 54466: 26376, + 54467: 24742, + 54468: 38405, + 54469: 32792, + 54470: 20113, + 54471: 37095, + 54472: 21248, + 54473: 38504, + 54474: 20801, + 54475: 36816, + 54476: 34164, + 54477: 37213, + 54478: 26197, + 54479: 38901, + 54480: 23381, + 54481: 21277, + 54482: 30776, + 54483: 26434, + 54484: 26685, + 54485: 21705, + 54486: 28798, + 54487: 23472, + 54488: 36733, + 54489: 20877, + 54490: 22312, + 54491: 21681, + 54492: 25874, + 54493: 26242, + 54494: 36190, + 54495: 36163, + 54496: 33039, + 54497: 33900, + 54498: 36973, + 54499: 31967, + 54500: 20991, + 54501: 34299, + 54502: 26531, + 54503: 26089, + 54504: 28577, + 54505: 34468, + 54506: 36481, + 54507: 22122, + 54508: 36896, + 54509: 30338, + 54510: 28790, + 54511: 29157, + 54512: 36131, + 54513: 25321, + 54514: 21017, + 54515: 27901, + 54516: 36156, + 54517: 24590, + 54518: 22686, + 54519: 24974, + 54520: 26366, + 54521: 36192, + 54522: 25166, + 54523: 21939, + 54524: 28195, + 54525: 26413, + 54526: 36711, + 54592: 35457, + 54593: 35458, + 54594: 35459, + 54595: 35460, + 54596: 35461, + 54597: 35462, + 54598: 35463, + 54599: 35464, + 54600: 35467, + 54601: 35468, + 54602: 35469, + 54603: 35470, + 54604: 35471, + 54605: 35472, + 54606: 35473, + 54607: 35474, + 54608: 35476, + 54609: 35477, + 54610: 35478, + 54611: 35479, + 54612: 35480, + 54613: 35481, + 54614: 35482, + 54615: 35483, + 54616: 35484, + 54617: 35485, + 54618: 35486, + 54619: 35487, + 54620: 35488, + 54621: 35489, + 54622: 35490, + 54623: 35491, + 54624: 35492, + 54625: 35493, + 54626: 35494, + 54627: 35495, + 54628: 35496, + 54629: 35497, + 54630: 35498, + 54631: 35499, + 54632: 35500, + 54633: 35501, + 54634: 35502, + 54635: 35503, + 54636: 35504, + 54637: 35505, + 54638: 35506, + 54639: 35507, + 54640: 35508, + 54641: 35509, + 54642: 35510, + 54643: 35511, + 54644: 35512, + 54645: 35513, + 54646: 35514, + 54647: 35515, + 54648: 35516, + 54649: 35517, + 54650: 35518, + 54651: 35519, + 54652: 35520, + 54653: 35521, + 54654: 35522, + 54656: 35523, + 54657: 35524, + 54658: 35525, + 54659: 35526, + 54660: 35527, + 54661: 35528, + 54662: 35529, + 54663: 35530, + 54664: 35531, + 54665: 35532, + 54666: 35533, + 54667: 35534, + 54668: 35535, + 54669: 35536, + 54670: 35537, + 54671: 35538, + 54672: 35539, + 54673: 35540, + 54674: 35541, + 54675: 35542, + 54676: 35543, + 54677: 35544, + 54678: 35545, + 54679: 35546, + 54680: 35547, + 54681: 35548, + 54682: 35549, + 54683: 35550, + 54684: 35551, + 54685: 35552, + 54686: 35553, + 54687: 35554, + 54688: 35555, + 54689: 38113, + 54690: 38392, + 54691: 30504, + 54692: 26629, + 54693: 27048, + 54694: 21643, + 54695: 20045, + 54696: 28856, + 54697: 35784, + 54698: 25688, + 54699: 25995, + 54700: 23429, + 54701: 31364, + 54702: 20538, + 54703: 23528, + 54704: 30651, + 54705: 27617, + 54706: 35449, + 54707: 31896, + 54708: 27838, + 54709: 30415, + 54710: 26025, + 54711: 36759, + 54712: 23853, + 54713: 23637, + 54714: 34360, + 54715: 26632, + 54716: 21344, + 54717: 25112, + 54718: 31449, + 54719: 28251, + 54720: 32509, + 54721: 27167, + 54722: 31456, + 54723: 24432, + 54724: 28467, + 54725: 24352, + 54726: 25484, + 54727: 28072, + 54728: 26454, + 54729: 19976, + 54730: 24080, + 54731: 36134, + 54732: 20183, + 54733: 32960, + 54734: 30260, + 54735: 38556, + 54736: 25307, + 54737: 26157, + 54738: 25214, + 54739: 27836, + 54740: 36213, + 54741: 29031, + 54742: 32617, + 54743: 20806, + 54744: 32903, + 54745: 21484, + 54746: 36974, + 54747: 25240, + 54748: 21746, + 54749: 34544, + 54750: 36761, + 54751: 32773, + 54752: 38167, + 54753: 34071, + 54754: 36825, + 54755: 27993, + 54756: 29645, + 54757: 26015, + 54758: 30495, + 54759: 29956, + 54760: 30759, + 54761: 33275, + 54762: 36126, + 54763: 38024, + 54764: 20390, + 54765: 26517, + 54766: 30137, + 54767: 35786, + 54768: 38663, + 54769: 25391, + 54770: 38215, + 54771: 38453, + 54772: 33976, + 54773: 25379, + 54774: 30529, + 54775: 24449, + 54776: 29424, + 54777: 20105, + 54778: 24596, + 54779: 25972, + 54780: 25327, + 54781: 27491, + 54782: 25919, + 54848: 35556, + 54849: 35557, + 54850: 35558, + 54851: 35559, + 54852: 35560, + 54853: 35561, + 54854: 35562, + 54855: 35563, + 54856: 35564, + 54857: 35565, + 54858: 35566, + 54859: 35567, + 54860: 35568, + 54861: 35569, + 54862: 35570, + 54863: 35571, + 54864: 35572, + 54865: 35573, + 54866: 35574, + 54867: 35575, + 54868: 35576, + 54869: 35577, + 54870: 35578, + 54871: 35579, + 54872: 35580, + 54873: 35581, + 54874: 35582, + 54875: 35583, + 54876: 35584, + 54877: 35585, + 54878: 35586, + 54879: 35587, + 54880: 35588, + 54881: 35589, + 54882: 35590, + 54883: 35592, + 54884: 35593, + 54885: 35594, + 54886: 35595, + 54887: 35596, + 54888: 35597, + 54889: 35598, + 54890: 35599, + 54891: 35600, + 54892: 35601, + 54893: 35602, + 54894: 35603, + 54895: 35604, + 54896: 35605, + 54897: 35606, + 54898: 35607, + 54899: 35608, + 54900: 35609, + 54901: 35610, + 54902: 35611, + 54903: 35612, + 54904: 35613, + 54905: 35614, + 54906: 35615, + 54907: 35616, + 54908: 35617, + 54909: 35618, + 54910: 35619, + 54912: 35620, + 54913: 35621, + 54914: 35623, + 54915: 35624, + 54916: 35625, + 54917: 35626, + 54918: 35627, + 54919: 35628, + 54920: 35629, + 54921: 35630, + 54922: 35631, + 54923: 35632, + 54924: 35633, + 54925: 35634, + 54926: 35635, + 54927: 35636, + 54928: 35637, + 54929: 35638, + 54930: 35639, + 54931: 35640, + 54932: 35641, + 54933: 35642, + 54934: 35643, + 54935: 35644, + 54936: 35645, + 54937: 35646, + 54938: 35647, + 54939: 35648, + 54940: 35649, + 54941: 35650, + 54942: 35651, + 54943: 35652, + 54944: 35653, + 54945: 24103, + 54946: 30151, + 54947: 37073, + 54948: 35777, + 54949: 33437, + 54950: 26525, + 54951: 25903, + 54952: 21553, + 54953: 34584, + 54954: 30693, + 54955: 32930, + 54956: 33026, + 54957: 27713, + 54958: 20043, + 54959: 32455, + 54960: 32844, + 54961: 30452, + 54962: 26893, + 54963: 27542, + 54964: 25191, + 54965: 20540, + 54966: 20356, + 54967: 22336, + 54968: 25351, + 54969: 27490, + 54970: 36286, + 54971: 21482, + 54972: 26088, + 54973: 32440, + 54974: 24535, + 54975: 25370, + 54976: 25527, + 54977: 33267, + 54978: 33268, + 54979: 32622, + 54980: 24092, + 54981: 23769, + 54982: 21046, + 54983: 26234, + 54984: 31209, + 54985: 31258, + 54986: 36136, + 54987: 28825, + 54988: 30164, + 54989: 28382, + 54990: 27835, + 54991: 31378, + 54992: 20013, + 54993: 30405, + 54994: 24544, + 54995: 38047, + 54996: 34935, + 54997: 32456, + 54998: 31181, + 54999: 32959, + 55000: 37325, + 55001: 20210, + 55002: 20247, + 55003: 33311, + 55004: 21608, + 55005: 24030, + 55006: 27954, + 55007: 35788, + 55008: 31909, + 55009: 36724, + 55010: 32920, + 55011: 24090, + 55012: 21650, + 55013: 30385, + 55014: 23449, + 55015: 26172, + 55016: 39588, + 55017: 29664, + 55018: 26666, + 55019: 34523, + 55020: 26417, + 55021: 29482, + 55022: 35832, + 55023: 35803, + 55024: 36880, + 55025: 31481, + 55026: 28891, + 55027: 29038, + 55028: 25284, + 55029: 30633, + 55030: 22065, + 55031: 20027, + 55032: 33879, + 55033: 26609, + 55034: 21161, + 55035: 34496, + 55036: 36142, + 55037: 38136, + 55038: 31569, + 55104: 35654, + 55105: 35655, + 55106: 35656, + 55107: 35657, + 55108: 35658, + 55109: 35659, + 55110: 35660, + 55111: 35661, + 55112: 35662, + 55113: 35663, + 55114: 35664, + 55115: 35665, + 55116: 35666, + 55117: 35667, + 55118: 35668, + 55119: 35669, + 55120: 35670, + 55121: 35671, + 55122: 35672, + 55123: 35673, + 55124: 35674, + 55125: 35675, + 55126: 35676, + 55127: 35677, + 55128: 35678, + 55129: 35679, + 55130: 35680, + 55131: 35681, + 55132: 35682, + 55133: 35683, + 55134: 35684, + 55135: 35685, + 55136: 35687, + 55137: 35688, + 55138: 35689, + 55139: 35690, + 55140: 35691, + 55141: 35693, + 55142: 35694, + 55143: 35695, + 55144: 35696, + 55145: 35697, + 55146: 35698, + 55147: 35699, + 55148: 35700, + 55149: 35701, + 55150: 35702, + 55151: 35703, + 55152: 35704, + 55153: 35705, + 55154: 35706, + 55155: 35707, + 55156: 35708, + 55157: 35709, + 55158: 35710, + 55159: 35711, + 55160: 35712, + 55161: 35713, + 55162: 35714, + 55163: 35715, + 55164: 35716, + 55165: 35717, + 55166: 35718, + 55168: 35719, + 55169: 35720, + 55170: 35721, + 55171: 35722, + 55172: 35723, + 55173: 35724, + 55174: 35725, + 55175: 35726, + 55176: 35727, + 55177: 35728, + 55178: 35729, + 55179: 35730, + 55180: 35731, + 55181: 35732, + 55182: 35733, + 55183: 35734, + 55184: 35735, + 55185: 35736, + 55186: 35737, + 55187: 35738, + 55188: 35739, + 55189: 35740, + 55190: 35741, + 55191: 35742, + 55192: 35743, + 55193: 35756, + 55194: 35761, + 55195: 35771, + 55196: 35783, + 55197: 35792, + 55198: 35818, + 55199: 35849, + 55200: 35870, + 55201: 20303, + 55202: 27880, + 55203: 31069, + 55204: 39547, + 55205: 25235, + 55206: 29226, + 55207: 25341, + 55208: 19987, + 55209: 30742, + 55210: 36716, + 55211: 25776, + 55212: 36186, + 55213: 31686, + 55214: 26729, + 55215: 24196, + 55216: 35013, + 55217: 22918, + 55218: 25758, + 55219: 22766, + 55220: 29366, + 55221: 26894, + 55222: 38181, + 55223: 36861, + 55224: 36184, + 55225: 22368, + 55226: 32512, + 55227: 35846, + 55228: 20934, + 55229: 25417, + 55230: 25305, + 55231: 21331, + 55232: 26700, + 55233: 29730, + 55234: 33537, + 55235: 37196, + 55236: 21828, + 55237: 30528, + 55238: 28796, + 55239: 27978, + 55240: 20857, + 55241: 21672, + 55242: 36164, + 55243: 23039, + 55244: 28363, + 55245: 28100, + 55246: 23388, + 55247: 32043, + 55248: 20180, + 55249: 31869, + 55250: 28371, + 55251: 23376, + 55252: 33258, + 55253: 28173, + 55254: 23383, + 55255: 39683, + 55256: 26837, + 55257: 36394, + 55258: 23447, + 55259: 32508, + 55260: 24635, + 55261: 32437, + 55262: 37049, + 55263: 36208, + 55264: 22863, + 55265: 25549, + 55266: 31199, + 55267: 36275, + 55268: 21330, + 55269: 26063, + 55270: 31062, + 55271: 35781, + 55272: 38459, + 55273: 32452, + 55274: 38075, + 55275: 32386, + 55276: 22068, + 55277: 37257, + 55278: 26368, + 55279: 32618, + 55280: 23562, + 55281: 36981, + 55282: 26152, + 55283: 24038, + 55284: 20304, + 55285: 26590, + 55286: 20570, + 55287: 20316, + 55288: 22352, + 55289: 24231, + 55290: 59408, + 55291: 59409, + 55292: 59410, + 55293: 59411, + 55294: 59412, + 55360: 35896, + 55361: 35897, + 55362: 35898, + 55363: 35899, + 55364: 35900, + 55365: 35901, + 55366: 35902, + 55367: 35903, + 55368: 35904, + 55369: 35906, + 55370: 35907, + 55371: 35908, + 55372: 35909, + 55373: 35912, + 55374: 35914, + 55375: 35915, + 55376: 35917, + 55377: 35918, + 55378: 35919, + 55379: 35920, + 55380: 35921, + 55381: 35922, + 55382: 35923, + 55383: 35924, + 55384: 35926, + 55385: 35927, + 55386: 35928, + 55387: 35929, + 55388: 35931, + 55389: 35932, + 55390: 35933, + 55391: 35934, + 55392: 35935, + 55393: 35936, + 55394: 35939, + 55395: 35940, + 55396: 35941, + 55397: 35942, + 55398: 35943, + 55399: 35944, + 55400: 35945, + 55401: 35948, + 55402: 35949, + 55403: 35950, + 55404: 35951, + 55405: 35952, + 55406: 35953, + 55407: 35954, + 55408: 35956, + 55409: 35957, + 55410: 35958, + 55411: 35959, + 55412: 35963, + 55413: 35964, + 55414: 35965, + 55415: 35966, + 55416: 35967, + 55417: 35968, + 55418: 35969, + 55419: 35971, + 55420: 35972, + 55421: 35974, + 55422: 35975, + 55424: 35976, + 55425: 35979, + 55426: 35981, + 55427: 35982, + 55428: 35983, + 55429: 35984, + 55430: 35985, + 55431: 35986, + 55432: 35987, + 55433: 35989, + 55434: 35990, + 55435: 35991, + 55436: 35993, + 55437: 35994, + 55438: 35995, + 55439: 35996, + 55440: 35997, + 55441: 35998, + 55442: 35999, + 55443: 36000, + 55444: 36001, + 55445: 36002, + 55446: 36003, + 55447: 36004, + 55448: 36005, + 55449: 36006, + 55450: 36007, + 55451: 36008, + 55452: 36009, + 55453: 36010, + 55454: 36011, + 55455: 36012, + 55456: 36013, + 55457: 20109, + 55458: 19980, + 55459: 20800, + 55460: 19984, + 55461: 24319, + 55462: 21317, + 55463: 19989, + 55464: 20120, + 55465: 19998, + 55466: 39730, + 55467: 23404, + 55468: 22121, + 55469: 20008, + 55470: 31162, + 55471: 20031, + 55472: 21269, + 55473: 20039, + 55474: 22829, + 55475: 29243, + 55476: 21358, + 55477: 27664, + 55478: 22239, + 55479: 32996, + 55480: 39319, + 55481: 27603, + 55482: 30590, + 55483: 40727, + 55484: 20022, + 55485: 20127, + 55486: 40720, + 55487: 20060, + 55488: 20073, + 55489: 20115, + 55490: 33416, + 55491: 23387, + 55492: 21868, + 55493: 22031, + 55494: 20164, + 55495: 21389, + 55496: 21405, + 55497: 21411, + 55498: 21413, + 55499: 21422, + 55500: 38757, + 55501: 36189, + 55502: 21274, + 55503: 21493, + 55504: 21286, + 55505: 21294, + 55506: 21310, + 55507: 36188, + 55508: 21350, + 55509: 21347, + 55510: 20994, + 55511: 21000, + 55512: 21006, + 55513: 21037, + 55514: 21043, + 55515: 21055, + 55516: 21056, + 55517: 21068, + 55518: 21086, + 55519: 21089, + 55520: 21084, + 55521: 33967, + 55522: 21117, + 55523: 21122, + 55524: 21121, + 55525: 21136, + 55526: 21139, + 55527: 20866, + 55528: 32596, + 55529: 20155, + 55530: 20163, + 55531: 20169, + 55532: 20162, + 55533: 20200, + 55534: 20193, + 55535: 20203, + 55536: 20190, + 55537: 20251, + 55538: 20211, + 55539: 20258, + 55540: 20324, + 55541: 20213, + 55542: 20261, + 55543: 20263, + 55544: 20233, + 55545: 20267, + 55546: 20318, + 55547: 20327, + 55548: 25912, + 55549: 20314, + 55550: 20317, + 55616: 36014, + 55617: 36015, + 55618: 36016, + 55619: 36017, + 55620: 36018, + 55621: 36019, + 55622: 36020, + 55623: 36021, + 55624: 36022, + 55625: 36023, + 55626: 36024, + 55627: 36025, + 55628: 36026, + 55629: 36027, + 55630: 36028, + 55631: 36029, + 55632: 36030, + 55633: 36031, + 55634: 36032, + 55635: 36033, + 55636: 36034, + 55637: 36035, + 55638: 36036, + 55639: 36037, + 55640: 36038, + 55641: 36039, + 55642: 36040, + 55643: 36041, + 55644: 36042, + 55645: 36043, + 55646: 36044, + 55647: 36045, + 55648: 36046, + 55649: 36047, + 55650: 36048, + 55651: 36049, + 55652: 36050, + 55653: 36051, + 55654: 36052, + 55655: 36053, + 55656: 36054, + 55657: 36055, + 55658: 36056, + 55659: 36057, + 55660: 36058, + 55661: 36059, + 55662: 36060, + 55663: 36061, + 55664: 36062, + 55665: 36063, + 55666: 36064, + 55667: 36065, + 55668: 36066, + 55669: 36067, + 55670: 36068, + 55671: 36069, + 55672: 36070, + 55673: 36071, + 55674: 36072, + 55675: 36073, + 55676: 36074, + 55677: 36075, + 55678: 36076, + 55680: 36077, + 55681: 36078, + 55682: 36079, + 55683: 36080, + 55684: 36081, + 55685: 36082, + 55686: 36083, + 55687: 36084, + 55688: 36085, + 55689: 36086, + 55690: 36087, + 55691: 36088, + 55692: 36089, + 55693: 36090, + 55694: 36091, + 55695: 36092, + 55696: 36093, + 55697: 36094, + 55698: 36095, + 55699: 36096, + 55700: 36097, + 55701: 36098, + 55702: 36099, + 55703: 36100, + 55704: 36101, + 55705: 36102, + 55706: 36103, + 55707: 36104, + 55708: 36105, + 55709: 36106, + 55710: 36107, + 55711: 36108, + 55712: 36109, + 55713: 20319, + 55714: 20311, + 55715: 20274, + 55716: 20285, + 55717: 20342, + 55718: 20340, + 55719: 20369, + 55720: 20361, + 55721: 20355, + 55722: 20367, + 55723: 20350, + 55724: 20347, + 55725: 20394, + 55726: 20348, + 55727: 20396, + 55728: 20372, + 55729: 20454, + 55730: 20456, + 55731: 20458, + 55732: 20421, + 55733: 20442, + 55734: 20451, + 55735: 20444, + 55736: 20433, + 55737: 20447, + 55738: 20472, + 55739: 20521, + 55740: 20556, + 55741: 20467, + 55742: 20524, + 55743: 20495, + 55744: 20526, + 55745: 20525, + 55746: 20478, + 55747: 20508, + 55748: 20492, + 55749: 20517, + 55750: 20520, + 55751: 20606, + 55752: 20547, + 55753: 20565, + 55754: 20552, + 55755: 20558, + 55756: 20588, + 55757: 20603, + 55758: 20645, + 55759: 20647, + 55760: 20649, + 55761: 20666, + 55762: 20694, + 55763: 20742, + 55764: 20717, + 55765: 20716, + 55766: 20710, + 55767: 20718, + 55768: 20743, + 55769: 20747, + 55770: 20189, + 55771: 27709, + 55772: 20312, + 55773: 20325, + 55774: 20430, + 55775: 40864, + 55776: 27718, + 55777: 31860, + 55778: 20846, + 55779: 24061, + 55780: 40649, + 55781: 39320, + 55782: 20865, + 55783: 22804, + 55784: 21241, + 55785: 21261, + 55786: 35335, + 55787: 21264, + 55788: 20971, + 55789: 22809, + 55790: 20821, + 55791: 20128, + 55792: 20822, + 55793: 20147, + 55794: 34926, + 55795: 34980, + 55796: 20149, + 55797: 33044, + 55798: 35026, + 55799: 31104, + 55800: 23348, + 55801: 34819, + 55802: 32696, + 55803: 20907, + 55804: 20913, + 55805: 20925, + 55806: 20924, + 55872: 36110, + 55873: 36111, + 55874: 36112, + 55875: 36113, + 55876: 36114, + 55877: 36115, + 55878: 36116, + 55879: 36117, + 55880: 36118, + 55881: 36119, + 55882: 36120, + 55883: 36121, + 55884: 36122, + 55885: 36123, + 55886: 36124, + 55887: 36128, + 55888: 36177, + 55889: 36178, + 55890: 36183, + 55891: 36191, + 55892: 36197, + 55893: 36200, + 55894: 36201, + 55895: 36202, + 55896: 36204, + 55897: 36206, + 55898: 36207, + 55899: 36209, + 55900: 36210, + 55901: 36216, + 55902: 36217, + 55903: 36218, + 55904: 36219, + 55905: 36220, + 55906: 36221, + 55907: 36222, + 55908: 36223, + 55909: 36224, + 55910: 36226, + 55911: 36227, + 55912: 36230, + 55913: 36231, + 55914: 36232, + 55915: 36233, + 55916: 36236, + 55917: 36237, + 55918: 36238, + 55919: 36239, + 55920: 36240, + 55921: 36242, + 55922: 36243, + 55923: 36245, + 55924: 36246, + 55925: 36247, + 55926: 36248, + 55927: 36249, + 55928: 36250, + 55929: 36251, + 55930: 36252, + 55931: 36253, + 55932: 36254, + 55933: 36256, + 55934: 36257, + 55936: 36258, + 55937: 36260, + 55938: 36261, + 55939: 36262, + 55940: 36263, + 55941: 36264, + 55942: 36265, + 55943: 36266, + 55944: 36267, + 55945: 36268, + 55946: 36269, + 55947: 36270, + 55948: 36271, + 55949: 36272, + 55950: 36274, + 55951: 36278, + 55952: 36279, + 55953: 36281, + 55954: 36283, + 55955: 36285, + 55956: 36288, + 55957: 36289, + 55958: 36290, + 55959: 36293, + 55960: 36295, + 55961: 36296, + 55962: 36297, + 55963: 36298, + 55964: 36301, + 55965: 36304, + 55966: 36306, + 55967: 36307, + 55968: 36308, + 55969: 20935, + 55970: 20886, + 55971: 20898, + 55972: 20901, + 55973: 35744, + 55974: 35750, + 55975: 35751, + 55976: 35754, + 55977: 35764, + 55978: 35765, + 55979: 35767, + 55980: 35778, + 55981: 35779, + 55982: 35787, + 55983: 35791, + 55984: 35790, + 55985: 35794, + 55986: 35795, + 55987: 35796, + 55988: 35798, + 55989: 35800, + 55990: 35801, + 55991: 35804, + 55992: 35807, + 55993: 35808, + 55994: 35812, + 55995: 35816, + 55996: 35817, + 55997: 35822, + 55998: 35824, + 55999: 35827, + 56000: 35830, + 56001: 35833, + 56002: 35836, + 56003: 35839, + 56004: 35840, + 56005: 35842, + 56006: 35844, + 56007: 35847, + 56008: 35852, + 56009: 35855, + 56010: 35857, + 56011: 35858, + 56012: 35860, + 56013: 35861, + 56014: 35862, + 56015: 35865, + 56016: 35867, + 56017: 35864, + 56018: 35869, + 56019: 35871, + 56020: 35872, + 56021: 35873, + 56022: 35877, + 56023: 35879, + 56024: 35882, + 56025: 35883, + 56026: 35886, + 56027: 35887, + 56028: 35890, + 56029: 35891, + 56030: 35893, + 56031: 35894, + 56032: 21353, + 56033: 21370, + 56034: 38429, + 56035: 38434, + 56036: 38433, + 56037: 38449, + 56038: 38442, + 56039: 38461, + 56040: 38460, + 56041: 38466, + 56042: 38473, + 56043: 38484, + 56044: 38495, + 56045: 38503, + 56046: 38508, + 56047: 38514, + 56048: 38516, + 56049: 38536, + 56050: 38541, + 56051: 38551, + 56052: 38576, + 56053: 37015, + 56054: 37019, + 56055: 37021, + 56056: 37017, + 56057: 37036, + 56058: 37025, + 56059: 37044, + 56060: 37043, + 56061: 37046, + 56062: 37050, + 56128: 36309, + 56129: 36312, + 56130: 36313, + 56131: 36316, + 56132: 36320, + 56133: 36321, + 56134: 36322, + 56135: 36325, + 56136: 36326, + 56137: 36327, + 56138: 36329, + 56139: 36333, + 56140: 36334, + 56141: 36336, + 56142: 36337, + 56143: 36338, + 56144: 36340, + 56145: 36342, + 56146: 36348, + 56147: 36350, + 56148: 36351, + 56149: 36352, + 56150: 36353, + 56151: 36354, + 56152: 36355, + 56153: 36356, + 56154: 36358, + 56155: 36359, + 56156: 36360, + 56157: 36363, + 56158: 36365, + 56159: 36366, + 56160: 36368, + 56161: 36369, + 56162: 36370, + 56163: 36371, + 56164: 36373, + 56165: 36374, + 56166: 36375, + 56167: 36376, + 56168: 36377, + 56169: 36378, + 56170: 36379, + 56171: 36380, + 56172: 36384, + 56173: 36385, + 56174: 36388, + 56175: 36389, + 56176: 36390, + 56177: 36391, + 56178: 36392, + 56179: 36395, + 56180: 36397, + 56181: 36400, + 56182: 36402, + 56183: 36403, + 56184: 36404, + 56185: 36406, + 56186: 36407, + 56187: 36408, + 56188: 36411, + 56189: 36412, + 56190: 36414, + 56192: 36415, + 56193: 36419, + 56194: 36421, + 56195: 36422, + 56196: 36428, + 56197: 36429, + 56198: 36430, + 56199: 36431, + 56200: 36432, + 56201: 36435, + 56202: 36436, + 56203: 36437, + 56204: 36438, + 56205: 36439, + 56206: 36440, + 56207: 36442, + 56208: 36443, + 56209: 36444, + 56210: 36445, + 56211: 36446, + 56212: 36447, + 56213: 36448, + 56214: 36449, + 56215: 36450, + 56216: 36451, + 56217: 36452, + 56218: 36453, + 56219: 36455, + 56220: 36456, + 56221: 36458, + 56222: 36459, + 56223: 36462, + 56224: 36465, + 56225: 37048, + 56226: 37040, + 56227: 37071, + 56228: 37061, + 56229: 37054, + 56230: 37072, + 56231: 37060, + 56232: 37063, + 56233: 37075, + 56234: 37094, + 56235: 37090, + 56236: 37084, + 56237: 37079, + 56238: 37083, + 56239: 37099, + 56240: 37103, + 56241: 37118, + 56242: 37124, + 56243: 37154, + 56244: 37150, + 56245: 37155, + 56246: 37169, + 56247: 37167, + 56248: 37177, + 56249: 37187, + 56250: 37190, + 56251: 21005, + 56252: 22850, + 56253: 21154, + 56254: 21164, + 56255: 21165, + 56256: 21182, + 56257: 21759, + 56258: 21200, + 56259: 21206, + 56260: 21232, + 56261: 21471, + 56262: 29166, + 56263: 30669, + 56264: 24308, + 56265: 20981, + 56266: 20988, + 56267: 39727, + 56268: 21430, + 56269: 24321, + 56270: 30042, + 56271: 24047, + 56272: 22348, + 56273: 22441, + 56274: 22433, + 56275: 22654, + 56276: 22716, + 56277: 22725, + 56278: 22737, + 56279: 22313, + 56280: 22316, + 56281: 22314, + 56282: 22323, + 56283: 22329, + 56284: 22318, + 56285: 22319, + 56286: 22364, + 56287: 22331, + 56288: 22338, + 56289: 22377, + 56290: 22405, + 56291: 22379, + 56292: 22406, + 56293: 22396, + 56294: 22395, + 56295: 22376, + 56296: 22381, + 56297: 22390, + 56298: 22387, + 56299: 22445, + 56300: 22436, + 56301: 22412, + 56302: 22450, + 56303: 22479, + 56304: 22439, + 56305: 22452, + 56306: 22419, + 56307: 22432, + 56308: 22485, + 56309: 22488, + 56310: 22490, + 56311: 22489, + 56312: 22482, + 56313: 22456, + 56314: 22516, + 56315: 22511, + 56316: 22520, + 56317: 22500, + 56318: 22493, + 56384: 36467, + 56385: 36469, + 56386: 36471, + 56387: 36472, + 56388: 36473, + 56389: 36474, + 56390: 36475, + 56391: 36477, + 56392: 36478, + 56393: 36480, + 56394: 36482, + 56395: 36483, + 56396: 36484, + 56397: 36486, + 56398: 36488, + 56399: 36489, + 56400: 36490, + 56401: 36491, + 56402: 36492, + 56403: 36493, + 56404: 36494, + 56405: 36497, + 56406: 36498, + 56407: 36499, + 56408: 36501, + 56409: 36502, + 56410: 36503, + 56411: 36504, + 56412: 36505, + 56413: 36506, + 56414: 36507, + 56415: 36509, + 56416: 36511, + 56417: 36512, + 56418: 36513, + 56419: 36514, + 56420: 36515, + 56421: 36516, + 56422: 36517, + 56423: 36518, + 56424: 36519, + 56425: 36520, + 56426: 36521, + 56427: 36522, + 56428: 36525, + 56429: 36526, + 56430: 36528, + 56431: 36529, + 56432: 36531, + 56433: 36532, + 56434: 36533, + 56435: 36534, + 56436: 36535, + 56437: 36536, + 56438: 36537, + 56439: 36539, + 56440: 36540, + 56441: 36541, + 56442: 36542, + 56443: 36543, + 56444: 36544, + 56445: 36545, + 56446: 36546, + 56448: 36547, + 56449: 36548, + 56450: 36549, + 56451: 36550, + 56452: 36551, + 56453: 36552, + 56454: 36553, + 56455: 36554, + 56456: 36555, + 56457: 36556, + 56458: 36557, + 56459: 36559, + 56460: 36560, + 56461: 36561, + 56462: 36562, + 56463: 36563, + 56464: 36564, + 56465: 36565, + 56466: 36566, + 56467: 36567, + 56468: 36568, + 56469: 36569, + 56470: 36570, + 56471: 36571, + 56472: 36572, + 56473: 36573, + 56474: 36574, + 56475: 36575, + 56476: 36576, + 56477: 36577, + 56478: 36578, + 56479: 36579, + 56480: 36580, + 56481: 22539, + 56482: 22541, + 56483: 22525, + 56484: 22509, + 56485: 22528, + 56486: 22558, + 56487: 22553, + 56488: 22596, + 56489: 22560, + 56490: 22629, + 56491: 22636, + 56492: 22657, + 56493: 22665, + 56494: 22682, + 56495: 22656, + 56496: 39336, + 56497: 40729, + 56498: 25087, + 56499: 33401, + 56500: 33405, + 56501: 33407, + 56502: 33423, + 56503: 33418, + 56504: 33448, + 56505: 33412, + 56506: 33422, + 56507: 33425, + 56508: 33431, + 56509: 33433, + 56510: 33451, + 56511: 33464, + 56512: 33470, + 56513: 33456, + 56514: 33480, + 56515: 33482, + 56516: 33507, + 56517: 33432, + 56518: 33463, + 56519: 33454, + 56520: 33483, + 56521: 33484, + 56522: 33473, + 56523: 33449, + 56524: 33460, + 56525: 33441, + 56526: 33450, + 56527: 33439, + 56528: 33476, + 56529: 33486, + 56530: 33444, + 56531: 33505, + 56532: 33545, + 56533: 33527, + 56534: 33508, + 56535: 33551, + 56536: 33543, + 56537: 33500, + 56538: 33524, + 56539: 33490, + 56540: 33496, + 56541: 33548, + 56542: 33531, + 56543: 33491, + 56544: 33553, + 56545: 33562, + 56546: 33542, + 56547: 33556, + 56548: 33557, + 56549: 33504, + 56550: 33493, + 56551: 33564, + 56552: 33617, + 56553: 33627, + 56554: 33628, + 56555: 33544, + 56556: 33682, + 56557: 33596, + 56558: 33588, + 56559: 33585, + 56560: 33691, + 56561: 33630, + 56562: 33583, + 56563: 33615, + 56564: 33607, + 56565: 33603, + 56566: 33631, + 56567: 33600, + 56568: 33559, + 56569: 33632, + 56570: 33581, + 56571: 33594, + 56572: 33587, + 56573: 33638, + 56574: 33637, + 56640: 36581, + 56641: 36582, + 56642: 36583, + 56643: 36584, + 56644: 36585, + 56645: 36586, + 56646: 36587, + 56647: 36588, + 56648: 36589, + 56649: 36590, + 56650: 36591, + 56651: 36592, + 56652: 36593, + 56653: 36594, + 56654: 36595, + 56655: 36596, + 56656: 36597, + 56657: 36598, + 56658: 36599, + 56659: 36600, + 56660: 36601, + 56661: 36602, + 56662: 36603, + 56663: 36604, + 56664: 36605, + 56665: 36606, + 56666: 36607, + 56667: 36608, + 56668: 36609, + 56669: 36610, + 56670: 36611, + 56671: 36612, + 56672: 36613, + 56673: 36614, + 56674: 36615, + 56675: 36616, + 56676: 36617, + 56677: 36618, + 56678: 36619, + 56679: 36620, + 56680: 36621, + 56681: 36622, + 56682: 36623, + 56683: 36624, + 56684: 36625, + 56685: 36626, + 56686: 36627, + 56687: 36628, + 56688: 36629, + 56689: 36630, + 56690: 36631, + 56691: 36632, + 56692: 36633, + 56693: 36634, + 56694: 36635, + 56695: 36636, + 56696: 36637, + 56697: 36638, + 56698: 36639, + 56699: 36640, + 56700: 36641, + 56701: 36642, + 56702: 36643, + 56704: 36644, + 56705: 36645, + 56706: 36646, + 56707: 36647, + 56708: 36648, + 56709: 36649, + 56710: 36650, + 56711: 36651, + 56712: 36652, + 56713: 36653, + 56714: 36654, + 56715: 36655, + 56716: 36656, + 56717: 36657, + 56718: 36658, + 56719: 36659, + 56720: 36660, + 56721: 36661, + 56722: 36662, + 56723: 36663, + 56724: 36664, + 56725: 36665, + 56726: 36666, + 56727: 36667, + 56728: 36668, + 56729: 36669, + 56730: 36670, + 56731: 36671, + 56732: 36672, + 56733: 36673, + 56734: 36674, + 56735: 36675, + 56736: 36676, + 56737: 33640, + 56738: 33563, + 56739: 33641, + 56740: 33644, + 56741: 33642, + 56742: 33645, + 56743: 33646, + 56744: 33712, + 56745: 33656, + 56746: 33715, + 56747: 33716, + 56748: 33696, + 56749: 33706, + 56750: 33683, + 56751: 33692, + 56752: 33669, + 56753: 33660, + 56754: 33718, + 56755: 33705, + 56756: 33661, + 56757: 33720, + 56758: 33659, + 56759: 33688, + 56760: 33694, + 56761: 33704, + 56762: 33722, + 56763: 33724, + 56764: 33729, + 56765: 33793, + 56766: 33765, + 56767: 33752, + 56768: 22535, + 56769: 33816, + 56770: 33803, + 56771: 33757, + 56772: 33789, + 56773: 33750, + 56774: 33820, + 56775: 33848, + 56776: 33809, + 56777: 33798, + 56778: 33748, + 56779: 33759, + 56780: 33807, + 56781: 33795, + 56782: 33784, + 56783: 33785, + 56784: 33770, + 56785: 33733, + 56786: 33728, + 56787: 33830, + 56788: 33776, + 56789: 33761, + 56790: 33884, + 56791: 33873, + 56792: 33882, + 56793: 33881, + 56794: 33907, + 56795: 33927, + 56796: 33928, + 56797: 33914, + 56798: 33929, + 56799: 33912, + 56800: 33852, + 56801: 33862, + 56802: 33897, + 56803: 33910, + 56804: 33932, + 56805: 33934, + 56806: 33841, + 56807: 33901, + 56808: 33985, + 56809: 33997, + 56810: 34000, + 56811: 34022, + 56812: 33981, + 56813: 34003, + 56814: 33994, + 56815: 33983, + 56816: 33978, + 56817: 34016, + 56818: 33953, + 56819: 33977, + 56820: 33972, + 56821: 33943, + 56822: 34021, + 56823: 34019, + 56824: 34060, + 56825: 29965, + 56826: 34104, + 56827: 34032, + 56828: 34105, + 56829: 34079, + 56830: 34106, + 56896: 36677, + 56897: 36678, + 56898: 36679, + 56899: 36680, + 56900: 36681, + 56901: 36682, + 56902: 36683, + 56903: 36684, + 56904: 36685, + 56905: 36686, + 56906: 36687, + 56907: 36688, + 56908: 36689, + 56909: 36690, + 56910: 36691, + 56911: 36692, + 56912: 36693, + 56913: 36694, + 56914: 36695, + 56915: 36696, + 56916: 36697, + 56917: 36698, + 56918: 36699, + 56919: 36700, + 56920: 36701, + 56921: 36702, + 56922: 36703, + 56923: 36704, + 56924: 36705, + 56925: 36706, + 56926: 36707, + 56927: 36708, + 56928: 36709, + 56929: 36714, + 56930: 36736, + 56931: 36748, + 56932: 36754, + 56933: 36765, + 56934: 36768, + 56935: 36769, + 56936: 36770, + 56937: 36772, + 56938: 36773, + 56939: 36774, + 56940: 36775, + 56941: 36778, + 56942: 36780, + 56943: 36781, + 56944: 36782, + 56945: 36783, + 56946: 36786, + 56947: 36787, + 56948: 36788, + 56949: 36789, + 56950: 36791, + 56951: 36792, + 56952: 36794, + 56953: 36795, + 56954: 36796, + 56955: 36799, + 56956: 36800, + 56957: 36803, + 56958: 36806, + 56960: 36809, + 56961: 36810, + 56962: 36811, + 56963: 36812, + 56964: 36813, + 56965: 36815, + 56966: 36818, + 56967: 36822, + 56968: 36823, + 56969: 36826, + 56970: 36832, + 56971: 36833, + 56972: 36835, + 56973: 36839, + 56974: 36844, + 56975: 36847, + 56976: 36849, + 56977: 36850, + 56978: 36852, + 56979: 36853, + 56980: 36854, + 56981: 36858, + 56982: 36859, + 56983: 36860, + 56984: 36862, + 56985: 36863, + 56986: 36871, + 56987: 36872, + 56988: 36876, + 56989: 36878, + 56990: 36883, + 56991: 36885, + 56992: 36888, + 56993: 34134, + 56994: 34107, + 56995: 34047, + 56996: 34044, + 56997: 34137, + 56998: 34120, + 56999: 34152, + 57000: 34148, + 57001: 34142, + 57002: 34170, + 57003: 30626, + 57004: 34115, + 57005: 34162, + 57006: 34171, + 57007: 34212, + 57008: 34216, + 57009: 34183, + 57010: 34191, + 57011: 34169, + 57012: 34222, + 57013: 34204, + 57014: 34181, + 57015: 34233, + 57016: 34231, + 57017: 34224, + 57018: 34259, + 57019: 34241, + 57020: 34268, + 57021: 34303, + 57022: 34343, + 57023: 34309, + 57024: 34345, + 57025: 34326, + 57026: 34364, + 57027: 24318, + 57028: 24328, + 57029: 22844, + 57030: 22849, + 57031: 32823, + 57032: 22869, + 57033: 22874, + 57034: 22872, + 57035: 21263, + 57036: 23586, + 57037: 23589, + 57038: 23596, + 57039: 23604, + 57040: 25164, + 57041: 25194, + 57042: 25247, + 57043: 25275, + 57044: 25290, + 57045: 25306, + 57046: 25303, + 57047: 25326, + 57048: 25378, + 57049: 25334, + 57050: 25401, + 57051: 25419, + 57052: 25411, + 57053: 25517, + 57054: 25590, + 57055: 25457, + 57056: 25466, + 57057: 25486, + 57058: 25524, + 57059: 25453, + 57060: 25516, + 57061: 25482, + 57062: 25449, + 57063: 25518, + 57064: 25532, + 57065: 25586, + 57066: 25592, + 57067: 25568, + 57068: 25599, + 57069: 25540, + 57070: 25566, + 57071: 25550, + 57072: 25682, + 57073: 25542, + 57074: 25534, + 57075: 25669, + 57076: 25665, + 57077: 25611, + 57078: 25627, + 57079: 25632, + 57080: 25612, + 57081: 25638, + 57082: 25633, + 57083: 25694, + 57084: 25732, + 57085: 25709, + 57086: 25750, + 57152: 36889, + 57153: 36892, + 57154: 36899, + 57155: 36900, + 57156: 36901, + 57157: 36903, + 57158: 36904, + 57159: 36905, + 57160: 36906, + 57161: 36907, + 57162: 36908, + 57163: 36912, + 57164: 36913, + 57165: 36914, + 57166: 36915, + 57167: 36916, + 57168: 36919, + 57169: 36921, + 57170: 36922, + 57171: 36925, + 57172: 36927, + 57173: 36928, + 57174: 36931, + 57175: 36933, + 57176: 36934, + 57177: 36936, + 57178: 36937, + 57179: 36938, + 57180: 36939, + 57181: 36940, + 57182: 36942, + 57183: 36948, + 57184: 36949, + 57185: 36950, + 57186: 36953, + 57187: 36954, + 57188: 36956, + 57189: 36957, + 57190: 36958, + 57191: 36959, + 57192: 36960, + 57193: 36961, + 57194: 36964, + 57195: 36966, + 57196: 36967, + 57197: 36969, + 57198: 36970, + 57199: 36971, + 57200: 36972, + 57201: 36975, + 57202: 36976, + 57203: 36977, + 57204: 36978, + 57205: 36979, + 57206: 36982, + 57207: 36983, + 57208: 36984, + 57209: 36985, + 57210: 36986, + 57211: 36987, + 57212: 36988, + 57213: 36990, + 57214: 36993, + 57216: 36996, + 57217: 36997, + 57218: 36998, + 57219: 36999, + 57220: 37001, + 57221: 37002, + 57222: 37004, + 57223: 37005, + 57224: 37006, + 57225: 37007, + 57226: 37008, + 57227: 37010, + 57228: 37012, + 57229: 37014, + 57230: 37016, + 57231: 37018, + 57232: 37020, + 57233: 37022, + 57234: 37023, + 57235: 37024, + 57236: 37028, + 57237: 37029, + 57238: 37031, + 57239: 37032, + 57240: 37033, + 57241: 37035, + 57242: 37037, + 57243: 37042, + 57244: 37047, + 57245: 37052, + 57246: 37053, + 57247: 37055, + 57248: 37056, + 57249: 25722, + 57250: 25783, + 57251: 25784, + 57252: 25753, + 57253: 25786, + 57254: 25792, + 57255: 25808, + 57256: 25815, + 57257: 25828, + 57258: 25826, + 57259: 25865, + 57260: 25893, + 57261: 25902, + 57262: 24331, + 57263: 24530, + 57264: 29977, + 57265: 24337, + 57266: 21343, + 57267: 21489, + 57268: 21501, + 57269: 21481, + 57270: 21480, + 57271: 21499, + 57272: 21522, + 57273: 21526, + 57274: 21510, + 57275: 21579, + 57276: 21586, + 57277: 21587, + 57278: 21588, + 57279: 21590, + 57280: 21571, + 57281: 21537, + 57282: 21591, + 57283: 21593, + 57284: 21539, + 57285: 21554, + 57286: 21634, + 57287: 21652, + 57288: 21623, + 57289: 21617, + 57290: 21604, + 57291: 21658, + 57292: 21659, + 57293: 21636, + 57294: 21622, + 57295: 21606, + 57296: 21661, + 57297: 21712, + 57298: 21677, + 57299: 21698, + 57300: 21684, + 57301: 21714, + 57302: 21671, + 57303: 21670, + 57304: 21715, + 57305: 21716, + 57306: 21618, + 57307: 21667, + 57308: 21717, + 57309: 21691, + 57310: 21695, + 57311: 21708, + 57312: 21721, + 57313: 21722, + 57314: 21724, + 57315: 21673, + 57316: 21674, + 57317: 21668, + 57318: 21725, + 57319: 21711, + 57320: 21726, + 57321: 21787, + 57322: 21735, + 57323: 21792, + 57324: 21757, + 57325: 21780, + 57326: 21747, + 57327: 21794, + 57328: 21795, + 57329: 21775, + 57330: 21777, + 57331: 21799, + 57332: 21802, + 57333: 21863, + 57334: 21903, + 57335: 21941, + 57336: 21833, + 57337: 21869, + 57338: 21825, + 57339: 21845, + 57340: 21823, + 57341: 21840, + 57342: 21820, + 57408: 37058, + 57409: 37059, + 57410: 37062, + 57411: 37064, + 57412: 37065, + 57413: 37067, + 57414: 37068, + 57415: 37069, + 57416: 37074, + 57417: 37076, + 57418: 37077, + 57419: 37078, + 57420: 37080, + 57421: 37081, + 57422: 37082, + 57423: 37086, + 57424: 37087, + 57425: 37088, + 57426: 37091, + 57427: 37092, + 57428: 37093, + 57429: 37097, + 57430: 37098, + 57431: 37100, + 57432: 37102, + 57433: 37104, + 57434: 37105, + 57435: 37106, + 57436: 37107, + 57437: 37109, + 57438: 37110, + 57439: 37111, + 57440: 37113, + 57441: 37114, + 57442: 37115, + 57443: 37116, + 57444: 37119, + 57445: 37120, + 57446: 37121, + 57447: 37123, + 57448: 37125, + 57449: 37126, + 57450: 37127, + 57451: 37128, + 57452: 37129, + 57453: 37130, + 57454: 37131, + 57455: 37132, + 57456: 37133, + 57457: 37134, + 57458: 37135, + 57459: 37136, + 57460: 37137, + 57461: 37138, + 57462: 37139, + 57463: 37140, + 57464: 37141, + 57465: 37142, + 57466: 37143, + 57467: 37144, + 57468: 37146, + 57469: 37147, + 57470: 37148, + 57472: 37149, + 57473: 37151, + 57474: 37152, + 57475: 37153, + 57476: 37156, + 57477: 37157, + 57478: 37158, + 57479: 37159, + 57480: 37160, + 57481: 37161, + 57482: 37162, + 57483: 37163, + 57484: 37164, + 57485: 37165, + 57486: 37166, + 57487: 37168, + 57488: 37170, + 57489: 37171, + 57490: 37172, + 57491: 37173, + 57492: 37174, + 57493: 37175, + 57494: 37176, + 57495: 37178, + 57496: 37179, + 57497: 37180, + 57498: 37181, + 57499: 37182, + 57500: 37183, + 57501: 37184, + 57502: 37185, + 57503: 37186, + 57504: 37188, + 57505: 21815, + 57506: 21846, + 57507: 21877, + 57508: 21878, + 57509: 21879, + 57510: 21811, + 57511: 21808, + 57512: 21852, + 57513: 21899, + 57514: 21970, + 57515: 21891, + 57516: 21937, + 57517: 21945, + 57518: 21896, + 57519: 21889, + 57520: 21919, + 57521: 21886, + 57522: 21974, + 57523: 21905, + 57524: 21883, + 57525: 21983, + 57526: 21949, + 57527: 21950, + 57528: 21908, + 57529: 21913, + 57530: 21994, + 57531: 22007, + 57532: 21961, + 57533: 22047, + 57534: 21969, + 57535: 21995, + 57536: 21996, + 57537: 21972, + 57538: 21990, + 57539: 21981, + 57540: 21956, + 57541: 21999, + 57542: 21989, + 57543: 22002, + 57544: 22003, + 57545: 21964, + 57546: 21965, + 57547: 21992, + 57548: 22005, + 57549: 21988, + 57550: 36756, + 57551: 22046, + 57552: 22024, + 57553: 22028, + 57554: 22017, + 57555: 22052, + 57556: 22051, + 57557: 22014, + 57558: 22016, + 57559: 22055, + 57560: 22061, + 57561: 22104, + 57562: 22073, + 57563: 22103, + 57564: 22060, + 57565: 22093, + 57566: 22114, + 57567: 22105, + 57568: 22108, + 57569: 22092, + 57570: 22100, + 57571: 22150, + 57572: 22116, + 57573: 22129, + 57574: 22123, + 57575: 22139, + 57576: 22140, + 57577: 22149, + 57578: 22163, + 57579: 22191, + 57580: 22228, + 57581: 22231, + 57582: 22237, + 57583: 22241, + 57584: 22261, + 57585: 22251, + 57586: 22265, + 57587: 22271, + 57588: 22276, + 57589: 22282, + 57590: 22281, + 57591: 22300, + 57592: 24079, + 57593: 24089, + 57594: 24084, + 57595: 24081, + 57596: 24113, + 57597: 24123, + 57598: 24124, + 57664: 37189, + 57665: 37191, + 57666: 37192, + 57667: 37201, + 57668: 37203, + 57669: 37204, + 57670: 37205, + 57671: 37206, + 57672: 37208, + 57673: 37209, + 57674: 37211, + 57675: 37212, + 57676: 37215, + 57677: 37216, + 57678: 37222, + 57679: 37223, + 57680: 37224, + 57681: 37227, + 57682: 37229, + 57683: 37235, + 57684: 37242, + 57685: 37243, + 57686: 37244, + 57687: 37248, + 57688: 37249, + 57689: 37250, + 57690: 37251, + 57691: 37252, + 57692: 37254, + 57693: 37256, + 57694: 37258, + 57695: 37262, + 57696: 37263, + 57697: 37267, + 57698: 37268, + 57699: 37269, + 57700: 37270, + 57701: 37271, + 57702: 37272, + 57703: 37273, + 57704: 37276, + 57705: 37277, + 57706: 37278, + 57707: 37279, + 57708: 37280, + 57709: 37281, + 57710: 37284, + 57711: 37285, + 57712: 37286, + 57713: 37287, + 57714: 37288, + 57715: 37289, + 57716: 37291, + 57717: 37292, + 57718: 37296, + 57719: 37297, + 57720: 37298, + 57721: 37299, + 57722: 37302, + 57723: 37303, + 57724: 37304, + 57725: 37305, + 57726: 37307, + 57728: 37308, + 57729: 37309, + 57730: 37310, + 57731: 37311, + 57732: 37312, + 57733: 37313, + 57734: 37314, + 57735: 37315, + 57736: 37316, + 57737: 37317, + 57738: 37318, + 57739: 37320, + 57740: 37323, + 57741: 37328, + 57742: 37330, + 57743: 37331, + 57744: 37332, + 57745: 37333, + 57746: 37334, + 57747: 37335, + 57748: 37336, + 57749: 37337, + 57750: 37338, + 57751: 37339, + 57752: 37341, + 57753: 37342, + 57754: 37343, + 57755: 37344, + 57756: 37345, + 57757: 37346, + 57758: 37347, + 57759: 37348, + 57760: 37349, + 57761: 24119, + 57762: 24132, + 57763: 24148, + 57764: 24155, + 57765: 24158, + 57766: 24161, + 57767: 23692, + 57768: 23674, + 57769: 23693, + 57770: 23696, + 57771: 23702, + 57772: 23688, + 57773: 23704, + 57774: 23705, + 57775: 23697, + 57776: 23706, + 57777: 23708, + 57778: 23733, + 57779: 23714, + 57780: 23741, + 57781: 23724, + 57782: 23723, + 57783: 23729, + 57784: 23715, + 57785: 23745, + 57786: 23735, + 57787: 23748, + 57788: 23762, + 57789: 23780, + 57790: 23755, + 57791: 23781, + 57792: 23810, + 57793: 23811, + 57794: 23847, + 57795: 23846, + 57796: 23854, + 57797: 23844, + 57798: 23838, + 57799: 23814, + 57800: 23835, + 57801: 23896, + 57802: 23870, + 57803: 23860, + 57804: 23869, + 57805: 23916, + 57806: 23899, + 57807: 23919, + 57808: 23901, + 57809: 23915, + 57810: 23883, + 57811: 23882, + 57812: 23913, + 57813: 23924, + 57814: 23938, + 57815: 23961, + 57816: 23965, + 57817: 35955, + 57818: 23991, + 57819: 24005, + 57820: 24435, + 57821: 24439, + 57822: 24450, + 57823: 24455, + 57824: 24457, + 57825: 24460, + 57826: 24469, + 57827: 24473, + 57828: 24476, + 57829: 24488, + 57830: 24493, + 57831: 24501, + 57832: 24508, + 57833: 34914, + 57834: 24417, + 57835: 29357, + 57836: 29360, + 57837: 29364, + 57838: 29367, + 57839: 29368, + 57840: 29379, + 57841: 29377, + 57842: 29390, + 57843: 29389, + 57844: 29394, + 57845: 29416, + 57846: 29423, + 57847: 29417, + 57848: 29426, + 57849: 29428, + 57850: 29431, + 57851: 29441, + 57852: 29427, + 57853: 29443, + 57854: 29434, + 57920: 37350, + 57921: 37351, + 57922: 37352, + 57923: 37353, + 57924: 37354, + 57925: 37355, + 57926: 37356, + 57927: 37357, + 57928: 37358, + 57929: 37359, + 57930: 37360, + 57931: 37361, + 57932: 37362, + 57933: 37363, + 57934: 37364, + 57935: 37365, + 57936: 37366, + 57937: 37367, + 57938: 37368, + 57939: 37369, + 57940: 37370, + 57941: 37371, + 57942: 37372, + 57943: 37373, + 57944: 37374, + 57945: 37375, + 57946: 37376, + 57947: 37377, + 57948: 37378, + 57949: 37379, + 57950: 37380, + 57951: 37381, + 57952: 37382, + 57953: 37383, + 57954: 37384, + 57955: 37385, + 57956: 37386, + 57957: 37387, + 57958: 37388, + 57959: 37389, + 57960: 37390, + 57961: 37391, + 57962: 37392, + 57963: 37393, + 57964: 37394, + 57965: 37395, + 57966: 37396, + 57967: 37397, + 57968: 37398, + 57969: 37399, + 57970: 37400, + 57971: 37401, + 57972: 37402, + 57973: 37403, + 57974: 37404, + 57975: 37405, + 57976: 37406, + 57977: 37407, + 57978: 37408, + 57979: 37409, + 57980: 37410, + 57981: 37411, + 57982: 37412, + 57984: 37413, + 57985: 37414, + 57986: 37415, + 57987: 37416, + 57988: 37417, + 57989: 37418, + 57990: 37419, + 57991: 37420, + 57992: 37421, + 57993: 37422, + 57994: 37423, + 57995: 37424, + 57996: 37425, + 57997: 37426, + 57998: 37427, + 57999: 37428, + 58000: 37429, + 58001: 37430, + 58002: 37431, + 58003: 37432, + 58004: 37433, + 58005: 37434, + 58006: 37435, + 58007: 37436, + 58008: 37437, + 58009: 37438, + 58010: 37439, + 58011: 37440, + 58012: 37441, + 58013: 37442, + 58014: 37443, + 58015: 37444, + 58016: 37445, + 58017: 29435, + 58018: 29463, + 58019: 29459, + 58020: 29473, + 58021: 29450, + 58022: 29470, + 58023: 29469, + 58024: 29461, + 58025: 29474, + 58026: 29497, + 58027: 29477, + 58028: 29484, + 58029: 29496, + 58030: 29489, + 58031: 29520, + 58032: 29517, + 58033: 29527, + 58034: 29536, + 58035: 29548, + 58036: 29551, + 58037: 29566, + 58038: 33307, + 58039: 22821, + 58040: 39143, + 58041: 22820, + 58042: 22786, + 58043: 39267, + 58044: 39271, + 58045: 39272, + 58046: 39273, + 58047: 39274, + 58048: 39275, + 58049: 39276, + 58050: 39284, + 58051: 39287, + 58052: 39293, + 58053: 39296, + 58054: 39300, + 58055: 39303, + 58056: 39306, + 58057: 39309, + 58058: 39312, + 58059: 39313, + 58060: 39315, + 58061: 39316, + 58062: 39317, + 58063: 24192, + 58064: 24209, + 58065: 24203, + 58066: 24214, + 58067: 24229, + 58068: 24224, + 58069: 24249, + 58070: 24245, + 58071: 24254, + 58072: 24243, + 58073: 36179, + 58074: 24274, + 58075: 24273, + 58076: 24283, + 58077: 24296, + 58078: 24298, + 58079: 33210, + 58080: 24516, + 58081: 24521, + 58082: 24534, + 58083: 24527, + 58084: 24579, + 58085: 24558, + 58086: 24580, + 58087: 24545, + 58088: 24548, + 58089: 24574, + 58090: 24581, + 58091: 24582, + 58092: 24554, + 58093: 24557, + 58094: 24568, + 58095: 24601, + 58096: 24629, + 58097: 24614, + 58098: 24603, + 58099: 24591, + 58100: 24589, + 58101: 24617, + 58102: 24619, + 58103: 24586, + 58104: 24639, + 58105: 24609, + 58106: 24696, + 58107: 24697, + 58108: 24699, + 58109: 24698, + 58110: 24642, + 58176: 37446, + 58177: 37447, + 58178: 37448, + 58179: 37449, + 58180: 37450, + 58181: 37451, + 58182: 37452, + 58183: 37453, + 58184: 37454, + 58185: 37455, + 58186: 37456, + 58187: 37457, + 58188: 37458, + 58189: 37459, + 58190: 37460, + 58191: 37461, + 58192: 37462, + 58193: 37463, + 58194: 37464, + 58195: 37465, + 58196: 37466, + 58197: 37467, + 58198: 37468, + 58199: 37469, + 58200: 37470, + 58201: 37471, + 58202: 37472, + 58203: 37473, + 58204: 37474, + 58205: 37475, + 58206: 37476, + 58207: 37477, + 58208: 37478, + 58209: 37479, + 58210: 37480, + 58211: 37481, + 58212: 37482, + 58213: 37483, + 58214: 37484, + 58215: 37485, + 58216: 37486, + 58217: 37487, + 58218: 37488, + 58219: 37489, + 58220: 37490, + 58221: 37491, + 58222: 37493, + 58223: 37494, + 58224: 37495, + 58225: 37496, + 58226: 37497, + 58227: 37498, + 58228: 37499, + 58229: 37500, + 58230: 37501, + 58231: 37502, + 58232: 37503, + 58233: 37504, + 58234: 37505, + 58235: 37506, + 58236: 37507, + 58237: 37508, + 58238: 37509, + 58240: 37510, + 58241: 37511, + 58242: 37512, + 58243: 37513, + 58244: 37514, + 58245: 37515, + 58246: 37516, + 58247: 37517, + 58248: 37519, + 58249: 37520, + 58250: 37521, + 58251: 37522, + 58252: 37523, + 58253: 37524, + 58254: 37525, + 58255: 37526, + 58256: 37527, + 58257: 37528, + 58258: 37529, + 58259: 37530, + 58260: 37531, + 58261: 37532, + 58262: 37533, + 58263: 37534, + 58264: 37535, + 58265: 37536, + 58266: 37537, + 58267: 37538, + 58268: 37539, + 58269: 37540, + 58270: 37541, + 58271: 37542, + 58272: 37543, + 58273: 24682, + 58274: 24701, + 58275: 24726, + 58276: 24730, + 58277: 24749, + 58278: 24733, + 58279: 24707, + 58280: 24722, + 58281: 24716, + 58282: 24731, + 58283: 24812, + 58284: 24763, + 58285: 24753, + 58286: 24797, + 58287: 24792, + 58288: 24774, + 58289: 24794, + 58290: 24756, + 58291: 24864, + 58292: 24870, + 58293: 24853, + 58294: 24867, + 58295: 24820, + 58296: 24832, + 58297: 24846, + 58298: 24875, + 58299: 24906, + 58300: 24949, + 58301: 25004, + 58302: 24980, + 58303: 24999, + 58304: 25015, + 58305: 25044, + 58306: 25077, + 58307: 24541, + 58308: 38579, + 58309: 38377, + 58310: 38379, + 58311: 38385, + 58312: 38387, + 58313: 38389, + 58314: 38390, + 58315: 38396, + 58316: 38398, + 58317: 38403, + 58318: 38404, + 58319: 38406, + 58320: 38408, + 58321: 38410, + 58322: 38411, + 58323: 38412, + 58324: 38413, + 58325: 38415, + 58326: 38418, + 58327: 38421, + 58328: 38422, + 58329: 38423, + 58330: 38425, + 58331: 38426, + 58332: 20012, + 58333: 29247, + 58334: 25109, + 58335: 27701, + 58336: 27732, + 58337: 27740, + 58338: 27722, + 58339: 27811, + 58340: 27781, + 58341: 27792, + 58342: 27796, + 58343: 27788, + 58344: 27752, + 58345: 27753, + 58346: 27764, + 58347: 27766, + 58348: 27782, + 58349: 27817, + 58350: 27856, + 58351: 27860, + 58352: 27821, + 58353: 27895, + 58354: 27896, + 58355: 27889, + 58356: 27863, + 58357: 27826, + 58358: 27872, + 58359: 27862, + 58360: 27898, + 58361: 27883, + 58362: 27886, + 58363: 27825, + 58364: 27859, + 58365: 27887, + 58366: 27902, + 58432: 37544, + 58433: 37545, + 58434: 37546, + 58435: 37547, + 58436: 37548, + 58437: 37549, + 58438: 37551, + 58439: 37552, + 58440: 37553, + 58441: 37554, + 58442: 37555, + 58443: 37556, + 58444: 37557, + 58445: 37558, + 58446: 37559, + 58447: 37560, + 58448: 37561, + 58449: 37562, + 58450: 37563, + 58451: 37564, + 58452: 37565, + 58453: 37566, + 58454: 37567, + 58455: 37568, + 58456: 37569, + 58457: 37570, + 58458: 37571, + 58459: 37572, + 58460: 37573, + 58461: 37574, + 58462: 37575, + 58463: 37577, + 58464: 37578, + 58465: 37579, + 58466: 37580, + 58467: 37581, + 58468: 37582, + 58469: 37583, + 58470: 37584, + 58471: 37585, + 58472: 37586, + 58473: 37587, + 58474: 37588, + 58475: 37589, + 58476: 37590, + 58477: 37591, + 58478: 37592, + 58479: 37593, + 58480: 37594, + 58481: 37595, + 58482: 37596, + 58483: 37597, + 58484: 37598, + 58485: 37599, + 58486: 37600, + 58487: 37601, + 58488: 37602, + 58489: 37603, + 58490: 37604, + 58491: 37605, + 58492: 37606, + 58493: 37607, + 58494: 37608, + 58496: 37609, + 58497: 37610, + 58498: 37611, + 58499: 37612, + 58500: 37613, + 58501: 37614, + 58502: 37615, + 58503: 37616, + 58504: 37617, + 58505: 37618, + 58506: 37619, + 58507: 37620, + 58508: 37621, + 58509: 37622, + 58510: 37623, + 58511: 37624, + 58512: 37625, + 58513: 37626, + 58514: 37627, + 58515: 37628, + 58516: 37629, + 58517: 37630, + 58518: 37631, + 58519: 37632, + 58520: 37633, + 58521: 37634, + 58522: 37635, + 58523: 37636, + 58524: 37637, + 58525: 37638, + 58526: 37639, + 58527: 37640, + 58528: 37641, + 58529: 27961, + 58530: 27943, + 58531: 27916, + 58532: 27971, + 58533: 27976, + 58534: 27911, + 58535: 27908, + 58536: 27929, + 58537: 27918, + 58538: 27947, + 58539: 27981, + 58540: 27950, + 58541: 27957, + 58542: 27930, + 58543: 27983, + 58544: 27986, + 58545: 27988, + 58546: 27955, + 58547: 28049, + 58548: 28015, + 58549: 28062, + 58550: 28064, + 58551: 27998, + 58552: 28051, + 58553: 28052, + 58554: 27996, + 58555: 28000, + 58556: 28028, + 58557: 28003, + 58558: 28186, + 58559: 28103, + 58560: 28101, + 58561: 28126, + 58562: 28174, + 58563: 28095, + 58564: 28128, + 58565: 28177, + 58566: 28134, + 58567: 28125, + 58568: 28121, + 58569: 28182, + 58570: 28075, + 58571: 28172, + 58572: 28078, + 58573: 28203, + 58574: 28270, + 58575: 28238, + 58576: 28267, + 58577: 28338, + 58578: 28255, + 58579: 28294, + 58580: 28243, + 58581: 28244, + 58582: 28210, + 58583: 28197, + 58584: 28228, + 58585: 28383, + 58586: 28337, + 58587: 28312, + 58588: 28384, + 58589: 28461, + 58590: 28386, + 58591: 28325, + 58592: 28327, + 58593: 28349, + 58594: 28347, + 58595: 28343, + 58596: 28375, + 58597: 28340, + 58598: 28367, + 58599: 28303, + 58600: 28354, + 58601: 28319, + 58602: 28514, + 58603: 28486, + 58604: 28487, + 58605: 28452, + 58606: 28437, + 58607: 28409, + 58608: 28463, + 58609: 28470, + 58610: 28491, + 58611: 28532, + 58612: 28458, + 58613: 28425, + 58614: 28457, + 58615: 28553, + 58616: 28557, + 58617: 28556, + 58618: 28536, + 58619: 28530, + 58620: 28540, + 58621: 28538, + 58622: 28625, + 58688: 37642, + 58689: 37643, + 58690: 37644, + 58691: 37645, + 58692: 37646, + 58693: 37647, + 58694: 37648, + 58695: 37649, + 58696: 37650, + 58697: 37651, + 58698: 37652, + 58699: 37653, + 58700: 37654, + 58701: 37655, + 58702: 37656, + 58703: 37657, + 58704: 37658, + 58705: 37659, + 58706: 37660, + 58707: 37661, + 58708: 37662, + 58709: 37663, + 58710: 37664, + 58711: 37665, + 58712: 37666, + 58713: 37667, + 58714: 37668, + 58715: 37669, + 58716: 37670, + 58717: 37671, + 58718: 37672, + 58719: 37673, + 58720: 37674, + 58721: 37675, + 58722: 37676, + 58723: 37677, + 58724: 37678, + 58725: 37679, + 58726: 37680, + 58727: 37681, + 58728: 37682, + 58729: 37683, + 58730: 37684, + 58731: 37685, + 58732: 37686, + 58733: 37687, + 58734: 37688, + 58735: 37689, + 58736: 37690, + 58737: 37691, + 58738: 37692, + 58739: 37693, + 58740: 37695, + 58741: 37696, + 58742: 37697, + 58743: 37698, + 58744: 37699, + 58745: 37700, + 58746: 37701, + 58747: 37702, + 58748: 37703, + 58749: 37704, + 58750: 37705, + 58752: 37706, + 58753: 37707, + 58754: 37708, + 58755: 37709, + 58756: 37710, + 58757: 37711, + 58758: 37712, + 58759: 37713, + 58760: 37714, + 58761: 37715, + 58762: 37716, + 58763: 37717, + 58764: 37718, + 58765: 37719, + 58766: 37720, + 58767: 37721, + 58768: 37722, + 58769: 37723, + 58770: 37724, + 58771: 37725, + 58772: 37726, + 58773: 37727, + 58774: 37728, + 58775: 37729, + 58776: 37730, + 58777: 37731, + 58778: 37732, + 58779: 37733, + 58780: 37734, + 58781: 37735, + 58782: 37736, + 58783: 37737, + 58784: 37739, + 58785: 28617, + 58786: 28583, + 58787: 28601, + 58788: 28598, + 58789: 28610, + 58790: 28641, + 58791: 28654, + 58792: 28638, + 58793: 28640, + 58794: 28655, + 58795: 28698, + 58796: 28707, + 58797: 28699, + 58798: 28729, + 58799: 28725, + 58800: 28751, + 58801: 28766, + 58802: 23424, + 58803: 23428, + 58804: 23445, + 58805: 23443, + 58806: 23461, + 58807: 23480, + 58808: 29999, + 58809: 39582, + 58810: 25652, + 58811: 23524, + 58812: 23534, + 58813: 35120, + 58814: 23536, + 58815: 36423, + 58816: 35591, + 58817: 36790, + 58818: 36819, + 58819: 36821, + 58820: 36837, + 58821: 36846, + 58822: 36836, + 58823: 36841, + 58824: 36838, + 58825: 36851, + 58826: 36840, + 58827: 36869, + 58828: 36868, + 58829: 36875, + 58830: 36902, + 58831: 36881, + 58832: 36877, + 58833: 36886, + 58834: 36897, + 58835: 36917, + 58836: 36918, + 58837: 36909, + 58838: 36911, + 58839: 36932, + 58840: 36945, + 58841: 36946, + 58842: 36944, + 58843: 36968, + 58844: 36952, + 58845: 36962, + 58846: 36955, + 58847: 26297, + 58848: 36980, + 58849: 36989, + 58850: 36994, + 58851: 37000, + 58852: 36995, + 58853: 37003, + 58854: 24400, + 58855: 24407, + 58856: 24406, + 58857: 24408, + 58858: 23611, + 58859: 21675, + 58860: 23632, + 58861: 23641, + 58862: 23409, + 58863: 23651, + 58864: 23654, + 58865: 32700, + 58866: 24362, + 58867: 24361, + 58868: 24365, + 58869: 33396, + 58870: 24380, + 58871: 39739, + 58872: 23662, + 58873: 22913, + 58874: 22915, + 58875: 22925, + 58876: 22953, + 58877: 22954, + 58878: 22947, + 58944: 37740, + 58945: 37741, + 58946: 37742, + 58947: 37743, + 58948: 37744, + 58949: 37745, + 58950: 37746, + 58951: 37747, + 58952: 37748, + 58953: 37749, + 58954: 37750, + 58955: 37751, + 58956: 37752, + 58957: 37753, + 58958: 37754, + 58959: 37755, + 58960: 37756, + 58961: 37757, + 58962: 37758, + 58963: 37759, + 58964: 37760, + 58965: 37761, + 58966: 37762, + 58967: 37763, + 58968: 37764, + 58969: 37765, + 58970: 37766, + 58971: 37767, + 58972: 37768, + 58973: 37769, + 58974: 37770, + 58975: 37771, + 58976: 37772, + 58977: 37773, + 58978: 37774, + 58979: 37776, + 58980: 37777, + 58981: 37778, + 58982: 37779, + 58983: 37780, + 58984: 37781, + 58985: 37782, + 58986: 37783, + 58987: 37784, + 58988: 37785, + 58989: 37786, + 58990: 37787, + 58991: 37788, + 58992: 37789, + 58993: 37790, + 58994: 37791, + 58995: 37792, + 58996: 37793, + 58997: 37794, + 58998: 37795, + 58999: 37796, + 59000: 37797, + 59001: 37798, + 59002: 37799, + 59003: 37800, + 59004: 37801, + 59005: 37802, + 59006: 37803, + 59008: 37804, + 59009: 37805, + 59010: 37806, + 59011: 37807, + 59012: 37808, + 59013: 37809, + 59014: 37810, + 59015: 37811, + 59016: 37812, + 59017: 37813, + 59018: 37814, + 59019: 37815, + 59020: 37816, + 59021: 37817, + 59022: 37818, + 59023: 37819, + 59024: 37820, + 59025: 37821, + 59026: 37822, + 59027: 37823, + 59028: 37824, + 59029: 37825, + 59030: 37826, + 59031: 37827, + 59032: 37828, + 59033: 37829, + 59034: 37830, + 59035: 37831, + 59036: 37832, + 59037: 37833, + 59038: 37835, + 59039: 37836, + 59040: 37837, + 59041: 22935, + 59042: 22986, + 59043: 22955, + 59044: 22942, + 59045: 22948, + 59046: 22994, + 59047: 22962, + 59048: 22959, + 59049: 22999, + 59050: 22974, + 59051: 23045, + 59052: 23046, + 59053: 23005, + 59054: 23048, + 59055: 23011, + 59056: 23000, + 59057: 23033, + 59058: 23052, + 59059: 23049, + 59060: 23090, + 59061: 23092, + 59062: 23057, + 59063: 23075, + 59064: 23059, + 59065: 23104, + 59066: 23143, + 59067: 23114, + 59068: 23125, + 59069: 23100, + 59070: 23138, + 59071: 23157, + 59072: 33004, + 59073: 23210, + 59074: 23195, + 59075: 23159, + 59076: 23162, + 59077: 23230, + 59078: 23275, + 59079: 23218, + 59080: 23250, + 59081: 23252, + 59082: 23224, + 59083: 23264, + 59084: 23267, + 59085: 23281, + 59086: 23254, + 59087: 23270, + 59088: 23256, + 59089: 23260, + 59090: 23305, + 59091: 23319, + 59092: 23318, + 59093: 23346, + 59094: 23351, + 59095: 23360, + 59096: 23573, + 59097: 23580, + 59098: 23386, + 59099: 23397, + 59100: 23411, + 59101: 23377, + 59102: 23379, + 59103: 23394, + 59104: 39541, + 59105: 39543, + 59106: 39544, + 59107: 39546, + 59108: 39551, + 59109: 39549, + 59110: 39552, + 59111: 39553, + 59112: 39557, + 59113: 39560, + 59114: 39562, + 59115: 39568, + 59116: 39570, + 59117: 39571, + 59118: 39574, + 59119: 39576, + 59120: 39579, + 59121: 39580, + 59122: 39581, + 59123: 39583, + 59124: 39584, + 59125: 39586, + 59126: 39587, + 59127: 39589, + 59128: 39591, + 59129: 32415, + 59130: 32417, + 59131: 32419, + 59132: 32421, + 59133: 32424, + 59134: 32425, + 59200: 37838, + 59201: 37839, + 59202: 37840, + 59203: 37841, + 59204: 37842, + 59205: 37843, + 59206: 37844, + 59207: 37845, + 59208: 37847, + 59209: 37848, + 59210: 37849, + 59211: 37850, + 59212: 37851, + 59213: 37852, + 59214: 37853, + 59215: 37854, + 59216: 37855, + 59217: 37856, + 59218: 37857, + 59219: 37858, + 59220: 37859, + 59221: 37860, + 59222: 37861, + 59223: 37862, + 59224: 37863, + 59225: 37864, + 59226: 37865, + 59227: 37866, + 59228: 37867, + 59229: 37868, + 59230: 37869, + 59231: 37870, + 59232: 37871, + 59233: 37872, + 59234: 37873, + 59235: 37874, + 59236: 37875, + 59237: 37876, + 59238: 37877, + 59239: 37878, + 59240: 37879, + 59241: 37880, + 59242: 37881, + 59243: 37882, + 59244: 37883, + 59245: 37884, + 59246: 37885, + 59247: 37886, + 59248: 37887, + 59249: 37888, + 59250: 37889, + 59251: 37890, + 59252: 37891, + 59253: 37892, + 59254: 37893, + 59255: 37894, + 59256: 37895, + 59257: 37896, + 59258: 37897, + 59259: 37898, + 59260: 37899, + 59261: 37900, + 59262: 37901, + 59264: 37902, + 59265: 37903, + 59266: 37904, + 59267: 37905, + 59268: 37906, + 59269: 37907, + 59270: 37908, + 59271: 37909, + 59272: 37910, + 59273: 37911, + 59274: 37912, + 59275: 37913, + 59276: 37914, + 59277: 37915, + 59278: 37916, + 59279: 37917, + 59280: 37918, + 59281: 37919, + 59282: 37920, + 59283: 37921, + 59284: 37922, + 59285: 37923, + 59286: 37924, + 59287: 37925, + 59288: 37926, + 59289: 37927, + 59290: 37928, + 59291: 37929, + 59292: 37930, + 59293: 37931, + 59294: 37932, + 59295: 37933, + 59296: 37934, + 59297: 32429, + 59298: 32432, + 59299: 32446, + 59300: 32448, + 59301: 32449, + 59302: 32450, + 59303: 32457, + 59304: 32459, + 59305: 32460, + 59306: 32464, + 59307: 32468, + 59308: 32471, + 59309: 32475, + 59310: 32480, + 59311: 32481, + 59312: 32488, + 59313: 32491, + 59314: 32494, + 59315: 32495, + 59316: 32497, + 59317: 32498, + 59318: 32525, + 59319: 32502, + 59320: 32506, + 59321: 32507, + 59322: 32510, + 59323: 32513, + 59324: 32514, + 59325: 32515, + 59326: 32519, + 59327: 32520, + 59328: 32523, + 59329: 32524, + 59330: 32527, + 59331: 32529, + 59332: 32530, + 59333: 32535, + 59334: 32537, + 59335: 32540, + 59336: 32539, + 59337: 32543, + 59338: 32545, + 59339: 32546, + 59340: 32547, + 59341: 32548, + 59342: 32549, + 59343: 32550, + 59344: 32551, + 59345: 32554, + 59346: 32555, + 59347: 32556, + 59348: 32557, + 59349: 32559, + 59350: 32560, + 59351: 32561, + 59352: 32562, + 59353: 32563, + 59354: 32565, + 59355: 24186, + 59356: 30079, + 59357: 24027, + 59358: 30014, + 59359: 37013, + 59360: 29582, + 59361: 29585, + 59362: 29614, + 59363: 29602, + 59364: 29599, + 59365: 29647, + 59366: 29634, + 59367: 29649, + 59368: 29623, + 59369: 29619, + 59370: 29632, + 59371: 29641, + 59372: 29640, + 59373: 29669, + 59374: 29657, + 59375: 39036, + 59376: 29706, + 59377: 29673, + 59378: 29671, + 59379: 29662, + 59380: 29626, + 59381: 29682, + 59382: 29711, + 59383: 29738, + 59384: 29787, + 59385: 29734, + 59386: 29733, + 59387: 29736, + 59388: 29744, + 59389: 29742, + 59390: 29740, + 59456: 37935, + 59457: 37936, + 59458: 37937, + 59459: 37938, + 59460: 37939, + 59461: 37940, + 59462: 37941, + 59463: 37942, + 59464: 37943, + 59465: 37944, + 59466: 37945, + 59467: 37946, + 59468: 37947, + 59469: 37948, + 59470: 37949, + 59471: 37951, + 59472: 37952, + 59473: 37953, + 59474: 37954, + 59475: 37955, + 59476: 37956, + 59477: 37957, + 59478: 37958, + 59479: 37959, + 59480: 37960, + 59481: 37961, + 59482: 37962, + 59483: 37963, + 59484: 37964, + 59485: 37965, + 59486: 37966, + 59487: 37967, + 59488: 37968, + 59489: 37969, + 59490: 37970, + 59491: 37971, + 59492: 37972, + 59493: 37973, + 59494: 37974, + 59495: 37975, + 59496: 37976, + 59497: 37977, + 59498: 37978, + 59499: 37979, + 59500: 37980, + 59501: 37981, + 59502: 37982, + 59503: 37983, + 59504: 37984, + 59505: 37985, + 59506: 37986, + 59507: 37987, + 59508: 37988, + 59509: 37989, + 59510: 37990, + 59511: 37991, + 59512: 37992, + 59513: 37993, + 59514: 37994, + 59515: 37996, + 59516: 37997, + 59517: 37998, + 59518: 37999, + 59520: 38000, + 59521: 38001, + 59522: 38002, + 59523: 38003, + 59524: 38004, + 59525: 38005, + 59526: 38006, + 59527: 38007, + 59528: 38008, + 59529: 38009, + 59530: 38010, + 59531: 38011, + 59532: 38012, + 59533: 38013, + 59534: 38014, + 59535: 38015, + 59536: 38016, + 59537: 38017, + 59538: 38018, + 59539: 38019, + 59540: 38020, + 59541: 38033, + 59542: 38038, + 59543: 38040, + 59544: 38087, + 59545: 38095, + 59546: 38099, + 59547: 38100, + 59548: 38106, + 59549: 38118, + 59550: 38139, + 59551: 38172, + 59552: 38176, + 59553: 29723, + 59554: 29722, + 59555: 29761, + 59556: 29788, + 59557: 29783, + 59558: 29781, + 59559: 29785, + 59560: 29815, + 59561: 29805, + 59562: 29822, + 59563: 29852, + 59564: 29838, + 59565: 29824, + 59566: 29825, + 59567: 29831, + 59568: 29835, + 59569: 29854, + 59570: 29864, + 59571: 29865, + 59572: 29840, + 59573: 29863, + 59574: 29906, + 59575: 29882, + 59576: 38890, + 59577: 38891, + 59578: 38892, + 59579: 26444, + 59580: 26451, + 59581: 26462, + 59582: 26440, + 59583: 26473, + 59584: 26533, + 59585: 26503, + 59586: 26474, + 59587: 26483, + 59588: 26520, + 59589: 26535, + 59590: 26485, + 59591: 26536, + 59592: 26526, + 59593: 26541, + 59594: 26507, + 59595: 26487, + 59596: 26492, + 59597: 26608, + 59598: 26633, + 59599: 26584, + 59600: 26634, + 59601: 26601, + 59602: 26544, + 59603: 26636, + 59604: 26585, + 59605: 26549, + 59606: 26586, + 59607: 26547, + 59608: 26589, + 59609: 26624, + 59610: 26563, + 59611: 26552, + 59612: 26594, + 59613: 26638, + 59614: 26561, + 59615: 26621, + 59616: 26674, + 59617: 26675, + 59618: 26720, + 59619: 26721, + 59620: 26702, + 59621: 26722, + 59622: 26692, + 59623: 26724, + 59624: 26755, + 59625: 26653, + 59626: 26709, + 59627: 26726, + 59628: 26689, + 59629: 26727, + 59630: 26688, + 59631: 26686, + 59632: 26698, + 59633: 26697, + 59634: 26665, + 59635: 26805, + 59636: 26767, + 59637: 26740, + 59638: 26743, + 59639: 26771, + 59640: 26731, + 59641: 26818, + 59642: 26990, + 59643: 26876, + 59644: 26911, + 59645: 26912, + 59646: 26873, + 59712: 38183, + 59713: 38195, + 59714: 38205, + 59715: 38211, + 59716: 38216, + 59717: 38219, + 59718: 38229, + 59719: 38234, + 59720: 38240, + 59721: 38254, + 59722: 38260, + 59723: 38261, + 59724: 38263, + 59725: 38264, + 59726: 38265, + 59727: 38266, + 59728: 38267, + 59729: 38268, + 59730: 38269, + 59731: 38270, + 59732: 38272, + 59733: 38273, + 59734: 38274, + 59735: 38275, + 59736: 38276, + 59737: 38277, + 59738: 38278, + 59739: 38279, + 59740: 38280, + 59741: 38281, + 59742: 38282, + 59743: 38283, + 59744: 38284, + 59745: 38285, + 59746: 38286, + 59747: 38287, + 59748: 38288, + 59749: 38289, + 59750: 38290, + 59751: 38291, + 59752: 38292, + 59753: 38293, + 59754: 38294, + 59755: 38295, + 59756: 38296, + 59757: 38297, + 59758: 38298, + 59759: 38299, + 59760: 38300, + 59761: 38301, + 59762: 38302, + 59763: 38303, + 59764: 38304, + 59765: 38305, + 59766: 38306, + 59767: 38307, + 59768: 38308, + 59769: 38309, + 59770: 38310, + 59771: 38311, + 59772: 38312, + 59773: 38313, + 59774: 38314, + 59776: 38315, + 59777: 38316, + 59778: 38317, + 59779: 38318, + 59780: 38319, + 59781: 38320, + 59782: 38321, + 59783: 38322, + 59784: 38323, + 59785: 38324, + 59786: 38325, + 59787: 38326, + 59788: 38327, + 59789: 38328, + 59790: 38329, + 59791: 38330, + 59792: 38331, + 59793: 38332, + 59794: 38333, + 59795: 38334, + 59796: 38335, + 59797: 38336, + 59798: 38337, + 59799: 38338, + 59800: 38339, + 59801: 38340, + 59802: 38341, + 59803: 38342, + 59804: 38343, + 59805: 38344, + 59806: 38345, + 59807: 38346, + 59808: 38347, + 59809: 26916, + 59810: 26864, + 59811: 26891, + 59812: 26881, + 59813: 26967, + 59814: 26851, + 59815: 26896, + 59816: 26993, + 59817: 26937, + 59818: 26976, + 59819: 26946, + 59820: 26973, + 59821: 27012, + 59822: 26987, + 59823: 27008, + 59824: 27032, + 59825: 27000, + 59826: 26932, + 59827: 27084, + 59828: 27015, + 59829: 27016, + 59830: 27086, + 59831: 27017, + 59832: 26982, + 59833: 26979, + 59834: 27001, + 59835: 27035, + 59836: 27047, + 59837: 27067, + 59838: 27051, + 59839: 27053, + 59840: 27092, + 59841: 27057, + 59842: 27073, + 59843: 27082, + 59844: 27103, + 59845: 27029, + 59846: 27104, + 59847: 27021, + 59848: 27135, + 59849: 27183, + 59850: 27117, + 59851: 27159, + 59852: 27160, + 59853: 27237, + 59854: 27122, + 59855: 27204, + 59856: 27198, + 59857: 27296, + 59858: 27216, + 59859: 27227, + 59860: 27189, + 59861: 27278, + 59862: 27257, + 59863: 27197, + 59864: 27176, + 59865: 27224, + 59866: 27260, + 59867: 27281, + 59868: 27280, + 59869: 27305, + 59870: 27287, + 59871: 27307, + 59872: 29495, + 59873: 29522, + 59874: 27521, + 59875: 27522, + 59876: 27527, + 59877: 27524, + 59878: 27538, + 59879: 27539, + 59880: 27533, + 59881: 27546, + 59882: 27547, + 59883: 27553, + 59884: 27562, + 59885: 36715, + 59886: 36717, + 59887: 36721, + 59888: 36722, + 59889: 36723, + 59890: 36725, + 59891: 36726, + 59892: 36728, + 59893: 36727, + 59894: 36729, + 59895: 36730, + 59896: 36732, + 59897: 36734, + 59898: 36737, + 59899: 36738, + 59900: 36740, + 59901: 36743, + 59902: 36747, + 59968: 38348, + 59969: 38349, + 59970: 38350, + 59971: 38351, + 59972: 38352, + 59973: 38353, + 59974: 38354, + 59975: 38355, + 59976: 38356, + 59977: 38357, + 59978: 38358, + 59979: 38359, + 59980: 38360, + 59981: 38361, + 59982: 38362, + 59983: 38363, + 59984: 38364, + 59985: 38365, + 59986: 38366, + 59987: 38367, + 59988: 38368, + 59989: 38369, + 59990: 38370, + 59991: 38371, + 59992: 38372, + 59993: 38373, + 59994: 38374, + 59995: 38375, + 59996: 38380, + 59997: 38399, + 59998: 38407, + 59999: 38419, + 60000: 38424, + 60001: 38427, + 60002: 38430, + 60003: 38432, + 60004: 38435, + 60005: 38436, + 60006: 38437, + 60007: 38438, + 60008: 38439, + 60009: 38440, + 60010: 38441, + 60011: 38443, + 60012: 38444, + 60013: 38445, + 60014: 38447, + 60015: 38448, + 60016: 38455, + 60017: 38456, + 60018: 38457, + 60019: 38458, + 60020: 38462, + 60021: 38465, + 60022: 38467, + 60023: 38474, + 60024: 38478, + 60025: 38479, + 60026: 38481, + 60027: 38482, + 60028: 38483, + 60029: 38486, + 60030: 38487, + 60032: 38488, + 60033: 38489, + 60034: 38490, + 60035: 38492, + 60036: 38493, + 60037: 38494, + 60038: 38496, + 60039: 38499, + 60040: 38501, + 60041: 38502, + 60042: 38507, + 60043: 38509, + 60044: 38510, + 60045: 38511, + 60046: 38512, + 60047: 38513, + 60048: 38515, + 60049: 38520, + 60050: 38521, + 60051: 38522, + 60052: 38523, + 60053: 38524, + 60054: 38525, + 60055: 38526, + 60056: 38527, + 60057: 38528, + 60058: 38529, + 60059: 38530, + 60060: 38531, + 60061: 38532, + 60062: 38535, + 60063: 38537, + 60064: 38538, + 60065: 36749, + 60066: 36750, + 60067: 36751, + 60068: 36760, + 60069: 36762, + 60070: 36558, + 60071: 25099, + 60072: 25111, + 60073: 25115, + 60074: 25119, + 60075: 25122, + 60076: 25121, + 60077: 25125, + 60078: 25124, + 60079: 25132, + 60080: 33255, + 60081: 29935, + 60082: 29940, + 60083: 29951, + 60084: 29967, + 60085: 29969, + 60086: 29971, + 60087: 25908, + 60088: 26094, + 60089: 26095, + 60090: 26096, + 60091: 26122, + 60092: 26137, + 60093: 26482, + 60094: 26115, + 60095: 26133, + 60096: 26112, + 60097: 28805, + 60098: 26359, + 60099: 26141, + 60100: 26164, + 60101: 26161, + 60102: 26166, + 60103: 26165, + 60104: 32774, + 60105: 26207, + 60106: 26196, + 60107: 26177, + 60108: 26191, + 60109: 26198, + 60110: 26209, + 60111: 26199, + 60112: 26231, + 60113: 26244, + 60114: 26252, + 60115: 26279, + 60116: 26269, + 60117: 26302, + 60118: 26331, + 60119: 26332, + 60120: 26342, + 60121: 26345, + 60122: 36146, + 60123: 36147, + 60124: 36150, + 60125: 36155, + 60126: 36157, + 60127: 36160, + 60128: 36165, + 60129: 36166, + 60130: 36168, + 60131: 36169, + 60132: 36167, + 60133: 36173, + 60134: 36181, + 60135: 36185, + 60136: 35271, + 60137: 35274, + 60138: 35275, + 60139: 35276, + 60140: 35278, + 60141: 35279, + 60142: 35280, + 60143: 35281, + 60144: 29294, + 60145: 29343, + 60146: 29277, + 60147: 29286, + 60148: 29295, + 60149: 29310, + 60150: 29311, + 60151: 29316, + 60152: 29323, + 60153: 29325, + 60154: 29327, + 60155: 29330, + 60156: 25352, + 60157: 25394, + 60158: 25520, + 60224: 38540, + 60225: 38542, + 60226: 38545, + 60227: 38546, + 60228: 38547, + 60229: 38549, + 60230: 38550, + 60231: 38554, + 60232: 38555, + 60233: 38557, + 60234: 38558, + 60235: 38559, + 60236: 38560, + 60237: 38561, + 60238: 38562, + 60239: 38563, + 60240: 38564, + 60241: 38565, + 60242: 38566, + 60243: 38568, + 60244: 38569, + 60245: 38570, + 60246: 38571, + 60247: 38572, + 60248: 38573, + 60249: 38574, + 60250: 38575, + 60251: 38577, + 60252: 38578, + 60253: 38580, + 60254: 38581, + 60255: 38583, + 60256: 38584, + 60257: 38586, + 60258: 38587, + 60259: 38591, + 60260: 38594, + 60261: 38595, + 60262: 38600, + 60263: 38602, + 60264: 38603, + 60265: 38608, + 60266: 38609, + 60267: 38611, + 60268: 38612, + 60269: 38614, + 60270: 38615, + 60271: 38616, + 60272: 38617, + 60273: 38618, + 60274: 38619, + 60275: 38620, + 60276: 38621, + 60277: 38622, + 60278: 38623, + 60279: 38625, + 60280: 38626, + 60281: 38627, + 60282: 38628, + 60283: 38629, + 60284: 38630, + 60285: 38631, + 60286: 38635, + 60288: 38636, + 60289: 38637, + 60290: 38638, + 60291: 38640, + 60292: 38641, + 60293: 38642, + 60294: 38644, + 60295: 38645, + 60296: 38648, + 60297: 38650, + 60298: 38651, + 60299: 38652, + 60300: 38653, + 60301: 38655, + 60302: 38658, + 60303: 38659, + 60304: 38661, + 60305: 38666, + 60306: 38667, + 60307: 38668, + 60308: 38672, + 60309: 38673, + 60310: 38674, + 60311: 38676, + 60312: 38677, + 60313: 38679, + 60314: 38680, + 60315: 38681, + 60316: 38682, + 60317: 38683, + 60318: 38685, + 60319: 38687, + 60320: 38688, + 60321: 25663, + 60322: 25816, + 60323: 32772, + 60324: 27626, + 60325: 27635, + 60326: 27645, + 60327: 27637, + 60328: 27641, + 60329: 27653, + 60330: 27655, + 60331: 27654, + 60332: 27661, + 60333: 27669, + 60334: 27672, + 60335: 27673, + 60336: 27674, + 60337: 27681, + 60338: 27689, + 60339: 27684, + 60340: 27690, + 60341: 27698, + 60342: 25909, + 60343: 25941, + 60344: 25963, + 60345: 29261, + 60346: 29266, + 60347: 29270, + 60348: 29232, + 60349: 34402, + 60350: 21014, + 60351: 32927, + 60352: 32924, + 60353: 32915, + 60354: 32956, + 60355: 26378, + 60356: 32957, + 60357: 32945, + 60358: 32939, + 60359: 32941, + 60360: 32948, + 60361: 32951, + 60362: 32999, + 60363: 33000, + 60364: 33001, + 60365: 33002, + 60366: 32987, + 60367: 32962, + 60368: 32964, + 60369: 32985, + 60370: 32973, + 60371: 32983, + 60372: 26384, + 60373: 32989, + 60374: 33003, + 60375: 33009, + 60376: 33012, + 60377: 33005, + 60378: 33037, + 60379: 33038, + 60380: 33010, + 60381: 33020, + 60382: 26389, + 60383: 33042, + 60384: 35930, + 60385: 33078, + 60386: 33054, + 60387: 33068, + 60388: 33048, + 60389: 33074, + 60390: 33096, + 60391: 33100, + 60392: 33107, + 60393: 33140, + 60394: 33113, + 60395: 33114, + 60396: 33137, + 60397: 33120, + 60398: 33129, + 60399: 33148, + 60400: 33149, + 60401: 33133, + 60402: 33127, + 60403: 22605, + 60404: 23221, + 60405: 33160, + 60406: 33154, + 60407: 33169, + 60408: 28373, + 60409: 33187, + 60410: 33194, + 60411: 33228, + 60412: 26406, + 60413: 33226, + 60414: 33211, + 60480: 38689, + 60481: 38690, + 60482: 38691, + 60483: 38692, + 60484: 38693, + 60485: 38694, + 60486: 38695, + 60487: 38696, + 60488: 38697, + 60489: 38699, + 60490: 38700, + 60491: 38702, + 60492: 38703, + 60493: 38705, + 60494: 38707, + 60495: 38708, + 60496: 38709, + 60497: 38710, + 60498: 38711, + 60499: 38714, + 60500: 38715, + 60501: 38716, + 60502: 38717, + 60503: 38719, + 60504: 38720, + 60505: 38721, + 60506: 38722, + 60507: 38723, + 60508: 38724, + 60509: 38725, + 60510: 38726, + 60511: 38727, + 60512: 38728, + 60513: 38729, + 60514: 38730, + 60515: 38731, + 60516: 38732, + 60517: 38733, + 60518: 38734, + 60519: 38735, + 60520: 38736, + 60521: 38737, + 60522: 38740, + 60523: 38741, + 60524: 38743, + 60525: 38744, + 60526: 38746, + 60527: 38748, + 60528: 38749, + 60529: 38751, + 60530: 38755, + 60531: 38756, + 60532: 38758, + 60533: 38759, + 60534: 38760, + 60535: 38762, + 60536: 38763, + 60537: 38764, + 60538: 38765, + 60539: 38766, + 60540: 38767, + 60541: 38768, + 60542: 38769, + 60544: 38770, + 60545: 38773, + 60546: 38775, + 60547: 38776, + 60548: 38777, + 60549: 38778, + 60550: 38779, + 60551: 38781, + 60552: 38782, + 60553: 38783, + 60554: 38784, + 60555: 38785, + 60556: 38786, + 60557: 38787, + 60558: 38788, + 60559: 38790, + 60560: 38791, + 60561: 38792, + 60562: 38793, + 60563: 38794, + 60564: 38796, + 60565: 38798, + 60566: 38799, + 60567: 38800, + 60568: 38803, + 60569: 38805, + 60570: 38806, + 60571: 38807, + 60572: 38809, + 60573: 38810, + 60574: 38811, + 60575: 38812, + 60576: 38813, + 60577: 33217, + 60578: 33190, + 60579: 27428, + 60580: 27447, + 60581: 27449, + 60582: 27459, + 60583: 27462, + 60584: 27481, + 60585: 39121, + 60586: 39122, + 60587: 39123, + 60588: 39125, + 60589: 39129, + 60590: 39130, + 60591: 27571, + 60592: 24384, + 60593: 27586, + 60594: 35315, + 60595: 26000, + 60596: 40785, + 60597: 26003, + 60598: 26044, + 60599: 26054, + 60600: 26052, + 60601: 26051, + 60602: 26060, + 60603: 26062, + 60604: 26066, + 60605: 26070, + 60606: 28800, + 60607: 28828, + 60608: 28822, + 60609: 28829, + 60610: 28859, + 60611: 28864, + 60612: 28855, + 60613: 28843, + 60614: 28849, + 60615: 28904, + 60616: 28874, + 60617: 28944, + 60618: 28947, + 60619: 28950, + 60620: 28975, + 60621: 28977, + 60622: 29043, + 60623: 29020, + 60624: 29032, + 60625: 28997, + 60626: 29042, + 60627: 29002, + 60628: 29048, + 60629: 29050, + 60630: 29080, + 60631: 29107, + 60632: 29109, + 60633: 29096, + 60634: 29088, + 60635: 29152, + 60636: 29140, + 60637: 29159, + 60638: 29177, + 60639: 29213, + 60640: 29224, + 60641: 28780, + 60642: 28952, + 60643: 29030, + 60644: 29113, + 60645: 25150, + 60646: 25149, + 60647: 25155, + 60648: 25160, + 60649: 25161, + 60650: 31035, + 60651: 31040, + 60652: 31046, + 60653: 31049, + 60654: 31067, + 60655: 31068, + 60656: 31059, + 60657: 31066, + 60658: 31074, + 60659: 31063, + 60660: 31072, + 60661: 31087, + 60662: 31079, + 60663: 31098, + 60664: 31109, + 60665: 31114, + 60666: 31130, + 60667: 31143, + 60668: 31155, + 60669: 24529, + 60670: 24528, + 60736: 38814, + 60737: 38815, + 60738: 38817, + 60739: 38818, + 60740: 38820, + 60741: 38821, + 60742: 38822, + 60743: 38823, + 60744: 38824, + 60745: 38825, + 60746: 38826, + 60747: 38828, + 60748: 38830, + 60749: 38832, + 60750: 38833, + 60751: 38835, + 60752: 38837, + 60753: 38838, + 60754: 38839, + 60755: 38840, + 60756: 38841, + 60757: 38842, + 60758: 38843, + 60759: 38844, + 60760: 38845, + 60761: 38846, + 60762: 38847, + 60763: 38848, + 60764: 38849, + 60765: 38850, + 60766: 38851, + 60767: 38852, + 60768: 38853, + 60769: 38854, + 60770: 38855, + 60771: 38856, + 60772: 38857, + 60773: 38858, + 60774: 38859, + 60775: 38860, + 60776: 38861, + 60777: 38862, + 60778: 38863, + 60779: 38864, + 60780: 38865, + 60781: 38866, + 60782: 38867, + 60783: 38868, + 60784: 38869, + 60785: 38870, + 60786: 38871, + 60787: 38872, + 60788: 38873, + 60789: 38874, + 60790: 38875, + 60791: 38876, + 60792: 38877, + 60793: 38878, + 60794: 38879, + 60795: 38880, + 60796: 38881, + 60797: 38882, + 60798: 38883, + 60800: 38884, + 60801: 38885, + 60802: 38888, + 60803: 38894, + 60804: 38895, + 60805: 38896, + 60806: 38897, + 60807: 38898, + 60808: 38900, + 60809: 38903, + 60810: 38904, + 60811: 38905, + 60812: 38906, + 60813: 38907, + 60814: 38908, + 60815: 38909, + 60816: 38910, + 60817: 38911, + 60818: 38912, + 60819: 38913, + 60820: 38914, + 60821: 38915, + 60822: 38916, + 60823: 38917, + 60824: 38918, + 60825: 38919, + 60826: 38920, + 60827: 38921, + 60828: 38922, + 60829: 38923, + 60830: 38924, + 60831: 38925, + 60832: 38926, + 60833: 24636, + 60834: 24669, + 60835: 24666, + 60836: 24679, + 60837: 24641, + 60838: 24665, + 60839: 24675, + 60840: 24747, + 60841: 24838, + 60842: 24845, + 60843: 24925, + 60844: 25001, + 60845: 24989, + 60846: 25035, + 60847: 25041, + 60848: 25094, + 60849: 32896, + 60850: 32895, + 60851: 27795, + 60852: 27894, + 60853: 28156, + 60854: 30710, + 60855: 30712, + 60856: 30720, + 60857: 30729, + 60858: 30743, + 60859: 30744, + 60860: 30737, + 60861: 26027, + 60862: 30765, + 60863: 30748, + 60864: 30749, + 60865: 30777, + 60866: 30778, + 60867: 30779, + 60868: 30751, + 60869: 30780, + 60870: 30757, + 60871: 30764, + 60872: 30755, + 60873: 30761, + 60874: 30798, + 60875: 30829, + 60876: 30806, + 60877: 30807, + 60878: 30758, + 60879: 30800, + 60880: 30791, + 60881: 30796, + 60882: 30826, + 60883: 30875, + 60884: 30867, + 60885: 30874, + 60886: 30855, + 60887: 30876, + 60888: 30881, + 60889: 30883, + 60890: 30898, + 60891: 30905, + 60892: 30885, + 60893: 30932, + 60894: 30937, + 60895: 30921, + 60896: 30956, + 60897: 30962, + 60898: 30981, + 60899: 30964, + 60900: 30995, + 60901: 31012, + 60902: 31006, + 60903: 31028, + 60904: 40859, + 60905: 40697, + 60906: 40699, + 60907: 40700, + 60908: 30449, + 60909: 30468, + 60910: 30477, + 60911: 30457, + 60912: 30471, + 60913: 30472, + 60914: 30490, + 60915: 30498, + 60916: 30489, + 60917: 30509, + 60918: 30502, + 60919: 30517, + 60920: 30520, + 60921: 30544, + 60922: 30545, + 60923: 30535, + 60924: 30531, + 60925: 30554, + 60926: 30568, + 60992: 38927, + 60993: 38928, + 60994: 38929, + 60995: 38930, + 60996: 38931, + 60997: 38932, + 60998: 38933, + 60999: 38934, + 61000: 38935, + 61001: 38936, + 61002: 38937, + 61003: 38938, + 61004: 38939, + 61005: 38940, + 61006: 38941, + 61007: 38942, + 61008: 38943, + 61009: 38944, + 61010: 38945, + 61011: 38946, + 61012: 38947, + 61013: 38948, + 61014: 38949, + 61015: 38950, + 61016: 38951, + 61017: 38952, + 61018: 38953, + 61019: 38954, + 61020: 38955, + 61021: 38956, + 61022: 38957, + 61023: 38958, + 61024: 38959, + 61025: 38960, + 61026: 38961, + 61027: 38962, + 61028: 38963, + 61029: 38964, + 61030: 38965, + 61031: 38966, + 61032: 38967, + 61033: 38968, + 61034: 38969, + 61035: 38970, + 61036: 38971, + 61037: 38972, + 61038: 38973, + 61039: 38974, + 61040: 38975, + 61041: 38976, + 61042: 38977, + 61043: 38978, + 61044: 38979, + 61045: 38980, + 61046: 38981, + 61047: 38982, + 61048: 38983, + 61049: 38984, + 61050: 38985, + 61051: 38986, + 61052: 38987, + 61053: 38988, + 61054: 38989, + 61056: 38990, + 61057: 38991, + 61058: 38992, + 61059: 38993, + 61060: 38994, + 61061: 38995, + 61062: 38996, + 61063: 38997, + 61064: 38998, + 61065: 38999, + 61066: 39000, + 61067: 39001, + 61068: 39002, + 61069: 39003, + 61070: 39004, + 61071: 39005, + 61072: 39006, + 61073: 39007, + 61074: 39008, + 61075: 39009, + 61076: 39010, + 61077: 39011, + 61078: 39012, + 61079: 39013, + 61080: 39014, + 61081: 39015, + 61082: 39016, + 61083: 39017, + 61084: 39018, + 61085: 39019, + 61086: 39020, + 61087: 39021, + 61088: 39022, + 61089: 30562, + 61090: 30565, + 61091: 30591, + 61092: 30605, + 61093: 30589, + 61094: 30592, + 61095: 30604, + 61096: 30609, + 61097: 30623, + 61098: 30624, + 61099: 30640, + 61100: 30645, + 61101: 30653, + 61102: 30010, + 61103: 30016, + 61104: 30030, + 61105: 30027, + 61106: 30024, + 61107: 30043, + 61108: 30066, + 61109: 30073, + 61110: 30083, + 61111: 32600, + 61112: 32609, + 61113: 32607, + 61114: 35400, + 61115: 32616, + 61116: 32628, + 61117: 32625, + 61118: 32633, + 61119: 32641, + 61120: 32638, + 61121: 30413, + 61122: 30437, + 61123: 34866, + 61124: 38021, + 61125: 38022, + 61126: 38023, + 61127: 38027, + 61128: 38026, + 61129: 38028, + 61130: 38029, + 61131: 38031, + 61132: 38032, + 61133: 38036, + 61134: 38039, + 61135: 38037, + 61136: 38042, + 61137: 38043, + 61138: 38044, + 61139: 38051, + 61140: 38052, + 61141: 38059, + 61142: 38058, + 61143: 38061, + 61144: 38060, + 61145: 38063, + 61146: 38064, + 61147: 38066, + 61148: 38068, + 61149: 38070, + 61150: 38071, + 61151: 38072, + 61152: 38073, + 61153: 38074, + 61154: 38076, + 61155: 38077, + 61156: 38079, + 61157: 38084, + 61158: 38088, + 61159: 38089, + 61160: 38090, + 61161: 38091, + 61162: 38092, + 61163: 38093, + 61164: 38094, + 61165: 38096, + 61166: 38097, + 61167: 38098, + 61168: 38101, + 61169: 38102, + 61170: 38103, + 61171: 38105, + 61172: 38104, + 61173: 38107, + 61174: 38110, + 61175: 38111, + 61176: 38112, + 61177: 38114, + 61178: 38116, + 61179: 38117, + 61180: 38119, + 61181: 38120, + 61182: 38122, + 61248: 39023, + 61249: 39024, + 61250: 39025, + 61251: 39026, + 61252: 39027, + 61253: 39028, + 61254: 39051, + 61255: 39054, + 61256: 39058, + 61257: 39061, + 61258: 39065, + 61259: 39075, + 61260: 39080, + 61261: 39081, + 61262: 39082, + 61263: 39083, + 61264: 39084, + 61265: 39085, + 61266: 39086, + 61267: 39087, + 61268: 39088, + 61269: 39089, + 61270: 39090, + 61271: 39091, + 61272: 39092, + 61273: 39093, + 61274: 39094, + 61275: 39095, + 61276: 39096, + 61277: 39097, + 61278: 39098, + 61279: 39099, + 61280: 39100, + 61281: 39101, + 61282: 39102, + 61283: 39103, + 61284: 39104, + 61285: 39105, + 61286: 39106, + 61287: 39107, + 61288: 39108, + 61289: 39109, + 61290: 39110, + 61291: 39111, + 61292: 39112, + 61293: 39113, + 61294: 39114, + 61295: 39115, + 61296: 39116, + 61297: 39117, + 61298: 39119, + 61299: 39120, + 61300: 39124, + 61301: 39126, + 61302: 39127, + 61303: 39131, + 61304: 39132, + 61305: 39133, + 61306: 39136, + 61307: 39137, + 61308: 39138, + 61309: 39139, + 61310: 39140, + 61312: 39141, + 61313: 39142, + 61314: 39145, + 61315: 39146, + 61316: 39147, + 61317: 39148, + 61318: 39149, + 61319: 39150, + 61320: 39151, + 61321: 39152, + 61322: 39153, + 61323: 39154, + 61324: 39155, + 61325: 39156, + 61326: 39157, + 61327: 39158, + 61328: 39159, + 61329: 39160, + 61330: 39161, + 61331: 39162, + 61332: 39163, + 61333: 39164, + 61334: 39165, + 61335: 39166, + 61336: 39167, + 61337: 39168, + 61338: 39169, + 61339: 39170, + 61340: 39171, + 61341: 39172, + 61342: 39173, + 61343: 39174, + 61344: 39175, + 61345: 38121, + 61346: 38123, + 61347: 38126, + 61348: 38127, + 61349: 38131, + 61350: 38132, + 61351: 38133, + 61352: 38135, + 61353: 38137, + 61354: 38140, + 61355: 38141, + 61356: 38143, + 61357: 38147, + 61358: 38146, + 61359: 38150, + 61360: 38151, + 61361: 38153, + 61362: 38154, + 61363: 38157, + 61364: 38158, + 61365: 38159, + 61366: 38162, + 61367: 38163, + 61368: 38164, + 61369: 38165, + 61370: 38166, + 61371: 38168, + 61372: 38171, + 61373: 38173, + 61374: 38174, + 61375: 38175, + 61376: 38178, + 61377: 38186, + 61378: 38187, + 61379: 38185, + 61380: 38188, + 61381: 38193, + 61382: 38194, + 61383: 38196, + 61384: 38198, + 61385: 38199, + 61386: 38200, + 61387: 38204, + 61388: 38206, + 61389: 38207, + 61390: 38210, + 61391: 38197, + 61392: 38212, + 61393: 38213, + 61394: 38214, + 61395: 38217, + 61396: 38220, + 61397: 38222, + 61398: 38223, + 61399: 38226, + 61400: 38227, + 61401: 38228, + 61402: 38230, + 61403: 38231, + 61404: 38232, + 61405: 38233, + 61406: 38235, + 61407: 38238, + 61408: 38239, + 61409: 38237, + 61410: 38241, + 61411: 38242, + 61412: 38244, + 61413: 38245, + 61414: 38246, + 61415: 38247, + 61416: 38248, + 61417: 38249, + 61418: 38250, + 61419: 38251, + 61420: 38252, + 61421: 38255, + 61422: 38257, + 61423: 38258, + 61424: 38259, + 61425: 38202, + 61426: 30695, + 61427: 30700, + 61428: 38601, + 61429: 31189, + 61430: 31213, + 61431: 31203, + 61432: 31211, + 61433: 31238, + 61434: 23879, + 61435: 31235, + 61436: 31234, + 61437: 31262, + 61438: 31252, + 61504: 39176, + 61505: 39177, + 61506: 39178, + 61507: 39179, + 61508: 39180, + 61509: 39182, + 61510: 39183, + 61511: 39185, + 61512: 39186, + 61513: 39187, + 61514: 39188, + 61515: 39189, + 61516: 39190, + 61517: 39191, + 61518: 39192, + 61519: 39193, + 61520: 39194, + 61521: 39195, + 61522: 39196, + 61523: 39197, + 61524: 39198, + 61525: 39199, + 61526: 39200, + 61527: 39201, + 61528: 39202, + 61529: 39203, + 61530: 39204, + 61531: 39205, + 61532: 39206, + 61533: 39207, + 61534: 39208, + 61535: 39209, + 61536: 39210, + 61537: 39211, + 61538: 39212, + 61539: 39213, + 61540: 39215, + 61541: 39216, + 61542: 39217, + 61543: 39218, + 61544: 39219, + 61545: 39220, + 61546: 39221, + 61547: 39222, + 61548: 39223, + 61549: 39224, + 61550: 39225, + 61551: 39226, + 61552: 39227, + 61553: 39228, + 61554: 39229, + 61555: 39230, + 61556: 39231, + 61557: 39232, + 61558: 39233, + 61559: 39234, + 61560: 39235, + 61561: 39236, + 61562: 39237, + 61563: 39238, + 61564: 39239, + 61565: 39240, + 61566: 39241, + 61568: 39242, + 61569: 39243, + 61570: 39244, + 61571: 39245, + 61572: 39246, + 61573: 39247, + 61574: 39248, + 61575: 39249, + 61576: 39250, + 61577: 39251, + 61578: 39254, + 61579: 39255, + 61580: 39256, + 61581: 39257, + 61582: 39258, + 61583: 39259, + 61584: 39260, + 61585: 39261, + 61586: 39262, + 61587: 39263, + 61588: 39264, + 61589: 39265, + 61590: 39266, + 61591: 39268, + 61592: 39270, + 61593: 39283, + 61594: 39288, + 61595: 39289, + 61596: 39291, + 61597: 39294, + 61598: 39298, + 61599: 39299, + 61600: 39305, + 61601: 31289, + 61602: 31287, + 61603: 31313, + 61604: 40655, + 61605: 39333, + 61606: 31344, + 61607: 30344, + 61608: 30350, + 61609: 30355, + 61610: 30361, + 61611: 30372, + 61612: 29918, + 61613: 29920, + 61614: 29996, + 61615: 40480, + 61616: 40482, + 61617: 40488, + 61618: 40489, + 61619: 40490, + 61620: 40491, + 61621: 40492, + 61622: 40498, + 61623: 40497, + 61624: 40502, + 61625: 40504, + 61626: 40503, + 61627: 40505, + 61628: 40506, + 61629: 40510, + 61630: 40513, + 61631: 40514, + 61632: 40516, + 61633: 40518, + 61634: 40519, + 61635: 40520, + 61636: 40521, + 61637: 40523, + 61638: 40524, + 61639: 40526, + 61640: 40529, + 61641: 40533, + 61642: 40535, + 61643: 40538, + 61644: 40539, + 61645: 40540, + 61646: 40542, + 61647: 40547, + 61648: 40550, + 61649: 40551, + 61650: 40552, + 61651: 40553, + 61652: 40554, + 61653: 40555, + 61654: 40556, + 61655: 40561, + 61656: 40557, + 61657: 40563, + 61658: 30098, + 61659: 30100, + 61660: 30102, + 61661: 30112, + 61662: 30109, + 61663: 30124, + 61664: 30115, + 61665: 30131, + 61666: 30132, + 61667: 30136, + 61668: 30148, + 61669: 30129, + 61670: 30128, + 61671: 30147, + 61672: 30146, + 61673: 30166, + 61674: 30157, + 61675: 30179, + 61676: 30184, + 61677: 30182, + 61678: 30180, + 61679: 30187, + 61680: 30183, + 61681: 30211, + 61682: 30193, + 61683: 30204, + 61684: 30207, + 61685: 30224, + 61686: 30208, + 61687: 30213, + 61688: 30220, + 61689: 30231, + 61690: 30218, + 61691: 30245, + 61692: 30232, + 61693: 30229, + 61694: 30233, + 61760: 39308, + 61761: 39310, + 61762: 39322, + 61763: 39323, + 61764: 39324, + 61765: 39325, + 61766: 39326, + 61767: 39327, + 61768: 39328, + 61769: 39329, + 61770: 39330, + 61771: 39331, + 61772: 39332, + 61773: 39334, + 61774: 39335, + 61775: 39337, + 61776: 39338, + 61777: 39339, + 61778: 39340, + 61779: 39341, + 61780: 39342, + 61781: 39343, + 61782: 39344, + 61783: 39345, + 61784: 39346, + 61785: 39347, + 61786: 39348, + 61787: 39349, + 61788: 39350, + 61789: 39351, + 61790: 39352, + 61791: 39353, + 61792: 39354, + 61793: 39355, + 61794: 39356, + 61795: 39357, + 61796: 39358, + 61797: 39359, + 61798: 39360, + 61799: 39361, + 61800: 39362, + 61801: 39363, + 61802: 39364, + 61803: 39365, + 61804: 39366, + 61805: 39367, + 61806: 39368, + 61807: 39369, + 61808: 39370, + 61809: 39371, + 61810: 39372, + 61811: 39373, + 61812: 39374, + 61813: 39375, + 61814: 39376, + 61815: 39377, + 61816: 39378, + 61817: 39379, + 61818: 39380, + 61819: 39381, + 61820: 39382, + 61821: 39383, + 61822: 39384, + 61824: 39385, + 61825: 39386, + 61826: 39387, + 61827: 39388, + 61828: 39389, + 61829: 39390, + 61830: 39391, + 61831: 39392, + 61832: 39393, + 61833: 39394, + 61834: 39395, + 61835: 39396, + 61836: 39397, + 61837: 39398, + 61838: 39399, + 61839: 39400, + 61840: 39401, + 61841: 39402, + 61842: 39403, + 61843: 39404, + 61844: 39405, + 61845: 39406, + 61846: 39407, + 61847: 39408, + 61848: 39409, + 61849: 39410, + 61850: 39411, + 61851: 39412, + 61852: 39413, + 61853: 39414, + 61854: 39415, + 61855: 39416, + 61856: 39417, + 61857: 30235, + 61858: 30268, + 61859: 30242, + 61860: 30240, + 61861: 30272, + 61862: 30253, + 61863: 30256, + 61864: 30271, + 61865: 30261, + 61866: 30275, + 61867: 30270, + 61868: 30259, + 61869: 30285, + 61870: 30302, + 61871: 30292, + 61872: 30300, + 61873: 30294, + 61874: 30315, + 61875: 30319, + 61876: 32714, + 61877: 31462, + 61878: 31352, + 61879: 31353, + 61880: 31360, + 61881: 31366, + 61882: 31368, + 61883: 31381, + 61884: 31398, + 61885: 31392, + 61886: 31404, + 61887: 31400, + 61888: 31405, + 61889: 31411, + 61890: 34916, + 61891: 34921, + 61892: 34930, + 61893: 34941, + 61894: 34943, + 61895: 34946, + 61896: 34978, + 61897: 35014, + 61898: 34999, + 61899: 35004, + 61900: 35017, + 61901: 35042, + 61902: 35022, + 61903: 35043, + 61904: 35045, + 61905: 35057, + 61906: 35098, + 61907: 35068, + 61908: 35048, + 61909: 35070, + 61910: 35056, + 61911: 35105, + 61912: 35097, + 61913: 35091, + 61914: 35099, + 61915: 35082, + 61916: 35124, + 61917: 35115, + 61918: 35126, + 61919: 35137, + 61920: 35174, + 61921: 35195, + 61922: 30091, + 61923: 32997, + 61924: 30386, + 61925: 30388, + 61926: 30684, + 61927: 32786, + 61928: 32788, + 61929: 32790, + 61930: 32796, + 61931: 32800, + 61932: 32802, + 61933: 32805, + 61934: 32806, + 61935: 32807, + 61936: 32809, + 61937: 32808, + 61938: 32817, + 61939: 32779, + 61940: 32821, + 61941: 32835, + 61942: 32838, + 61943: 32845, + 61944: 32850, + 61945: 32873, + 61946: 32881, + 61947: 35203, + 61948: 39032, + 61949: 39040, + 61950: 39043, + 62016: 39418, + 62017: 39419, + 62018: 39420, + 62019: 39421, + 62020: 39422, + 62021: 39423, + 62022: 39424, + 62023: 39425, + 62024: 39426, + 62025: 39427, + 62026: 39428, + 62027: 39429, + 62028: 39430, + 62029: 39431, + 62030: 39432, + 62031: 39433, + 62032: 39434, + 62033: 39435, + 62034: 39436, + 62035: 39437, + 62036: 39438, + 62037: 39439, + 62038: 39440, + 62039: 39441, + 62040: 39442, + 62041: 39443, + 62042: 39444, + 62043: 39445, + 62044: 39446, + 62045: 39447, + 62046: 39448, + 62047: 39449, + 62048: 39450, + 62049: 39451, + 62050: 39452, + 62051: 39453, + 62052: 39454, + 62053: 39455, + 62054: 39456, + 62055: 39457, + 62056: 39458, + 62057: 39459, + 62058: 39460, + 62059: 39461, + 62060: 39462, + 62061: 39463, + 62062: 39464, + 62063: 39465, + 62064: 39466, + 62065: 39467, + 62066: 39468, + 62067: 39469, + 62068: 39470, + 62069: 39471, + 62070: 39472, + 62071: 39473, + 62072: 39474, + 62073: 39475, + 62074: 39476, + 62075: 39477, + 62076: 39478, + 62077: 39479, + 62078: 39480, + 62080: 39481, + 62081: 39482, + 62082: 39483, + 62083: 39484, + 62084: 39485, + 62085: 39486, + 62086: 39487, + 62087: 39488, + 62088: 39489, + 62089: 39490, + 62090: 39491, + 62091: 39492, + 62092: 39493, + 62093: 39494, + 62094: 39495, + 62095: 39496, + 62096: 39497, + 62097: 39498, + 62098: 39499, + 62099: 39500, + 62100: 39501, + 62101: 39502, + 62102: 39503, + 62103: 39504, + 62104: 39505, + 62105: 39506, + 62106: 39507, + 62107: 39508, + 62108: 39509, + 62109: 39510, + 62110: 39511, + 62111: 39512, + 62112: 39513, + 62113: 39049, + 62114: 39052, + 62115: 39053, + 62116: 39055, + 62117: 39060, + 62118: 39066, + 62119: 39067, + 62120: 39070, + 62121: 39071, + 62122: 39073, + 62123: 39074, + 62124: 39077, + 62125: 39078, + 62126: 34381, + 62127: 34388, + 62128: 34412, + 62129: 34414, + 62130: 34431, + 62131: 34426, + 62132: 34428, + 62133: 34427, + 62134: 34472, + 62135: 34445, + 62136: 34443, + 62137: 34476, + 62138: 34461, + 62139: 34471, + 62140: 34467, + 62141: 34474, + 62142: 34451, + 62143: 34473, + 62144: 34486, + 62145: 34500, + 62146: 34485, + 62147: 34510, + 62148: 34480, + 62149: 34490, + 62150: 34481, + 62151: 34479, + 62152: 34505, + 62153: 34511, + 62154: 34484, + 62155: 34537, + 62156: 34545, + 62157: 34546, + 62158: 34541, + 62159: 34547, + 62160: 34512, + 62161: 34579, + 62162: 34526, + 62163: 34548, + 62164: 34527, + 62165: 34520, + 62166: 34513, + 62167: 34563, + 62168: 34567, + 62169: 34552, + 62170: 34568, + 62171: 34570, + 62172: 34573, + 62173: 34569, + 62174: 34595, + 62175: 34619, + 62176: 34590, + 62177: 34597, + 62178: 34606, + 62179: 34586, + 62180: 34622, + 62181: 34632, + 62182: 34612, + 62183: 34609, + 62184: 34601, + 62185: 34615, + 62186: 34623, + 62187: 34690, + 62188: 34594, + 62189: 34685, + 62190: 34686, + 62191: 34683, + 62192: 34656, + 62193: 34672, + 62194: 34636, + 62195: 34670, + 62196: 34699, + 62197: 34643, + 62198: 34659, + 62199: 34684, + 62200: 34660, + 62201: 34649, + 62202: 34661, + 62203: 34707, + 62204: 34735, + 62205: 34728, + 62206: 34770, + 62272: 39514, + 62273: 39515, + 62274: 39516, + 62275: 39517, + 62276: 39518, + 62277: 39519, + 62278: 39520, + 62279: 39521, + 62280: 39522, + 62281: 39523, + 62282: 39524, + 62283: 39525, + 62284: 39526, + 62285: 39527, + 62286: 39528, + 62287: 39529, + 62288: 39530, + 62289: 39531, + 62290: 39538, + 62291: 39555, + 62292: 39561, + 62293: 39565, + 62294: 39566, + 62295: 39572, + 62296: 39573, + 62297: 39577, + 62298: 39590, + 62299: 39593, + 62300: 39594, + 62301: 39595, + 62302: 39596, + 62303: 39597, + 62304: 39598, + 62305: 39599, + 62306: 39602, + 62307: 39603, + 62308: 39604, + 62309: 39605, + 62310: 39609, + 62311: 39611, + 62312: 39613, + 62313: 39614, + 62314: 39615, + 62315: 39619, + 62316: 39620, + 62317: 39622, + 62318: 39623, + 62319: 39624, + 62320: 39625, + 62321: 39626, + 62322: 39629, + 62323: 39630, + 62324: 39631, + 62325: 39632, + 62326: 39634, + 62327: 39636, + 62328: 39637, + 62329: 39638, + 62330: 39639, + 62331: 39641, + 62332: 39642, + 62333: 39643, + 62334: 39644, + 62336: 39645, + 62337: 39646, + 62338: 39648, + 62339: 39650, + 62340: 39651, + 62341: 39652, + 62342: 39653, + 62343: 39655, + 62344: 39656, + 62345: 39657, + 62346: 39658, + 62347: 39660, + 62348: 39662, + 62349: 39664, + 62350: 39665, + 62351: 39666, + 62352: 39667, + 62353: 39668, + 62354: 39669, + 62355: 39670, + 62356: 39671, + 62357: 39672, + 62358: 39674, + 62359: 39676, + 62360: 39677, + 62361: 39678, + 62362: 39679, + 62363: 39680, + 62364: 39681, + 62365: 39682, + 62366: 39684, + 62367: 39685, + 62368: 39686, + 62369: 34758, + 62370: 34696, + 62371: 34693, + 62372: 34733, + 62373: 34711, + 62374: 34691, + 62375: 34731, + 62376: 34789, + 62377: 34732, + 62378: 34741, + 62379: 34739, + 62380: 34763, + 62381: 34771, + 62382: 34749, + 62383: 34769, + 62384: 34752, + 62385: 34762, + 62386: 34779, + 62387: 34794, + 62388: 34784, + 62389: 34798, + 62390: 34838, + 62391: 34835, + 62392: 34814, + 62393: 34826, + 62394: 34843, + 62395: 34849, + 62396: 34873, + 62397: 34876, + 62398: 32566, + 62399: 32578, + 62400: 32580, + 62401: 32581, + 62402: 33296, + 62403: 31482, + 62404: 31485, + 62405: 31496, + 62406: 31491, + 62407: 31492, + 62408: 31509, + 62409: 31498, + 62410: 31531, + 62411: 31503, + 62412: 31559, + 62413: 31544, + 62414: 31530, + 62415: 31513, + 62416: 31534, + 62417: 31537, + 62418: 31520, + 62419: 31525, + 62420: 31524, + 62421: 31539, + 62422: 31550, + 62423: 31518, + 62424: 31576, + 62425: 31578, + 62426: 31557, + 62427: 31605, + 62428: 31564, + 62429: 31581, + 62430: 31584, + 62431: 31598, + 62432: 31611, + 62433: 31586, + 62434: 31602, + 62435: 31601, + 62436: 31632, + 62437: 31654, + 62438: 31655, + 62439: 31672, + 62440: 31660, + 62441: 31645, + 62442: 31656, + 62443: 31621, + 62444: 31658, + 62445: 31644, + 62446: 31650, + 62447: 31659, + 62448: 31668, + 62449: 31697, + 62450: 31681, + 62451: 31692, + 62452: 31709, + 62453: 31706, + 62454: 31717, + 62455: 31718, + 62456: 31722, + 62457: 31756, + 62458: 31742, + 62459: 31740, + 62460: 31759, + 62461: 31766, + 62462: 31755, + 62528: 39687, + 62529: 39689, + 62530: 39690, + 62531: 39691, + 62532: 39692, + 62533: 39693, + 62534: 39694, + 62535: 39696, + 62536: 39697, + 62537: 39698, + 62538: 39700, + 62539: 39701, + 62540: 39702, + 62541: 39703, + 62542: 39704, + 62543: 39705, + 62544: 39706, + 62545: 39707, + 62546: 39708, + 62547: 39709, + 62548: 39710, + 62549: 39712, + 62550: 39713, + 62551: 39714, + 62552: 39716, + 62553: 39717, + 62554: 39718, + 62555: 39719, + 62556: 39720, + 62557: 39721, + 62558: 39722, + 62559: 39723, + 62560: 39724, + 62561: 39725, + 62562: 39726, + 62563: 39728, + 62564: 39729, + 62565: 39731, + 62566: 39732, + 62567: 39733, + 62568: 39734, + 62569: 39735, + 62570: 39736, + 62571: 39737, + 62572: 39738, + 62573: 39741, + 62574: 39742, + 62575: 39743, + 62576: 39744, + 62577: 39750, + 62578: 39754, + 62579: 39755, + 62580: 39756, + 62581: 39758, + 62582: 39760, + 62583: 39762, + 62584: 39763, + 62585: 39765, + 62586: 39766, + 62587: 39767, + 62588: 39768, + 62589: 39769, + 62590: 39770, + 62592: 39771, + 62593: 39772, + 62594: 39773, + 62595: 39774, + 62596: 39775, + 62597: 39776, + 62598: 39777, + 62599: 39778, + 62600: 39779, + 62601: 39780, + 62602: 39781, + 62603: 39782, + 62604: 39783, + 62605: 39784, + 62606: 39785, + 62607: 39786, + 62608: 39787, + 62609: 39788, + 62610: 39789, + 62611: 39790, + 62612: 39791, + 62613: 39792, + 62614: 39793, + 62615: 39794, + 62616: 39795, + 62617: 39796, + 62618: 39797, + 62619: 39798, + 62620: 39799, + 62621: 39800, + 62622: 39801, + 62623: 39802, + 62624: 39803, + 62625: 31775, + 62626: 31786, + 62627: 31782, + 62628: 31800, + 62629: 31809, + 62630: 31808, + 62631: 33278, + 62632: 33281, + 62633: 33282, + 62634: 33284, + 62635: 33260, + 62636: 34884, + 62637: 33313, + 62638: 33314, + 62639: 33315, + 62640: 33325, + 62641: 33327, + 62642: 33320, + 62643: 33323, + 62644: 33336, + 62645: 33339, + 62646: 33331, + 62647: 33332, + 62648: 33342, + 62649: 33348, + 62650: 33353, + 62651: 33355, + 62652: 33359, + 62653: 33370, + 62654: 33375, + 62655: 33384, + 62656: 34942, + 62657: 34949, + 62658: 34952, + 62659: 35032, + 62660: 35039, + 62661: 35166, + 62662: 32669, + 62663: 32671, + 62664: 32679, + 62665: 32687, + 62666: 32688, + 62667: 32690, + 62668: 31868, + 62669: 25929, + 62670: 31889, + 62671: 31901, + 62672: 31900, + 62673: 31902, + 62674: 31906, + 62675: 31922, + 62676: 31932, + 62677: 31933, + 62678: 31937, + 62679: 31943, + 62680: 31948, + 62681: 31949, + 62682: 31944, + 62683: 31941, + 62684: 31959, + 62685: 31976, + 62686: 33390, + 62687: 26280, + 62688: 32703, + 62689: 32718, + 62690: 32725, + 62691: 32741, + 62692: 32737, + 62693: 32742, + 62694: 32745, + 62695: 32750, + 62696: 32755, + 62697: 31992, + 62698: 32119, + 62699: 32166, + 62700: 32174, + 62701: 32327, + 62702: 32411, + 62703: 40632, + 62704: 40628, + 62705: 36211, + 62706: 36228, + 62707: 36244, + 62708: 36241, + 62709: 36273, + 62710: 36199, + 62711: 36205, + 62712: 35911, + 62713: 35913, + 62714: 37194, + 62715: 37200, + 62716: 37198, + 62717: 37199, + 62718: 37220, + 62784: 39804, + 62785: 39805, + 62786: 39806, + 62787: 39807, + 62788: 39808, + 62789: 39809, + 62790: 39810, + 62791: 39811, + 62792: 39812, + 62793: 39813, + 62794: 39814, + 62795: 39815, + 62796: 39816, + 62797: 39817, + 62798: 39818, + 62799: 39819, + 62800: 39820, + 62801: 39821, + 62802: 39822, + 62803: 39823, + 62804: 39824, + 62805: 39825, + 62806: 39826, + 62807: 39827, + 62808: 39828, + 62809: 39829, + 62810: 39830, + 62811: 39831, + 62812: 39832, + 62813: 39833, + 62814: 39834, + 62815: 39835, + 62816: 39836, + 62817: 39837, + 62818: 39838, + 62819: 39839, + 62820: 39840, + 62821: 39841, + 62822: 39842, + 62823: 39843, + 62824: 39844, + 62825: 39845, + 62826: 39846, + 62827: 39847, + 62828: 39848, + 62829: 39849, + 62830: 39850, + 62831: 39851, + 62832: 39852, + 62833: 39853, + 62834: 39854, + 62835: 39855, + 62836: 39856, + 62837: 39857, + 62838: 39858, + 62839: 39859, + 62840: 39860, + 62841: 39861, + 62842: 39862, + 62843: 39863, + 62844: 39864, + 62845: 39865, + 62846: 39866, + 62848: 39867, + 62849: 39868, + 62850: 39869, + 62851: 39870, + 62852: 39871, + 62853: 39872, + 62854: 39873, + 62855: 39874, + 62856: 39875, + 62857: 39876, + 62858: 39877, + 62859: 39878, + 62860: 39879, + 62861: 39880, + 62862: 39881, + 62863: 39882, + 62864: 39883, + 62865: 39884, + 62866: 39885, + 62867: 39886, + 62868: 39887, + 62869: 39888, + 62870: 39889, + 62871: 39890, + 62872: 39891, + 62873: 39892, + 62874: 39893, + 62875: 39894, + 62876: 39895, + 62877: 39896, + 62878: 39897, + 62879: 39898, + 62880: 39899, + 62881: 37218, + 62882: 37217, + 62883: 37232, + 62884: 37225, + 62885: 37231, + 62886: 37245, + 62887: 37246, + 62888: 37234, + 62889: 37236, + 62890: 37241, + 62891: 37260, + 62892: 37253, + 62893: 37264, + 62894: 37261, + 62895: 37265, + 62896: 37282, + 62897: 37283, + 62898: 37290, + 62899: 37293, + 62900: 37294, + 62901: 37295, + 62902: 37301, + 62903: 37300, + 62904: 37306, + 62905: 35925, + 62906: 40574, + 62907: 36280, + 62908: 36331, + 62909: 36357, + 62910: 36441, + 62911: 36457, + 62912: 36277, + 62913: 36287, + 62914: 36284, + 62915: 36282, + 62916: 36292, + 62917: 36310, + 62918: 36311, + 62919: 36314, + 62920: 36318, + 62921: 36302, + 62922: 36303, + 62923: 36315, + 62924: 36294, + 62925: 36332, + 62926: 36343, + 62927: 36344, + 62928: 36323, + 62929: 36345, + 62930: 36347, + 62931: 36324, + 62932: 36361, + 62933: 36349, + 62934: 36372, + 62935: 36381, + 62936: 36383, + 62937: 36396, + 62938: 36398, + 62939: 36387, + 62940: 36399, + 62941: 36410, + 62942: 36416, + 62943: 36409, + 62944: 36405, + 62945: 36413, + 62946: 36401, + 62947: 36425, + 62948: 36417, + 62949: 36418, + 62950: 36433, + 62951: 36434, + 62952: 36426, + 62953: 36464, + 62954: 36470, + 62955: 36476, + 62956: 36463, + 62957: 36468, + 62958: 36485, + 62959: 36495, + 62960: 36500, + 62961: 36496, + 62962: 36508, + 62963: 36510, + 62964: 35960, + 62965: 35970, + 62966: 35978, + 62967: 35973, + 62968: 35992, + 62969: 35988, + 62970: 26011, + 62971: 35286, + 62972: 35294, + 62973: 35290, + 62974: 35292, + 63040: 39900, + 63041: 39901, + 63042: 39902, + 63043: 39903, + 63044: 39904, + 63045: 39905, + 63046: 39906, + 63047: 39907, + 63048: 39908, + 63049: 39909, + 63050: 39910, + 63051: 39911, + 63052: 39912, + 63053: 39913, + 63054: 39914, + 63055: 39915, + 63056: 39916, + 63057: 39917, + 63058: 39918, + 63059: 39919, + 63060: 39920, + 63061: 39921, + 63062: 39922, + 63063: 39923, + 63064: 39924, + 63065: 39925, + 63066: 39926, + 63067: 39927, + 63068: 39928, + 63069: 39929, + 63070: 39930, + 63071: 39931, + 63072: 39932, + 63073: 39933, + 63074: 39934, + 63075: 39935, + 63076: 39936, + 63077: 39937, + 63078: 39938, + 63079: 39939, + 63080: 39940, + 63081: 39941, + 63082: 39942, + 63083: 39943, + 63084: 39944, + 63085: 39945, + 63086: 39946, + 63087: 39947, + 63088: 39948, + 63089: 39949, + 63090: 39950, + 63091: 39951, + 63092: 39952, + 63093: 39953, + 63094: 39954, + 63095: 39955, + 63096: 39956, + 63097: 39957, + 63098: 39958, + 63099: 39959, + 63100: 39960, + 63101: 39961, + 63102: 39962, + 63104: 39963, + 63105: 39964, + 63106: 39965, + 63107: 39966, + 63108: 39967, + 63109: 39968, + 63110: 39969, + 63111: 39970, + 63112: 39971, + 63113: 39972, + 63114: 39973, + 63115: 39974, + 63116: 39975, + 63117: 39976, + 63118: 39977, + 63119: 39978, + 63120: 39979, + 63121: 39980, + 63122: 39981, + 63123: 39982, + 63124: 39983, + 63125: 39984, + 63126: 39985, + 63127: 39986, + 63128: 39987, + 63129: 39988, + 63130: 39989, + 63131: 39990, + 63132: 39991, + 63133: 39992, + 63134: 39993, + 63135: 39994, + 63136: 39995, + 63137: 35301, + 63138: 35307, + 63139: 35311, + 63140: 35390, + 63141: 35622, + 63142: 38739, + 63143: 38633, + 63144: 38643, + 63145: 38639, + 63146: 38662, + 63147: 38657, + 63148: 38664, + 63149: 38671, + 63150: 38670, + 63151: 38698, + 63152: 38701, + 63153: 38704, + 63154: 38718, + 63155: 40832, + 63156: 40835, + 63157: 40837, + 63158: 40838, + 63159: 40839, + 63160: 40840, + 63161: 40841, + 63162: 40842, + 63163: 40844, + 63164: 40702, + 63165: 40715, + 63166: 40717, + 63167: 38585, + 63168: 38588, + 63169: 38589, + 63170: 38606, + 63171: 38610, + 63172: 30655, + 63173: 38624, + 63174: 37518, + 63175: 37550, + 63176: 37576, + 63177: 37694, + 63178: 37738, + 63179: 37834, + 63180: 37775, + 63181: 37950, + 63182: 37995, + 63183: 40063, + 63184: 40066, + 63185: 40069, + 63186: 40070, + 63187: 40071, + 63188: 40072, + 63189: 31267, + 63190: 40075, + 63191: 40078, + 63192: 40080, + 63193: 40081, + 63194: 40082, + 63195: 40084, + 63196: 40085, + 63197: 40090, + 63198: 40091, + 63199: 40094, + 63200: 40095, + 63201: 40096, + 63202: 40097, + 63203: 40098, + 63204: 40099, + 63205: 40101, + 63206: 40102, + 63207: 40103, + 63208: 40104, + 63209: 40105, + 63210: 40107, + 63211: 40109, + 63212: 40110, + 63213: 40112, + 63214: 40113, + 63215: 40114, + 63216: 40115, + 63217: 40116, + 63218: 40117, + 63219: 40118, + 63220: 40119, + 63221: 40122, + 63222: 40123, + 63223: 40124, + 63224: 40125, + 63225: 40132, + 63226: 40133, + 63227: 40134, + 63228: 40135, + 63229: 40138, + 63230: 40139, + 63296: 39996, + 63297: 39997, + 63298: 39998, + 63299: 39999, + 63300: 40000, + 63301: 40001, + 63302: 40002, + 63303: 40003, + 63304: 40004, + 63305: 40005, + 63306: 40006, + 63307: 40007, + 63308: 40008, + 63309: 40009, + 63310: 40010, + 63311: 40011, + 63312: 40012, + 63313: 40013, + 63314: 40014, + 63315: 40015, + 63316: 40016, + 63317: 40017, + 63318: 40018, + 63319: 40019, + 63320: 40020, + 63321: 40021, + 63322: 40022, + 63323: 40023, + 63324: 40024, + 63325: 40025, + 63326: 40026, + 63327: 40027, + 63328: 40028, + 63329: 40029, + 63330: 40030, + 63331: 40031, + 63332: 40032, + 63333: 40033, + 63334: 40034, + 63335: 40035, + 63336: 40036, + 63337: 40037, + 63338: 40038, + 63339: 40039, + 63340: 40040, + 63341: 40041, + 63342: 40042, + 63343: 40043, + 63344: 40044, + 63345: 40045, + 63346: 40046, + 63347: 40047, + 63348: 40048, + 63349: 40049, + 63350: 40050, + 63351: 40051, + 63352: 40052, + 63353: 40053, + 63354: 40054, + 63355: 40055, + 63356: 40056, + 63357: 40057, + 63358: 40058, + 63360: 40059, + 63361: 40061, + 63362: 40062, + 63363: 40064, + 63364: 40067, + 63365: 40068, + 63366: 40073, + 63367: 40074, + 63368: 40076, + 63369: 40079, + 63370: 40083, + 63371: 40086, + 63372: 40087, + 63373: 40088, + 63374: 40089, + 63375: 40093, + 63376: 40106, + 63377: 40108, + 63378: 40111, + 63379: 40121, + 63380: 40126, + 63381: 40127, + 63382: 40128, + 63383: 40129, + 63384: 40130, + 63385: 40136, + 63386: 40137, + 63387: 40145, + 63388: 40146, + 63389: 40154, + 63390: 40155, + 63391: 40160, + 63392: 40161, + 63393: 40140, + 63394: 40141, + 63395: 40142, + 63396: 40143, + 63397: 40144, + 63398: 40147, + 63399: 40148, + 63400: 40149, + 63401: 40151, + 63402: 40152, + 63403: 40153, + 63404: 40156, + 63405: 40157, + 63406: 40159, + 63407: 40162, + 63408: 38780, + 63409: 38789, + 63410: 38801, + 63411: 38802, + 63412: 38804, + 63413: 38831, + 63414: 38827, + 63415: 38819, + 63416: 38834, + 63417: 38836, + 63418: 39601, + 63419: 39600, + 63420: 39607, + 63421: 40536, + 63422: 39606, + 63423: 39610, + 63424: 39612, + 63425: 39617, + 63426: 39616, + 63427: 39621, + 63428: 39618, + 63429: 39627, + 63430: 39628, + 63431: 39633, + 63432: 39749, + 63433: 39747, + 63434: 39751, + 63435: 39753, + 63436: 39752, + 63437: 39757, + 63438: 39761, + 63439: 39144, + 63440: 39181, + 63441: 39214, + 63442: 39253, + 63443: 39252, + 63444: 39647, + 63445: 39649, + 63446: 39654, + 63447: 39663, + 63448: 39659, + 63449: 39675, + 63450: 39661, + 63451: 39673, + 63452: 39688, + 63453: 39695, + 63454: 39699, + 63455: 39711, + 63456: 39715, + 63457: 40637, + 63458: 40638, + 63459: 32315, + 63460: 40578, + 63461: 40583, + 63462: 40584, + 63463: 40587, + 63464: 40594, + 63465: 37846, + 63466: 40605, + 63467: 40607, + 63468: 40667, + 63469: 40668, + 63470: 40669, + 63471: 40672, + 63472: 40671, + 63473: 40674, + 63474: 40681, + 63475: 40679, + 63476: 40677, + 63477: 40682, + 63478: 40687, + 63479: 40738, + 63480: 40748, + 63481: 40751, + 63482: 40761, + 63483: 40759, + 63484: 40765, + 63485: 40766, + 63486: 40772, + 63552: 40163, + 63553: 40164, + 63554: 40165, + 63555: 40166, + 63556: 40167, + 63557: 40168, + 63558: 40169, + 63559: 40170, + 63560: 40171, + 63561: 40172, + 63562: 40173, + 63563: 40174, + 63564: 40175, + 63565: 40176, + 63566: 40177, + 63567: 40178, + 63568: 40179, + 63569: 40180, + 63570: 40181, + 63571: 40182, + 63572: 40183, + 63573: 40184, + 63574: 40185, + 63575: 40186, + 63576: 40187, + 63577: 40188, + 63578: 40189, + 63579: 40190, + 63580: 40191, + 63581: 40192, + 63582: 40193, + 63583: 40194, + 63584: 40195, + 63585: 40196, + 63586: 40197, + 63587: 40198, + 63588: 40199, + 63589: 40200, + 63590: 40201, + 63591: 40202, + 63592: 40203, + 63593: 40204, + 63594: 40205, + 63595: 40206, + 63596: 40207, + 63597: 40208, + 63598: 40209, + 63599: 40210, + 63600: 40211, + 63601: 40212, + 63602: 40213, + 63603: 40214, + 63604: 40215, + 63605: 40216, + 63606: 40217, + 63607: 40218, + 63608: 40219, + 63609: 40220, + 63610: 40221, + 63611: 40222, + 63612: 40223, + 63613: 40224, + 63614: 40225, + 63616: 40226, + 63617: 40227, + 63618: 40228, + 63619: 40229, + 63620: 40230, + 63621: 40231, + 63622: 40232, + 63623: 40233, + 63624: 40234, + 63625: 40235, + 63626: 40236, + 63627: 40237, + 63628: 40238, + 63629: 40239, + 63630: 40240, + 63631: 40241, + 63632: 40242, + 63633: 40243, + 63634: 40244, + 63635: 40245, + 63636: 40246, + 63637: 40247, + 63638: 40248, + 63639: 40249, + 63640: 40250, + 63641: 40251, + 63642: 40252, + 63643: 40253, + 63644: 40254, + 63645: 40255, + 63646: 40256, + 63647: 40257, + 63648: 40258, + 63649: 57908, + 63650: 57909, + 63651: 57910, + 63652: 57911, + 63653: 57912, + 63654: 57913, + 63655: 57914, + 63656: 57915, + 63657: 57916, + 63658: 57917, + 63659: 57918, + 63660: 57919, + 63661: 57920, + 63662: 57921, + 63663: 57922, + 63664: 57923, + 63665: 57924, + 63666: 57925, + 63667: 57926, + 63668: 57927, + 63669: 57928, + 63670: 57929, + 63671: 57930, + 63672: 57931, + 63673: 57932, + 63674: 57933, + 63675: 57934, + 63676: 57935, + 63677: 57936, + 63678: 57937, + 63679: 57938, + 63680: 57939, + 63681: 57940, + 63682: 57941, + 63683: 57942, + 63684: 57943, + 63685: 57944, + 63686: 57945, + 63687: 57946, + 63688: 57947, + 63689: 57948, + 63690: 57949, + 63691: 57950, + 63692: 57951, + 63693: 57952, + 63694: 57953, + 63695: 57954, + 63696: 57955, + 63697: 57956, + 63698: 57957, + 63699: 57958, + 63700: 57959, + 63701: 57960, + 63702: 57961, + 63703: 57962, + 63704: 57963, + 63705: 57964, + 63706: 57965, + 63707: 57966, + 63708: 57967, + 63709: 57968, + 63710: 57969, + 63711: 57970, + 63712: 57971, + 63713: 57972, + 63714: 57973, + 63715: 57974, + 63716: 57975, + 63717: 57976, + 63718: 57977, + 63719: 57978, + 63720: 57979, + 63721: 57980, + 63722: 57981, + 63723: 57982, + 63724: 57983, + 63725: 57984, + 63726: 57985, + 63727: 57986, + 63728: 57987, + 63729: 57988, + 63730: 57989, + 63731: 57990, + 63732: 57991, + 63733: 57992, + 63734: 57993, + 63735: 57994, + 63736: 57995, + 63737: 57996, + 63738: 57997, + 63739: 57998, + 63740: 57999, + 63741: 58000, + 63742: 58001, + 63808: 40259, + 63809: 40260, + 63810: 40261, + 63811: 40262, + 63812: 40263, + 63813: 40264, + 63814: 40265, + 63815: 40266, + 63816: 40267, + 63817: 40268, + 63818: 40269, + 63819: 40270, + 63820: 40271, + 63821: 40272, + 63822: 40273, + 63823: 40274, + 63824: 40275, + 63825: 40276, + 63826: 40277, + 63827: 40278, + 63828: 40279, + 63829: 40280, + 63830: 40281, + 63831: 40282, + 63832: 40283, + 63833: 40284, + 63834: 40285, + 63835: 40286, + 63836: 40287, + 63837: 40288, + 63838: 40289, + 63839: 40290, + 63840: 40291, + 63841: 40292, + 63842: 40293, + 63843: 40294, + 63844: 40295, + 63845: 40296, + 63846: 40297, + 63847: 40298, + 63848: 40299, + 63849: 40300, + 63850: 40301, + 63851: 40302, + 63852: 40303, + 63853: 40304, + 63854: 40305, + 63855: 40306, + 63856: 40307, + 63857: 40308, + 63858: 40309, + 63859: 40310, + 63860: 40311, + 63861: 40312, + 63862: 40313, + 63863: 40314, + 63864: 40315, + 63865: 40316, + 63866: 40317, + 63867: 40318, + 63868: 40319, + 63869: 40320, + 63870: 40321, + 63872: 40322, + 63873: 40323, + 63874: 40324, + 63875: 40325, + 63876: 40326, + 63877: 40327, + 63878: 40328, + 63879: 40329, + 63880: 40330, + 63881: 40331, + 63882: 40332, + 63883: 40333, + 63884: 40334, + 63885: 40335, + 63886: 40336, + 63887: 40337, + 63888: 40338, + 63889: 40339, + 63890: 40340, + 63891: 40341, + 63892: 40342, + 63893: 40343, + 63894: 40344, + 63895: 40345, + 63896: 40346, + 63897: 40347, + 63898: 40348, + 63899: 40349, + 63900: 40350, + 63901: 40351, + 63902: 40352, + 63903: 40353, + 63904: 40354, + 63905: 58002, + 63906: 58003, + 63907: 58004, + 63908: 58005, + 63909: 58006, + 63910: 58007, + 63911: 58008, + 63912: 58009, + 63913: 58010, + 63914: 58011, + 63915: 58012, + 63916: 58013, + 63917: 58014, + 63918: 58015, + 63919: 58016, + 63920: 58017, + 63921: 58018, + 63922: 58019, + 63923: 58020, + 63924: 58021, + 63925: 58022, + 63926: 58023, + 63927: 58024, + 63928: 58025, + 63929: 58026, + 63930: 58027, + 63931: 58028, + 63932: 58029, + 63933: 58030, + 63934: 58031, + 63935: 58032, + 63936: 58033, + 63937: 58034, + 63938: 58035, + 63939: 58036, + 63940: 58037, + 63941: 58038, + 63942: 58039, + 63943: 58040, + 63944: 58041, + 63945: 58042, + 63946: 58043, + 63947: 58044, + 63948: 58045, + 63949: 58046, + 63950: 58047, + 63951: 58048, + 63952: 58049, + 63953: 58050, + 63954: 58051, + 63955: 58052, + 63956: 58053, + 63957: 58054, + 63958: 58055, + 63959: 58056, + 63960: 58057, + 63961: 58058, + 63962: 58059, + 63963: 58060, + 63964: 58061, + 63965: 58062, + 63966: 58063, + 63967: 58064, + 63968: 58065, + 63969: 58066, + 63970: 58067, + 63971: 58068, + 63972: 58069, + 63973: 58070, + 63974: 58071, + 63975: 58072, + 63976: 58073, + 63977: 58074, + 63978: 58075, + 63979: 58076, + 63980: 58077, + 63981: 58078, + 63982: 58079, + 63983: 58080, + 63984: 58081, + 63985: 58082, + 63986: 58083, + 63987: 58084, + 63988: 58085, + 63989: 58086, + 63990: 58087, + 63991: 58088, + 63992: 58089, + 63993: 58090, + 63994: 58091, + 63995: 58092, + 63996: 58093, + 63997: 58094, + 63998: 58095, + 64064: 40355, + 64065: 40356, + 64066: 40357, + 64067: 40358, + 64068: 40359, + 64069: 40360, + 64070: 40361, + 64071: 40362, + 64072: 40363, + 64073: 40364, + 64074: 40365, + 64075: 40366, + 64076: 40367, + 64077: 40368, + 64078: 40369, + 64079: 40370, + 64080: 40371, + 64081: 40372, + 64082: 40373, + 64083: 40374, + 64084: 40375, + 64085: 40376, + 64086: 40377, + 64087: 40378, + 64088: 40379, + 64089: 40380, + 64090: 40381, + 64091: 40382, + 64092: 40383, + 64093: 40384, + 64094: 40385, + 64095: 40386, + 64096: 40387, + 64097: 40388, + 64098: 40389, + 64099: 40390, + 64100: 40391, + 64101: 40392, + 64102: 40393, + 64103: 40394, + 64104: 40395, + 64105: 40396, + 64106: 40397, + 64107: 40398, + 64108: 40399, + 64109: 40400, + 64110: 40401, + 64111: 40402, + 64112: 40403, + 64113: 40404, + 64114: 40405, + 64115: 40406, + 64116: 40407, + 64117: 40408, + 64118: 40409, + 64119: 40410, + 64120: 40411, + 64121: 40412, + 64122: 40413, + 64123: 40414, + 64124: 40415, + 64125: 40416, + 64126: 40417, + 64128: 40418, + 64129: 40419, + 64130: 40420, + 64131: 40421, + 64132: 40422, + 64133: 40423, + 64134: 40424, + 64135: 40425, + 64136: 40426, + 64137: 40427, + 64138: 40428, + 64139: 40429, + 64140: 40430, + 64141: 40431, + 64142: 40432, + 64143: 40433, + 64144: 40434, + 64145: 40435, + 64146: 40436, + 64147: 40437, + 64148: 40438, + 64149: 40439, + 64150: 40440, + 64151: 40441, + 64152: 40442, + 64153: 40443, + 64154: 40444, + 64155: 40445, + 64156: 40446, + 64157: 40447, + 64158: 40448, + 64159: 40449, + 64160: 40450, + 64161: 58096, + 64162: 58097, + 64163: 58098, + 64164: 58099, + 64165: 58100, + 64166: 58101, + 64167: 58102, + 64168: 58103, + 64169: 58104, + 64170: 58105, + 64171: 58106, + 64172: 58107, + 64173: 58108, + 64174: 58109, + 64175: 58110, + 64176: 58111, + 64177: 58112, + 64178: 58113, + 64179: 58114, + 64180: 58115, + 64181: 58116, + 64182: 58117, + 64183: 58118, + 64184: 58119, + 64185: 58120, + 64186: 58121, + 64187: 58122, + 64188: 58123, + 64189: 58124, + 64190: 58125, + 64191: 58126, + 64192: 58127, + 64193: 58128, + 64194: 58129, + 64195: 58130, + 64196: 58131, + 64197: 58132, + 64198: 58133, + 64199: 58134, + 64200: 58135, + 64201: 58136, + 64202: 58137, + 64203: 58138, + 64204: 58139, + 64205: 58140, + 64206: 58141, + 64207: 58142, + 64208: 58143, + 64209: 58144, + 64210: 58145, + 64211: 58146, + 64212: 58147, + 64213: 58148, + 64214: 58149, + 64215: 58150, + 64216: 58151, + 64217: 58152, + 64218: 58153, + 64219: 58154, + 64220: 58155, + 64221: 58156, + 64222: 58157, + 64223: 58158, + 64224: 58159, + 64225: 58160, + 64226: 58161, + 64227: 58162, + 64228: 58163, + 64229: 58164, + 64230: 58165, + 64231: 58166, + 64232: 58167, + 64233: 58168, + 64234: 58169, + 64235: 58170, + 64236: 58171, + 64237: 58172, + 64238: 58173, + 64239: 58174, + 64240: 58175, + 64241: 58176, + 64242: 58177, + 64243: 58178, + 64244: 58179, + 64245: 58180, + 64246: 58181, + 64247: 58182, + 64248: 58183, + 64249: 58184, + 64250: 58185, + 64251: 58186, + 64252: 58187, + 64253: 58188, + 64254: 58189, + 64320: 40451, + 64321: 40452, + 64322: 40453, + 64323: 40454, + 64324: 40455, + 64325: 40456, + 64326: 40457, + 64327: 40458, + 64328: 40459, + 64329: 40460, + 64330: 40461, + 64331: 40462, + 64332: 40463, + 64333: 40464, + 64334: 40465, + 64335: 40466, + 64336: 40467, + 64337: 40468, + 64338: 40469, + 64339: 40470, + 64340: 40471, + 64341: 40472, + 64342: 40473, + 64343: 40474, + 64344: 40475, + 64345: 40476, + 64346: 40477, + 64347: 40478, + 64348: 40484, + 64349: 40487, + 64350: 40494, + 64351: 40496, + 64352: 40500, + 64353: 40507, + 64354: 40508, + 64355: 40512, + 64356: 40525, + 64357: 40528, + 64358: 40530, + 64359: 40531, + 64360: 40532, + 64361: 40534, + 64362: 40537, + 64363: 40541, + 64364: 40543, + 64365: 40544, + 64366: 40545, + 64367: 40546, + 64368: 40549, + 64369: 40558, + 64370: 40559, + 64371: 40562, + 64372: 40564, + 64373: 40565, + 64374: 40566, + 64375: 40567, + 64376: 40568, + 64377: 40569, + 64378: 40570, + 64379: 40571, + 64380: 40572, + 64381: 40573, + 64382: 40576, + 64384: 40577, + 64385: 40579, + 64386: 40580, + 64387: 40581, + 64388: 40582, + 64389: 40585, + 64390: 40586, + 64391: 40588, + 64392: 40589, + 64393: 40590, + 64394: 40591, + 64395: 40592, + 64396: 40593, + 64397: 40596, + 64398: 40597, + 64399: 40598, + 64400: 40599, + 64401: 40600, + 64402: 40601, + 64403: 40602, + 64404: 40603, + 64405: 40604, + 64406: 40606, + 64407: 40608, + 64408: 40609, + 64409: 40610, + 64410: 40611, + 64411: 40612, + 64412: 40613, + 64413: 40615, + 64414: 40616, + 64415: 40617, + 64416: 40618, + 64417: 58190, + 64418: 58191, + 64419: 58192, + 64420: 58193, + 64421: 58194, + 64422: 58195, + 64423: 58196, + 64424: 58197, + 64425: 58198, + 64426: 58199, + 64427: 58200, + 64428: 58201, + 64429: 58202, + 64430: 58203, + 64431: 58204, + 64432: 58205, + 64433: 58206, + 64434: 58207, + 64435: 58208, + 64436: 58209, + 64437: 58210, + 64438: 58211, + 64439: 58212, + 64440: 58213, + 64441: 58214, + 64442: 58215, + 64443: 58216, + 64444: 58217, + 64445: 58218, + 64446: 58219, + 64447: 58220, + 64448: 58221, + 64449: 58222, + 64450: 58223, + 64451: 58224, + 64452: 58225, + 64453: 58226, + 64454: 58227, + 64455: 58228, + 64456: 58229, + 64457: 58230, + 64458: 58231, + 64459: 58232, + 64460: 58233, + 64461: 58234, + 64462: 58235, + 64463: 58236, + 64464: 58237, + 64465: 58238, + 64466: 58239, + 64467: 58240, + 64468: 58241, + 64469: 58242, + 64470: 58243, + 64471: 58244, + 64472: 58245, + 64473: 58246, + 64474: 58247, + 64475: 58248, + 64476: 58249, + 64477: 58250, + 64478: 58251, + 64479: 58252, + 64480: 58253, + 64481: 58254, + 64482: 58255, + 64483: 58256, + 64484: 58257, + 64485: 58258, + 64486: 58259, + 64487: 58260, + 64488: 58261, + 64489: 58262, + 64490: 58263, + 64491: 58264, + 64492: 58265, + 64493: 58266, + 64494: 58267, + 64495: 58268, + 64496: 58269, + 64497: 58270, + 64498: 58271, + 64499: 58272, + 64500: 58273, + 64501: 58274, + 64502: 58275, + 64503: 58276, + 64504: 58277, + 64505: 58278, + 64506: 58279, + 64507: 58280, + 64508: 58281, + 64509: 58282, + 64510: 58283, + 64576: 40619, + 64577: 40620, + 64578: 40621, + 64579: 40622, + 64580: 40623, + 64581: 40624, + 64582: 40625, + 64583: 40626, + 64584: 40627, + 64585: 40629, + 64586: 40630, + 64587: 40631, + 64588: 40633, + 64589: 40634, + 64590: 40636, + 64591: 40639, + 64592: 40640, + 64593: 40641, + 64594: 40642, + 64595: 40643, + 64596: 40645, + 64597: 40646, + 64598: 40647, + 64599: 40648, + 64600: 40650, + 64601: 40651, + 64602: 40652, + 64603: 40656, + 64604: 40658, + 64605: 40659, + 64606: 40661, + 64607: 40662, + 64608: 40663, + 64609: 40665, + 64610: 40666, + 64611: 40670, + 64612: 40673, + 64613: 40675, + 64614: 40676, + 64615: 40678, + 64616: 40680, + 64617: 40683, + 64618: 40684, + 64619: 40685, + 64620: 40686, + 64621: 40688, + 64622: 40689, + 64623: 40690, + 64624: 40691, + 64625: 40692, + 64626: 40693, + 64627: 40694, + 64628: 40695, + 64629: 40696, + 64630: 40698, + 64631: 40701, + 64632: 40703, + 64633: 40704, + 64634: 40705, + 64635: 40706, + 64636: 40707, + 64637: 40708, + 64638: 40709, + 64640: 40710, + 64641: 40711, + 64642: 40712, + 64643: 40713, + 64644: 40714, + 64645: 40716, + 64646: 40719, + 64647: 40721, + 64648: 40722, + 64649: 40724, + 64650: 40725, + 64651: 40726, + 64652: 40728, + 64653: 40730, + 64654: 40731, + 64655: 40732, + 64656: 40733, + 64657: 40734, + 64658: 40735, + 64659: 40737, + 64660: 40739, + 64661: 40740, + 64662: 40741, + 64663: 40742, + 64664: 40743, + 64665: 40744, + 64666: 40745, + 64667: 40746, + 64668: 40747, + 64669: 40749, + 64670: 40750, + 64671: 40752, + 64672: 40753, + 64673: 58284, + 64674: 58285, + 64675: 58286, + 64676: 58287, + 64677: 58288, + 64678: 58289, + 64679: 58290, + 64680: 58291, + 64681: 58292, + 64682: 58293, + 64683: 58294, + 64684: 58295, + 64685: 58296, + 64686: 58297, + 64687: 58298, + 64688: 58299, + 64689: 58300, + 64690: 58301, + 64691: 58302, + 64692: 58303, + 64693: 58304, + 64694: 58305, + 64695: 58306, + 64696: 58307, + 64697: 58308, + 64698: 58309, + 64699: 58310, + 64700: 58311, + 64701: 58312, + 64702: 58313, + 64703: 58314, + 64704: 58315, + 64705: 58316, + 64706: 58317, + 64707: 58318, + 64708: 58319, + 64709: 58320, + 64710: 58321, + 64711: 58322, + 64712: 58323, + 64713: 58324, + 64714: 58325, + 64715: 58326, + 64716: 58327, + 64717: 58328, + 64718: 58329, + 64719: 58330, + 64720: 58331, + 64721: 58332, + 64722: 58333, + 64723: 58334, + 64724: 58335, + 64725: 58336, + 64726: 58337, + 64727: 58338, + 64728: 58339, + 64729: 58340, + 64730: 58341, + 64731: 58342, + 64732: 58343, + 64733: 58344, + 64734: 58345, + 64735: 58346, + 64736: 58347, + 64737: 58348, + 64738: 58349, + 64739: 58350, + 64740: 58351, + 64741: 58352, + 64742: 58353, + 64743: 58354, + 64744: 58355, + 64745: 58356, + 64746: 58357, + 64747: 58358, + 64748: 58359, + 64749: 58360, + 64750: 58361, + 64751: 58362, + 64752: 58363, + 64753: 58364, + 64754: 58365, + 64755: 58366, + 64756: 58367, + 64757: 58368, + 64758: 58369, + 64759: 58370, + 64760: 58371, + 64761: 58372, + 64762: 58373, + 64763: 58374, + 64764: 58375, + 64765: 58376, + 64766: 58377, + 64832: 40754, + 64833: 40755, + 64834: 40756, + 64835: 40757, + 64836: 40758, + 64837: 40760, + 64838: 40762, + 64839: 40764, + 64840: 40767, + 64841: 40768, + 64842: 40769, + 64843: 40770, + 64844: 40771, + 64845: 40773, + 64846: 40774, + 64847: 40775, + 64848: 40776, + 64849: 40777, + 64850: 40778, + 64851: 40779, + 64852: 40780, + 64853: 40781, + 64854: 40782, + 64855: 40783, + 64856: 40786, + 64857: 40787, + 64858: 40788, + 64859: 40789, + 64860: 40790, + 64861: 40791, + 64862: 40792, + 64863: 40793, + 64864: 40794, + 64865: 40795, + 64866: 40796, + 64867: 40797, + 64868: 40798, + 64869: 40799, + 64870: 40800, + 64871: 40801, + 64872: 40802, + 64873: 40803, + 64874: 40804, + 64875: 40805, + 64876: 40806, + 64877: 40807, + 64878: 40808, + 64879: 40809, + 64880: 40810, + 64881: 40811, + 64882: 40812, + 64883: 40813, + 64884: 40814, + 64885: 40815, + 64886: 40816, + 64887: 40817, + 64888: 40818, + 64889: 40819, + 64890: 40820, + 64891: 40821, + 64892: 40822, + 64893: 40823, + 64894: 40824, + 64896: 40825, + 64897: 40826, + 64898: 40827, + 64899: 40828, + 64900: 40829, + 64901: 40830, + 64902: 40833, + 64903: 40834, + 64904: 40845, + 64905: 40846, + 64906: 40847, + 64907: 40848, + 64908: 40849, + 64909: 40850, + 64910: 40851, + 64911: 40852, + 64912: 40853, + 64913: 40854, + 64914: 40855, + 64915: 40856, + 64916: 40860, + 64917: 40861, + 64918: 40862, + 64919: 40865, + 64920: 40866, + 64921: 40867, + 64922: 40868, + 64923: 40869, + 64924: 63788, + 64925: 63865, + 64926: 63893, + 64927: 63975, + 64928: 63985, + 64929: 58378, + 64930: 58379, + 64931: 58380, + 64932: 58381, + 64933: 58382, + 64934: 58383, + 64935: 58384, + 64936: 58385, + 64937: 58386, + 64938: 58387, + 64939: 58388, + 64940: 58389, + 64941: 58390, + 64942: 58391, + 64943: 58392, + 64944: 58393, + 64945: 58394, + 64946: 58395, + 64947: 58396, + 64948: 58397, + 64949: 58398, + 64950: 58399, + 64951: 58400, + 64952: 58401, + 64953: 58402, + 64954: 58403, + 64955: 58404, + 64956: 58405, + 64957: 58406, + 64958: 58407, + 64959: 58408, + 64960: 58409, + 64961: 58410, + 64962: 58411, + 64963: 58412, + 64964: 58413, + 64965: 58414, + 64966: 58415, + 64967: 58416, + 64968: 58417, + 64969: 58418, + 64970: 58419, + 64971: 58420, + 64972: 58421, + 64973: 58422, + 64974: 58423, + 64975: 58424, + 64976: 58425, + 64977: 58426, + 64978: 58427, + 64979: 58428, + 64980: 58429, + 64981: 58430, + 64982: 58431, + 64983: 58432, + 64984: 58433, + 64985: 58434, + 64986: 58435, + 64987: 58436, + 64988: 58437, + 64989: 58438, + 64990: 58439, + 64991: 58440, + 64992: 58441, + 64993: 58442, + 64994: 58443, + 64995: 58444, + 64996: 58445, + 64997: 58446, + 64998: 58447, + 64999: 58448, + 65000: 58449, + 65001: 58450, + 65002: 58451, + 65003: 58452, + 65004: 58453, + 65005: 58454, + 65006: 58455, + 65007: 58456, + 65008: 58457, + 65009: 58458, + 65010: 58459, + 65011: 58460, + 65012: 58461, + 65013: 58462, + 65014: 58463, + 65015: 58464, + 65016: 58465, + 65017: 58466, + 65018: 58467, + 65019: 58468, + 65020: 58469, + 65021: 58470, + 65022: 58471, + 65088: 64012, + 65089: 64013, + 65090: 64014, + 65091: 64015, + 65092: 64017, + 65093: 64019, + 65094: 64020, + 65095: 64024, + 65096: 64031, + 65097: 64032, + 65098: 64033, + 65099: 64035, + 65100: 64036, + 65101: 64039, + 65102: 64040, + 65103: 64041, + 65104: 11905, + 65105: 59414, + 65106: 59415, + 65107: 59416, + 65108: 11908, + 65109: 13427, + 65110: 13383, + 65111: 11912, + 65112: 11915, + 65113: 59422, + 65114: 13726, + 65115: 13850, + 65116: 13838, + 65117: 11916, + 65118: 11927, + 65119: 14702, + 65120: 14616, + 65121: 59430, + 65122: 14799, + 65123: 14815, + 65124: 14963, + 65125: 14800, + 65126: 59435, + 65127: 59436, + 65128: 15182, + 65129: 15470, + 65130: 15584, + 65131: 11943, + 65132: 59441, + 65133: 59442, + 65134: 11946, + 65135: 16470, + 65136: 16735, + 65137: 11950, + 65138: 17207, + 65139: 11955, + 65140: 11958, + 65141: 11959, + 65142: 59451, + 65143: 17329, + 65144: 17324, + 65145: 11963, + 65146: 17373, + 65147: 17622, + 65148: 18017, + 65149: 17996, + 65150: 59459, + 65152: 18211, + 65153: 18217, + 65154: 18300, + 65155: 18317, + 65156: 11978, + 65157: 18759, + 65158: 18810, + 65159: 18813, + 65160: 18818, + 65161: 18819, + 65162: 18821, + 65163: 18822, + 65164: 18847, + 65165: 18843, + 65166: 18871, + 65167: 18870, + 65168: 59476, + 65169: 59477, + 65170: 19619, + 65171: 19615, + 65172: 19616, + 65173: 19617, + 65174: 19575, + 65175: 19618, + 65176: 19731, + 65177: 19732, + 65178: 19733, + 65179: 19734, + 65180: 19735, + 65181: 19736, + 65182: 19737, + 65183: 19886, + 65184: 59492, + 65185: 58472, + 65186: 58473, + 65187: 58474, + 65188: 58475, + 65189: 58476, + 65190: 58477, + 65191: 58478, + 65192: 58479, + 65193: 58480, + 65194: 58481, + 65195: 58482, + 65196: 58483, + 65197: 58484, + 65198: 58485, + 65199: 58486, + 65200: 58487, + 65201: 58488, + 65202: 58489, + 65203: 58490, + 65204: 58491, + 65205: 58492, + 65206: 58493, + 65207: 58494, + 65208: 58495, + 65209: 58496, + 65210: 58497, + 65211: 58498, + 65212: 58499, + 65213: 58500, + 65214: 58501, + 65215: 58502, + 65216: 58503, + 65217: 58504, + 65218: 58505, + 65219: 58506, + 65220: 58507, + 65221: 58508, + 65222: 58509, + 65223: 58510, + 65224: 58511, + 65225: 58512, + 65226: 58513, + 65227: 58514, + 65228: 58515, + 65229: 58516, + 65230: 58517, + 65231: 58518, + 65232: 58519, + 65233: 58520, + 65234: 58521, + 65235: 58522, + 65236: 58523, + 65237: 58524, + 65238: 58525, + 65239: 58526, + 65240: 58527, + 65241: 58528, + 65242: 58529, + 65243: 58530, + 65244: 58531, + 65245: 58532, + 65246: 58533, + 65247: 58534, + 65248: 58535, + 65249: 58536, + 65250: 58537, + 65251: 58538, + 65252: 58539, + 65253: 58540, + 65254: 58541, + 65255: 58542, + 65256: 58543, + 65257: 58544, + 65258: 58545, + 65259: 58546, + 65260: 58547, + 65261: 58548, + 65262: 58549, + 65263: 58550, + 65264: 58551, + 65265: 58552, + 65266: 58553, + 65267: 58554, + 65268: 58555, + 65269: 58556, + 65270: 58557, + 65271: 58558, + 65272: 58559, + 65273: 58560, + 65274: 58561, + 65275: 58562, + 65276: undefined, + 65277: null, + 65278: last + }; +} + +for (var i = 0; i < 2; i++) { + var obj = getObject(); + print(obj[33088]); + print(obj[65275]); + print(obj[65276]); + print(obj[65277]); + print(obj[65278]); + var keys = Object.keys(obj); + print(obj[keys[0]]); + print(obj[keys[keys.length - 1]]); + print(keys.length); + obj[65275] = 0; + print(obj[65275]); +} +