--- a/.hgtags-top-repo Thu Jun 28 09:32:28 2012 -0700
+++ b/.hgtags-top-repo Wed Jul 05 18:15:17 2017 +0200
@@ -166,3 +166,4 @@
1ce5dc16416611c58b7480ca67a2eee5153498a6 jdk8-b42
661c9aae602bbd9766d12590800c90f1edd1d8dd jdk8-b43
e4f81a817447c3a4f6868f083c81c2fb1b15d44c jdk8-b44
+633f2378c904c92bb922a6e19e9f62fe8eac14af jdk8-b45
--- a/hotspot/.hgtags Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/.hgtags Wed Jul 05 18:15:17 2017 +0200
@@ -256,3 +256,5 @@
e77b8e0ed1f84e3e268239e276c7ab64fa573baa jdk8-b43
5ba29a1db46ecb80a321ca873adb56a3fe6ad320 hs24-b14
831e5c76a20af18f3c08c5a95ed31be0e128a010 jdk8-b44
+9d5f20961bc5846fa8d098d534effafbbdae0a58 jdk8-b45
+40e5a3f2907ed02b335c7caa8ecf068cc801380d hs24-b15
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -657,7 +657,7 @@
while (fr != null) {
trace.add(new StackTraceEntry(fr, getCDebugger()));
try {
- fr = fr.sender();
+ fr = fr.sender(t);
} catch (AddressException e) {
e.printStackTrace();
showMessageDialog("Error while walking stack; stack trace will be truncated\n(see console for details)",
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.bsd.amd64;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.bsd.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -51,8 +52,11 @@
return rbp;
}
- public CFrame sender() {
- if (rbp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+ Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+ if ( (rbp == null) || rbp.lessThan(rsp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -28,6 +28,7 @@
import sun.jvm.hotspot.debugger.bsd.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
+import sun.jvm.hotspot.debugger.x86.*;
final public class BsdX86CFrame extends BasicCFrame {
// package/class internals only
@@ -52,8 +53,11 @@
return ebp;
}
- public CFrame sender() {
- if (ebp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ X86ThreadContext context = (X86ThreadContext) thread.getContext();
+ Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+ if ( (ebp == null) || ebp.lessThan(esp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -34,7 +34,7 @@
public interface CFrame {
/** Returns null when no more frames on stack */
- public CFrame sender();
+ public CFrame sender(ThreadProxy th);
/** Get the program counter of this frame */
public Address pc();
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.cdbg.basic.amd64;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -43,8 +44,11 @@
this.pc = pc;
}
- public CFrame sender() {
- if (rbp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+ Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+ if ( (rbp == null) || rbp.lessThan(rsp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.cdbg.basic.x86;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.x86.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -43,8 +44,11 @@
this.pc = pc;
}
- public CFrame sender() {
- if (ebp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ X86ThreadContext context = (X86ThreadContext) thread.getContext();
+ Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+ if ( (ebp == null) || ebp.lessThan(esp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -25,6 +25,7 @@
package sun.jvm.hotspot.debugger.linux.amd64;
import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.debugger.amd64.*;
import sun.jvm.hotspot.debugger.linux.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
@@ -51,8 +52,11 @@
return rbp;
}
- public CFrame sender() {
- if (rbp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
+ Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
+
+ if ( (rbp == null) || rbp.lessThan(rsp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -57,7 +57,7 @@
return sp;
}
- public CFrame sender() {
+ public CFrame sender(ThreadProxy thread) {
if (sp == null) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -28,6 +28,7 @@
import sun.jvm.hotspot.debugger.linux.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.debugger.cdbg.basic.*;
+import sun.jvm.hotspot.debugger.x86.*;
final public class LinuxX86CFrame extends BasicCFrame {
// package/class internals only
@@ -52,8 +53,11 @@
return ebp;
}
- public CFrame sender() {
- if (ebp == null) {
+ public CFrame sender(ThreadProxy thread) {
+ X86ThreadContext context = (X86ThreadContext) thread.getContext();
+ Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP);
+
+ if ( (ebp == null) || ebp.lessThan(esp) ) {
return null;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -37,7 +37,7 @@
return fp;
}
- public CFrame sender() {
+ public CFrame sender(ThreadProxy t) {
return sender;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -141,18 +141,19 @@
public static String stringOopToString(Oop stringOop) {
if (offsetField == null) {
InstanceKlass k = (InstanceKlass) stringOop.getKlass();
- offsetField = (IntField) k.findField("offset", "I");
- countField = (IntField) k.findField("count", "I");
+ offsetField = (IntField) k.findField("offset", "I"); // optional
+ countField = (IntField) k.findField("count", "I"); // optional
valueField = (OopField) k.findField("value", "[C");
if (Assert.ASSERTS_ENABLED) {
- Assert.that(offsetField != null &&
- countField != null &&
- valueField != null, "must find all java.lang.String fields");
+ Assert.that(valueField != null, "Field \'value\' of java.lang.String not found");
}
}
- return charArrayToString((TypeArray) valueField.getValue(stringOop),
- offsetField.getValue(stringOop),
- countField.getValue(stringOop));
+ if (offsetField != null && countField != null) {
+ return charArrayToString((TypeArray) valueField.getValue(stringOop),
+ offsetField.getValue(stringOop),
+ countField.getValue(stringOop));
+ }
+ return charArrayToString((TypeArray) valueField.getValue(stringOop));
}
public static String stringOopToEscapedString(Oop stringOop) {
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -158,7 +158,7 @@
printUnknown(out);
}
}
- f = f.sender();
+ f = f.sender(th);
}
} catch (Exception exp) {
exp.printStackTrace();
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -85,6 +85,21 @@
this(new ProcImageClassLoader());
}
+ static void debugPrintln(String msg) {
+ if (DEBUG) {
+ System.err.println("DEBUG>" + msg);
+ }
+ }
+
+ static void debugPrintStackTrace(Exception exp) {
+ if (DEBUG) {
+ StackTraceElement[] els = exp.getStackTrace();
+ for (int i = 0; i < els.length; i++) {
+ System.err.println("DEBUG>" + els[i].toString());
+ }
+ }
+ }
+
public Object readObject(Oop oop) throws ClassNotFoundException {
if (oop instanceof Instance) {
return readInstance((Instance) oop);
@@ -120,13 +135,96 @@
}
protected Symbol javaLangString;
+ protected Symbol javaUtilHashtableEntry;
+ protected Symbol javaUtilHashtable;
+ protected Symbol javaUtilProperties;
+
+ protected Symbol getVMSymbol(String name) {
+ return VM.getVM().getSymbolTable().probe(name);
+ }
+
protected Symbol javaLangString() {
if (javaLangString == null) {
- javaLangString = VM.getVM().getSymbolTable().probe("java/lang/String");
+ javaLangString = getVMSymbol("java/lang/String");
}
return javaLangString;
}
+ protected Symbol javaUtilHashtableEntry() {
+ if (javaUtilHashtableEntry == null) {
+ javaUtilHashtableEntry = getVMSymbol("java/util/Hashtable$Entry");
+ }
+ return javaUtilHashtableEntry;
+ }
+
+ protected Symbol javaUtilHashtable() {
+ if (javaUtilHashtable == null) {
+ javaUtilHashtable = getVMSymbol("java/util/Hashtable");
+ }
+ return javaUtilHashtable;
+ }
+
+ protected Symbol javaUtilProperties() {
+ if (javaUtilProperties == null) {
+ javaUtilProperties = getVMSymbol("java/util/Properties");
+ }
+ return javaUtilProperties;
+ }
+
+ private void setHashtableEntry(java.util.Hashtable p, Oop oop) {
+ InstanceKlass ik = (InstanceKlass)oop.getKlass();
+ OopField keyField = (OopField)ik.findField("key", "Ljava/lang/Object;");
+ OopField valueField = (OopField)ik.findField("value", "Ljava/lang/Object;");
+ OopField nextField = (OopField)ik.findField("next", "Ljava/util/Hashtable$Entry;");
+ if (DEBUG) {
+ if (Assert.ASSERTS_ENABLED) {
+ Assert.that(ik.getName().equals(javaUtilHashtableEntry()), "Not a Hashtable$Entry?");
+ Assert.that(keyField != null && valueField != null && nextField != null, "Invalid fields!");
+ }
+ }
+
+ Object key = null;
+ Object value = null;
+ Oop next = null;
+ try {
+ key = readObject(keyField.getValue(oop));
+ value = readObject(valueField.getValue(oop));
+ next = (Oop)nextField.getValue(oop);
+ // For Properties, should use setProperty(k, v). Since it only runs in SA
+ // using put(k, v) should be OK.
+ p.put(key, value);
+ if (next != null) {
+ setHashtableEntry(p, next);
+ }
+ } catch (ClassNotFoundException ce) {
+ if( DEBUG) {
+ debugPrintln("Class not found " + ce);
+ debugPrintStackTrace(ce);
+ }
+ }
+ }
+
+ protected Object getHashtable(Instance oop, boolean isProperties) {
+ InstanceKlass k = (InstanceKlass)oop.getKlass();
+ OopField tableField = (OopField)k.findField("table", "[Ljava/util/Hashtable$Entry;");
+ if (tableField == null) {
+ debugPrintln("Could not find field of [Ljava/util/Hashtable$Entry;");
+ return null;
+ }
+ java.util.Hashtable table = (isProperties) ? new java.util.Properties()
+ : new java.util.Hashtable();
+ ObjArray kvs = (ObjArray)tableField.getValue(oop);
+ long size = kvs.getLength();
+ debugPrintln("Hashtable$Entry Size = " + size);
+ for (long i=0; i<size; i++) {
+ Oop entry = kvs.getObjAt(i);
+ if (entry != null && entry.isInstance()) {
+ setHashtableEntry(table, entry);
+ }
+ }
+ return table;
+ }
+
public Object readInstance(Instance oop) throws ClassNotFoundException {
Object result = getFromObjTable(oop);
if (result == null) {
@@ -134,11 +232,21 @@
// Handle java.lang.String instances differently. As part of JSR-133, fields of immutable
// classes have been made final. The algorithm below will not be able to read Strings from
// debuggee (can't use reflection to set final fields). But, need to read Strings is very
- // important. FIXME: need a framework to handle many other special cases.
+ // important.
+ // Same for Hashtable, key and hash are final, could not be set in the algorithm too.
+ // FIXME: need a framework to handle many other special cases.
if (kls.getName().equals(javaLangString())) {
return OopUtilities.stringOopToString(oop);
}
+ if (kls.getName().equals(javaUtilHashtable())) {
+ return getHashtable(oop, false);
+ }
+
+ if (kls.getName().equals(javaUtilProperties())) {
+ return getHashtable(oop, true);
+ }
+
Class clz = readClass(kls);
try {
result = clz.newInstance();
@@ -164,8 +272,8 @@
break;
} catch (Exception exp) {
if (DEBUG) {
- System.err.println("Can't create object using " + c);
- exp.printStackTrace();
+ debugPrintln("Can't create object using " + c);
+ debugPrintStackTrace(exp);
}
}
}
@@ -329,8 +437,8 @@
arrayObj[ifd.getIndex()] = readObject(field.getValue(getObj()));
} catch (Exception e) {
if (DEBUG) {
- System.err.println("Array element set failed for " + ifd);
- e.printStackTrace();
+ debugPrintln("Array element set failed for " + ifd);
+ debugPrintStackTrace(e);
}
}
}
@@ -348,8 +456,8 @@
private void printFieldSetError(java.lang.reflect.Field f, Exception ex) {
if (DEBUG) {
- if (f != null) System.err.println("Field set failed for " + f);
- ex.printStackTrace();
+ if (f != null) debugPrintln("Field set failed for " + f);
+ debugPrintStackTrace(ex);
}
}
@@ -601,7 +709,7 @@
return Class.forName(className, true, cl);
} catch (Exception e) {
if (DEBUG) {
- System.err.println("Can't load class " + className);
+ debugPrintln("Can't load class " + className);
}
throw new RuntimeException(e);
}
--- a/hotspot/make/bsd/makefiles/universal.gmk Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/bsd/makefiles/universal.gmk Wed Jul 05 18:15:17 2017 +0200
@@ -110,4 +110,5 @@
.PHONY: universal_product universal_fastdebug universal_debug \
all_product_universal all_fastdebug_universal all_debug_universal \
- universalize export_universal copy_universal
+ universalize export_universal copy_universal \
+ $(UNIVERSAL_LIPO_LIST) $(UNIVERSAL_COPY_LIST)
--- a/hotspot/make/hotspot_version Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/hotspot_version Wed Jul 05 18:15:17 2017 +0200
@@ -35,7 +35,7 @@
HS_MAJOR_VER=24
HS_MINOR_VER=0
-HS_BUILD_NUMBER=14
+HS_BUILD_NUMBER=15
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
--- a/hotspot/make/jprt.properties Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/jprt.properties Wed Jul 05 18:15:17 2017 +0200
@@ -102,6 +102,11 @@
jprt.my.linux.armvfp.jdk7u6=${jprt.my.linux.armvfp.jdk7}
jprt.my.linux.armvfp=${jprt.my.linux.armvfp.${jprt.tools.default.release}}
+jprt.my.linux.armv6.jdk8=linux_armv6_2.6
+jprt.my.linux.armv6.jdk7=linux_armv6_2.6
+jprt.my.linux.armv6.jdk7u6=${jprt.my.linux.armv6.jdk7}
+jprt.my.linux.armv6=${jprt.my.linux.armv6.${jprt.tools.default.release}}
+
jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6
jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6
jprt.my.linux.armsflt.jdk7u6=${jprt.my.linux.armsflt.jdk7}
@@ -134,7 +139,7 @@
${jprt.my.macosx.x64}-{product|fastdebug|debug}, \
${jprt.my.windows.i586}-{product|fastdebug|debug}, \
${jprt.my.windows.x64}-{product|fastdebug|debug}, \
- ${jprt.my.linux.armvfp}-{product|fastdebug}
+ ${jprt.my.linux.armv6}-{product|fastdebug}
jprt.build.targets.open= \
${jprt.my.solaris.i586}-{productOpen}, \
--- a/hotspot/make/pic.make Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/pic.make Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 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
@@ -30,6 +30,13 @@
ifneq ($(OSNAME), windows)
ifndef LP64
+ PARTIAL_NONPIC=1
+ endif
+ PIC_ARCH = ppc
+ ifneq ("$(filter $(PIC_ARCH),$(BUILDARCH))","")
+ PARTIAL_NONPIC=0
+ endif
+ ifeq ($(PARTIAL_NONPIC),1)
NONPIC_DIRS = memory oops gc_implementation gc_interface
NONPIC_DIRS := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
# Look for source files under NONPIC_DIRS
--- a/hotspot/make/solaris/makefiles/add_gnu_debuglink.make Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/solaris/makefiles/add_gnu_debuglink.make Wed Jul 05 18:15:17 2017 +0200
@@ -24,8 +24,11 @@
# Rules to build add_gnu_debuglink, used by vm.make on Solaris
-GENERATED = ../generated
-ADD_GNU_DEBUGLINK = $(GENERATED)/add_gnu_debuglink
+# Allow $(ADD_GNU_DEBUGLINK) to be called from any directory.
+# We don't set or use the GENERATED macro to avoid affecting
+# other HotSpot Makefiles.
+TOPDIR = $(shell echo `pwd`)
+ADD_GNU_DEBUGLINK = $(TOPDIR)/../generated/add_gnu_debuglink
ADD_GNU_DEBUGLINK_DIR = $(GAMMADIR)/src/os/solaris/add_gnu_debuglink
ADD_GNU_DEBUGLINK_SRC = $(ADD_GNU_DEBUGLINK_DIR)/add_gnu_debuglink.c
--- a/hotspot/make/solaris/makefiles/defs.make Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/solaris/makefiles/defs.make Wed Jul 05 18:15:17 2017 +0200
@@ -203,10 +203,18 @@
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.diz
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.diz
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.diz
+ ifeq ($(ARCH_DATA_MODEL),32)
+ EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.diz
+ EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.diz
+ endif
else
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.debuginfo
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.debuginfo
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.debuginfo
+ ifeq ($(ARCH_DATA_MODEL),32)
+ EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.debuginfo
+ EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.debuginfo
+ endif
endif
endif
endif
--- a/hotspot/make/solaris/makefiles/dtrace.make Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/solaris/makefiles/dtrace.make Wed Jul 05 18:15:17 2017 +0200
@@ -94,23 +94,24 @@
# Making 64/libjvm_db.so: 64-bit version of libjvm_db.so which handles 32-bit libjvm.so
ifneq ("${ISA}","${BUILDARCH}")
-XLIBJVM_DB = 64/$(LIBJVM_DB)
-XLIBJVM_DB_G = 64/$(LIBJVM_DB_G)
-XLIBJVM_DTRACE = 64/$(LIBJVM_DTRACE)
-XLIBJVM_DTRACE_G = 64/$(LIBJVM_DTRACE_G)
+XLIBJVM_DIR = 64
+XLIBJVM_DB = $(XLIBJVM_DIR)/$(LIBJVM_DB)
+XLIBJVM_DB_G = $(XLIBJVM_DIR)/$(LIBJVM_DB_G)
+XLIBJVM_DTRACE = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE)
+XLIBJVM_DTRACE_G = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G)
-XLIBJVM_DB_DEBUGINFO = 64/$(LIBJVM_DB_DEBUGINFO)
-XLIBJVM_DB_DIZ = 64/$(LIBJVM_DB_DIZ)
-XLIBJVM_DB_G_DEBUGINFO = 64/$(LIBJVM_DB_G_DEBUGINFO)
-XLIBJVM_DB_G_DIZ = 64/$(LIBJVM_DB_G_DIZ)
-XLIBJVM_DTRACE_DEBUGINFO = 64/$(LIBJVM_DTRACE_DEBUGINFO)
-XLIBJVM_DTRACE_DIZ = 64/$(LIBJVM_DTRACE_DIZ)
-XLIBJVM_DTRACE_G_DEBUGINFO = 64/$(LIBJVM_DTRACE_G_DEBUGINFO)
-XLIBJVM_DTRACE_G_DIZ = 64/$(LIBJVM_DTRACE_G_DIZ)
+XLIBJVM_DB_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DB_DEBUGINFO)
+XLIBJVM_DB_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DB_DIZ)
+XLIBJVM_DB_G_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DB_G_DEBUGINFO)
+XLIBJVM_DB_G_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DB_G_DIZ)
+XLIBJVM_DTRACE_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DEBUGINFO)
+XLIBJVM_DTRACE_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DIZ)
+XLIBJVM_DTRACE_G_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G_DEBUGINFO)
+XLIBJVM_DTRACE_G_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_G_DIZ)
$(XLIBJVM_DB): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE)
@echo Making $@
- $(QUIETLY) mkdir -p 64/ ; \
+ $(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. -I$(GENERATED) \
$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
[ -f $(XLIBJVM_DB_G) ] || { ln -s $(LIBJVM_DB) $(XLIBJVM_DB_G); }
@@ -124,8 +125,10 @@
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DB_DEBUGINFO)
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
-# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(XLIBJVM_DB_DEBUGINFO) $@
- $(QUIETLY) $(ADD_GNU_DEBUGLINK) $(XLIBJVM_DB_DEBUGINFO) $@
+# $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) ;
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the link name:
+ ( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) )
ifeq ($(STRIP_POLICY),all_strip)
$(QUIETLY) $(STRIP) $@
else
@@ -134,17 +137,19 @@
# implied else here is no stripping at all
endif
endif
- [ -f $(XLIBJVM_DB_G_DEBUGINFO) ] || { ln -s $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO); }
+ [ -f $(XLIBJVM_DB_G_DEBUGINFO) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB_G_DEBUGINFO); }
ifeq ($(ZIP_DEBUGINFO_FILES),1)
- $(ZIPEXE) -q -y $(XLIBJVM_DB_DIZ) $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO)
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the archived name:
+ ( cd $(XLIBJVM_DIR) && $(ZIPEXE) -q -y $(LIBJVM_DB_DIZ) $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB_G_DEBUGINFO) )
$(RM) $(XLIBJVM_DB_DEBUGINFO) $(XLIBJVM_DB_G_DEBUGINFO)
- [ -f $(XLIBJVM_DB_G_DIZ) ] || { ln -s $(XLIBJVM_DB_DIZ) $(XLIBJVM_DB_G_DIZ); }
+ [ -f $(XLIBJVM_DB_G_DIZ) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DB_DIZ) $(LIBJVM_DB_G_DIZ); }
endif
endif
$(XLIBJVM_DTRACE): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
@echo Making $@
- $(QUIETLY) mkdir -p 64/ ; \
+ $(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. \
$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
[ -f $(XLIBJVM_DTRACE_G) ] || { ln -s $(LIBJVM_DTRACE) $(XLIBJVM_DTRACE_G); }
@@ -153,8 +158,10 @@
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DTRACE_DEBUGINFO)
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
-# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(XLIBJVM_DTRACE_DEBUGINFO) $@
- $(QUIETLY) $(ADD_GNU_DEBUGLINK) $(XLIBJVM_DTRACE_DEBUGINFO) $@
+# $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) ;
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the link name:
+ ( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) )
ifeq ($(STRIP_POLICY),all_strip)
$(QUIETLY) $(STRIP) $@
else
@@ -163,11 +170,13 @@
# implied else here is no stripping at all
endif
endif
- [ -f $(XLIBJVM_DTRACE_G_DEBUGINFO) ] || { ln -s $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO); }
+ [ -f $(XLIBJVM_DTRACE_G_DEBUGINFO) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE_G_DEBUGINFO); }
ifeq ($(ZIP_DEBUGINFO_FILES),1)
- $(ZIPEXE) -q -y $(XLIBJVM_DTRACE_DIZ) $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO)
+# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
+# in the archived name:
+ ( cd $(XLIBJVM_DIR) && $(ZIPEXE) -q -y $(LIBJVM_DTRACE_DIZ) $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE_G_DEBUGINFO) )
$(RM) $(XLIBJVM_DTRACE_DEBUGINFO) $(XLIBJVM_DTRACE_G_DEBUGINFO)
- [ -f $(XLIBJVM_DTRACE_G_DIZ) ] || { ln -s $(XLIBJVM_DTRACE_DIZ) $(XLIBJVM_DTRACE_G_DIZ); }
+ [ -f $(XLIBJVM_DTRACE_G_DIZ) ] || { cd $(XLIBJVM_DIR) && ln -s $(LIBJVM_DTRACE_DIZ) $(LIBJVM_DTRACE_G_DIZ); }
endif
endif
--- a/hotspot/make/solaris/makefiles/fix_empty_sec_hdr_flags.make Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/make/solaris/makefiles/fix_empty_sec_hdr_flags.make Wed Jul 05 18:15:17 2017 +0200
@@ -24,8 +24,11 @@
# Rules to build fix_empty_sec_hdr_flags, used by vm.make on Solaris
-GENERATED = ../generated
-FIX_EMPTY_SEC_HDR_FLAGS = $(GENERATED)/fix_empty_sec_hdr_flags
+# Allow $(FIX_EMPTY_SEC_HDR_FLAGS) to be called from any directory.
+# We don't set or use the GENERATED macro to avoid affecting
+# other HotSpot Makefiles.
+TOPDIR = $(shell echo `pwd`)
+FIX_EMPTY_SEC_HDR_FLAGS = $(TOPDIR)/../generated/fix_empty_sec_hdr_flags
FIX_EMPTY_SEC_HDR_FLAGS_DIR = $(GAMMADIR)/src/os/solaris/fix_empty_sec_hdr_flags
FIX_EMPTY_SEC_HDR_FLAGS_SRC = $(FIX_EMPTY_SEC_HDR_FLAGS_DIR)/fix_empty_sec_hdr_flags.c
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
//
-// Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 1998, 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
@@ -678,18 +678,26 @@
static inline jdouble replicate_immI(int con, int count, int width) {
// Load a constant replicated "count" times with width "width"
+ assert(count*width == 8 && width <= 4, "sanity");
int bit_width = width * 8;
- jlong elt_val = con;
- elt_val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits
- jlong val = elt_val;
+ jlong val = con;
+ val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits
for (int i = 0; i < count - 1; i++) {
- val <<= bit_width;
- val |= elt_val;
+ val |= (val << bit_width);
}
jdouble dval = *((jdouble*) &val); // coerce to double type
return dval;
}
+static inline jdouble replicate_immF(float con) {
+ // Replicate float con 2 times and pack into vector.
+ int val = *((int*)&con);
+ jlong lval = val;
+ lval = (lval << 32) | (lval & 0xFFFFFFFFl);
+ jdouble dval = *((jdouble*) &lval); // coerce to double type
+ return dval;
+}
+
// Standard Sparc opcode form2 field breakdown
static inline void emit2_19(CodeBuffer &cbuf, int f30, int f29, int f25, int f22, int f20, int f19, int f0 ) {
f0 &= (1<<19)-1; // Mask displacement to 19 bits
@@ -791,6 +799,7 @@
case Assembler::stdf_op3: st_op = Op_StoreD; break;
case Assembler::ldsb_op3: ld_op = Op_LoadB; break;
+ case Assembler::ldub_op3: ld_op = Op_LoadUB; break;
case Assembler::lduh_op3: ld_op = Op_LoadUS; break;
case Assembler::ldsh_op3: ld_op = Op_LoadS; break;
case Assembler::ldx_op3: // may become LoadP or stay LoadI
@@ -799,7 +808,6 @@
case Assembler::ldd_op3: ld_op = Op_LoadL; break;
case Assembler::ldf_op3: ld_op = Op_LoadF; break;
case Assembler::lddf_op3: ld_op = Op_LoadD; break;
- case Assembler::ldub_op3: ld_op = Op_LoadB; break;
case Assembler::prefetch_op3: ld_op = Op_LoadI; break;
default: ShouldNotReachHere();
@@ -840,10 +848,7 @@
!(n->ideal_Opcode()==Op_PrefetchRead && ld_op==Op_LoadI) &&
!(n->ideal_Opcode()==Op_PrefetchWrite && ld_op==Op_LoadI) &&
!(n->ideal_Opcode()==Op_PrefetchAllocation && ld_op==Op_LoadI) &&
- !(n->ideal_Opcode()==Op_Load2I && ld_op==Op_LoadD) &&
- !(n->ideal_Opcode()==Op_Load4C && ld_op==Op_LoadD) &&
- !(n->ideal_Opcode()==Op_Load4S && ld_op==Op_LoadD) &&
- !(n->ideal_Opcode()==Op_Load8B && ld_op==Op_LoadD) &&
+ !(n->ideal_Opcode()==Op_LoadVector && ld_op==Op_LoadD) &&
!(n->rule() == loadUB_rule)) {
verify_oops_warning(n, n->ideal_Opcode(), ld_op);
}
@@ -855,9 +860,7 @@
!(n->ideal_Opcode()==Op_StoreI && st_op==Op_StoreF) &&
!(n->ideal_Opcode()==Op_StoreF && st_op==Op_StoreI) &&
!(n->ideal_Opcode()==Op_StoreL && st_op==Op_StoreI) &&
- !(n->ideal_Opcode()==Op_Store2I && st_op==Op_StoreD) &&
- !(n->ideal_Opcode()==Op_Store4C && st_op==Op_StoreD) &&
- !(n->ideal_Opcode()==Op_Store8B && st_op==Op_StoreD) &&
+ !(n->ideal_Opcode()==Op_StoreVector && st_op==Op_StoreD) &&
!(n->ideal_Opcode()==Op_StoreD && st_op==Op_StoreI && n->rule() == storeD0_rule)) {
verify_oops_warning(n, n->ideal_Opcode(), st_op);
}
@@ -1849,16 +1852,45 @@
address last_rethrow = NULL; // debugging aid for Rethrow encoding
#endif
+// Map Types to machine register types
+const int Matcher::base2reg[Type::lastype] = {
+ Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN,
+ Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */
+ 0, Op_RegD, 0, 0, /* Vectors */
+ Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */
+ 0, 0/*abio*/,
+ Op_RegP /* Return address */, 0, /* the memories */
+ Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD,
+ 0 /*bottom*/
+};
+
// Vector width in bytes
-const uint Matcher::vector_width_in_bytes(void) {
+const int Matcher::vector_width_in_bytes(BasicType bt) {
+ assert(MaxVectorSize == 8, "");
return 8;
}
// Vector ideal reg
-const uint Matcher::vector_ideal_reg(void) {
+const int Matcher::vector_ideal_reg(int size) {
+ assert(MaxVectorSize == 8, "");
return Op_RegD;
}
+// Limits on vector size (number of elements) loaded into vector.
+const int Matcher::max_vector_size(const BasicType bt) {
+ assert(is_java_primitive(bt), "only primitive type vectors");
+ return vector_width_in_bytes(bt)/type2aelembytes(bt);
+}
+
+const int Matcher::min_vector_size(const BasicType bt) {
+ return max_vector_size(bt); // Same as max.
+}
+
+// SPARC doesn't support misaligned vectors store/load.
+const bool Matcher::misaligned_vectors_ok() {
+ return false;
+}
+
// USII supports fxtof through the whole range of number, USIII doesn't
const bool Matcher::convL2FSupported(void) {
return VM_Version::has_fast_fxtof();
@@ -3125,50 +3157,6 @@
__ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad) );
%}
- enc_class enc_repl8b( iRegI src, iRegL dst ) %{
- MacroAssembler _masm(&cbuf);
- Register src_reg = reg_to_register_object($src$$reg);
- Register dst_reg = reg_to_register_object($dst$$reg);
- __ sllx(src_reg, 56, dst_reg);
- __ srlx(dst_reg, 8, O7);
- __ or3 (dst_reg, O7, dst_reg);
- __ srlx(dst_reg, 16, O7);
- __ or3 (dst_reg, O7, dst_reg);
- __ srlx(dst_reg, 32, O7);
- __ or3 (dst_reg, O7, dst_reg);
- %}
-
- enc_class enc_repl4b( iRegI src, iRegL dst ) %{
- MacroAssembler _masm(&cbuf);
- Register src_reg = reg_to_register_object($src$$reg);
- Register dst_reg = reg_to_register_object($dst$$reg);
- __ sll(src_reg, 24, dst_reg);
- __ srl(dst_reg, 8, O7);
- __ or3(dst_reg, O7, dst_reg);
- __ srl(dst_reg, 16, O7);
- __ or3(dst_reg, O7, dst_reg);
- %}
-
- enc_class enc_repl4s( iRegI src, iRegL dst ) %{
- MacroAssembler _masm(&cbuf);
- Register src_reg = reg_to_register_object($src$$reg);
- Register dst_reg = reg_to_register_object($dst$$reg);
- __ sllx(src_reg, 48, dst_reg);
- __ srlx(dst_reg, 16, O7);
- __ or3 (dst_reg, O7, dst_reg);
- __ srlx(dst_reg, 32, O7);
- __ or3 (dst_reg, O7, dst_reg);
- %}
-
- enc_class enc_repl2i( iRegI src, iRegL dst ) %{
- MacroAssembler _masm(&cbuf);
- Register src_reg = reg_to_register_object($src$$reg);
- Register dst_reg = reg_to_register_object($dst$$reg);
- __ sllx(src_reg, 32, dst_reg);
- __ srlx(dst_reg, 32, O7);
- __ or3 (dst_reg, O7, dst_reg);
- %}
-
%}
//----------FRAME--------------------------------------------------------------
@@ -5932,50 +5920,6 @@
ins_pipe(iload_mem);
%}
-// Load Aligned Packed Byte into a Double Register
-instruct loadA8B(regD dst, memory mem) %{
- match(Set dst (Load8B mem));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "LDDF $mem,$dst\t! packed8B" %}
- opcode(Assembler::lddf_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
- ins_pipe(floadD_mem);
-%}
-
-// Load Aligned Packed Char into a Double Register
-instruct loadA4C(regD dst, memory mem) %{
- match(Set dst (Load4C mem));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "LDDF $mem,$dst\t! packed4C" %}
- opcode(Assembler::lddf_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
- ins_pipe(floadD_mem);
-%}
-
-// Load Aligned Packed Short into a Double Register
-instruct loadA4S(regD dst, memory mem) %{
- match(Set dst (Load4S mem));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "LDDF $mem,$dst\t! packed4S" %}
- opcode(Assembler::lddf_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
- ins_pipe(floadD_mem);
-%}
-
-// Load Aligned Packed Int into a Double Register
-instruct loadA2I(regD dst, memory mem) %{
- match(Set dst (Load2I mem));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "LDDF $mem,$dst\t! packed2I" %}
- opcode(Assembler::lddf_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
- ins_pipe(floadD_mem);
-%}
-
// Load Range
instruct loadRange(iRegI dst, memory mem) %{
match(Set dst (LoadRange mem));
@@ -6599,17 +6543,6 @@
ins_pipe(fstoreF_mem_zero);
%}
-// Store Aligned Packed Bytes in Double register to memory
-instruct storeA8B(memory mem, regD src) %{
- match(Set mem (Store8B mem src));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "STDF $src,$mem\t! packed8B" %}
- opcode(Assembler::stdf_op3);
- ins_encode(simple_form3_mem_reg( mem, src ) );
- ins_pipe(fstoreD_mem_reg);
-%}
-
// Convert oop pointer into compressed form
instruct encodeHeapOop(iRegN dst, iRegP src) %{
predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
@@ -6654,62 +6587,6 @@
%}
-// Store Zero into Aligned Packed Bytes
-instruct storeA8B0(memory mem, immI0 zero) %{
- match(Set mem (Store8B mem zero));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "STX $zero,$mem\t! packed8B" %}
- opcode(Assembler::stx_op3);
- ins_encode(simple_form3_mem_reg( mem, R_G0 ) );
- ins_pipe(fstoreD_mem_zero);
-%}
-
-// Store Aligned Packed Chars/Shorts in Double register to memory
-instruct storeA4C(memory mem, regD src) %{
- match(Set mem (Store4C mem src));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "STDF $src,$mem\t! packed4C" %}
- opcode(Assembler::stdf_op3);
- ins_encode(simple_form3_mem_reg( mem, src ) );
- ins_pipe(fstoreD_mem_reg);
-%}
-
-// Store Zero into Aligned Packed Chars/Shorts
-instruct storeA4C0(memory mem, immI0 zero) %{
- match(Set mem (Store4C mem (Replicate4C zero)));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "STX $zero,$mem\t! packed4C" %}
- opcode(Assembler::stx_op3);
- ins_encode(simple_form3_mem_reg( mem, R_G0 ) );
- ins_pipe(fstoreD_mem_zero);
-%}
-
-// Store Aligned Packed Ints in Double register to memory
-instruct storeA2I(memory mem, regD src) %{
- match(Set mem (Store2I mem src));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "STDF $src,$mem\t! packed2I" %}
- opcode(Assembler::stdf_op3);
- ins_encode(simple_form3_mem_reg( mem, src ) );
- ins_pipe(fstoreD_mem_reg);
-%}
-
-// Store Zero into Aligned Packed Ints
-instruct storeA2I0(memory mem, immI0 zero) %{
- match(Set mem (Store2I mem zero));
- ins_cost(MEMORY_REF_COST);
- size(4);
- format %{ "STX $zero,$mem\t! packed2I" %}
- opcode(Assembler::stx_op3);
- ins_encode(simple_form3_mem_reg( mem, R_G0 ) );
- ins_pipe(fstoreD_mem_zero);
-%}
-
-
//----------MemBar Instructions-----------------------------------------------
// Memory barrier flavors
@@ -8880,150 +8757,6 @@
ins_pipe(ialu_reg_imm);
%}
-// Replicate scalar to packed byte values in Double register
-instruct Repl8B_reg_helper(iRegL dst, iRegI src) %{
- effect(DEF dst, USE src);
- format %{ "SLLX $src,56,$dst\n\t"
- "SRLX $dst, 8,O7\n\t"
- "OR $dst,O7,$dst\n\t"
- "SRLX $dst,16,O7\n\t"
- "OR $dst,O7,$dst\n\t"
- "SRLX $dst,32,O7\n\t"
- "OR $dst,O7,$dst\t! replicate8B" %}
- ins_encode( enc_repl8b(src, dst));
- ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed byte values in Double register
-instruct Repl8B_reg(stackSlotD dst, iRegI src) %{
- match(Set dst (Replicate8B src));
- expand %{
- iRegL tmp;
- Repl8B_reg_helper(tmp, src);
- regL_to_stkD(dst, tmp);
- %}
-%}
-
-// Replicate scalar constant to packed byte values in Double register
-instruct Repl8B_immI(regD dst, immI13 con, o7RegI tmp) %{
- match(Set dst (Replicate8B con));
- effect(KILL tmp);
- format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl8B($con)" %}
- ins_encode %{
- // XXX This is a quick fix for 6833573.
- //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 8, 1)), $dst$$FloatRegister);
- RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 8, 1)), $tmp$$Register);
- __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
- %}
- ins_pipe(loadConFD);
-%}
-
-// Replicate scalar to packed char values into stack slot
-instruct Repl4C_reg_helper(iRegL dst, iRegI src) %{
- effect(DEF dst, USE src);
- format %{ "SLLX $src,48,$dst\n\t"
- "SRLX $dst,16,O7\n\t"
- "OR $dst,O7,$dst\n\t"
- "SRLX $dst,32,O7\n\t"
- "OR $dst,O7,$dst\t! replicate4C" %}
- ins_encode( enc_repl4s(src, dst) );
- ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed char values into stack slot
-instruct Repl4C_reg(stackSlotD dst, iRegI src) %{
- match(Set dst (Replicate4C src));
- expand %{
- iRegL tmp;
- Repl4C_reg_helper(tmp, src);
- regL_to_stkD(dst, tmp);
- %}
-%}
-
-// Replicate scalar constant to packed char values in Double register
-instruct Repl4C_immI(regD dst, immI con, o7RegI tmp) %{
- match(Set dst (Replicate4C con));
- effect(KILL tmp);
- format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4C($con)" %}
- ins_encode %{
- // XXX This is a quick fix for 6833573.
- //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
- RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
- __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
- %}
- ins_pipe(loadConFD);
-%}
-
-// Replicate scalar to packed short values into stack slot
-instruct Repl4S_reg_helper(iRegL dst, iRegI src) %{
- effect(DEF dst, USE src);
- format %{ "SLLX $src,48,$dst\n\t"
- "SRLX $dst,16,O7\n\t"
- "OR $dst,O7,$dst\n\t"
- "SRLX $dst,32,O7\n\t"
- "OR $dst,O7,$dst\t! replicate4S" %}
- ins_encode( enc_repl4s(src, dst) );
- ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed short values into stack slot
-instruct Repl4S_reg(stackSlotD dst, iRegI src) %{
- match(Set dst (Replicate4S src));
- expand %{
- iRegL tmp;
- Repl4S_reg_helper(tmp, src);
- regL_to_stkD(dst, tmp);
- %}
-%}
-
-// Replicate scalar constant to packed short values in Double register
-instruct Repl4S_immI(regD dst, immI con, o7RegI tmp) %{
- match(Set dst (Replicate4S con));
- effect(KILL tmp);
- format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4S($con)" %}
- ins_encode %{
- // XXX This is a quick fix for 6833573.
- //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
- RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
- __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
- %}
- ins_pipe(loadConFD);
-%}
-
-// Replicate scalar to packed int values in Double register
-instruct Repl2I_reg_helper(iRegL dst, iRegI src) %{
- effect(DEF dst, USE src);
- format %{ "SLLX $src,32,$dst\n\t"
- "SRLX $dst,32,O7\n\t"
- "OR $dst,O7,$dst\t! replicate2I" %}
- ins_encode( enc_repl2i(src, dst));
- ins_pipe(ialu_reg);
-%}
-
-// Replicate scalar to packed int values in Double register
-instruct Repl2I_reg(stackSlotD dst, iRegI src) %{
- match(Set dst (Replicate2I src));
- expand %{
- iRegL tmp;
- Repl2I_reg_helper(tmp, src);
- regL_to_stkD(dst, tmp);
- %}
-%}
-
-// Replicate scalar zero constant to packed int values in Double register
-instruct Repl2I_immI(regD dst, immI con, o7RegI tmp) %{
- match(Set dst (Replicate2I con));
- effect(KILL tmp);
- format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2I($con)" %}
- ins_encode %{
- // XXX This is a quick fix for 6833573.
- //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 2, 4)), $dst$$FloatRegister);
- RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 2, 4)), $tmp$$Register);
- __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
- %}
- ins_pipe(loadConFD);
-%}
-
//----------Control Flow Instructions------------------------------------------
// Compare Instructions
// Compare Integers
@@ -10742,6 +10475,308 @@
ins_pipe(istore_mem_reg);
%}
+// ====================VECTOR INSTRUCTIONS=====================================
+
+// Load Aligned Packed values into a Double Register
+instruct loadV8(regD dst, memory mem) %{
+ predicate(n->as_LoadVector()->memory_size() == 8);
+ match(Set dst (LoadVector mem));
+ ins_cost(MEMORY_REF_COST);
+ size(4);
+ format %{ "LDDF $mem,$dst\t! load vector (8 bytes)" %}
+ ins_encode %{
+ __ ldf(FloatRegisterImpl::D, $mem$$Address, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(floadD_mem);
+%}
+
+// Store Vector in Double register to memory
+instruct storeV8(memory mem, regD src) %{
+ predicate(n->as_StoreVector()->memory_size() == 8);
+ match(Set mem (StoreVector mem src));
+ ins_cost(MEMORY_REF_COST);
+ size(4);
+ format %{ "STDF $src,$mem\t! store vector (8 bytes)" %}
+ ins_encode %{
+ __ stf(FloatRegisterImpl::D, as_DoubleFloatRegister($src$$reg), $mem$$Address);
+ %}
+ ins_pipe(fstoreD_mem_reg);
+%}
+
+// Store Zero into vector in memory
+instruct storeV8B_zero(memory mem, immI0 zero) %{
+ predicate(n->as_StoreVector()->memory_size() == 8);
+ match(Set mem (StoreVector mem (ReplicateB zero)));
+ ins_cost(MEMORY_REF_COST);
+ size(4);
+ format %{ "STX $zero,$mem\t! store zero vector (8 bytes)" %}
+ ins_encode %{
+ __ stx(G0, $mem$$Address);
+ %}
+ ins_pipe(fstoreD_mem_zero);
+%}
+
+instruct storeV4S_zero(memory mem, immI0 zero) %{
+ predicate(n->as_StoreVector()->memory_size() == 8);
+ match(Set mem (StoreVector mem (ReplicateS zero)));
+ ins_cost(MEMORY_REF_COST);
+ size(4);
+ format %{ "STX $zero,$mem\t! store zero vector (4 shorts)" %}
+ ins_encode %{
+ __ stx(G0, $mem$$Address);
+ %}
+ ins_pipe(fstoreD_mem_zero);
+%}
+
+instruct storeV2I_zero(memory mem, immI0 zero) %{
+ predicate(n->as_StoreVector()->memory_size() == 8);
+ match(Set mem (StoreVector mem (ReplicateI zero)));
+ ins_cost(MEMORY_REF_COST);
+ size(4);
+ format %{ "STX $zero,$mem\t! store zero vector (2 ints)" %}
+ ins_encode %{
+ __ stx(G0, $mem$$Address);
+ %}
+ ins_pipe(fstoreD_mem_zero);
+%}
+
+instruct storeV2F_zero(memory mem, immF0 zero) %{
+ predicate(n->as_StoreVector()->memory_size() == 8);
+ match(Set mem (StoreVector mem (ReplicateF zero)));
+ ins_cost(MEMORY_REF_COST);
+ size(4);
+ format %{ "STX $zero,$mem\t! store zero vector (2 floats)" %}
+ ins_encode %{
+ __ stx(G0, $mem$$Address);
+ %}
+ ins_pipe(fstoreD_mem_zero);
+%}
+
+// Replicate scalar to packed byte values into Double register
+instruct Repl8B_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+ predicate(n->as_Vector()->length() == 8 && UseVIS >= 3);
+ match(Set dst (ReplicateB src));
+ effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+ format %{ "SLLX $src,56,$tmp\n\t"
+ "SRLX $tmp, 8,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\n\t"
+ "SRLX $tmp,16,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\n\t"
+ "SRLX $tmp,32,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\t! replicate8B\n\t"
+ "MOVXTOD $tmp,$dst\t! MoveL2D" %}
+ ins_encode %{
+ Register Rsrc = $src$$Register;
+ Register Rtmp = $tmp$$Register;
+ Register Rtmp2 = $tmp2$$Register;
+ __ sllx(Rsrc, 56, Rtmp);
+ __ srlx(Rtmp, 8, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ srlx(Rtmp, 16, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ srlx(Rtmp, 32, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar to packed byte values into Double stack
+instruct Repl8B_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+ predicate(n->as_Vector()->length() == 8 && UseVIS < 3);
+ match(Set dst (ReplicateB src));
+ effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+ format %{ "SLLX $src,56,$tmp\n\t"
+ "SRLX $tmp, 8,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\n\t"
+ "SRLX $tmp,16,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\n\t"
+ "SRLX $tmp,32,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\t! replicate8B\n\t"
+ "STX $tmp,$dst\t! regL to stkD" %}
+ ins_encode %{
+ Register Rsrc = $src$$Register;
+ Register Rtmp = $tmp$$Register;
+ Register Rtmp2 = $tmp2$$Register;
+ __ sllx(Rsrc, 56, Rtmp);
+ __ srlx(Rtmp, 8, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ srlx(Rtmp, 16, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ srlx(Rtmp, 32, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ set ($dst$$disp + STACK_BIAS, Rtmp2);
+ __ stx (Rtmp, Rtmp2, $dst$$base$$Register);
+ %}
+ ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar constant to packed byte values in Double register
+instruct Repl8B_immI(regD dst, immI13 con, o7RegI tmp) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateB con));
+ effect(KILL tmp);
+ format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl8B($con)" %}
+ ins_encode %{
+ // XXX This is a quick fix for 6833573.
+ //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 8, 1)), $dst$$FloatRegister);
+ RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 8, 1)), $tmp$$Register);
+ __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(loadConFD);
+%}
+
+// Replicate scalar to packed char/short values into Double register
+instruct Repl4S_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+ predicate(n->as_Vector()->length() == 4 && UseVIS >= 3);
+ match(Set dst (ReplicateS src));
+ effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+ format %{ "SLLX $src,48,$tmp\n\t"
+ "SRLX $tmp,16,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\n\t"
+ "SRLX $tmp,32,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\t! replicate4S\n\t"
+ "MOVXTOD $tmp,$dst\t! MoveL2D" %}
+ ins_encode %{
+ Register Rsrc = $src$$Register;
+ Register Rtmp = $tmp$$Register;
+ Register Rtmp2 = $tmp2$$Register;
+ __ sllx(Rsrc, 48, Rtmp);
+ __ srlx(Rtmp, 16, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ srlx(Rtmp, 32, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar to packed char/short values into Double stack
+instruct Repl4S_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+ predicate(n->as_Vector()->length() == 4 && UseVIS < 3);
+ match(Set dst (ReplicateS src));
+ effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+ format %{ "SLLX $src,48,$tmp\n\t"
+ "SRLX $tmp,16,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\n\t"
+ "SRLX $tmp,32,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\t! replicate4S\n\t"
+ "STX $tmp,$dst\t! regL to stkD" %}
+ ins_encode %{
+ Register Rsrc = $src$$Register;
+ Register Rtmp = $tmp$$Register;
+ Register Rtmp2 = $tmp2$$Register;
+ __ sllx(Rsrc, 48, Rtmp);
+ __ srlx(Rtmp, 16, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ srlx(Rtmp, 32, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ set ($dst$$disp + STACK_BIAS, Rtmp2);
+ __ stx (Rtmp, Rtmp2, $dst$$base$$Register);
+ %}
+ ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar constant to packed char/short values in Double register
+instruct Repl4S_immI(regD dst, immI con, o7RegI tmp) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateS con));
+ effect(KILL tmp);
+ format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4S($con)" %}
+ ins_encode %{
+ // XXX This is a quick fix for 6833573.
+ //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister);
+ RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register);
+ __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(loadConFD);
+%}
+
+// Replicate scalar to packed int values into Double register
+instruct Repl2I_reg(regD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+ predicate(n->as_Vector()->length() == 2 && UseVIS >= 3);
+ match(Set dst (ReplicateI src));
+ effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+ format %{ "SLLX $src,32,$tmp\n\t"
+ "SRLX $tmp,32,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\t! replicate2I\n\t"
+ "MOVXTOD $tmp,$dst\t! MoveL2D" %}
+ ins_encode %{
+ Register Rsrc = $src$$Register;
+ Register Rtmp = $tmp$$Register;
+ Register Rtmp2 = $tmp2$$Register;
+ __ sllx(Rsrc, 32, Rtmp);
+ __ srlx(Rtmp, 32, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ movxtod(Rtmp, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar to packed int values into Double stack
+instruct Repl2I_stk(stackSlotD dst, iRegI src, iRegL tmp, o7RegL tmp2) %{
+ predicate(n->as_Vector()->length() == 2 && UseVIS < 3);
+ match(Set dst (ReplicateI src));
+ effect(DEF dst, USE src, TEMP tmp, KILL tmp2);
+ format %{ "SLLX $src,32,$tmp\n\t"
+ "SRLX $tmp,32,$tmp2\n\t"
+ "OR $tmp,$tmp2,$tmp\t! replicate2I\n\t"
+ "STX $tmp,$dst\t! regL to stkD" %}
+ ins_encode %{
+ Register Rsrc = $src$$Register;
+ Register Rtmp = $tmp$$Register;
+ Register Rtmp2 = $tmp2$$Register;
+ __ sllx(Rsrc, 32, Rtmp);
+ __ srlx(Rtmp, 32, Rtmp2);
+ __ or3 (Rtmp, Rtmp2, Rtmp);
+ __ set ($dst$$disp + STACK_BIAS, Rtmp2);
+ __ stx (Rtmp, Rtmp2, $dst$$base$$Register);
+ %}
+ ins_pipe(ialu_reg);
+%}
+
+// Replicate scalar zero constant to packed int values in Double register
+instruct Repl2I_immI(regD dst, immI con, o7RegI tmp) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateI con));
+ effect(KILL tmp);
+ format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2I($con)" %}
+ ins_encode %{
+ // XXX This is a quick fix for 6833573.
+ //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 2, 4)), $dst$$FloatRegister);
+ RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 2, 4)), $tmp$$Register);
+ __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(loadConFD);
+%}
+
+// Replicate scalar to packed float values into Double stack
+instruct Repl2F_stk(stackSlotD dst, regF src) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateF src));
+ ins_cost(MEMORY_REF_COST*2);
+ format %{ "STF $src,$dst.hi\t! packed2F\n\t"
+ "STF $src,$dst.lo" %}
+ opcode(Assembler::stf_op3);
+ ins_encode(simple_form3_mem_reg(dst, src), form3_mem_plus_4_reg(dst, src));
+ ins_pipe(fstoreF_stk_reg);
+%}
+
+// Replicate scalar zero constant to packed float values in Double register
+instruct Repl2F_immF(regD dst, immF con, o7RegI tmp) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateF con));
+ effect(KILL tmp);
+ format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2F($con)" %}
+ ins_encode %{
+ // XXX This is a quick fix for 6833573.
+ //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immF($con$$constant)), $dst$$FloatRegister);
+ RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immF($con$$constant)), $tmp$$Register);
+ __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg));
+ %}
+ ins_pipe(loadConFD);
+%}
+
//----------PEEPHOLE RULES-----------------------------------------------------
// These must follow all instruction definitions as they use the names
// defined in the instructions definitions.
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -217,6 +217,8 @@
// Currently not supported anywhere.
FLAG_SET_DEFAULT(UseFPUForSpilling, false);
+ MaxVectorSize = 8;
+
assert((InteriorEntryAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size");
#endif
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1637,6 +1637,13 @@
emit_byte(0xC0 | encode);
}
+void Assembler::movlhps(XMMRegister dst, XMMRegister src) {
+ NOT_LP64(assert(VM_Version::supports_sse(), ""));
+ int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE);
+ emit_byte(0x16);
+ emit_byte(0xC0 | encode);
+}
+
void Assembler::movb(Register dst, Address src) {
NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
InstructionMark im(this);
@@ -1686,6 +1693,14 @@
emit_operand(dst, src);
}
+void Assembler::movdl(Address dst, XMMRegister src) {
+ NOT_LP64(assert(VM_Version::supports_sse2(), ""));
+ InstructionMark im(this);
+ simd_prefix(dst, src, VEX_SIMD_66);
+ emit_byte(0x7E);
+ emit_operand(src, dst);
+}
+
void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_66);
@@ -1716,6 +1731,35 @@
emit_operand(src, dst);
}
+// Move Unaligned 256bit Vector
+void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) {
+ assert(UseAVX, "");
+ bool vector256 = true;
+ int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, vector256);
+ emit_byte(0x6F);
+ emit_byte(0xC0 | encode);
+}
+
+void Assembler::vmovdqu(XMMRegister dst, Address src) {
+ assert(UseAVX, "");
+ InstructionMark im(this);
+ bool vector256 = true;
+ vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector256);
+ emit_byte(0x6F);
+ emit_operand(dst, src);
+}
+
+void Assembler::vmovdqu(Address dst, XMMRegister src) {
+ assert(UseAVX, "");
+ InstructionMark im(this);
+ bool vector256 = true;
+ // swap src<->dst for encoding
+ assert(src != xnoreg, "sanity");
+ vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector256);
+ emit_byte(0x7F);
+ emit_operand(src, dst);
+}
+
// Uses zero extension on 64bit
void Assembler::movl(Register dst, int32_t imm32) {
@@ -3112,6 +3156,13 @@
emit_operand(dst, src);
}
+void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {
+ assert(VM_Version::supports_avx(), "");
+ int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256);
+ emit_byte(0x57);
+ emit_byte(0xC0 | encode);
+}
+
void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
InstructionMark im(this);
@@ -3120,6 +3171,30 @@
emit_operand(dst, src);
}
+void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {
+ assert(VM_Version::supports_avx(), "");
+ int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_NONE, vector256);
+ emit_byte(0x57);
+ emit_byte(0xC0 | encode);
+}
+
+void Assembler::vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
+ assert(VM_Version::supports_avx(), "");
+ bool vector256 = true;
+ int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);
+ emit_byte(0x18);
+ emit_byte(0xC0 | encode);
+ // 0x00 - insert into lower 128 bits
+ // 0x01 - insert into upper 128 bits
+ emit_byte(0x01);
+}
+
+void Assembler::vzeroupper() {
+ assert(VM_Version::supports_avx(), "");
+ (void)vex_prefix_and_encode(xmm0, xmm0, xmm0, VEX_SIMD_NONE);
+ emit_byte(0x77);
+}
+
#ifndef _LP64
// 32bit only pieces of the assembler
--- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -591,8 +591,9 @@
void vex_prefix(XMMRegister dst, XMMRegister nds, Address src,
VexSimdPrefix pre, bool vector256 = false) {
- vex_prefix(src, nds->encoding(), dst->encoding(),
- pre, VEX_OPCODE_0F, false, vector256);
+ int dst_enc = dst->encoding();
+ int nds_enc = nds->is_valid() ? nds->encoding() : 0;
+ vex_prefix(src, nds_enc, dst_enc, pre, VEX_OPCODE_0F, false, vector256);
}
int vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc,
@@ -600,9 +601,12 @@
bool vex_w, bool vector256);
int vex_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,
- VexSimdPrefix pre, bool vector256 = false) {
- return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(),
- pre, VEX_OPCODE_0F, false, vector256);
+ VexSimdPrefix pre, bool vector256 = false,
+ VexOpcode opc = VEX_OPCODE_0F) {
+ int src_enc = src->encoding();
+ int dst_enc = dst->encoding();
+ int nds_enc = nds->is_valid() ? nds->encoding() : 0;
+ return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, false, vector256);
}
void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr,
@@ -1261,6 +1265,7 @@
void movdl(XMMRegister dst, Register src);
void movdl(Register dst, XMMRegister src);
void movdl(XMMRegister dst, Address src);
+ void movdl(Address dst, XMMRegister src);
// Move Double Quadword
void movdq(XMMRegister dst, Register src);
@@ -1274,6 +1279,14 @@
void movdqu(XMMRegister dst, Address src);
void movdqu(XMMRegister dst, XMMRegister src);
+ // Move Unaligned 256bit Vector
+ void vmovdqu(Address dst, XMMRegister src);
+ void vmovdqu(XMMRegister dst, Address src);
+ void vmovdqu(XMMRegister dst, XMMRegister src);
+
+ // Move lower 64bit to high 64bit in 128bit register
+ void movlhps(XMMRegister dst, XMMRegister src);
+
void movl(Register dst, int32_t imm32);
void movl(Address dst, int32_t imm32);
void movl(Register dst, Register src);
@@ -1615,6 +1628,17 @@
void vxorpd(XMMRegister dst, XMMRegister nds, Address src);
void vxorps(XMMRegister dst, XMMRegister nds, Address src);
+ // AVX Vector instrucitons.
+ void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
+ void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
+ void vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
+
+ // AVX instruction which is used to clear upper 128 bits of YMM registers and
+ // to avoid transaction penalty between AVX and SSE states. There is no
+ // penalty if legacy SSE instructions are encoded using VEX prefix because
+ // they always clear upper 128 bits. It should be used before calling
+ // runtime code and native libraries.
+ void vzeroupper();
protected:
// Next instructions require address alignment 16 bytes SSE mode.
@@ -2529,9 +2553,13 @@
void vsubss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubss(dst, nds, src); }
void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
+ // AVX Vector instructions
+
+ void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorpd(dst, nds, src, vector256); }
void vxorpd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorpd(dst, nds, src); }
void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
+ void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorps(dst, nds, src, vector256); }
void vxorps(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorps(dst, nds, src); }
void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src);
--- a/hotspot/src/cpu/x86/vm/register_x86.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/register_x86.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -35,7 +35,7 @@
const int ConcreteRegisterImpl::max_fpr = ConcreteRegisterImpl::max_gpr +
2 * FloatRegisterImpl::number_of_registers;
const int ConcreteRegisterImpl::max_xmm = ConcreteRegisterImpl::max_fpr +
- 2 * XMMRegisterImpl::number_of_registers;
+ 8 * XMMRegisterImpl::number_of_registers;
const char* RegisterImpl::name() const {
const char* names[number_of_registers] = {
#ifndef AMD64
--- a/hotspot/src/cpu/x86/vm/register_x86.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/register_x86.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -158,7 +158,7 @@
XMMRegister successor() const { return as_XMMRegister(encoding() + 1); }
// accessors
- int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; }
+ int encoding() const { assert(is_valid(), err_msg("invalid register (%d)", (int)(intptr_t)this )); return (intptr_t)this; }
bool is_valid() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; }
const char* name() const;
};
@@ -216,7 +216,7 @@
RegisterImpl::number_of_registers + // "H" half of a 64bit register
#endif // AMD64
2 * FloatRegisterImpl::number_of_registers +
- 2 * XMMRegisterImpl::number_of_registers +
+ 8 * XMMRegisterImpl::number_of_registers +
1 // eflags
};
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -467,6 +467,32 @@
if (!supports_avx ()) // Drop to 0 if no AVX support
UseAVX = 0;
+#ifdef COMPILER2
+ if (UseFPUForSpilling) {
+ if (UseSSE < 2) {
+ // Only supported with SSE2+
+ FLAG_SET_DEFAULT(UseFPUForSpilling, false);
+ }
+ }
+ if (MaxVectorSize > 0) {
+ if (!is_power_of_2(MaxVectorSize)) {
+ warning("MaxVectorSize must be a power of 2");
+ FLAG_SET_DEFAULT(MaxVectorSize, 32);
+ }
+ if (MaxVectorSize > 32) {
+ FLAG_SET_DEFAULT(MaxVectorSize, 32);
+ }
+ if (MaxVectorSize > 16 && UseAVX == 0) {
+ // Only supported with AVX+
+ FLAG_SET_DEFAULT(MaxVectorSize, 16);
+ }
+ if (UseSSE < 2) {
+ // Only supported with SSE2+
+ FLAG_SET_DEFAULT(MaxVectorSize, 0);
+ }
+ }
+#endif
+
// On new cpus instructions which update whole XMM register should be used
// to prevent partial register stall due to dependencies on high half.
//
@@ -544,6 +570,12 @@
}
}
+#ifdef COMPILER2
+ if (MaxVectorSize > 16) {
+ // Limit vectors size to 16 bytes on current AMD cpus.
+ FLAG_SET_DEFAULT(MaxVectorSize, 16);
+ }
+#endif // COMPILER2
}
if( is_intel() ) { // Intel cpus specific settings
@@ -606,15 +638,6 @@
FLAG_SET_DEFAULT(UsePopCountInstruction, false);
}
-#ifdef COMPILER2
- if (UseFPUForSpilling) {
- if (UseSSE < 2) {
- // Only supported with SSE2+
- FLAG_SET_DEFAULT(UseFPUForSpilling, false);
- }
- }
-#endif
-
assert(0 <= ReadPrefetchInstr && ReadPrefetchInstr <= 3, "invalid value");
assert(0 <= AllocatePrefetchInstr && AllocatePrefetchInstr <= 3, "invalid value");
--- a/hotspot/src/cpu/x86/vm/vmreg_x86.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/vmreg_x86.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -48,8 +48,9 @@
XMMRegister xreg = ::as_XMMRegister(0);
for ( ; i < ConcreteRegisterImpl::max_xmm ; ) {
- regName[i++] = xreg->name();
- regName[i++] = xreg->name();
+ for (int j = 0 ; j < 8 ; j++) {
+ regName[i++] = xreg->name();
+ }
xreg = xreg->successor();
}
for ( ; i < ConcreteRegisterImpl::number_of_registers ; i ++ ) {
--- a/hotspot/src/cpu/x86/vm/vmreg_x86.inline.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/vmreg_x86.inline.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -39,7 +39,7 @@
}
inline VMReg XMMRegisterImpl::as_VMReg() {
- return VMRegImpl::as_VMReg((encoding() << 1) + ConcreteRegisterImpl::max_fpr);
+ return VMRegImpl::as_VMReg((encoding() << 3) + ConcreteRegisterImpl::max_fpr);
}
@@ -75,7 +75,7 @@
inline XMMRegister VMRegImpl::as_XMMRegister() {
assert( is_XMMRegister() && is_even(value()), "must be" );
// Yuk
- return ::as_XMMRegister((value() - ConcreteRegisterImpl::max_fpr) >> 1);
+ return ::as_XMMRegister((value() - ConcreteRegisterImpl::max_fpr) >> 3);
}
inline bool VMRegImpl::is_concrete() {
--- a/hotspot/src/cpu/x86/vm/x86.ad Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/x86.ad Wed Jul 05 18:15:17 2017 +0200
@@ -24,6 +24,456 @@
// X86 Common Architecture Description File
+//----------REGISTER DEFINITION BLOCK------------------------------------------
+// This information is used by the matcher and the register allocator to
+// describe individual registers and classes of registers within the target
+// archtecture.
+
+register %{
+//----------Architecture Description Register Definitions----------------------
+// General Registers
+// "reg_def" name ( register save type, C convention save type,
+// ideal register type, encoding );
+// Register Save Types:
+//
+// NS = No-Save: The register allocator assumes that these registers
+// can be used without saving upon entry to the method, &
+// that they do not need to be saved at call sites.
+//
+// SOC = Save-On-Call: The register allocator assumes that these registers
+// can be used without saving upon entry to the method,
+// but that they must be saved at call sites.
+//
+// SOE = Save-On-Entry: The register allocator assumes that these registers
+// must be saved before using them upon entry to the
+// method, but they do not need to be saved at call
+// sites.
+//
+// AS = Always-Save: The register allocator assumes that these registers
+// must be saved before using them upon entry to the
+// method, & that they must be saved at call sites.
+//
+// Ideal Register Type is used to determine how to save & restore a
+// register. Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get
+// spilled with LoadP/StoreP. If the register supports both, use Op_RegI.
+//
+// The encoding number is the actual bit-pattern placed into the opcodes.
+
+// XMM registers. 256-bit registers or 8 words each, labeled (a)-h.
+// Word a in each register holds a Float, words ab hold a Double.
+// The whole registers are used in SSE4.2 version intrinsics,
+// array copy stubs and superword operations (see UseSSE42Intrinsics,
+// UseXMMForArrayCopy and UseSuperword flags).
+// XMM8-XMM15 must be encoded with REX (VEX for UseAVX).
+// Linux ABI: No register preserved across function calls
+// XMM0-XMM7 might hold parameters
+// Windows ABI: XMM6-XMM15 preserved across function calls
+// XMM0-XMM3 might hold parameters
+
+reg_def XMM0 ( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());
+reg_def XMM0b( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next());
+reg_def XMM0c( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()->next());
+reg_def XMM0d( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()->next()->next());
+reg_def XMM0e( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()->next()->next()->next());
+reg_def XMM0f( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM0g( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM0h( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM1 ( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg());
+reg_def XMM1b( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next());
+reg_def XMM1c( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()->next());
+reg_def XMM1d( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()->next()->next());
+reg_def XMM1e( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()->next()->next()->next());
+reg_def XMM1f( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM1g( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM1h( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM2 ( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg());
+reg_def XMM2b( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next());
+reg_def XMM2c( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()->next());
+reg_def XMM2d( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()->next()->next());
+reg_def XMM2e( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()->next()->next()->next());
+reg_def XMM2f( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM2g( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM2h( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM3 ( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg());
+reg_def XMM3b( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next());
+reg_def XMM3c( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()->next());
+reg_def XMM3d( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()->next()->next());
+reg_def XMM3e( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()->next()->next()->next());
+reg_def XMM3f( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM3g( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM3h( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM4 ( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg());
+reg_def XMM4b( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next());
+reg_def XMM4c( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()->next());
+reg_def XMM4d( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()->next()->next());
+reg_def XMM4e( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()->next()->next()->next());
+reg_def XMM4f( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM4g( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM4h( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM5 ( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg());
+reg_def XMM5b( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next());
+reg_def XMM5c( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()->next());
+reg_def XMM5d( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()->next()->next());
+reg_def XMM5e( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()->next()->next()->next());
+reg_def XMM5f( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM5g( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM5h( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+#ifdef _WIN64
+
+reg_def XMM6 ( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg());
+reg_def XMM6b( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next());
+reg_def XMM6c( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next()->next());
+reg_def XMM6d( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next());
+reg_def XMM6e( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next());
+reg_def XMM6f( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM6g( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM6h( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM7 ( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg());
+reg_def XMM7b( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next());
+reg_def XMM7c( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next()->next());
+reg_def XMM7d( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next());
+reg_def XMM7e( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next());
+reg_def XMM7f( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM7g( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM7h( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM8 ( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg());
+reg_def XMM8b( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next());
+reg_def XMM8c( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next()->next());
+reg_def XMM8d( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next());
+reg_def XMM8e( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next());
+reg_def XMM8f( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM8g( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM8h( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM9 ( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg());
+reg_def XMM9b( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next());
+reg_def XMM9c( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next()->next());
+reg_def XMM9d( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next());
+reg_def XMM9e( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next());
+reg_def XMM9f( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM9g( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM9h( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM10 ( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg());
+reg_def XMM10b( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next());
+reg_def XMM10c( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next()->next());
+reg_def XMM10d( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next());
+reg_def XMM10e( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next());
+reg_def XMM10f( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM10g( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM10h( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM11 ( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg());
+reg_def XMM11b( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next());
+reg_def XMM11c( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next()->next());
+reg_def XMM11d( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next());
+reg_def XMM11e( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next());
+reg_def XMM11f( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM11g( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM11h( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM12 ( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg());
+reg_def XMM12b( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next());
+reg_def XMM12c( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next()->next());
+reg_def XMM12d( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next());
+reg_def XMM12e( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next());
+reg_def XMM12f( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM12g( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM12h( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM13 ( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg());
+reg_def XMM13b( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next());
+reg_def XMM13c( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next()->next());
+reg_def XMM13d( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next());
+reg_def XMM13e( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next());
+reg_def XMM13f( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM13g( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM13h( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM14 ( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg());
+reg_def XMM14b( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next());
+reg_def XMM14c( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next()->next());
+reg_def XMM14d( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next());
+reg_def XMM14e( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next());
+reg_def XMM14f( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM14g( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM14h( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM15 ( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg());
+reg_def XMM15b( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next());
+reg_def XMM15c( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next()->next());
+reg_def XMM15d( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next());
+reg_def XMM15e( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next());
+reg_def XMM15f( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM15g( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM15h( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+#else // _WIN64
+
+reg_def XMM6 ( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg());
+reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next());
+reg_def XMM6c( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()->next());
+reg_def XMM6d( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next());
+reg_def XMM6e( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next());
+reg_def XMM6f( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM6g( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM6h( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM7 ( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg());
+reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next());
+reg_def XMM7c( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()->next());
+reg_def XMM7d( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next());
+reg_def XMM7e( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next());
+reg_def XMM7f( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM7g( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM7h( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+#ifdef _LP64
+
+reg_def XMM8 ( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg());
+reg_def XMM8b( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next());
+reg_def XMM8c( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next()->next());
+reg_def XMM8d( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next());
+reg_def XMM8e( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next());
+reg_def XMM8f( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM8g( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM8h( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM9 ( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg());
+reg_def XMM9b( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next());
+reg_def XMM9c( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next()->next());
+reg_def XMM9d( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next());
+reg_def XMM9e( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next());
+reg_def XMM9f( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM9g( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM9h( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM10 ( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg());
+reg_def XMM10b( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next());
+reg_def XMM10c( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next()->next());
+reg_def XMM10d( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next());
+reg_def XMM10e( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next());
+reg_def XMM10f( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM10g( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM10h( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM11 ( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg());
+reg_def XMM11b( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next());
+reg_def XMM11c( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next()->next());
+reg_def XMM11d( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next());
+reg_def XMM11e( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next());
+reg_def XMM11f( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM11g( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM11h( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM12 ( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg());
+reg_def XMM12b( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next());
+reg_def XMM12c( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next()->next());
+reg_def XMM12d( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next());
+reg_def XMM12e( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next());
+reg_def XMM12f( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM12g( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM12h( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM13 ( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg());
+reg_def XMM13b( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next());
+reg_def XMM13c( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next()->next());
+reg_def XMM13d( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next());
+reg_def XMM13e( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next());
+reg_def XMM13f( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM13g( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM13h( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM14 ( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg());
+reg_def XMM14b( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next());
+reg_def XMM14c( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next()->next());
+reg_def XMM14d( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next());
+reg_def XMM14e( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next());
+reg_def XMM14f( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM14g( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM14h( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+reg_def XMM15 ( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg());
+reg_def XMM15b( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next());
+reg_def XMM15c( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next()->next());
+reg_def XMM15d( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next());
+reg_def XMM15e( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next());
+reg_def XMM15f( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next()->next());
+reg_def XMM15g( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next()->next()->next());
+reg_def XMM15h( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next()->next()->next()->next()->next()->next()->next());
+
+#endif // _LP64
+
+#endif // _WIN64
+
+#ifdef _LP64
+reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad());
+#else
+reg_def RFLAGS(SOC, SOC, 0, 8, VMRegImpl::Bad());
+#endif // _LP64
+
+alloc_class chunk1(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h,
+ XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h,
+ XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h,
+ XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h,
+ XMM4, XMM4b, XMM4c, XMM4d, XMM4e, XMM4f, XMM4g, XMM4h,
+ XMM5, XMM5b, XMM5c, XMM5d, XMM5e, XMM5f, XMM5g, XMM5h,
+ XMM6, XMM6b, XMM6c, XMM6d, XMM6e, XMM6f, XMM6g, XMM6h,
+ XMM7, XMM7b, XMM7c, XMM7d, XMM7e, XMM7f, XMM7g, XMM7h
+#ifdef _LP64
+ ,XMM8, XMM8b, XMM8c, XMM8d, XMM8e, XMM8f, XMM8g, XMM8h,
+ XMM9, XMM9b, XMM9c, XMM9d, XMM9e, XMM9f, XMM9g, XMM9h,
+ XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h,
+ XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h,
+ XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h,
+ XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h,
+ XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h,
+ XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h
+#endif
+ );
+
+// flags allocation class should be last.
+alloc_class chunk2(RFLAGS);
+
+// Singleton class for condition codes
+reg_class int_flags(RFLAGS);
+
+// Class for all float registers
+reg_class float_reg(XMM0,
+ XMM1,
+ XMM2,
+ XMM3,
+ XMM4,
+ XMM5,
+ XMM6,
+ XMM7
+#ifdef _LP64
+ ,XMM8,
+ XMM9,
+ XMM10,
+ XMM11,
+ XMM12,
+ XMM13,
+ XMM14,
+ XMM15
+#endif
+ );
+
+// Class for all double registers
+reg_class double_reg(XMM0, XMM0b,
+ XMM1, XMM1b,
+ XMM2, XMM2b,
+ XMM3, XMM3b,
+ XMM4, XMM4b,
+ XMM5, XMM5b,
+ XMM6, XMM6b,
+ XMM7, XMM7b
+#ifdef _LP64
+ ,XMM8, XMM8b,
+ XMM9, XMM9b,
+ XMM10, XMM10b,
+ XMM11, XMM11b,
+ XMM12, XMM12b,
+ XMM13, XMM13b,
+ XMM14, XMM14b,
+ XMM15, XMM15b
+#endif
+ );
+
+// Class for all 32bit vector registers
+reg_class vectors_reg(XMM0,
+ XMM1,
+ XMM2,
+ XMM3,
+ XMM4,
+ XMM5,
+ XMM6,
+ XMM7
+#ifdef _LP64
+ ,XMM8,
+ XMM9,
+ XMM10,
+ XMM11,
+ XMM12,
+ XMM13,
+ XMM14,
+ XMM15
+#endif
+ );
+
+// Class for all 64bit vector registers
+reg_class vectord_reg(XMM0, XMM0b,
+ XMM1, XMM1b,
+ XMM2, XMM2b,
+ XMM3, XMM3b,
+ XMM4, XMM4b,
+ XMM5, XMM5b,
+ XMM6, XMM6b,
+ XMM7, XMM7b
+#ifdef _LP64
+ ,XMM8, XMM8b,
+ XMM9, XMM9b,
+ XMM10, XMM10b,
+ XMM11, XMM11b,
+ XMM12, XMM12b,
+ XMM13, XMM13b,
+ XMM14, XMM14b,
+ XMM15, XMM15b
+#endif
+ );
+
+// Class for all 128bit vector registers
+reg_class vectorx_reg(XMM0, XMM0b, XMM0c, XMM0d,
+ XMM1, XMM1b, XMM1c, XMM1d,
+ XMM2, XMM2b, XMM2c, XMM2d,
+ XMM3, XMM3b, XMM3c, XMM3d,
+ XMM4, XMM4b, XMM4c, XMM4d,
+ XMM5, XMM5b, XMM5c, XMM5d,
+ XMM6, XMM6b, XMM6c, XMM6d,
+ XMM7, XMM7b, XMM7c, XMM7d
+#ifdef _LP64
+ ,XMM8, XMM8b, XMM8c, XMM8d,
+ XMM9, XMM9b, XMM9c, XMM9d,
+ XMM10, XMM10b, XMM10c, XMM10d,
+ XMM11, XMM11b, XMM11c, XMM11d,
+ XMM12, XMM12b, XMM12c, XMM12d,
+ XMM13, XMM13b, XMM13c, XMM13d,
+ XMM14, XMM14b, XMM14c, XMM14d,
+ XMM15, XMM15b, XMM15c, XMM15d
+#endif
+ );
+
+// Class for all 256bit vector registers
+reg_class vectory_reg(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h,
+ XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h,
+ XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h,
+ XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h,
+ XMM4, XMM4b, XMM4c, XMM4d, XMM4e, XMM4f, XMM4g, XMM4h,
+ XMM5, XMM5b, XMM5c, XMM5d, XMM5e, XMM5f, XMM5g, XMM5h,
+ XMM6, XMM6b, XMM6c, XMM6d, XMM6e, XMM6f, XMM6g, XMM6h,
+ XMM7, XMM7b, XMM7c, XMM7d, XMM7e, XMM7f, XMM7g, XMM7h
+#ifdef _LP64
+ ,XMM8, XMM8b, XMM8c, XMM8d, XMM8e, XMM8f, XMM8g, XMM8h,
+ XMM9, XMM9b, XMM9c, XMM9d, XMM9e, XMM9f, XMM9g, XMM9h,
+ XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h,
+ XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h,
+ XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h,
+ XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h,
+ XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h,
+ XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h
+#endif
+ );
+
+%}
+
source %{
// Float masks come from different places depending on platform.
#ifdef _LP64
@@ -38,6 +488,252 @@
static address double_signflip() { return (address)double_signflip_pool; }
#endif
+// Map Types to machine register types
+const int Matcher::base2reg[Type::lastype] = {
+ Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN,
+ Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */
+ Op_VecS, Op_VecD, Op_VecX, Op_VecY, /* Vectors */
+ Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */
+ 0, 0/*abio*/,
+ Op_RegP /* Return address */, 0, /* the memories */
+ Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD,
+ 0 /*bottom*/
+};
+
+// Max vector size in bytes. 0 if not supported.
+const int Matcher::vector_width_in_bytes(BasicType bt) {
+ assert(is_java_primitive(bt), "only primitive type vectors");
+ if (UseSSE < 2) return 0;
+ // SSE2 supports 128bit vectors for all types.
+ // AVX2 supports 256bit vectors for all types.
+ int size = (UseAVX > 1) ? 32 : 16;
+ // AVX1 supports 256bit vectors only for FLOAT and DOUBLE.
+ if (UseAVX > 0 && (bt == T_FLOAT || bt == T_DOUBLE))
+ size = 32;
+ // Use flag to limit vector size.
+ size = MIN2(size,(int)MaxVectorSize);
+ // Minimum 2 values in vector (or 4 for bytes).
+ switch (bt) {
+ case T_DOUBLE:
+ case T_LONG:
+ if (size < 16) return 0;
+ case T_FLOAT:
+ case T_INT:
+ if (size < 8) return 0;
+ case T_BOOLEAN:
+ case T_BYTE:
+ case T_CHAR:
+ case T_SHORT:
+ if (size < 4) return 0;
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ return size;
+}
+
+// Limits on vector size (number of elements) loaded into vector.
+const int Matcher::max_vector_size(const BasicType bt) {
+ return vector_width_in_bytes(bt)/type2aelembytes(bt);
+}
+const int Matcher::min_vector_size(const BasicType bt) {
+ int max_size = max_vector_size(bt);
+ // Min size which can be loaded into vector is 4 bytes.
+ int size = (type2aelembytes(bt) == 1) ? 4 : 2;
+ return MIN2(size,max_size);
+}
+
+// Vector ideal reg corresponding to specidied size in bytes
+const int Matcher::vector_ideal_reg(int size) {
+ assert(MaxVectorSize >= size, "");
+ switch(size) {
+ case 4: return Op_VecS;
+ case 8: return Op_VecD;
+ case 16: return Op_VecX;
+ case 32: return Op_VecY;
+ }
+ ShouldNotReachHere();
+ return 0;
+}
+
+// x86 supports misaligned vectors store/load.
+const bool Matcher::misaligned_vectors_ok() {
+ return !AlignVector; // can be changed by flag
+}
+
+// Helper methods for MachSpillCopyNode::implementation().
+static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
+ int src_hi, int dst_hi, uint ireg, outputStream* st) {
+ // In 64-bit VM size calculation is very complex. Emitting instructions
+ // into scratch buffer is used to get size in 64-bit VM.
+ LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); )
+ assert(ireg == Op_VecS || // 32bit vector
+ (src_lo & 1) == 0 && (src_lo + 1) == src_hi &&
+ (dst_lo & 1) == 0 && (dst_lo + 1) == dst_hi,
+ "no non-adjacent vector moves" );
+ if (cbuf) {
+ MacroAssembler _masm(cbuf);
+ int offset = __ offset();
+ switch (ireg) {
+ case Op_VecS: // copy whole register
+ case Op_VecD:
+ case Op_VecX:
+ __ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+ break;
+ case Op_VecY:
+ __ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ int size = __ offset() - offset;
+#ifdef ASSERT
+ // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
+ assert(!do_size || size == 4, "incorrect size calculattion");
+#endif
+ return size;
+#ifndef PRODUCT
+ } else if (!do_size) {
+ switch (ireg) {
+ case Op_VecS:
+ case Op_VecD:
+ case Op_VecX:
+ st->print("movdqu %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
+ break;
+ case Op_VecY:
+ st->print("vmovdqu %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+#endif
+ }
+ // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
+ return 4;
+}
+
+static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
+ int stack_offset, int reg, uint ireg, outputStream* st) {
+ // In 64-bit VM size calculation is very complex. Emitting instructions
+ // into scratch buffer is used to get size in 64-bit VM.
+ LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); )
+ if (cbuf) {
+ MacroAssembler _masm(cbuf);
+ int offset = __ offset();
+ if (is_load) {
+ switch (ireg) {
+ case Op_VecS:
+ __ movdl(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+ break;
+ case Op_VecD:
+ __ movq(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+ break;
+ case Op_VecX:
+ __ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+ break;
+ case Op_VecY:
+ __ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ } else { // store
+ switch (ireg) {
+ case Op_VecS:
+ __ movdl(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+ break;
+ case Op_VecD:
+ __ movq(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+ break;
+ case Op_VecX:
+ __ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+ break;
+ case Op_VecY:
+ __ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ }
+ int size = __ offset() - offset;
+#ifdef ASSERT
+ int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4);
+ // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
+ assert(!do_size || size == (5+offset_size), "incorrect size calculattion");
+#endif
+ return size;
+#ifndef PRODUCT
+ } else if (!do_size) {
+ if (is_load) {
+ switch (ireg) {
+ case Op_VecS:
+ st->print("movd %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+ break;
+ case Op_VecD:
+ st->print("movq %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+ break;
+ case Op_VecX:
+ st->print("movdqu %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+ break;
+ case Op_VecY:
+ st->print("vmovdqu %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ } else { // store
+ switch (ireg) {
+ case Op_VecS:
+ st->print("movd [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+ break;
+ case Op_VecD:
+ st->print("movq [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+ break;
+ case Op_VecX:
+ st->print("movdqu [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+ break;
+ case Op_VecY:
+ st->print("vmovdqu [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ }
+#endif
+ }
+ int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4);
+ // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
+ return 5+offset_size;
+}
+
+static inline jfloat replicate4_imm(int con, int width) {
+ // Load a constant of "width" (in bytes) and replicate it to fill 32bit.
+ assert(width == 1 || width == 2, "only byte or short types here");
+ int bit_width = width * 8;
+ jint val = con;
+ val &= (1 << bit_width) - 1; // mask off sign bits
+ while(bit_width < 32) {
+ val |= (val << bit_width);
+ bit_width <<= 1;
+ }
+ jfloat fval = *((jfloat*) &val); // coerce to float type
+ return fval;
+}
+
+static inline jdouble replicate8_imm(int con, int width) {
+ // Load a constant of "width" (in bytes) and replicate it to fill 64bit.
+ assert(width == 1 || width == 2 || width == 4, "only byte, short or int types here");
+ int bit_width = width * 8;
+ jlong val = con;
+ val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits
+ while(bit_width < 64) {
+ val |= (val << bit_width);
+ bit_width <<= 1;
+ }
+ jdouble dval = *((jdouble*) &val); // coerce to double type
+ return dval;
+}
+
#ifndef PRODUCT
void MachNopNode::format(PhaseRegAlloc*, outputStream* st) const {
st->print("nop \t# %d bytes pad for loops and calls", _count);
@@ -103,6 +799,46 @@
%}
+
+//----------OPERANDS-----------------------------------------------------------
+// Operand definitions must precede instruction definitions for correct parsing
+// in the ADLC because operands constitute user defined types which are used in
+// instruction definitions.
+
+// Vectors
+operand vecS() %{
+ constraint(ALLOC_IN_RC(vectors_reg));
+ match(VecS);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+operand vecD() %{
+ constraint(ALLOC_IN_RC(vectord_reg));
+ match(VecD);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+operand vecX() %{
+ constraint(ALLOC_IN_RC(vectorx_reg));
+ match(VecX);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+operand vecY() %{
+ constraint(ALLOC_IN_RC(vectory_reg));
+ match(VecY);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+
// INSTRUCTIONS -- Platform independent definitions (same for 32- and 64-bit)
// ============================================================================
@@ -852,3 +1588,797 @@
ins_pipe(pipe_slow);
%}
+
+// ====================VECTOR INSTRUCTIONS=====================================
+
+// Load vectors (4 bytes long)
+instruct loadV4(vecS dst, memory mem) %{
+ predicate(n->as_LoadVector()->memory_size() == 4);
+ match(Set dst (LoadVector mem));
+ ins_cost(125);
+ format %{ "movd $dst,$mem\t! load vector (4 bytes)" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $mem$$Address);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Load vectors (8 bytes long)
+instruct loadV8(vecD dst, memory mem) %{
+ predicate(n->as_LoadVector()->memory_size() == 8);
+ match(Set dst (LoadVector mem));
+ ins_cost(125);
+ format %{ "movq $dst,$mem\t! load vector (8 bytes)" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $mem$$Address);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Load vectors (16 bytes long)
+instruct loadV16(vecX dst, memory mem) %{
+ predicate(n->as_LoadVector()->memory_size() == 16);
+ match(Set dst (LoadVector mem));
+ ins_cost(125);
+ format %{ "movdqu $dst,$mem\t! load vector (16 bytes)" %}
+ ins_encode %{
+ __ movdqu($dst$$XMMRegister, $mem$$Address);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Load vectors (32 bytes long)
+instruct loadV32(vecY dst, memory mem) %{
+ predicate(n->as_LoadVector()->memory_size() == 32);
+ match(Set dst (LoadVector mem));
+ ins_cost(125);
+ format %{ "vmovdqu $dst,$mem\t! load vector (32 bytes)" %}
+ ins_encode %{
+ __ vmovdqu($dst$$XMMRegister, $mem$$Address);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Store vectors
+instruct storeV4(memory mem, vecS src) %{
+ predicate(n->as_StoreVector()->memory_size() == 4);
+ match(Set mem (StoreVector mem src));
+ ins_cost(145);
+ format %{ "movd $mem,$src\t! store vector (4 bytes)" %}
+ ins_encode %{
+ __ movdl($mem$$Address, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct storeV8(memory mem, vecD src) %{
+ predicate(n->as_StoreVector()->memory_size() == 8);
+ match(Set mem (StoreVector mem src));
+ ins_cost(145);
+ format %{ "movq $mem,$src\t! store vector (8 bytes)" %}
+ ins_encode %{
+ __ movq($mem$$Address, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct storeV16(memory mem, vecX src) %{
+ predicate(n->as_StoreVector()->memory_size() == 16);
+ match(Set mem (StoreVector mem src));
+ ins_cost(145);
+ format %{ "movdqu $mem,$src\t! store vector (16 bytes)" %}
+ ins_encode %{
+ __ movdqu($mem$$Address, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct storeV32(memory mem, vecY src) %{
+ predicate(n->as_StoreVector()->memory_size() == 32);
+ match(Set mem (StoreVector mem src));
+ ins_cost(145);
+ format %{ "vmovdqu $mem,$src\t! store vector (32 bytes)" %}
+ ins_encode %{
+ __ vmovdqu($mem$$Address, $src$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate byte scalar to be vector
+instruct Repl4B(vecS dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateB src));
+ format %{ "movd $dst,$src\n\t"
+ "punpcklbw $dst,$dst\n\t"
+ "pshuflw $dst,$dst,0x00\t! replicate4B" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8B(vecD dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateB src));
+ format %{ "movd $dst,$src\n\t"
+ "punpcklbw $dst,$dst\n\t"
+ "pshuflw $dst,$dst,0x00\t! replicate8B" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl16B(vecX dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 16);
+ match(Set dst (ReplicateB src));
+ format %{ "movd $dst,$src\n\t"
+ "punpcklbw $dst,$dst\n\t"
+ "pshuflw $dst,$dst,0x00\n\t"
+ "movlhps $dst,$dst\t! replicate16B" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl32B(vecY dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 32);
+ match(Set dst (ReplicateB src));
+ format %{ "movd $dst,$src\n\t"
+ "punpcklbw $dst,$dst\n\t"
+ "pshuflw $dst,$dst,0x00\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate32B" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate byte scalar immediate to be vector by loading from const table.
+instruct Repl4B_imm(vecS dst, immI con) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateB con));
+ format %{ "movss $dst,[$constantaddress]\t! replicate4B($con)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 1)));
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8B_imm(vecD dst, immI con) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateB con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate8B($con)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl16B_imm(vecX dst, immI con) %{
+ predicate(n->as_Vector()->length() == 16);
+ match(Set dst (ReplicateB con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate16B($con)\n\t"
+ "movlhps $dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl32B_imm(vecY dst, immI con) %{
+ predicate(n->as_Vector()->length() == 32);
+ match(Set dst (ReplicateB con));
+ format %{ "movsd $dst,[$constantaddress]\t! lreplicate32B($con)\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate byte scalar zero to be vector
+instruct Repl4B_zero(vecS dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateB zero));
+ format %{ "pxor $dst,$dst\t! replicate4B zero" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8B_zero(vecD dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateB zero));
+ format %{ "pxor $dst,$dst\t! replicate8B zero" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl16B_zero(vecX dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 16);
+ match(Set dst (ReplicateB zero));
+ format %{ "pxor $dst,$dst\t! replicate16B zero" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl32B_zero(vecY dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 32);
+ match(Set dst (ReplicateB zero));
+ format %{ "vxorpd $dst,$dst,$dst\t! replicate32B zero" %}
+ ins_encode %{
+ // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+ bool vector256 = true;
+ __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate char/short (2 byte) scalar to be vector
+instruct Repl2S(vecS dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateS src));
+ format %{ "movd $dst,$src\n\t"
+ "pshuflw $dst,$dst,0x00\t! replicate2S" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4S(vecD dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateS src));
+ format %{ "movd $dst,$src\n\t"
+ "pshuflw $dst,$dst,0x00\t! replicate4S" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8S(vecX dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateS src));
+ format %{ "movd $dst,$src\n\t"
+ "pshuflw $dst,$dst,0x00\n\t"
+ "movlhps $dst,$dst\t! replicate8S" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl16S(vecY dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 16);
+ match(Set dst (ReplicateS src));
+ format %{ "movd $dst,$src\n\t"
+ "pshuflw $dst,$dst,0x00\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate16S" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate char/short (2 byte) scalar immediate to be vector by loading from const table.
+instruct Repl2S_imm(vecS dst, immI con) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateS con));
+ format %{ "movss $dst,[$constantaddress]\t! replicate2S($con)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 2)));
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4S_imm(vecD dst, immI con) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateS con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate4S($con)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8S_imm(vecX dst, immI con) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateS con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate8S($con)\n\t"
+ "movlhps $dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl16S_imm(vecY dst, immI con) %{
+ predicate(n->as_Vector()->length() == 16);
+ match(Set dst (ReplicateS con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate16S($con)\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate char/short (2 byte) scalar zero to be vector
+instruct Repl2S_zero(vecS dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateS zero));
+ format %{ "pxor $dst,$dst\t! replicate2S zero" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4S_zero(vecD dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateS zero));
+ format %{ "pxor $dst,$dst\t! replicate4S zero" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8S_zero(vecX dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateS zero));
+ format %{ "pxor $dst,$dst\t! replicate8S zero" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl16S_zero(vecY dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 16);
+ match(Set dst (ReplicateS zero));
+ format %{ "vxorpd $dst,$dst,$dst\t! replicate16S zero" %}
+ ins_encode %{
+ // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+ bool vector256 = true;
+ __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate integer (4 byte) scalar to be vector
+instruct Repl2I(vecD dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateI src));
+ format %{ "movd $dst,$src\n\t"
+ "pshufd $dst,$dst,0x00\t! replicate2I" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I(vecX dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateI src));
+ format %{ "movd $dst,$src\n\t"
+ "pshufd $dst,$dst,0x00\t! replicate4I" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8I(vecY dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateI src));
+ format %{ "movd $dst,$src\n\t"
+ "pshufd $dst,$dst,0x00\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate8I" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate integer (4 byte) scalar immediate to be vector by loading from const table.
+instruct Repl2I_imm(vecD dst, immI con) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateI con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate2I($con)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I_imm(vecX dst, immI con) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateI con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate4I($con)\n\t"
+ "movlhps $dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8I_imm(vecY dst, immI con) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateI con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate8I($con)\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Integer could be loaded into xmm register directly from memory.
+instruct Repl2I_mem(vecD dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateI (LoadVector mem)));
+ format %{ "movd $dst,$mem\n\t"
+ "pshufd $dst,$dst,0x00\t! replicate2I" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $mem$$Address);
+ __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I_mem(vecX dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateI (LoadVector mem)));
+ format %{ "movd $dst,$mem\n\t"
+ "pshufd $dst,$dst,0x00\t! replicate4I" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $mem$$Address);
+ __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8I_mem(vecY dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateI (LoadVector mem)));
+ format %{ "movd $dst,$mem\n\t"
+ "pshufd $dst,$dst,0x00\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate8I" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $mem$$Address);
+ __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate integer (4 byte) scalar zero to be vector
+instruct Repl2I_zero(vecD dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateI zero));
+ format %{ "pxor $dst,$dst\t! replicate2I" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4I_zero(vecX dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateI zero));
+ format %{ "pxor $dst,$dst\t! replicate4I zero)" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8I_zero(vecY dst, immI0 zero) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateI zero));
+ format %{ "vxorpd $dst,$dst,$dst\t! replicate8I zero" %}
+ ins_encode %{
+ // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+ bool vector256 = true;
+ __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate long (8 byte) scalar to be vector
+#ifdef _LP64
+instruct Repl2L(vecX dst, rRegL src) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateL src));
+ format %{ "movdq $dst,$src\n\t"
+ "movlhps $dst,$dst\t! replicate2L" %}
+ ins_encode %{
+ __ movdq($dst$$XMMRegister, $src$$Register);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L(vecY dst, rRegL src) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateL src));
+ format %{ "movdq $dst,$src\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate4L" %}
+ ins_encode %{
+ __ movdq($dst$$XMMRegister, $src$$Register);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+#else // _LP64
+instruct Repl2L(vecX dst, eRegL src, regD tmp) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateL src));
+ effect(TEMP dst, USE src, TEMP tmp);
+ format %{ "movdl $dst,$src.lo\n\t"
+ "movdl $tmp,$src.hi\n\t"
+ "punpckldq $dst,$tmp\n\t"
+ "movlhps $dst,$dst\t! replicate2L"%}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
+ __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L(vecY dst, eRegL src, regD tmp) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateL src));
+ effect(TEMP dst, USE src, TEMP tmp);
+ format %{ "movdl $dst,$src.lo\n\t"
+ "movdl $tmp,$src.hi\n\t"
+ "punpckldq $dst,$tmp\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate4L" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
+ __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+#endif // _LP64
+
+// Replicate long (8 byte) scalar immediate to be vector by loading from const table.
+instruct Repl2L_imm(vecX dst, immL con) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateL con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate2L($con)\n\t"
+ "movlhps $dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress($con));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L_imm(vecY dst, immL con) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateL con));
+ format %{ "movsd $dst,[$constantaddress]\t! replicate4L($con)\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $constantaddress($con));
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Long could be loaded into xmm register directly from memory.
+instruct Repl2L_mem(vecX dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateL (LoadVector mem)));
+ format %{ "movq $dst,$mem\n\t"
+ "movlhps $dst,$dst\t! replicate2L" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $mem$$Address);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl4L_mem(vecY dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateL (LoadVector mem)));
+ format %{ "movq $dst,$mem\n\t"
+ "movlhps $dst,$dst\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate4L" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $mem$$Address);
+ __ movlhps($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate long (8 byte) scalar zero to be vector
+instruct Repl2L_zero(vecX dst, immL0 zero) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateL zero));
+ format %{ "pxor $dst,$dst\t! replicate2L zero" %}
+ ins_encode %{
+ __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4L_zero(vecY dst, immL0 zero) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateL zero));
+ format %{ "vxorpd $dst,$dst,$dst\t! replicate4L zero" %}
+ ins_encode %{
+ // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
+ bool vector256 = true;
+ __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate float (4 byte) scalar to be vector
+instruct Repl2F(vecD dst, regF src) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateF src));
+ format %{ "pshufd $dst,$dst,0x00\t! replicate2F" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4F(vecX dst, regF src) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateF src));
+ format %{ "pshufd $dst,$dst,0x00\t! replicate4F" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8F(vecY dst, regF src) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateF src));
+ format %{ "pshufd $dst,$src,0x00\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate8F" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate float (4 byte) scalar zero to be vector
+instruct Repl2F_zero(vecD dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateF zero));
+ format %{ "xorps $dst,$dst\t! replicate2F zero" %}
+ ins_encode %{
+ __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4F_zero(vecX dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateF zero));
+ format %{ "xorps $dst,$dst\t! replicate4F zero" %}
+ ins_encode %{
+ __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8F_zero(vecY dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateF zero));
+ format %{ "vxorps $dst,$dst,$dst\t! replicate8F zero" %}
+ ins_encode %{
+ bool vector256 = true;
+ __ vxorps($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Replicate double (8 bytes) scalar to be vector
+instruct Repl2D(vecX dst, regD src) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateD src));
+ format %{ "pshufd $dst,$src,0x44\t! replicate2D" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl4D(vecY dst, regD src) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateD src));
+ format %{ "pshufd $dst,$src,0x44\n\t"
+ "vinsertf128h $dst,$dst,$dst\t! replicate4D" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44);
+ __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+// Replicate double (8 byte) scalar zero to be vector
+instruct Repl2D_zero(vecX dst, immD0 zero) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateD zero));
+ format %{ "xorpd $dst,$dst\t! replicate2D zero" %}
+ ins_encode %{
+ __ xorpd($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4D_zero(vecY dst, immD0 zero) %{
+ predicate(n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateD zero));
+ format %{ "vxorpd $dst,$dst,$dst,vect256\t! replicate4D zero" %}
+ ins_encode %{
+ bool vector256 = true;
+ __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 05 18:15:17 2017 +0200
@@ -74,9 +74,6 @@
reg_def EAX(SOC, SOC, Op_RegI, 0, rax->as_VMReg());
reg_def ESP( NS, NS, Op_RegI, 4, rsp->as_VMReg());
-// Special Registers
-reg_def EFLAGS(SOC, SOC, 0, 8, VMRegImpl::Bad());
-
// Float registers. We treat TOS/FPR0 special. It is invisible to the
// allocator, and only shows up in the encodings.
reg_def FPR0L( SOC, SOC, Op_RegF, 0, VMRegImpl::Bad());
@@ -105,27 +102,6 @@
reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg());
reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next());
-// XMM registers. 128-bit registers or 4 words each, labeled a-d.
-// Word a in each register holds a Float, words ab hold a Double.
-// We currently do not use the SIMD capabilities, so registers cd
-// are unused at the moment.
-reg_def XMM0a( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());
-reg_def XMM0b( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next());
-reg_def XMM1a( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg());
-reg_def XMM1b( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next());
-reg_def XMM2a( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg());
-reg_def XMM2b( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next());
-reg_def XMM3a( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg());
-reg_def XMM3b( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next());
-reg_def XMM4a( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg());
-reg_def XMM4b( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next());
-reg_def XMM5a( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg());
-reg_def XMM5b( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next());
-reg_def XMM6a( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg());
-reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next());
-reg_def XMM7a( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg());
-reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next());
-
// Specify priority of register selection within phases of register
// allocation. Highest priority is first. A useful heuristic is to
// give registers a low priority when they are required by machine
@@ -138,15 +114,6 @@
FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H,
FPR6L, FPR6H, FPR7L, FPR7H );
-alloc_class chunk1( XMM0a, XMM0b,
- XMM1a, XMM1b,
- XMM2a, XMM2b,
- XMM3a, XMM3b,
- XMM4a, XMM4b,
- XMM5a, XMM5b,
- XMM6a, XMM6b,
- XMM7a, XMM7b, EFLAGS);
-
//----------Architecture Description Register Classes--------------------------
// Several register classes are automatically defined based upon information in
@@ -159,12 +126,12 @@
// Class for all registers
reg_class any_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP);
// Class for general registers
-reg_class e_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX);
+reg_class int_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX);
// Class for general registers which may be used for implicit null checks on win95
// Also safe for use by tailjump. We don't want to allocate in rbp,
-reg_class e_reg_no_rbp(EAX, EDX, EDI, ESI, ECX, EBX);
+reg_class int_reg_no_rbp(EAX, EDX, EDI, ESI, ECX, EBX);
// Class of "X" registers
-reg_class x_reg(EBX, ECX, EDX, EAX);
+reg_class int_x_reg(EBX, ECX, EDX, EAX);
// Class of registers that can appear in an address with no offset.
// EBP and ESP require an extra instruction byte for zero offset.
// Used in fast-unlock
@@ -193,8 +160,6 @@
reg_class sp_reg(ESP);
// Singleton class for instruction pointer
// reg_class ip_reg(EIP);
-// Singleton class for condition codes
-reg_class int_flags(EFLAGS);
// Class of integer register pairs
reg_class long_reg( EAX,EDX, ECX,EBX, EBP,EDI );
// Class of integer register pairs that aligns with calling convention
@@ -206,29 +171,18 @@
// Floating point registers. Notice FPR0 is not a choice.
// FPR0 is not ever allocated; we use clever encodings to fake
// a 2-address instructions out of Intels FP stack.
-reg_class flt_reg( FPR1L,FPR2L,FPR3L,FPR4L,FPR5L,FPR6L,FPR7L );
-
-// make a register class for SSE registers
-reg_class xmm_reg(XMM0a, XMM1a, XMM2a, XMM3a, XMM4a, XMM5a, XMM6a, XMM7a);
-
-// make a double register class for SSE2 registers
-reg_class xdb_reg(XMM0a,XMM0b, XMM1a,XMM1b, XMM2a,XMM2b, XMM3a,XMM3b,
- XMM4a,XMM4b, XMM5a,XMM5b, XMM6a,XMM6b, XMM7a,XMM7b );
-
-reg_class dbl_reg( FPR1L,FPR1H, FPR2L,FPR2H, FPR3L,FPR3H,
- FPR4L,FPR4H, FPR5L,FPR5H, FPR6L,FPR6H,
- FPR7L,FPR7H );
-
-reg_class flt_reg0( FPR1L );
-reg_class dbl_reg0( FPR1L,FPR1H );
-reg_class dbl_reg1( FPR2L,FPR2H );
-reg_class dbl_notreg0( FPR2L,FPR2H, FPR3L,FPR3H, FPR4L,FPR4H,
- FPR5L,FPR5H, FPR6L,FPR6H, FPR7L,FPR7H );
-
-// XMM6 and XMM7 could be used as temporary registers for long, float and
-// double values for SSE2.
-reg_class xdb_reg6( XMM6a,XMM6b );
-reg_class xdb_reg7( XMM7a,XMM7b );
+reg_class fp_flt_reg( FPR1L,FPR2L,FPR3L,FPR4L,FPR5L,FPR6L,FPR7L );
+
+reg_class fp_dbl_reg( FPR1L,FPR1H, FPR2L,FPR2H, FPR3L,FPR3H,
+ FPR4L,FPR4H, FPR5L,FPR5H, FPR6L,FPR6H,
+ FPR7L,FPR7H );
+
+reg_class fp_flt_reg0( FPR1L );
+reg_class fp_dbl_reg0( FPR1L,FPR1H );
+reg_class fp_dbl_reg1( FPR2L,FPR2H );
+reg_class fp_dbl_notreg0( FPR2L,FPR2H, FPR3L,FPR3H, FPR4L,FPR4H,
+ FPR5L,FPR5H, FPR6L,FPR6H, FPR7L,FPR7H );
+
%}
@@ -412,7 +366,7 @@
}
}
- // eRegI ereg, memory mem) %{ // emit_reg_mem
+ // rRegI ereg, memory mem) %{ // emit_reg_mem
void encode_RegMem( CodeBuffer &cbuf, int reg_encoding, int base, int index, int scale, int displace, bool displace_is_oop ) {
// There is no index & no scale, use form without SIB byte
if ((index == 0x4) &&
@@ -787,7 +741,7 @@
#endif
}
int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4);
- // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes.
+ // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
return size+5+offset_size;
}
@@ -821,7 +775,7 @@
}
#endif
}
- // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes.
+ // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
// Only MOVAPS SSE prefix uses 1 byte.
int sz = 4;
if (!(src_lo+1 == src_hi && dst_lo+1 == dst_hi) &&
@@ -903,6 +857,108 @@
return impl_helper(cbuf,do_size,false,offset,st_op,op,op_str,size, st);
}
+// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad.
+static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
+ int src_hi, int dst_hi, uint ireg, outputStream* st);
+
+static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
+ int stack_offset, int reg, uint ireg, outputStream* st);
+
+static int vec_stack_to_stack_helper(CodeBuffer *cbuf, bool do_size, int src_offset,
+ int dst_offset, uint ireg, outputStream* st) {
+ int calc_size = 0;
+ int src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
+ int dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
+ switch (ireg) {
+ case Op_VecS:
+ calc_size = 3+src_offset_size + 3+dst_offset_size;
+ break;
+ case Op_VecD:
+ calc_size = 3+src_offset_size + 3+dst_offset_size;
+ src_offset += 4;
+ dst_offset += 4;
+ src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
+ dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
+ calc_size += 3+src_offset_size + 3+dst_offset_size;
+ break;
+ case Op_VecX:
+ calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
+ break;
+ case Op_VecY:
+ calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ if (cbuf) {
+ MacroAssembler _masm(cbuf);
+ int offset = __ offset();
+ switch (ireg) {
+ case Op_VecS:
+ __ pushl(Address(rsp, src_offset));
+ __ popl (Address(rsp, dst_offset));
+ break;
+ case Op_VecD:
+ __ pushl(Address(rsp, src_offset));
+ __ popl (Address(rsp, dst_offset));
+ __ pushl(Address(rsp, src_offset+4));
+ __ popl (Address(rsp, dst_offset+4));
+ break;
+ case Op_VecX:
+ __ movdqu(Address(rsp, -16), xmm0);
+ __ movdqu(xmm0, Address(rsp, src_offset));
+ __ movdqu(Address(rsp, dst_offset), xmm0);
+ __ movdqu(xmm0, Address(rsp, -16));
+ break;
+ case Op_VecY:
+ __ vmovdqu(Address(rsp, -32), xmm0);
+ __ vmovdqu(xmm0, Address(rsp, src_offset));
+ __ vmovdqu(Address(rsp, dst_offset), xmm0);
+ __ vmovdqu(xmm0, Address(rsp, -32));
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ int size = __ offset() - offset;
+ assert(size == calc_size, "incorrect size calculattion");
+ return size;
+#ifndef PRODUCT
+ } else if (!do_size) {
+ switch (ireg) {
+ case Op_VecS:
+ st->print("pushl [rsp + #%d]\t# 32-bit mem-mem spill\n\t"
+ "popl [rsp + #%d]",
+ src_offset, dst_offset);
+ break;
+ case Op_VecD:
+ st->print("pushl [rsp + #%d]\t# 64-bit mem-mem spill\n\t"
+ "popq [rsp + #%d]\n\t"
+ "pushl [rsp + #%d]\n\t"
+ "popq [rsp + #%d]",
+ src_offset, dst_offset, src_offset+4, dst_offset+4);
+ break;
+ case Op_VecX:
+ st->print("movdqu [rsp - #16], xmm0\t# 128-bit mem-mem spill\n\t"
+ "movdqu xmm0, [rsp + #%d]\n\t"
+ "movdqu [rsp + #%d], xmm0\n\t"
+ "movdqu xmm0, [rsp - #16]",
+ src_offset, dst_offset);
+ break;
+ case Op_VecY:
+ st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t"
+ "vmovdqu xmm0, [rsp + #%d]\n\t"
+ "vmovdqu [rsp + #%d], xmm0\n\t"
+ "vmovdqu xmm0, [rsp - #32]",
+ src_offset, dst_offset);
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+#endif
+ }
+ return calc_size;
+}
+
uint MachSpillCopyNode::implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const {
// Get registers to move
OptoReg::Name src_second = ra_->get_reg_second(in(1));
@@ -923,6 +979,29 @@
if( src_first == dst_first && src_second == dst_second )
return size; // Self copy, no move
+ if (bottom_type()->isa_vect() != NULL) {
+ uint ireg = ideal_reg();
+ assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity");
+ assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity");
+ assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity");
+ if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
+ // mem -> mem
+ int src_offset = ra_->reg2offset(src_first);
+ int dst_offset = ra_->reg2offset(dst_first);
+ return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st);
+ } else if (src_first_rc == rc_xmm && dst_first_rc == rc_xmm ) {
+ return vec_mov_helper(cbuf, do_size, src_first, dst_first, src_second, dst_second, ireg, st);
+ } else if (src_first_rc == rc_xmm && dst_first_rc == rc_stack ) {
+ int stack_offset = ra_->reg2offset(dst_first);
+ return vec_spill_helper(cbuf, do_size, false, stack_offset, src_first, ireg, st);
+ } else if (src_first_rc == rc_stack && dst_first_rc == rc_xmm ) {
+ int stack_offset = ra_->reg2offset(src_first);
+ return vec_spill_helper(cbuf, do_size, true, stack_offset, dst_first, ireg, st);
+ } else {
+ ShouldNotReachHere();
+ }
+ }
+
// --------------------------------------
// Check for mem-mem move. push/pop to move.
if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
@@ -1313,16 +1392,6 @@
return true;
}
-// Vector width in bytes
-const uint Matcher::vector_width_in_bytes(void) {
- return UseSSE >= 2 ? 8 : 0;
-}
-
-// Vector ideal reg
-const uint Matcher::vector_ideal_reg(void) {
- return Op_RegD;
-}
-
// Is this branch offset short enough that a short branch can be used?
//
// NOTE: If the platform does not provide any short branch variants, then
@@ -1452,7 +1521,7 @@
// arguments in those registers not be available to the callee.
bool Matcher::can_be_java_arg( int reg ) {
if( reg == ECX_num || reg == EDX_num ) return true;
- if( (reg == XMM0a_num || reg == XMM1a_num) && UseSSE>=1 ) return true;
+ if( (reg == XMM0_num || reg == XMM1_num ) && UseSSE>=1 ) return true;
if( (reg == XMM0b_num || reg == XMM1b_num) && UseSSE>=2 ) return true;
return false;
}
@@ -1565,16 +1634,16 @@
emit_opcode(cbuf,0x66);
%}
- enc_class RegReg (eRegI dst, eRegI src) %{ // RegReg(Many)
+ enc_class RegReg (rRegI dst, rRegI src) %{ // RegReg(Many)
emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
%}
- enc_class OpcRegReg (immI opcode, eRegI dst, eRegI src) %{ // OpcRegReg(Many)
+ enc_class OpcRegReg (immI opcode, rRegI dst, rRegI src) %{ // OpcRegReg(Many)
emit_opcode(cbuf,$opcode$$constant);
emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
%}
- enc_class mov_r32_imm0( eRegI dst ) %{
+ enc_class mov_r32_imm0( rRegI dst ) %{
emit_opcode( cbuf, 0xB8 + $dst$$reg ); // 0xB8+ rd -- MOV r32 ,imm32
emit_d32 ( cbuf, 0x0 ); // imm32==0x0
%}
@@ -1621,7 +1690,7 @@
%}
// Dense encoding for older common ops
- enc_class Opc_plus(immI opcode, eRegI reg) %{
+ enc_class Opc_plus(immI opcode, rRegI reg) %{
emit_opcode(cbuf, $opcode$$constant + $reg$$reg);
%}
@@ -1637,7 +1706,7 @@
}
%}
- enc_class OpcSErm (eRegI dst, immI imm) %{ // OpcSEr/m
+ enc_class OpcSErm (rRegI dst, immI imm) %{ // OpcSEr/m
// Emit primary opcode and set sign-extend bit
// Check for 8-bit immediate, and set sign extend bit in opcode
if (($imm$$constant >= -128) && ($imm$$constant <= 127)) {
@@ -1682,7 +1751,7 @@
else emit_d32(cbuf,con);
%}
- enc_class OpcSReg (eRegI dst) %{ // BSWAP
+ enc_class OpcSReg (rRegI dst) %{ // BSWAP
emit_cc(cbuf, $secondary, $dst$$reg );
%}
@@ -1700,7 +1769,7 @@
emit_rm(cbuf, 0x3, destlo, desthi);
%}
- enc_class RegOpc (eRegI div) %{ // IDIV, IMOD, JMP indirect, ...
+ enc_class RegOpc (rRegI div) %{ // IDIV, IMOD, JMP indirect, ...
emit_rm(cbuf, 0x3, $secondary, $div$$reg );
%}
@@ -1891,20 +1960,20 @@
// runtime_call_Relocation::spec(), RELOC_IMM32 );
// %}
- enc_class RegOpcImm (eRegI dst, immI8 shift) %{ // SHL, SAR, SHR
+ enc_class RegOpcImm (rRegI dst, immI8 shift) %{ // SHL, SAR, SHR
$$$emit8$primary;
emit_rm(cbuf, 0x3, $secondary, $dst$$reg);
$$$emit8$shift$$constant;
%}
- enc_class LdImmI (eRegI dst, immI src) %{ // Load Immediate
+ enc_class LdImmI (rRegI dst, immI src) %{ // Load Immediate
// Load immediate does not have a zero or sign extended version
// for 8-bit immediates
emit_opcode(cbuf, 0xB8 + $dst$$reg);
$$$emit32$src$$constant;
%}
- enc_class LdImmP (eRegI dst, immI src) %{ // Load Immediate
+ enc_class LdImmP (rRegI dst, immI src) %{ // Load Immediate
// Load immediate does not have a zero or sign extended version
// for 8-bit immediates
emit_opcode(cbuf, $primary + $dst$$reg);
@@ -1943,15 +2012,15 @@
// Encode a reg-reg copy. If it is useless, then empty encoding.
- enc_class enc_Copy( eRegI dst, eRegI src ) %{
+ enc_class enc_Copy( rRegI dst, rRegI src ) %{
encode_Copy( cbuf, $dst$$reg, $src$$reg );
%}
- enc_class enc_CopyL_Lo( eRegI dst, eRegL src ) %{
+ enc_class enc_CopyL_Lo( rRegI dst, eRegL src ) %{
encode_Copy( cbuf, $dst$$reg, $src$$reg );
%}
- enc_class RegReg (eRegI dst, eRegI src) %{ // RegReg(Many)
+ enc_class RegReg (rRegI dst, rRegI src) %{ // RegReg(Many)
emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
%}
@@ -1973,7 +2042,7 @@
emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), HIGH_FROM_LOW($src$$reg));
%}
- enc_class RegReg_HiLo( eRegL src, eRegI dst ) %{
+ enc_class RegReg_HiLo( eRegL src, rRegI dst ) %{
emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($src$$reg));
%}
@@ -2068,7 +2137,7 @@
cbuf.set_insts_mark(); // Mark start of opcode for reloc info in mem operand
%}
- enc_class RegMem (eRegI ereg, memory mem) %{ // emit_reg_mem
+ enc_class RegMem (rRegI ereg, memory mem) %{ // emit_reg_mem
int reg_encoding = $ereg$$reg;
int base = $mem$$base;
int index = $mem$$index;
@@ -2132,7 +2201,7 @@
// Clone of RegMem but accepts an extra parameter to access each
// half of a double in memory; it never needs relocation info.
- enc_class Mov_MemD_half_to_Reg (immI opcode, memory mem, immI disp_for_half, eRegI rm_reg) %{
+ enc_class Mov_MemD_half_to_Reg (immI opcode, memory mem, immI disp_for_half, rRegI rm_reg) %{
emit_opcode(cbuf,$opcode$$constant);
int reg_encoding = $rm_reg$$reg;
int base = $mem$$base;
@@ -2168,7 +2237,7 @@
encode_RegMem(cbuf, rm_byte_opcode, base, index, scale, displace, disp_is_oop);
%}
- enc_class RegLea (eRegI dst, eRegI src0, immI src1 ) %{ // emit_reg_lea
+ enc_class RegLea (rRegI dst, rRegI src0, immI src1 ) %{ // emit_reg_lea
int reg_encoding = $dst$$reg;
int base = $src0$$reg; // 0xFFFFFFFF indicates no base
int index = 0x04; // 0x04 indicates no index
@@ -2178,7 +2247,7 @@
encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_is_oop);
%}
- enc_class min_enc (eRegI dst, eRegI src) %{ // MIN
+ enc_class min_enc (rRegI dst, rRegI src) %{ // MIN
// Compare dst,src
emit_opcode(cbuf,0x3B);
emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
@@ -2190,7 +2259,7 @@
emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
%}
- enc_class max_enc (eRegI dst, eRegI src) %{ // MAX
+ enc_class max_enc (rRegI dst, rRegI src) %{ // MAX
// Compare dst,src
emit_opcode(cbuf,0x3B);
emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
@@ -2221,7 +2290,7 @@
encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_is_oop);
%}
- enc_class neg_reg(eRegI dst) %{
+ enc_class neg_reg(rRegI dst) %{
// NEG $dst
emit_opcode(cbuf,0xF7);
emit_rm(cbuf, 0x3, 0x03, $dst$$reg );
@@ -2251,7 +2320,7 @@
emit_rm(cbuf, 0x3, $p$$reg, tmpReg);
%}
- enc_class enc_cmpLTP_mem(eRegI p, eRegI q, memory mem, eCXRegI tmp) %{ // cadd_cmpLT
+ enc_class enc_cmpLTP_mem(rRegI p, rRegI q, memory mem, eCXRegI tmp) %{ // cadd_cmpLT
int tmpReg = $tmp$$reg;
// SUB $p,$q
@@ -2390,12 +2459,12 @@
%}
// Special case for moving an integer register to a stack slot.
- enc_class OpcPRegSS( stackSlotI dst, eRegI src ) %{ // RegSS
+ enc_class OpcPRegSS( stackSlotI dst, rRegI src ) %{ // RegSS
store_to_stackslot( cbuf, $primary, $src$$reg, $dst$$disp );
%}
// Special case for moving a register to a stack slot.
- enc_class RegSS( stackSlotI dst, eRegI src ) %{ // RegSS
+ enc_class RegSS( stackSlotI dst, rRegI src ) %{ // RegSS
// Opcode already emitted
emit_rm( cbuf, 0x02, $src$$reg, ESP_enc ); // R/M byte
emit_rm( cbuf, 0x00, ESP_enc, ESP_enc); // SIB byte
@@ -2640,7 +2709,7 @@
// equal_result = 0;
// nan_result = -1;
- enc_class CmpF_Result(eRegI dst) %{
+ enc_class CmpF_Result(rRegI dst) %{
// fnstsw_ax();
emit_opcode( cbuf, 0xDF);
emit_opcode( cbuf, 0xE0);
@@ -2685,7 +2754,7 @@
// done:
%}
- enc_class convert_int_long( regL dst, eRegI src ) %{
+ enc_class convert_int_long( regL dst, rRegI src ) %{
// mov $dst.lo,$src
int dst_encoding = $dst$$reg;
int src_encoding = $src$$reg;
@@ -2754,7 +2823,7 @@
emit_rm( cbuf, 0x3, 0x4, $src$$reg);
%}
- enc_class long_multiply( eADXRegL dst, eRegL src, eRegI tmp ) %{
+ enc_class long_multiply( eADXRegL dst, eRegL src, rRegI tmp ) %{
// Basic idea: lo(result) = lo(x_lo * y_lo)
// hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
// MOV $tmp,$src.lo
@@ -2780,7 +2849,7 @@
emit_rm( cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), $tmp$$reg );
%}
- enc_class long_multiply_con( eADXRegL dst, immL_127 src, eRegI tmp ) %{
+ enc_class long_multiply_con( eADXRegL dst, immL_127 src, rRegI tmp ) %{
// Basic idea: lo(result) = lo(src * y_lo)
// hi(result) = hi(src * y_lo) + lo(src * y_hi)
// IMUL $tmp,EDX,$src
@@ -2836,7 +2905,7 @@
emit_d8(cbuf, 4*4);
%}
- enc_class long_cmp_flags0( eRegL src, eRegI tmp ) %{
+ enc_class long_cmp_flags0( eRegL src, rRegI tmp ) %{
// MOV $tmp,$src.lo
emit_opcode(cbuf, 0x8B);
emit_rm(cbuf, 0x3, $tmp$$reg, $src$$reg);
@@ -2857,7 +2926,7 @@
emit_rm(cbuf, 0x3, HIGH_FROM_LOW($src1$$reg), HIGH_FROM_LOW($src2$$reg) );
%}
- enc_class long_cmp_flags2( eRegL src1, eRegL src2, eRegI tmp ) %{
+ enc_class long_cmp_flags2( eRegL src1, eRegL src2, rRegI tmp ) %{
// CMP $src1.lo,$src2.lo\t! Long compare; set flags for low bits
emit_opcode( cbuf, 0x3B );
emit_rm(cbuf, 0x3, $src1$$reg, $src2$$reg );
@@ -2869,7 +2938,7 @@
emit_rm(cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($src2$$reg) );
%}
- enc_class long_cmp_flags3( eRegL src, eRegI tmp ) %{
+ enc_class long_cmp_flags3( eRegL src, rRegI tmp ) %{
// XOR $tmp,$tmp
emit_opcode(cbuf,0x33); // XOR
emit_rm(cbuf,0x3, $tmp$$reg, $tmp$$reg);
@@ -3762,9 +3831,9 @@
// in SSE2+ mode we want to keep the FPU stack clean so pretend
// that C functions return float and double results in XMM0.
if( ideal_reg == Op_RegD && UseSSE>=2 )
- return OptoRegPair(XMM0b_num,XMM0a_num);
+ return OptoRegPair(XMM0b_num,XMM0_num);
if( ideal_reg == Op_RegF && UseSSE>=2 )
- return OptoRegPair(OptoReg::Bad,XMM0a_num);
+ return OptoRegPair(OptoReg::Bad,XMM0_num);
return OptoRegPair(hi[ideal_reg],lo[ideal_reg]);
%}
@@ -3775,9 +3844,9 @@
static int lo[Op_RegL+1] = { 0, 0, OptoReg::Bad, EAX_num, EAX_num, FPR1L_num, FPR1L_num, EAX_num };
static int hi[Op_RegL+1] = { 0, 0, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, FPR1H_num, EDX_num };
if( ideal_reg == Op_RegD && UseSSE>=2 )
- return OptoRegPair(XMM0b_num,XMM0a_num);
+ return OptoRegPair(XMM0b_num,XMM0_num);
if( ideal_reg == Op_RegF && UseSSE>=1 )
- return OptoRegPair(OptoReg::Bad,XMM0a_num);
+ return OptoRegPair(OptoReg::Bad,XMM0_num);
return OptoRegPair(hi[ideal_reg],lo[ideal_reg]);
%}
@@ -4147,8 +4216,8 @@
// Register Operands
// Integer Register
-operand eRegI() %{
- constraint(ALLOC_IN_RC(e_reg));
+operand rRegI() %{
+ constraint(ALLOC_IN_RC(int_reg));
match(RegI);
match(xRegI);
match(eAXRegI);
@@ -4163,8 +4232,8 @@
%}
// Subset of Integer Register
-operand xRegI(eRegI reg) %{
- constraint(ALLOC_IN_RC(x_reg));
+operand xRegI(rRegI reg) %{
+ constraint(ALLOC_IN_RC(int_x_reg));
match(reg);
match(eAXRegI);
match(eBXRegI);
@@ -4179,7 +4248,7 @@
operand eAXRegI(xRegI reg) %{
constraint(ALLOC_IN_RC(eax_reg));
match(reg);
- match(eRegI);
+ match(rRegI);
format %{ "EAX" %}
interface(REG_INTER);
@@ -4189,7 +4258,7 @@
operand eBXRegI(xRegI reg) %{
constraint(ALLOC_IN_RC(ebx_reg));
match(reg);
- match(eRegI);
+ match(rRegI);
format %{ "EBX" %}
interface(REG_INTER);
@@ -4198,7 +4267,7 @@
operand eCXRegI(xRegI reg) %{
constraint(ALLOC_IN_RC(ecx_reg));
match(reg);
- match(eRegI);
+ match(rRegI);
format %{ "ECX" %}
interface(REG_INTER);
@@ -4207,7 +4276,7 @@
operand eDXRegI(xRegI reg) %{
constraint(ALLOC_IN_RC(edx_reg));
match(reg);
- match(eRegI);
+ match(rRegI);
format %{ "EDX" %}
interface(REG_INTER);
@@ -4216,7 +4285,7 @@
operand eDIRegI(xRegI reg) %{
constraint(ALLOC_IN_RC(edi_reg));
match(reg);
- match(eRegI);
+ match(rRegI);
format %{ "EDI" %}
interface(REG_INTER);
@@ -4263,7 +4332,7 @@
operand eSIRegI(xRegI reg) %{
constraint(ALLOC_IN_RC(esi_reg));
match(reg);
- match(eRegI);
+ match(rRegI);
format %{ "ESI" %}
interface(REG_INTER);
@@ -4284,7 +4353,7 @@
%}
operand eRegP() %{
- constraint(ALLOC_IN_RC(e_reg));
+ constraint(ALLOC_IN_RC(int_reg));
match(RegP);
match(eAXRegP);
match(eBXRegP);
@@ -4297,7 +4366,7 @@
// On windows95, EBP is not safe to use for implicit null tests.
operand eRegP_no_EBP() %{
- constraint(ALLOC_IN_RC(e_reg_no_rbp));
+ constraint(ALLOC_IN_RC(int_reg_no_rbp));
match(RegP);
match(eAXRegP);
match(eBXRegP);
@@ -4477,7 +4546,7 @@
// Float register operands
operand regDPR() %{
predicate( UseSSE < 2 );
- constraint(ALLOC_IN_RC(dbl_reg));
+ constraint(ALLOC_IN_RC(fp_dbl_reg));
match(RegD);
match(regDPR1);
match(regDPR2);
@@ -4487,7 +4556,7 @@
operand regDPR1(regDPR reg) %{
predicate( UseSSE < 2 );
- constraint(ALLOC_IN_RC(dbl_reg0));
+ constraint(ALLOC_IN_RC(fp_dbl_reg0));
match(reg);
format %{ "FPR1" %}
interface(REG_INTER);
@@ -4495,7 +4564,7 @@
operand regDPR2(regDPR reg) %{
predicate( UseSSE < 2 );
- constraint(ALLOC_IN_RC(dbl_reg1));
+ constraint(ALLOC_IN_RC(fp_dbl_reg1));
match(reg);
format %{ "FPR2" %}
interface(REG_INTER);
@@ -4503,45 +4572,16 @@
operand regnotDPR1(regDPR reg) %{
predicate( UseSSE < 2 );
- constraint(ALLOC_IN_RC(dbl_notreg0));
+ constraint(ALLOC_IN_RC(fp_dbl_notreg0));
match(reg);
format %{ %}
interface(REG_INTER);
%}
-// XMM Double register operands
-operand regD() %{
- predicate( UseSSE>=2 );
- constraint(ALLOC_IN_RC(xdb_reg));
- match(RegD);
- match(regD6);
- match(regD7);
- format %{ %}
- interface(REG_INTER);
-%}
-
-// XMM6 double register operands
-operand regD6(regD reg) %{
- predicate( UseSSE>=2 );
- constraint(ALLOC_IN_RC(xdb_reg6));
- match(reg);
- format %{ "XMM6" %}
- interface(REG_INTER);
-%}
-
-// XMM7 double register operands
-operand regD7(regD reg) %{
- predicate( UseSSE>=2 );
- constraint(ALLOC_IN_RC(xdb_reg7));
- match(reg);
- format %{ "XMM7" %}
- interface(REG_INTER);
-%}
-
// Float register operands
operand regFPR() %{
predicate( UseSSE < 2 );
- constraint(ALLOC_IN_RC(flt_reg));
+ constraint(ALLOC_IN_RC(fp_flt_reg));
match(RegF);
match(regFPR1);
format %{ %}
@@ -4551,21 +4591,30 @@
// Float register operands
operand regFPR1(regFPR reg) %{
predicate( UseSSE < 2 );
- constraint(ALLOC_IN_RC(flt_reg0));
+ constraint(ALLOC_IN_RC(fp_flt_reg0));
match(reg);
format %{ "FPR1" %}
interface(REG_INTER);
%}
-// XMM register operands
+// XMM Float register operands
operand regF() %{
predicate( UseSSE>=1 );
- constraint(ALLOC_IN_RC(xmm_reg));
+ constraint(ALLOC_IN_RC(float_reg));
match(RegF);
format %{ %}
interface(REG_INTER);
%}
+// XMM Double register operands
+operand regD() %{
+ predicate( UseSSE>=2 );
+ constraint(ALLOC_IN_RC(double_reg));
+ match(RegD);
+ format %{ %}
+ interface(REG_INTER);
+%}
+
//----------Memory Operands----------------------------------------------------
// Direct Memory Operand
@@ -4583,7 +4632,7 @@
// Indirect Memory Operand
operand indirect(eRegP reg) %{
- constraint(ALLOC_IN_RC(e_reg));
+ constraint(ALLOC_IN_RC(int_reg));
match(reg);
format %{ "[$reg]" %}
@@ -4622,7 +4671,7 @@
%}
// Indirect Memory Plus Long Offset Operand
-operand indOffset32X(eRegI reg, immP off) %{
+operand indOffset32X(rRegI reg, immP off) %{
match(AddP off reg);
format %{ "[$reg + $off]" %}
@@ -4635,7 +4684,7 @@
%}
// Indirect Memory Plus Index Register Plus Offset Operand
-operand indIndexOffset(eRegP reg, eRegI ireg, immI off) %{
+operand indIndexOffset(eRegP reg, rRegI ireg, immI off) %{
match(AddP (AddP reg ireg) off);
op_cost(10);
@@ -4649,7 +4698,7 @@
%}
// Indirect Memory Plus Index Register Plus Offset Operand
-operand indIndex(eRegP reg, eRegI ireg) %{
+operand indIndex(eRegP reg, rRegI ireg) %{
match(AddP reg ireg);
op_cost(10);
@@ -4667,7 +4716,7 @@
// // -------------------------------------------------------------------------
// // Scaled Memory Operands
// // Indirect Memory Times Scale Plus Offset Operand
-// operand indScaleOffset(immP off, eRegI ireg, immI2 scale) %{
+// operand indScaleOffset(immP off, rRegI ireg, immI2 scale) %{
// match(AddP off (LShiftI ireg scale));
//
// op_cost(10);
@@ -4681,7 +4730,7 @@
// %}
// Indirect Memory Times Scale Plus Index Register
-operand indIndexScale(eRegP reg, eRegI ireg, immI2 scale) %{
+operand indIndexScale(eRegP reg, rRegI ireg, immI2 scale) %{
match(AddP reg (LShiftI ireg scale));
op_cost(10);
@@ -4695,7 +4744,7 @@
%}
// Indirect Memory Times Scale Plus Index Register Plus Offset Operand
-operand indIndexScaleOffset(eRegP reg, immI off, eRegI ireg, immI2 scale) %{
+operand indIndexScaleOffset(eRegP reg, immI off, rRegI ireg, immI2 scale) %{
match(AddP (AddP reg (LShiftI ireg scale)) off);
op_cost(10);
@@ -4823,7 +4872,7 @@
// Indirect Memory Operand
operand indirect_win95_safe(eRegP_no_EBP reg)
%{
- constraint(ALLOC_IN_RC(e_reg));
+ constraint(ALLOC_IN_RC(int_reg));
match(reg);
op_cost(100);
@@ -4867,7 +4916,7 @@
%}
// Indirect Memory Plus Index Register Plus Offset Operand
-operand indIndexOffset_win95_safe(eRegP_no_EBP reg, eRegI ireg, immI off)
+operand indIndexOffset_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI off)
%{
match(AddP (AddP reg ireg) off);
@@ -4882,7 +4931,7 @@
%}
// Indirect Memory Times Scale Plus Index Register
-operand indIndexScale_win95_safe(eRegP_no_EBP reg, eRegI ireg, immI2 scale)
+operand indIndexScale_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI2 scale)
%{
match(AddP reg (LShiftI ireg scale));
@@ -4897,7 +4946,7 @@
%}
// Indirect Memory Times Scale Plus Index Register Plus Offset Operand
-operand indIndexScaleOffset_win95_safe(eRegP_no_EBP reg, immI off, eRegI ireg, immI2 scale)
+operand indIndexScaleOffset_win95_safe(eRegP_no_EBP reg, immI off, rRegI ireg, immI2 scale)
%{
match(AddP (AddP reg (LShiftI ireg scale)) off);
@@ -5086,7 +5135,7 @@
// Or: _mem if it requires the big decoder and a memory unit.
// Integer ALU reg operation
-pipe_class ialu_reg(eRegI dst) %{
+pipe_class ialu_reg(rRegI dst) %{
single_instruction;
dst : S4(write);
dst : S3(read);
@@ -5104,7 +5153,7 @@
%}
// Integer ALU reg operation using big decoder
-pipe_class ialu_reg_fat(eRegI dst) %{
+pipe_class ialu_reg_fat(rRegI dst) %{
single_instruction;
dst : S4(write);
dst : S3(read);
@@ -5122,7 +5171,7 @@
%}
// Integer ALU reg-reg operation
-pipe_class ialu_reg_reg(eRegI dst, eRegI src) %{
+pipe_class ialu_reg_reg(rRegI dst, rRegI src) %{
single_instruction;
dst : S4(write);
src : S3(read);
@@ -5140,7 +5189,7 @@
%}
// Integer ALU reg-reg operation
-pipe_class ialu_reg_reg_fat(eRegI dst, memory src) %{
+pipe_class ialu_reg_reg_fat(rRegI dst, memory src) %{
single_instruction;
dst : S4(write);
src : S3(read);
@@ -5158,7 +5207,7 @@
%}
// Integer ALU reg-mem operation
-pipe_class ialu_reg_mem(eRegI dst, memory mem) %{
+pipe_class ialu_reg_mem(rRegI dst, memory mem) %{
single_instruction;
dst : S5(write);
mem : S3(read);
@@ -5187,7 +5236,7 @@
%}
// Integer Store to Memory
-pipe_class ialu_mem_reg(memory mem, eRegI src) %{
+pipe_class ialu_mem_reg(memory mem, rRegI src) %{
single_instruction;
mem : S3(read);
src : S5(read);
@@ -5216,7 +5265,7 @@
%}
// Integer ALU0 reg-reg operation
-pipe_class ialu_reg_reg_alu0(eRegI dst, eRegI src) %{
+pipe_class ialu_reg_reg_alu0(rRegI dst, rRegI src) %{
single_instruction;
dst : S4(write);
src : S3(read);
@@ -5225,7 +5274,7 @@
%}
// Integer ALU0 reg-mem operation
-pipe_class ialu_reg_mem_alu0(eRegI dst, memory mem) %{
+pipe_class ialu_reg_mem_alu0(rRegI dst, memory mem) %{
single_instruction;
dst : S5(write);
mem : S3(read);
@@ -5235,7 +5284,7 @@
%}
// Integer ALU reg-reg operation
-pipe_class ialu_cr_reg_reg(eFlagsReg cr, eRegI src1, eRegI src2) %{
+pipe_class ialu_cr_reg_reg(eFlagsReg cr, rRegI src1, rRegI src2) %{
single_instruction;
cr : S4(write);
src1 : S3(read);
@@ -5245,7 +5294,7 @@
%}
// Integer ALU reg-imm operation
-pipe_class ialu_cr_reg_imm(eFlagsReg cr, eRegI src1) %{
+pipe_class ialu_cr_reg_imm(eFlagsReg cr, rRegI src1) %{
single_instruction;
cr : S4(write);
src1 : S3(read);
@@ -5254,7 +5303,7 @@
%}
// Integer ALU reg-mem operation
-pipe_class ialu_cr_reg_mem(eFlagsReg cr, eRegI src1, memory src2) %{
+pipe_class ialu_cr_reg_mem(eFlagsReg cr, rRegI src1, memory src2) %{
single_instruction;
cr : S4(write);
src1 : S3(read);
@@ -5265,7 +5314,7 @@
%}
// Conditional move reg-reg
-pipe_class pipe_cmplt( eRegI p, eRegI q, eRegI y ) %{
+pipe_class pipe_cmplt( rRegI p, rRegI q, rRegI y ) %{
instruction_count(4);
y : S4(read);
q : S3(read);
@@ -5274,7 +5323,7 @@
%}
// Conditional move reg-reg
-pipe_class pipe_cmov_reg( eRegI dst, eRegI src, eFlagsReg cr ) %{
+pipe_class pipe_cmov_reg( rRegI dst, rRegI src, eFlagsReg cr ) %{
single_instruction;
dst : S4(write);
src : S3(read);
@@ -5283,7 +5332,7 @@
%}
// Conditional move reg-mem
-pipe_class pipe_cmov_mem( eFlagsReg cr, eRegI dst, memory src) %{
+pipe_class pipe_cmov_mem( eFlagsReg cr, rRegI dst, memory src) %{
single_instruction;
dst : S4(write);
src : S3(read);
@@ -5534,7 +5583,7 @@
// in the encode section of the architecture description.
//----------BSWAP-Instruction--------------------------------------------------
-instruct bytes_reverse_int(eRegI dst) %{
+instruct bytes_reverse_int(rRegI dst) %{
match(Set dst (ReverseBytesI dst));
format %{ "BSWAP $dst" %}
@@ -5555,7 +5604,7 @@
ins_pipe( ialu_reg_reg);
%}
-instruct bytes_reverse_unsigned_short(eRegI dst, eFlagsReg cr) %{
+instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{
match(Set dst (ReverseBytesUS dst));
effect(KILL cr);
@@ -5568,7 +5617,7 @@
ins_pipe( ialu_reg );
%}
-instruct bytes_reverse_short(eRegI dst, eFlagsReg cr) %{
+instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{
match(Set dst (ReverseBytesS dst));
effect(KILL cr);
@@ -5584,7 +5633,7 @@
//---------- Zeros Count Instructions ------------------------------------------
-instruct countLeadingZerosI(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct countLeadingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{
predicate(UseCountLeadingZerosInstruction);
match(Set dst (CountLeadingZerosI src));
effect(KILL cr);
@@ -5596,7 +5645,7 @@
ins_pipe(ialu_reg);
%}
-instruct countLeadingZerosI_bsr(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct countLeadingZerosI_bsr(rRegI dst, rRegI src, eFlagsReg cr) %{
predicate(!UseCountLeadingZerosInstruction);
match(Set dst (CountLeadingZerosI src));
effect(KILL cr);
@@ -5621,7 +5670,7 @@
ins_pipe(ialu_reg);
%}
-instruct countLeadingZerosL(eRegI dst, eRegL src, eFlagsReg cr) %{
+instruct countLeadingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
predicate(UseCountLeadingZerosInstruction);
match(Set dst (CountLeadingZerosL src));
effect(TEMP dst, KILL cr);
@@ -5644,7 +5693,7 @@
ins_pipe(ialu_reg);
%}
-instruct countLeadingZerosL_bsr(eRegI dst, eRegL src, eFlagsReg cr) %{
+instruct countLeadingZerosL_bsr(rRegI dst, eRegL src, eFlagsReg cr) %{
predicate(!UseCountLeadingZerosInstruction);
match(Set dst (CountLeadingZerosL src));
effect(TEMP dst, KILL cr);
@@ -5680,7 +5729,7 @@
ins_pipe(ialu_reg);
%}
-instruct countTrailingZerosI(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct countTrailingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (CountTrailingZerosI src));
effect(KILL cr);
@@ -5699,7 +5748,7 @@
ins_pipe(ialu_reg);
%}
-instruct countTrailingZerosL(eRegI dst, eRegL src, eFlagsReg cr) %{
+instruct countTrailingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
match(Set dst (CountTrailingZerosL src));
effect(TEMP dst, KILL cr);
@@ -5731,7 +5780,7 @@
//---------- Population Count Instructions -------------------------------------
-instruct popCountI(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct popCountI(rRegI dst, rRegI src, eFlagsReg cr) %{
predicate(UsePopCountInstruction);
match(Set dst (PopCountI src));
effect(KILL cr);
@@ -5743,7 +5792,7 @@
ins_pipe(ialu_reg);
%}
-instruct popCountI_mem(eRegI dst, memory mem, eFlagsReg cr) %{
+instruct popCountI_mem(rRegI dst, memory mem, eFlagsReg cr) %{
predicate(UsePopCountInstruction);
match(Set dst (PopCountI (LoadI mem)));
effect(KILL cr);
@@ -5756,7 +5805,7 @@
%}
// Note: Long.bitCount(long) returns an int.
-instruct popCountL(eRegI dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct popCountL(rRegI dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
predicate(UsePopCountInstruction);
match(Set dst (PopCountL src));
effect(KILL cr, TEMP tmp, TEMP dst);
@@ -5773,7 +5822,7 @@
%}
// Note: Long.bitCount(long) returns an int.
-instruct popCountL_mem(eRegI dst, memory mem, eRegI tmp, eFlagsReg cr) %{
+instruct popCountL_mem(rRegI dst, memory mem, rRegI tmp, eFlagsReg cr) %{
predicate(UsePopCountInstruction);
match(Set dst (PopCountL (LoadL mem)));
effect(KILL cr, TEMP tmp, TEMP dst);
@@ -5877,7 +5926,7 @@
%}
// Load Short (16bit signed)
-instruct loadS(eRegI dst, memory mem) %{
+instruct loadS(rRegI dst, memory mem) %{
match(Set dst (LoadS mem));
ins_cost(125);
@@ -5891,7 +5940,7 @@
%}
// Load Short (16 bit signed) to Byte (8 bit signed)
-instruct loadS2B(eRegI dst, memory mem, immI_24 twentyfour) %{
+instruct loadS2B(rRegI dst, memory mem, immI_24 twentyfour) %{
match(Set dst (RShiftI (LShiftI (LoadS mem) twentyfour) twentyfour));
ins_cost(125);
@@ -5922,7 +5971,7 @@
%}
// Load Unsigned Short/Char (16bit unsigned)
-instruct loadUS(eRegI dst, memory mem) %{
+instruct loadUS(rRegI dst, memory mem) %{
match(Set dst (LoadUS mem));
ins_cost(125);
@@ -5936,7 +5985,7 @@
%}
// Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed)
-instruct loadUS2B(eRegI dst, memory mem, immI_24 twentyfour) %{
+instruct loadUS2B(rRegI dst, memory mem, immI_24 twentyfour) %{
match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour));
ins_cost(125);
@@ -5997,7 +6046,7 @@
%}
// Load Integer
-instruct loadI(eRegI dst, memory mem) %{
+instruct loadI(rRegI dst, memory mem) %{
match(Set dst (LoadI mem));
ins_cost(125);
@@ -6011,7 +6060,7 @@
%}
// Load Integer (32 bit signed) to Byte (8 bit signed)
-instruct loadI2B(eRegI dst, memory mem, immI_24 twentyfour) %{
+instruct loadI2B(rRegI dst, memory mem, immI_24 twentyfour) %{
match(Set dst (RShiftI (LShiftI (LoadI mem) twentyfour) twentyfour));
ins_cost(125);
@@ -6023,7 +6072,7 @@
%}
// Load Integer (32 bit signed) to Unsigned Byte (8 bit UNsigned)
-instruct loadI2UB(eRegI dst, memory mem, immI_255 mask) %{
+instruct loadI2UB(rRegI dst, memory mem, immI_255 mask) %{
match(Set dst (AndI (LoadI mem) mask));
ins_cost(125);
@@ -6035,7 +6084,7 @@
%}
// Load Integer (32 bit signed) to Short (16 bit signed)
-instruct loadI2S(eRegI dst, memory mem, immI_16 sixteen) %{
+instruct loadI2S(rRegI dst, memory mem, immI_16 sixteen) %{
match(Set dst (RShiftI (LShiftI (LoadI mem) sixteen) sixteen));
ins_cost(125);
@@ -6047,7 +6096,7 @@
%}
// Load Integer (32 bit signed) to Unsigned Short/Char (16 bit UNsigned)
-instruct loadI2US(eRegI dst, memory mem, immI_65535 mask) %{
+instruct loadI2US(rRegI dst, memory mem, immI_65535 mask) %{
match(Set dst (AndI (LoadI mem) mask));
ins_cost(125);
@@ -6208,7 +6257,7 @@
%}
// Load Range
-instruct loadRange(eRegI dst, memory mem) %{
+instruct loadRange(rRegI dst, memory mem) %{
match(Set dst (LoadRange mem));
ins_cost(125);
@@ -6305,66 +6354,6 @@
ins_pipe( fpu_reg_mem );
%}
-// Load Aligned Packed Byte to XMM register
-instruct loadA8B(regD dst, memory mem) %{
- predicate(UseSSE>=1);
- match(Set dst (Load8B mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed8B" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Short to XMM register
-instruct loadA4S(regD dst, memory mem) %{
- predicate(UseSSE>=1);
- match(Set dst (Load4S mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed4S" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Char to XMM register
-instruct loadA4C(regD dst, memory mem) %{
- predicate(UseSSE>=1);
- match(Set dst (Load4C mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed4C" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Integer to XMM register
-instruct load2IU(regD dst, memory mem) %{
- predicate(UseSSE>=1);
- match(Set dst (Load2I mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed2I" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Single to XMM
-instruct loadA2F(regD dst, memory mem) %{
- predicate(UseSSE>=1);
- match(Set dst (Load2F mem));
- ins_cost(145);
- format %{ "MOVQ $dst,$mem\t! packed2F" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
// Load Effective Address
instruct leaP8(eRegP dst, indOffset8 mem) %{
match(Set dst mem);
@@ -6417,7 +6406,7 @@
%}
// Load Constant
-instruct loadConI(eRegI dst, immI src) %{
+instruct loadConI(rRegI dst, immI src) %{
match(Set dst src);
format %{ "MOV $dst,$src" %}
@@ -6426,7 +6415,7 @@
%}
// Load Constant zero
-instruct loadConI0(eRegI dst, immI0 src, eFlagsReg cr) %{
+instruct loadConI0(rRegI dst, immI0 src, eFlagsReg cr) %{
match(Set dst src);
effect(KILL cr);
@@ -6594,7 +6583,7 @@
%}
// Load Stack Slot
-instruct loadSSI(eRegI dst, stackSlotI src) %{
+instruct loadSSI(rRegI dst, stackSlotI src) %{
match(Set dst src);
ins_cost(125);
@@ -6821,7 +6810,7 @@
%}
// Store Char/Short
-instruct storeC(memory mem, eRegI src) %{
+instruct storeC(memory mem, rRegI src) %{
match(Set mem (StoreC mem src));
ins_cost(125);
@@ -6832,7 +6821,7 @@
%}
// Store Integer
-instruct storeI(memory mem, eRegI src) %{
+instruct storeI(memory mem, rRegI src) %{
match(Set mem (StoreI mem src));
ins_cost(125);
@@ -6976,42 +6965,6 @@
ins_pipe( ialu_mem_imm );
%}
-// Store Aligned Packed Byte XMM register to memory
-instruct storeA8B(memory mem, regD src) %{
- predicate(UseSSE>=1);
- match(Set mem (Store8B mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed8B" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Char/Short XMM register to memory
-instruct storeA4C(memory mem, regD src) %{
- predicate(UseSSE>=1);
- match(Set mem (Store4C mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed4C" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Integer XMM register to memory
-instruct storeA2I(memory mem, regD src) %{
- predicate(UseSSE>=1);
- match(Set mem (Store2I mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed2I" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
// Store CMS card-mark Immediate
instruct storeImmCM(memory mem, immI8 src) %{
match(Set mem (StoreCM mem src));
@@ -7073,18 +7026,6 @@
ins_pipe( pipe_slow );
%}
-// Store Aligned Packed Single Float XMM register to memory
-instruct storeA2F(memory mem, regD src) %{
- predicate(UseSSE>=1);
- match(Set mem (Store2F mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed2F" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
// Store Float
instruct storeFPR( memory mem, regFPR1 src) %{
predicate(UseSSE==0);
@@ -7146,7 +7087,7 @@
%}
// Store Integer to stack slot
-instruct storeSSI(stackSlotI dst, eRegI src) %{
+instruct storeSSI(stackSlotI dst, rRegI src) %{
match(Set dst src);
ins_cost(100);
@@ -7271,7 +7212,7 @@
ins_pipe(empty);
%}
-instruct castP2X(eRegI dst, eRegP src ) %{
+instruct castP2X(rRegI dst, eRegP src ) %{
match(Set dst (CastP2X src));
ins_cost(50);
format %{ "MOV $dst, $src\t# CastP2X" %}
@@ -7281,7 +7222,7 @@
//----------Conditional Move---------------------------------------------------
// Conditional move
-instruct jmovI_reg(cmpOp cop, eFlagsReg cr, eRegI dst, eRegI src) %{
+instruct jmovI_reg(cmpOp cop, eFlagsReg cr, rRegI dst, rRegI src) %{
predicate(!VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
ins_cost(200);
@@ -7298,7 +7239,7 @@
ins_pipe( pipe_cmov_reg );
%}
-instruct jmovI_regU(cmpOpU cop, eFlagsRegU cr, eRegI dst, eRegI src) %{
+instruct jmovI_regU(cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src) %{
predicate(!VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
ins_cost(200);
@@ -7315,7 +7256,7 @@
ins_pipe( pipe_cmov_reg );
%}
-instruct cmovI_reg(eRegI dst, eRegI src, eFlagsReg cr, cmpOp cop ) %{
+instruct cmovI_reg(rRegI dst, rRegI src, eFlagsReg cr, cmpOp cop ) %{
predicate(VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
ins_cost(200);
@@ -7325,7 +7266,7 @@
ins_pipe( pipe_cmov_reg );
%}
-instruct cmovI_regU( cmpOpU cop, eFlagsRegU cr, eRegI dst, eRegI src ) %{
+instruct cmovI_regU( cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src ) %{
predicate(VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
ins_cost(200);
@@ -7335,7 +7276,7 @@
ins_pipe( pipe_cmov_reg );
%}
-instruct cmovI_regUCF( cmpOpUCF cop, eFlagsRegUCF cr, eRegI dst, eRegI src ) %{
+instruct cmovI_regUCF( cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, rRegI src ) %{
predicate(VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
ins_cost(200);
@@ -7345,7 +7286,7 @@
%}
// Conditional move
-instruct cmovI_mem(cmpOp cop, eFlagsReg cr, eRegI dst, memory src) %{
+instruct cmovI_mem(cmpOp cop, eFlagsReg cr, rRegI dst, memory src) %{
predicate(VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
ins_cost(250);
@@ -7356,7 +7297,7 @@
%}
// Conditional move
-instruct cmovI_memU(cmpOpU cop, eFlagsRegU cr, eRegI dst, memory src) %{
+instruct cmovI_memU(cmpOpU cop, eFlagsRegU cr, rRegI dst, memory src) %{
predicate(VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
ins_cost(250);
@@ -7366,7 +7307,7 @@
ins_pipe( pipe_cmov_mem );
%}
-instruct cmovI_memUCF(cmpOpUCF cop, eFlagsRegUCF cr, eRegI dst, memory src) %{
+instruct cmovI_memUCF(cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, memory src) %{
predicate(VM_Version::supports_cmov() );
match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
ins_cost(250);
@@ -7620,7 +7561,7 @@
//----------Arithmetic Instructions--------------------------------------------
//----------Addition Instructions----------------------------------------------
// Integer Addition Instructions
-instruct addI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct addI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (AddI dst src));
effect(KILL cr);
@@ -7631,7 +7572,7 @@
ins_pipe( ialu_reg_reg );
%}
-instruct addI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct addI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
match(Set dst (AddI dst src));
effect(KILL cr);
@@ -7641,7 +7582,7 @@
ins_pipe( ialu_reg );
%}
-instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{
+instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{
predicate(UseIncDec);
match(Set dst (AddI dst src));
effect(KILL cr);
@@ -7653,7 +7594,7 @@
ins_pipe( ialu_reg );
%}
-instruct leaI_eReg_immI(eRegI dst, eRegI src0, immI src1) %{
+instruct leaI_eReg_immI(rRegI dst, rRegI src0, immI src1) %{
match(Set dst (AddI src0 src1));
ins_cost(110);
@@ -7673,7 +7614,7 @@
ins_pipe( ialu_reg_reg );
%}
-instruct decI_eReg(eRegI dst, immI_M1 src, eFlagsReg cr) %{
+instruct decI_eReg(rRegI dst, immI_M1 src, eFlagsReg cr) %{
predicate(UseIncDec);
match(Set dst (AddI dst src));
effect(KILL cr);
@@ -7685,7 +7626,7 @@
ins_pipe( ialu_reg );
%}
-instruct addP_eReg(eRegP dst, eRegI src, eFlagsReg cr) %{
+instruct addP_eReg(eRegP dst, rRegI src, eFlagsReg cr) %{
match(Set dst (AddP dst src));
effect(KILL cr);
@@ -7707,7 +7648,7 @@
ins_pipe( ialu_reg );
%}
-instruct addI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct addI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
match(Set dst (AddI dst (LoadI src)));
effect(KILL cr);
@@ -7718,7 +7659,7 @@
ins_pipe( ialu_reg_mem );
%}
-instruct addI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct addI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
match(Set dst (StoreI dst (AddI (LoadI dst) src)));
effect(KILL cr);
@@ -7780,7 +7721,7 @@
ins_pipe( empty );
%}
-instruct castII( eRegI dst ) %{
+instruct castII( rRegI dst ) %{
match(Set dst (CastII dst));
format %{ "#castII of $dst" %}
ins_encode( /*empty encoding*/ );
@@ -7814,7 +7755,7 @@
// Conditional-store of an int value.
// ZF flag is set on success, reset otherwise. Implemented with a CMPXCHG on Intel.
-instruct storeIConditional( memory mem, eAXRegI oldval, eRegI newval, eFlagsReg cr ) %{
+instruct storeIConditional( memory mem, eAXRegI oldval, rRegI newval, eFlagsReg cr ) %{
match(Set cr (StoreIConditional mem (Binary oldval newval)));
effect(KILL oldval);
format %{ "CMPXCHG $mem,$newval\t# If EAX==$mem Then store $newval into $mem" %}
@@ -7847,7 +7788,7 @@
// No flag versions for CompareAndSwap{P,I,L} because matcher can't match them
-instruct compareAndSwapL( eRegI res, eSIRegP mem_ptr, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{
+instruct compareAndSwapL( rRegI res, eSIRegP mem_ptr, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{
match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval)));
effect(KILL cr, KILL oldval);
format %{ "CMPXCHG8 [$mem_ptr],$newval\t# If EDX:EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
@@ -7860,7 +7801,7 @@
ins_pipe( pipe_cmpxchg );
%}
-instruct compareAndSwapP( eRegI res, pRegP mem_ptr, eAXRegP oldval, eCXRegP newval, eFlagsReg cr) %{
+instruct compareAndSwapP( rRegI res, pRegP mem_ptr, eAXRegP oldval, eCXRegP newval, eFlagsReg cr) %{
match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval)));
effect(KILL cr, KILL oldval);
format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
@@ -7872,7 +7813,7 @@
ins_pipe( pipe_cmpxchg );
%}
-instruct compareAndSwapI( eRegI res, pRegP mem_ptr, eAXRegI oldval, eCXRegI newval, eFlagsReg cr) %{
+instruct compareAndSwapI( rRegI res, pRegP mem_ptr, eAXRegI oldval, eCXRegI newval, eFlagsReg cr) %{
match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval)));
effect(KILL cr, KILL oldval);
format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
@@ -7886,7 +7827,7 @@
//----------Subtraction Instructions-------------------------------------------
// Integer Subtraction Instructions
-instruct subI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct subI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (SubI dst src));
effect(KILL cr);
@@ -7897,7 +7838,7 @@
ins_pipe( ialu_reg_reg );
%}
-instruct subI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct subI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
match(Set dst (SubI dst src));
effect(KILL cr);
@@ -7908,7 +7849,7 @@
ins_pipe( ialu_reg );
%}
-instruct subI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct subI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
match(Set dst (SubI dst (LoadI src)));
effect(KILL cr);
@@ -7919,7 +7860,7 @@
ins_pipe( ialu_reg_mem );
%}
-instruct subI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct subI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
match(Set dst (StoreI dst (SubI (LoadI dst) src)));
effect(KILL cr);
@@ -7931,7 +7872,7 @@
%}
// Subtract from a pointer
-instruct subP_eReg(eRegP dst, eRegI src, immI0 zero, eFlagsReg cr) %{
+instruct subP_eReg(eRegP dst, rRegI src, immI0 zero, eFlagsReg cr) %{
match(Set dst (AddP dst (SubI zero src)));
effect(KILL cr);
@@ -7942,7 +7883,7 @@
ins_pipe( ialu_reg_reg );
%}
-instruct negI_eReg(eRegI dst, immI0 zero, eFlagsReg cr) %{
+instruct negI_eReg(rRegI dst, immI0 zero, eFlagsReg cr) %{
match(Set dst (SubI zero dst));
effect(KILL cr);
@@ -7957,7 +7898,7 @@
//----------Multiplication/Division Instructions-------------------------------
// Integer Multiplication Instructions
// Multiply Register
-instruct mulI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct mulI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (MulI dst src));
effect(KILL cr);
@@ -7970,7 +7911,7 @@
%}
// Multiply 32-bit Immediate
-instruct mulI_eReg_imm(eRegI dst, eRegI src, immI imm, eFlagsReg cr) %{
+instruct mulI_eReg_imm(rRegI dst, rRegI src, immI imm, eFlagsReg cr) %{
match(Set dst (MulI src imm));
effect(KILL cr);
@@ -8026,7 +7967,7 @@
%}
// Multiply Memory 32-bit Immediate
-instruct mulI_mem_imm(eRegI dst, memory src, immI imm, eFlagsReg cr) %{
+instruct mulI_mem_imm(rRegI dst, memory src, immI imm, eFlagsReg cr) %{
match(Set dst (MulI (LoadI src) imm));
effect(KILL cr);
@@ -8038,7 +7979,7 @@
%}
// Multiply Memory
-instruct mulI(eRegI dst, memory src, eFlagsReg cr) %{
+instruct mulI(rRegI dst, memory src, eFlagsReg cr) %{
match(Set dst (MulI dst (LoadI src)));
effect(KILL cr);
@@ -8075,7 +8016,7 @@
%}
// Multiply Register Long
-instruct mulL_eReg(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
match(Set dst (MulL dst src));
effect(KILL cr, TEMP tmp);
ins_cost(4*100+3*400);
@@ -8093,7 +8034,7 @@
%}
// Multiply Register Long where the left operand's high 32 bits are zero
-instruct mulL_eReg_lhi0(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg_lhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
predicate(is_operand_hi32_zero(n->in(1)));
match(Set dst (MulL dst src));
effect(KILL cr, TEMP tmp);
@@ -8114,7 +8055,7 @@
%}
// Multiply Register Long where the right operand's high 32 bits are zero
-instruct mulL_eReg_rhi0(eADXRegL dst, eRegL src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg_rhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
predicate(is_operand_hi32_zero(n->in(2)));
match(Set dst (MulL dst src));
effect(KILL cr, TEMP tmp);
@@ -8150,7 +8091,7 @@
%}
// Multiply Register Long by small constant
-instruct mulL_eReg_con(eADXRegL dst, immL_127 src, eRegI tmp, eFlagsReg cr) %{
+instruct mulL_eReg_con(eADXRegL dst, immL_127 src, rRegI tmp, eFlagsReg cr) %{
match(Set dst (MulL dst src));
effect(KILL cr, TEMP tmp);
ins_cost(2*100+2*400);
@@ -8248,7 +8189,7 @@
%}
// Divide Register Long (no special case since divisor != -1)
-instruct divL_eReg_imm32( eADXRegL dst, immL32 imm, eRegI tmp, eRegI tmp2, eFlagsReg cr ) %{
+instruct divL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{
match(Set dst (DivL dst imm));
effect( TEMP tmp, TEMP tmp2, KILL cr );
ins_cost(1000);
@@ -8319,7 +8260,7 @@
%}
// Remainder Register Long (remainder fit into 32 bits)
-instruct modL_eReg_imm32( eADXRegL dst, immL32 imm, eRegI tmp, eRegI tmp2, eFlagsReg cr ) %{
+instruct modL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{
match(Set dst (ModL dst imm));
effect( TEMP tmp, TEMP tmp2, KILL cr );
ins_cost(1000);
@@ -8387,7 +8328,7 @@
// Integer Shift Instructions
// Shift Left by one
-instruct shlI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct shlI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
match(Set dst (LShiftI dst shift));
effect(KILL cr);
@@ -8399,7 +8340,7 @@
%}
// Shift Left by 8-bit immediate
-instruct salI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct salI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
match(Set dst (LShiftI dst shift));
effect(KILL cr);
@@ -8411,7 +8352,7 @@
%}
// Shift Left by variable
-instruct salI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{
+instruct salI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
match(Set dst (LShiftI dst shift));
effect(KILL cr);
@@ -8423,7 +8364,7 @@
%}
// Arithmetic shift right by one
-instruct sarI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct sarI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
match(Set dst (RShiftI dst shift));
effect(KILL cr);
@@ -8445,7 +8386,7 @@
%}
// Arithmetic Shift Right by 8-bit immediate
-instruct sarI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct sarI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
match(Set dst (RShiftI dst shift));
effect(KILL cr);
@@ -8468,7 +8409,7 @@
%}
// Arithmetic Shift Right by variable
-instruct sarI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{
+instruct sarI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
match(Set dst (RShiftI dst shift));
effect(KILL cr);
@@ -8480,7 +8421,7 @@
%}
// Logical shift right by one
-instruct shrI_eReg_1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct shrI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
match(Set dst (URShiftI dst shift));
effect(KILL cr);
@@ -8492,7 +8433,7 @@
%}
// Logical Shift Right by 8-bit immediate
-instruct shrI_eReg_imm(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct shrI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
match(Set dst (URShiftI dst shift));
effect(KILL cr);
@@ -8506,7 +8447,7 @@
// Logical Shift Right by 24, followed by Arithmetic Shift Left by 24.
// This idiom is used by the compiler for the i2b bytecode.
-instruct i2b(eRegI dst, xRegI src, immI_24 twentyfour) %{
+instruct i2b(rRegI dst, xRegI src, immI_24 twentyfour) %{
match(Set dst (RShiftI (LShiftI src twentyfour) twentyfour));
size(3);
@@ -8519,7 +8460,7 @@
// Logical Shift Right by 16, followed by Arithmetic Shift Left by 16.
// This idiom is used by the compiler the i2s bytecode.
-instruct i2s(eRegI dst, xRegI src, immI_16 sixteen) %{
+instruct i2s(rRegI dst, xRegI src, immI_16 sixteen) %{
match(Set dst (RShiftI (LShiftI src sixteen) sixteen));
size(3);
@@ -8532,7 +8473,7 @@
// Logical Shift Right by variable
-instruct shrI_eReg_CL(eRegI dst, eCXRegI shift, eFlagsReg cr) %{
+instruct shrI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
match(Set dst (URShiftI dst shift));
effect(KILL cr);
@@ -8548,7 +8489,7 @@
//----------Integer Logical Instructions---------------------------------------
// And Instructions
// And Register with Register
-instruct andI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct andI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (AndI dst src));
effect(KILL cr);
@@ -8560,7 +8501,7 @@
%}
// And Register with Immediate
-instruct andI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct andI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
match(Set dst (AndI dst src));
effect(KILL cr);
@@ -8572,7 +8513,7 @@
%}
// And Register with Memory
-instruct andI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct andI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
match(Set dst (AndI dst (LoadI src)));
effect(KILL cr);
@@ -8584,7 +8525,7 @@
%}
// And Memory with Register
-instruct andI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct andI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
match(Set dst (StoreI dst (AndI (LoadI dst) src)));
effect(KILL cr);
@@ -8610,7 +8551,7 @@
// Or Instructions
// Or Register with Register
-instruct orI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct orI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (OrI dst src));
effect(KILL cr);
@@ -8621,7 +8562,7 @@
ins_pipe( ialu_reg_reg );
%}
-instruct orI_eReg_castP2X(eRegI dst, eRegP src, eFlagsReg cr) %{
+instruct orI_eReg_castP2X(rRegI dst, eRegP src, eFlagsReg cr) %{
match(Set dst (OrI dst (CastP2X src)));
effect(KILL cr);
@@ -8634,7 +8575,7 @@
// Or Register with Immediate
-instruct orI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct orI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
match(Set dst (OrI dst src));
effect(KILL cr);
@@ -8646,7 +8587,7 @@
%}
// Or Register with Memory
-instruct orI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct orI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
match(Set dst (OrI dst (LoadI src)));
effect(KILL cr);
@@ -8658,7 +8599,7 @@
%}
// Or Memory with Register
-instruct orI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct orI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
match(Set dst (StoreI dst (OrI (LoadI dst) src)));
effect(KILL cr);
@@ -8684,7 +8625,7 @@
// ROL/ROR
// ROL expand
-instruct rolI_eReg_imm1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct rolI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{
effect(USE_DEF dst, USE shift, KILL cr);
format %{ "ROL $dst, $shift" %}
@@ -8693,7 +8634,7 @@
ins_pipe( ialu_reg );
%}
-instruct rolI_eReg_imm8(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct rolI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{
effect(USE_DEF dst, USE shift, KILL cr);
format %{ "ROL $dst, $shift" %}
@@ -8713,7 +8654,7 @@
// end of ROL expand
// ROL 32bit by one once
-instruct rolI_eReg_i1(eRegI dst, immI1 lshift, immI_M1 rshift, eFlagsReg cr) %{
+instruct rolI_eReg_i1(rRegI dst, immI1 lshift, immI_M1 rshift, eFlagsReg cr) %{
match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift)));
expand %{
@@ -8722,7 +8663,7 @@
%}
// ROL 32bit var by imm8 once
-instruct rolI_eReg_i8(eRegI dst, immI8 lshift, immI8 rshift, eFlagsReg cr) %{
+instruct rolI_eReg_i8(rRegI dst, immI8 lshift, immI8 rshift, eFlagsReg cr) %{
predicate( 0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift)));
@@ -8750,7 +8691,7 @@
%}
// ROR expand
-instruct rorI_eReg_imm1(eRegI dst, immI1 shift, eFlagsReg cr) %{
+instruct rorI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{
effect(USE_DEF dst, USE shift, KILL cr);
format %{ "ROR $dst, $shift" %}
@@ -8759,7 +8700,7 @@
ins_pipe( ialu_reg );
%}
-instruct rorI_eReg_imm8(eRegI dst, immI8 shift, eFlagsReg cr) %{
+instruct rorI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{
effect (USE_DEF dst, USE shift, KILL cr);
format %{ "ROR $dst, $shift" %}
@@ -8779,7 +8720,7 @@
// end of ROR expand
// ROR right once
-instruct rorI_eReg_i1(eRegI dst, immI1 rshift, immI_M1 lshift, eFlagsReg cr) %{
+instruct rorI_eReg_i1(rRegI dst, immI1 rshift, immI_M1 lshift, eFlagsReg cr) %{
match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift)));
expand %{
@@ -8788,7 +8729,7 @@
%}
// ROR 32bit by immI8 once
-instruct rorI_eReg_i8(eRegI dst, immI8 rshift, immI8 lshift, eFlagsReg cr) %{
+instruct rorI_eReg_i8(rRegI dst, immI8 rshift, immI8 lshift, eFlagsReg cr) %{
predicate( 0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift)));
@@ -8817,7 +8758,7 @@
// Xor Instructions
// Xor Register with Register
-instruct xorI_eReg(eRegI dst, eRegI src, eFlagsReg cr) %{
+instruct xorI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (XorI dst src));
effect(KILL cr);
@@ -8829,7 +8770,7 @@
%}
// Xor Register with Immediate -1
-instruct xorI_eReg_im1(eRegI dst, immI_M1 imm) %{
+instruct xorI_eReg_im1(rRegI dst, immI_M1 imm) %{
match(Set dst (XorI dst imm));
size(2);
@@ -8841,7 +8782,7 @@
%}
// Xor Register with Immediate
-instruct xorI_eReg_imm(eRegI dst, immI src, eFlagsReg cr) %{
+instruct xorI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
match(Set dst (XorI dst src));
effect(KILL cr);
@@ -8853,7 +8794,7 @@
%}
// Xor Register with Memory
-instruct xorI_eReg_mem(eRegI dst, memory src, eFlagsReg cr) %{
+instruct xorI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
match(Set dst (XorI dst (LoadI src)));
effect(KILL cr);
@@ -8865,7 +8806,7 @@
%}
// Xor Memory with Register
-instruct xorI_mem_eReg(memory dst, eRegI src, eFlagsReg cr) %{
+instruct xorI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
match(Set dst (StoreI dst (XorI (LoadI dst) src)));
effect(KILL cr);
@@ -8890,14 +8831,14 @@
//----------Convert Int to Boolean---------------------------------------------
-instruct movI_nocopy(eRegI dst, eRegI src) %{
+instruct movI_nocopy(rRegI dst, rRegI src) %{
effect( DEF dst, USE src );
format %{ "MOV $dst,$src" %}
ins_encode( enc_Copy( dst, src) );
ins_pipe( ialu_reg_reg );
%}
-instruct ci2b( eRegI dst, eRegI src, eFlagsReg cr ) %{
+instruct ci2b( rRegI dst, rRegI src, eFlagsReg cr ) %{
effect( USE_DEF dst, USE src, KILL cr );
size(4);
@@ -8908,7 +8849,7 @@
ins_pipe( ialu_reg_reg_long );
%}
-instruct convI2B( eRegI dst, eRegI src, eFlagsReg cr ) %{
+instruct convI2B( rRegI dst, rRegI src, eFlagsReg cr ) %{
match(Set dst (Conv2B src));
expand %{
@@ -8917,14 +8858,14 @@
%}
%}
-instruct movP_nocopy(eRegI dst, eRegP src) %{
+instruct movP_nocopy(rRegI dst, eRegP src) %{
effect( DEF dst, USE src );
format %{ "MOV $dst,$src" %}
ins_encode( enc_Copy( dst, src) );
ins_pipe( ialu_reg_reg );
%}
-instruct cp2b( eRegI dst, eRegP src, eFlagsReg cr ) %{
+instruct cp2b( rRegI dst, eRegP src, eFlagsReg cr ) %{
effect( USE_DEF dst, USE src, KILL cr );
format %{ "NEG $dst\n\t"
"ADC $dst,$src" %}
@@ -8933,7 +8874,7 @@
ins_pipe( ialu_reg_reg_long );
%}
-instruct convP2B( eRegI dst, eRegP src, eFlagsReg cr ) %{
+instruct convP2B( rRegI dst, eRegP src, eFlagsReg cr ) %{
match(Set dst (Conv2B src));
expand %{
@@ -8958,7 +8899,7 @@
ins_pipe( pipe_slow );
%}
-instruct cmpLTMask0( eRegI dst, immI0 zero, eFlagsReg cr ) %{
+instruct cmpLTMask0( rRegI dst, immI0 zero, eFlagsReg cr ) %{
match(Set dst (CmpLTMask dst zero));
effect( DEF dst, KILL cr );
ins_cost(100);
@@ -9430,7 +9371,7 @@
%}
// Compare vs zero into -1,0,1
-instruct cmpDPR_0(eRegI dst, regDPR src1, immDPR0 zero, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpDPR_0(rRegI dst, regDPR src1, immDPR0 zero, eAXRegI rax, eFlagsReg cr) %{
predicate(UseSSE<=1);
match(Set dst (CmpD3 src1 zero));
effect(KILL cr, KILL rax);
@@ -9444,7 +9385,7 @@
%}
// Compare into -1,0,1
-instruct cmpDPR_reg(eRegI dst, regDPR src1, regDPR src2, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpDPR_reg(rRegI dst, regDPR src1, regDPR src2, eAXRegI rax, eFlagsReg cr) %{
predicate(UseSSE<=1);
match(Set dst (CmpD3 src1 src2));
effect(KILL cr, KILL rax);
@@ -10222,7 +10163,7 @@
%}
// Compare vs zero into -1,0,1
-instruct cmpFPR_0(eRegI dst, regFPR src1, immFPR0 zero, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpFPR_0(rRegI dst, regFPR src1, immFPR0 zero, eAXRegI rax, eFlagsReg cr) %{
predicate(UseSSE == 0);
match(Set dst (CmpF3 src1 zero));
effect(KILL cr, KILL rax);
@@ -10236,7 +10177,7 @@
%}
// Compare into -1,0,1
-instruct cmpFPR_reg(eRegI dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{
+instruct cmpFPR_reg(rRegI dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{
predicate(UseSSE == 0);
match(Set dst (CmpF3 src1 src2));
effect(KILL cr, KILL rax);
@@ -11156,7 +11097,7 @@
ins_pipe( fpu_reg_mem );
%}
-instruct convI2D_reg(regD dst, eRegI src) %{
+instruct convI2D_reg(regD dst, rRegI src) %{
predicate( UseSSE>=2 && !UseXmmI2D );
match(Set dst (ConvI2D src));
format %{ "CVTSI2SD $dst,$src" %}
@@ -11176,7 +11117,7 @@
ins_pipe( pipe_slow );
%}
-instruct convXI2D_reg(regD dst, eRegI src)
+instruct convXI2D_reg(regD dst, rRegI src)
%{
predicate( UseSSE>=2 && UseXmmI2D );
match(Set dst (ConvI2D src));
@@ -11264,7 +11205,7 @@
%}
// Convert an int to a float in xmm; no rounding step needed.
-instruct convI2F_reg(regF dst, eRegI src) %{
+instruct convI2F_reg(regF dst, rRegI src) %{
predicate( UseSSE==1 || UseSSE>=2 && !UseXmmI2F );
match(Set dst (ConvI2F src));
format %{ "CVTSI2SS $dst, $src" %}
@@ -11274,7 +11215,7 @@
ins_pipe( pipe_slow );
%}
- instruct convXI2F_reg(regF dst, eRegI src)
+ instruct convXI2F_reg(regF dst, rRegI src)
%{
predicate( UseSSE>=2 && UseXmmI2F );
match(Set dst (ConvI2F src));
@@ -11288,7 +11229,7 @@
ins_pipe(pipe_slow); // XXX
%}
-instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{
+instruct convI2L_reg( eRegL dst, rRegI src, eFlagsReg cr) %{
match(Set dst (ConvI2L src));
effect(KILL cr);
ins_cost(375);
@@ -11300,7 +11241,7 @@
%}
// Zero-extend convert int to long
-instruct convI2L_reg_zex(eRegL dst, eRegI src, immL_32bits mask, eFlagsReg flags ) %{
+instruct convI2L_reg_zex(eRegL dst, rRegI src, immL_32bits mask, eFlagsReg flags ) %{
match(Set dst (AndL (ConvI2L src) mask) );
effect( KILL flags );
ins_cost(250);
@@ -11380,7 +11321,7 @@
ins_pipe( pipe_slow );
%}
-instruct convL2I_reg( eRegI dst, eRegL src ) %{
+instruct convL2I_reg( rRegI dst, eRegL src ) %{
match(Set dst (ConvL2I src));
effect( DEF dst, USE src );
format %{ "MOV $dst,$src.lo" %}
@@ -11389,7 +11330,7 @@
%}
-instruct MoveF2I_stack_reg(eRegI dst, stackSlotF src) %{
+instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{
match(Set dst (MoveF2I src));
effect( DEF dst, USE src );
ins_cost(100);
@@ -11424,7 +11365,7 @@
ins_pipe( pipe_slow );
%}
-instruct MoveF2I_reg_reg_sse(eRegI dst, regF src) %{
+instruct MoveF2I_reg_reg_sse(rRegI dst, regF src) %{
predicate(UseSSE>=2);
match(Set dst (MoveF2I src));
effect( DEF dst, USE src );
@@ -11436,7 +11377,7 @@
ins_pipe( pipe_slow );
%}
-instruct MoveI2F_reg_stack(stackSlotF dst, eRegI src) %{
+instruct MoveI2F_reg_stack(stackSlotF dst, rRegI src) %{
match(Set dst (MoveI2F src));
effect( DEF dst, USE src );
@@ -11476,7 +11417,7 @@
ins_pipe( pipe_slow );
%}
-instruct MoveI2F_reg_reg_sse(regF dst, eRegI src) %{
+instruct MoveI2F_reg_reg_sse(regF dst, rRegI src) %{
predicate(UseSSE>=2);
match(Set dst (MoveI2F src));
effect( DEF dst, USE src );
@@ -11610,186 +11551,6 @@
ins_pipe( pipe_slow );
%}
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_reg(regD dst, regD src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate8B src));
- format %{ "MOVDQA $dst,$src\n\t"
- "PUNPCKLBW $dst,$dst\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
- ins_encode %{
- if ($dst$$reg != $src$$reg) {
- __ movdqa($dst$$XMMRegister, $src$$XMMRegister);
- }
- __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_eRegI(regD dst, eRegI src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate8B src));
- format %{ "MOVD $dst,$src\n\t"
- "PUNPCKLBW $dst,$dst\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar zero to packed byte (1 byte) values in xmm
-instruct Repl8B_immI0(regD dst, immI0 zero) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate8B zero));
- format %{ "PXOR $dst,$dst\t! replicate8B" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_reg(regD dst, regD src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate4S src));
- format %{ "PSHUFLW $dst,$src,0x00\t! replicate4S" %}
- ins_encode %{
- __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_eRegI(regD dst, eRegI src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate4S src));
- format %{ "MOVD $dst,$src\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate4S" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed short (2 byte) values in xmm
-instruct Repl4S_immI0(regD dst, immI0 zero) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate4S zero));
- format %{ "PXOR $dst,$dst\t! replicate4S" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_reg(regD dst, regD src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate4C src));
- format %{ "PSHUFLW $dst,$src,0x00\t! replicate4C" %}
- ins_encode %{
- __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_eRegI(regD dst, eRegI src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate4C src));
- format %{ "MOVD $dst,$src\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate4C" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed char (2 byte) values in xmm
-instruct Repl4C_immI0(regD dst, immI0 zero) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate4C zero));
- format %{ "PXOR $dst,$dst\t! replicate4C" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_reg(regD dst, regD src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate2I src));
- format %{ "PSHUFD $dst,$src,0x00\t! replicate2I" %}
- ins_encode %{
- __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_eRegI(regD dst, eRegI src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate2I src));
- format %{ "MOVD $dst,$src\n\t"
- "PSHUFD $dst,$dst,0x00\t! replicate2I" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed integer (2 byte) values in xmm
-instruct Repl2I_immI0(regD dst, immI0 zero) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate2I zero));
- format %{ "PXOR $dst,$dst\t! replicate2I" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_reg(regD dst, regD src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate2F src));
- format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
- ins_encode %{
- __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_regF(regD dst, regF src) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate2F src));
- format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
- ins_encode %{
- __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_immF0(regD dst, immF0 zero) %{
- predicate(UseSSE>=2);
- match(Set dst (Replicate2F zero));
- format %{ "PXOR $dst,$dst\t! replicate2F" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
// =======================================================================
// fast clearing of an array
@@ -11898,7 +11659,7 @@
//----------Control Flow Instructions------------------------------------------
// Signed compare Instructions
-instruct compI_eReg(eFlagsReg cr, eRegI op1, eRegI op2) %{
+instruct compI_eReg(eFlagsReg cr, rRegI op1, rRegI op2) %{
match(Set cr (CmpI op1 op2));
effect( DEF cr, USE op1, USE op2 );
format %{ "CMP $op1,$op2" %}
@@ -11907,7 +11668,7 @@
ins_pipe( ialu_cr_reg_reg );
%}
-instruct compI_eReg_imm(eFlagsReg cr, eRegI op1, immI op2) %{
+instruct compI_eReg_imm(eFlagsReg cr, rRegI op1, immI op2) %{
match(Set cr (CmpI op1 op2));
effect( DEF cr, USE op1 );
format %{ "CMP $op1,$op2" %}
@@ -11918,7 +11679,7 @@
%}
// Cisc-spilled version of cmpI_eReg
-instruct compI_eReg_mem(eFlagsReg cr, eRegI op1, memory op2) %{
+instruct compI_eReg_mem(eFlagsReg cr, rRegI op1, memory op2) %{
match(Set cr (CmpI op1 (LoadI op2)));
format %{ "CMP $op1,$op2" %}
@@ -11928,7 +11689,7 @@
ins_pipe( ialu_cr_reg_mem );
%}
-instruct testI_reg( eFlagsReg cr, eRegI src, immI0 zero ) %{
+instruct testI_reg( eFlagsReg cr, rRegI src, immI0 zero ) %{
match(Set cr (CmpI src zero));
effect( DEF cr, USE src );
@@ -11938,7 +11699,7 @@
ins_pipe( ialu_cr_reg_imm );
%}
-instruct testI_reg_imm( eFlagsReg cr, eRegI src, immI con, immI0 zero ) %{
+instruct testI_reg_imm( eFlagsReg cr, rRegI src, immI con, immI0 zero ) %{
match(Set cr (CmpI (AndI src con) zero));
format %{ "TEST $src,$con" %}
@@ -11947,7 +11708,7 @@
ins_pipe( ialu_cr_reg_imm );
%}
-instruct testI_reg_mem( eFlagsReg cr, eRegI src, memory mem, immI0 zero ) %{
+instruct testI_reg_mem( eFlagsReg cr, rRegI src, memory mem, immI0 zero ) %{
match(Set cr (CmpI (AndI src mem) zero));
format %{ "TEST $src,$mem" %}
@@ -11958,7 +11719,7 @@
// Unsigned compare Instructions; really, same as signed except they
// produce an eFlagsRegU instead of eFlagsReg.
-instruct compU_eReg(eFlagsRegU cr, eRegI op1, eRegI op2) %{
+instruct compU_eReg(eFlagsRegU cr, rRegI op1, rRegI op2) %{
match(Set cr (CmpU op1 op2));
format %{ "CMPu $op1,$op2" %}
@@ -11967,7 +11728,7 @@
ins_pipe( ialu_cr_reg_reg );
%}
-instruct compU_eReg_imm(eFlagsRegU cr, eRegI op1, immI op2) %{
+instruct compU_eReg_imm(eFlagsRegU cr, rRegI op1, immI op2) %{
match(Set cr (CmpU op1 op2));
format %{ "CMPu $op1,$op2" %}
@@ -11977,7 +11738,7 @@
%}
// // Cisc-spilled version of cmpU_eReg
-instruct compU_eReg_mem(eFlagsRegU cr, eRegI op1, memory op2) %{
+instruct compU_eReg_mem(eFlagsRegU cr, rRegI op1, memory op2) %{
match(Set cr (CmpU op1 (LoadI op2)));
format %{ "CMPu $op1,$op2" %}
@@ -11988,7 +11749,7 @@
%}
// // Cisc-spilled version of cmpU_eReg
-//instruct compU_mem_eReg(eFlagsRegU cr, memory op1, eRegI op2) %{
+//instruct compU_mem_eReg(eFlagsRegU cr, memory op1, rRegI op2) %{
// match(Set cr (CmpU (LoadI op1) op2));
//
// format %{ "CMPu $op1,$op2" %}
@@ -11997,7 +11758,7 @@
// ins_encode( OpcP, RegMem( op1, op2) );
//%}
-instruct testU_reg( eFlagsRegU cr, eRegI src, immI0 zero ) %{
+instruct testU_reg( eFlagsRegU cr, rRegI src, immI0 zero ) %{
match(Set cr (CmpU src zero));
format %{ "TESTu $src,$src" %}
@@ -12093,7 +11854,7 @@
// *** Min and Max using the conditional move are slower than the
// *** branch version on a Pentium III.
// // Conditional move for min
-//instruct cmovI_reg_lt( eRegI op2, eRegI op1, eFlagsReg cr ) %{
+//instruct cmovI_reg_lt( rRegI op2, rRegI op1, eFlagsReg cr ) %{
// effect( USE_DEF op2, USE op1, USE cr );
// format %{ "CMOVlt $op2,$op1\t! min" %}
// opcode(0x4C,0x0F);
@@ -12102,7 +11863,7 @@
//%}
//
//// Min Register with Register (P6 version)
-//instruct minI_eReg_p6( eRegI op1, eRegI op2 ) %{
+//instruct minI_eReg_p6( rRegI op1, rRegI op2 ) %{
// predicate(VM_Version::supports_cmov() );
// match(Set op2 (MinI op1 op2));
// ins_cost(200);
@@ -12114,7 +11875,7 @@
//%}
// Min Register with Register (generic version)
-instruct minI_eReg(eRegI dst, eRegI src, eFlagsReg flags) %{
+instruct minI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{
match(Set dst (MinI dst src));
effect(KILL flags);
ins_cost(300);
@@ -12129,7 +11890,7 @@
// *** Min and Max using the conditional move are slower than the
// *** branch version on a Pentium III.
// // Conditional move for max
-//instruct cmovI_reg_gt( eRegI op2, eRegI op1, eFlagsReg cr ) %{
+//instruct cmovI_reg_gt( rRegI op2, rRegI op1, eFlagsReg cr ) %{
// effect( USE_DEF op2, USE op1, USE cr );
// format %{ "CMOVgt $op2,$op1\t! max" %}
// opcode(0x4F,0x0F);
@@ -12138,7 +11899,7 @@
//%}
//
// // Max Register with Register (P6 version)
-//instruct maxI_eReg_p6( eRegI op1, eRegI op2 ) %{
+//instruct maxI_eReg_p6( rRegI op1, rRegI op2 ) %{
// predicate(VM_Version::supports_cmov() );
// match(Set op2 (MaxI op1 op2));
// ins_cost(200);
@@ -12150,7 +11911,7 @@
//%}
// Max Register with Register (generic version)
-instruct maxI_eReg(eRegI dst, eRegI src, eFlagsReg flags) %{
+instruct maxI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{
match(Set dst (MaxI dst src));
effect(KILL flags);
ins_cost(300);
@@ -12211,7 +11972,7 @@
// ============================================================================
// Branch Instructions
// Jump Table
-instruct jumpXtnd(eRegI switch_val) %{
+instruct jumpXtnd(rRegI switch_val) %{
match(Jump switch_val);
ins_cost(350);
format %{ "JMP [$constantaddress](,$switch_val,1)\n\t" %}
@@ -12629,7 +12390,7 @@
// Manifest a CmpL result in the normal flags. Only good for LT or GE
// compares. Can be used for LE or GT compares by reversing arguments.
// NOT GOOD FOR EQ/NE tests.
-instruct cmpL_reg_flags_LTGE( flagsReg_long_LTGE flags, eRegL src1, eRegL src2, eRegI tmp ) %{
+instruct cmpL_reg_flags_LTGE( flagsReg_long_LTGE flags, eRegL src1, eRegL src2, rRegI tmp ) %{
match( Set flags (CmpL src1 src2 ));
effect( TEMP tmp );
ins_cost(300);
@@ -12675,7 +12436,7 @@
%}
// Compare 2 longs and CMOVE ints.
-instruct cmovII_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegI dst, eRegI src) %{
+instruct cmovII_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, rRegI src) %{
predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
ins_cost(200);
@@ -12685,7 +12446,7 @@
ins_pipe( pipe_cmov_reg );
%}
-instruct cmovII_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegI dst, memory src) %{
+instruct cmovII_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, memory src) %{
predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
ins_cost(250);
@@ -12746,7 +12507,7 @@
//======
// Manifest a CmpL result in the normal flags. Only good for EQ/NE compares.
-instruct cmpL_zero_flags_EQNE( flagsReg_long_EQNE flags, eRegL src, immL0 zero, eRegI tmp ) %{
+instruct cmpL_zero_flags_EQNE( flagsReg_long_EQNE flags, eRegL src, immL0 zero, rRegI tmp ) %{
match( Set flags (CmpL src zero ));
effect(TEMP tmp);
ins_cost(200);
@@ -12803,7 +12564,7 @@
%}
// Compare 2 longs and CMOVE ints.
-instruct cmovII_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegI dst, eRegI src) %{
+instruct cmovII_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, rRegI src) %{
predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
ins_cost(200);
@@ -12813,7 +12574,7 @@
ins_pipe( pipe_cmov_reg );
%}
-instruct cmovII_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegI dst, memory src) %{
+instruct cmovII_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, memory src) %{
predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
ins_cost(250);
@@ -12875,7 +12636,7 @@
//======
// Manifest a CmpL result in the normal flags. Only good for LE or GT compares.
// Same as cmpL_reg_flags_LEGT except must negate src
-instruct cmpL_zero_flags_LEGT( flagsReg_long_LEGT flags, eRegL src, immL0 zero, eRegI tmp ) %{
+instruct cmpL_zero_flags_LEGT( flagsReg_long_LEGT flags, eRegL src, immL0 zero, rRegI tmp ) %{
match( Set flags (CmpL src zero ));
effect( TEMP tmp );
ins_cost(300);
@@ -12889,7 +12650,7 @@
// Manifest a CmpL result in the normal flags. Only good for LE or GT compares.
// Same as cmpL_reg_flags_LTGE except operands swapped. Swapping operands
// requires a commuted test to get the same result.
-instruct cmpL_reg_flags_LEGT( flagsReg_long_LEGT flags, eRegL src1, eRegL src2, eRegI tmp ) %{
+instruct cmpL_reg_flags_LEGT( flagsReg_long_LEGT flags, eRegL src1, eRegL src2, rRegI tmp ) %{
match( Set flags (CmpL src1 src2 ));
effect( TEMP tmp );
ins_cost(300);
@@ -12936,7 +12697,7 @@
%}
// Compare 2 longs and CMOVE ints.
-instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegI dst, eRegI src) %{
+instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, rRegI src) %{
predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
ins_cost(200);
@@ -12946,7 +12707,7 @@
ins_pipe( pipe_cmov_reg );
%}
-instruct cmovII_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegI dst, memory src) %{
+instruct cmovII_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, memory src) %{
predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
ins_cost(250);
@@ -13275,11 +13036,11 @@
// ---------EXAMPLE----------------------------------------------------------
//
// // pertinent parts of existing instructions in architecture description
-// instruct movI(eRegI dst, eRegI src) %{
+// instruct movI(rRegI dst, rRegI src) %{
// match(Set dst (CopyI src));
// %}
//
-// instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{
+// instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{
// match(Set dst (AddI dst src));
// effect(KILL cr);
// %}
@@ -13324,11 +13085,11 @@
// %}
// // Change load of spilled value to only a spill
-// instruct storeI(memory mem, eRegI src) %{
+// instruct storeI(memory mem, rRegI src) %{
// match(Set mem (StoreI mem src));
// %}
//
-// instruct loadI(eRegI dst, memory mem) %{
+// instruct loadI(rRegI dst, memory mem) %{
// match(Set dst (LoadI mem));
// %}
//
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Wed Jul 05 18:15:17 2017 +0200
@@ -131,102 +131,6 @@
// Floating Point Registers
-// XMM registers. 128-bit registers or 4 words each, labeled (a)-d.
-// Word a in each register holds a Float, words ab hold a Double. We
-// currently do not use the SIMD capabilities, so registers cd are
-// unused at the moment.
-// XMM8-XMM15 must be encoded with REX.
-// Linux ABI: No register preserved across function calls
-// XMM0-XMM7 might hold parameters
-// Windows ABI: XMM6-XMM15 preserved across function calls
-// XMM0-XMM3 might hold parameters
-
-reg_def XMM0 (SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());
-reg_def XMM0_H (SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next());
-
-reg_def XMM1 (SOC, SOC, Op_RegF, 1, xmm1->as_VMReg());
-reg_def XMM1_H (SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next());
-
-reg_def XMM2 (SOC, SOC, Op_RegF, 2, xmm2->as_VMReg());
-reg_def XMM2_H (SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next());
-
-reg_def XMM3 (SOC, SOC, Op_RegF, 3, xmm3->as_VMReg());
-reg_def XMM3_H (SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next());
-
-reg_def XMM4 (SOC, SOC, Op_RegF, 4, xmm4->as_VMReg());
-reg_def XMM4_H (SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next());
-
-reg_def XMM5 (SOC, SOC, Op_RegF, 5, xmm5->as_VMReg());
-reg_def XMM5_H (SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next());
-
-#ifdef _WIN64
-
-reg_def XMM6 (SOC, SOE, Op_RegF, 6, xmm6->as_VMReg());
-reg_def XMM6_H (SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next());
-
-reg_def XMM7 (SOC, SOE, Op_RegF, 7, xmm7->as_VMReg());
-reg_def XMM7_H (SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next());
-
-reg_def XMM8 (SOC, SOE, Op_RegF, 8, xmm8->as_VMReg());
-reg_def XMM8_H (SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next());
-
-reg_def XMM9 (SOC, SOE, Op_RegF, 9, xmm9->as_VMReg());
-reg_def XMM9_H (SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next());
-
-reg_def XMM10 (SOC, SOE, Op_RegF, 10, xmm10->as_VMReg());
-reg_def XMM10_H(SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next());
-
-reg_def XMM11 (SOC, SOE, Op_RegF, 11, xmm11->as_VMReg());
-reg_def XMM11_H(SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next());
-
-reg_def XMM12 (SOC, SOE, Op_RegF, 12, xmm12->as_VMReg());
-reg_def XMM12_H(SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next());
-
-reg_def XMM13 (SOC, SOE, Op_RegF, 13, xmm13->as_VMReg());
-reg_def XMM13_H(SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next());
-
-reg_def XMM14 (SOC, SOE, Op_RegF, 14, xmm14->as_VMReg());
-reg_def XMM14_H(SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next());
-
-reg_def XMM15 (SOC, SOE, Op_RegF, 15, xmm15->as_VMReg());
-reg_def XMM15_H(SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next());
-
-#else
-
-reg_def XMM6 (SOC, SOC, Op_RegF, 6, xmm6->as_VMReg());
-reg_def XMM6_H (SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next());
-
-reg_def XMM7 (SOC, SOC, Op_RegF, 7, xmm7->as_VMReg());
-reg_def XMM7_H (SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next());
-
-reg_def XMM8 (SOC, SOC, Op_RegF, 8, xmm8->as_VMReg());
-reg_def XMM8_H (SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next());
-
-reg_def XMM9 (SOC, SOC, Op_RegF, 9, xmm9->as_VMReg());
-reg_def XMM9_H (SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next());
-
-reg_def XMM10 (SOC, SOC, Op_RegF, 10, xmm10->as_VMReg());
-reg_def XMM10_H(SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next());
-
-reg_def XMM11 (SOC, SOC, Op_RegF, 11, xmm11->as_VMReg());
-reg_def XMM11_H(SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next());
-
-reg_def XMM12 (SOC, SOC, Op_RegF, 12, xmm12->as_VMReg());
-reg_def XMM12_H(SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next());
-
-reg_def XMM13 (SOC, SOC, Op_RegF, 13, xmm13->as_VMReg());
-reg_def XMM13_H(SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next());
-
-reg_def XMM14 (SOC, SOC, Op_RegF, 14, xmm14->as_VMReg());
-reg_def XMM14_H(SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next());
-
-reg_def XMM15 (SOC, SOC, Op_RegF, 15, xmm15->as_VMReg());
-reg_def XMM15_H(SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next());
-
-#endif // _WIN64
-
-reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad());
-
// Specify priority of register selection within phases of register
// allocation. Highest priority is first. A useful heuristic is to
// give registers a low priority when they are required by machine
@@ -252,26 +156,6 @@
R15, R15_H,
RSP, RSP_H);
-// XXX probably use 8-15 first on Linux
-alloc_class chunk1(XMM0, XMM0_H,
- XMM1, XMM1_H,
- XMM2, XMM2_H,
- XMM3, XMM3_H,
- XMM4, XMM4_H,
- XMM5, XMM5_H,
- XMM6, XMM6_H,
- XMM7, XMM7_H,
- XMM8, XMM8_H,
- XMM9, XMM9_H,
- XMM10, XMM10_H,
- XMM11, XMM11_H,
- XMM12, XMM12_H,
- XMM13, XMM13_H,
- XMM14, XMM14_H,
- XMM15, XMM15_H);
-
-alloc_class chunk2(RFLAGS);
-
//----------Architecture Description Register Classes--------------------------
// Several register classes are automatically defined based upon information in
@@ -501,46 +385,7 @@
// Singleton class for instruction pointer
// reg_class ip_reg(RIP);
-// Singleton class for condition codes
-reg_class int_flags(RFLAGS);
-
-// Class for all float registers
-reg_class float_reg(XMM0,
- XMM1,
- XMM2,
- XMM3,
- XMM4,
- XMM5,
- XMM6,
- XMM7,
- XMM8,
- XMM9,
- XMM10,
- XMM11,
- XMM12,
- XMM13,
- XMM14,
- XMM15);
-
-// Class for all double registers
-reg_class double_reg(XMM0, XMM0_H,
- XMM1, XMM1_H,
- XMM2, XMM2_H,
- XMM3, XMM3_H,
- XMM4, XMM4_H,
- XMM5, XMM5_H,
- XMM6, XMM6_H,
- XMM7, XMM7_H,
- XMM8, XMM8_H,
- XMM9, XMM9_H,
- XMM10, XMM10_H,
- XMM11, XMM11_H,
- XMM12, XMM12_H,
- XMM13, XMM13_H,
- XMM14, XMM14_H,
- XMM15, XMM15_H);
-%}
-
+%}
//----------SOURCE BLOCK-------------------------------------------------------
// This is a block of C++ code which provides values, functions, and
@@ -1027,12 +872,84 @@
return rc_float;
}
+// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad.
+static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
+ int src_hi, int dst_hi, uint ireg, outputStream* st);
+
+static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
+ int stack_offset, int reg, uint ireg, outputStream* st);
+
+static void vec_stack_to_stack_helper(CodeBuffer *cbuf, int src_offset,
+ int dst_offset, uint ireg, outputStream* st) {
+ if (cbuf) {
+ MacroAssembler _masm(cbuf);
+ switch (ireg) {
+ case Op_VecS:
+ __ movq(Address(rsp, -8), rax);
+ __ movl(rax, Address(rsp, src_offset));
+ __ movl(Address(rsp, dst_offset), rax);
+ __ movq(rax, Address(rsp, -8));
+ break;
+ case Op_VecD:
+ __ pushq(Address(rsp, src_offset));
+ __ popq (Address(rsp, dst_offset));
+ break;
+ case Op_VecX:
+ __ pushq(Address(rsp, src_offset));
+ __ popq (Address(rsp, dst_offset));
+ __ pushq(Address(rsp, src_offset+8));
+ __ popq (Address(rsp, dst_offset+8));
+ break;
+ case Op_VecY:
+ __ vmovdqu(Address(rsp, -32), xmm0);
+ __ vmovdqu(xmm0, Address(rsp, src_offset));
+ __ vmovdqu(Address(rsp, dst_offset), xmm0);
+ __ vmovdqu(xmm0, Address(rsp, -32));
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+#ifndef PRODUCT
+ } else {
+ switch (ireg) {
+ case Op_VecS:
+ st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t"
+ "movl rax, [rsp + #%d]\n\t"
+ "movl [rsp + #%d], rax\n\t"
+ "movq rax, [rsp - #8]",
+ src_offset, dst_offset);
+ break;
+ case Op_VecD:
+ st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t"
+ "popq [rsp + #%d]",
+ src_offset, dst_offset);
+ break;
+ case Op_VecX:
+ st->print("pushq [rsp + #%d]\t# 128-bit mem-mem spill\n\t"
+ "popq [rsp + #%d]\n\t"
+ "pushq [rsp + #%d]\n\t"
+ "popq [rsp + #%d]",
+ src_offset, dst_offset, src_offset+8, dst_offset+8);
+ break;
+ case Op_VecY:
+ st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t"
+ "vmovdqu xmm0, [rsp + #%d]\n\t"
+ "vmovdqu [rsp + #%d], xmm0\n\t"
+ "vmovdqu xmm0, [rsp - #32]",
+ src_offset, dst_offset);
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+#endif
+ }
+}
+
uint MachSpillCopyNode::implementation(CodeBuffer* cbuf,
PhaseRegAlloc* ra_,
bool do_size,
- outputStream* st) const
-{
-
+ outputStream* st) const {
+ assert(cbuf != NULL || st != NULL, "sanity");
// Get registers to move
OptoReg::Name src_second = ra_->get_reg_second(in(1));
OptoReg::Name src_first = ra_->get_reg_first(in(1));
@@ -1050,7 +967,30 @@
if (src_first == dst_first && src_second == dst_second) {
// Self copy, no move
return 0;
- } else if (src_first_rc == rc_stack) {
+ }
+ if (bottom_type()->isa_vect() != NULL) {
+ uint ireg = ideal_reg();
+ assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity");
+ assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity");
+ if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
+ // mem -> mem
+ int src_offset = ra_->reg2offset(src_first);
+ int dst_offset = ra_->reg2offset(dst_first);
+ vec_stack_to_stack_helper(cbuf, src_offset, dst_offset, ireg, st);
+ } else if (src_first_rc == rc_float && dst_first_rc == rc_float ) {
+ vec_mov_helper(cbuf, false, src_first, dst_first, src_second, dst_second, ireg, st);
+ } else if (src_first_rc == rc_float && dst_first_rc == rc_stack ) {
+ int stack_offset = ra_->reg2offset(dst_first);
+ vec_spill_helper(cbuf, false, false, stack_offset, src_first, ireg, st);
+ } else if (src_first_rc == rc_stack && dst_first_rc == rc_float ) {
+ int stack_offset = ra_->reg2offset(src_first);
+ vec_spill_helper(cbuf, false, true, stack_offset, dst_first, ireg, st);
+ } else {
+ ShouldNotReachHere();
+ }
+ return 0;
+ }
+ if (src_first_rc == rc_stack) {
// mem ->
if (dst_first_rc == rc_stack) {
// mem -> mem
@@ -1061,23 +1001,16 @@
int src_offset = ra_->reg2offset(src_first);
int dst_offset = ra_->reg2offset(dst_first);
if (cbuf) {
- emit_opcode(*cbuf, 0xFF);
- encode_RegMem(*cbuf, RSI_enc, RSP_enc, 0x4, 0, src_offset, false);
-
- emit_opcode(*cbuf, 0x8F);
- encode_RegMem(*cbuf, RAX_enc, RSP_enc, 0x4, 0, dst_offset, false);
-
+ MacroAssembler _masm(cbuf);
+ __ pushq(Address(rsp, src_offset));
+ __ popq (Address(rsp, dst_offset));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t"
- "popq [rsp + #%d]",
- src_offset,
- dst_offset);
+ "popq [rsp + #%d]",
+ src_offset, dst_offset);
#endif
}
- return
- 3 + ((src_offset == 0) ? 0 : (src_offset < 0x80 ? 1 : 4)) +
- 3 + ((dst_offset == 0) ? 0 : (dst_offset < 0x80 ? 1 : 4));
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1086,46 +1019,22 @@
int src_offset = ra_->reg2offset(src_first);
int dst_offset = ra_->reg2offset(dst_first);
if (cbuf) {
- emit_opcode(*cbuf, Assembler::REX_W);
- emit_opcode(*cbuf, 0x89);
- emit_opcode(*cbuf, 0x44);
- emit_opcode(*cbuf, 0x24);
- emit_opcode(*cbuf, 0xF8);
-
- emit_opcode(*cbuf, 0x8B);
- encode_RegMem(*cbuf,
- RAX_enc,
- RSP_enc, 0x4, 0, src_offset,
- false);
-
- emit_opcode(*cbuf, 0x89);
- encode_RegMem(*cbuf,
- RAX_enc,
- RSP_enc, 0x4, 0, dst_offset,
- false);
-
- emit_opcode(*cbuf, Assembler::REX_W);
- emit_opcode(*cbuf, 0x8B);
- emit_opcode(*cbuf, 0x44);
- emit_opcode(*cbuf, 0x24);
- emit_opcode(*cbuf, 0xF8);
-
+ MacroAssembler _masm(cbuf);
+ __ movq(Address(rsp, -8), rax);
+ __ movl(rax, Address(rsp, src_offset));
+ __ movl(Address(rsp, dst_offset), rax);
+ __ movq(rax, Address(rsp, -8));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t"
- "movl rax, [rsp + #%d]\n\t"
- "movl [rsp + #%d], rax\n\t"
- "movq rax, [rsp - #8]",
- src_offset,
- dst_offset);
+ "movl rax, [rsp + #%d]\n\t"
+ "movl [rsp + #%d], rax\n\t"
+ "movq rax, [rsp - #8]",
+ src_offset, dst_offset);
#endif
}
- return
- 5 + // movq
- 3 + ((src_offset == 0) ? 0 : (src_offset < 0x80 ? 1 : 4)) + // movl
- 3 + ((dst_offset == 0) ? 0 : (dst_offset < 0x80 ? 1 : 4)) + // movl
- 5; // movq
}
+ return 0;
} else if (dst_first_rc == rc_int) {
// mem -> gpr
if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1133,52 +1042,32 @@
// 64-bit
int offset = ra_->reg2offset(src_first);
if (cbuf) {
- if (Matcher::_regEncode[dst_first] < 8) {
- emit_opcode(*cbuf, Assembler::REX_W);
- } else {
- emit_opcode(*cbuf, Assembler::REX_WR);
- }
- emit_opcode(*cbuf, 0x8B);
- encode_RegMem(*cbuf,
- Matcher::_regEncode[dst_first],
- RSP_enc, 0x4, 0, offset,
- false);
+ MacroAssembler _masm(cbuf);
+ __ movq(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movq %s, [rsp + #%d]\t# spill",
Matcher::regName[dst_first],
offset);
#endif
}
- return
- ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + 4; // REX
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform");
int offset = ra_->reg2offset(src_first);
if (cbuf) {
- if (Matcher::_regEncode[dst_first] >= 8) {
- emit_opcode(*cbuf, Assembler::REX_R);
- }
- emit_opcode(*cbuf, 0x8B);
- encode_RegMem(*cbuf,
- Matcher::_regEncode[dst_first],
- RSP_enc, 0x4, 0, offset,
- false);
+ MacroAssembler _masm(cbuf);
+ __ movl(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movl %s, [rsp + #%d]\t# spill",
Matcher::regName[dst_first],
offset);
#endif
}
- return
- ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
- ((Matcher::_regEncode[dst_first] < 8)
- ? 3
- : 4); // REX
}
+ return 0;
} else if (dst_first_rc == rc_float) {
// mem-> xmm
if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1189,18 +1078,13 @@
MacroAssembler _masm(cbuf);
__ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("%s %s, [rsp + #%d]\t# spill",
UseXmmLoadAndClearUpper ? "movsd " : "movlpd",
Matcher::regName[dst_first],
offset);
#endif
}
- return
- ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
- ((Matcher::_regEncode[dst_first] >= 8)
- ? 6
- : (5 + ((UseAVX>0)?1:0))); // REX
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1210,18 +1094,14 @@
MacroAssembler _masm(cbuf);
__ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movss %s, [rsp + #%d]\t# spill",
Matcher::regName[dst_first],
offset);
#endif
}
- return
- ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
- ((Matcher::_regEncode[dst_first] >= 8)
- ? 6
- : (5 + ((UseAVX>0)?1:0))); // REX
}
+ return 0;
}
} else if (src_first_rc == rc_int) {
// gpr ->
@@ -1232,113 +1112,65 @@
// 64-bit
int offset = ra_->reg2offset(dst_first);
if (cbuf) {
- if (Matcher::_regEncode[src_first] < 8) {
- emit_opcode(*cbuf, Assembler::REX_W);
- } else {
- emit_opcode(*cbuf, Assembler::REX_WR);
- }
- emit_opcode(*cbuf, 0x89);
- encode_RegMem(*cbuf,
- Matcher::_regEncode[src_first],
- RSP_enc, 0x4, 0, offset,
- false);
+ MacroAssembler _masm(cbuf);
+ __ movq(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movq [rsp + #%d], %s\t# spill",
offset,
Matcher::regName[src_first]);
#endif
}
- return ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) + 4; // REX
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform");
int offset = ra_->reg2offset(dst_first);
if (cbuf) {
- if (Matcher::_regEncode[src_first] >= 8) {
- emit_opcode(*cbuf, Assembler::REX_R);
- }
- emit_opcode(*cbuf, 0x89);
- encode_RegMem(*cbuf,
- Matcher::_regEncode[src_first],
- RSP_enc, 0x4, 0, offset,
- false);
+ MacroAssembler _masm(cbuf);
+ __ movl(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movl [rsp + #%d], %s\t# spill",
offset,
Matcher::regName[src_first]);
#endif
}
- return
- ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
- ((Matcher::_regEncode[src_first] < 8)
- ? 3
- : 4); // REX
}
+ return 0;
} else if (dst_first_rc == rc_int) {
// gpr -> gpr
if ((src_first & 1) == 0 && src_first + 1 == src_second &&
(dst_first & 1) == 0 && dst_first + 1 == dst_second) {
// 64-bit
if (cbuf) {
- if (Matcher::_regEncode[dst_first] < 8) {
- if (Matcher::_regEncode[src_first] < 8) {
- emit_opcode(*cbuf, Assembler::REX_W);
- } else {
- emit_opcode(*cbuf, Assembler::REX_WB);
- }
- } else {
- if (Matcher::_regEncode[src_first] < 8) {
- emit_opcode(*cbuf, Assembler::REX_WR);
- } else {
- emit_opcode(*cbuf, Assembler::REX_WRB);
- }
- }
- emit_opcode(*cbuf, 0x8B);
- emit_rm(*cbuf, 0x3,
- Matcher::_regEncode[dst_first] & 7,
- Matcher::_regEncode[src_first] & 7);
+ MacroAssembler _masm(cbuf);
+ __ movq(as_Register(Matcher::_regEncode[dst_first]),
+ as_Register(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movq %s, %s\t# spill",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return 3; // REX
+ return 0;
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform");
if (cbuf) {
- if (Matcher::_regEncode[dst_first] < 8) {
- if (Matcher::_regEncode[src_first] >= 8) {
- emit_opcode(*cbuf, Assembler::REX_B);
- }
- } else {
- if (Matcher::_regEncode[src_first] < 8) {
- emit_opcode(*cbuf, Assembler::REX_R);
- } else {
- emit_opcode(*cbuf, Assembler::REX_RB);
- }
- }
- emit_opcode(*cbuf, 0x8B);
- emit_rm(*cbuf, 0x3,
- Matcher::_regEncode[dst_first] & 7,
- Matcher::_regEncode[src_first] & 7);
+ MacroAssembler _masm(cbuf);
+ __ movl(as_Register(Matcher::_regEncode[dst_first]),
+ as_Register(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movl %s, %s\t# spill",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return
- (Matcher::_regEncode[src_first] < 8 && Matcher::_regEncode[dst_first] < 8)
- ? 2
- : 3; // REX
+ return 0;
}
} else if (dst_first_rc == rc_float) {
// gpr -> xmm
@@ -1349,13 +1181,12 @@
MacroAssembler _masm(cbuf);
__ movdq( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movdq %s, %s\t# spill",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return 5; // REX
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1364,17 +1195,14 @@
MacroAssembler _masm(cbuf);
__ movdl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movdl %s, %s\t# spill",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return
- (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
- ? 5
- : (4 + ((UseAVX>0)?1:0)); // REX
}
+ return 0;
}
} else if (src_first_rc == rc_float) {
// xmm ->
@@ -1388,17 +1216,12 @@
MacroAssembler _masm(cbuf);
__ movdbl( Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movsd [rsp + #%d], %s\t# spill",
offset,
Matcher::regName[src_first]);
#endif
}
- return
- ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
- ((Matcher::_regEncode[src_first] >= 8)
- ? 6
- : (5 + ((UseAVX>0)?1:0))); // REX
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1408,18 +1231,14 @@
MacroAssembler _masm(cbuf);
__ movflt(Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movss [rsp + #%d], %s\t# spill",
offset,
Matcher::regName[src_first]);
#endif
}
- return
- ((offset == 0) ? 0 : (offset < 0x80 ? 1 : 4)) +
- ((Matcher::_regEncode[src_first] >=8)
- ? 6
- : (5 + ((UseAVX>0)?1:0))); // REX
}
+ return 0;
} else if (dst_first_rc == rc_int) {
// xmm -> gpr
if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1429,13 +1248,12 @@
MacroAssembler _masm(cbuf);
__ movdq( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movdq %s, %s\t# spill",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return 5; // REX
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1444,17 +1262,14 @@
MacroAssembler _masm(cbuf);
__ movdl( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("movdl %s, %s\t# spill",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return
- (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
- ? 5
- : (4 + ((UseAVX>0)?1:0)); // REX
}
+ return 0;
} else if (dst_first_rc == rc_float) {
// xmm -> xmm
if ((src_first & 1) == 0 && src_first + 1 == src_second &&
@@ -1464,17 +1279,13 @@
MacroAssembler _masm(cbuf);
__ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("%s %s, %s\t# spill",
UseXmmRegToRegMoveAll ? "movapd" : "movsd ",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return
- (Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
- ? 5
- : (4 + ((UseAVX>0)?1:0)); // REX
} else {
// 32-bit
assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform");
@@ -1483,42 +1294,35 @@
MacroAssembler _masm(cbuf);
__ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first]));
#ifndef PRODUCT
- } else if (!do_size) {
+ } else {
st->print("%s %s, %s\t# spill",
UseXmmRegToRegMoveAll ? "movaps" : "movss ",
Matcher::regName[dst_first],
Matcher::regName[src_first]);
#endif
}
- return ((UseAVX>0) ? 5:
- ((Matcher::_regEncode[src_first] >= 8 || Matcher::_regEncode[dst_first] >= 8)
- ? (UseXmmRegToRegMoveAll ? 4 : 5)
- : (UseXmmRegToRegMoveAll ? 3 : 4))); // REX
}
+ return 0;
}
}
assert(0," foo ");
Unimplemented();
-
return 0;
}
#ifndef PRODUCT
-void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const
-{
+void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const {
implementation(NULL, ra_, false, st);
}
#endif
-void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const
-{
+void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
implementation(&cbuf, ra_, false, NULL);
}
-uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const
-{
- return implementation(NULL, ra_, true, NULL);
+uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
+ return MachNode::size(ra_);
}
//=============================================================================
@@ -1735,16 +1539,6 @@
return true;
}
-// Vector width in bytes
-const uint Matcher::vector_width_in_bytes(void) {
- return 8;
-}
-
-// Vector ideal reg
-const uint Matcher::vector_ideal_reg(void) {
- return Op_RegD;
-}
-
// Is this branch offset short enough that a short branch can be used?
//
// NOTE: If the platform does not provide any short branch variants, then
@@ -1831,21 +1625,21 @@
bool Matcher::can_be_java_arg(int reg)
{
return
- reg == RDI_num || reg == RDI_H_num ||
- reg == RSI_num || reg == RSI_H_num ||
- reg == RDX_num || reg == RDX_H_num ||
- reg == RCX_num || reg == RCX_H_num ||
- reg == R8_num || reg == R8_H_num ||
- reg == R9_num || reg == R9_H_num ||
- reg == R12_num || reg == R12_H_num ||
- reg == XMM0_num || reg == XMM0_H_num ||
- reg == XMM1_num || reg == XMM1_H_num ||
- reg == XMM2_num || reg == XMM2_H_num ||
- reg == XMM3_num || reg == XMM3_H_num ||
- reg == XMM4_num || reg == XMM4_H_num ||
- reg == XMM5_num || reg == XMM5_H_num ||
- reg == XMM6_num || reg == XMM6_H_num ||
- reg == XMM7_num || reg == XMM7_H_num;
+ reg == RDI_num || reg == RDI_H_num ||
+ reg == RSI_num || reg == RSI_H_num ||
+ reg == RDX_num || reg == RDX_H_num ||
+ reg == RCX_num || reg == RCX_H_num ||
+ reg == R8_num || reg == R8_H_num ||
+ reg == R9_num || reg == R9_H_num ||
+ reg == R12_num || reg == R12_H_num ||
+ reg == XMM0_num || reg == XMM0b_num ||
+ reg == XMM1_num || reg == XMM1b_num ||
+ reg == XMM2_num || reg == XMM2b_num ||
+ reg == XMM3_num || reg == XMM3b_num ||
+ reg == XMM4_num || reg == XMM4b_num ||
+ reg == XMM5_num || reg == XMM5b_num ||
+ reg == XMM6_num || reg == XMM6b_num ||
+ reg == XMM7_num || reg == XMM7b_num;
}
bool Matcher::is_spillable_arg(int reg)
@@ -3220,10 +3014,11 @@
OptoReg::Bad, // Op_RegI
RAX_H_num, // Op_RegP
OptoReg::Bad, // Op_RegF
- XMM0_H_num, // Op_RegD
+ XMM0b_num, // Op_RegD
RAX_H_num // Op_RegL
};
- assert(ARRAY_SIZE(hi) == _last_machine_leaf - 1, "missing type");
+ // Excluded flags and vector registers.
+ assert(ARRAY_SIZE(hi) == _last_machine_leaf - 5, "missing type");
return OptoRegPair(hi[ideal_reg], lo[ideal_reg]);
%}
%}
@@ -3985,7 +3780,6 @@
interface(REG_INTER);
%}
-
//----------Memory Operands----------------------------------------------------
// Direct Memory Operand
// operand direct(immP addr)
@@ -5416,61 +5210,6 @@
ins_pipe(pipe_slow); // XXX
%}
-// Load Aligned Packed Byte to XMM register
-instruct loadA8B(regD dst, memory mem) %{
- match(Set dst (Load8B mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed8B" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Short to XMM register
-instruct loadA4S(regD dst, memory mem) %{
- match(Set dst (Load4S mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed4S" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Char to XMM register
-instruct loadA4C(regD dst, memory mem) %{
- match(Set dst (Load4C mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed4C" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Integer to XMM register
-instruct load2IU(regD dst, memory mem) %{
- match(Set dst (Load2I mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed2I" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Load Aligned Packed Single to XMM
-instruct loadA2F(regD dst, memory mem) %{
- match(Set dst (Load2F mem));
- ins_cost(125);
- format %{ "MOVQ $dst,$mem\t! packed2F" %}
- ins_encode %{
- __ movq($dst$$XMMRegister, $mem$$Address);
- %}
- ins_pipe( pipe_slow );
-%}
-
// Load Effective Address
instruct leaP8(rRegP dst, indOffset8 mem)
%{
@@ -6200,39 +5939,6 @@
ins_pipe(ialu_mem_imm);
%}
-// Store Aligned Packed Byte XMM register to memory
-instruct storeA8B(memory mem, regD src) %{
- match(Set mem (Store8B mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed8B" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Char/Short XMM register to memory
-instruct storeA4C(memory mem, regD src) %{
- match(Set mem (Store4C mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed4C" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Store Aligned Packed Integer XMM register to memory
-instruct storeA2I(memory mem, regD src) %{
- match(Set mem (Store2I mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed2I" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
// Store CMS card-mark Immediate
instruct storeImmCM0_reg(memory mem, immI0 zero)
%{
@@ -6258,17 +5964,6 @@
ins_pipe(ialu_mem_imm);
%}
-// Store Aligned Packed Single Float XMM register to memory
-instruct storeA2F(memory mem, regD src) %{
- match(Set mem (Store2F mem src));
- ins_cost(145);
- format %{ "MOVQ $mem,$src\t! packed2F" %}
- ins_encode %{
- __ movq($mem$$Address, $src$$XMMRegister);
- %}
- ins_pipe( pipe_slow );
-%}
-
// Store Float
instruct storeF(memory mem, regF src)
%{
@@ -10377,172 +10072,6 @@
ins_pipe( pipe_slow );
%}
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_reg(regD dst, regD src) %{
- match(Set dst (Replicate8B src));
- format %{ "MOVDQA $dst,$src\n\t"
- "PUNPCKLBW $dst,$dst\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
- ins_encode %{
- if ($dst$$reg != $src$$reg) {
- __ movdqa($dst$$XMMRegister, $src$$XMMRegister);
- }
- __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar to packed byte (1 byte) values in xmm
-instruct Repl8B_rRegI(regD dst, rRegI src) %{
- match(Set dst (Replicate8B src));
- format %{ "MOVD $dst,$src\n\t"
- "PUNPCKLBW $dst,$dst\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate8B" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( pipe_slow );
-%}
-
-// Replicate scalar zero to packed byte (1 byte) values in xmm
-instruct Repl8B_immI0(regD dst, immI0 zero) %{
- match(Set dst (Replicate8B zero));
- format %{ "PXOR $dst,$dst\t! replicate8B" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_reg(regD dst, regD src) %{
- match(Set dst (Replicate4S src));
- format %{ "PSHUFLW $dst,$src,0x00\t! replicate4S" %}
- ins_encode %{
- __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed shore (2 byte) values in xmm
-instruct Repl4S_rRegI(regD dst, rRegI src) %{
- match(Set dst (Replicate4S src));
- format %{ "MOVD $dst,$src\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate4S" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed short (2 byte) values in xmm
-instruct Repl4S_immI0(regD dst, immI0 zero) %{
- match(Set dst (Replicate4S zero));
- format %{ "PXOR $dst,$dst\t! replicate4S" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_reg(regD dst, regD src) %{
- match(Set dst (Replicate4C src));
- format %{ "PSHUFLW $dst,$src,0x00\t! replicate4C" %}
- ins_encode %{
- __ pshuflw($dst$$XMMRegister, $src$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed char (2 byte) values in xmm
-instruct Repl4C_rRegI(regD dst, rRegI src) %{
- match(Set dst (Replicate4C src));
- format %{ "MOVD $dst,$src\n\t"
- "PSHUFLW $dst,$dst,0x00\t! replicate4C" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed char (2 byte) values in xmm
-instruct Repl4C_immI0(regD dst, immI0 zero) %{
- match(Set dst (Replicate4C zero));
- format %{ "PXOR $dst,$dst\t! replicate4C" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_reg(regD dst, regD src) %{
- match(Set dst (Replicate2I src));
- format %{ "PSHUFD $dst,$src,0x00\t! replicate2I" %}
- ins_encode %{
- __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed integer (4 byte) values in xmm
-instruct Repl2I_rRegI(regD dst, rRegI src) %{
- match(Set dst (Replicate2I src));
- format %{ "MOVD $dst,$src\n\t"
- "PSHUFD $dst,$dst,0x00\t! replicate2I" %}
- ins_encode %{
- __ movdl($dst$$XMMRegister, $src$$Register);
- __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar zero to packed integer (2 byte) values in xmm
-instruct Repl2I_immI0(regD dst, immI0 zero) %{
- match(Set dst (Replicate2I zero));
- format %{ "PXOR $dst,$dst\t! replicate2I" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_reg(regD dst, regD src) %{
- match(Set dst (Replicate2F src));
- format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
- ins_encode %{
- __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_regF(regD dst, regF src) %{
- match(Set dst (Replicate2F src));
- format %{ "PSHUFD $dst,$src,0xe0\t! replicate2F" %}
- ins_encode %{
- __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0xe0);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-// Replicate scalar to packed single precision floating point values in xmm
-instruct Repl2F_immF0(regD dst, immF0 zero) %{
- match(Set dst (Replicate2F zero));
- format %{ "PXOR $dst,$dst\t! replicate2F" %}
- ins_encode %{
- __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
// =======================================================================
// fast clearing of an array
--- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -516,7 +516,12 @@
}
}
- if (thread->thread_state() == _thread_in_Java) {
+ // We test if stub is already set (by the stack overflow code
+ // above) so it is not overwritten by the code that follows. This
+ // check is not required on other platforms, because on other
+ // platforms we check for SIGSEGV only or SIGBUS only, where here
+ // we have to check for both SIGSEGV and SIGBUS.
+ if (thread->thread_state() == _thread_in_Java && stub == NULL) {
// Java thread running in Java code => find exception handler if any
// a fault inside compiled code, the interpreter, or a stub
--- a/hotspot/src/share/vm/adlc/adlparse.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/adlparse.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -115,6 +115,12 @@
parse_err(SYNERR, "expected one of - instruct, operand, ins_attrib, op_attrib, source, register, pipeline, encode\n Found %s",ident);
}
}
+ // Add reg_class spill_regs after parsing.
+ RegisterForm *regBlock = _AD.get_registers();
+ if (regBlock == NULL) {
+ parse_err(SEMERR, "Did not declare 'register' definitions");
+ }
+ regBlock->addSpillRegClass();
// Done with parsing, check consistency.
@@ -768,11 +774,12 @@
//------------------------------reg_parse--------------------------------------
void ADLParser::reg_parse(void) {
-
- // Create the RegisterForm for the architecture description.
- RegisterForm *regBlock = new RegisterForm(); // Build new Source object
- regBlock->_linenum = linenum();
- _AD.addForm(regBlock);
+ RegisterForm *regBlock = _AD.get_registers(); // Information about registers encoding
+ if (regBlock == NULL) {
+ // Create the RegisterForm for the architecture description.
+ regBlock = new RegisterForm(); // Build new Source object
+ _AD.addForm(regBlock);
+ }
skipws(); // Skip leading whitespace
if (_curchar == '%' && *(_ptr+1) == '{') {
@@ -796,15 +803,11 @@
parse_err(SYNERR, "Missing %c{ ... %c} block after register keyword.\n",'%','%');
return;
}
-
- // Add reg_class spill_regs
- regBlock->addSpillRegClass();
}
//------------------------------encode_parse-----------------------------------
void ADLParser::encode_parse(void) {
EncodeForm *encBlock; // Information about instruction/operand encoding
- char *desc = NULL; // String representation of encode rule
_AD.getForm(&encBlock);
if ( encBlock == NULL) {
--- a/hotspot/src/share/vm/adlc/archDesc.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/archDesc.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
//
-// Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 1997, 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
@@ -911,12 +911,24 @@
// Find last character in idealOp, it specifies the type
char last_char = 0;
const char *ptr = idealOp;
- for( ; *ptr != '\0'; ++ptr) {
+ for (; *ptr != '\0'; ++ptr) {
last_char = *ptr;
}
+ // Match Vector types.
+ if (strncmp(idealOp, "Vec",3)==0) {
+ switch(last_char) {
+ case 'S': return "TypeVect::VECTS";
+ case 'D': return "TypeVect::VECTD";
+ case 'X': return "TypeVect::VECTX";
+ case 'Y': return "TypeVect::VECTY";
+ default:
+ internal_err("Vector type %s with unrecognized type\n",idealOp);
+ }
+ }
+
// !!!!!
- switch( last_char ) {
+ switch(last_char) {
case 'I': return "TypeInt::INT";
case 'P': return "TypePtr::BOTTOM";
case 'N': return "TypeNarrowOop::BOTTOM";
--- a/hotspot/src/share/vm/adlc/forms.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/forms.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -265,47 +265,22 @@
if( strcmp(opType,"LoadN")==0 ) return Form::idealN;
if( strcmp(opType,"LoadRange")==0 ) return Form::idealI;
if( strcmp(opType,"LoadS")==0 ) return Form::idealS;
- if( strcmp(opType,"Load16B")==0 ) return Form::idealB;
- if( strcmp(opType,"Load8B")==0 ) return Form::idealB;
- if( strcmp(opType,"Load4B")==0 ) return Form::idealB;
- if( strcmp(opType,"Load8C")==0 ) return Form::idealC;
- if( strcmp(opType,"Load4C")==0 ) return Form::idealC;
- if( strcmp(opType,"Load2C")==0 ) return Form::idealC;
- if( strcmp(opType,"Load8S")==0 ) return Form::idealS;
- if( strcmp(opType,"Load4S")==0 ) return Form::idealS;
- if( strcmp(opType,"Load2S")==0 ) return Form::idealS;
- if( strcmp(opType,"Load2D")==0 ) return Form::idealD;
- if( strcmp(opType,"Load4F")==0 ) return Form::idealF;
- if( strcmp(opType,"Load2F")==0 ) return Form::idealF;
- if( strcmp(opType,"Load4I")==0 ) return Form::idealI;
- if( strcmp(opType,"Load2I")==0 ) return Form::idealI;
- if( strcmp(opType,"Load2L")==0 ) return Form::idealL;
+ if( strcmp(opType,"LoadVector")==0 ) return Form::idealV;
assert( strcmp(opType,"Load") != 0, "Must type Loads" );
return Form::none;
}
Form::DataType Form::is_store_to_memory(const char *opType) const {
if( strcmp(opType,"StoreB")==0) return Form::idealB;
- if( strcmp(opType,"StoreCM")==0) return Form::idealB;
+ if( strcmp(opType,"StoreCM")==0) return Form::idealB;
if( strcmp(opType,"StoreC")==0) return Form::idealC;
if( strcmp(opType,"StoreD")==0) return Form::idealD;
if( strcmp(opType,"StoreF")==0) return Form::idealF;
if( strcmp(opType,"StoreI")==0) return Form::idealI;
if( strcmp(opType,"StoreL")==0) return Form::idealL;
if( strcmp(opType,"StoreP")==0) return Form::idealP;
- if( strcmp(opType,"StoreN")==0) return Form::idealN;
- if( strcmp(opType,"Store16B")==0) return Form::idealB;
- if( strcmp(opType,"Store8B")==0) return Form::idealB;
- if( strcmp(opType,"Store4B")==0) return Form::idealB;
- if( strcmp(opType,"Store8C")==0) return Form::idealC;
- if( strcmp(opType,"Store4C")==0) return Form::idealC;
- if( strcmp(opType,"Store2C")==0) return Form::idealC;
- if( strcmp(opType,"Store2D")==0) return Form::idealD;
- if( strcmp(opType,"Store4F")==0) return Form::idealF;
- if( strcmp(opType,"Store2F")==0) return Form::idealF;
- if( strcmp(opType,"Store4I")==0) return Form::idealI;
- if( strcmp(opType,"Store2I")==0) return Form::idealI;
- if( strcmp(opType,"Store2L")==0) return Form::idealL;
+ if( strcmp(opType,"StoreN")==0) return Form::idealN;
+ if( strcmp(opType,"StoreVector")==0 ) return Form::idealV;
assert( strcmp(opType,"Store") != 0, "Must type Stores" );
return Form::none;
}
--- a/hotspot/src/share/vm/adlc/forms.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/forms.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -172,7 +172,8 @@
idealB = 6, // Byte type
idealC = 7, // Char type
idealS = 8, // String type
- idealN = 9 // Narrow oop types
+ idealN = 9, // Narrow oop types
+ idealV = 10 // Vector type
};
// Convert ideal name to a DataType, return DataType::none if not a 'ConX'
Form::DataType ideal_to_const_type(const char *ideal_type_name) const;
--- a/hotspot/src/share/vm/adlc/formsopt.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/formsopt.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -66,7 +66,7 @@
// for spill-slots/regs.
void RegisterForm::addSpillRegClass() {
// Stack slots start at the next available even register number.
- _reg_ctr = (_reg_ctr+1) & ~1;
+ _reg_ctr = (_reg_ctr+7) & ~7;
const char *rc_name = "stack_slots";
RegClass *reg_class = new RegClass(rc_name);
reg_class->_stack_or_reg = true;
@@ -150,9 +150,14 @@
int RegisterForm::RegMask_Size() {
// Need at least this many words
int words_for_regs = (_reg_ctr + 31)>>5;
- // Add a few for incoming & outgoing arguments to calls.
+ // The array of Register Mask bits should be large enough to cover
+ // all the machine registers and all parameters that need to be passed
+ // on the stack (stack registers) up to some interesting limit. Methods
+ // that need more parameters will NOT be compiled. On Intel, the limit
+ // is something like 90+ parameters.
+ // Add a few (3 words == 96 bits) for incoming & outgoing arguments to calls.
// Round up to the next doubleword size.
- return (words_for_regs + 2 + 1) & ~1;
+ return (words_for_regs + 3 + 1) & ~1;
}
void RegisterForm::dump() { // Debug printer
--- a/hotspot/src/share/vm/adlc/formssel.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/formssel.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -432,6 +432,14 @@
return _matrule->is_ideal_store();
}
+// Return 'true' if this instruction matches an ideal vector node
+bool InstructForm::is_vector() const {
+ if( _matrule == NULL ) return false;
+
+ return _matrule->is_vector();
+}
+
+
// Return the input register that must match the output register
// If this is not required, return 0
uint InstructForm::two_address(FormDict &globals) {
@@ -751,6 +759,9 @@
if (needs_base_oop_edge(globals)) return true;
+ if (is_vector()) return true;
+ if (is_mach_constant()) return true;
+
return false;
}
@@ -3381,11 +3392,8 @@
"StoreI","StoreL","StoreP","StoreN","StoreD","StoreF" ,
"StoreB","StoreC","Store" ,"StoreFP",
"LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" ,
- "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
- "Store4I","Store2I","Store2L","Store2D","Store4F","Store2F","Store16B",
- "Store8B","Store4B","Store8C","Store4C","Store2C",
- "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" ,
- "Load8B" ,"Load4B" ,"Load8C" ,"Load4C" ,"Load2C" ,"Load8S", "Load4S","Load2S",
+ "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
+ "StoreVector", "LoadVector",
"LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
"LoadPLocked",
"StorePConditional", "StoreIConditional", "StoreLConditional",
@@ -3822,6 +3830,10 @@
strcmp(opType,"RegL")==0 ||
strcmp(opType,"RegF")==0 ||
strcmp(opType,"RegD")==0 ||
+ strcmp(opType,"VecS")==0 ||
+ strcmp(opType,"VecD")==0 ||
+ strcmp(opType,"VecX")==0 ||
+ strcmp(opType,"VecY")==0 ||
strcmp(opType,"Reg" )==0) ) {
return 1;
}
@@ -3938,19 +3950,12 @@
strcmp(opType,"ReverseBytesL")==0 ||
strcmp(opType,"ReverseBytesUS")==0 ||
strcmp(opType,"ReverseBytesS")==0 ||
- strcmp(opType,"Replicate16B")==0 ||
- strcmp(opType,"Replicate8B")==0 ||
- strcmp(opType,"Replicate4B")==0 ||
- strcmp(opType,"Replicate8C")==0 ||
- strcmp(opType,"Replicate4C")==0 ||
- strcmp(opType,"Replicate8S")==0 ||
- strcmp(opType,"Replicate4S")==0 ||
- strcmp(opType,"Replicate4I")==0 ||
- strcmp(opType,"Replicate2I")==0 ||
- strcmp(opType,"Replicate2L")==0 ||
- strcmp(opType,"Replicate4F")==0 ||
- strcmp(opType,"Replicate2F")==0 ||
- strcmp(opType,"Replicate2D")==0 ||
+ strcmp(opType,"ReplicateB")==0 ||
+ strcmp(opType,"ReplicateS")==0 ||
+ strcmp(opType,"ReplicateI")==0 ||
+ strcmp(opType,"ReplicateL")==0 ||
+ strcmp(opType,"ReplicateF")==0 ||
+ strcmp(opType,"ReplicateD")==0 ||
0 /* 0 to line up columns nicely */ )
return 1;
}
@@ -4034,6 +4039,23 @@
return ideal_load;
}
+bool MatchRule::is_vector() const {
+ if( _rChild ) {
+ const char *opType = _rChild->_opType;
+ if( strcmp(opType,"ReplicateB")==0 ||
+ strcmp(opType,"ReplicateS")==0 ||
+ strcmp(opType,"ReplicateI")==0 ||
+ strcmp(opType,"ReplicateL")==0 ||
+ strcmp(opType,"ReplicateF")==0 ||
+ strcmp(opType,"ReplicateD")==0 ||
+ strcmp(opType,"LoadVector")==0 ||
+ strcmp(opType,"StoreVector")==0 ||
+ 0 /* 0 to line up columns nicely */ )
+ return true;
+ }
+ return false;
+}
+
bool MatchRule::skip_antidep_check() const {
// Some loads operate on what is effectively immutable memory so we
--- a/hotspot/src/share/vm/adlc/formssel.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/formssel.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -160,6 +160,7 @@
virtual bool is_ideal_safepoint() const; // node matches 'SafePoint'
virtual bool is_ideal_nop() const; // node matches 'Nop'
virtual bool is_ideal_control() const; // control node
+ virtual bool is_vector() const; // vector instruction
virtual Form::CallType is_ideal_call() const; // matches ideal 'Call'
virtual Form::DataType is_ideal_load() const; // node matches ideal 'LoadXNode'
@@ -1011,6 +1012,7 @@
bool is_ideal_goto() const; // node matches ideal 'Goto'
bool is_ideal_loopEnd() const; // node matches ideal 'LoopEnd'
bool is_ideal_bool() const; // node matches ideal 'Bool'
+ bool is_vector() const; // vector instruction
Form::DataType is_ideal_load() const;// node matches ideal 'LoadXNode'
// Should antidep checks be disabled for this rule
// See definition of MatchRule::skip_antidep_check
--- a/hotspot/src/share/vm/adlc/main.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/adlc/main.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -250,6 +250,7 @@
AD.addInclude(AD._HPP_file, "opto/node.hpp");
AD.addInclude(AD._HPP_file, "opto/regalloc.hpp");
AD.addInclude(AD._HPP_file, "opto/subnode.hpp");
+ AD.addInclude(AD._HPP_file, "opto/vectornode.hpp");
AD.addInclude(AD._CPP_CLONE_file, "precompiled.hpp");
AD.addInclude(AD._CPP_CLONE_file, "adfiles", get_basename(AD._HPP_file._name));
AD.addInclude(AD._CPP_EXPAND_file, "precompiled.hpp");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/classfile/altHashing.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,304 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
+#include "classfile/symbolTable.hpp"
+#include "classfile/systemDictionary.hpp"
+#include "oops/markOop.hpp"
+#include "runtime/thread.hpp"
+
+// Get the hash code of the classes mirror if it exists, otherwise just
+// return a random number, which is one of the possible hash code used for
+// objects. We don't want to call the synchronizer hash code to install
+// this value because it may safepoint.
+intptr_t object_hash(klassOop k) {
+ intptr_t hc = k->java_mirror()->mark()->hash();
+ return hc != markOopDesc::no_hash ? hc : os::random();
+}
+
+// Seed value used for each alternative hash calculated.
+jint AltHashing::compute_seed() {
+ jlong nanos = os::javaTimeNanos();
+ jlong now = os::javaTimeMillis();
+ jint SEED_MATERIAL[8] = {
+ (jint) object_hash(SystemDictionary::String_klass()),
+ (jint) object_hash(SystemDictionary::System_klass()),
+ (jint) os::random(), // current thread isn't a java thread
+ (jint) (((julong)nanos) >> 32),
+ (jint) nanos,
+ (jint) (((julong)now) >> 32),
+ (jint) now,
+ (jint) (os::javaTimeNanos() >> 2)
+ };
+
+ return murmur3_32(SEED_MATERIAL, 8);
+}
+
+
+// Murmur3 hashing for Symbol
+jint AltHashing::murmur3_32(jint seed, const jbyte* data, int len) {
+ jint h1 = seed;
+ int count = len;
+ int offset = 0;
+
+ // body
+ while (count >= 4) {
+ jint k1 = (data[offset] & 0x0FF)
+ | (data[offset + 1] & 0x0FF) << 8
+ | (data[offset + 2] & 0x0FF) << 16
+ | data[offset + 3] << 24;
+
+ count -= 4;
+ offset += 4;
+
+ k1 *= 0xcc9e2d51;
+ k1 = Integer_rotateLeft(k1, 15);
+ k1 *= 0x1b873593;
+
+ h1 ^= k1;
+ h1 = Integer_rotateLeft(h1, 13);
+ h1 = h1 * 5 + 0xe6546b64;
+ }
+
+ // tail
+
+ if (count > 0) {
+ jint k1 = 0;
+
+ switch (count) {
+ case 3:
+ k1 ^= (data[offset + 2] & 0xff) << 16;
+ // fall through
+ case 2:
+ k1 ^= (data[offset + 1] & 0xff) << 8;
+ // fall through
+ case 1:
+ k1 ^= (data[offset] & 0xff);
+ // fall through
+ default:
+ k1 *= 0xcc9e2d51;
+ k1 = Integer_rotateLeft(k1, 15);
+ k1 *= 0x1b873593;
+ h1 ^= k1;
+ }
+ }
+
+ // finalization
+ h1 ^= len;
+
+ // finalization mix force all bits of a hash block to avalanche
+ h1 ^= ((unsigned int)h1) >> 16;
+ h1 *= 0x85ebca6b;
+ h1 ^= ((unsigned int)h1) >> 13;
+ h1 *= 0xc2b2ae35;
+ h1 ^= ((unsigned int)h1) >> 16;
+
+ return h1;
+}
+
+// Murmur3 hashing for Strings
+jint AltHashing::murmur3_32(jint seed, const jchar* data, int len) {
+ jint h1 = seed;
+
+ int off = 0;
+ int count = len;
+
+ // body
+ while (count >= 2) {
+ jchar d1 = data[off++] & 0xFFFF;
+ jchar d2 = data[off++];
+ jint k1 = (d1 | d2 << 16);
+
+ count -= 2;
+
+ k1 *= 0xcc9e2d51;
+ k1 = Integer_rotateLeft(k1, 15);
+ k1 *= 0x1b873593;
+
+ h1 ^= k1;
+ h1 = Integer_rotateLeft(h1, 13);
+ h1 = h1 * 5 + 0xe6546b64;
+ }
+
+ // tail
+
+ if (count > 0) {
+ int k1 = data[off];
+
+ k1 *= 0xcc9e2d51;
+ k1 = Integer_rotateLeft(k1, 15);
+ k1 *= 0x1b873593;
+ h1 ^= k1;
+ }
+
+ // finalization
+ h1 ^= len * 2; // (Character.SIZE / Byte.SIZE);
+
+ // finalization mix force all bits of a hash block to avalanche
+ h1 ^= ((unsigned int)h1) >> 16;
+ h1 *= 0x85ebca6b;
+ h1 ^= ((unsigned int)h1) >> 13;
+ h1 *= 0xc2b2ae35;
+ h1 ^= ((unsigned int)h1) >> 16;
+
+ return h1;
+}
+
+// Hash used for the seed.
+jint AltHashing::murmur3_32(jint seed, const int* data, int len) {
+ jint h1 = seed;
+
+ int off = 0;
+ int end = len;
+
+ // body
+ while (off < end) {
+ jint k1 = data[off++];
+
+ k1 *= 0xcc9e2d51;
+ k1 = Integer_rotateLeft(k1, 15);
+ k1 *= 0x1b873593;
+
+ h1 ^= k1;
+ h1 = Integer_rotateLeft(h1, 13);
+ h1 = h1 * 5 + 0xe6546b64;
+ }
+
+ // tail (always empty, as body is always 32-bit chunks)
+
+ // finalization
+
+ h1 ^= len * 4; // (Integer.SIZE / Byte.SIZE);
+
+ // finalization mix force all bits of a hash block to avalanche
+ h1 ^= ((juint)h1) >> 16;
+ h1 *= 0x85ebca6b;
+ h1 ^= ((juint)h1) >> 13;
+ h1 *= 0xc2b2ae35;
+ h1 ^= ((juint)h1) >> 16;
+
+ return h1;
+}
+
+jint AltHashing::murmur3_32(const int* data, int len) {
+ return murmur3_32(0, data, len);
+}
+
+#ifndef PRODUCT
+// Overloaded versions for internal test.
+jint AltHashing::murmur3_32(const jbyte* data, int len) {
+ return murmur3_32(0, data, len);
+}
+
+jint AltHashing::murmur3_32(const jchar* data, int len) {
+ return murmur3_32(0, data, len);
+}
+
+// Internal test for alternate hashing. Translated from JDK version
+// test/sun/misc/Hashing.java
+static const jbyte ONE_BYTE[] = { (jbyte) 0x80};
+static const jbyte TWO_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81};
+static const jchar ONE_CHAR[] = { (jchar) 0x8180};
+static const jbyte THREE_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82};
+static const jbyte FOUR_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83};
+static const jchar TWO_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382};
+static const jint ONE_INT[] = { 0x83828180};
+static const jbyte SIX_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85};
+static const jchar THREE_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382, (jchar) 0x8584};
+static const jbyte EIGHT_BYTE[] = {
+ (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82,
+ (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85,
+ (jbyte) 0x86, (jbyte) 0x87};
+static const jchar FOUR_CHAR[] = {
+ (jchar) 0x8180, (jchar) 0x8382,
+ (jchar) 0x8584, (jchar) 0x8786};
+
+static const jint TWO_INT[] = { 0x83828180, 0x87868584};
+
+static const juint MURMUR3_32_X86_CHECK_VALUE = 0xB0F57EE3;
+
+void AltHashing::testMurmur3_32_ByteArray() {
+ // printf("testMurmur3_32_ByteArray\n");
+
+ jbyte* vector = new jbyte[256];
+ jbyte* hashes = new jbyte[4 * 256];
+
+ for (int i = 0; i < 256; i++) {
+ vector[i] = (jbyte) i;
+ }
+
+ // Hash subranges {}, {0}, {0,1}, {0,1,2}, ..., {0,...,255}
+ for (int i = 0; i < 256; i++) {
+ jint hash = murmur3_32(256 - i, vector, i);
+ hashes[i * 4] = (jbyte) hash;
+ hashes[i * 4 + 1] = (jbyte) (((juint)hash) >> 8);
+ hashes[i * 4 + 2] = (jbyte) (((juint)hash) >> 16);
+ hashes[i * 4 + 3] = (jbyte) (((juint)hash) >> 24);
+ }
+
+ // hash to get const result.
+ juint final_hash = murmur3_32(hashes, 4*256);
+
+ assert (MURMUR3_32_X86_CHECK_VALUE == final_hash,
+ err_msg(
+ "Calculated hash result not as expected. Expected %08X got %08X\n",
+ MURMUR3_32_X86_CHECK_VALUE,
+ final_hash));
+}
+
+void AltHashing::testEquivalentHashes() {
+ jint jbytes, jchars, ints;
+
+ // printf("testEquivalentHashes\n");
+
+ jbytes = murmur3_32(TWO_BYTE, 2);
+ jchars = murmur3_32(ONE_CHAR, 1);
+ assert (jbytes == jchars,
+ err_msg("Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars));
+
+ jbytes = murmur3_32(FOUR_BYTE, 4);
+ jchars = murmur3_32(TWO_CHAR, 2);
+ ints = murmur3_32(ONE_INT, 1);
+ assert ((jbytes == jchars) && (jbytes == ints),
+ err_msg("Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints));
+
+ jbytes = murmur3_32(SIX_BYTE, 6);
+ jchars = murmur3_32(THREE_CHAR, 3);
+ assert (jbytes == jchars,
+ err_msg("Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars));
+
+ jbytes = murmur3_32(EIGHT_BYTE, 8);
+ jchars = murmur3_32(FOUR_CHAR, 4);
+ ints = murmur3_32(TWO_INT, 2);
+ assert ((jbytes == jchars) && (jbytes == ints),
+ err_msg("Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints));
+}
+
+// Returns true if the alternate hashcode is correct
+void AltHashing::test_alt_hash() {
+ testMurmur3_32_ByteArray();
+ testEquivalentHashes();
+}
+#endif // PRODUCT
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/classfile/altHashing.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_CLASSFILE_ALTHASHING_HPP
+#define SHARE_VM_CLASSFILE_ALTHASHING_HPP
+
+#include "prims/jni.h"
+#include "classfile/symbolTable.hpp"
+
+/**
+ * Hashing utilities.
+ *
+ * Implementation of Murmur3 hashing.
+ * This code was translated from src/share/classes/sun/misc/Hashing.java
+ * code in the JDK.
+ */
+
+class AltHashing : AllStatic {
+
+ // utility function copied from java/lang/Integer
+ static jint Integer_rotateLeft(jint i, int distance) {
+ return (i << distance) | (((juint)i) >> (32-distance));
+ }
+ static jint murmur3_32(const int* data, int len);
+ static jint murmur3_32(jint seed, const int* data, int len);
+
+#ifndef PRODUCT
+ // Hashing functions used for internal testing
+ static jint murmur3_32(const jbyte* data, int len);
+ static jint murmur3_32(const jchar* data, int len);
+ static void testMurmur3_32_ByteArray();
+ static void testEquivalentHashes();
+#endif // PRODUCT
+
+ public:
+ static jint compute_seed();
+ static jint murmur3_32(jint seed, const jbyte* data, int len);
+ static jint murmur3_32(jint seed, const jchar* data, int len);
+ NOT_PRODUCT(static void test_alt_hash();)
+};
+#endif // SHARE_VM_CLASSFILE_ALTHASHING_HPP
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
#include "classfile/javaClasses.hpp"
#include "classfile/symbolTable.hpp"
#include "classfile/vmSymbols.hpp"
@@ -347,13 +348,26 @@
return result;
}
-unsigned int java_lang_String::hash_string(oop java_string) {
+unsigned int java_lang_String::to_hash(oop java_string) {
+ int length = java_lang_String::length(java_string);
+ // Zero length string will hash to zero with String.toHash() function.
+ if (length == 0) return 0;
+
typeArrayOop value = java_lang_String::value(java_string);
int offset = java_lang_String::offset(java_string);
+ return java_lang_String::to_hash(value->char_at_addr(offset), length);
+}
+
+unsigned int java_lang_String::hash_string(oop java_string) {
int length = java_lang_String::length(java_string);
-
- if (length == 0) return 0;
- return hash_string(value->char_at_addr(offset), length);
+ // Zero length string doesn't hash necessarily hash to zero.
+ if (length == 0) {
+ return StringTable::hash_string(NULL, 0);
+ }
+
+ typeArrayOop value = java_lang_String::value(java_string);
+ int offset = java_lang_String::offset(java_string);
+ return StringTable::hash_string(value->char_at_addr(offset), length);
}
Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -158,20 +158,16 @@
static jchar* as_unicode_string(oop java_string, int& length);
// Compute the hash value for a java.lang.String object which would
- // contain the characters passed in. This hash value is used for at
- // least two purposes.
- //
- // (a) As the hash value used by the StringTable for bucket selection
- // and comparison (stored in the HashtableEntry structures). This
- // is used in the String.intern() method.
+ // contain the characters passed in.
//
- // (b) As the hash value used by the String object itself, in
- // String.hashCode(). This value is normally calculate in Java code
- // in the String.hashCode method(), but is precomputed for String
- // objects in the shared archive file.
+ // As the hash value used by the String object itself, in
+ // String.hashCode(). This value is normally calculated in Java code
+ // in the String.hashCode method(), but is precomputed for String
+ // objects in the shared archive file.
+ // hash P(31) from Kernighan & Ritchie
//
- // For this reason, THIS ALGORITHM MUST MATCH String.hashCode().
- static unsigned int hash_string(jchar* s, int len) {
+ // For this reason, THIS ALGORITHM MUST MATCH String.toHash().
+ template <typename T> static unsigned int to_hash(T* s, int len) {
unsigned int h = 0;
while (len-- > 0) {
h = 31*h + (unsigned int) *s;
@@ -179,6 +175,10 @@
}
return h;
}
+ static unsigned int to_hash(oop java_string);
+
+ // This is the string hash code used by the StringTable, which may be
+ // the same as String.toHash or an alternate hash code.
static unsigned int hash_string(oop java_string);
static bool equals(oop java_string, jchar* chars, int len);
--- a/hotspot/src/share/vm/classfile/symbolTable.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/classfile/symbolTable.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
#include "classfile/javaClasses.hpp"
#include "classfile/symbolTable.hpp"
#include "classfile/systemDictionary.hpp"
@@ -34,19 +35,19 @@
#include "oops/oop.inline2.hpp"
#include "runtime/mutexLocker.hpp"
#include "utilities/hashtable.inline.hpp"
+#include "utilities/numberSeq.hpp"
// --------------------------------------------------------------------------
SymbolTable* SymbolTable::_the_table = NULL;
// Static arena for symbols that are not deallocated
Arena* SymbolTable::_arena = NULL;
+bool SymbolTable::_needs_rehashing = false;
+jint SymbolTable::_seed = 0;
Symbol* SymbolTable::allocate_symbol(const u1* name, int len, bool c_heap, TRAPS) {
- // Don't allow symbols to be created which cannot fit in a Symbol*.
- if (len > Symbol::max_length()) {
- THROW_MSG_0(vmSymbols::java_lang_InternalError(),
- "name is too long to represent");
- }
+ assert (len <= Symbol::max_length(), "should be checked by caller");
+
Symbol* sym;
// Allocate symbols in the C heap when dumping shared spaces in case there
// are temporary symbols we can remove.
@@ -91,9 +92,14 @@
int total = 0;
size_t memory_total = 0;
for (int i = 0; i < the_table()->table_size(); ++i) {
- for (HashtableEntry<Symbol*>** p = the_table()->bucket_addr(i); *p != NULL; ) {
- HashtableEntry<Symbol*>* entry = *p;
- if (entry->is_shared()) {
+ HashtableEntry<Symbol*>** p = the_table()->bucket_addr(i);
+ HashtableEntry<Symbol*>* entry = the_table()->bucket(i);
+ while (entry != NULL) {
+ // Shared entries are normally at the end of the bucket and if we run into
+ // a shared entry, then there is nothing more to remove. However, if we
+ // have rehashed the table, then the shared entries are no longer at the
+ // end of the bucket.
+ if (entry->is_shared() && !use_alternate_hashcode()) {
break;
}
Symbol* s = entry->literal();
@@ -102,6 +108,7 @@
assert(s != NULL, "just checking");
// If reference count is zero, remove.
if (s->refcount() == 0) {
+ assert(!entry->is_shared(), "shared entries should be kept live");
delete s;
removed++;
*p = entry->next();
@@ -109,6 +116,8 @@
} else {
p = entry->next_addr();
}
+ // get next entry
+ entry = (HashtableEntry<Symbol*>*)HashtableEntry<Symbol*>::make_ptr(*p);
}
}
symbols_removed += removed;
@@ -121,12 +130,42 @@
}
}
+unsigned int SymbolTable::new_hash(Symbol* sym) {
+ ResourceMark rm;
+ // Use alternate hashing algorithm on this symbol.
+ return AltHashing::murmur3_32(seed(), (const jbyte*)sym->as_C_string(), sym->utf8_length());
+}
+
+// Create a new table and using alternate hash code, populate the new table
+// with the existing strings. Set flag to use the alternate hash code afterwards.
+void SymbolTable::rehash_table() {
+ assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
+ // This should never happen with -Xshare:dump but it might in testing mode.
+ if (DumpSharedSpaces) return;
+ // Create a new symbol table
+ SymbolTable* new_table = new SymbolTable();
+
+ // Initialize the global seed for hashing.
+ _seed = AltHashing::compute_seed();
+ assert(seed() != 0, "shouldn't be zero");
+
+ the_table()->move_to(new_table);
+
+ // Delete the table and buckets (entries are reused in new table).
+ delete _the_table;
+ // Don't check if we need rehashing until the table gets unbalanced again.
+ // Then rehash with a new global seed.
+ _needs_rehashing = false;
+ _the_table = new_table;
+}
// Lookup a symbol in a bucket.
Symbol* SymbolTable::lookup(int index, const char* name,
int len, unsigned int hash) {
+ int count = 0;
for (HashtableEntry<Symbol*>* e = bucket(index); e != NULL; e = e->next()) {
+ count++; // count all entries in this bucket, not just ones with same hash
if (e->hash() == hash) {
Symbol* sym = e->literal();
if (sym->equals(name, len)) {
@@ -136,9 +175,20 @@
}
}
}
+ // If the bucket size is too deep check if this hash code is insufficient.
+ if (count >= BasicHashtable::rehash_count && !needs_rehashing()) {
+ _needs_rehashing = check_rehash_table(count);
+ }
return NULL;
}
+// Pick hashing algorithm.
+unsigned int SymbolTable::hash_symbol(const char* s, int len) {
+ return use_alternate_hashcode() ?
+ AltHashing::murmur3_32(seed(), (const jbyte*)s, len) :
+ java_lang_String::to_hash(s, len);
+}
+
// We take care not to be blocking while holding the
// SymbolTable_lock. Otherwise, the system might deadlock, since the
@@ -156,6 +206,9 @@
// Found
if (s != NULL) return s;
+ // Grab SymbolTable_lock first.
+ MutexLocker ml(SymbolTable_lock, THREAD);
+
// Otherwise, add to symbol to table
return the_table()->basic_add(index, (u1*)name, len, hashValue, true, CHECK_NULL);
}
@@ -193,6 +246,9 @@
// We can't include the code in No_Safepoint_Verifier because of the
// ResourceMark.
+ // Grab SymbolTable_lock first.
+ MutexLocker ml(SymbolTable_lock, THREAD);
+
return the_table()->basic_add(index, (u1*)buffer, len, hashValue, true, CHECK_NULL);
}
@@ -261,6 +317,9 @@
int names_count,
const char** names, int* lengths, int* cp_indices,
unsigned int* hashValues, TRAPS) {
+ // Grab SymbolTable_lock first.
+ MutexLocker ml(SymbolTable_lock, THREAD);
+
SymbolTable* table = the_table();
bool added = table->basic_add(class_loader, cp, names_count, names, lengths,
cp_indices, hashValues, CHECK);
@@ -281,18 +340,39 @@
if (result != NULL) {
return result;
}
+ // Grab SymbolTable_lock first.
+ MutexLocker ml(SymbolTable_lock, THREAD);
+
SymbolTable* table = the_table();
int index = table->hash_to_index(hash);
return table->basic_add(index, (u1*)name, (int)strlen(name), hash, false, THREAD);
}
-Symbol* SymbolTable::basic_add(int index, u1 *name, int len,
- unsigned int hashValue, bool c_heap, TRAPS) {
+Symbol* SymbolTable::basic_add(int index_arg, u1 *name, int len,
+ unsigned int hashValue_arg, bool c_heap, TRAPS) {
assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
"proposed name of symbol must be stable");
- // Grab SymbolTable_lock first.
- MutexLocker ml(SymbolTable_lock, THREAD);
+ // Don't allow symbols to be created which cannot fit in a Symbol*.
+ if (len > Symbol::max_length()) {
+ THROW_MSG_0(vmSymbols::java_lang_InternalError(),
+ "name is too long to represent");
+ }
+
+ // Cannot hit a safepoint in this function because the "this" pointer can move.
+ No_Safepoint_Verifier nsv;
+
+ // Check if the symbol table has been rehashed, if so, need to recalculate
+ // the hash value and index.
+ unsigned int hashValue;
+ int index;
+ if (use_alternate_hashcode()) {
+ hashValue = hash_symbol((const char*)name, len);
+ index = hash_to_index(hashValue);
+ } else {
+ hashValue = hashValue_arg;
+ index = index_arg;
+ }
// Since look-up was done lock-free, we need to check if another
// thread beat us in the race to insert the symbol.
@@ -328,14 +408,22 @@
}
}
- // Hold SymbolTable_lock through the symbol creation
- MutexLocker ml(SymbolTable_lock, THREAD);
+ // Cannot hit a safepoint in this function because the "this" pointer can move.
+ No_Safepoint_Verifier nsv;
for (int i=0; i<names_count; i++) {
+ // Check if the symbol table has been rehashed, if so, need to recalculate
+ // the hash value.
+ unsigned int hashValue;
+ if (use_alternate_hashcode()) {
+ hashValue = hash_symbol(names[i], lengths[i]);
+ } else {
+ hashValue = hashValues[i];
+ }
// Since look-up was done lock-free, we need to check if another
// thread beat us in the race to insert the symbol.
- int index = hash_to_index(hashValues[i]);
- Symbol* test = lookup(index, names[i], lengths[i], hashValues[i]);
+ int index = hash_to_index(hashValue);
+ Symbol* test = lookup(index, names[i], lengths[i], hashValue);
if (test != NULL) {
// A race occurred and another thread introduced the symbol, this one
// will be dropped and collected. Use test instead.
@@ -347,7 +435,7 @@
bool c_heap = class_loader() != NULL;
Symbol* sym = allocate_symbol((const u1*)names[i], lengths[i], c_heap, CHECK_(false));
assert(sym->equals(names[i], lengths[i]), "symbol must be properly initialized"); // why wouldn't it be???
- HashtableEntry<Symbol*>* entry = new_entry(hashValues[i], sym);
+ HashtableEntry<Symbol*>* entry = new_entry(hashValue, sym);
add_entry(index, entry);
cp->symbol_at_put(cp_indices[i], sym);
}
@@ -370,6 +458,24 @@
}
}
+void SymbolTable::dump(outputStream* st) {
+ NumberSeq summary;
+ for (int i = 0; i < the_table()->table_size(); ++i) {
+ int count = 0;
+ for (HashtableEntry<Symbol*>* e = the_table()->bucket(i);
+ e != NULL; e = e->next()) {
+ count++;
+ }
+ summary.add((double)count);
+ }
+ st->print_cr("SymbolTable statistics:");
+ st->print_cr("Number of buckets : %7d", summary.num());
+ st->print_cr("Average bucket size : %7.0f", summary.avg());
+ st->print_cr("Variance of bucket size : %7.0f", summary.variance());
+ st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd());
+ st->print_cr("Maximum bucket size : %7.0f", summary.maximum());
+}
+
//---------------------------------------------------------------------------
// Non-product code
@@ -468,7 +574,6 @@
}
}
}
-
#endif // PRODUCT
// --------------------------------------------------------------------------
@@ -514,38 +619,53 @@
// --------------------------------------------------------------------------
StringTable* StringTable::_the_table = NULL;
+bool StringTable::_needs_rehashing = false;
+jint StringTable::_seed = 0;
+
+// Pick hashing algorithm
+unsigned int StringTable::hash_string(const jchar* s, int len) {
+ return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) :
+ java_lang_String::to_hash(s, len);
+}
+
oop StringTable::lookup(int index, jchar* name,
int len, unsigned int hash) {
+ int count = 0;
for (HashtableEntry<oop>* l = bucket(index); l != NULL; l = l->next()) {
+ count++;
if (l->hash() == hash) {
if (java_lang_String::equals(l->literal(), name, len)) {
return l->literal();
}
}
}
+ // If the bucket size is too deep check if this hash code is insufficient.
+ if (count >= BasicHashtable::rehash_count && !needs_rehashing()) {
+ _needs_rehashing = check_rehash_table(count);
+ }
return NULL;
}
-oop StringTable::basic_add(int index, Handle string_or_null, jchar* name,
- int len, unsigned int hashValue, TRAPS) {
- debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
- assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
- "proposed name of symbol must be stable");
-
- Handle string;
- // try to reuse the string if possible
- if (!string_or_null.is_null() && (!JavaObjectsInPerm || string_or_null()->is_perm())) {
- string = string_or_null;
- } else {
- string = java_lang_String::create_tenured_from_unicode(name, len, CHECK_NULL);
- }
-
- // Allocation must be done before grapping the SymbolTable_lock lock
- MutexLocker ml(StringTable_lock, THREAD);
+oop StringTable::basic_add(int index_arg, Handle string, jchar* name,
+ int len, unsigned int hashValue_arg, TRAPS) {
assert(java_lang_String::equals(string(), name, len),
"string must be properly initialized");
+ // Cannot hit a safepoint in this function because the "this" pointer can move.
+ No_Safepoint_Verifier nsv;
+
+ // Check if the symbol table has been rehashed, if so, need to recalculate
+ // the hash value and index before second lookup.
+ unsigned int hashValue;
+ int index;
+ if (use_alternate_hashcode()) {
+ hashValue = hash_string(name, len);
+ index = hash_to_index(hashValue);
+ } else {
+ hashValue = hashValue_arg;
+ index = index_arg;
+ }
// Since look-up was done lock-free, we need to check if another
// thread beat us in the race to insert the symbol.
@@ -566,7 +686,7 @@
ResourceMark rm;
int length;
jchar* chars = symbol->as_unicode(length);
- unsigned int hashValue = java_lang_String::hash_string(chars, length);
+ unsigned int hashValue = hash_string(chars, length);
int index = the_table()->hash_to_index(hashValue);
return the_table()->lookup(index, chars, length, hashValue);
}
@@ -574,15 +694,31 @@
oop StringTable::intern(Handle string_or_null, jchar* name,
int len, TRAPS) {
- unsigned int hashValue = java_lang_String::hash_string(name, len);
+ unsigned int hashValue = hash_string(name, len);
int index = the_table()->hash_to_index(hashValue);
- oop string = the_table()->lookup(index, name, len, hashValue);
+ oop found_string = the_table()->lookup(index, name, len, hashValue);
// Found
- if (string != NULL) return string;
+ if (found_string != NULL) return found_string;
+
+ debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
+ assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
+ "proposed name of symbol must be stable");
+
+ Handle string;
+ // try to reuse the string if possible
+ if (!string_or_null.is_null() && (!JavaObjectsInPerm || string_or_null()->is_perm())) {
+ string = string_or_null;
+ } else {
+ string = java_lang_String::create_tenured_from_unicode(name, len, CHECK_NULL);
+ }
+
+ // Grab the StringTable_lock before getting the_table() because it could
+ // change at safepoint.
+ MutexLocker ml(StringTable_lock, THREAD);
// Otherwise, add to symbol to table
- return the_table()->basic_add(index, string_or_null, name, len,
+ return the_table()->basic_add(index, string, name, len,
hashValue, CHECK_NULL);
}
@@ -625,18 +761,24 @@
// entries at a safepoint.
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
for (int i = 0; i < the_table()->table_size(); ++i) {
- for (HashtableEntry<oop>** p = the_table()->bucket_addr(i); *p != NULL; ) {
- HashtableEntry<oop>* entry = *p;
- if (entry->is_shared()) {
+ HashtableEntry<oop>** p = the_table()->bucket_addr(i);
+ HashtableEntry<oop>* entry = the_table()->bucket(i);
+ while (entry != NULL) {
+ // Shared entries are normally at the end of the bucket and if we run into
+ // a shared entry, then there is nothing more to remove. However, if we
+ // have rehashed the table, then the shared entries are no longer at the
+ // end of the bucket.
+ if (entry->is_shared() && !use_alternate_hashcode()) {
break;
}
assert(entry->literal() != NULL, "just checking");
- if (is_alive->do_object_b(entry->literal())) {
+ if (entry->is_shared() || is_alive->do_object_b(entry->literal())) {
p = entry->next_addr();
} else {
*p = entry->next();
the_table()->free_entry(entry);
}
+ entry = (HashtableEntry<oop>*)HashtableEntry<oop>::make_ptr(*p);
}
}
}
@@ -675,3 +817,53 @@
}
}
}
+
+void StringTable::dump(outputStream* st) {
+ NumberSeq summary;
+ for (int i = 0; i < the_table()->table_size(); ++i) {
+ HashtableEntry<oop>* p = the_table()->bucket(i);
+ int count = 0;
+ for ( ; p != NULL; p = p->next()) {
+ count++;
+ }
+ summary.add((double)count);
+ }
+ st->print_cr("StringTable statistics:");
+ st->print_cr("Number of buckets : %7d", summary.num());
+ st->print_cr("Average bucket size : %7.0f", summary.avg());
+ st->print_cr("Variance of bucket size : %7.0f", summary.variance());
+ st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd());
+ st->print_cr("Maximum bucket size : %7.0f", summary.maximum());
+}
+
+
+unsigned int StringTable::new_hash(oop string) {
+ ResourceMark rm;
+ int length;
+ jchar* chars = java_lang_String::as_unicode_string(string, length);
+ // Use alternate hashing algorithm on the string
+ return AltHashing::murmur3_32(seed(), chars, length);
+}
+
+// Create a new table and using alternate hash code, populate the new table
+// with the existing strings. Set flag to use the alternate hash code afterwards.
+void StringTable::rehash_table() {
+ assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
+ // This should never happen with -Xshare:dump but it might in testing mode.
+ if (DumpSharedSpaces) return;
+ StringTable* new_table = new StringTable();
+
+ // Initialize new global seed for hashing.
+ _seed = AltHashing::compute_seed();
+ assert(seed() != 0, "shouldn't be zero");
+
+ // Rehash the table
+ the_table()->move_to(new_table);
+
+ // Delete the table and buckets (entries are reused in new table).
+ delete _the_table;
+ // Don't check if we need rehashing until the table gets unbalanced again.
+ // Then rehash with a new global seed.
+ _needs_rehashing = false;
+ _the_table = new_table;
+}
--- a/hotspot/src/share/vm/classfile/symbolTable.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/classfile/symbolTable.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -40,6 +40,7 @@
// - symbolTableEntrys are allocated in blocks to reduce the space overhead.
class BoolObjectClosure;
+class outputStream;
// Class to hold a newly created or referenced Symbol* temporarily in scope.
@@ -78,6 +79,10 @@
// The symbol table
static SymbolTable* _the_table;
+ // Set if one bucket is out of balance due to hash algorithm deficiency
+ static bool _needs_rehashing;
+ static jint _seed;
+
// For statistics
static int symbols_removed;
static int symbols_counted;
@@ -119,6 +124,11 @@
static Arena* arena() { return _arena; } // called for statistics
static void initialize_symbols(int arena_alloc_size = 0);
+
+ static bool use_alternate_hashcode() { return _seed != 0; }
+ static jint seed() { return _seed; }
+
+ unsigned int new_hash(Symbol* sym);
public:
enum {
symbol_alloc_batch_size = 8,
@@ -146,6 +156,8 @@
initialize_symbols();
}
+ static unsigned int hash_symbol(const char* s, int len);
+
static Symbol* lookup(const char* name, int len, TRAPS);
// lookup only, won't add. Also calculate hash.
static Symbol* lookup_only(const char* name, int len, unsigned int& hash);
@@ -208,6 +220,7 @@
// Debugging
static void verify();
+ static void dump(outputStream* st);
// Sharing
static void copy_buckets(char** top, char*end) {
@@ -219,8 +232,13 @@
static void reverse(void* boundary = NULL) {
the_table()->Hashtable<Symbol*>::reverse(boundary);
}
+
+ // Rehash the symbol table if it gets out of balance
+ static void rehash_table();
+ static bool needs_rehashing() { return _needs_rehashing; }
};
+
class StringTable : public Hashtable<oop> {
friend class VMStructs;
@@ -228,6 +246,10 @@
// The string table
static StringTable* _the_table;
+ // Set if one bucket is out of balance due to hash algorithm deficiency
+ static bool _needs_rehashing;
+ static jint _seed;
+
static oop intern(Handle string_or_null, jchar* chars, int length, TRAPS);
oop basic_add(int index, Handle string_or_null, jchar* name, int len,
unsigned int hashValue, TRAPS);
@@ -241,6 +263,10 @@
: Hashtable<oop>((int)StringTableSize, sizeof (HashtableEntry<oop>), t,
number_of_entries) {}
+ static bool use_alternate_hashcode() { return _seed != 0; }
+ static jint seed() { return _seed; }
+
+ unsigned int new_hash(oop s);
public:
// The string table
static StringTable* the_table() { return _the_table; }
@@ -265,6 +291,14 @@
// Invoke "f->do_oop" on the locations of all oops in the table.
static void oops_do(OopClosure* f);
+ // Hashing algorithm, used as the hash value used by the
+ // StringTable for bucket selection and comparison (stored in the
+ // HashtableEntry structures). This is used in the String.intern() method.
+ static unsigned int hash_string(const jchar* s, int len);
+
+ // Internal test.
+ static void test_alt_hash() PRODUCT_RETURN;
+
// Probing
static oop lookup(Symbol* symbol);
@@ -275,6 +309,7 @@
// Debugging
static void verify();
+ static void dump(outputStream* st);
// Sharing
static void copy_buckets(char** top, char*end) {
@@ -286,6 +321,9 @@
static void reverse() {
the_table()->Hashtable<oop>::reverse();
}
+
+ // Rehash the symbol table if it gets out of balance
+ static void rehash_table();
+ static bool needs_rehashing() { return _needs_rehashing; }
};
-
#endif // SHARE_VM_CLASSFILE_SYMBOLTABLE_HPP
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -111,6 +111,10 @@
template(getBootClassPathEntryForClass_name, "getBootClassPathEntryForClass") \
template(sun_misc_PostVMInitHook, "sun/misc/PostVMInitHook") \
\
+ /* Java runtime version access */ \
+ template(sun_misc_Version, "sun/misc/Version") \
+ template(java_runtime_name_name, "java_runtime_name") \
+ \
/* class file format tags */ \
template(tag_source_file, "SourceFile") \
template(tag_inner_classes, "InnerClasses") \
--- a/hotspot/src/share/vm/code/vmreg.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/code/vmreg.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -27,7 +27,7 @@
#include "code/vmreg.hpp"
// First VMReg value that could refer to a stack slot
-VMReg VMRegImpl::stack0 = (VMReg)(intptr_t)((ConcreteRegisterImpl::number_of_registers + 1) & ~1);
+VMReg VMRegImpl::stack0 = (VMReg)(intptr_t)((ConcreteRegisterImpl::number_of_registers + 7) & ~7);
// VMRegs are 4 bytes wide on all platforms
const int VMRegImpl::stack_slot_size = 4;
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -4750,9 +4750,6 @@
_g1h->g1_policy()->record_thread_age_table(pss.age_table());
_g1h->update_surviving_young_words(pss.surviving_young_words()+1);
- // Clean up any par-expanded rem sets.
- HeapRegionRemSet::par_cleanup();
-
if (ParallelGCVerbose) {
MutexLocker x(stats_lock());
pss.print_termination_stats(worker_id);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -53,6 +53,9 @@
develop(bool, G1TraceMarkStackOverflow, false, \
"If true, extra debugging code for CM restart for ovflw.") \
\
+ develop(bool, G1TraceHeapRegionRememberedSet, false, \
+ "Enables heap region remembered set debug logs") \
+ \
diagnostic(bool, G1SummarizeConcMark, false, \
"Summarize concurrent mark info") \
\
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -30,13 +30,10 @@
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
#include "memory/allocation.hpp"
#include "memory/space.inline.hpp"
+#include "oops/oop.inline.hpp"
#include "utilities/bitMap.inline.hpp"
#include "utilities/globalDefinitions.hpp"
-#define HRRS_VERBOSE 0
-
-#define PRT_COUNT_OCCUPIED 1
-
// OtherRegionsTable
class PerRegionTable: public CHeapObj {
@@ -45,14 +42,10 @@
HeapRegion* _hr;
BitMap _bm;
-#if PRT_COUNT_OCCUPIED
jint _occupied;
-#endif
- PerRegionTable* _next_free;
- PerRegionTable* next_free() { return _next_free; }
- void set_next_free(PerRegionTable* prt) { _next_free = prt; }
-
+ // next pointer for free/allocated lis
+ PerRegionTable* _next;
static PerRegionTable* _free_list;
@@ -69,63 +62,25 @@
// We need access in order to union things into the base table.
BitMap* bm() { return &_bm; }
-#if PRT_COUNT_OCCUPIED
void recount_occupied() {
_occupied = (jint) bm()->count_one_bits();
}
-#endif
PerRegionTable(HeapRegion* hr) :
_hr(hr),
-#if PRT_COUNT_OCCUPIED
_occupied(0),
-#endif
_bm(HeapRegion::CardsPerRegion, false /* in-resource-area */)
{}
- static void free(PerRegionTable* prt) {
- while (true) {
- PerRegionTable* fl = _free_list;
- prt->set_next_free(fl);
- PerRegionTable* res =
- (PerRegionTable*)
- Atomic::cmpxchg_ptr(prt, &_free_list, fl);
- if (res == fl) return;
- }
- ShouldNotReachHere();
- }
-
- static PerRegionTable* alloc(HeapRegion* hr) {
- PerRegionTable* fl = _free_list;
- while (fl != NULL) {
- PerRegionTable* nxt = fl->next_free();
- PerRegionTable* res =
- (PerRegionTable*)
- Atomic::cmpxchg_ptr(nxt, &_free_list, fl);
- if (res == fl) {
- fl->init(hr);
- return fl;
- } else {
- fl = _free_list;
- }
- }
- assert(fl == NULL, "Loop condition.");
- return new PerRegionTable(hr);
- }
-
void add_card_work(CardIdx_t from_card, bool par) {
if (!_bm.at(from_card)) {
if (par) {
if (_bm.par_at_put(from_card, 1)) {
-#if PRT_COUNT_OCCUPIED
Atomic::inc(&_occupied);
-#endif
}
} else {
_bm.at_put(from_card, 1);
-#if PRT_COUNT_OCCUPIED
_occupied++;
-#endif
}
}
}
@@ -134,10 +89,13 @@
// Must make this robust in case "from" is not in "_hr", because of
// concurrency.
-#if HRRS_VERBOSE
- gclog_or_tty->print_cr(" PRT::Add_reference_work(" PTR_FORMAT "->" PTR_FORMAT").",
- from, *from);
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print_cr(" PRT::Add_reference_work(" PTR_FORMAT "->" PTR_FORMAT").",
+ from,
+ UseCompressedOops
+ ? oopDesc::load_decode_heap_oop((narrowOop*)from)
+ : oopDesc::load_decode_heap_oop((oop*)from));
+ }
HeapRegion* loc_hr = hr();
// If the test below fails, then this table was reused concurrently
@@ -162,23 +120,16 @@
HeapRegion* hr() const { return _hr; }
-#if PRT_COUNT_OCCUPIED
jint occupied() const {
// Overkill, but if we ever need it...
// guarantee(_occupied == _bm.count_one_bits(), "Check");
return _occupied;
}
-#else
- jint occupied() const {
- return _bm.count_one_bits();
- }
-#endif
void init(HeapRegion* hr) {
_hr = hr;
-#if PRT_COUNT_OCCUPIED
+ _next = NULL;
_occupied = 0;
-#endif
_bm.clear();
}
@@ -194,9 +145,7 @@
HeapWord* hr_bot = hr()->bottom();
size_t hr_first_card_index = ctbs->index_for(hr_bot);
bm()->set_intersection_at_offset(*card_bm, hr_first_card_index);
-#if PRT_COUNT_OCCUPIED
recount_occupied();
-#endif
}
void add_card(CardIdx_t from_card_index) {
@@ -218,16 +167,6 @@
return sizeof(this) + _bm.size_in_words() * HeapWordSize;
}
- static size_t fl_mem_size() {
- PerRegionTable* cur = _free_list;
- size_t res = 0;
- while (cur != NULL) {
- res += sizeof(PerRegionTable);
- cur = cur->next_free();
- }
- return res;
- }
-
// Requires "from" to be in "hr()".
bool contains_reference(OopOrNarrowOopStar from) const {
assert(hr()->is_in_reserved(from), "Precondition.");
@@ -235,122 +174,29 @@
CardTableModRefBS::card_size);
return _bm.at(card_ind);
}
-};
-PerRegionTable* PerRegionTable::_free_list = NULL;
-
-
-#define COUNT_PAR_EXPANDS 0
-
-#if COUNT_PAR_EXPANDS
-static jint n_par_expands = 0;
-static jint n_par_contracts = 0;
-static jint par_expand_list_len = 0;
-static jint max_par_expand_list_len = 0;
-
-static void print_par_expand() {
- Atomic::inc(&n_par_expands);
- Atomic::inc(&par_expand_list_len);
- if (par_expand_list_len > max_par_expand_list_len) {
- max_par_expand_list_len = par_expand_list_len;
- }
- if ((n_par_expands % 10) == 0) {
- gclog_or_tty->print_cr("\n\n%d par expands: %d contracts, "
- "len = %d, max_len = %d\n.",
- n_par_expands, n_par_contracts, par_expand_list_len,
- max_par_expand_list_len);
- }
-}
-#endif
-
-class PosParPRT: public PerRegionTable {
- PerRegionTable** _par_tables;
-
- enum SomePrivateConstants {
- ReserveParTableExpansion = 1
- };
+ PerRegionTable* next() const { return _next; }
+ void set_next(PerRegionTable* nxt) { _next = nxt; }
+ PerRegionTable** next_addr() { return &_next; }
- void par_contract() {
- assert(_par_tables != NULL, "Precondition.");
- int n = HeapRegionRemSet::num_par_rem_sets()-1;
- for (int i = 0; i < n; i++) {
- _par_tables[i]->union_bitmap_into(bm());
- PerRegionTable::free(_par_tables[i]);
- _par_tables[i] = NULL;
- }
-#if PRT_COUNT_OCCUPIED
- // We must recount the "occupied."
- recount_occupied();
-#endif
- FREE_C_HEAP_ARRAY(PerRegionTable*, _par_tables);
- _par_tables = NULL;
-#if COUNT_PAR_EXPANDS
- Atomic::inc(&n_par_contracts);
- Atomic::dec(&par_expand_list_len);
-#endif
- }
-
- static PerRegionTable** _par_table_fl;
-
- PosParPRT* _next;
-
- static PosParPRT* _free_list;
-
- PerRegionTable** par_tables() const {
- assert(uintptr_t(NULL) == 0, "Assumption.");
- if (uintptr_t(_par_tables) <= ReserveParTableExpansion)
- return NULL;
- else
- return _par_tables;
- }
-
- PosParPRT* _next_par_expanded;
- PosParPRT* next_par_expanded() { return _next_par_expanded; }
- void set_next_par_expanded(PosParPRT* ppprt) { _next_par_expanded = ppprt; }
- static PosParPRT* _par_expanded_list;
-
-public:
-
- PosParPRT(HeapRegion* hr) : PerRegionTable(hr), _par_tables(NULL) {}
-
- jint occupied() const {
- jint res = PerRegionTable::occupied();
- if (par_tables() != NULL) {
- for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
- res += par_tables()[i]->occupied();
- }
- }
- return res;
- }
-
- void init(HeapRegion* hr) {
- PerRegionTable::init(hr);
- _next = NULL;
- if (par_tables() != NULL) {
- for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
- par_tables()[i]->init(hr);
- }
- }
- }
-
- static void free(PosParPRT* prt) {
+ static void free(PerRegionTable* prt) {
while (true) {
- PosParPRT* fl = _free_list;
+ PerRegionTable* fl = _free_list;
prt->set_next(fl);
- PosParPRT* res =
- (PosParPRT*)
+ PerRegionTable* res =
+ (PerRegionTable*)
Atomic::cmpxchg_ptr(prt, &_free_list, fl);
if (res == fl) return;
}
ShouldNotReachHere();
}
- static PosParPRT* alloc(HeapRegion* hr) {
- PosParPRT* fl = _free_list;
+ static PerRegionTable* alloc(HeapRegion* hr) {
+ PerRegionTable* fl = _free_list;
while (fl != NULL) {
- PosParPRT* nxt = fl->next();
- PosParPRT* res =
- (PosParPRT*)
+ PerRegionTable* nxt = fl->next();
+ PerRegionTable* res =
+ (PerRegionTable*)
Atomic::cmpxchg_ptr(nxt, &_free_list, fl);
if (res == fl) {
fl->init(hr);
@@ -360,148 +206,26 @@
}
}
assert(fl == NULL, "Loop condition.");
- return new PosParPRT(hr);
- }
-
- PosParPRT* next() const { return _next; }
- void set_next(PosParPRT* nxt) { _next = nxt; }
- PosParPRT** next_addr() { return &_next; }
-
- bool should_expand(int tid) {
- // Given that we now defer RSet updates for after a GC we don't
- // really need to expand the tables any more. This code should be
- // cleaned up in the future (see CR 6921087).
- return false;
- }
-
- void par_expand() {
- int n = HeapRegionRemSet::num_par_rem_sets()-1;
- if (n <= 0) return;
- if (_par_tables == NULL) {
- PerRegionTable* res =
- (PerRegionTable*)
- Atomic::cmpxchg_ptr((PerRegionTable*)ReserveParTableExpansion,
- &_par_tables, NULL);
- if (res != NULL) return;
- // Otherwise, we reserved the right to do the expansion.
-
- PerRegionTable** ptables = NEW_C_HEAP_ARRAY(PerRegionTable*, n);
- for (int i = 0; i < n; i++) {
- PerRegionTable* ptable = PerRegionTable::alloc(hr());
- ptables[i] = ptable;
- }
- // Here we do not need an atomic.
- _par_tables = ptables;
-#if COUNT_PAR_EXPANDS
- print_par_expand();
-#endif
- // We must put this table on the expanded list.
- PosParPRT* exp_head = _par_expanded_list;
- while (true) {
- set_next_par_expanded(exp_head);
- PosParPRT* res =
- (PosParPRT*)
- Atomic::cmpxchg_ptr(this, &_par_expanded_list, exp_head);
- if (res == exp_head) return;
- // Otherwise.
- exp_head = res;
- }
- ShouldNotReachHere();
- }
- }
-
- void add_reference(OopOrNarrowOopStar from, int tid) {
- // Expand if necessary.
- PerRegionTable** pt = par_tables();
- if (pt != NULL) {
- // We always have to assume that mods to table 0 are in parallel,
- // because of the claiming scheme in parallel expansion. A thread
- // with tid != 0 that finds the table to be NULL, but doesn't succeed
- // in claiming the right of expanding it, will end up in the else
- // clause of the above if test. That thread could be delayed, and a
- // thread 0 add reference could see the table expanded, and come
- // here. Both threads would be adding in parallel. But we get to
- // not use atomics for tids > 0.
- if (tid == 0) {
- PerRegionTable::add_reference(from);
- } else {
- pt[tid-1]->seq_add_reference(from);
- }
- } else {
- // Not expanded -- add to the base table.
- PerRegionTable::add_reference(from);
- }
- }
-
- void scrub(CardTableModRefBS* ctbs, BitMap* card_bm) {
- assert(_par_tables == NULL, "Precondition");
- PerRegionTable::scrub(ctbs, card_bm);
- }
-
- size_t mem_size() const {
- size_t res =
- PerRegionTable::mem_size() + sizeof(this) - sizeof(PerRegionTable);
- if (_par_tables != NULL) {
- for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
- res += _par_tables[i]->mem_size();
- }
- }
- return res;
+ return new PerRegionTable(hr);
}
static size_t fl_mem_size() {
- PosParPRT* cur = _free_list;
+ PerRegionTable* cur = _free_list;
size_t res = 0;
while (cur != NULL) {
- res += sizeof(PosParPRT);
+ res += sizeof(PerRegionTable);
cur = cur->next();
}
return res;
}
-
- bool contains_reference(OopOrNarrowOopStar from) const {
- if (PerRegionTable::contains_reference(from)) return true;
- if (_par_tables != NULL) {
- for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets()-1; i++) {
- if (_par_tables[i]->contains_reference(from)) return true;
- }
- }
- return false;
- }
-
- static void par_contract_all();
};
-void PosParPRT::par_contract_all() {
- PosParPRT* hd = _par_expanded_list;
- while (hd != NULL) {
- PosParPRT* nxt = hd->next_par_expanded();
- PosParPRT* res =
- (PosParPRT*)
- Atomic::cmpxchg_ptr(nxt, &_par_expanded_list, hd);
- if (res == hd) {
- // We claimed the right to contract this table.
- hd->set_next_par_expanded(NULL);
- hd->par_contract();
- hd = _par_expanded_list;
- } else {
- hd = res;
- }
- }
-}
-
-PosParPRT* PosParPRT::_free_list = NULL;
-PosParPRT* PosParPRT::_par_expanded_list = NULL;
-
-jint OtherRegionsTable::_cache_probes = 0;
-jint OtherRegionsTable::_cache_hits = 0;
+PerRegionTable* PerRegionTable::_free_list = NULL;
size_t OtherRegionsTable::_max_fine_entries = 0;
size_t OtherRegionsTable::_mod_max_fine_entries_mask = 0;
-#if SAMPLE_FOR_EVICTION
size_t OtherRegionsTable::_fine_eviction_stride = 0;
size_t OtherRegionsTable::_fine_eviction_sample_size = 0;
-#endif
OtherRegionsTable::OtherRegionsTable(HeapRegion* hr) :
_g1h(G1CollectedHeap::heap()),
@@ -511,34 +235,36 @@
false /* in-resource-area */),
_fine_grain_regions(NULL),
_n_fine_entries(0), _n_coarse_entries(0),
-#if SAMPLE_FOR_EVICTION
_fine_eviction_start(0),
-#endif
_sparse_table(hr)
{
- typedef PosParPRT* PosParPRTPtr;
+ typedef PerRegionTable* PerRegionTablePtr;
+
if (_max_fine_entries == 0) {
assert(_mod_max_fine_entries_mask == 0, "Both or none.");
size_t max_entries_log = (size_t)log2_long((jlong)G1RSetRegionEntries);
_max_fine_entries = (size_t)(1 << max_entries_log);
_mod_max_fine_entries_mask = _max_fine_entries - 1;
-#if SAMPLE_FOR_EVICTION
+
assert(_fine_eviction_sample_size == 0
&& _fine_eviction_stride == 0, "All init at same time.");
_fine_eviction_sample_size = MAX2((size_t)4, max_entries_log);
_fine_eviction_stride = _max_fine_entries / _fine_eviction_sample_size;
-#endif
}
- _fine_grain_regions = new PosParPRTPtr[_max_fine_entries];
- if (_fine_grain_regions == NULL)
+
+ _fine_grain_regions = new PerRegionTablePtr[_max_fine_entries];
+
+ if (_fine_grain_regions == NULL) {
vm_exit_out_of_memory(sizeof(void*)*_max_fine_entries,
"Failed to allocate _fine_grain_entries.");
+ }
+
for (size_t i = 0; i < _max_fine_entries; i++) {
_fine_grain_regions[i] = NULL;
}
}
-int** OtherRegionsTable::_from_card_cache = NULL;
+int** OtherRegionsTable::_from_card_cache = NULL;
size_t OtherRegionsTable::_from_card_cache_max_regions = 0;
size_t OtherRegionsTable::_from_card_cache_mem_size = 0;
@@ -579,38 +305,26 @@
void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, int tid) {
size_t cur_hrs_ind = (size_t) hr()->hrs_index();
-#if HRRS_VERBOSE
- gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").",
- from,
- UseCompressedOops
- ? oopDesc::load_decode_heap_oop((narrowOop*)from)
- : oopDesc::load_decode_heap_oop((oop*)from));
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").",
+ from,
+ UseCompressedOops
+ ? oopDesc::load_decode_heap_oop((narrowOop*)from)
+ : oopDesc::load_decode_heap_oop((oop*)from));
+ }
int from_card = (int)(uintptr_t(from) >> CardTableModRefBS::card_shift);
-#if HRRS_VERBOSE
- gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)",
- hr()->bottom(), from_card,
- _from_card_cache[tid][cur_hrs_ind]);
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)",
+ hr()->bottom(), from_card,
+ _from_card_cache[tid][cur_hrs_ind]);
+ }
-#define COUNT_CACHE 0
-#if COUNT_CACHE
- jint p = Atomic::add(1, &_cache_probes);
- if ((p % 10000) == 0) {
- jint hits = _cache_hits;
- gclog_or_tty->print_cr("%d/%d = %5.2f%% RS cache hits.",
- _cache_hits, p, 100.0* (float)hits/(float)p);
- }
-#endif
if (from_card == _from_card_cache[tid][cur_hrs_ind]) {
-#if HRRS_VERBOSE
- gclog_or_tty->print_cr(" from-card cache hit.");
-#endif
-#if COUNT_CACHE
- Atomic::inc(&_cache_hits);
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print_cr(" from-card cache hit.");
+ }
assert(contains_reference(from), "We just added it!");
return;
} else {
@@ -623,16 +337,16 @@
// If the region is already coarsened, return.
if (_coarse_map.at(from_hrs_ind)) {
-#if HRRS_VERBOSE
- gclog_or_tty->print_cr(" coarse map hit.");
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print_cr(" coarse map hit.");
+ }
assert(contains_reference(from), "We just added it!");
return;
}
// Otherwise find a per-region table to add it to.
size_t ind = from_hrs_ind & _mod_max_fine_entries_mask;
- PosParPRT* prt = find_region_table(ind, from_hr);
+ PerRegionTable* prt = find_region_table(ind, from_hr);
if (prt == NULL) {
MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
// Confirm that it's really not there...
@@ -649,35 +363,35 @@
_sparse_table.add_card(from_hrs_ind, card_index)) {
if (G1RecordHRRSOops) {
HeapRegionRemSet::record(hr(), from);
-#if HRRS_VERBOSE
- gclog_or_tty->print(" Added card " PTR_FORMAT " to region "
- "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
- align_size_down(uintptr_t(from),
- CardTableModRefBS::card_size),
- hr()->bottom(), from);
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print(" Added card " PTR_FORMAT " to region "
+ "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
+ align_size_down(uintptr_t(from),
+ CardTableModRefBS::card_size),
+ hr()->bottom(), from);
+ }
}
-#if HRRS_VERBOSE
- gclog_or_tty->print_cr(" added card to sparse table.");
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print_cr(" added card to sparse table.");
+ }
assert(contains_reference_locked(from), "We just added it!");
return;
} else {
-#if HRRS_VERBOSE
- gclog_or_tty->print_cr(" [tid %d] sparse table entry "
- "overflow(f: %d, t: %d)",
- tid, from_hrs_ind, cur_hrs_ind);
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print_cr(" [tid %d] sparse table entry "
+ "overflow(f: %d, t: %d)",
+ tid, from_hrs_ind, cur_hrs_ind);
+ }
}
if (_n_fine_entries == _max_fine_entries) {
prt = delete_region_table();
} else {
- prt = PosParPRT::alloc(from_hr);
+ prt = PerRegionTable::alloc(from_hr);
}
prt->init(from_hr);
- PosParPRT* first_prt = _fine_grain_regions[ind];
+ PerRegionTable* first_prt = _fine_grain_regions[ind];
prt->set_next(first_prt); // XXX Maybe move to init?
_fine_grain_regions[ind] = prt;
_n_fine_entries++;
@@ -704,38 +418,25 @@
// OtherRegionsTable for why this is OK.
assert(prt != NULL, "Inv");
- if (prt->should_expand(tid)) {
- MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
- HeapRegion* prt_hr = prt->hr();
- if (prt_hr == from_hr) {
- // Make sure the table still corresponds to the same region
- prt->par_expand();
- prt->add_reference(from, tid);
- }
- // else: The table has been concurrently coarsened, evicted, and
- // the table data structure re-used for another table. So, we
- // don't need to add the reference any more given that the table
- // has been coarsened and the whole region will be scanned anyway.
- } else {
- prt->add_reference(from, tid);
- }
+ prt->add_reference(from);
+
if (G1RecordHRRSOops) {
HeapRegionRemSet::record(hr(), from);
-#if HRRS_VERBOSE
- gclog_or_tty->print("Added card " PTR_FORMAT " to region "
- "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
- align_size_down(uintptr_t(from),
- CardTableModRefBS::card_size),
- hr()->bottom(), from);
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print("Added card " PTR_FORMAT " to region "
+ "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n",
+ align_size_down(uintptr_t(from),
+ CardTableModRefBS::card_size),
+ hr()->bottom(), from);
+ }
}
assert(contains_reference(from), "We just added it!");
}
-PosParPRT*
+PerRegionTable*
OtherRegionsTable::find_region_table(size_t ind, HeapRegion* hr) const {
assert(0 <= ind && ind < _max_fine_entries, "Preconditions.");
- PosParPRT* prt = _fine_grain_regions[ind];
+ PerRegionTable* prt = _fine_grain_regions[ind];
while (prt != NULL && prt->hr() != hr) {
prt = prt->next();
}
@@ -743,32 +444,16 @@
return prt;
}
-
-#define DRT_CENSUS 0
-
-#if DRT_CENSUS
-static const int HistoSize = 6;
-static int global_histo[HistoSize] = { 0, 0, 0, 0, 0, 0 };
-static int coarsenings = 0;
-static int occ_sum = 0;
-#endif
-
jint OtherRegionsTable::_n_coarsenings = 0;
-PosParPRT* OtherRegionsTable::delete_region_table() {
-#if DRT_CENSUS
- int histo[HistoSize] = { 0, 0, 0, 0, 0, 0 };
- const int histo_limits[] = { 1, 4, 16, 64, 256, 2048 };
-#endif
-
+PerRegionTable* OtherRegionsTable::delete_region_table() {
assert(_m.owned_by_self(), "Precondition");
assert(_n_fine_entries == _max_fine_entries, "Precondition");
- PosParPRT* max = NULL;
+ PerRegionTable* max = NULL;
jint max_occ = 0;
- PosParPRT** max_prev;
+ PerRegionTable** max_prev;
size_t max_ind;
-#if SAMPLE_FOR_EVICTION
size_t i = _fine_eviction_start;
for (size_t k = 0; k < _fine_eviction_sample_size; k++) {
size_t ii = i;
@@ -778,8 +463,8 @@
if (ii == _max_fine_entries) ii = 0;
guarantee(ii != i, "We must find one.");
}
- PosParPRT** prev = &_fine_grain_regions[ii];
- PosParPRT* cur = *prev;
+ PerRegionTable** prev = &_fine_grain_regions[ii];
+ PerRegionTable* cur = *prev;
while (cur != NULL) {
jint cur_occ = cur->occupied();
if (max == NULL || cur_occ > max_occ) {
@@ -794,64 +479,27 @@
i = i + _fine_eviction_stride;
if (i >= _n_fine_entries) i = i - _n_fine_entries;
}
+
_fine_eviction_start++;
- if (_fine_eviction_start >= _n_fine_entries)
+
+ if (_fine_eviction_start >= _n_fine_entries) {
_fine_eviction_start -= _n_fine_entries;
-#else
- for (int i = 0; i < _max_fine_entries; i++) {
- PosParPRT** prev = &_fine_grain_regions[i];
- PosParPRT* cur = *prev;
- while (cur != NULL) {
- jint cur_occ = cur->occupied();
-#if DRT_CENSUS
- for (int k = 0; k < HistoSize; k++) {
- if (cur_occ <= histo_limits[k]) {
- histo[k]++; global_histo[k]++; break;
- }
- }
-#endif
- if (max == NULL || cur_occ > max_occ) {
- max = cur;
- max_prev = prev;
- max_ind = i;
- max_occ = cur_occ;
- }
- prev = cur->next_addr();
- cur = cur->next();
- }
}
-#endif
- // XXX
+
guarantee(max != NULL, "Since _n_fine_entries > 0");
-#if DRT_CENSUS
- gclog_or_tty->print_cr("In a coarsening: histo of occs:");
- for (int k = 0; k < HistoSize; k++) {
- gclog_or_tty->print_cr(" <= %4d: %5d.", histo_limits[k], histo[k]);
- }
- coarsenings++;
- occ_sum += max_occ;
- if ((coarsenings % 100) == 0) {
- gclog_or_tty->print_cr("\ncoarsenings = %d; global summary:", coarsenings);
- for (int k = 0; k < HistoSize; k++) {
- gclog_or_tty->print_cr(" <= %4d: %5d.", histo_limits[k], global_histo[k]);
- }
- gclog_or_tty->print_cr("Avg occ of deleted region = %6.2f.",
- (float)occ_sum/(float)coarsenings);
- }
-#endif
// Set the corresponding coarse bit.
size_t max_hrs_index = (size_t) max->hr()->hrs_index();
if (!_coarse_map.at(max_hrs_index)) {
_coarse_map.at_put(max_hrs_index, true);
_n_coarse_entries++;
-#if 0
- gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] "
- "for region [" PTR_FORMAT "...] (%d coarse entries).\n",
- hr()->bottom(),
- max->hr()->bottom(),
- _n_coarse_entries);
-#endif
+ if (G1TraceHeapRegionRememberedSet) {
+ gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] "
+ "for region [" PTR_FORMAT "...] (%d coarse entries).\n",
+ hr()->bottom(),
+ max->hr()->bottom(),
+ _n_coarse_entries);
+ }
}
// Unsplice.
@@ -883,10 +531,10 @@
// Now do the fine-grained maps.
for (size_t i = 0; i < _max_fine_entries; i++) {
- PosParPRT* cur = _fine_grain_regions[i];
- PosParPRT** prev = &_fine_grain_regions[i];
+ PerRegionTable* cur = _fine_grain_regions[i];
+ PerRegionTable** prev = &_fine_grain_regions[i];
while (cur != NULL) {
- PosParPRT* nxt = cur->next();
+ PerRegionTable* nxt = cur->next();
// If the entire region is dead, eliminate.
if (G1RSScrubVerbose) {
gclog_or_tty->print_cr(" For other region %u:",
@@ -899,7 +547,7 @@
if (G1RSScrubVerbose) {
gclog_or_tty->print_cr(" deleted via region map.");
}
- PosParPRT::free(cur);
+ PerRegionTable::free(cur);
} else {
// Do fine-grain elimination.
if (G1RSScrubVerbose) {
@@ -914,7 +562,7 @@
*prev = nxt;
cur->set_next(NULL);
_n_fine_entries--;
- PosParPRT::free(cur);
+ PerRegionTable::free(cur);
} else {
prev = cur->next_addr();
}
@@ -940,7 +588,7 @@
size_t OtherRegionsTable::occ_fine() const {
size_t sum = 0;
for (size_t i = 0; i < _max_fine_entries; i++) {
- PosParPRT* cur = _fine_grain_regions[i];
+ PerRegionTable* cur = _fine_grain_regions[i];
while (cur != NULL) {
sum += cur->occupied();
cur = cur->next();
@@ -962,13 +610,13 @@
MutexLockerEx x((Mutex*)&_m, Mutex::_no_safepoint_check_flag);
size_t sum = 0;
for (size_t i = 0; i < _max_fine_entries; i++) {
- PosParPRT* cur = _fine_grain_regions[i];
+ PerRegionTable* cur = _fine_grain_regions[i];
while (cur != NULL) {
sum += cur->mem_size();
cur = cur->next();
}
}
- sum += (sizeof(PosParPRT*) * _max_fine_entries);
+ sum += (sizeof(PerRegionTable*) * _max_fine_entries);
sum += (_coarse_map.size_in_words() * HeapWordSize);
sum += (_sparse_table.mem_size());
sum += sizeof(*this) - sizeof(_sparse_table); // Avoid double counting above.
@@ -980,7 +628,7 @@
}
size_t OtherRegionsTable::fl_mem_size() {
- return PerRegionTable::fl_mem_size() + PosParPRT::fl_mem_size();
+ return PerRegionTable::fl_mem_size();
}
void OtherRegionsTable::clear_fcc() {
@@ -992,10 +640,10 @@
void OtherRegionsTable::clear() {
MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
for (size_t i = 0; i < _max_fine_entries; i++) {
- PosParPRT* cur = _fine_grain_regions[i];
+ PerRegionTable* cur = _fine_grain_regions[i];
while (cur != NULL) {
- PosParPRT* nxt = cur->next();
- PosParPRT::free(cur);
+ PerRegionTable* nxt = cur->next();
+ PerRegionTable::free(cur);
cur = nxt;
}
_fine_grain_regions[i] = NULL;
@@ -1035,8 +683,8 @@
bool OtherRegionsTable::del_single_region_table(size_t ind,
HeapRegion* hr) {
assert(0 <= ind && ind < _max_fine_entries, "Preconditions.");
- PosParPRT** prev_addr = &_fine_grain_regions[ind];
- PosParPRT* prt = *prev_addr;
+ PerRegionTable** prev_addr = &_fine_grain_regions[ind];
+ PerRegionTable* prt = *prev_addr;
while (prt != NULL && prt->hr() != hr) {
prev_addr = prt->next_addr();
prt = prt->next();
@@ -1044,7 +692,7 @@
if (prt != NULL) {
assert(prt->hr() == hr, "Loop postcondition.");
*prev_addr = prt->next();
- PosParPRT::free(prt);
+ PerRegionTable::free(prt);
_n_fine_entries--;
return true;
} else {
@@ -1065,7 +713,7 @@
// Is this region in the coarse map?
if (_coarse_map.at(hr_ind)) return true;
- PosParPRT* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask,
+ PerRegionTable* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask,
hr);
if (prt != NULL) {
return prt->contains_reference(from);
@@ -1145,7 +793,7 @@
G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index);
gclog_or_tty->print_cr(" Card " PTR_FORMAT, card_start);
}
- // XXX
+
if (iter.n_yielded() != occupied()) {
gclog_or_tty->print_cr("Yielded disagrees with occupied:");
gclog_or_tty->print_cr(" %6d yielded (%6d coarse, %6d fine).",
@@ -1163,10 +811,6 @@
SparsePRT::cleanup_all();
}
-void HeapRegionRemSet::par_cleanup() {
- PosParPRT::par_contract_all();
-}
-
void HeapRegionRemSet::clear() {
_other_regions.clear();
assert(occupied() == 0, "Should be clear.");
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -35,7 +35,7 @@
class G1BlockOffsetSharedArray;
class HeapRegion;
class HeapRegionRemSetIterator;
-class PosParPRT;
+class PerRegionTable;
class SparsePRT;
// Essentially a wrapper around SparsePRTCleanupTask. See
@@ -79,15 +79,14 @@
size_t _n_coarse_entries;
static jint _n_coarsenings;
- PosParPRT** _fine_grain_regions;
- size_t _n_fine_entries;
+ PerRegionTable** _fine_grain_regions;
+ size_t _n_fine_entries;
-#define SAMPLE_FOR_EVICTION 1
-#if SAMPLE_FOR_EVICTION
+ // Used to sample a subset of the fine grain PRTs to determine which
+ // PRT to evict and coarsen.
size_t _fine_eviction_start;
static size_t _fine_eviction_stride;
static size_t _fine_eviction_sample_size;
-#endif
SparsePRT _sparse_table;
@@ -98,21 +97,18 @@
// Requires "prt" to be the first element of the bucket list appropriate
// for "hr". If this list contains an entry for "hr", return it,
// otherwise return "NULL".
- PosParPRT* find_region_table(size_t ind, HeapRegion* hr) const;
+ PerRegionTable* find_region_table(size_t ind, HeapRegion* hr) const;
- // Find, delete, and return a candidate PosParPRT, if any exists,
+ // Find, delete, and return a candidate PerRegionTable, if any exists,
// adding the deleted region to the coarse bitmap. Requires the caller
// to hold _m, and the fine-grain table to be full.
- PosParPRT* delete_region_table();
+ PerRegionTable* delete_region_table();
// If a PRT for "hr" is in the bucket list indicated by "ind" (which must
// be the correct index for "hr"), delete it and return true; else return
// false.
bool del_single_region_table(size_t ind, HeapRegion* hr);
- static jint _cache_probes;
- static jint _cache_hits;
-
// Indexed by thread X heap region, to minimize thread contention.
static int** _from_card_cache;
static size_t _from_card_cache_max_regions;
@@ -127,10 +123,6 @@
// sense.
void add_reference(OopOrNarrowOopStar from, int tid);
- void add_reference(OopOrNarrowOopStar from) {
- return add_reference(from, 0);
- }
-
// Removes any entries shown by the given bitmaps to contain only dead
// objects.
void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm);
@@ -233,14 +225,12 @@
static jint n_coarsenings() { return OtherRegionsTable::n_coarsenings(); }
- /* Used in the sequential case. Returns "true" iff this addition causes
- the size limit to be reached. */
+ // Used in the sequential case.
void add_reference(OopOrNarrowOopStar from) {
- _other_regions.add_reference(from);
+ _other_regions.add_reference(from, 0);
}
- /* Used in the parallel case. Returns "true" iff this addition causes
- the size limit to be reached. */
+ // Used in the parallel case.
void add_reference(OopOrNarrowOopStar from, int tid) {
_other_regions.add_reference(from, tid);
}
@@ -253,15 +243,6 @@
// entries for this region in other remsets.
void clear();
- // Forget any entries due to pointers from "from_hr".
- void clear_incoming_entry(HeapRegion* from_hr) {
- _other_regions.clear_incoming_entry(from_hr);
- }
-
-#if 0
- virtual void cleanup() = 0;
-#endif
-
// Attempt to claim the region. Returns true iff this call caused an
// atomic transition from Unclaimed to Claimed.
bool claim_iter();
@@ -290,12 +271,6 @@
// Initialize the given iterator to iterate over this rem set.
void init_iterator(HeapRegionRemSetIterator* iter) const;
-#if 0
- // Apply the "do_card" method to the start address of every card in the
- // rem set. Returns false if some application of the closure aborted.
- virtual bool card_iterate(CardClosure* iter) = 0;
-#endif
-
// The actual # of bytes this hr_remset takes up.
size_t mem_size() {
return _other_regions.mem_size()
@@ -322,10 +297,7 @@
void print() const;
// Called during a stop-world phase to perform any deferred cleanups.
- // The second version may be called by parallel threads after then finish
- // collection work.
static void cleanup();
- static void par_cleanup();
// Declare the heap size (in # of regions) to the HeapRegionRemSet(s).
// (Uses it to initialize from_card_cache).
@@ -367,7 +339,7 @@
// Local caching of HRRS fields.
const BitMap* _coarse_map;
- PosParPRT** _fine_grain_regions;
+ PerRegionTable** _fine_grain_regions;
G1BlockOffsetSharedArray* _bosa;
G1CollectedHeap* _g1h;
@@ -404,8 +376,9 @@
// Index of bucket-list we're working on.
int _fine_array_index;
+
// Per Region Table we're doing within current bucket list.
- PosParPRT* _fine_cur_prt;
+ PerRegionTable* _fine_cur_prt;
/* SparsePRT::*/ SparsePRTIter _sparse_iter;
@@ -435,12 +408,4 @@
}
};
-#if 0
-class CardClosure: public Closure {
-public:
- virtual void do_card(HeapWord* card_start) = 0;
-};
-
-#endif
-
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP
--- a/hotspot/src/share/vm/memory/dump.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/memory/dump.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -62,8 +62,8 @@
// written later, increasing the likelihood that the shared page contain
// the hash can be shared.
//
-// NOTE THAT the algorithm in StringTable::hash_string() MUST MATCH the
-// algorithm in java.lang.String.hashCode().
+// NOTE THAT we have to call java_lang_String::to_hash() to match the
+// algorithm in java.lang.String.toHash().
class StringHashCodeClosure: public OopClosure {
private:
@@ -80,7 +80,7 @@
oop obj = *p;
if (obj->klass() == SystemDictionary::String_klass() &&
java_lang_String::has_hash_field()) {
- int hash = java_lang_String::hash_string(obj);
+ int hash = java_lang_String::to_hash(obj);
obj->int_field_put(hash_offset, hash);
}
}
--- a/hotspot/src/share/vm/memory/universe.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/memory/universe.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -273,7 +273,7 @@
}
static klassOop typeArrayKlassObj(BasicType t) {
- assert((uint)t < T_VOID+1, "range check");
+ assert((uint)t < T_VOID+1, err_msg("range check for type: %s", type2name(t)));
assert(_typeArrayKlassObjs[t] != NULL, "domain check");
return _typeArrayKlassObjs[t];
}
--- a/hotspot/src/share/vm/opto/c2_globals.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -81,6 +81,13 @@
product(intx, MaxLoopPad, (OptoLoopAlignment-1), \
"Align a loop if padding size in bytes is less or equal to this value") \
\
+ product(intx, MaxVectorSize, 32, \
+ "Max vector size in bytes, " \
+ "actual size could be less depending on elements type") \
+ \
+ product(bool, AlignVector, false, \
+ "Perform vector store/load alignment in loop") \
+ \
product(intx, NumberOfLoopInstrToAlign, 4, \
"Number of first instructions in a loop to align") \
\
@@ -292,9 +299,12 @@
develop(bool, SuperWordRTDepCheck, false, \
"Enable runtime dependency checks.") \
\
- product(bool, TraceSuperWord, false, \
+ notproduct(bool, TraceSuperWord, false, \
"Trace superword transforms") \
\
+ notproduct(bool, TraceNewVectors, false, \
+ "Trace creation of Vector nodes") \
+ \
product_pd(bool, OptoBundling, \
"Generate nops to fill i-cache lines") \
\
--- a/hotspot/src/share/vm/opto/callGenerator.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/callGenerator.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -172,9 +172,11 @@
JVMState* DynamicCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
+ Compile* C = kit.C;
+ PhaseGVN& gvn = kit.gvn();
- if (kit.C->log() != NULL) {
- kit.C->log()->elem("dynamic_call bci='%d'", jvms->bci());
+ if (C->log() != NULL) {
+ C->log()->elem("dynamic_call bci='%d'", jvms->bci());
}
// Get the constant pool cache from the caller class.
@@ -190,18 +192,21 @@
size_t call_site_offset = cpcache->get_f1_offset(index);
// Load the CallSite object from the constant pool cache.
- const TypeOopPtr* cpcache_ptr = TypeOopPtr::make_from_constant(cpcache);
- Node* cpcache_adr = kit.makecon(cpcache_ptr);
- Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, cpcache_adr, call_site_offset);
- Node* call_site = kit.make_load(kit.control(), call_site_adr, TypeInstPtr::BOTTOM, T_OBJECT, Compile::AliasIdxRaw);
+ const TypeOopPtr* cpcache_type = TypeOopPtr::make_from_constant(cpcache); // returns TypeAryPtr of type T_OBJECT
+ const TypeOopPtr* call_site_type = TypeOopPtr::make_from_klass(C->env()->CallSite_klass());
+ Node* cpcache_adr = kit.makecon(cpcache_type);
+ Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, call_site_offset);
+ // The oops in the constant pool cache are not compressed; load then as raw pointers.
+ Node* call_site = kit.make_load(kit.control(), call_site_adr, call_site_type, T_ADDRESS, Compile::AliasIdxRaw);
// Load the target MethodHandle from the CallSite object.
- Node* target_mh_adr = kit.basic_plus_adr(call_site, call_site, java_lang_invoke_CallSite::target_offset_in_bytes());
- Node* target_mh = kit.make_load(kit.control(), target_mh_adr, TypeInstPtr::BOTTOM, T_OBJECT);
+ const TypeOopPtr* target_type = TypeOopPtr::make_from_klass(C->env()->MethodHandle_klass());
+ Node* target_mh_adr = kit.basic_plus_adr(call_site, java_lang_invoke_CallSite::target_offset_in_bytes());
+ Node* target_mh = kit.make_load(kit.control(), target_mh_adr, target_type, T_OBJECT);
address resolve_stub = SharedRuntime::get_resolve_opt_virtual_call_stub();
- CallStaticJavaNode *call = new (kit.C, tf()->domain()->cnt()) CallStaticJavaNode(tf(), resolve_stub, method(), kit.bci());
+ CallStaticJavaNode* call = new (C, tf()->domain()->cnt()) CallStaticJavaNode(tf(), resolve_stub, method(), kit.bci());
// invokedynamic is treated as an optimized invokevirtual.
call->set_optimized_virtual(true);
// Take extra care (in the presence of argument motion) not to trash the SP:
@@ -785,9 +790,10 @@
JVMState* PredictedDynamicCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
+ Compile* C = kit.C;
PhaseGVN& gvn = kit.gvn();
- CompileLog* log = kit.C->log();
+ CompileLog* log = C->log();
if (log != NULL) {
log->elem("predicted_dynamic_call bci='%d'", jvms->bci());
}
@@ -803,8 +809,8 @@
Node* receiver = kit.argument(0);
// Check if the MethodHandle is the expected one
- Node* cmp = gvn.transform(new(kit.C, 3) CmpPNode(receiver, predicted_mh));
- bol = gvn.transform(new(kit.C, 2) BoolNode(cmp, BoolTest::eq) );
+ Node* cmp = gvn.transform(new (C, 3) CmpPNode(receiver, predicted_mh));
+ bol = gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq) );
} else {
// Get the constant pool cache from the caller class.
ciMethod* caller_method = jvms->method();
@@ -818,22 +824,25 @@
size_t call_site_offset = cpcache->get_f1_offset(index);
// Load the CallSite object from the constant pool cache.
- const TypeOopPtr* cpcache_ptr = TypeOopPtr::make_from_constant(cpcache);
- Node* cpcache_adr = kit.makecon(cpcache_ptr);
- Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, cpcache_adr, call_site_offset);
- Node* call_site = kit.make_load(kit.control(), call_site_adr, TypeInstPtr::BOTTOM, T_OBJECT, Compile::AliasIdxRaw);
+ const TypeOopPtr* cpcache_type = TypeOopPtr::make_from_constant(cpcache); // returns TypeAryPtr of type T_OBJECT
+ const TypeOopPtr* call_site_type = TypeOopPtr::make_from_klass(C->env()->CallSite_klass());
+ Node* cpcache_adr = kit.makecon(cpcache_type);
+ Node* call_site_adr = kit.basic_plus_adr(cpcache_adr, call_site_offset);
+ // The oops in the constant pool cache are not compressed; load then as raw pointers.
+ Node* call_site = kit.make_load(kit.control(), call_site_adr, call_site_type, T_ADDRESS, Compile::AliasIdxRaw);
// Load the target MethodHandle from the CallSite object.
+ const TypeOopPtr* target_type = TypeOopPtr::make_from_klass(C->env()->MethodHandle_klass());
Node* target_adr = kit.basic_plus_adr(call_site, call_site, java_lang_invoke_CallSite::target_offset_in_bytes());
- Node* target_mh = kit.make_load(kit.control(), target_adr, TypeInstPtr::BOTTOM, T_OBJECT);
+ Node* target_mh = kit.make_load(kit.control(), target_adr, target_type, T_OBJECT);
// Check if the MethodHandle is still the same.
- Node* cmp = gvn.transform(new(kit.C, 3) CmpPNode(target_mh, predicted_mh));
- bol = gvn.transform(new(kit.C, 2) BoolNode(cmp, BoolTest::eq) );
+ Node* cmp = gvn.transform(new (C, 3) CmpPNode(target_mh, predicted_mh));
+ bol = gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::eq) );
}
IfNode* iff = kit.create_and_xform_if(kit.control(), bol, _hit_prob, COUNT_UNKNOWN);
- kit.set_control( gvn.transform(new(kit.C, 1) IfTrueNode (iff)));
- Node* slow_ctl = gvn.transform(new(kit.C, 1) IfFalseNode(iff));
+ kit.set_control( gvn.transform(new (C, 1) IfTrueNode (iff)));
+ Node* slow_ctl = gvn.transform(new (C, 1) IfFalseNode(iff));
SafePointNode* slow_map = NULL;
JVMState* slow_jvms;
@@ -882,7 +891,7 @@
// Finish the diamond.
kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
- RegionNode* region = new (kit.C, 3) RegionNode(3);
+ RegionNode* region = new (C, 3) RegionNode(3);
region->init_req(1, kit.control());
region->init_req(2, slow_map->control());
kit.set_control(gvn.transform(region));
--- a/hotspot/src/share/vm/opto/chaitin.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/chaitin.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -75,6 +75,7 @@
// Flags
if( _is_oop ) tty->print("Oop ");
if( _is_float ) tty->print("Float ");
+ if( _is_vector ) tty->print("Vector ");
if( _was_spilled1 ) tty->print("Spilled ");
if( _was_spilled2 ) tty->print("Spilled2 ");
if( _direct_conflict ) tty->print("Direct_conflict ");
@@ -479,16 +480,18 @@
// Move important info out of the live_arena to longer lasting storage.
alloc_node_regs(_names.Size());
- for( uint i=0; i < _names.Size(); i++ ) {
- if( _names[i] ) { // Live range associated with Node?
- LRG &lrg = lrgs( _names[i] );
- if( lrg.num_regs() == 1 ) {
- _node_regs[i].set1( lrg.reg() );
+ for (uint i=0; i < _names.Size(); i++) {
+ if (_names[i]) { // Live range associated with Node?
+ LRG &lrg = lrgs(_names[i]);
+ if (!lrg.alive()) {
+ _node_regs[i].set_bad();
+ } else if (lrg.num_regs() == 1) {
+ _node_regs[i].set1(lrg.reg());
} else { // Must be a register-pair
- if( !lrg._fat_proj ) { // Must be aligned adjacent register pair
+ if (!lrg._fat_proj) { // Must be aligned adjacent register pair
// Live ranges record the highest register in their mask.
// We want the low register for the AD file writer's convenience.
- _node_regs[i].set2( OptoReg::add(lrg.reg(),-1) );
+ _node_regs[i].set2( OptoReg::add(lrg.reg(),(1-lrg.num_regs())) );
} else { // Misaligned; extract 2 bits
OptoReg::Name hi = lrg.reg(); // Get hi register
lrg.Remove(hi); // Yank from mask
@@ -568,7 +571,7 @@
// Check for float-vs-int live range (used in register-pressure
// calculations)
const Type *n_type = n->bottom_type();
- if( n_type->is_floatingpoint() )
+ if (n_type->is_floatingpoint())
lrg._is_float = 1;
// Check for twice prior spilling. Once prior spilling might have
@@ -599,18 +602,28 @@
// Limit result register mask to acceptable registers
const RegMask &rm = n->out_RegMask();
lrg.AND( rm );
- // Check for bound register masks
- const RegMask &lrgmask = lrg.mask();
- if( lrgmask.is_bound1() || lrgmask.is_bound2() )
- lrg._is_bound = 1;
-
- // Check for maximum frequency value
- if( lrg._maxfreq < b->_freq )
- lrg._maxfreq = b->_freq;
int ireg = n->ideal_reg();
assert( !n->bottom_type()->isa_oop_ptr() || ireg == Op_RegP,
"oops must be in Op_RegP's" );
+
+ // Check for vector live range (only if vector register is used).
+ // On SPARC vector uses RegD which could be misaligned so it is not
+ // processes as vector in RA.
+ if (RegMask::is_vector(ireg))
+ lrg._is_vector = 1;
+ assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD,
+ "vector must be in vector registers");
+
+ // Check for bound register masks
+ const RegMask &lrgmask = lrg.mask();
+ if (lrgmask.is_bound(ireg))
+ lrg._is_bound = 1;
+
+ // Check for maximum frequency value
+ if (lrg._maxfreq < b->_freq)
+ lrg._maxfreq = b->_freq;
+
// Check for oop-iness, or long/double
// Check for multi-kill projection
switch( ireg ) {
@@ -689,7 +702,7 @@
// AND changes how we count interferences. A mis-aligned
// double can interfere with TWO aligned pairs, or effectively
// FOUR registers!
- if( rm.is_misaligned_Pair() ) {
+ if (rm.is_misaligned_pair()) {
lrg._fat_proj = 1;
lrg._is_bound = 1;
}
@@ -706,6 +719,33 @@
lrg.set_reg_pressure(1);
#endif
break;
+ case Op_VecS:
+ assert(Matcher::vector_size_supported(T_BYTE,4), "sanity");
+ assert(RegMask::num_registers(Op_VecS) == RegMask::SlotsPerVecS, "sanity");
+ lrg.set_num_regs(RegMask::SlotsPerVecS);
+ lrg.set_reg_pressure(1);
+ break;
+ case Op_VecD:
+ assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecD), "sanity");
+ assert(RegMask::num_registers(Op_VecD) == RegMask::SlotsPerVecD, "sanity");
+ assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecD), "vector should be aligned");
+ lrg.set_num_regs(RegMask::SlotsPerVecD);
+ lrg.set_reg_pressure(1);
+ break;
+ case Op_VecX:
+ assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecX), "sanity");
+ assert(RegMask::num_registers(Op_VecX) == RegMask::SlotsPerVecX, "sanity");
+ assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecX), "vector should be aligned");
+ lrg.set_num_regs(RegMask::SlotsPerVecX);
+ lrg.set_reg_pressure(1);
+ break;
+ case Op_VecY:
+ assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecY), "sanity");
+ assert(RegMask::num_registers(Op_VecY) == RegMask::SlotsPerVecY, "sanity");
+ assert(lrgmask.is_aligned_sets(RegMask::SlotsPerVecY), "vector should be aligned");
+ lrg.set_num_regs(RegMask::SlotsPerVecY);
+ lrg.set_reg_pressure(1);
+ break;
default:
ShouldNotReachHere();
}
@@ -763,24 +803,38 @@
} else {
lrg.AND( rm );
}
+
// Check for bound register masks
const RegMask &lrgmask = lrg.mask();
- if( lrgmask.is_bound1() || lrgmask.is_bound2() )
+ int kreg = n->in(k)->ideal_reg();
+ bool is_vect = RegMask::is_vector(kreg);
+ assert(n->in(k)->bottom_type()->isa_vect() == NULL ||
+ is_vect || kreg == Op_RegD,
+ "vector must be in vector registers");
+ if (lrgmask.is_bound(kreg))
lrg._is_bound = 1;
+
// If this use of a double forces a mis-aligned double,
// flag as '_fat_proj' - really flag as allowing misalignment
// AND changes how we count interferences. A mis-aligned
// double can interfere with TWO aligned pairs, or effectively
// FOUR registers!
- if( lrg.num_regs() == 2 && !lrg._fat_proj && rm.is_misaligned_Pair() ) {
+#ifdef ASSERT
+ if (is_vect) {
+ assert(lrgmask.is_aligned_sets(lrg.num_regs()), "vector should be aligned");
+ assert(!lrg._fat_proj, "sanity");
+ assert(RegMask::num_registers(kreg) == lrg.num_regs(), "sanity");
+ }
+#endif
+ if (!is_vect && lrg.num_regs() == 2 && !lrg._fat_proj && rm.is_misaligned_pair()) {
lrg._fat_proj = 1;
lrg._is_bound = 1;
}
// if the LRG is an unaligned pair, we will have to spill
// so clear the LRG's register mask if it is not already spilled
- if ( !n->is_SpillCopy() &&
- (lrg._def == NULL || lrg.is_multidef() || !lrg._def->is_SpillCopy()) &&
- lrgmask.is_misaligned_Pair()) {
+ if (!is_vect && !n->is_SpillCopy() &&
+ (lrg._def == NULL || lrg.is_multidef() || !lrg._def->is_SpillCopy()) &&
+ lrgmask.is_misaligned_pair()) {
lrg.Clear();
}
@@ -793,12 +847,14 @@
} // end for all blocks
// Final per-liverange setup
- for( uint i2=0; i2<_maxlrg; i2++ ) {
+ for (uint i2=0; i2<_maxlrg; i2++) {
LRG &lrg = lrgs(i2);
- if( lrg.num_regs() == 2 && !lrg._fat_proj )
- lrg.ClearToPairs();
+ assert(!lrg._is_vector || !lrg._fat_proj, "sanity");
+ if (lrg.num_regs() > 1 && !lrg._fat_proj) {
+ lrg.clear_to_sets();
+ }
lrg.compute_set_mask_size();
- if( lrg.not_free() ) { // Handle case where we lose from the start
+ if (lrg.not_free()) { // Handle case where we lose from the start
lrg.set_reg(OptoReg::Name(LRG::SPILL_REG));
lrg._direct_conflict = 1;
}
@@ -1104,22 +1160,17 @@
// Choose a color which is legal for him
RegMask tempmask = lrg.mask();
tempmask.AND(lrgs(copy_lrg).mask());
- OptoReg::Name reg;
- if( lrg.num_regs() == 1 ) {
- reg = tempmask.find_first_elem();
- } else {
- tempmask.ClearToPairs();
- reg = tempmask.find_first_pair();
- }
- if( OptoReg::is_valid(reg) )
+ tempmask.clear_to_sets(lrg.num_regs());
+ OptoReg::Name reg = tempmask.find_first_set(lrg.num_regs());
+ if (OptoReg::is_valid(reg))
return reg;
}
}
// If no bias info exists, just go with the register selection ordering
- if( lrg.num_regs() == 2 ) {
- // Find an aligned pair
- return OptoReg::add(lrg.mask().find_first_pair(),chunk);
+ if (lrg._is_vector || lrg.num_regs() == 2) {
+ // Find an aligned set
+ return OptoReg::add(lrg.mask().find_first_set(lrg.num_regs()),chunk);
}
// CNC - Fun hack. Alternate 1st and 2nd selection. Enables post-allocate
@@ -1149,6 +1200,7 @@
// Use a heuristic to "bias" the color choice
return bias_color(lrg, chunk);
+ assert(!lrg._is_vector, "should be not vector here" );
assert( lrg.num_regs() >= 2, "dead live ranges do not color" );
// Fat-proj case or misaligned double argument.
@@ -1238,14 +1290,16 @@
}
//assert(is_allstack == lrg->mask().is_AllStack(), "nbrs must not change AllStackedness");
// Aligned pairs need aligned masks
- if( lrg->num_regs() == 2 && !lrg->_fat_proj )
- lrg->ClearToPairs();
+ assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity");
+ if (lrg->num_regs() > 1 && !lrg->_fat_proj) {
+ lrg->clear_to_sets();
+ }
// Check if a color is available and if so pick the color
OptoReg::Name reg = choose_color( *lrg, chunk );
#ifdef SPARC
debug_only(lrg->compute_set_mask_size());
- assert(lrg->num_regs() != 2 || lrg->is_bound() || is_even(reg-1), "allocate all doubles aligned");
+ assert(lrg->num_regs() < 2 || lrg->is_bound() || is_even(reg-1), "allocate all doubles aligned");
#endif
//---------------
@@ -1277,17 +1331,16 @@
// If the live range is not bound, then we actually had some choices
// to make. In this case, the mask has more bits in it than the colors
// chosen. Restrict the mask to just what was picked.
- if( lrg->num_regs() == 1 ) { // Size 1 live range
+ int n_regs = lrg->num_regs();
+ assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity");
+ if (n_regs == 1 || !lrg->_fat_proj) {
+ assert(!lrg->_is_vector || n_regs <= RegMask::SlotsPerVecY, "sanity");
lrg->Clear(); // Clear the mask
lrg->Insert(reg); // Set regmask to match selected reg
- lrg->set_mask_size(1);
- } else if( !lrg->_fat_proj ) {
- // For pairs, also insert the low bit of the pair
- assert( lrg->num_regs() == 2, "unbound fatproj???" );
- lrg->Clear(); // Clear the mask
- lrg->Insert(reg); // Set regmask to match selected reg
- lrg->Insert(OptoReg::add(reg,-1));
- lrg->set_mask_size(2);
+ // For vectors and pairs, also insert the low bit of the pair
+ for (int i = 1; i < n_regs; i++)
+ lrg->Insert(OptoReg::add(reg,-i));
+ lrg->set_mask_size(n_regs);
} else { // Else fatproj
// mask must be equal to fatproj bits, by definition
}
@@ -1483,7 +1536,7 @@
// Check for AddP-related opcodes
if( !derived->is_Phi() ) {
- assert( derived->as_Mach()->ideal_Opcode() == Op_AddP, "" );
+ assert(derived->as_Mach()->ideal_Opcode() == Op_AddP, err_msg("but is: %s", derived->Name()));
Node *base = derived->in(AddPNode::Base);
derived_base_map[derived->_idx] = base;
return base;
@@ -1860,12 +1913,20 @@
sprintf(buf,"L%d",lidx); // No register binding yet
} else if( !lidx ) { // Special, not allocated value
strcpy(buf,"Special");
- } else if( (lrgs(lidx).num_regs() == 1)
- ? !lrgs(lidx).mask().is_bound1()
- : !lrgs(lidx).mask().is_bound2() ) {
- sprintf(buf,"L%d",lidx); // No register binding yet
- } else { // Hah! We have a bound machine register
- print_reg( lrgs(lidx).reg(), this, buf );
+ } else {
+ if (lrgs(lidx)._is_vector) {
+ if (lrgs(lidx).mask().is_bound_set(lrgs(lidx).num_regs()))
+ print_reg( lrgs(lidx).reg(), this, buf ); // a bound machine register
+ else
+ sprintf(buf,"L%d",lidx); // No register binding yet
+ } else if( (lrgs(lidx).num_regs() == 1)
+ ? lrgs(lidx).mask().is_bound1()
+ : lrgs(lidx).mask().is_bound_pair() ) {
+ // Hah! We have a bound machine register
+ print_reg( lrgs(lidx).reg(), this, buf );
+ } else {
+ sprintf(buf,"L%d",lidx); // No register binding yet
+ }
}
}
return buf+strlen(buf);
--- a/hotspot/src/share/vm/opto/chaitin.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/chaitin.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -99,8 +99,15 @@
void set_mask_size( int size ) {
assert((size == 65535) || (size == (int)_mask.Size()), "");
_mask_size = size;
- debug_only(_msize_valid=1;)
- debug_only( if( _num_regs == 2 && !_fat_proj ) _mask.VerifyPairs(); )
+#ifdef ASSERT
+ _msize_valid=1;
+ if (_is_vector) {
+ assert(!_fat_proj, "sanity");
+ _mask.verify_sets(_num_regs);
+ } else if (_num_regs == 2 && !_fat_proj) {
+ _mask.verify_pairs();
+ }
+#endif
}
void compute_set_mask_size() { set_mask_size(compute_mask_size()); }
int mask_size() const { assert( _msize_valid, "mask size not valid" );
@@ -116,7 +123,8 @@
void Set_All() { _mask.Set_All(); debug_only(_msize_valid=1); _mask_size = RegMask::CHUNK_SIZE; }
void Insert( OptoReg::Name reg ) { _mask.Insert(reg); debug_only(_msize_valid=0;) }
void Remove( OptoReg::Name reg ) { _mask.Remove(reg); debug_only(_msize_valid=0;) }
- void ClearToPairs() { _mask.ClearToPairs(); debug_only(_msize_valid=0;) }
+ void clear_to_pairs() { _mask.clear_to_pairs(); debug_only(_msize_valid=0;) }
+ void clear_to_sets() { _mask.clear_to_sets(_num_regs); debug_only(_msize_valid=0;) }
// Number of registers this live range uses when it colors
private:
@@ -150,6 +158,7 @@
uint _is_oop:1, // Live-range holds an oop
_is_float:1, // True if in float registers
+ _is_vector:1, // True if in vector registers
_was_spilled1:1, // True if prior spilling on def
_was_spilled2:1, // True if twice prior spilling on def
_is_bound:1, // live range starts life with no
--- a/hotspot/src/share/vm/opto/classes.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/classes.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -245,14 +245,12 @@
macro(XorL)
macro(Vector)
macro(AddVB)
-macro(AddVC)
macro(AddVS)
macro(AddVI)
macro(AddVL)
macro(AddVF)
macro(AddVD)
macro(SubVB)
-macro(SubVC)
macro(SubVS)
macro(SubVI)
macro(SubVL)
@@ -263,74 +261,36 @@
macro(DivVF)
macro(DivVD)
macro(LShiftVB)
-macro(LShiftVC)
macro(LShiftVS)
macro(LShiftVI)
-macro(URShiftVB)
-macro(URShiftVC)
-macro(URShiftVS)
-macro(URShiftVI)
+macro(RShiftVB)
+macro(RShiftVS)
+macro(RShiftVI)
macro(AndV)
macro(OrV)
macro(XorV)
-macro(VectorLoad)
-macro(Load16B)
-macro(Load8B)
-macro(Load4B)
-macro(Load8C)
-macro(Load4C)
-macro(Load2C)
-macro(Load8S)
-macro(Load4S)
-macro(Load2S)
-macro(Load4I)
-macro(Load2I)
-macro(Load2L)
-macro(Load4F)
-macro(Load2F)
-macro(Load2D)
-macro(VectorStore)
-macro(Store16B)
-macro(Store8B)
-macro(Store4B)
-macro(Store8C)
-macro(Store4C)
-macro(Store2C)
-macro(Store4I)
-macro(Store2I)
-macro(Store2L)
-macro(Store4F)
-macro(Store2F)
-macro(Store2D)
+macro(LoadVector)
+macro(StoreVector)
macro(Pack)
macro(PackB)
macro(PackS)
-macro(PackC)
macro(PackI)
macro(PackL)
macro(PackF)
macro(PackD)
-macro(Pack2x1B)
-macro(Pack2x2B)
-macro(Replicate16B)
-macro(Replicate8B)
-macro(Replicate4B)
-macro(Replicate8S)
-macro(Replicate4S)
-macro(Replicate2S)
-macro(Replicate8C)
-macro(Replicate4C)
-macro(Replicate2C)
-macro(Replicate4I)
-macro(Replicate2I)
-macro(Replicate2L)
-macro(Replicate4F)
-macro(Replicate2F)
-macro(Replicate2D)
+macro(Pack2L)
+macro(Pack2D)
+macro(ReplicateB)
+macro(ReplicateS)
+macro(ReplicateI)
+macro(ReplicateL)
+macro(ReplicateF)
+macro(ReplicateD)
macro(Extract)
macro(ExtractB)
+macro(ExtractUB)
+macro(ExtractC)
macro(ExtractS)
-macro(ExtractC)
macro(ExtractI)
macro(ExtractL)
macro(ExtractF)
--- a/hotspot/src/share/vm/opto/compile.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -2591,38 +2591,12 @@
}
break;
- case Op_Load16B:
- case Op_Load8B:
- case Op_Load4B:
- case Op_Load8S:
- case Op_Load4S:
- case Op_Load2S:
- case Op_Load8C:
- case Op_Load4C:
- case Op_Load2C:
- case Op_Load4I:
- case Op_Load2I:
- case Op_Load2L:
- case Op_Load4F:
- case Op_Load2F:
- case Op_Load2D:
- case Op_Store16B:
- case Op_Store8B:
- case Op_Store4B:
- case Op_Store8C:
- case Op_Store4C:
- case Op_Store2C:
- case Op_Store4I:
- case Op_Store2I:
- case Op_Store2L:
- case Op_Store4F:
- case Op_Store2F:
- case Op_Store2D:
+ case Op_LoadVector:
+ case Op_StoreVector:
break;
case Op_PackB:
case Op_PackS:
- case Op_PackC:
case Op_PackI:
case Op_PackF:
case Op_PackL:
--- a/hotspot/src/share/vm/opto/ifg.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/ifg.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -416,6 +416,7 @@
if( lrgs(lidx).mask().is_UP() &&
lrgs(lidx).mask_size() &&
!lrgs(lidx)._is_float &&
+ !lrgs(lidx)._is_vector &&
lrgs(lidx).mask().overlap(*Matcher::idealreg2regmask[Op_RegI]) )
cnt += lrgs(lidx).reg_pressure();
}
@@ -430,7 +431,7 @@
while ((lidx = elements.next()) != 0) {
if( lrgs(lidx).mask().is_UP() &&
lrgs(lidx).mask_size() &&
- lrgs(lidx)._is_float )
+ (lrgs(lidx)._is_float || lrgs(lidx)._is_vector))
cnt += lrgs(lidx).reg_pressure();
}
return cnt;
@@ -439,8 +440,8 @@
//------------------------------lower_pressure---------------------------------
// Adjust register pressure down by 1. Capture last hi-to-low transition,
static void lower_pressure( LRG *lrg, uint where, Block *b, uint *pressure, uint *hrp_index ) {
- if( lrg->mask().is_UP() && lrg->mask_size() ) {
- if( lrg->_is_float ) {
+ if (lrg->mask().is_UP() && lrg->mask_size()) {
+ if (lrg->_is_float || lrg->_is_vector) {
pressure[1] -= lrg->reg_pressure();
if( pressure[1] == (uint)FLOATPRESSURE ) {
hrp_index[1] = where;
@@ -522,8 +523,8 @@
LRG &lrg = lrgs(lidx);
lrg._area += cost;
// Compute initial register pressure
- if( lrg.mask().is_UP() && lrg.mask_size() ) {
- if( lrg._is_float ) { // Count float pressure
+ if (lrg.mask().is_UP() && lrg.mask_size()) {
+ if (lrg._is_float || lrg._is_vector) { // Count float pressure
pressure[1] += lrg.reg_pressure();
#ifdef EXACT_PRESSURE
if( pressure[1] > b->_freg_pressure )
@@ -681,13 +682,10 @@
// according to its bindings.
const RegMask &rmask = lrgs(r).mask();
if( lrgs(r).is_bound() && !(n->rematerialize()) && rmask.is_NotEmpty() ) {
- // Smear odd bits; leave only aligned pairs of bits.
- RegMask r2mask = rmask;
- r2mask.SmearToPairs();
// Check for common case
int r_size = lrgs(r).num_regs();
OptoReg::Name r_reg = (r_size == 1) ? rmask.find_first_elem() : OptoReg::Physical;
-
+ // Smear odd bits
IndexSetIterator elements(&liveout);
uint l;
while ((l = elements.next()) != 0) {
@@ -701,10 +699,15 @@
// Remove the bits from LRG 'r' from LRG 'l' so 'l' no
// longer interferes with 'r'. If 'l' requires aligned
// adjacent pairs, subtract out bit pairs.
- if( lrg.num_regs() == 2 && !lrg._fat_proj ) {
+ assert(!lrg._is_vector || !lrg._fat_proj, "sanity");
+ if (lrg.num_regs() > 1 && !lrg._fat_proj) {
+ RegMask r2mask = rmask;
+ // Leave only aligned set of bits.
+ r2mask.smear_to_sets(lrg.num_regs());
+ // It includes vector case.
lrg.SUBTRACT( r2mask );
lrg.compute_set_mask_size();
- } else if( r_size != 1 ) {
+ } else if( r_size != 1 ) { // fat proj
lrg.SUBTRACT( rmask );
lrg.compute_set_mask_size();
} else { // Common case: size 1 bound removal
@@ -763,8 +766,8 @@
// Newly live things assumed live from here to top of block
lrg._area += cost;
// Adjust register pressure
- if( lrg.mask().is_UP() && lrg.mask_size() ) {
- if( lrg._is_float ) {
+ if (lrg.mask().is_UP() && lrg.mask_size()) {
+ if (lrg._is_float || lrg._is_vector) {
pressure[1] += lrg.reg_pressure();
#ifdef EXACT_PRESSURE
if( pressure[1] > b->_freg_pressure )
--- a/hotspot/src/share/vm/opto/lcm.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/lcm.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -139,6 +139,7 @@
int iop = mach->ideal_Opcode();
switch( iop ) {
case Op_LoadB:
+ case Op_LoadUB:
case Op_LoadUS:
case Op_LoadD:
case Op_LoadF:
@@ -445,6 +446,11 @@
if( e->is_MachNullCheck() && e->in(1) == n )
continue;
+ // Schedule IV increment last.
+ if (e->is_Mach() && e->as_Mach()->ideal_Opcode() == Op_CountedLoopEnd &&
+ e->in(1)->in(1) == n && n->is_iteratively_computed())
+ continue;
+
uint n_choice = 2;
// See if this instruction is consumed by a branch. If so, then (as the
--- a/hotspot/src/share/vm/opto/library_call.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -3592,8 +3592,10 @@
}
// Bail out if length is negative.
- // ...Not needed, since the new_array will throw the right exception.
- //generate_negative_guard(length, bailout, &length);
+ // Without this the new_array would throw
+ // NegativeArraySizeException but IllegalArgumentException is what
+ // should be thrown
+ generate_negative_guard(length, bailout, &length);
if (bailout->req() > 1) {
PreserveJVMState pjvms(this);
@@ -3617,7 +3619,9 @@
// Extreme case: Arrays.copyOf((Integer[])x, 10, String[].class).
// This will fail a store-check if x contains any non-nulls.
bool disjoint_bases = true;
- bool length_never_negative = true;
+ // if start > orig_length then the length of the copy may be
+ // negative.
+ bool length_never_negative = !is_copyOfRange;
generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT,
original, start, newcopy, intcon(0), moved,
disjoint_bases, length_never_negative);
--- a/hotspot/src/share/vm/opto/loopnode.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -2751,7 +2751,8 @@
// Do not count uncommon calls
if( !n->is_CallStaticJava() || !n->as_CallStaticJava()->_name ) {
Node *iff = n->in(0)->in(0);
- if( !iff->is_If() ||
+ // No any calls for vectorized loops.
+ if( UseSuperWord || !iff->is_If() ||
(n->in(0)->Opcode() == Op_IfFalse &&
(1.0 - iff->as_If()->_prob) >= 0.01) ||
(iff->as_If()->_prob >= 0.01) )
@@ -3216,7 +3217,8 @@
case Op_ModF:
case Op_ModD:
case Op_LoadB: // Same with Loads; they can sink
- case Op_LoadUS: // during loop optimizations.
+ case Op_LoadUB: // during loop optimizations.
+ case Op_LoadUS:
case Op_LoadD:
case Op_LoadF:
case Op_LoadI:
--- a/hotspot/src/share/vm/opto/machnode.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/machnode.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -439,9 +439,9 @@
// Don't remateralize somebody with bound inputs - it stretches a
// fixed register lifetime.
uint idx = oper_input_base();
- if( req() > idx ) {
+ if (req() > idx) {
const RegMask &rm = in_RegMask(idx);
- if( rm.is_bound1() || rm.is_bound2() )
+ if (rm.is_bound(ideal_reg()))
return false;
}
--- a/hotspot/src/share/vm/opto/machnode.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/machnode.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -319,6 +319,7 @@
class MachTypeNode : public MachNode {
virtual uint size_of() const { return sizeof(*this); } // Size is bigger
public:
+ MachTypeNode( ) {}
const Type *_bottom_type;
virtual const class Type *bottom_type() const { return _bottom_type; }
@@ -370,12 +371,12 @@
//------------------------------MachConstantNode-------------------------------
// Machine node that holds a constant which is stored in the constant table.
-class MachConstantNode : public MachNode {
+class MachConstantNode : public MachTypeNode {
protected:
Compile::Constant _constant; // This node's constant.
public:
- MachConstantNode() : MachNode() {
+ MachConstantNode() : MachTypeNode() {
init_class_id(Class_MachConstant);
}
--- a/hotspot/src/share/vm/opto/matcher.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/matcher.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -35,6 +35,7 @@
#include "opto/rootnode.hpp"
#include "opto/runtime.hpp"
#include "opto/type.hpp"
+#include "opto/vectornode.hpp"
#include "runtime/atomic.hpp"
#include "runtime/os.hpp"
#ifdef TARGET_ARCH_MODEL_x86_32
@@ -58,18 +59,6 @@
OptoReg::Name OptoReg::c_frame_pointer;
-
-
-const int Matcher::base2reg[Type::lastype] = {
- Node::NotAMachineReg,0,0, Op_RegI, Op_RegL, 0, Op_RegN,
- Node::NotAMachineReg, Node::NotAMachineReg, /* tuple, array */
- Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, Op_RegP, /* the pointers */
- 0, 0/*abio*/,
- Op_RegP /* Return address */, 0, /* the memories */
- Op_RegF, Op_RegF, Op_RegF, Op_RegD, Op_RegD, Op_RegD,
- 0 /*bottom*/
-};
-
const RegMask *Matcher::idealreg2regmask[_last_machine_leaf];
RegMask Matcher::mreg2regmask[_last_Mach_Reg];
RegMask Matcher::STACK_ONLY_mask;
@@ -107,6 +96,10 @@
idealreg2spillmask [Op_RegF] = NULL;
idealreg2spillmask [Op_RegD] = NULL;
idealreg2spillmask [Op_RegP] = NULL;
+ idealreg2spillmask [Op_VecS] = NULL;
+ idealreg2spillmask [Op_VecD] = NULL;
+ idealreg2spillmask [Op_VecX] = NULL;
+ idealreg2spillmask [Op_VecY] = NULL;
idealreg2debugmask [Op_RegI] = NULL;
idealreg2debugmask [Op_RegN] = NULL;
@@ -114,6 +107,10 @@
idealreg2debugmask [Op_RegF] = NULL;
idealreg2debugmask [Op_RegD] = NULL;
idealreg2debugmask [Op_RegP] = NULL;
+ idealreg2debugmask [Op_VecS] = NULL;
+ idealreg2debugmask [Op_VecD] = NULL;
+ idealreg2debugmask [Op_VecX] = NULL;
+ idealreg2debugmask [Op_VecY] = NULL;
idealreg2mhdebugmask[Op_RegI] = NULL;
idealreg2mhdebugmask[Op_RegN] = NULL;
@@ -121,6 +118,10 @@
idealreg2mhdebugmask[Op_RegF] = NULL;
idealreg2mhdebugmask[Op_RegD] = NULL;
idealreg2mhdebugmask[Op_RegP] = NULL;
+ idealreg2mhdebugmask[Op_VecS] = NULL;
+ idealreg2mhdebugmask[Op_VecD] = NULL;
+ idealreg2mhdebugmask[Op_VecX] = NULL;
+ idealreg2mhdebugmask[Op_VecY] = NULL;
debug_only(_mem_node = NULL;) // Ideal memory node consumed by mach node
}
@@ -134,7 +135,7 @@
warped = OptoReg::add(warped, C->out_preserve_stack_slots());
if( warped >= _in_arg_limit )
_in_arg_limit = OptoReg::add(warped, 1); // Bump max stack slot seen
- if (!RegMask::can_represent(warped)) {
+ if (!RegMask::can_represent_arg(warped)) {
// the compiler cannot represent this method's calling sequence
C->record_method_not_compilable_all_tiers("unsupported incoming calling sequence");
return OptoReg::Bad;
@@ -302,7 +303,7 @@
_out_arg_limit = OptoReg::add(_new_SP, C->out_preserve_stack_slots());
assert( is_even(_out_arg_limit), "out_preserve must be even" );
- if (!RegMask::can_represent(OptoReg::add(_out_arg_limit,-1))) {
+ if (!RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1))) {
// the compiler cannot represent this method's calling sequence
C->record_method_not_compilable("must be able to represent all call arguments in reg mask");
}
@@ -428,7 +429,7 @@
void Matcher::init_first_stack_mask() {
// Allocate storage for spill masks as masks for the appropriate load type.
- RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * 3*6);
+ RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * (3*6+4));
idealreg2spillmask [Op_RegN] = &rms[0];
idealreg2spillmask [Op_RegI] = &rms[1];
@@ -451,6 +452,11 @@
idealreg2mhdebugmask[Op_RegD] = &rms[16];
idealreg2mhdebugmask[Op_RegP] = &rms[17];
+ idealreg2spillmask [Op_VecS] = &rms[18];
+ idealreg2spillmask [Op_VecD] = &rms[19];
+ idealreg2spillmask [Op_VecX] = &rms[20];
+ idealreg2spillmask [Op_VecY] = &rms[21];
+
OptoReg::Name i;
// At first, start with the empty mask
@@ -462,7 +468,7 @@
C->FIRST_STACK_mask().Insert(i);
// Add in all bits past the outgoing argument area
- guarantee(RegMask::can_represent(OptoReg::add(_out_arg_limit,-1)),
+ guarantee(RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1)),
"must be able to represent all call arguments in reg mask");
init = _out_arg_limit;
for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1))
@@ -472,21 +478,48 @@
C->FIRST_STACK_mask().set_AllStack();
// Make spill masks. Registers for their class, plus FIRST_STACK_mask.
+ RegMask aligned_stack_mask = C->FIRST_STACK_mask();
+ // Keep spill masks aligned.
+ aligned_stack_mask.clear_to_pairs();
+ assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+
+ *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP];
#ifdef _LP64
*idealreg2spillmask[Op_RegN] = *idealreg2regmask[Op_RegN];
idealreg2spillmask[Op_RegN]->OR(C->FIRST_STACK_mask());
+ idealreg2spillmask[Op_RegP]->OR(aligned_stack_mask);
+#else
+ idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask());
#endif
*idealreg2spillmask[Op_RegI] = *idealreg2regmask[Op_RegI];
idealreg2spillmask[Op_RegI]->OR(C->FIRST_STACK_mask());
*idealreg2spillmask[Op_RegL] = *idealreg2regmask[Op_RegL];
- idealreg2spillmask[Op_RegL]->OR(C->FIRST_STACK_mask());
+ idealreg2spillmask[Op_RegL]->OR(aligned_stack_mask);
*idealreg2spillmask[Op_RegF] = *idealreg2regmask[Op_RegF];
idealreg2spillmask[Op_RegF]->OR(C->FIRST_STACK_mask());
*idealreg2spillmask[Op_RegD] = *idealreg2regmask[Op_RegD];
- idealreg2spillmask[Op_RegD]->OR(C->FIRST_STACK_mask());
- *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP];
- idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask());
+ idealreg2spillmask[Op_RegD]->OR(aligned_stack_mask);
+ if (Matcher::vector_size_supported(T_BYTE,4)) {
+ *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS];
+ idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask());
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,2)) {
+ *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD];
+ idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask);
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,4)) {
+ aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX);
+ assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+ *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX];
+ idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask);
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,8)) {
+ aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY);
+ assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+ *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY];
+ idealreg2spillmask[Op_VecY]->OR(aligned_stack_mask);
+ }
if (UseFPUForSpilling) {
// This mask logic assumes that the spill operations are
// symmetric and that the registers involved are the same size.
@@ -807,6 +840,25 @@
idealreg2regmask[Op_RegF] = &spillF->out_RegMask();
idealreg2regmask[Op_RegD] = &spillD->out_RegMask();
idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
+
+ // Vector regmasks.
+ if (Matcher::vector_size_supported(T_BYTE,4)) {
+ TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
+ MachNode *spillVectS = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
+ idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,2)) {
+ MachNode *spillVectD = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
+ idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask();
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,4)) {
+ MachNode *spillVectX = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
+ idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask();
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,8)) {
+ MachNode *spillVectY = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
+ idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask();
+ }
}
#ifdef ASSERT
@@ -1063,7 +1115,7 @@
// that is killed by the call.
if( warped >= out_arg_limit_per_call )
out_arg_limit_per_call = OptoReg::add(warped,1);
- if (!RegMask::can_represent(warped)) {
+ if (!RegMask::can_represent_arg(warped)) {
C->record_method_not_compilable_all_tiers("unsupported calling sequence");
return OptoReg::Bad;
}
@@ -1251,7 +1303,7 @@
// this killed area.
uint r_cnt = mcall->tf()->range()->cnt();
MachProjNode *proj = new (C, 1) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
- if (!RegMask::can_represent(OptoReg::Name(out_arg_limit_per_call-1))) {
+ if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) {
C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence");
} else {
for (int i = begin_out_arg_area; i < out_arg_limit_per_call; i++)
--- a/hotspot/src/share/vm/opto/matcher.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/matcher.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -250,10 +250,21 @@
static const bool convL2FSupported(void);
// Vector width in bytes
- static const uint vector_width_in_bytes(void);
+ static const int vector_width_in_bytes(BasicType bt);
+
+ // Limits on vector size (number of elements).
+ static const int max_vector_size(const BasicType bt);
+ static const int min_vector_size(const BasicType bt);
+ static const bool vector_size_supported(const BasicType bt, int size) {
+ return (Matcher::max_vector_size(bt) >= size &&
+ Matcher::min_vector_size(bt) <= size);
+ }
// Vector ideal reg
- static const uint vector_ideal_reg(void);
+ static const int vector_ideal_reg(int len);
+
+ // CPU supports misaligned vectors store/load.
+ static const bool misaligned_vectors_ok();
// Used to determine a "low complexity" 64-bit constant. (Zero is simple.)
// The standard of comparison is one (StoreL ConL) vs. two (StoreI ConI).
--- a/hotspot/src/share/vm/opto/memnode.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/memnode.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -1543,6 +1543,7 @@
// had an original form like p1:(AddP x x (LShiftL quux 3)), where the
// expression (LShiftL quux 3) independently optimized to the constant 8.
if ((t->isa_int() == NULL) && (t->isa_long() == NULL)
+ && (_type->isa_vect() == NULL)
&& Opcode() != Op_LoadKlass && Opcode() != Op_LoadNKlass) {
// t might actually be lower than _type, if _type is a unique
// concrete subclass of abstract class t.
--- a/hotspot/src/share/vm/opto/mulnode.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/mulnode.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -41,7 +41,9 @@
class MulNode : public Node {
virtual uint hash() const;
public:
- MulNode( Node *in1, Node *in2 ): Node(0,in1,in2) {}
+ MulNode( Node *in1, Node *in2 ): Node(0,in1,in2) {
+ init_class_id(Class_Mul);
+ }
// Handle algebraic identities here. If we have an identity, return the Node
// we are equivalent to. We look for "add of zero" as an identity.
--- a/hotspot/src/share/vm/opto/node.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/node.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -1576,6 +1576,9 @@
} else {
tty->print("no type");
}
+ } else if (t->isa_vect() && this->is_MachSpillCopy()) {
+ // Dump MachSpillcopy vector type.
+ t->dump();
}
if (is_new) {
debug_only(dump_orig(debug_orig()));
--- a/hotspot/src/share/vm/opto/node.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/node.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -100,6 +100,7 @@
class MemBarStoreStoreNode;
class MemNode;
class MergeMemNode;
+class MulNode;
class MultiNode;
class MultiBranchNode;
class NeverBranchNode;
@@ -133,8 +134,8 @@
class TypeNode;
class UnlockNode;
class VectorNode;
-class VectorLoadNode;
-class VectorStoreNode;
+class LoadVectorNode;
+class StoreVectorNode;
class VectorSet;
typedef void (*NFunc)(Node&,void*);
extern "C" {
@@ -609,9 +610,9 @@
DEFINE_CLASS_ID(Mem, Node, 4)
DEFINE_CLASS_ID(Load, Mem, 0)
- DEFINE_CLASS_ID(VectorLoad, Load, 0)
+ DEFINE_CLASS_ID(LoadVector, Load, 0)
DEFINE_CLASS_ID(Store, Mem, 1)
- DEFINE_CLASS_ID(VectorStore, Store, 0)
+ DEFINE_CLASS_ID(StoreVector, Store, 0)
DEFINE_CLASS_ID(LoadStore, Mem, 2)
DEFINE_CLASS_ID(Region, Node, 5)
@@ -629,8 +630,9 @@
DEFINE_CLASS_ID(AddP, Node, 9)
DEFINE_CLASS_ID(BoxLock, Node, 10)
DEFINE_CLASS_ID(Add, Node, 11)
- DEFINE_CLASS_ID(Vector, Node, 12)
- DEFINE_CLASS_ID(ClearArray, Node, 13)
+ DEFINE_CLASS_ID(Mul, Node, 12)
+ DEFINE_CLASS_ID(Vector, Node, 13)
+ DEFINE_CLASS_ID(ClearArray, Node, 14)
_max_classes = ClassMask_ClearArray
};
@@ -752,6 +754,7 @@
DEFINE_CLASS_QUERY(MemBar)
DEFINE_CLASS_QUERY(MemBarStoreStore)
DEFINE_CLASS_QUERY(MergeMem)
+ DEFINE_CLASS_QUERY(Mul)
DEFINE_CLASS_QUERY(Multi)
DEFINE_CLASS_QUERY(MultiBranch)
DEFINE_CLASS_QUERY(Parm)
@@ -767,8 +770,8 @@
DEFINE_CLASS_QUERY(Sub)
DEFINE_CLASS_QUERY(Type)
DEFINE_CLASS_QUERY(Vector)
- DEFINE_CLASS_QUERY(VectorLoad)
- DEFINE_CLASS_QUERY(VectorStore)
+ DEFINE_CLASS_QUERY(LoadVector)
+ DEFINE_CLASS_QUERY(StoreVector)
DEFINE_CLASS_QUERY(Unlock)
#undef DEFINE_CLASS_QUERY
--- a/hotspot/src/share/vm/opto/opcodes.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/opcodes.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -38,6 +38,10 @@
"RegD",
"RegL",
"RegFlags",
+ "VecS",
+ "VecD",
+ "VecX",
+ "VecY",
"_last_machine_leaf",
#include "classes.hpp"
"_last_class_name",
--- a/hotspot/src/share/vm/opto/opcodes.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/opcodes.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -36,6 +36,10 @@
macro(RegF) // Machine float register
macro(RegD) // Machine double register
macro(RegL) // Machine long register
+ macro(VecS) // Machine vectors register
+ macro(VecD) // Machine vectord register
+ macro(VecX) // Machine vectorx register
+ macro(VecY) // Machine vectory register
macro(RegFlags) // Machine flags register
_last_machine_leaf, // Split between regular opcodes and machine
#include "classes.hpp"
--- a/hotspot/src/share/vm/opto/postaloc.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/postaloc.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -27,13 +27,15 @@
#include "opto/chaitin.hpp"
#include "opto/machnode.hpp"
-// see if this register kind does not requires two registers
-static bool is_single_register(uint x) {
-#ifdef _LP64
- return (x != Op_RegD && x != Op_RegL && x != Op_RegP);
-#else
- return (x != Op_RegD && x != Op_RegL);
-#endif
+// See if this register (or pairs, or vector) already contains the value.
+static bool register_contains_value(Node* val, OptoReg::Name reg, int n_regs,
+ Node_List& value) {
+ for (int i = 0; i < n_regs; i++) {
+ OptoReg::Name nreg = OptoReg::add(reg,-i);
+ if (value[nreg] != val)
+ return false;
+ }
+ return true;
}
//---------------------------may_be_copy_of_callee-----------------------------
@@ -167,9 +169,11 @@
const RegMask &use_mask = n->in_RegMask(idx);
bool can_use = ( RegMask::can_represent(def_reg) ? (use_mask.Member(def_reg) != 0)
: (use_mask.is_AllStack() != 0));
- // Check for a copy to or from a misaligned pair.
- can_use = can_use && !use_mask.is_misaligned_Pair() && !def_lrg.mask().is_misaligned_Pair();
-
+ if (!RegMask::is_vector(def->ideal_reg())) {
+ // Check for a copy to or from a misaligned pair.
+ // It is workaround for a sparc with misaligned pairs.
+ can_use = can_use && !use_mask.is_misaligned_pair() && !def_lrg.mask().is_misaligned_pair();
+ }
if (!can_use)
return 0;
@@ -263,18 +267,16 @@
val = skip_copies(n->in(k));
}
- if( val == x ) return blk_adjust; // No progress?
+ if (val == x) return blk_adjust; // No progress?
- bool single = is_single_register(val->ideal_reg());
+ int n_regs = RegMask::num_registers(val->ideal_reg());
uint val_idx = n2lidx(val);
OptoReg::Name val_reg = lrgs(val_idx).reg();
// See if it happens to already be in the correct register!
// (either Phi's direct register, or the common case of the name
// never-clobbered original-def register)
- if( value[val_reg] == val &&
- // Doubles check both halves
- ( single || value[val_reg-1] == val ) ) {
+ if (register_contains_value(val, val_reg, n_regs, value)) {
blk_adjust += use_prior_register(n,k,regnd[val_reg],current_block,value,regnd);
if( n->in(k) == regnd[val_reg] ) // Success! Quit trying
return blk_adjust;
@@ -306,9 +308,10 @@
}
Node *vv = value[reg];
- if( !single ) { // Doubles check for aligned-adjacent pair
- if( (reg&1)==0 ) continue; // Wrong half of a pair
- if( vv != value[reg-1] ) continue; // Not a complete pair
+ if (n_regs > 1) { // Doubles and vectors check for aligned-adjacent set
+ uint last = (n_regs-1); // Looking for the last part of a set
+ if ((reg&last) != last) continue; // Wrong part of a set
+ if (!register_contains_value(vv, reg, n_regs, value)) continue; // Different value
}
if( vv == val || // Got a direct hit?
(t && vv && vv->bottom_type() == t && vv->is_Mach() &&
@@ -526,8 +529,9 @@
if( pidx ) {
value.map(preg,phi);
regnd.map(preg,phi);
- OptoReg::Name preg_lo = OptoReg::add(preg,-1);
- if( !is_single_register(phi->ideal_reg()) ) {
+ int n_regs = RegMask::num_registers(phi->ideal_reg());
+ for (int l = 1; l < n_regs; l++) {
+ OptoReg::Name preg_lo = OptoReg::add(preg,-l);
value.map(preg_lo,phi);
regnd.map(preg_lo,phi);
}
@@ -568,13 +572,16 @@
value.map(ureg,valdef); // record improved reaching-def info
regnd.map(ureg, def);
// Record other half of doubles
- OptoReg::Name ureg_lo = OptoReg::add(ureg,-1);
- if( !is_single_register(def->ideal_reg()) &&
- ( !RegMask::can_represent(ureg_lo) ||
- lrgs(useidx).mask().Member(ureg_lo) ) && // Nearly always adjacent
- !value[ureg_lo] ) {
- value.map(ureg_lo,valdef); // record improved reaching-def info
- regnd.map(ureg_lo, def);
+ uint def_ideal_reg = def->ideal_reg();
+ int n_regs = RegMask::num_registers(def_ideal_reg);
+ for (int l = 1; l < n_regs; l++) {
+ OptoReg::Name ureg_lo = OptoReg::add(ureg,-l);
+ if (!value[ureg_lo] &&
+ (!RegMask::can_represent(ureg_lo) ||
+ lrgs(useidx).mask().Member(ureg_lo))) { // Nearly always adjacent
+ value.map(ureg_lo,valdef); // record improved reaching-def info
+ regnd.map(ureg_lo, def);
+ }
}
}
}
@@ -607,7 +614,8 @@
}
uint n_ideal_reg = n->ideal_reg();
- if( is_single_register(n_ideal_reg) ) {
+ int n_regs = RegMask::num_registers(n_ideal_reg);
+ if (n_regs == 1) {
// If Node 'n' does not change the value mapped by the register,
// then 'n' is a useless copy. Do not update the register->node
// mapping so 'n' will go dead.
@@ -625,6 +633,25 @@
assert( n->is_Copy(), "" );
j -= replace_and_yank_if_dead(n, nreg, b, value, regnd);
}
+ } else if (RegMask::is_vector(n_ideal_reg)) {
+ // If Node 'n' does not change the value mapped by the register,
+ // then 'n' is a useless copy. Do not update the register->node
+ // mapping so 'n' will go dead.
+ if (!register_contains_value(val, nreg, n_regs, value)) {
+ // Update the mapping: record new Node defined by the register
+ regnd.map(nreg,n);
+ // Update mapping for defined *value*, which is the defined
+ // Node after skipping all copies.
+ value.map(nreg,val);
+ for (int l = 1; l < n_regs; l++) {
+ OptoReg::Name nreg_lo = OptoReg::add(nreg,-l);
+ regnd.map(nreg_lo, n );
+ value.map(nreg_lo,val);
+ }
+ } else if (n->is_Copy()) {
+ // Note: vector can't be constant and can't be copy of calee.
+ j -= replace_and_yank_if_dead(n, nreg, b, value, regnd);
+ }
} else {
// If the value occupies a register pair, record same info
// in both registers.
--- a/hotspot/src/share/vm/opto/reg_split.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/reg_split.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -74,12 +74,13 @@
const RegMask *w_i_mask = w_mask->overlap( *i_mask ) ? w_mask : i_mask;
const RegMask *w_o_mask;
+ int num_regs = RegMask::num_registers(ireg);
+ bool is_vect = RegMask::is_vector(ireg);
if( w_mask->overlap( *o_mask ) && // Overlap AND
- ((ireg != Op_RegL && ireg != Op_RegD // Single use or aligned
-#ifdef _LP64
- && ireg != Op_RegP
-#endif
- ) || o_mask->is_aligned_Pairs()) ) {
+ ((num_regs == 1) // Single use or aligned
+ || is_vect // or vector
+ || !is_vect && o_mask->is_aligned_pairs()) ) {
+ assert(!is_vect || o_mask->is_aligned_sets(num_regs), "vectors are aligned");
// Don't come here for mis-aligned doubles
w_o_mask = w_mask;
} else { // wide ideal mask does not overlap with o_mask
@@ -400,15 +401,17 @@
// CNC - Turned off 7/8/99, causes too much spilling
// if( lrg->_is_bound ) return false;
+ // Use float pressure numbers for vectors.
+ bool is_float_or_vector = lrg->_is_float || lrg->_is_vector;
// Not yet reached the high-pressure cutoff point, so low pressure
- uint hrp_idx = lrg->_is_float ? b->_fhrp_index : b->_ihrp_index;
+ uint hrp_idx = is_float_or_vector ? b->_fhrp_index : b->_ihrp_index;
if( insidx < hrp_idx ) return false;
// Register pressure for the block as a whole depends on reg class
- int block_pres = lrg->_is_float ? b->_freg_pressure : b->_reg_pressure;
+ int block_pres = is_float_or_vector ? b->_freg_pressure : b->_reg_pressure;
// Bound live ranges will split at the binding points first;
// Intermediate splits should assume the live range's register set
// got "freed up" and that num_regs will become INT_PRESSURE.
- int bound_pres = lrg->_is_float ? FLOATPRESSURE : INTPRESSURE;
+ int bound_pres = is_float_or_vector ? FLOATPRESSURE : INTPRESSURE;
// Effective register pressure limit.
int lrg_pres = (lrg->get_invalid_mask_size() > lrg->num_regs())
? (lrg->get_invalid_mask_size() >> (lrg->num_regs()-1)) : bound_pres;
@@ -794,12 +797,15 @@
if( i < n->req() ) break;
insert_point--;
}
+ uint orig_eidx = b->end_idx();
maxlrg = split_DEF( n1, b, insert_point, maxlrg, Reachblock, debug_defs, splits, slidx);
// If it wasn't split bail
if (!maxlrg) {
return 0;
}
- insidx++;
+ // Spill of NULL check mem op goes into the following block.
+ if (b->end_idx() > orig_eidx)
+ insidx++;
}
// This is a new DEF, so update UP
UPblock[slidx] = false;
@@ -960,7 +966,7 @@
// Grab register mask info
const RegMask &dmask = def->out_RegMask();
const RegMask &umask = n->in_RegMask(inpidx);
-
+ bool is_vect = RegMask::is_vector(def->ideal_reg());
assert(inpidx < oopoff, "cannot use-split oop map info");
bool dup = UPblock[slidx];
@@ -972,7 +978,7 @@
if( !umask.is_AllStack() &&
(int)umask.Size() <= lrgs(useidx).num_regs() &&
(!def->rematerialize() ||
- umask.is_misaligned_Pair())) {
+ !is_vect && umask.is_misaligned_pair())) {
// These need a Split regardless of overlap or pressure
// SPLIT - NO DEF - NO CISC SPILL
maxlrg = split_USE(def,b,n,inpidx,maxlrg,dup,false, splits,slidx);
@@ -1123,10 +1129,12 @@
// Grab UP info for DEF
const RegMask &dmask = n->out_RegMask();
bool defup = dmask.is_UP();
+ int ireg = n->ideal_reg();
+ bool is_vect = RegMask::is_vector(ireg);
// Only split at Def if this is a HRP block or bound (and spilled once)
if( !n->rematerialize() &&
- (((dmask.is_bound1() || dmask.is_bound2() || dmask.is_misaligned_Pair()) &&
- (deflrg._direct_conflict || deflrg._must_spill)) ||
+ (((dmask.is_bound(ireg) || !is_vect && dmask.is_misaligned_pair()) &&
+ (deflrg._direct_conflict || deflrg._must_spill)) ||
// Check for LRG being up in a register and we are inside a high
// pressure area. Spill it down immediately.
(defup && is_high_pressure(b,&deflrg,insidx))) ) {
--- a/hotspot/src/share/vm/opto/regmask.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/regmask.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -129,11 +129,34 @@
0
);
+//=============================================================================
+bool RegMask::is_vector(uint ireg) {
+ return (ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY);
+}
+
+int RegMask::num_registers(uint ireg) {
+ switch(ireg) {
+ case Op_VecY:
+ return 8;
+ case Op_VecX:
+ return 4;
+ case Op_VecD:
+ case Op_RegD:
+ case Op_RegL:
+#ifdef _LP64
+ case Op_RegP:
+#endif
+ return 2;
+ }
+ // Op_VecS and the rest ideal registers.
+ return 1;
+}
+
//------------------------------find_first_pair--------------------------------
// Find the lowest-numbered register pair in the mask. Return the
// HIGHEST register number in the pair, or BAD if no pairs.
OptoReg::Name RegMask::find_first_pair() const {
- VerifyPairs();
+ verify_pairs();
for( int i = 0; i < RM_SIZE; i++ ) {
if( _A[i] ) { // Found some bits
int bit = _A[i] & -_A[i]; // Extract low bit
@@ -146,30 +169,30 @@
//------------------------------ClearToPairs-----------------------------------
// Clear out partial bits; leave only bit pairs
-void RegMask::ClearToPairs() {
+void RegMask::clear_to_pairs() {
for( int i = 0; i < RM_SIZE; i++ ) {
int bits = _A[i];
bits &= ((bits & 0x55555555)<<1); // 1 hi-bit set for each pair
bits |= (bits>>1); // Smear 1 hi-bit into a pair
_A[i] = bits;
}
- VerifyPairs();
+ verify_pairs();
}
//------------------------------SmearToPairs-----------------------------------
// Smear out partial bits; leave only bit pairs
-void RegMask::SmearToPairs() {
+void RegMask::smear_to_pairs() {
for( int i = 0; i < RM_SIZE; i++ ) {
int bits = _A[i];
bits |= ((bits & 0x55555555)<<1); // Smear lo bit hi per pair
bits |= ((bits & 0xAAAAAAAA)>>1); // Smear hi bit lo per pair
_A[i] = bits;
}
- VerifyPairs();
+ verify_pairs();
}
//------------------------------is_aligned_pairs-------------------------------
-bool RegMask::is_aligned_Pairs() const {
+bool RegMask::is_aligned_pairs() const {
// Assert that the register mask contains only bit pairs.
for( int i = 0; i < RM_SIZE; i++ ) {
int bits = _A[i];
@@ -204,7 +227,7 @@
//------------------------------is_bound2--------------------------------------
// Return TRUE if the mask contains an adjacent pair of bits and no other bits.
-int RegMask::is_bound2() const {
+int RegMask::is_bound_pair() const {
if( is_AllStack() ) return false;
int bit = -1; // Set to hold the one bit allowed
@@ -226,6 +249,132 @@
return true;
}
+static int low_bits[3] = { 0x55555555, 0x11111111, 0x01010101 };
+//------------------------------find_first_set---------------------------------
+// Find the lowest-numbered register set in the mask. Return the
+// HIGHEST register number in the set, or BAD if no sets.
+// Works also for size 1.
+OptoReg::Name RegMask::find_first_set(int size) const {
+ verify_sets(size);
+ for (int i = 0; i < RM_SIZE; i++) {
+ if (_A[i]) { // Found some bits
+ int bit = _A[i] & -_A[i]; // Extract low bit
+ // Convert to bit number, return hi bit in pair
+ return OptoReg::Name((i<<_LogWordBits)+find_lowest_bit(bit)+(size-1));
+ }
+ }
+ return OptoReg::Bad;
+}
+
+//------------------------------clear_to_sets----------------------------------
+// Clear out partial bits; leave only aligned adjacent bit pairs
+void RegMask::clear_to_sets(int size) {
+ if (size == 1) return;
+ assert(2 <= size && size <= 8, "update low bits table");
+ assert(is_power_of_2(size), "sanity");
+ int low_bits_mask = low_bits[size>>2];
+ for (int i = 0; i < RM_SIZE; i++) {
+ int bits = _A[i];
+ int sets = (bits & low_bits_mask);
+ for (int j = 1; j < size; j++) {
+ sets = (bits & (sets<<1)); // filter bits which produce whole sets
+ }
+ sets |= (sets>>1); // Smear 1 hi-bit into a set
+ if (size > 2) {
+ sets |= (sets>>2); // Smear 2 hi-bits into a set
+ if (size > 4) {
+ sets |= (sets>>4); // Smear 4 hi-bits into a set
+ }
+ }
+ _A[i] = sets;
+ }
+ verify_sets(size);
+}
+
+//------------------------------smear_to_sets----------------------------------
+// Smear out partial bits to aligned adjacent bit sets
+void RegMask::smear_to_sets(int size) {
+ if (size == 1) return;
+ assert(2 <= size && size <= 8, "update low bits table");
+ assert(is_power_of_2(size), "sanity");
+ int low_bits_mask = low_bits[size>>2];
+ for (int i = 0; i < RM_SIZE; i++) {
+ int bits = _A[i];
+ int sets = 0;
+ for (int j = 0; j < size; j++) {
+ sets |= (bits & low_bits_mask); // collect partial bits
+ bits = bits>>1;
+ }
+ sets |= (sets<<1); // Smear 1 lo-bit into a set
+ if (size > 2) {
+ sets |= (sets<<2); // Smear 2 lo-bits into a set
+ if (size > 4) {
+ sets |= (sets<<4); // Smear 4 lo-bits into a set
+ }
+ }
+ _A[i] = sets;
+ }
+ verify_sets(size);
+}
+
+//------------------------------is_aligned_set--------------------------------
+bool RegMask::is_aligned_sets(int size) const {
+ if (size == 1) return true;
+ assert(2 <= size && size <= 8, "update low bits table");
+ assert(is_power_of_2(size), "sanity");
+ int low_bits_mask = low_bits[size>>2];
+ // Assert that the register mask contains only bit sets.
+ for (int i = 0; i < RM_SIZE; i++) {
+ int bits = _A[i];
+ while (bits) { // Check bits for pairing
+ int bit = bits & -bits; // Extract low bit
+ // Low bit is not odd means its mis-aligned.
+ if ((bit & low_bits_mask) == 0) return false;
+ // Do extra work since (bit << size) may overflow.
+ int hi_bit = bit << (size-1); // high bit
+ int set = hi_bit + ((hi_bit-1) & ~(bit-1));
+ // Check for aligned adjacent bits in this set
+ if ((bits & set) != set) return false;
+ bits -= set; // Remove this set
+ }
+ }
+ return true;
+}
+
+//------------------------------is_bound_set-----------------------------------
+// Return TRUE if the mask contains one adjacent set of bits and no other bits.
+// Works also for size 1.
+int RegMask::is_bound_set(int size) const {
+ if( is_AllStack() ) return false;
+ assert(1 <= size && size <= 8, "update low bits table");
+ int bit = -1; // Set to hold the one bit allowed
+ for (int i = 0; i < RM_SIZE; i++) {
+ if (_A[i] ) { // Found some bits
+ if (bit != -1)
+ return false; // Already had bits, so fail
+ bit = _A[i] & -_A[i]; // Extract 1 bit from mask
+ int hi_bit = bit << (size-1); // high bit
+ if (hi_bit != 0) { // Bit set stays in same word?
+ int set = hi_bit + ((hi_bit-1) & ~(bit-1));
+ if (set != _A[i])
+ return false; // Require adjacent bit set and no more bits
+ } else { // Else its a split-set case
+ if (((-1) & ~(bit-1)) != _A[i])
+ return false; // Found many bits, so fail
+ i++; // Skip iteration forward and check high part
+ assert(size <= 8, "update next code");
+ // The lower 24 bits should be 0 since it is split case and size <= 8.
+ int set = bit>>24;
+ set = set & -set; // Remove sign extension.
+ set = (((set << size) - 1) >> 8);
+ if (_A[i] != set) return false; // Require 1 lo bit in next word
+ }
+ }
+ }
+ // True for both the empty mask and for a bit set
+ return true;
+}
+
//------------------------------is_UP------------------------------------------
// UP means register only, Register plus stack, or stack only is DOWN
bool RegMask::is_UP() const {
--- a/hotspot/src/share/vm/opto/regmask.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/regmask.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -113,7 +113,11 @@
// the controlling alignment constraint. Note that this alignment
// requirement is internal to the allocator, and independent of any
// particular platform.
- enum { SlotsPerLong = 2 };
+ enum { SlotsPerLong = 2,
+ SlotsPerVecS = 1,
+ SlotsPerVecD = 2,
+ SlotsPerVecX = 4,
+ SlotsPerVecY = 8 };
// A constructor only used by the ADLC output. All mask fields are filled
// in directly. Calls to this look something like RM(1,2,3,4);
@@ -193,20 +197,53 @@
OptoReg::Name find_first_pair() const;
// Clear out partial bits; leave only aligned adjacent bit pairs.
- void ClearToPairs();
+ void clear_to_pairs();
// Smear out partial bits; leave only aligned adjacent bit pairs.
- void SmearToPairs();
+ void smear_to_pairs();
// Verify that the mask contains only aligned adjacent bit pairs
- void VerifyPairs() const { assert( is_aligned_Pairs(), "mask is not aligned, adjacent pairs" ); }
+ void verify_pairs() const { assert( is_aligned_pairs(), "mask is not aligned, adjacent pairs" ); }
// Test that the mask contains only aligned adjacent bit pairs
- bool is_aligned_Pairs() const;
+ bool is_aligned_pairs() const;
// mask is a pair of misaligned registers
- bool is_misaligned_Pair() const { return Size()==2 && !is_aligned_Pairs();}
+ bool is_misaligned_pair() const { return Size()==2 && !is_aligned_pairs(); }
// Test for single register
int is_bound1() const;
// Test for a single adjacent pair
- int is_bound2() const;
+ int is_bound_pair() const;
+ // Test for a single adjacent set of ideal register's size.
+ int is_bound(uint ireg) const {
+ if (is_vector(ireg)) {
+ if (is_bound_set(num_registers(ireg)))
+ return true;
+ } else if (is_bound1() || is_bound_pair()) {
+ return true;
+ }
+ return false;
+ }
+
+ // Find the lowest-numbered register set in the mask. Return the
+ // HIGHEST register number in the set, or BAD if no sets.
+ // Assert that the mask contains only bit sets.
+ OptoReg::Name find_first_set(int size) const;
+
+ // Clear out partial bits; leave only aligned adjacent bit sets of size.
+ void clear_to_sets(int size);
+ // Smear out partial bits to aligned adjacent bit sets.
+ void smear_to_sets(int size);
+ // Verify that the mask contains only aligned adjacent bit sets
+ void verify_sets(int size) const { assert(is_aligned_sets(size), "mask is not aligned, adjacent sets"); }
+ // Test that the mask contains only aligned adjacent bit sets
+ bool is_aligned_sets(int size) const;
+
+ // mask is a set of misaligned registers
+ bool is_misaligned_set(int size) const { return (int)Size()==size && !is_aligned_sets(size);}
+
+ // Test for a single adjacent set
+ int is_bound_set(int size) const;
+
+ static bool is_vector(uint ireg);
+ static int num_registers(uint ireg);
// Fast overlap test. Non-zero if any registers in common.
int overlap( const RegMask &rm ) const {
@@ -280,9 +317,15 @@
static bool can_represent(OptoReg::Name reg) {
// NOTE: -1 in computation reflects the usage of the last
- // bit of the regmask as an infinite stack flag.
+ // bit of the regmask as an infinite stack flag and
+ // -7 is to keep mask aligned for largest value (VecY).
return (int)reg < (int)(CHUNK_SIZE-1);
}
+ static bool can_represent_arg(OptoReg::Name reg) {
+ // NOTE: -SlotsPerVecY in computation reflects the need
+ // to keep mask aligned for largest value (VecY).
+ return (int)reg < (int)(CHUNK_SIZE-SlotsPerVecY);
+ }
};
// Do not use this constant directly in client code!
--- a/hotspot/src/share/vm/opto/stringopts.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/stringopts.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -112,6 +112,7 @@
_arguments->ins_req(0, value);
_mode.insert_before(0, mode);
}
+
void push_string(Node* value) {
push(value, StringMode);
}
@@ -125,9 +126,56 @@
push(value, CharMode);
}
+ static bool is_SB_toString(Node* call) {
+ if (call->is_CallStaticJava()) {
+ CallStaticJavaNode* csj = call->as_CallStaticJava();
+ ciMethod* m = csj->method();
+ if (m != NULL &&
+ (m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString ||
+ m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static Node* skip_string_null_check(Node* value) {
+ // Look for a diamond shaped Null check of toString() result
+ // (could be code from String.valueOf()):
+ // (Proj == NULL) ? "null":"CastPP(Proj)#NotNULL
+ if (value->is_Phi()) {
+ int true_path = value->as_Phi()->is_diamond_phi();
+ if (true_path != 0) {
+ // phi->region->if_proj->ifnode->bool
+ BoolNode* b = value->in(0)->in(1)->in(0)->in(1)->as_Bool();
+ Node* cmp = b->in(1);
+ Node* v1 = cmp->in(1);
+ Node* v2 = cmp->in(2);
+ // Null check of the return of toString which can simply be skipped.
+ if (b->_test._test == BoolTest::ne &&
+ v2->bottom_type() == TypePtr::NULL_PTR &&
+ value->in(true_path)->Opcode() == Op_CastPP &&
+ value->in(true_path)->in(1) == v1 &&
+ v1->is_Proj() && is_SB_toString(v1->in(0))) {
+ return v1;
+ }
+ }
+ }
+ return value;
+ }
+
Node* argument(int i) {
return _arguments->in(i);
}
+ Node* argument_uncast(int i) {
+ Node* arg = argument(i);
+ int amode = mode(i);
+ if (amode == StringConcat::StringMode ||
+ amode == StringConcat::StringNullCheckMode) {
+ arg = skip_string_null_check(arg);
+ }
+ return arg;
+ }
void set_argument(int i, Node* value) {
_arguments->set_req(i, value);
}
@@ -206,9 +254,11 @@
void StringConcat::eliminate_unneeded_control() {
- eliminate_initialize(begin()->initialization());
for (uint i = 0; i < _control.size(); i++) {
Node* n = _control.at(i);
+ if (n->is_Allocate()) {
+ eliminate_initialize(n->as_Allocate()->initialization());
+ }
if (n->is_Call()) {
if (n != _end) {
eliminate_call(n->as_Call());
@@ -239,14 +289,15 @@
assert(result->_control.contains(other->_end), "what?");
assert(result->_control.contains(_begin), "what?");
for (int x = 0; x < num_arguments(); x++) {
- if (argument(x) == arg) {
+ Node* argx = argument_uncast(x);
+ if (argx == arg) {
// replace the toString result with the all the arguments that
// made up the other StringConcat
for (int y = 0; y < other->num_arguments(); y++) {
result->append(other->argument(y), other->mode(y));
}
} else {
- result->append(argument(x), mode(x));
+ result->append(argx, mode(x));
}
}
result->set_allocation(other->_begin);
@@ -327,14 +378,9 @@
while (worklist.size() > 0) {
Node* ctrl = worklist.pop();
- if (ctrl->is_CallStaticJava()) {
+ if (StringConcat::is_SB_toString(ctrl)) {
CallStaticJavaNode* csj = ctrl->as_CallStaticJava();
- ciMethod* m = csj->method();
- if (m != NULL &&
- (m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString ||
- m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString)) {
- string_calls.push(csj);
- }
+ string_calls.push(csj);
}
if (ctrl->in(0) != NULL && !_visited.test_set(ctrl->in(0)->_idx)) {
worklist.push(ctrl->in(0));
@@ -550,44 +596,40 @@
for (int c = 0; c < concats.length(); c++) {
StringConcat* sc = concats.at(c);
for (int i = 0; i < sc->num_arguments(); i++) {
- Node* arg = sc->argument(i);
- if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) {
+ Node* arg = sc->argument_uncast(i);
+ if (arg->is_Proj() && StringConcat::is_SB_toString(arg->in(0))) {
CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava();
- if (csj->method() != NULL &&
- (csj->method()->intrinsic_id() == vmIntrinsics::_StringBuilder_toString ||
- csj->method()->intrinsic_id() == vmIntrinsics::_StringBuffer_toString)) {
- for (int o = 0; o < concats.length(); o++) {
- if (c == o) continue;
- StringConcat* other = concats.at(o);
- if (other->end() == csj) {
+ for (int o = 0; o < concats.length(); o++) {
+ if (c == o) continue;
+ StringConcat* other = concats.at(o);
+ if (other->end() == csj) {
#ifndef PRODUCT
- if (PrintOptimizeStringConcat) {
- tty->print_cr("considering stacked concats");
- }
+ if (PrintOptimizeStringConcat) {
+ tty->print_cr("considering stacked concats");
+ }
#endif
- StringConcat* merged = sc->merge(other, arg);
- if (merged->validate_control_flow()) {
+ StringConcat* merged = sc->merge(other, arg);
+ if (merged->validate_control_flow()) {
#ifndef PRODUCT
- if (PrintOptimizeStringConcat) {
- tty->print_cr("stacking would succeed");
- }
+ if (PrintOptimizeStringConcat) {
+ tty->print_cr("stacking would succeed");
+ }
#endif
- if (c < o) {
- concats.remove_at(o);
- concats.at_put(c, merged);
- } else {
- concats.remove_at(c);
- concats.at_put(o, merged);
- }
- goto restart;
+ if (c < o) {
+ concats.remove_at(o);
+ concats.at_put(c, merged);
} else {
+ concats.remove_at(c);
+ concats.at_put(o, merged);
+ }
+ goto restart;
+ } else {
#ifndef PRODUCT
- if (PrintOptimizeStringConcat) {
- tty->print_cr("stacking would fail");
- }
+ if (PrintOptimizeStringConcat) {
+ tty->print_cr("stacking would fail");
+ }
#endif
- }
}
}
}
--- a/hotspot/src/share/vm/opto/superword.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/superword.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -67,6 +67,10 @@
//------------------------------transform_loop---------------------------
void SuperWord::transform_loop(IdealLoopTree* lpt) {
+ assert(UseSuperWord, "should be");
+ // Do vectors exist on this architecture?
+ if (Matcher::vector_width_in_bytes(T_BYTE) < 2) return;
+
assert(lpt->_head->is_CountedLoop(), "must be");
CountedLoopNode *cl = lpt->_head->as_CountedLoop();
@@ -89,15 +93,12 @@
Node *pre_opaq1 = pre_end->limit();
if (pre_opaq1->Opcode() != Op_Opaque1) return;
- // Do vectors exist on this architecture?
- if (vector_width_in_bytes() == 0) return;
-
init(); // initialize data structures
set_lpt(lpt);
set_lp(cl);
- // For now, define one block which is the entire loop body
+ // For now, define one block which is the entire loop body
set_bb(cl);
assert(_packset.length() == 0, "packset must be empty");
@@ -177,7 +178,7 @@
Node_List memops;
for (int i = 0; i < _block.length(); i++) {
Node* n = _block.at(i);
- if (n->is_Mem() && in_bb(n) &&
+ if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) &&
is_java_primitive(n->as_Mem()->memory_type())) {
int align = memory_alignment(n->as_Mem(), 0);
if (align != bottom_align) {
@@ -185,54 +186,141 @@
}
}
}
- if (memops.size() == 0) return;
- // Find a memory reference to align to. The pre-loop trip count
- // is modified to align this reference to a vector-aligned address
- find_align_to_ref(memops);
- if (align_to_ref() == NULL) return;
+ Node_List align_to_refs;
+ int best_iv_adjustment = 0;
+ MemNode* best_align_to_mem_ref = NULL;
- SWPointer align_to_ref_p(align_to_ref(), this);
- int offset = align_to_ref_p.offset_in_bytes();
- int scale = align_to_ref_p.scale_in_bytes();
- int vw = vector_width_in_bytes();
- int stride_sign = (scale * iv_stride()) > 0 ? 1 : -1;
- int iv_adjustment = (stride_sign * vw - (offset % vw)) % vw;
-
-#ifndef PRODUCT
- if (TraceSuperWord)
- tty->print_cr("\noffset = %d iv_adjustment = %d elt_align = %d scale = %d iv_stride = %d",
- offset, iv_adjustment, align_to_ref_p.memory_size(), align_to_ref_p.scale_in_bytes(), iv_stride());
-#endif
+ while (memops.size() != 0) {
+ // Find a memory reference to align to.
+ MemNode* mem_ref = find_align_to_ref(memops);
+ if (mem_ref == NULL) break;
+ align_to_refs.push(mem_ref);
+ int iv_adjustment = get_iv_adjustment(mem_ref);
- // Set alignment relative to "align_to_ref"
- for (int i = memops.size() - 1; i >= 0; i--) {
- MemNode* s = memops.at(i)->as_Mem();
- SWPointer p2(s, this);
- if (p2.comparable(align_to_ref_p)) {
- int align = memory_alignment(s, iv_adjustment);
- set_alignment(s, align);
- } else {
- memops.remove(i);
+ if (best_align_to_mem_ref == NULL) {
+ // Set memory reference which is the best from all memory operations
+ // to be used for alignment. The pre-loop trip count is modified to align
+ // this reference to a vector-aligned address.
+ best_align_to_mem_ref = mem_ref;
+ best_iv_adjustment = iv_adjustment;
}
- }
- // Create initial pack pairs of memory operations
- for (uint i = 0; i < memops.size(); i++) {
- Node* s1 = memops.at(i);
- for (uint j = 0; j < memops.size(); j++) {
- Node* s2 = memops.at(j);
- if (s1 != s2 && are_adjacent_refs(s1, s2)) {
- int align = alignment(s1);
- if (stmts_can_pack(s1, s2, align)) {
- Node_List* pair = new Node_List();
- pair->push(s1);
- pair->push(s2);
- _packset.append(pair);
+ SWPointer align_to_ref_p(mem_ref, this);
+ // Set alignment relative to "align_to_ref" for all related memory operations.
+ for (int i = memops.size() - 1; i >= 0; i--) {
+ MemNode* s = memops.at(i)->as_Mem();
+ if (isomorphic(s, mem_ref)) {
+ SWPointer p2(s, this);
+ if (p2.comparable(align_to_ref_p)) {
+ int align = memory_alignment(s, iv_adjustment);
+ set_alignment(s, align);
}
}
}
- }
+
+ // Create initial pack pairs of memory operations for which
+ // alignment is set and vectors will be aligned.
+ bool create_pack = true;
+ if (memory_alignment(mem_ref, best_iv_adjustment) == 0) {
+ if (!Matcher::misaligned_vectors_ok()) {
+ int vw = vector_width(mem_ref);
+ int vw_best = vector_width(best_align_to_mem_ref);
+ if (vw > vw_best) {
+ // Do not vectorize a memory access with more elements per vector
+ // if unaligned memory access is not allowed because number of
+ // iterations in pre-loop will be not enough to align it.
+ create_pack = false;
+ }
+ }
+ } else {
+ if (same_velt_type(mem_ref, best_align_to_mem_ref)) {
+ // Can't allow vectorization of unaligned memory accesses with the
+ // same type since it could be overlapped accesses to the same array.
+ create_pack = false;
+ } else {
+ // Allow independent (different type) unaligned memory operations
+ // if HW supports them.
+ if (!Matcher::misaligned_vectors_ok()) {
+ create_pack = false;
+ } else {
+ // Check if packs of the same memory type but
+ // with a different alignment were created before.
+ for (uint i = 0; i < align_to_refs.size(); i++) {
+ MemNode* mr = align_to_refs.at(i)->as_Mem();
+ if (same_velt_type(mr, mem_ref) &&
+ memory_alignment(mr, iv_adjustment) != 0)
+ create_pack = false;
+ }
+ }
+ }
+ }
+ if (create_pack) {
+ for (uint i = 0; i < memops.size(); i++) {
+ Node* s1 = memops.at(i);
+ int align = alignment(s1);
+ if (align == top_align) continue;
+ for (uint j = 0; j < memops.size(); j++) {
+ Node* s2 = memops.at(j);
+ if (alignment(s2) == top_align) continue;
+ if (s1 != s2 && are_adjacent_refs(s1, s2)) {
+ if (stmts_can_pack(s1, s2, align)) {
+ Node_List* pair = new Node_List();
+ pair->push(s1);
+ pair->push(s2);
+ _packset.append(pair);
+ }
+ }
+ }
+ }
+ } else { // Don't create unaligned pack
+ // First, remove remaining memory ops of the same type from the list.
+ for (int i = memops.size() - 1; i >= 0; i--) {
+ MemNode* s = memops.at(i)->as_Mem();
+ if (same_velt_type(s, mem_ref)) {
+ memops.remove(i);
+ }
+ }
+
+ // Second, remove already constructed packs of the same type.
+ for (int i = _packset.length() - 1; i >= 0; i--) {
+ Node_List* p = _packset.at(i);
+ MemNode* s = p->at(0)->as_Mem();
+ if (same_velt_type(s, mem_ref)) {
+ remove_pack_at(i);
+ }
+ }
+
+ // If needed find the best memory reference for loop alignment again.
+ if (same_velt_type(mem_ref, best_align_to_mem_ref)) {
+ // Put memory ops from remaining packs back on memops list for
+ // the best alignment search.
+ uint orig_msize = memops.size();
+ for (int i = 0; i < _packset.length(); i++) {
+ Node_List* p = _packset.at(i);
+ MemNode* s = p->at(0)->as_Mem();
+ assert(!same_velt_type(s, mem_ref), "sanity");
+ memops.push(s);
+ }
+ MemNode* best_align_to_mem_ref = find_align_to_ref(memops);
+ if (best_align_to_mem_ref == NULL) break;
+ best_iv_adjustment = get_iv_adjustment(best_align_to_mem_ref);
+ // Restore list.
+ while (memops.size() > orig_msize)
+ (void)memops.pop();
+ }
+ } // unaligned memory accesses
+
+ // Remove used mem nodes.
+ for (int i = memops.size() - 1; i >= 0; i--) {
+ MemNode* m = memops.at(i)->as_Mem();
+ if (alignment(m) != top_align) {
+ memops.remove(i);
+ }
+ }
+
+ } // while (memops.size() != 0
+ set_align_to_ref(best_align_to_mem_ref);
#ifndef PRODUCT
if (TraceSuperWord) {
@@ -246,7 +334,7 @@
// Find a memory reference to align the loop induction variable to.
// Looks first at stores then at loads, looking for a memory reference
// with the largest number of references similar to it.
-void SuperWord::find_align_to_ref(Node_List &memops) {
+MemNode* SuperWord::find_align_to_ref(Node_List &memops) {
GrowableArray<int> cmp_ct(arena(), memops.size(), memops.size(), 0);
// Count number of comparable memory ops
@@ -270,20 +358,28 @@
}
}
- // Find Store (or Load) with the greatest number of "comparable" references
+ // Find Store (or Load) with the greatest number of "comparable" references,
+ // biggest vector size, smallest data size and smallest iv offset.
int max_ct = 0;
+ int max_vw = 0;
int max_idx = -1;
int min_size = max_jint;
int min_iv_offset = max_jint;
for (uint j = 0; j < memops.size(); j++) {
MemNode* s = memops.at(j)->as_Mem();
if (s->is_Store()) {
+ int vw = vector_width_in_bytes(s);
+ assert(vw > 1, "sanity");
SWPointer p(s, this);
- if (cmp_ct.at(j) > max_ct ||
- cmp_ct.at(j) == max_ct && (data_size(s) < min_size ||
- data_size(s) == min_size &&
- p.offset_in_bytes() < min_iv_offset)) {
+ if (cmp_ct.at(j) > max_ct ||
+ cmp_ct.at(j) == max_ct &&
+ (vw > max_vw ||
+ vw == max_vw &&
+ (data_size(s) < min_size ||
+ data_size(s) == min_size &&
+ (p.offset_in_bytes() < min_iv_offset)))) {
max_ct = cmp_ct.at(j);
+ max_vw = vw;
max_idx = j;
min_size = data_size(s);
min_iv_offset = p.offset_in_bytes();
@@ -295,12 +391,18 @@
for (uint j = 0; j < memops.size(); j++) {
MemNode* s = memops.at(j)->as_Mem();
if (s->is_Load()) {
+ int vw = vector_width_in_bytes(s);
+ assert(vw > 1, "sanity");
SWPointer p(s, this);
- if (cmp_ct.at(j) > max_ct ||
- cmp_ct.at(j) == max_ct && (data_size(s) < min_size ||
- data_size(s) == min_size &&
- p.offset_in_bytes() < min_iv_offset)) {
+ if (cmp_ct.at(j) > max_ct ||
+ cmp_ct.at(j) == max_ct &&
+ (vw > max_vw ||
+ vw == max_vw &&
+ (data_size(s) < min_size ||
+ data_size(s) == min_size &&
+ (p.offset_in_bytes() < min_iv_offset)))) {
max_ct = cmp_ct.at(j);
+ max_vw = vw;
max_idx = j;
min_size = data_size(s);
min_iv_offset = p.offset_in_bytes();
@@ -309,10 +411,7 @@
}
}
- if (max_ct > 0)
- set_align_to_ref(memops.at(max_idx)->as_Mem());
-
-#ifndef PRODUCT
+#ifdef ASSERT
if (TraceSuperWord && Verbose) {
tty->print_cr("\nVector memops after find_align_to_refs");
for (uint i = 0; i < memops.size(); i++) {
@@ -321,6 +420,17 @@
}
}
#endif
+
+ if (max_ct > 0) {
+#ifdef ASSERT
+ if (TraceSuperWord) {
+ tty->print("\nVector align to node: ");
+ memops.at(max_idx)->as_Mem()->dump();
+ }
+#endif
+ return memops.at(max_idx)->as_Mem();
+ }
+ return NULL;
}
//------------------------------ref_is_alignable---------------------------
@@ -341,7 +451,8 @@
// If initial offset from start of object is computable,
// compute alignment within the vector.
- int vw = vector_width_in_bytes();
+ int vw = vector_width_in_bytes(p.mem());
+ assert(vw > 1, "sanity");
if (vw % span == 0) {
Node* init_nd = pre_end->init_trip();
if (init_nd->is_Con() && p.invar() == NULL) {
@@ -361,6 +472,25 @@
return false;
}
+//---------------------------get_iv_adjustment---------------------------
+// Calculate loop's iv adjustment for this memory ops.
+int SuperWord::get_iv_adjustment(MemNode* mem_ref) {
+ SWPointer align_to_ref_p(mem_ref, this);
+ int offset = align_to_ref_p.offset_in_bytes();
+ int scale = align_to_ref_p.scale_in_bytes();
+ int vw = vector_width_in_bytes(mem_ref);
+ assert(vw > 1, "sanity");
+ int stride_sign = (scale * iv_stride()) > 0 ? 1 : -1;
+ int iv_adjustment = (stride_sign * vw - (offset % vw)) % vw;
+
+#ifndef PRODUCT
+ if (TraceSuperWord)
+ tty->print_cr("\noffset = %d iv_adjust = %d elt_size = %d scale = %d iv_stride = %d vect_size %d",
+ offset, iv_adjustment, align_to_ref_p.memory_size(), scale, iv_stride(), vw);
+#endif
+ return iv_adjustment;
+}
+
//---------------------------dependence_graph---------------------------
// Construct dependency graph.
// Add dependence edges to load/store nodes for memory dependence
@@ -488,9 +618,13 @@
bool SuperWord::stmts_can_pack(Node* s1, Node* s2, int align) {
// Do not use superword for non-primitives
- if((s1->is_Mem() && !is_java_primitive(s1->as_Mem()->memory_type())) ||
- (s2->is_Mem() && !is_java_primitive(s2->as_Mem()->memory_type())))
+ BasicType bt1 = velt_basic_type(s1);
+ BasicType bt2 = velt_basic_type(s2);
+ if(!is_java_primitive(bt1) || !is_java_primitive(bt2))
return false;
+ if (Matcher::max_vector_size(bt1) < 2) {
+ return false; // No vectors for this type
+ }
if (isomorphic(s1, s2)) {
if (independent(s1, s2)) {
@@ -552,7 +686,7 @@
if (s1->Opcode() != s2->Opcode()) return false;
if (s1->req() != s2->req()) return false;
if (s1->in(0) != s2->in(0)) return false;
- if (velt_type(s1) != velt_type(s2)) return false;
+ if (!same_velt_type(s1, s2)) return false;
return true;
}
@@ -595,14 +729,16 @@
//------------------------------set_alignment---------------------------
void SuperWord::set_alignment(Node* s1, Node* s2, int align) {
set_alignment(s1, align);
- set_alignment(s2, align + data_size(s1));
+ if (align == top_align || align == bottom_align) {
+ set_alignment(s2, align);
+ } else {
+ set_alignment(s2, align + data_size(s1));
+ }
}
//------------------------------data_size---------------------------
int SuperWord::data_size(Node* s) {
- const Type* t = velt_type(s);
- BasicType bt = t->array_element_basic_type();
- int bsize = type2aelembytes(bt);
+ int bsize = type2aelembytes(velt_basic_type(s));
assert(bsize != 0, "valid size");
return bsize;
}
@@ -631,9 +767,9 @@
//------------------------------follow_use_defs---------------------------
// Extend the packset by visiting operand definitions of nodes in pack p
bool SuperWord::follow_use_defs(Node_List* p) {
+ assert(p->size() == 2, "just checking");
Node* s1 = p->at(0);
Node* s2 = p->at(1);
- assert(p->size() == 2, "just checking");
assert(s1->req() == s2->req(), "just checking");
assert(alignment(s1) + data_size(s1) == alignment(s2), "just checking");
@@ -718,7 +854,12 @@
for (i1++; i1 < ct; i1++) if (u1->in(i1) == d1) break;
for (i2++; i2 < ct; i2++) if (u2->in(i2) == d2) break;
if (i1 != i2) {
- return false;
+ if ((i1 == (3-i2)) && (u2->is_Add() || u2->is_Mul())) {
+ // Further analysis relies on operands position matching.
+ u2->swap_edges(i1, i2);
+ } else {
+ return false;
+ }
}
} while (i1 < ct);
return true;
@@ -727,7 +868,7 @@
//------------------------------est_savings---------------------------
// Estimate the savings from executing s1 and s2 as a pack
int SuperWord::est_savings(Node* s1, Node* s2) {
- int save = 2 - 1; // 2 operations per instruction in packed form
+ int save_in = 2 - 1; // 2 operations per instruction in packed form
// inputs
for (uint i = 1; i < s1->req(); i++) {
@@ -735,17 +876,18 @@
Node* x2 = s2->in(i);
if (x1 != x2) {
if (are_adjacent_refs(x1, x2)) {
- save += adjacent_profit(x1, x2);
+ save_in += adjacent_profit(x1, x2);
} else if (!in_packset(x1, x2)) {
- save -= pack_cost(2);
+ save_in -= pack_cost(2);
} else {
- save += unpack_cost(2);
+ save_in += unpack_cost(2);
}
}
}
// uses of result
uint ct = 0;
+ int save_use = 0;
for (DUIterator_Fast imax, i = s1->fast_outs(imax); i < imax; i++) {
Node* s1_use = s1->fast_out(i);
for (int j = 0; j < _packset.length(); j++) {
@@ -756,7 +898,7 @@
if (p->at(p->size()-1) == s2_use) {
ct++;
if (are_adjacent_refs(s1_use, s2_use)) {
- save += adjacent_profit(s1_use, s2_use);
+ save_use += adjacent_profit(s1_use, s2_use);
}
}
}
@@ -764,10 +906,10 @@
}
}
- if (ct < s1->outcnt()) save += unpack_cost(1);
- if (ct < s2->outcnt()) save += unpack_cost(1);
+ if (ct < s1->outcnt()) save_use += unpack_cost(1);
+ if (ct < s2->outcnt()) save_use += unpack_cost(1);
- return save;
+ return MAX2(save_in, save_use);
}
//------------------------------costs---------------------------
@@ -778,8 +920,9 @@
//------------------------------combine_packs---------------------------
// Combine packs A and B with A.last == B.first into A.first..,A.last,B.second,..B.last
void SuperWord::combine_packs() {
- bool changed;
- do {
+ bool changed = true;
+ // Combine packs regardless max vector size.
+ while (changed) {
changed = false;
for (int i = 0; i < _packset.length(); i++) {
Node_List* p1 = _packset.at(i);
@@ -787,6 +930,7 @@
for (int j = 0; j < _packset.length(); j++) {
Node_List* p2 = _packset.at(j);
if (p2 == NULL) continue;
+ if (i == j) continue;
if (p1->at(p1->size()-1) == p2->at(0)) {
for (uint k = 1; k < p2->size(); k++) {
p1->push(p2->at(k));
@@ -796,8 +940,39 @@
}
}
}
- } while (changed);
+ }
+ // Split packs which have size greater then max vector size.
+ for (int i = 0; i < _packset.length(); i++) {
+ Node_List* p1 = _packset.at(i);
+ if (p1 != NULL) {
+ BasicType bt = velt_basic_type(p1->at(0));
+ uint max_vlen = Matcher::max_vector_size(bt); // Max elements in vector
+ assert(is_power_of_2(max_vlen), "sanity");
+ uint psize = p1->size();
+ if (!is_power_of_2(psize)) {
+ // Skip pack which can't be vector.
+ // case1: for(...) { a[i] = i; } elements values are different (i+x)
+ // case2: for(...) { a[i] = b[i+1]; } can't align both, load and store
+ _packset.at_put(i, NULL);
+ continue;
+ }
+ if (psize > max_vlen) {
+ Node_List* pack = new Node_List();
+ for (uint j = 0; j < psize; j++) {
+ pack->push(p1->at(j));
+ if (pack->size() >= max_vlen) {
+ assert(is_power_of_2(pack->size()), "sanity");
+ _packset.append(pack);
+ pack = new Node_List();
+ }
+ }
+ _packset.at_put(i, NULL);
+ }
+ }
+ }
+
+ // Compress list.
for (int i = _packset.length() - 1; i >= 0; i--) {
Node_List* p1 = _packset.at(i);
if (p1 == NULL) {
@@ -880,8 +1055,7 @@
// Can code be generated for pack p?
bool SuperWord::implemented(Node_List* p) {
Node* p0 = p->at(0);
- int vopc = VectorNode::opcode(p0->Opcode(), p->size(), velt_type(p0));
- return vopc > 0 && Matcher::has_match_rule(vopc);
+ return VectorNode::implemented(p0->Opcode(), p->size(), velt_basic_type(p0));
}
//------------------------------profitable---------------------------
@@ -939,36 +1113,36 @@
}
//-------------------------------remove_and_insert-------------------
-//remove "current" from its current position in the memory graph and insert
-//it after the appropriate insertion point (lip or uip)
+// Remove "current" from its current position in the memory graph and insert
+// it after the appropriate insertion point (lip or uip).
void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip,
Node *uip, Unique_Node_List &sched_before) {
Node* my_mem = current->in(MemNode::Memory);
- _igvn.rehash_node_delayed(current);
- _igvn.hash_delete(my_mem);
+ bool sched_up = sched_before.member(current);
- //remove current_store from its current position in the memmory graph
+ // remove current_store from its current position in the memmory graph
for (DUIterator i = current->outs(); current->has_out(i); i++) {
Node* use = current->out(i);
if (use->is_Mem()) {
assert(use->in(MemNode::Memory) == current, "must be");
- _igvn.rehash_node_delayed(use);
if (use == prev) { // connect prev to my_mem
- use->set_req(MemNode::Memory, my_mem);
+ _igvn.replace_input_of(use, MemNode::Memory, my_mem);
+ --i; //deleted this edge; rescan position
} else if (sched_before.member(use)) {
- _igvn.hash_delete(uip);
- use->set_req(MemNode::Memory, uip);
+ if (!sched_up) { // Will be moved together with current
+ _igvn.replace_input_of(use, MemNode::Memory, uip);
+ --i; //deleted this edge; rescan position
+ }
} else {
- _igvn.hash_delete(lip);
- use->set_req(MemNode::Memory, lip);
+ if (sched_up) { // Will be moved together with current
+ _igvn.replace_input_of(use, MemNode::Memory, lip);
+ --i; //deleted this edge; rescan position
+ }
}
- --i; //deleted this edge; rescan position
}
}
- bool sched_up = sched_before.member(current);
Node *insert_pt = sched_up ? uip : lip;
- _igvn.hash_delete(insert_pt);
// all uses of insert_pt's memory state should use current's instead
for (DUIterator i = insert_pt->outs(); insert_pt->has_out(i); i++) {
@@ -988,7 +1162,7 @@
}
//connect current to insert_pt
- current->set_req(MemNode::Memory, insert_pt);
+ _igvn.replace_input_of(current, MemNode::Memory, insert_pt);
}
//------------------------------co_locate_pack----------------------------------
@@ -1025,7 +1199,7 @@
if (use->is_Mem() && use != previous)
memops.push(use);
}
- if(current == first) break;
+ if (current == first) break;
previous = current;
current = current->in(MemNode::Memory)->as_Mem();
}
@@ -1038,27 +1212,37 @@
Node *s2 = memops.at(j);
if (!independent(s1, s2)) {
if (in_pack(s2, pk) || schedule_before_pack.member(s2)) {
- schedule_before_pack.push(s1); //s1 must be scheduled before
+ schedule_before_pack.push(s1); // s1 must be scheduled before
Node_List* mem_pk = my_pack(s1);
if (mem_pk != NULL) {
for (uint ii = 0; ii < mem_pk->size(); ii++) {
- Node* s = mem_pk->at(ii); // follow partner
+ Node* s = mem_pk->at(ii); // follow partner
if (memops.member(s) && !schedule_before_pack.member(s))
schedule_before_pack.push(s);
}
}
+ break;
}
}
}
}
}
+ Node* upper_insert_pt = first->in(MemNode::Memory);
+ // Following code moves loads connected to upper_insert_pt below aliased stores.
+ // Collect such loads here and reconnect them back to upper_insert_pt later.
+ memops.clear();
+ for (DUIterator i = upper_insert_pt->outs(); upper_insert_pt->has_out(i); i++) {
+ Node* use = upper_insert_pt->out(i);
+ if (!use->is_Store())
+ memops.push(use);
+ }
+
MemNode* lower_insert_pt = last;
- Node* upper_insert_pt = first->in(MemNode::Memory);
previous = last; //previous store in pk
current = last->in(MemNode::Memory)->as_Mem();
- //start scheduling from "last" to "first"
+ // start scheduling from "last" to "first"
while (true) {
assert(in_bb(current), "stay in block");
assert(in_pack(previous, pk), "previous stays in pack");
@@ -1066,16 +1250,13 @@
if (in_pack(current, pk)) {
// Forward users of my memory state (except "previous) to my input memory state
- _igvn.hash_delete(current);
for (DUIterator i = current->outs(); current->has_out(i); i++) {
Node* use = current->out(i);
if (use->is_Mem() && use != previous) {
assert(use->in(MemNode::Memory) == current, "must be");
if (schedule_before_pack.member(use)) {
- _igvn.hash_delete(upper_insert_pt);
_igvn.replace_input_of(use, MemNode::Memory, upper_insert_pt);
} else {
- _igvn.hash_delete(lower_insert_pt);
_igvn.replace_input_of(use, MemNode::Memory, lower_insert_pt);
}
--i; // deleted this edge; rescan position
@@ -1089,6 +1270,14 @@
if (current == first) break;
current = my_mem->as_Mem();
} // end while
+
+ // Reconnect loads back to upper_insert_pt.
+ for (uint i = 0; i < memops.size(); i++) {
+ Node *ld = memops.at(i);
+ if (ld->in(MemNode::Memory) != upper_insert_pt) {
+ _igvn.replace_input_of(ld, MemNode::Memory, upper_insert_pt);
+ }
+ }
} else if (pk->at(0)->is_Load()) { //load
// all loads in the pack should have the same memory state. By default,
// we use the memory state of the last load. However, if any load could
@@ -1149,35 +1338,30 @@
Node* vn = NULL;
Node* low_adr = p->at(0);
Node* first = executed_first(p);
+ int opc = n->Opcode();
if (n->is_Load()) {
- int opc = n->Opcode();
Node* ctl = n->in(MemNode::Control);
Node* mem = first->in(MemNode::Memory);
Node* adr = low_adr->in(MemNode::Address);
const TypePtr* atyp = n->adr_type();
- vn = VectorLoadNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen);
-
+ vn = LoadVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n));
} else if (n->is_Store()) {
// Promote value to be stored to vector
Node* val = vector_opd(p, MemNode::ValueIn);
-
- int opc = n->Opcode();
Node* ctl = n->in(MemNode::Control);
Node* mem = first->in(MemNode::Memory);
Node* adr = low_adr->in(MemNode::Address);
const TypePtr* atyp = n->adr_type();
- vn = VectorStoreNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen);
-
+ vn = StoreVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen);
} else if (n->req() == 3) {
// Promote operands to vector
Node* in1 = vector_opd(p, 1);
Node* in2 = vector_opd(p, 2);
- vn = VectorNode::make(_phase->C, n->Opcode(), in1, in2, vlen, velt_type(n));
-
+ vn = VectorNode::make(_phase->C, opc, in1, in2, vlen, velt_basic_type(n));
} else {
ShouldNotReachHere();
}
-
+ assert(vn != NULL, "sanity");
_phase->_igvn.register_new_node_with_optimizer(vn);
_phase->set_ctrl(vn, _phase->get_ctrl(p->at(0)));
for (uint j = 0; j < p->size(); j++) {
@@ -1185,6 +1369,12 @@
_igvn.replace_node(pm, vn);
}
_igvn._worklist.push(vn);
+#ifdef ASSERT
+ if (TraceNewVectors) {
+ tty->print("new Vector node: ");
+ vn->dump();
+ }
+#endif
}
}
}
@@ -1207,10 +1397,10 @@
}
if (same_opd) {
- if (opd->is_Vector() || opd->is_VectorLoad()) {
+ if (opd->is_Vector() || opd->is_LoadVector()) {
return opd; // input is matching vector
}
- assert(!opd->is_VectorStore(), "such vector is not expected here");
+ assert(!opd->is_StoreVector(), "such vector is not expected here");
// Convert scalar input to vector with the same number of elements as
// p0's vector. Use p0's type because size of operand's container in
// vector should match p0's size regardless operand's size.
@@ -1219,12 +1409,18 @@
_phase->_igvn.register_new_node_with_optimizer(vn);
_phase->set_ctrl(vn, _phase->get_ctrl(opd));
+#ifdef ASSERT
+ if (TraceNewVectors) {
+ tty->print("new Vector node: ");
+ vn->dump();
+ }
+#endif
return vn;
}
// Insert pack operation
- const Type* p0_t = velt_type(p0);
- PackNode* pk = PackNode::make(_phase->C, opd, p0_t);
+ BasicType bt = velt_basic_type(p0);
+ PackNode* pk = PackNode::make(_phase->C, opd, vlen, bt);
DEBUG_ONLY( const BasicType opd_bt = opd->bottom_type()->basic_type(); )
for (uint i = 1; i < vlen; i++) {
@@ -1232,10 +1428,16 @@
Node* in = pi->in(opd_idx);
assert(my_pack(in) == NULL, "Should already have been unpacked");
assert(opd_bt == in->bottom_type()->basic_type(), "all same type");
- pk->add_opd(in);
+ pk->add_opd(i, in);
}
_phase->_igvn.register_new_node_with_optimizer(pk);
_phase->set_ctrl(pk, _phase->get_ctrl(opd));
+#ifdef ASSERT
+ if (TraceNewVectors) {
+ tty->print("new Vector node: ");
+ pk->dump();
+ }
+#endif
return pk;
}
@@ -1273,16 +1475,15 @@
// Insert extract operation
_igvn.hash_delete(def);
int def_pos = alignment(def) / data_size(def);
- const Type* def_t = velt_type(def);
- Node* ex = ExtractNode::make(_phase->C, def, def_pos, def_t);
+ Node* ex = ExtractNode::make(_phase->C, def, def_pos, velt_basic_type(def));
_phase->_igvn.register_new_node_with_optimizer(ex);
_phase->set_ctrl(ex, _phase->get_ctrl(def));
_igvn.replace_input_of(use, idx, ex);
_igvn._worklist.push(def);
bb_insert_after(ex, bb_idx(def));
- set_velt_type(ex, def_t);
+ set_velt_type(ex, velt_type(def));
}
}
@@ -1509,10 +1710,7 @@
// Initial type
for (int i = 0; i < _block.length(); i++) {
Node* n = _block.at(i);
- const Type* t = n->is_Mem() ? Type::get_const_basic_type(n->as_Mem()->memory_type())
- : _igvn.type(n);
- const Type* vt = container_type(t);
- set_velt_type(n, vt);
+ set_velt_type(n, container_type(n));
}
// Propagate narrowed type backwards through operations
@@ -1543,7 +1741,7 @@
bool same_type = true;
for (DUIterator_Fast kmax, k = in->fast_outs(kmax); k < kmax; k++) {
Node *use = in->fast_out(k);
- if (!in_bb(use) || velt_type(use) != vt) {
+ if (!in_bb(use) || !same_velt_type(use, n)) {
same_type = false;
break;
}
@@ -1575,20 +1773,24 @@
if (!p.valid()) {
return bottom_align;
}
+ int vw = vector_width_in_bytes(s);
+ if (vw < 2) {
+ return bottom_align; // No vectors for this type
+ }
int offset = p.offset_in_bytes();
offset += iv_adjust_in_bytes;
- int off_rem = offset % vector_width_in_bytes();
- int off_mod = off_rem >= 0 ? off_rem : off_rem + vector_width_in_bytes();
+ int off_rem = offset % vw;
+ int off_mod = off_rem >= 0 ? off_rem : off_rem + vw;
return off_mod;
}
//---------------------------container_type---------------------------
// Smallest type containing range of values
-const Type* SuperWord::container_type(const Type* t) {
- const Type* tp = t->make_ptr();
- if (tp && tp->isa_aryptr()) {
- t = tp->is_aryptr()->elem();
+const Type* SuperWord::container_type(Node* n) {
+ if (n->is_Mem()) {
+ return Type::get_const_basic_type(n->as_Mem()->memory_type());
}
+ const Type* t = _igvn.type(n);
if (t->basic_type() == T_INT) {
if (t->higher_equal(TypeInt::BOOL)) return TypeInt::BOOL;
if (t->higher_equal(TypeInt::BYTE)) return TypeInt::BYTE;
@@ -1599,11 +1801,22 @@
return t;
}
+bool SuperWord::same_velt_type(Node* n1, Node* n2) {
+ const Type* vt1 = velt_type(n1);
+ const Type* vt2 = velt_type(n1);
+ if (vt1->basic_type() == T_INT && vt2->basic_type() == T_INT) {
+ // Compare vectors element sizes for integer types.
+ return data_size(n1) == data_size(n2);
+ }
+ return vt1 == vt2;
+}
+
//-------------------------vector_opd_range-----------------------
// (Start, end] half-open range defining which operands are vector
void SuperWord::vector_opd_range(Node* n, uint* start, uint* end) {
switch (n->Opcode()) {
- case Op_LoadB: case Op_LoadUS:
+ case Op_LoadB: case Op_LoadUB:
+ case Op_LoadS: case Op_LoadUS:
case Op_LoadI: case Op_LoadL:
case Op_LoadF: case Op_LoadD:
case Op_LoadP:
@@ -1721,6 +1934,7 @@
assert(orig_limit != NULL && _igvn.type(orig_limit) != Type::TOP, "");
SWPointer align_to_ref_p(align_to_ref, this);
+ assert(align_to_ref_p.valid(), "sanity");
// Given:
// lim0 == original pre loop limit
@@ -1773,10 +1987,12 @@
// N = (V - (e - lim0)) % V
// lim = lim0 - (V - (e - lim0)) % V
+ int vw = vector_width_in_bytes(align_to_ref);
int stride = iv_stride();
int scale = align_to_ref_p.scale_in_bytes();
int elt_size = align_to_ref_p.memory_size();
- int v_align = vector_width_in_bytes() / elt_size;
+ int v_align = vw / elt_size;
+ assert(v_align > 1, "sanity");
int k = align_to_ref_p.offset_in_bytes() / elt_size;
Node *kn = _igvn.intcon(k);
@@ -1796,6 +2012,25 @@
_phase->_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
}
+ if (vw > ObjectAlignmentInBytes) {
+ // incorporate base e +/- base && Mask >>> log2(elt)
+ Node* mask = _igvn.MakeConX(~(-1 << exact_log2(vw)));
+ Node* xbase = new(_phase->C, 2) CastP2XNode(NULL, align_to_ref_p.base());
+ _phase->_igvn.register_new_node_with_optimizer(xbase);
+ Node* masked_xbase = new (_phase->C, 3) AndXNode(xbase, mask);
+ _phase->_igvn.register_new_node_with_optimizer(masked_xbase);
+#ifdef _LP64
+ masked_xbase = new (_phase->C, 2) ConvL2INode(masked_xbase);
+ _phase->_igvn.register_new_node_with_optimizer(masked_xbase);
+#endif
+ Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
+ Node* bref = new (_phase->C, 3) URShiftINode(masked_xbase, log2_elt);
+ _phase->_igvn.register_new_node_with_optimizer(bref);
+ _phase->set_ctrl(bref, pre_ctrl);
+ e = new (_phase->C, 3) AddINode(e, bref);
+ _phase->_igvn.register_new_node_with_optimizer(e);
+ _phase->set_ctrl(e, pre_ctrl);
+ }
// compute e +/- lim0
if (scale < 0) {
--- a/hotspot/src/share/vm/opto/superword.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/superword.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -264,8 +264,14 @@
_iv = lp->as_CountedLoop()->phi()->as_Phi(); }
int iv_stride() { return lp()->as_CountedLoop()->stride_con(); }
- int vector_width_in_bytes() { return Matcher::vector_width_in_bytes(); }
-
+ int vector_width(Node* n) {
+ BasicType bt = velt_basic_type(n);
+ return MIN2(ABS(iv_stride()), Matcher::max_vector_size(bt));
+ }
+ int vector_width_in_bytes(Node* n) {
+ BasicType bt = velt_basic_type(n);
+ return vector_width(n)*type2aelembytes(bt);
+ }
MemNode* align_to_ref() { return _align_to_ref; }
void set_align_to_ref(MemNode* m) { _align_to_ref = m; }
@@ -298,7 +304,9 @@
// vector element type
const Type* velt_type(Node* n) { return _node_info.adr_at(bb_idx(n))->_velt_type; }
+ BasicType velt_basic_type(Node* n) { return velt_type(n)->array_element_basic_type(); }
void set_velt_type(Node* n, const Type* t) { int i = bb_idx(n); grow_node_info(i); _node_info.adr_at(i)->_velt_type = t; }
+ bool same_velt_type(Node* n1, Node* n2);
// my_pack
Node_List* my_pack(Node* n) { return !in_bb(n) ? NULL : _node_info.adr_at(bb_idx(n))->_my_pack; }
@@ -311,7 +319,9 @@
// Find the adjacent memory references and create pack pairs for them.
void find_adjacent_refs();
// Find a memory reference to align the loop induction variable to.
- void find_align_to_ref(Node_List &memops);
+ MemNode* find_align_to_ref(Node_List &memops);
+ // Calculate loop's iv adjustment for this memory ops.
+ int get_iv_adjustment(MemNode* mem);
// Can the preloop align the reference to position zero in the vector?
bool ref_is_alignable(SWPointer& p);
// Construct dependency graph.
@@ -394,7 +404,7 @@
// (Start, end] half-open range defining which operands are vector
void vector_opd_range(Node* n, uint* start, uint* end);
// Smallest type containing range of values
- static const Type* container_type(const Type* t);
+ const Type* container_type(Node* n);
// Adjust pre-loop limit so that in main loop, a load/store reference
// to align_to_ref will be a position zero in the vector.
void align_initial_loop_index(MemNode* align_to_ref);
@@ -462,6 +472,7 @@
Node* base() { return _base; }
Node* adr() { return _adr; }
+ MemNode* mem() { return _mem; }
int scale_in_bytes() { return _scale; }
Node* invar() { return _invar; }
bool negate_invar() { return _negate_invar; }
--- a/hotspot/src/share/vm/opto/type.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/type.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -60,6 +60,10 @@
T_ILLEGAL, // Tuple
T_ARRAY, // Array
+ T_ILLEGAL, // VectorS
+ T_ILLEGAL, // VectorD
+ T_ILLEGAL, // VectorX
+ T_ILLEGAL, // VectorY
T_ADDRESS, // AnyPtr // shows up in factory methods for NULL_PTR
T_ADDRESS, // RawPtr
@@ -414,6 +418,24 @@
// get_zero_type() should not happen for T_CONFLICT
_zero_type[T_CONFLICT]= NULL;
+ // Vector predefined types, it needs initialized _const_basic_type[].
+ if (Matcher::vector_size_supported(T_BYTE,4)) {
+ TypeVect::VECTS = TypeVect::make(T_BYTE,4);
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,2)) {
+ TypeVect::VECTD = TypeVect::make(T_FLOAT,2);
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,4)) {
+ TypeVect::VECTX = TypeVect::make(T_FLOAT,4);
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,8)) {
+ TypeVect::VECTY = TypeVect::make(T_FLOAT,8);
+ }
+ mreg2type[Op_VecS] = TypeVect::VECTS;
+ mreg2type[Op_VecD] = TypeVect::VECTD;
+ mreg2type[Op_VecX] = TypeVect::VECTX;
+ mreg2type[Op_VecY] = TypeVect::VECTY;
+
// Restore working type arena.
current->set_type_arena(save);
current->set_type_dict(NULL);
@@ -668,6 +690,10 @@
Bad, // Tuple - handled in v-call
Bad, // Array - handled in v-call
+ Bad, // VectorS - handled in v-call
+ Bad, // VectorD - handled in v-call
+ Bad, // VectorX - handled in v-call
+ Bad, // VectorY - handled in v-call
Bad, // AnyPtr - handled in v-call
Bad, // RawPtr - handled in v-call
@@ -728,8 +754,8 @@
//------------------------------data-------------------------------------------
const char * const Type::msg[Type::lastype] = {
"bad","control","top","int:","long:","half", "narrowoop:",
- "tuple:", "aryptr",
- "anyptr:", "rawptr:", "java:", "inst:", "ary:", "klass:",
+ "tuple:", "array:", "vectors:", "vectord:", "vectorx:", "vectory:",
+ "anyptr:", "rawptr:", "java:", "inst:", "aryptr:", "klass:",
"func", "abIO", "return_address", "memory",
"float_top", "ftcon:", "float",
"double_top", "dblcon:", "double",
@@ -790,7 +816,7 @@
//------------------------------isa_oop_ptr------------------------------------
// Return true if type is an oop pointer type. False for raw pointers.
static char isa_oop_ptr_tbl[Type::lastype] = {
- 0,0,0,0,0,0,0/*narrowoop*/,0/*tuple*/, 0/*ary*/,
+ 0,0,0,0,0,0,0/*narrowoop*/,0/*tuple*/, 0/*array*/, 0, 0, 0, 0/*vector*/,
0/*anyptr*/,0/*rawptr*/,1/*OopPtr*/,1/*InstPtr*/,1/*AryPtr*/,1/*KlassPtr*/,
0/*func*/,0,0/*return_address*/,0,
/*floats*/0,0,0, /*doubles*/0,0,0,
@@ -1926,6 +1952,121 @@
return false;
}
+//==============================TypeVect=======================================
+// Convenience common pre-built types.
+const TypeVect *TypeVect::VECTS = NULL; // 32-bit vectors
+const TypeVect *TypeVect::VECTD = NULL; // 64-bit vectors
+const TypeVect *TypeVect::VECTX = NULL; // 128-bit vectors
+const TypeVect *TypeVect::VECTY = NULL; // 256-bit vectors
+
+//------------------------------make-------------------------------------------
+const TypeVect* TypeVect::make(const Type *elem, uint length) {
+ BasicType elem_bt = elem->array_element_basic_type();
+ assert(is_java_primitive(elem_bt), "only primitive types in vector");
+ assert(length > 1 && is_power_of_2(length), "vector length is power of 2");
+ assert(Matcher::vector_size_supported(elem_bt, length), "length in range");
+ int size = length * type2aelembytes(elem_bt);
+ switch (Matcher::vector_ideal_reg(size)) {
+ case Op_VecS:
+ return (TypeVect*)(new TypeVectS(elem, length))->hashcons();
+ case Op_VecD:
+ case Op_RegD:
+ return (TypeVect*)(new TypeVectD(elem, length))->hashcons();
+ case Op_VecX:
+ return (TypeVect*)(new TypeVectX(elem, length))->hashcons();
+ case Op_VecY:
+ return (TypeVect*)(new TypeVectY(elem, length))->hashcons();
+ }
+ ShouldNotReachHere();
+ return NULL;
+}
+
+//------------------------------meet-------------------------------------------
+// Compute the MEET of two types. It returns a new Type object.
+const Type *TypeVect::xmeet( const Type *t ) const {
+ // Perform a fast test for common case; meeting the same types together.
+ if( this == t ) return this; // Meeting same type-rep?
+
+ // Current "this->_base" is Vector
+ switch (t->base()) { // switch on original type
+
+ case Bottom: // Ye Olde Default
+ return t;
+
+ default: // All else is a mistake
+ typerr(t);
+
+ case VectorS:
+ case VectorD:
+ case VectorX:
+ case VectorY: { // Meeting 2 vectors?
+ const TypeVect* v = t->is_vect();
+ assert( base() == v->base(), "");
+ assert(length() == v->length(), "");
+ assert(element_basic_type() == v->element_basic_type(), "");
+ return TypeVect::make(_elem->xmeet(v->_elem), _length);
+ }
+ case Top:
+ break;
+ }
+ return this;
+}
+
+//------------------------------xdual------------------------------------------
+// Dual: compute field-by-field dual
+const Type *TypeVect::xdual() const {
+ return new TypeVect(base(), _elem->dual(), _length);
+}
+
+//------------------------------eq---------------------------------------------
+// Structural equality check for Type representations
+bool TypeVect::eq(const Type *t) const {
+ const TypeVect *v = t->is_vect();
+ return (_elem == v->_elem) && (_length == v->_length);
+}
+
+//------------------------------hash-------------------------------------------
+// Type-specific hashing function.
+int TypeVect::hash(void) const {
+ return (intptr_t)_elem + (intptr_t)_length;
+}
+
+//------------------------------singleton--------------------------------------
+// TRUE if Type is a singleton type, FALSE otherwise. Singletons are simple
+// constants (Ldi nodes). Vector is singleton if all elements are the same
+// constant value (when vector is created with Replicate code).
+bool TypeVect::singleton(void) const {
+// There is no Con node for vectors yet.
+// return _elem->singleton();
+ return false;
+}
+
+bool TypeVect::empty(void) const {
+ return _elem->empty();
+}
+
+//------------------------------dump2------------------------------------------
+#ifndef PRODUCT
+void TypeVect::dump2(Dict &d, uint depth, outputStream *st) const {
+ switch (base()) {
+ case VectorS:
+ st->print("vectors["); break;
+ case VectorD:
+ st->print("vectord["); break;
+ case VectorX:
+ st->print("vectorx["); break;
+ case VectorY:
+ st->print("vectory["); break;
+ default:
+ ShouldNotReachHere();
+ }
+ st->print("%d]:{", _length);
+ _elem->dump2(d, depth, st);
+ st->print("}");
+}
+#endif
+
+
//=============================================================================
// Convenience common pre-built types.
const TypePtr *TypePtr::NULL_PTR;
@@ -2472,18 +2613,26 @@
//------------------------------make_from_constant-----------------------------
// Make a java pointer from an oop constant
const TypeOopPtr* TypeOopPtr::make_from_constant(ciObject* o, bool require_constant) {
- if (o->is_method_data() || o->is_method() || o->is_cpcache()) {
+ if (o->is_method_data() || o->is_method()) {
// Treat much like a typeArray of bytes, like below, but fake the type...
- const Type* etype = (Type*)get_const_basic_type(T_BYTE);
+ const BasicType bt = T_BYTE;
+ const Type* etype = get_const_basic_type(bt);
const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS);
- ciKlass *klass = ciTypeArrayKlass::make((BasicType) T_BYTE);
- assert(o->can_be_constant(), "method data oops should be tenured");
- const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
- return arr;
+ ciKlass* klass = ciArrayKlass::make(ciType::make(bt));
+ assert(o->can_be_constant(), "should be tenured");
+ return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
+ } else if (o->is_cpcache()) {
+ // Treat much like a objArray, like below, but fake the type...
+ const BasicType bt = T_OBJECT;
+ const Type* etype = get_const_basic_type(bt);
+ const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS);
+ ciKlass* klass = ciArrayKlass::make(ciType::make(bt));
+ assert(o->can_be_constant(), "should be tenured");
+ return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
} else {
assert(o->is_java_object(), "must be java language object");
assert(!o->is_null_object(), "null object not yet handled here.");
- ciKlass *klass = o->klass();
+ ciKlass* klass = o->klass();
if (klass->is_instance_klass()) {
// Element is an instance
if (require_constant) {
@@ -2494,8 +2643,7 @@
return TypeInstPtr::make(o);
} else if (klass->is_obj_array_klass()) {
// Element is an object array. Recursively call ourself.
- const Type *etype =
- TypeOopPtr::make_from_klass_raw(klass->as_obj_array_klass()->element_klass());
+ const Type *etype = make_from_klass_raw(klass->as_obj_array_klass()->element_klass());
const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length()));
// We used to pass NotNull in here, asserting that the sub-arrays
// are all not-null. This is not true in generally, as code can
@@ -2505,12 +2653,10 @@
} else if (!o->should_be_constant()) {
return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0);
}
- const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
- return arr;
+ return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
} else if (klass->is_type_array_klass()) {
// Element is an typeArray
- const Type* etype =
- (Type*)get_const_basic_type(klass->as_type_array_klass()->element_type());
+ const Type* etype = get_const_basic_type(klass->as_type_array_klass()->element_type());
const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length()));
// We used to pass NotNull in here, asserting that the array pointer
// is not-null. That was not true in general.
@@ -2519,12 +2665,11 @@
} else if (!o->should_be_constant()) {
return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0);
}
- const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
- return arr;
+ return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
}
}
- ShouldNotReachHere();
+ fatal("unhandled object type");
return NULL;
}
@@ -4140,7 +4285,7 @@
// Print a 'flattened' signature
static const char * const flat_type_msg[Type::lastype] = {
"bad","control","top","int","long","_", "narrowoop",
- "tuple:", "array:",
+ "tuple:", "array:", "vectors:", "vectord:", "vectorx:", "vectory:",
"ptr", "rawptr", "ptr", "ptr", "ptr", "ptr",
"func", "abIO", "return_address", "mem",
"float_top", "ftcon:", "flt",
--- a/hotspot/src/share/vm/opto/type.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/type.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -51,6 +51,11 @@
class TypeNarrowOop;
class TypeAry;
class TypeTuple;
+class TypeVect;
+class TypeVectS;
+class TypeVectD;
+class TypeVectX;
+class TypeVectY;
class TypePtr;
class TypeRawPtr;
class TypeOopPtr;
@@ -78,6 +83,10 @@
Tuple, // Method signature or object layout
Array, // Array types
+ VectorS, // 32bit Vector types
+ VectorD, // 64bit Vector types
+ VectorX, // 128bit Vector types
+ VectorY, // 256bit Vector types
AnyPtr, // Any old raw, klass, inst, or array pointer
RawPtr, // Raw (non-oop) pointers
@@ -222,6 +231,8 @@
const TypeF *isa_float_constant() const; // Returns NULL if not a FloatCon
const TypeTuple *is_tuple() const; // Collection of fields, NOT a pointer
const TypeAry *is_ary() const; // Array, NOT array pointer
+ const TypeVect *is_vect() const; // Vector
+ const TypeVect *isa_vect() const; // Returns NULL if not a Vector
const TypePtr *is_ptr() const; // Asserts it is a ptr type
const TypePtr *isa_ptr() const; // Returns NULL if not ptr type
const TypeRawPtr *isa_rawptr() const; // NOT Java oop
@@ -574,6 +585,69 @@
#endif
};
+//------------------------------TypeVect---------------------------------------
+// Class of Vector Types
+class TypeVect : public Type {
+ const Type* _elem; // Vector's element type
+ const uint _length; // Elements in vector (power of 2)
+
+protected:
+ TypeVect(TYPES t, const Type* elem, uint length) : Type(t),
+ _elem(elem), _length(length) {}
+
+public:
+ const Type* element_type() const { return _elem; }
+ BasicType element_basic_type() const { return _elem->array_element_basic_type(); }
+ uint length() const { return _length; }
+ uint length_in_bytes() const {
+ return _length * type2aelembytes(element_basic_type());
+ }
+
+ virtual bool eq(const Type *t) const;
+ virtual int hash() const; // Type specific hashing
+ virtual bool singleton(void) const; // TRUE if type is a singleton
+ virtual bool empty(void) const; // TRUE if type is vacuous
+
+ static const TypeVect *make(const BasicType elem_bt, uint length) {
+ // Use bottom primitive type.
+ return make(get_const_basic_type(elem_bt), length);
+ }
+ // Used directly by Replicate nodes to construct singleton vector.
+ static const TypeVect *make(const Type* elem, uint length);
+
+ virtual const Type *xmeet( const Type *t) const;
+ virtual const Type *xdual() const; // Compute dual right now.
+
+ static const TypeVect *VECTS;
+ static const TypeVect *VECTD;
+ static const TypeVect *VECTX;
+ static const TypeVect *VECTY;
+
+#ifndef PRODUCT
+ virtual void dump2(Dict &d, uint, outputStream *st) const; // Specialized per-Type dumping
+#endif
+};
+
+class TypeVectS : public TypeVect {
+ friend class TypeVect;
+ TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {}
+};
+
+class TypeVectD : public TypeVect {
+ friend class TypeVect;
+ TypeVectD(const Type* elem, uint length) : TypeVect(VectorD, elem, length) {}
+};
+
+class TypeVectX : public TypeVect {
+ friend class TypeVect;
+ TypeVectX(const Type* elem, uint length) : TypeVect(VectorX, elem, length) {}
+};
+
+class TypeVectY : public TypeVect {
+ friend class TypeVect;
+ TypeVectY(const Type* elem, uint length) : TypeVect(VectorY, elem, length) {}
+};
+
//------------------------------TypePtr----------------------------------------
// Class of machine Pointer Types: raw data, instances or arrays.
// If the _base enum is AnyPtr, then this refers to all of the above.
@@ -1113,6 +1187,15 @@
return (TypeAry*)this;
}
+inline const TypeVect *Type::is_vect() const {
+ assert( _base >= VectorS && _base <= VectorY, "Not a Vector" );
+ return (TypeVect*)this;
+}
+
+inline const TypeVect *Type::isa_vect() const {
+ return (_base >= VectorS && _base <= VectorY) ? (TypeVect*)this : NULL;
+}
+
inline const TypePtr *Type::is_ptr() const {
// AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer");
--- a/hotspot/src/share/vm/opto/vectornode.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/vectornode.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -28,147 +28,16 @@
//------------------------------VectorNode--------------------------------------
-// Return vector type for an element type and vector length.
-const Type* VectorNode::vect_type(BasicType elt_bt, uint len) {
- assert(len <= VectorNode::max_vlen(elt_bt), "len in range");
- switch(elt_bt) {
- case T_BOOLEAN:
- case T_BYTE:
- switch(len) {
- case 2: return TypeInt::CHAR;
- case 4: return TypeInt::INT;
- case 8: return TypeLong::LONG;
- }
- break;
- case T_CHAR:
- case T_SHORT:
- switch(len) {
- case 2: return TypeInt::INT;
- case 4: return TypeLong::LONG;
- }
- break;
- case T_INT:
- switch(len) {
- case 2: return TypeLong::LONG;
- }
- break;
- case T_LONG:
- break;
- case T_FLOAT:
- switch(len) {
- case 2: return Type::DOUBLE;
- }
- break;
- case T_DOUBLE:
- break;
- }
- ShouldNotReachHere();
- return NULL;
-}
-
-// Scalar promotion
-VectorNode* VectorNode::scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t) {
- BasicType bt = opd_t->array_element_basic_type();
- assert(vlen <= VectorNode::max_vlen(bt), "vlen in range");
- switch (bt) {
- case T_BOOLEAN:
- case T_BYTE:
- if (vlen == 16) return new (C, 2) Replicate16BNode(s);
- if (vlen == 8) return new (C, 2) Replicate8BNode(s);
- if (vlen == 4) return new (C, 2) Replicate4BNode(s);
- break;
- case T_CHAR:
- if (vlen == 8) return new (C, 2) Replicate8CNode(s);
- if (vlen == 4) return new (C, 2) Replicate4CNode(s);
- if (vlen == 2) return new (C, 2) Replicate2CNode(s);
- break;
- case T_SHORT:
- if (vlen == 8) return new (C, 2) Replicate8SNode(s);
- if (vlen == 4) return new (C, 2) Replicate4SNode(s);
- if (vlen == 2) return new (C, 2) Replicate2SNode(s);
- break;
- case T_INT:
- if (vlen == 4) return new (C, 2) Replicate4INode(s);
- if (vlen == 2) return new (C, 2) Replicate2INode(s);
- break;
- case T_LONG:
- if (vlen == 2) return new (C, 2) Replicate2LNode(s);
- break;
- case T_FLOAT:
- if (vlen == 4) return new (C, 2) Replicate4FNode(s);
- if (vlen == 2) return new (C, 2) Replicate2FNode(s);
- break;
- case T_DOUBLE:
- if (vlen == 2) return new (C, 2) Replicate2DNode(s);
- break;
- }
- ShouldNotReachHere();
- return NULL;
-}
-
-// Return initial Pack node. Additional operands added with add_opd() calls.
-PackNode* PackNode::make(Compile* C, Node* s, const Type* opd_t) {
- BasicType bt = opd_t->array_element_basic_type();
- switch (bt) {
- case T_BOOLEAN:
- case T_BYTE:
- return new (C, 2) PackBNode(s);
- case T_CHAR:
- return new (C, 2) PackCNode(s);
- case T_SHORT:
- return new (C, 2) PackSNode(s);
- case T_INT:
- return new (C, 2) PackINode(s);
- case T_LONG:
- return new (C, 2) PackLNode(s);
- case T_FLOAT:
- return new (C, 2) PackFNode(s);
- case T_DOUBLE:
- return new (C, 2) PackDNode(s);
- }
- ShouldNotReachHere();
- return NULL;
-}
-
-// Create a binary tree form for Packs. [lo, hi) (half-open) range
-Node* PackNode::binaryTreePack(Compile* C, int lo, int hi) {
- int ct = hi - lo;
- assert(is_power_of_2(ct), "power of 2");
- int mid = lo + ct/2;
- Node* n1 = ct == 2 ? in(lo) : binaryTreePack(C, lo, mid);
- Node* n2 = ct == 2 ? in(lo+1) : binaryTreePack(C, mid, hi );
- int rslt_bsize = ct * type2aelembytes(elt_basic_type());
- if (bottom_type()->is_floatingpoint()) {
- switch (rslt_bsize) {
- case 8: return new (C, 3) PackFNode(n1, n2);
- case 16: return new (C, 3) PackDNode(n1, n2);
- }
- } else {
- assert(bottom_type()->isa_int() || bottom_type()->isa_long(), "int or long");
- switch (rslt_bsize) {
- case 2: return new (C, 3) Pack2x1BNode(n1, n2);
- case 4: return new (C, 3) Pack2x2BNode(n1, n2);
- case 8: return new (C, 3) PackINode(n1, n2);
- case 16: return new (C, 3) PackLNode(n1, n2);
- }
- }
- ShouldNotReachHere();
- return NULL;
-}
-
// Return the vector operator for the specified scalar operation
-// and vector length. One use is to check if the code generator
+// and vector length. Also used to check if the code generator
// supports the vector operation.
-int VectorNode::opcode(int sopc, uint vlen, const Type* opd_t) {
- BasicType bt = opd_t->array_element_basic_type();
- if (!(is_power_of_2(vlen) && vlen <= max_vlen(bt)))
- return 0; // unimplemented
+int VectorNode::opcode(int sopc, uint vlen, BasicType bt) {
switch (sopc) {
case Op_AddI:
switch (bt) {
case T_BOOLEAN:
case T_BYTE: return Op_AddVB;
- case T_CHAR: return Op_AddVC;
+ case T_CHAR:
case T_SHORT: return Op_AddVS;
case T_INT: return Op_AddVI;
}
@@ -186,7 +55,7 @@
switch (bt) {
case T_BOOLEAN:
case T_BYTE: return Op_SubVB;
- case T_CHAR: return Op_SubVC;
+ case T_CHAR:
case T_SHORT: return Op_SubVS;
case T_INT: return Op_SubVI;
}
@@ -216,18 +85,18 @@
switch (bt) {
case T_BOOLEAN:
case T_BYTE: return Op_LShiftVB;
- case T_CHAR: return Op_LShiftVC;
+ case T_CHAR:
case T_SHORT: return Op_LShiftVS;
case T_INT: return Op_LShiftVI;
}
ShouldNotReachHere();
- case Op_URShiftI:
+ case Op_RShiftI:
switch (bt) {
case T_BOOLEAN:
- case T_BYTE: return Op_URShiftVB;
- case T_CHAR: return Op_URShiftVC;
- case T_SHORT: return Op_URShiftVS;
- case T_INT: return Op_URShiftVI;
+ case T_BYTE: return Op_RShiftVB;
+ case T_CHAR:
+ case T_SHORT: return Op_RShiftVS;
+ case T_INT: return Op_RShiftVI;
}
ShouldNotReachHere();
case Op_AndI:
@@ -241,13 +110,14 @@
return Op_XorV;
case Op_LoadB:
+ case Op_LoadUB:
case Op_LoadUS:
case Op_LoadS:
case Op_LoadI:
case Op_LoadL:
case Op_LoadF:
case Op_LoadD:
- return VectorLoadNode::opcode(sopc, vlen);
+ return Op_LoadVector;
case Op_StoreB:
case Op_StoreC:
@@ -255,211 +125,170 @@
case Op_StoreL:
case Op_StoreF:
case Op_StoreD:
- return VectorStoreNode::opcode(sopc, vlen);
- }
- return 0; // Unimplemented
-}
-
-// Helper for above.
-int VectorLoadNode::opcode(int sopc, uint vlen) {
- switch (sopc) {
- case Op_LoadB:
- switch (vlen) {
- case 2: return 0; // Unimplemented
- case 4: return Op_Load4B;
- case 8: return Op_Load8B;
- case 16: return Op_Load16B;
- }
- break;
- case Op_LoadUS:
- switch (vlen) {
- case 2: return Op_Load2C;
- case 4: return Op_Load4C;
- case 8: return Op_Load8C;
- }
- break;
- case Op_LoadS:
- switch (vlen) {
- case 2: return Op_Load2S;
- case 4: return Op_Load4S;
- case 8: return Op_Load8S;
- }
- break;
- case Op_LoadI:
- switch (vlen) {
- case 2: return Op_Load2I;
- case 4: return Op_Load4I;
- }
- break;
- case Op_LoadL:
- if (vlen == 2) return Op_Load2L;
- break;
- case Op_LoadF:
- switch (vlen) {
- case 2: return Op_Load2F;
- case 4: return Op_Load4F;
- }
- break;
- case Op_LoadD:
- if (vlen == 2) return Op_Load2D;
- break;
+ return Op_StoreVector;
}
return 0; // Unimplemented
}
-// Helper for above
-int VectorStoreNode::opcode(int sopc, uint vlen) {
- switch (sopc) {
- case Op_StoreB:
- switch (vlen) {
- case 2: return 0; // Unimplemented
- case 4: return Op_Store4B;
- case 8: return Op_Store8B;
- case 16: return Op_Store16B;
- }
- break;
- case Op_StoreC:
- switch (vlen) {
- case 2: return Op_Store2C;
- case 4: return Op_Store4C;
- case 8: return Op_Store8C;
- }
- break;
- case Op_StoreI:
- switch (vlen) {
- case 2: return Op_Store2I;
- case 4: return Op_Store4I;
- }
- break;
- case Op_StoreL:
- if (vlen == 2) return Op_Store2L;
- break;
- case Op_StoreF:
- switch (vlen) {
- case 2: return Op_Store2F;
- case 4: return Op_Store4F;
- }
- break;
- case Op_StoreD:
- if (vlen == 2) return Op_Store2D;
- break;
+bool VectorNode::implemented(int opc, uint vlen, BasicType bt) {
+ if (is_java_primitive(bt) &&
+ (vlen > 1) && is_power_of_2(vlen) &&
+ Matcher::vector_size_supported(bt, vlen)) {
+ int vopc = VectorNode::opcode(opc, vlen, bt);
+ return vopc > 0 && Matcher::has_match_rule(vopc);
}
- return 0; // Unimplemented
+ return false;
}
// Return the vector version of a scalar operation node.
-VectorNode* VectorNode::make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* opd_t) {
- int vopc = opcode(sopc, vlen, opd_t);
+VectorNode* VectorNode::make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt) {
+ const TypeVect* vt = TypeVect::make(bt, vlen);
+ int vopc = VectorNode::opcode(opc, vlen, bt);
switch (vopc) {
- case Op_AddVB: return new (C, 3) AddVBNode(n1, n2, vlen);
- case Op_AddVC: return new (C, 3) AddVCNode(n1, n2, vlen);
- case Op_AddVS: return new (C, 3) AddVSNode(n1, n2, vlen);
- case Op_AddVI: return new (C, 3) AddVINode(n1, n2, vlen);
- case Op_AddVL: return new (C, 3) AddVLNode(n1, n2, vlen);
- case Op_AddVF: return new (C, 3) AddVFNode(n1, n2, vlen);
- case Op_AddVD: return new (C, 3) AddVDNode(n1, n2, vlen);
+ case Op_AddVB: return new (C, 3) AddVBNode(n1, n2, vt);
+ case Op_AddVS: return new (C, 3) AddVSNode(n1, n2, vt);
+ case Op_AddVI: return new (C, 3) AddVINode(n1, n2, vt);
+ case Op_AddVL: return new (C, 3) AddVLNode(n1, n2, vt);
+ case Op_AddVF: return new (C, 3) AddVFNode(n1, n2, vt);
+ case Op_AddVD: return new (C, 3) AddVDNode(n1, n2, vt);
+
+ case Op_SubVB: return new (C, 3) SubVBNode(n1, n2, vt);
+ case Op_SubVS: return new (C, 3) SubVSNode(n1, n2, vt);
+ case Op_SubVI: return new (C, 3) SubVINode(n1, n2, vt);
+ case Op_SubVL: return new (C, 3) SubVLNode(n1, n2, vt);
+ case Op_SubVF: return new (C, 3) SubVFNode(n1, n2, vt);
+ case Op_SubVD: return new (C, 3) SubVDNode(n1, n2, vt);
- case Op_SubVB: return new (C, 3) SubVBNode(n1, n2, vlen);
- case Op_SubVC: return new (C, 3) SubVCNode(n1, n2, vlen);
- case Op_SubVS: return new (C, 3) SubVSNode(n1, n2, vlen);
- case Op_SubVI: return new (C, 3) SubVINode(n1, n2, vlen);
- case Op_SubVL: return new (C, 3) SubVLNode(n1, n2, vlen);
- case Op_SubVF: return new (C, 3) SubVFNode(n1, n2, vlen);
- case Op_SubVD: return new (C, 3) SubVDNode(n1, n2, vlen);
+ case Op_MulVF: return new (C, 3) MulVFNode(n1, n2, vt);
+ case Op_MulVD: return new (C, 3) MulVDNode(n1, n2, vt);
+
+ case Op_DivVF: return new (C, 3) DivVFNode(n1, n2, vt);
+ case Op_DivVD: return new (C, 3) DivVDNode(n1, n2, vt);
+
+ case Op_LShiftVB: return new (C, 3) LShiftVBNode(n1, n2, vt);
+ case Op_LShiftVS: return new (C, 3) LShiftVSNode(n1, n2, vt);
+ case Op_LShiftVI: return new (C, 3) LShiftVINode(n1, n2, vt);
+
+ case Op_RShiftVB: return new (C, 3) RShiftVBNode(n1, n2, vt);
+ case Op_RShiftVS: return new (C, 3) RShiftVSNode(n1, n2, vt);
+ case Op_RShiftVI: return new (C, 3) RShiftVINode(n1, n2, vt);
- case Op_MulVF: return new (C, 3) MulVFNode(n1, n2, vlen);
- case Op_MulVD: return new (C, 3) MulVDNode(n1, n2, vlen);
+ case Op_AndV: return new (C, 3) AndVNode(n1, n2, vt);
+ case Op_OrV: return new (C, 3) OrVNode (n1, n2, vt);
+ case Op_XorV: return new (C, 3) XorVNode(n1, n2, vt);
+ }
+ ShouldNotReachHere();
+ return NULL;
- case Op_DivVF: return new (C, 3) DivVFNode(n1, n2, vlen);
- case Op_DivVD: return new (C, 3) DivVDNode(n1, n2, vlen);
+}
- case Op_LShiftVB: return new (C, 3) LShiftVBNode(n1, n2, vlen);
- case Op_LShiftVC: return new (C, 3) LShiftVCNode(n1, n2, vlen);
- case Op_LShiftVS: return new (C, 3) LShiftVSNode(n1, n2, vlen);
- case Op_LShiftVI: return new (C, 3) LShiftVINode(n1, n2, vlen);
-
- case Op_URShiftVB: return new (C, 3) URShiftVBNode(n1, n2, vlen);
- case Op_URShiftVC: return new (C, 3) URShiftVCNode(n1, n2, vlen);
- case Op_URShiftVS: return new (C, 3) URShiftVSNode(n1, n2, vlen);
- case Op_URShiftVI: return new (C, 3) URShiftVINode(n1, n2, vlen);
-
- case Op_AndV: return new (C, 3) AndVNode(n1, n2, vlen, opd_t->array_element_basic_type());
- case Op_OrV: return new (C, 3) OrVNode (n1, n2, vlen, opd_t->array_element_basic_type());
- case Op_XorV: return new (C, 3) XorVNode(n1, n2, vlen, opd_t->array_element_basic_type());
+// Scalar promotion
+VectorNode* VectorNode::scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t) {
+ BasicType bt = opd_t->array_element_basic_type();
+ const TypeVect* vt = opd_t->singleton() ? TypeVect::make(opd_t, vlen)
+ : TypeVect::make(bt, vlen);
+ switch (bt) {
+ case T_BOOLEAN:
+ case T_BYTE:
+ return new (C, 2) ReplicateBNode(s, vt);
+ case T_CHAR:
+ case T_SHORT:
+ return new (C, 2) ReplicateSNode(s, vt);
+ case T_INT:
+ return new (C, 2) ReplicateINode(s, vt);
+ case T_LONG:
+ return new (C, 2) ReplicateLNode(s, vt);
+ case T_FLOAT:
+ return new (C, 2) ReplicateFNode(s, vt);
+ case T_DOUBLE:
+ return new (C, 2) ReplicateDNode(s, vt);
}
ShouldNotReachHere();
return NULL;
}
-// Return the vector version of a scalar load node.
-VectorLoadNode* VectorLoadNode::make(Compile* C, int opc, Node* ctl, Node* mem,
- Node* adr, const TypePtr* atyp, uint vlen) {
- int vopc = opcode(opc, vlen);
-
- switch(vopc) {
- case Op_Load16B: return new (C, 3) Load16BNode(ctl, mem, adr, atyp);
- case Op_Load8B: return new (C, 3) Load8BNode(ctl, mem, adr, atyp);
- case Op_Load4B: return new (C, 3) Load4BNode(ctl, mem, adr, atyp);
-
- case Op_Load8C: return new (C, 3) Load8CNode(ctl, mem, adr, atyp);
- case Op_Load4C: return new (C, 3) Load4CNode(ctl, mem, adr, atyp);
- case Op_Load2C: return new (C, 3) Load2CNode(ctl, mem, adr, atyp);
-
- case Op_Load8S: return new (C, 3) Load8SNode(ctl, mem, adr, atyp);
- case Op_Load4S: return new (C, 3) Load4SNode(ctl, mem, adr, atyp);
- case Op_Load2S: return new (C, 3) Load2SNode(ctl, mem, adr, atyp);
-
- case Op_Load4I: return new (C, 3) Load4INode(ctl, mem, adr, atyp);
- case Op_Load2I: return new (C, 3) Load2INode(ctl, mem, adr, atyp);
-
- case Op_Load2L: return new (C, 3) Load2LNode(ctl, mem, adr, atyp);
-
- case Op_Load4F: return new (C, 3) Load4FNode(ctl, mem, adr, atyp);
- case Op_Load2F: return new (C, 3) Load2FNode(ctl, mem, adr, atyp);
-
- case Op_Load2D: return new (C, 3) Load2DNode(ctl, mem, adr, atyp);
+// Return initial Pack node. Additional operands added with add_opd() calls.
+PackNode* PackNode::make(Compile* C, Node* s, uint vlen, BasicType bt) {
+ const TypeVect* vt = TypeVect::make(bt, vlen);
+ switch (bt) {
+ case T_BOOLEAN:
+ case T_BYTE:
+ return new (C, vlen+1) PackBNode(s, vt);
+ case T_CHAR:
+ case T_SHORT:
+ return new (C, vlen+1) PackSNode(s, vt);
+ case T_INT:
+ return new (C, vlen+1) PackINode(s, vt);
+ case T_LONG:
+ return new (C, vlen+1) PackLNode(s, vt);
+ case T_FLOAT:
+ return new (C, vlen+1) PackFNode(s, vt);
+ case T_DOUBLE:
+ return new (C, vlen+1) PackDNode(s, vt);
}
ShouldNotReachHere();
return NULL;
}
-// Return the vector version of a scalar store node.
-VectorStoreNode* VectorStoreNode::make(Compile* C, int opc, Node* ctl, Node* mem,
- Node* adr, const TypePtr* atyp, Node* val,
- uint vlen) {
- int vopc = opcode(opc, vlen);
+// Create a binary tree form for Packs. [lo, hi) (half-open) range
+Node* PackNode::binaryTreePack(Compile* C, int lo, int hi) {
+ int ct = hi - lo;
+ assert(is_power_of_2(ct), "power of 2");
+ if (ct == 2) {
+ PackNode* pk = PackNode::make(C, in(lo), 2, vect_type()->element_basic_type());
+ pk->add_opd(1, in(lo+1));
+ return pk;
- switch(vopc) {
- case Op_Store16B: return new (C, 4) Store16BNode(ctl, mem, adr, atyp, val);
- case Op_Store8B: return new (C, 4) Store8BNode(ctl, mem, adr, atyp, val);
- case Op_Store4B: return new (C, 4) Store4BNode(ctl, mem, adr, atyp, val);
+ } else {
+ int mid = lo + ct/2;
+ Node* n1 = binaryTreePack(C, lo, mid);
+ Node* n2 = binaryTreePack(C, mid, hi );
- case Op_Store8C: return new (C, 4) Store8CNode(ctl, mem, adr, atyp, val);
- case Op_Store4C: return new (C, 4) Store4CNode(ctl, mem, adr, atyp, val);
- case Op_Store2C: return new (C, 4) Store2CNode(ctl, mem, adr, atyp, val);
-
- case Op_Store4I: return new (C, 4) Store4INode(ctl, mem, adr, atyp, val);
- case Op_Store2I: return new (C, 4) Store2INode(ctl, mem, adr, atyp, val);
-
- case Op_Store2L: return new (C, 4) Store2LNode(ctl, mem, adr, atyp, val);
-
- case Op_Store4F: return new (C, 4) Store4FNode(ctl, mem, adr, atyp, val);
- case Op_Store2F: return new (C, 4) Store2FNode(ctl, mem, adr, atyp, val);
-
- case Op_Store2D: return new (C, 4) Store2DNode(ctl, mem, adr, atyp, val);
+ BasicType bt = vect_type()->element_basic_type();
+ switch (bt) {
+ case T_BOOLEAN:
+ case T_BYTE:
+ return new (C, 3) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
+ case T_CHAR:
+ case T_SHORT:
+ return new (C, 3) PackINode(n1, n2, TypeVect::make(T_INT, 2));
+ case T_INT:
+ return new (C, 3) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
+ case T_LONG:
+ return new (C, 3) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
+ case T_FLOAT:
+ return new (C, 3) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+ case T_DOUBLE:
+ return new (C, 3) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+ }
+ ShouldNotReachHere();
}
- ShouldNotReachHere();
return NULL;
}
+// Return the vector version of a scalar load node.
+LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
+ Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {
+ const TypeVect* vt = TypeVect::make(bt, vlen);
+ return new (C, 3) LoadVectorNode(ctl, mem, adr, atyp, vt);
+ return NULL;
+}
+
+// Return the vector version of a scalar store node.
+StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
+ Node* adr, const TypePtr* atyp, Node* val,
+ uint vlen) {
+ return new (C, 4) StoreVectorNode(ctl, mem, adr, atyp, val);
+}
+
// Extract a scalar element of vector.
-Node* ExtractNode::make(Compile* C, Node* v, uint position, const Type* opd_t) {
- BasicType bt = opd_t->array_element_basic_type();
- assert(position < VectorNode::max_vlen(bt), "pos in range");
+Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) {
+ assert((int)position < Matcher::max_vector_size(bt), "pos in range");
ConINode* pos = ConINode::make(C, (int)position);
switch (bt) {
case T_BOOLEAN:
+ return new (C, 3) ExtractUBNode(v, pos);
case T_BYTE:
return new (C, 3) ExtractBNode(v, pos);
case T_CHAR:
@@ -478,3 +307,4 @@
ShouldNotReachHere();
return NULL;
}
+
--- a/hotspot/src/share/vm/opto/vectornode.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/opto/vectornode.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -31,48 +31,32 @@
//------------------------------VectorNode--------------------------------------
// Vector Operation
-class VectorNode : public Node {
- virtual uint size_of() const { return sizeof(*this); }
- protected:
- uint _length; // vector length
- virtual BasicType elt_basic_type() const = 0; // Vector element basic type
+class VectorNode : public TypeNode {
+ public:
- static const Type* vect_type(BasicType elt_bt, uint len);
- static const Type* vect_type(const Type* elt_type, uint len) {
- return vect_type(elt_type->array_element_basic_type(), len);
+ VectorNode(Node* n1, const TypeVect* vt) : TypeNode(vt, 2) {
+ init_class_id(Class_Vector);
+ init_req(1, n1);
+ }
+ VectorNode(Node* n1, Node* n2, const TypeVect* vt) : TypeNode(vt, 3) {
+ init_class_id(Class_Vector);
+ init_req(1, n1);
+ init_req(2, n2);
}
- public:
- friend class VectorLoadNode; // For vect_type
- friend class VectorStoreNode; // ditto.
+ const TypeVect* vect_type() const { return type()->is_vect(); }
+ uint length() const { return vect_type()->length(); } // Vector length
- VectorNode(Node* n1, uint vlen) : Node(NULL, n1), _length(vlen) {
- init_class_id(Class_Vector);
- }
- VectorNode(Node* n1, Node* n2, uint vlen) : Node(NULL, n1, n2), _length(vlen) {
- init_class_id(Class_Vector);
- }
virtual int Opcode() const;
- uint length() const { return _length; } // Vector length
-
- static uint max_vlen(BasicType bt) { // max vector length
- return (uint)(Matcher::vector_width_in_bytes() / type2aelembytes(bt));
- }
-
- // Element and vector type
- const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); }
- const Type* vect_type() const { return vect_type(elt_basic_type(), length()); }
-
- virtual const Type *bottom_type() const { return vect_type(); }
- virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); }
-
- // Vector opcode from scalar opcode
- static int opcode(int sopc, uint vlen, const Type* opd_t);
+ virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); }
static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t);
- static VectorNode* make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* elt_t);
+ static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt);
+
+ static int opcode(int opc, uint vlen, BasicType bt);
+ static bool implemented(int opc, uint vlen, BasicType bt);
};
@@ -81,981 +65,393 @@
//------------------------------AddVBNode---------------------------------------
// Vector add byte
class AddVBNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
public:
- AddVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
- virtual int Opcode() const;
-};
-
-//------------------------------AddVCNode---------------------------------------
-// Vector add char
-class AddVCNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- AddVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------AddVSNode---------------------------------------
-// Vector add short
+// Vector add char/short
class AddVSNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
public:
- AddVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------AddVINode---------------------------------------
// Vector add int
class AddVINode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
public:
- AddVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ AddVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------AddVLNode---------------------------------------
// Vector add long
class AddVLNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_LONG; }
public:
- AddVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ AddVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------AddVFNode---------------------------------------
// Vector add float
class AddVFNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
public:
- AddVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ AddVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------AddVDNode---------------------------------------
// Vector add double
class AddVDNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
public:
- AddVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ AddVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------SubVBNode---------------------------------------
// Vector subtract byte
class SubVBNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
public:
- SubVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
- virtual int Opcode() const;
-};
-
-//------------------------------SubVCNode---------------------------------------
-// Vector subtract char
-class SubVCNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- SubVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ SubVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------SubVSNode---------------------------------------
// Vector subtract short
class SubVSNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
public:
- SubVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ SubVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------SubVINode---------------------------------------
// Vector subtract int
class SubVINode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
public:
- SubVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ SubVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------SubVLNode---------------------------------------
// Vector subtract long
class SubVLNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_LONG; }
public:
- SubVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ SubVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------SubVFNode---------------------------------------
// Vector subtract float
class SubVFNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
public:
- SubVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ SubVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------SubVDNode---------------------------------------
// Vector subtract double
class SubVDNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
public:
- SubVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ SubVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------MulVFNode---------------------------------------
// Vector multiply float
class MulVFNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
public:
- MulVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ MulVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------MulVDNode---------------------------------------
// Vector multiply double
class MulVDNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
public:
- MulVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------DivVFNode---------------------------------------
// Vector divide float
class DivVFNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
public:
- DivVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ DivVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------DivVDNode---------------------------------------
// Vector Divide double
class DivVDNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
public:
- DivVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ DivVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------LShiftVBNode---------------------------------------
// Vector lshift byte
class LShiftVBNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
public:
- LShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
- virtual int Opcode() const;
-};
-
-//------------------------------LShiftVCNode---------------------------------------
-// Vector lshift chars
-class LShiftVCNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- LShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ LShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------LShiftVSNode---------------------------------------
// Vector lshift shorts
class LShiftVSNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
public:
- LShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ LShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------LShiftVINode---------------------------------------
// Vector lshift ints
class LShiftVINode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
public:
- LShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ LShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------URShiftVBNode---------------------------------------
// Vector urshift bytes
-class URShiftVBNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
+class RShiftVBNode : public VectorNode {
public:
- URShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
- virtual int Opcode() const;
-};
-
-//------------------------------URShiftVCNode---------------------------------------
-// Vector urshift char
-class URShiftVCNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
- URShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ RShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------URShiftVSNode---------------------------------------
// Vector urshift shorts
-class URShiftVSNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
+class RShiftVSNode : public VectorNode {
public:
- URShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ RShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------URShiftVINode---------------------------------------
// Vector urshift ints
-class URShiftVINode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
+class RShiftVINode : public VectorNode {
public:
- URShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
+ RShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------AndVNode---------------------------------------
// Vector and
class AndVNode : public VectorNode {
- protected:
- BasicType _bt;
- virtual BasicType elt_basic_type() const { return _bt; }
public:
- AndVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
+ AndVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------OrVNode---------------------------------------
// Vector or
class OrVNode : public VectorNode {
- protected:
- BasicType _bt;
- virtual BasicType elt_basic_type() const { return _bt; }
public:
- OrVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
+ OrVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
//------------------------------XorVNode---------------------------------------
// Vector xor
class XorVNode : public VectorNode {
- protected:
- BasicType _bt;
- virtual BasicType elt_basic_type() const { return _bt; }
public:
- XorVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
+ XorVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
virtual int Opcode() const;
};
-//================================= M E M O R Y ==================================
-
+//================================= M E M O R Y ===============================
-//------------------------------VectorLoadNode--------------------------------------
-// Vector Load from memory
-class VectorLoadNode : public LoadNode {
- virtual uint size_of() const { return sizeof(*this); }
-
- protected:
- virtual BasicType elt_basic_type() const = 0; // Vector element basic type
- // For use in constructor
- static const Type* vect_type(const Type* elt_type, uint len) {
- return VectorNode::vect_type(elt_type, len);
+//------------------------------LoadVectorNode---------------------------------
+// Load Vector from memory
+class LoadVectorNode : public LoadNode {
+ public:
+ LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt)
+ : LoadNode(c, mem, adr, at, vt) {
+ init_class_id(Class_LoadVector);
}
- public:
- VectorLoadNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *rt)
- : LoadNode(c,mem,adr,at,rt) {
- init_class_id(Class_VectorLoad);
- }
+ const TypeVect* vect_type() const { return type()->is_vect(); }
+ uint length() const { return vect_type()->length(); } // Vector length
+
virtual int Opcode() const;
- virtual uint length() const = 0; // Vector length
-
- // Element and vector type
- const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); }
- const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); }
-
- virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); }
+ virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(memory_size()); }
virtual BasicType memory_type() const { return T_VOID; }
- virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); }
-
- // Vector opcode from scalar opcode
- static int opcode(int sopc, uint vlen);
-
- static VectorLoadNode* make(Compile* C, int opc, Node* ctl, Node* mem,
- Node* adr, const TypePtr* atyp, uint vlen);
-};
-
-//------------------------------Load16BNode--------------------------------------
-// Vector load of 16 bytes (8bits signed) from memory
-class Load16BNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
- Load16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,16)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store16B; }
- virtual uint length() const { return 16; }
-};
-
-//------------------------------Load8BNode--------------------------------------
-// Vector load of 8 bytes (8bits signed) from memory
-class Load8BNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
- Load8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store8B; }
- virtual uint length() const { return 8; }
-};
+ virtual int memory_size() const { return vect_type()->length_in_bytes(); }
-//------------------------------Load4BNode--------------------------------------
-// Vector load of 4 bytes (8bits signed) from memory
-class Load4BNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
- Load4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store4B; }
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Load8CNode--------------------------------------
-// Vector load of 8 chars (16bits unsigned) from memory
-class Load8CNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Load8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store8C; }
- virtual uint length() const { return 8; }
-};
+ virtual int store_Opcode() const { return Op_StoreVector; }
-//------------------------------Load4CNode--------------------------------------
-// Vector load of 4 chars (16bits unsigned) from memory
-class Load4CNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Load4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store4C; }
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Load2CNode--------------------------------------
-// Vector load of 2 chars (16bits unsigned) from memory
-class Load2CNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Load2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store2C; }
- virtual uint length() const { return 2; }
-};
-
-//------------------------------Load8SNode--------------------------------------
-// Vector load of 8 shorts (16bits signed) from memory
-class Load8SNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
- Load8SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store8C; }
- virtual uint length() const { return 8; }
+ static LoadVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem,
+ Node* adr, const TypePtr* atyp, uint vlen, BasicType bt);
};
-//------------------------------Load4SNode--------------------------------------
-// Vector load of 4 shorts (16bits signed) from memory
-class Load4SNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
- Load4SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store4C; }
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Load2SNode--------------------------------------
-// Vector load of 2 shorts (16bits signed) from memory
-class Load2SNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
- Load2SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store2C; }
- virtual uint length() const { return 2; }
-};
-
-//------------------------------Load4INode--------------------------------------
-// Vector load of 4 integers (32bits signed) from memory
-class Load4INode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
- public:
- Load4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store4I; }
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Load2INode--------------------------------------
-// Vector load of 2 integers (32bits signed) from memory
-class Load2INode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
- public:
- Load2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT)
- : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store2I; }
- virtual uint length() const { return 2; }
-};
-
-//------------------------------Load2LNode--------------------------------------
-// Vector load of 2 longs (64bits signed) from memory
-class Load2LNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_LONG; }
+//------------------------------StoreVectorNode--------------------------------
+// Store Vector to memory
+class StoreVectorNode : public StoreNode {
public:
- Load2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong *tl = TypeLong::LONG)
- : VectorLoadNode(c,mem,adr,at,vect_type(tl,2)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store2L; }
- virtual uint length() const { return 2; }
-};
-
-//------------------------------Load4FNode--------------------------------------
-// Vector load of 4 floats (32bits) from memory
-class Load4FNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
- Load4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT)
- : VectorLoadNode(c,mem,adr,at,vect_type(t,4)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store4F; }
- virtual uint length() const { return 4; }
-};
+ StoreVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
+ : StoreNode(c, mem, adr, at, val) {
+ assert(val->is_Vector() || val->is_LoadVector(), "sanity");
+ init_class_id(Class_StoreVector);
+ }
-//------------------------------Load2FNode--------------------------------------
-// Vector load of 2 floats (32bits) from memory
-class Load2FNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
- Load2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT)
- : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store2F; }
- virtual uint length() const { return 2; }
-};
+ const TypeVect* vect_type() const { return in(MemNode::ValueIn)->bottom_type()->is_vect(); }
+ uint length() const { return vect_type()->length(); } // Vector length
-//------------------------------Load2DNode--------------------------------------
-// Vector load of 2 doubles (64bits) from memory
-class Load2DNode : public VectorLoadNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
- public:
- Load2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::DOUBLE)
- : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {}
- virtual int Opcode() const;
- virtual int store_Opcode() const { return Op_Store2D; }
- virtual uint length() const { return 2; }
-};
-
-
-//------------------------------VectorStoreNode--------------------------------------
-// Vector Store to memory
-class VectorStoreNode : public StoreNode {
- virtual uint size_of() const { return sizeof(*this); }
-
- protected:
- virtual BasicType elt_basic_type() const = 0; // Vector element basic type
-
- public:
- VectorStoreNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : StoreNode(c,mem,adr,at,val) {
- init_class_id(Class_VectorStore);
- }
virtual int Opcode() const;
- virtual uint length() const = 0; // Vector length
-
- // Element and vector type
- const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); }
- const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); }
+ virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(memory_size()); }
+ virtual BasicType memory_type() const { return T_VOID; }
+ virtual int memory_size() const { return vect_type()->length_in_bytes(); }
- virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); }
- virtual BasicType memory_type() const { return T_VOID; }
- virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); }
-
- // Vector opcode from scalar opcode
- static int opcode(int sopc, uint vlen);
-
- static VectorStoreNode* make(Compile* C, int opc, Node* ctl, Node* mem,
+ static StoreVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem,
Node* adr, const TypePtr* atyp, Node* val,
uint vlen);
};
-//------------------------------Store16BNode--------------------------------------
-// Vector store of 16 bytes (8bits signed) to memory
-class Store16BNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
- Store16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 16; }
-};
+
+//=========================Promote_Scalar_to_Vector============================
-//------------------------------Store8BNode--------------------------------------
-// Vector store of 8 bytes (8bits signed) to memory
-class Store8BNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
+//------------------------------ReplicateBNode---------------------------------
+// Replicate byte scalar to be vector
+class ReplicateBNode : public VectorNode {
public:
- Store8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 8; }
-};
-
-//------------------------------Store4BNode--------------------------------------
-// Vector store of 4 bytes (8bits signed) to memory
-class Store4BNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
- Store4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
+ ReplicateBNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
virtual int Opcode() const;
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Store8CNode--------------------------------------
-// Vector store of 8 chars (16bits signed/unsigned) to memory
-class Store8CNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Store8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 8; }
-};
-
-//------------------------------Store4CNode--------------------------------------
-// Vector store of 4 chars (16bits signed/unsigned) to memory
-class Store4CNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Store4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Store2CNode--------------------------------------
-// Vector store of 2 chars (16bits signed/unsigned) to memory
-class Store2CNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Store2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 2; }
};
-//------------------------------Store4INode--------------------------------------
-// Vector store of 4 integers (32bits signed) to memory
-class Store4INode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
- public:
- Store4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Store2INode--------------------------------------
-// Vector store of 2 integers (32bits signed) to memory
-class Store2INode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
- public:
- Store2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 2; }
-};
-
-//------------------------------Store2LNode--------------------------------------
-// Vector store of 2 longs (64bits signed) to memory
-class Store2LNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_LONG; }
+//------------------------------ReplicateSNode---------------------------------
+// Replicate short scalar to be vector
+class ReplicateSNode : public VectorNode {
public:
- Store2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 2; }
-};
-
-//------------------------------Store4FNode--------------------------------------
-// Vector store of 4 floats (32bits) to memory
-class Store4FNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
- Store4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 4; }
-};
-
-//------------------------------Store2FNode--------------------------------------
-// Vector store of 2 floats (32bits) to memory
-class Store2FNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
- Store2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 2; }
-};
-
-//------------------------------Store2DNode--------------------------------------
-// Vector store of 2 doubles (64bits) to memory
-class Store2DNode : public VectorStoreNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
- public:
- Store2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
- : VectorStoreNode(c,mem,adr,at,val) {}
- virtual int Opcode() const;
- virtual uint length() const { return 2; }
-};
-
-//=========================Promote_Scalar_to_Vector====================================
-
-//------------------------------Replicate16BNode---------------------------------------
-// Replicate byte scalar to be vector of 16 bytes
-class Replicate16BNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
- Replicate16BNode(Node* in1) : VectorNode(in1, 16) {}
+ ReplicateSNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
virtual int Opcode() const;
};
-//------------------------------Replicate8BNode---------------------------------------
-// Replicate byte scalar to be vector of 8 bytes
-class Replicate8BNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
+//------------------------------ReplicateINode---------------------------------
+// Replicate int scalar to be vector
+class ReplicateINode : public VectorNode {
public:
- Replicate8BNode(Node* in1) : VectorNode(in1, 8) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate4BNode---------------------------------------
-// Replicate byte scalar to be vector of 4 bytes
-class Replicate4BNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
- public:
- Replicate4BNode(Node* in1) : VectorNode(in1, 4) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate8CNode---------------------------------------
-// Replicate char scalar to be vector of 8 chars
-class Replicate8CNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Replicate8CNode(Node* in1) : VectorNode(in1, 8) {}
+ ReplicateINode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
virtual int Opcode() const;
};
-//------------------------------Replicate4CNode---------------------------------------
-// Replicate char scalar to be vector of 4 chars
-class Replicate4CNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Replicate4CNode(Node* in1) : VectorNode(in1, 4) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate2CNode---------------------------------------
-// Replicate char scalar to be vector of 2 chars
-class Replicate2CNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
+//------------------------------ReplicateLNode---------------------------------
+// Replicate long scalar to be vector
+class ReplicateLNode : public VectorNode {
public:
- Replicate2CNode(Node* in1) : VectorNode(in1, 2) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate8SNode---------------------------------------
-// Replicate short scalar to be vector of 8 shorts
-class Replicate8SNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
- Replicate8SNode(Node* in1) : VectorNode(in1, 8) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate4SNode---------------------------------------
-// Replicate short scalar to be vector of 4 shorts
-class Replicate4SNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
- public:
- Replicate4SNode(Node* in1) : VectorNode(in1, 4) {}
+ ReplicateLNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
virtual int Opcode() const;
};
-//------------------------------Replicate2SNode---------------------------------------
-// Replicate short scalar to be vector of 2 shorts
-class Replicate2SNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
+//------------------------------ReplicateFNode---------------------------------
+// Replicate float scalar to be vector
+class ReplicateFNode : public VectorNode {
public:
- Replicate2SNode(Node* in1) : VectorNode(in1, 2) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate4INode---------------------------------------
-// Replicate int scalar to be vector of 4 ints
-class Replicate4INode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
- public:
- Replicate4INode(Node* in1) : VectorNode(in1, 4) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate2INode---------------------------------------
-// Replicate int scalar to be vector of 2 ints
-class Replicate2INode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
- public:
- Replicate2INode(Node* in1) : VectorNode(in1, 2) {}
+ ReplicateFNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
virtual int Opcode() const;
};
-//------------------------------Replicate2LNode---------------------------------------
-// Replicate long scalar to be vector of 2 longs
-class Replicate2LNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_LONG; }
+//------------------------------ReplicateDNode---------------------------------
+// Replicate double scalar to be vector
+class ReplicateDNode : public VectorNode {
public:
- Replicate2LNode(Node* in1) : VectorNode(in1, 2) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate4FNode---------------------------------------
-// Replicate float scalar to be vector of 4 floats
-class Replicate4FNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
- Replicate4FNode(Node* in1) : VectorNode(in1, 4) {}
+ ReplicateDNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
virtual int Opcode() const;
};
-//------------------------------Replicate2FNode---------------------------------------
-// Replicate float scalar to be vector of 2 floats
-class Replicate2FNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
- public:
- Replicate2FNode(Node* in1) : VectorNode(in1, 2) {}
- virtual int Opcode() const;
-};
-
-//------------------------------Replicate2DNode---------------------------------------
-// Replicate double scalar to be vector of 2 doubles
-class Replicate2DNode : public VectorNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
- public:
- Replicate2DNode(Node* in1) : VectorNode(in1, 2) {}
- virtual int Opcode() const;
-};
-
-//========================Pack_Scalars_into_a_Vector==============================
+//========================Pack_Scalars_into_a_Vector===========================
//------------------------------PackNode---------------------------------------
// Pack parent class (not for code generation).
class PackNode : public VectorNode {
public:
- PackNode(Node* in1) : VectorNode(in1, 1) {}
- PackNode(Node* in1, Node* n2) : VectorNode(in1, n2, 2) {}
+ PackNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
+ PackNode(Node* in1, Node* n2, const TypeVect* vt) : VectorNode(in1, n2, vt) {}
virtual int Opcode() const;
- void add_opd(Node* n) {
- add_req(n);
- _length++;
- assert(_length == req() - 1, "vector length matches edge count");
+ void add_opd(uint i, Node* n) {
+ init_req(i+1, n);
}
// Create a binary tree form for Packs. [lo, hi) (half-open) range
Node* binaryTreePack(Compile* C, int lo, int hi);
- static PackNode* make(Compile* C, Node* s, const Type* elt_t);
+ static PackNode* make(Compile* C, Node* s, uint vlen, BasicType bt);
};
//------------------------------PackBNode---------------------------------------
// Pack byte scalars into vector
class PackBNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
public:
- PackBNode(Node* in1) : PackNode(in1) {}
- virtual int Opcode() const;
-};
-
-//------------------------------PackCNode---------------------------------------
-// Pack char scalars into vector
-class PackCNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- PackCNode(Node* in1) : PackNode(in1) {}
+ PackBNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
virtual int Opcode() const;
};
//------------------------------PackSNode---------------------------------------
// Pack short scalars into a vector
class PackSNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_SHORT; }
public:
- PackSNode(Node* in1) : PackNode(in1) {}
+ PackSNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
+ PackSNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
virtual int Opcode() const;
};
//------------------------------PackINode---------------------------------------
// Pack integer scalars into a vector
class PackINode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_INT; }
public:
- PackINode(Node* in1) : PackNode(in1) {}
- PackINode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+ PackINode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
+ PackINode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
virtual int Opcode() const;
};
//------------------------------PackLNode---------------------------------------
// Pack long scalars into a vector
class PackLNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_LONG; }
public:
- PackLNode(Node* in1) : PackNode(in1) {}
- PackLNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+ PackLNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
+ PackLNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
+ virtual int Opcode() const;
+};
+
+//------------------------------Pack2LNode--------------------------------------
+// Pack 2 long scalars into a vector
+class Pack2LNode : public PackNode {
+ public:
+ Pack2LNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
virtual int Opcode() const;
};
//------------------------------PackFNode---------------------------------------
// Pack float scalars into vector
class PackFNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_FLOAT; }
public:
- PackFNode(Node* in1) : PackNode(in1) {}
- PackFNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+ PackFNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
+ PackFNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
virtual int Opcode() const;
};
//------------------------------PackDNode---------------------------------------
// Pack double scalars into a vector
class PackDNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_DOUBLE; }
public:
- PackDNode(Node* in1) : PackNode(in1) {}
- PackDNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
+ PackDNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
+ PackDNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
virtual int Opcode() const;
};
-// The Pack2xN nodes assist code generation. They are created from
-// Pack4C, etc. nodes in final_graph_reshape in the form of a
-// balanced, binary tree.
-
-//------------------------------Pack2x1BNode-----------------------------------------
-// Pack 2 1-byte integers into vector of 2 bytes
-class Pack2x1BNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_BYTE; }
+//------------------------------Pack2DNode--------------------------------------
+// Pack 2 double scalars into a vector
+class Pack2DNode : public PackNode {
public:
- Pack2x1BNode(Node *in1, Node* in2) : PackNode(in1, in2) {}
+ Pack2DNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
virtual int Opcode() const;
- virtual uint ideal_reg() const { return Op_RegI; }
};
-//------------------------------Pack2x2BNode---------------------------------------
-// Pack 2 2-byte integers into vector of 4 bytes
-class Pack2x2BNode : public PackNode {
- protected:
- virtual BasicType elt_basic_type() const { return T_CHAR; }
- public:
- Pack2x2BNode(Node *in1, Node* in2) : PackNode(in1, in2) {}
- virtual int Opcode() const;
- virtual uint ideal_reg() const { return Op_RegI; }
-};
//========================Extract_Scalar_from_Vector===============================
@@ -1069,7 +465,7 @@
virtual int Opcode() const;
uint pos() const { return in(2)->get_int(); }
- static Node* make(Compile* C, Node* v, uint position, const Type* opd_t);
+ static Node* make(Compile* C, Node* v, uint position, BasicType bt);
};
//------------------------------ExtractBNode---------------------------------------
@@ -1082,6 +478,16 @@
virtual uint ideal_reg() const { return Op_RegI; }
};
+//------------------------------ExtractUBNode--------------------------------------
+// Extract a boolean from a vector at position "pos"
+class ExtractUBNode : public ExtractNode {
+ public:
+ ExtractUBNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
+ virtual int Opcode() const;
+ virtual const Type *bottom_type() const { return TypeInt::INT; }
+ virtual uint ideal_reg() const { return Op_RegI; }
+};
+
//------------------------------ExtractCNode---------------------------------------
// Extract a char from a vector at position "pos"
class ExtractCNode : public ExtractNode {
--- a/hotspot/src/share/vm/prims/jni.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
#include "classfile/classLoader.hpp"
#include "classfile/javaClasses.hpp"
#include "classfile/symbolTable.hpp"
@@ -5053,6 +5054,7 @@
run_unit_test(arrayOopDesc::test_max_array_length());
run_unit_test(CollectedHeap::test_is_in());
run_unit_test(QuickSort::test_quick_sort());
+ run_unit_test(AltHashing::test_alt_hash());
tty->print_cr("All internal VM tests passed");
}
}
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -585,7 +585,7 @@
_o = klassOop_if_java_lang_Class(o);
// object size
- _obj_size = _o->size() * wordSize;
+ _obj_size = (jlong)_o->size() * wordSize;
// record the context
_tag_map = tag_map;
--- a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -39,6 +39,10 @@
}
Symbol* fieldDescriptor::generic_signature() const {
+ if (!has_generic_signature()) {
+ return NULL;
+ }
+
int idx = 0;
instanceKlass* ik = instanceKlass::cast(field_holder());
for (AllFieldStream fs(ik); !fs.done(); fs.next()) {
--- a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -100,6 +100,7 @@
bool is_field_access_watched() const { return access_flags().is_field_access_watched(); }
bool is_field_modification_watched() const
{ return access_flags().is_field_modification_watched(); }
+ bool has_generic_signature() const { return access_flags().field_has_generic_signature(); }
void set_is_field_access_watched(const bool value) {
_access_flags.set_is_field_access_watched(value);
--- a/hotspot/src/share/vm/runtime/globals.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -2659,6 +2659,9 @@
product(bool, UseHeavyMonitors, false, \
"use heavyweight instead of lightweight Java monitors") \
\
+ product(bool, PrintStringTableStatistics, false, \
+ "print statistics about the StringTable and SymbolTable") \
+ \
notproduct(bool, PrintSymbolTableSizeHistogram, false, \
"print histogram of the symbol table") \
\
--- a/hotspot/src/share/vm/runtime/init.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/init.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "classfile/symbolTable.hpp"
#include "code/icBuffer.hpp"
#include "gc_interface/collectedHeap.hpp"
#include "interpreter/bytecodes.hpp"
@@ -157,6 +158,10 @@
// Print the collected safepoint statistics.
SafepointSynchronize::print_stat_on_exit();
}
+ if (PrintStringTableStatistics) {
+ SymbolTable::dump(tty);
+ StringTable::dump(tty);
+ }
ostream_exit();
}
}
--- a/hotspot/src/share/vm/runtime/java.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/java.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -660,6 +660,7 @@
}
JDK_Version JDK_Version::_current;
+const char* JDK_Version::_runtime_name;
void JDK_Version::initialize() {
jdk_version_info info;
--- a/hotspot/src/share/vm/runtime/java.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/java.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -74,6 +74,7 @@
private:
static JDK_Version _current;
+ static const char* _runtime_name;
// In this class, we promote the minor version of release to be the
// major version for releases >= 5 in anticipation of the JDK doing the
@@ -181,6 +182,13 @@
void to_string(char* buffer, size_t buflen) const;
+ static const char* runtime_name() {
+ return _runtime_name;
+ }
+ static void set_runtime_name(const char* name) {
+ _runtime_name = name;
+ }
+
// Convenience methods for queries on the current major/minor version
static bool is_jdk12x_version() {
return current().compare_major(2) == 0;
--- a/hotspot/src/share/vm/runtime/reflection.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -829,7 +829,7 @@
java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
java_lang_reflect_Field::set_override(rh(), false);
if (java_lang_reflect_Field::has_signature_field() &&
- fd->generic_signature() != NULL) {
+ fd->has_generic_signature()) {
Symbol* gs = fd->generic_signature();
Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
java_lang_reflect_Field::set_signature(rh(), sig());
--- a/hotspot/src/share/vm/runtime/safepoint.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "classfile/symbolTable.hpp"
#include "classfile/systemDictionary.hpp"
#include "code/codeCache.hpp"
#include "code/icBuffer.hpp"
@@ -526,8 +527,20 @@
CompilationPolicy::policy()->do_safepoint_work();
}
- TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime);
- NMethodSweeper::scan_stacks();
+ {
+ TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime);
+ NMethodSweeper::scan_stacks();
+ }
+
+ if (SymbolTable::needs_rehashing()) {
+ TraceTime t5("rehashing symbol table", TraceSafepointCleanupTime);
+ SymbolTable::rehash_table();
+ }
+
+ if (StringTable::needs_rehashing()) {
+ TraceTime t6("rehashing string table", TraceSafepointCleanupTime);
+ StringTable::rehash_table();
+ }
// rotate log files?
if (UseGCLogFileRotation) {
--- a/hotspot/src/share/vm/runtime/thread.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/thread.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -996,6 +996,29 @@
vmSymbols::void_method_signature(), CHECK);
}
+char java_runtime_name[128] = "";
+
+// extract the JRE name from sun.misc.Version.java_runtime_name
+static const char* get_java_runtime_name(TRAPS) {
+ klassOop k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
+ Handle(), Handle(), CHECK_AND_CLEAR_NULL);
+ fieldDescriptor fd;
+ bool found = k != NULL &&
+ instanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(),
+ vmSymbols::string_signature(), &fd);
+ if (found) {
+ oop name_oop = k->java_mirror()->obj_field(fd.offset());
+ if (name_oop == NULL)
+ return NULL;
+ const char* name = java_lang_String::as_utf8_string(name_oop,
+ java_runtime_name,
+ sizeof(java_runtime_name));
+ return name;
+ } else {
+ return NULL;
+ }
+}
+
// General purpose hook into Java code, run once when the VM is initialized.
// The Java library method itself may be changed independently from the VM.
static void call_postVMInitHook(TRAPS) {
@@ -3352,6 +3375,9 @@
// The VM creates & returns objects of this class. Make sure it's initialized.
initialize_class(vmSymbols::java_lang_Class(), CHECK_0);
call_initializeSystemClass(CHECK_0);
+
+ // get the Java runtime name after java.lang.System is initialized
+ JDK_Version::set_runtime_name(get_java_runtime_name(THREAD));
} else {
warning("java.lang.System not initialized");
}
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1944,14 +1944,12 @@
declare_c2_type(ReverseBytesLNode, Node) \
declare_c2_type(VectorNode, Node) \
declare_c2_type(AddVBNode, VectorNode) \
- declare_c2_type(AddVCNode, VectorNode) \
declare_c2_type(AddVSNode, VectorNode) \
declare_c2_type(AddVINode, VectorNode) \
declare_c2_type(AddVLNode, VectorNode) \
declare_c2_type(AddVFNode, VectorNode) \
declare_c2_type(AddVDNode, VectorNode) \
declare_c2_type(SubVBNode, VectorNode) \
- declare_c2_type(SubVCNode, VectorNode) \
declare_c2_type(SubVSNode, VectorNode) \
declare_c2_type(SubVINode, VectorNode) \
declare_c2_type(SubVLNode, VectorNode) \
@@ -1962,73 +1960,33 @@
declare_c2_type(DivVFNode, VectorNode) \
declare_c2_type(DivVDNode, VectorNode) \
declare_c2_type(LShiftVBNode, VectorNode) \
- declare_c2_type(LShiftVCNode, VectorNode) \
declare_c2_type(LShiftVSNode, VectorNode) \
declare_c2_type(LShiftVINode, VectorNode) \
- declare_c2_type(URShiftVBNode, VectorNode) \
- declare_c2_type(URShiftVCNode, VectorNode) \
- declare_c2_type(URShiftVSNode, VectorNode) \
- declare_c2_type(URShiftVINode, VectorNode) \
+ declare_c2_type(RShiftVBNode, VectorNode) \
+ declare_c2_type(RShiftVSNode, VectorNode) \
+ declare_c2_type(RShiftVINode, VectorNode) \
declare_c2_type(AndVNode, VectorNode) \
declare_c2_type(OrVNode, VectorNode) \
declare_c2_type(XorVNode, VectorNode) \
- declare_c2_type(VectorLoadNode, LoadNode) \
- declare_c2_type(Load16BNode, VectorLoadNode) \
- declare_c2_type(Load8BNode, VectorLoadNode) \
- declare_c2_type(Load4BNode, VectorLoadNode) \
- declare_c2_type(Load8CNode, VectorLoadNode) \
- declare_c2_type(Load4CNode, VectorLoadNode) \
- declare_c2_type(Load2CNode, VectorLoadNode) \
- declare_c2_type(Load8SNode, VectorLoadNode) \
- declare_c2_type(Load4SNode, VectorLoadNode) \
- declare_c2_type(Load2SNode, VectorLoadNode) \
- declare_c2_type(Load4INode, VectorLoadNode) \
- declare_c2_type(Load2INode, VectorLoadNode) \
- declare_c2_type(Load2LNode, VectorLoadNode) \
- declare_c2_type(Load4FNode, VectorLoadNode) \
- declare_c2_type(Load2FNode, VectorLoadNode) \
- declare_c2_type(Load2DNode, VectorLoadNode) \
- declare_c2_type(VectorStoreNode, StoreNode) \
- declare_c2_type(Store16BNode, VectorStoreNode) \
- declare_c2_type(Store8BNode, VectorStoreNode) \
- declare_c2_type(Store4BNode, VectorStoreNode) \
- declare_c2_type(Store8CNode, VectorStoreNode) \
- declare_c2_type(Store4CNode, VectorStoreNode) \
- declare_c2_type(Store2CNode, VectorStoreNode) \
- declare_c2_type(Store4INode, VectorStoreNode) \
- declare_c2_type(Store2INode, VectorStoreNode) \
- declare_c2_type(Store2LNode, VectorStoreNode) \
- declare_c2_type(Store4FNode, VectorStoreNode) \
- declare_c2_type(Store2FNode, VectorStoreNode) \
- declare_c2_type(Store2DNode, VectorStoreNode) \
- declare_c2_type(Replicate16BNode, VectorNode) \
- declare_c2_type(Replicate8BNode, VectorNode) \
- declare_c2_type(Replicate4BNode, VectorNode) \
- declare_c2_type(Replicate8CNode, VectorNode) \
- declare_c2_type(Replicate4CNode, VectorNode) \
- declare_c2_type(Replicate2CNode, VectorNode) \
- declare_c2_type(Replicate8SNode, VectorNode) \
- declare_c2_type(Replicate4SNode, VectorNode) \
- declare_c2_type(Replicate2SNode, VectorNode) \
- declare_c2_type(Replicate4INode, VectorNode) \
- declare_c2_type(Replicate2INode, VectorNode) \
- declare_c2_type(Replicate2LNode, VectorNode) \
- declare_c2_type(Replicate4FNode, VectorNode) \
- declare_c2_type(Replicate2FNode, VectorNode) \
- declare_c2_type(Replicate2DNode, VectorNode) \
+ declare_c2_type(LoadVectorNode, LoadNode) \
+ declare_c2_type(StoreVectorNode, StoreNode) \
+ declare_c2_type(ReplicateBNode, VectorNode) \
+ declare_c2_type(ReplicateSNode, VectorNode) \
+ declare_c2_type(ReplicateINode, VectorNode) \
+ declare_c2_type(ReplicateLNode, VectorNode) \
+ declare_c2_type(ReplicateFNode, VectorNode) \
+ declare_c2_type(ReplicateDNode, VectorNode) \
declare_c2_type(PackNode, VectorNode) \
declare_c2_type(PackBNode, PackNode) \
- declare_c2_type(PackCNode, PackNode) \
declare_c2_type(PackSNode, PackNode) \
declare_c2_type(PackINode, PackNode) \
declare_c2_type(PackLNode, PackNode) \
declare_c2_type(PackFNode, PackNode) \
declare_c2_type(PackDNode, PackNode) \
- declare_c2_type(Pack2x1BNode, PackNode) \
- declare_c2_type(Pack2x2BNode, PackNode) \
+ declare_c2_type(Pack2LNode, PackNode) \
+ declare_c2_type(Pack2DNode, PackNode) \
declare_c2_type(ExtractNode, Node) \
declare_c2_type(ExtractBNode, ExtractNode) \
- declare_c2_type(ExtractCNode, ExtractNode) \
declare_c2_type(ExtractSNode, ExtractNode) \
declare_c2_type(ExtractINode, ExtractNode) \
declare_c2_type(ExtractLNode, ExtractNode) \
--- a/hotspot/src/share/vm/utilities/hashtable.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/utilities/hashtable.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -24,6 +24,7 @@
#include "precompiled.hpp"
#include "memory/allocation.inline.hpp"
+#include "memory/filemap.hpp"
#include "memory/resourceArea.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/safepoint.hpp"
@@ -86,6 +87,76 @@
}
+// Check to see if the hashtable is unbalanced. The caller set a flag to
+// rehash at the next safepoint. If this bucket is 60 times greater than the
+// expected average bucket length, it's an unbalanced hashtable.
+// This is somewhat an arbitrary heuristic but if one bucket gets to
+// rehash_count which is currently 100, there's probably something wrong.
+
+bool BasicHashtable::check_rehash_table(int count) {
+ assert(table_size() != 0, "underflow");
+ if (count > (((double)number_of_entries()/(double)table_size())*rehash_multiple)) {
+ // Set a flag for the next safepoint, which should be at some guaranteed
+ // safepoint interval.
+ return true;
+ }
+ return false;
+}
+
+// Create a new table and using alternate hash code, populate the new table
+// with the existing elements. This can be used to change the hash code
+// and could in the future change the size of the table.
+
+template <class T> void Hashtable<T>::move_to(Hashtable<T>* new_table) {
+ int saved_entry_count = number_of_entries();
+
+ // Iterate through the table and create a new entry for the new table
+ for (int i = 0; i < new_table->table_size(); ++i) {
+ for (HashtableEntry<T>* p = bucket(i); p != NULL; ) {
+ HashtableEntry<T>* next = p->next();
+ T string = p->literal();
+ // Use alternate hashing algorithm on the symbol in the first table
+ unsigned int hashValue = new_hash(string);
+ // Get a new index relative to the new table (can also change size)
+ int index = new_table->hash_to_index(hashValue);
+ p->set_hash(hashValue);
+ // Keep the shared bit in the Hashtable entry to indicate that this entry
+ // can't be deleted. The shared bit is the LSB in the _next field so
+ // walking the hashtable past these entries requires
+ // BasicHashtableEntry::make_ptr() call.
+ bool keep_shared = p->is_shared();
+ unlink_entry(p);
+ new_table->add_entry(index, p);
+ if (keep_shared) {
+ p->set_shared();
+ }
+ p = next;
+ }
+ }
+ // give the new table the free list as well
+ new_table->copy_freelist(this);
+ assert(new_table->number_of_entries() == saved_entry_count, "lost entry on dictionary copy?");
+
+ // Destroy memory used by the buckets in the hashtable. The memory
+ // for the elements has been used in a new table and is not
+ // destroyed. The memory reuse will benefit resizing the SystemDictionary
+ // to avoid a memory allocation spike at safepoint.
+ free_buckets();
+}
+
+void BasicHashtable::free_buckets() {
+ if (NULL != _buckets) {
+ // Don't delete the buckets in the shared space. They aren't
+ // allocated by os::malloc
+ if (!UseSharedSpaces ||
+ !FileMapInfo::current_info()->is_in_shared_space(_buckets)) {
+ FREE_C_HEAP_ARRAY(HashtableBucket, _buckets);
+ }
+ _buckets = NULL;
+ }
+}
+
+
// Reverse the order of elements in the hash buckets.
void BasicHashtable::reverse() {
--- a/hotspot/src/share/vm/utilities/hashtable.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/utilities/hashtable.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -159,8 +159,6 @@
// Reverse the order of elements in each of the buckets.
void reverse();
- static unsigned int hash_symbol(const char* s, int len);
-
private:
// Instance variables
int _table_size;
@@ -179,6 +177,11 @@
void verify_lookup_length(double load);
#endif
+ enum {
+ rehash_count = 100,
+ rehash_multiple = 60
+ };
+
void initialize(int table_size, int entry_size, int number_of_entries);
// Accessor
@@ -193,6 +196,29 @@
// Table entry management
BasicHashtableEntry* new_entry(unsigned int hashValue);
+ // Check that the table is unbalanced
+ bool check_rehash_table(int count);
+
+ // Used when moving the entry to another table
+ // Clean up links, but do not add to free_list
+ void unlink_entry(BasicHashtableEntry* entry) {
+ entry->set_next(NULL);
+ --_number_of_entries;
+ }
+
+ // Move over freelist and free block for allocation
+ void copy_freelist(BasicHashtable* src) {
+ _free_list = src->_free_list;
+ src->_free_list = NULL;
+ _first_free_entry = src->_first_free_entry;
+ src->_first_free_entry = NULL;
+ _end_block = src->_end_block;
+ src->_end_block = NULL;
+ }
+
+ // Free the buckets in this hashtable
+ void free_buckets();
+
public:
int table_size() { return _table_size; }
void set_entry(int index, BasicHashtableEntry* entry);
@@ -249,6 +275,10 @@
HashtableEntry<T>** bucket_addr(int i) {
return (HashtableEntry<T>**)BasicHashtable::bucket_addr(i);
}
+
+ // Function to move these elements into the new table.
+ void move_to(Hashtable<T>* new_table);
+ virtual unsigned int new_hash(T) { ShouldNotReachHere(); return 0; } // should be overridden
};
--- a/hotspot/src/share/vm/utilities/hashtable.inline.hpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/utilities/hashtable.inline.hpp Wed Jul 05 18:15:17 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -30,27 +30,6 @@
// Inline function definitions for hashtable.hpp.
-
-// --------------------------------------------------------------------------
-// Hash function
-
-// We originally used hashpjw, but hash P(31) gives just as good results
-// and is slighly faster. We would like a hash function that looks at every
-// character, since package names have large common prefixes, and also because
-// hash_or_fail does error checking while iterating.
-
-// hash P(31) from Kernighan & Ritchie
-
-inline unsigned int BasicHashtable::hash_symbol(const char* s, int len) {
- unsigned int h = 0;
- while (len-- > 0) {
- h = 31*h + (unsigned) *s;
- s++;
- }
- return h;
-}
-
-
// --------------------------------------------------------------------------
// Initialize a table.
--- a/hotspot/src/share/vm/utilities/vmError.cpp Thu Jun 28 09:32:28 2012 -0700
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Wed Jul 05 18:15:17 2017 +0200
@@ -450,7 +450,9 @@
// VM version
st->print_cr("#");
JDK_Version::current().to_string(buf, sizeof(buf));
- st->print_cr("# JRE version: %s", buf);
+ const char* runtime_name = JDK_Version::runtime_name() != NULL ?
+ JDK_Version::runtime_name() : "";
+ st->print_cr("# JRE version: %s (%s)", runtime_name, buf);
st->print_cr("# Java VM: %s (%s %s %s %s)",
Abstract_VM_Version::vm_name(),
Abstract_VM_Version::vm_release(),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestBooleanVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,952 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestBooleanVect
+ */
+
+public class TestBooleanVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Boolean vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ boolean[] a1 = new boolean[ARRLEN];
+ boolean[] a2 = new boolean[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, true);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, true, true);
+ test_ci_neg(a1);
+ test_vi_neg(a2, true);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, true, true);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, true);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, true, true);
+ test_ci_off(a1);
+ test_vi_off(a2, true);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, true, true);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, true, OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, true, true, OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, true);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, true, true);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, true, true);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, true, true);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], false);
+ }
+ test_vi(a2, true);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], true);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], true);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], false);
+ errn += verify("test_2ci: a2", i, a2[i], false);
+ }
+ test_2vi(a1, a2, true, true);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], true);
+ errn += verify("test_2vi: a2", i, a2[i], true);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], false);
+ }
+ test_vi_neg(a2, true);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], true);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], true);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], false);
+ errn += verify("test_2ci_neg: a2", i, a2[i], false);
+ }
+ test_2vi_neg(a1, a2, true, true);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], true);
+ errn += verify("test_2vi_neg: a2", i, a2[i], true);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], false);
+ }
+ test_vi_oppos(a2, true);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], true);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], true);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], false);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], false);
+ }
+ test_2vi_oppos(a1, a2, true, true);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], true);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], true);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], false);
+ }
+ test_vi_off(a2, true);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], true);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], true);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], false);
+ errn += verify("test_2ci_off: a2", i, a2[i], false);
+ }
+ test_2vi_off(a1, a2, true, true);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], true);
+ errn += verify("test_2vi_off: a2", i, a2[i], true);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], false);
+ errn += verify("test_2vi_off: a2", i, a2[i], false);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], false);
+ }
+ test_vi_inv(a2, true, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], true);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], true);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], false);
+ errn += verify("test_2ci_inv: a2", i, a2[i], false);
+ }
+ test_2vi_inv(a1, a2, true, true, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], true);
+ errn += verify("test_2vi_inv: a2", i, a2[i], true);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], false);
+ errn += verify("test_2vi_inv: a2", i, a2[i], false);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = true;
+ a2[i] = false;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ boolean val = (i%SCALE != 0);
+ errn += verify("test_ci_scl: a1", i, a1[i], val);
+ }
+ test_vi_scl(a2, true);
+ for (int i=0; i<ARRLEN; i++) {
+ boolean val = (i%SCALE == 0);
+ errn += verify("test_vi_scl: a2", i, a2[i], val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_scl: a1", i, a1[i], true);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], true);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], false);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], false);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], false);
+ }
+ }
+ test_2vi_scl(a1, a2, false, true);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], true);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], false);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], false);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], true);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_vi(a2, true);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], false);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], true);
+ }
+ test_vi(a2, false);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], false);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], true);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], false);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], false);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], false);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], false);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_2vi_aln(a1, a2, true, true);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], true);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], false);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], false);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], true);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_vi(a2, true);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], false);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], true);
+ }
+ test_vi(a2, false);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], false);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], true);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], false);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], false);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], false);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], false);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ a2[i] = false;
+ }
+ test_2vi_unaln(a1, a2, true, true);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], true);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], false);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], false);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], true);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (i > 0);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = false;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ boolean v = (i%ALIGN_OFF > 0);
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = false;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], false);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ boolean v = (i%ALIGN_OFF > 0);
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], false);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], false);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ }
+ test_2vi_aln(a1, a1, true, true);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], true);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], true);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (i > 0);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = false;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ boolean v = (i%UNALIGN_OFF > 0);
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = false;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], false);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ boolean v = (i%UNALIGN_OFF > 0);
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], false);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], false);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = false;
+ }
+ test_2vi_unaln(a1, a1, true, true);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], true);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], true);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, true, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, true, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, true, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, true, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, true, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, true, true, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, true, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, true, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, true, true);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(boolean[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = false;
+ }
+ }
+ static void test_vi(boolean[] a, boolean b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = false;
+ b[i] = false;
+ }
+ }
+ static void test_2vi(boolean[] a, boolean[] b, boolean c, boolean d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(boolean[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = false;
+ }
+ }
+ static void test_vi_neg(boolean[] a, boolean b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(boolean[] a, boolean[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(boolean[] a, boolean[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = false;
+ b[i] = false;
+ }
+ }
+ static void test_2vi_neg(boolean[] a, boolean[] b, boolean c, boolean d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(boolean[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = false;
+ }
+ }
+ static void test_vi_oppos(boolean[] a, boolean b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(boolean[] a, boolean[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(boolean[] a, boolean[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = false;
+ b[i] = false;
+ }
+ }
+ static void test_2vi_oppos(boolean[] a, boolean[] b, boolean c, boolean d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(boolean[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = false;
+ }
+ }
+ static void test_vi_off(boolean[] a, boolean b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = false;
+ b[i+OFFSET] = false;
+ }
+ }
+ static void test_2vi_off(boolean[] a, boolean[] b, boolean c, boolean d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(boolean[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = false;
+ }
+ }
+ static void test_vi_inv(boolean[] a, boolean b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(boolean[] a, boolean[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(boolean[] a, boolean[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = false;
+ b[i+k] = false;
+ }
+ }
+ static void test_2vi_inv(boolean[] a, boolean[] b, boolean c, boolean d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(boolean[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = false;
+ }
+ }
+ static void test_vi_scl(boolean[] a, boolean b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(boolean[] a, boolean[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(boolean[] a, boolean[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = false;
+ b[i*SCALE] = false;
+ }
+ }
+ static void test_2vi_scl(boolean[] a, boolean[] b, boolean c, boolean d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = false;
+ b[i] = false;
+ }
+ }
+ static void test_2vi_aln(boolean[] a, boolean[] b, boolean c, boolean d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(boolean[] a, boolean[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = false;
+ b[i] = false;
+ }
+ }
+ static void test_2vi_unaln(boolean[] a, boolean[] b, boolean c, boolean d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, boolean elem, boolean val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestByteDoubleVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteDoubleVect
+ */
+
+public class TestByteDoubleVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Byte + Double vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ byte[] a1 = new byte[ARRLEN];
+ byte[] a2 = new byte[ARRLEN];
+ double[] b1 = new double[ARRLEN];
+ double[] b2 = new double[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (byte)123, 103.);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (byte)123, 103.);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (byte)123, 103.);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (byte)123, 103.);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (byte)123, 103.);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.);
+ }
+ test_vi(a2, b2, (byte)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+ }
+ test_vi_neg(a2, b2, (byte)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+ }
+ test_vi_oppos(a2, b2, (byte)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_vi_aln(a1, b1, (byte)123, 103.);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (byte)123, 103.);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (double)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (double)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (byte)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (byte)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (byte)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (byte)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (byte)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(byte[] a, double[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi(byte[] a, double[] b, byte c, double d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(byte[] a, byte[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(byte[] a, double[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_neg(byte[] a, double[] b, byte c, double d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(byte[] a, byte[] b, double[] c, double[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(byte[] a, double[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_oppos(byte[] a, double[] b, byte c, double d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(byte[] a, byte[] b, double[] c, double[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(byte[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_aln(byte[] a, double[] b, byte c, double d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(byte[] a, byte[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(byte[] a, byte[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(byte[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_unaln(byte[] a, double[] b, byte c, double d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(byte[] a, byte[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(byte[] a, byte[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, byte elem, byte val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, double elem, double val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestByteFloatVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteFloatVect
+ */
+
+public class TestByteFloatVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Byte + Float vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ byte[] a1 = new byte[ARRLEN];
+ byte[] a2 = new byte[ARRLEN];
+ float[] b1 = new float[ARRLEN];
+ float[] b2 = new float[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (byte)123, 103.f);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (byte)123, 103.f);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (byte)123, 103.f);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (byte)123, 103.f);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (byte)123, 103.f);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.f);
+ }
+ test_vi(a2, b2, (byte)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.f);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+ }
+ test_vi_neg(a2, b2, (byte)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+ }
+ test_vi_oppos(a2, b2, (byte)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_vi_aln(a1, b1, (byte)123, 103.f);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (byte)123, 103.f);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (float)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.f;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (float)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.f;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (byte)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (byte)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (byte)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (byte)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (byte)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(byte[] a, float[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi(byte[] a, float[] b, byte c, float d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(byte[] a, byte[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(byte[] a, float[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_neg(byte[] a, float[] b, byte c, float d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(byte[] a, byte[] b, float[] c, float[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(byte[] a, float[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_oppos(byte[] a, float[] b, byte c, float d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(byte[] a, byte[] b, float[] c, float[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(byte[] a, float[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_aln(byte[] a, float[] b, byte c, float d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(byte[] a, byte[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(byte[] a, byte[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(byte[] a, float[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_unaln(byte[] a, float[] b, byte c, float d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(byte[] a, byte[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(byte[] a, byte[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, byte elem, byte val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, float elem, float val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestByteIntVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteIntVect
+ */
+
+public class TestByteIntVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Byte + Integer vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ byte[] a1 = new byte[ARRLEN];
+ byte[] a2 = new byte[ARRLEN];
+ int[] b1 = new int[ARRLEN];
+ int[] b2 = new int[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (byte)123, (int)103);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (byte)123, (int)103);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (byte)123, (int)103);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (byte)123, (int)103);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (byte)123, (int)103);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci: b1", i, b1[i], (int)-103);
+ }
+ test_vi(a2, b2, (byte)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi: b2", i, b2[i], (int)103);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], (int)-103);
+ }
+ test_vi_neg(a2, b2, (byte)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], (int)103);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], (int)-103);
+ }
+ test_vi_oppos(a2, b2, (byte)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], (int)103);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)123);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (int)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (int)-1);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_aln(a1, b1, (byte)123, (int)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (int)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (int)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (byte)123, (int)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (int)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (int)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (int)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (int)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (byte)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (byte)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (byte)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (byte)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (byte)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(byte[] a, int[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi(byte[] a, int[] b, byte c, int d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(byte[] a, byte[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(byte[] a, int[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_neg(byte[] a, int[] b, byte c, int d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(byte[] a, byte[] b, int[] c, int[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(byte[] a, int[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_oppos(byte[] a, int[] b, byte c, int d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(byte[] a, byte[] b, int[] c, int[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(byte[] a, int[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_aln(byte[] a, int[] b, byte c, int d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(byte[] a, byte[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(byte[] a, byte[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(byte[] a, int[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_unaln(byte[] a, int[] b, byte c, int d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(byte[] a, byte[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(byte[] a, byte[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, byte elem, byte val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, int elem, int val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestByteLongVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteLongVect
+ */
+
+public class TestByteLongVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Byte + Long vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ byte[] a1 = new byte[ARRLEN];
+ byte[] a2 = new byte[ARRLEN];
+ long[] b1 = new long[ARRLEN];
+ long[] b2 = new long[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (byte)123, (long)103);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (byte)123, (long)103);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (byte)123, (long)103);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (byte)123, (long)103);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (byte)123, (long)103);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci: b1", i, b1[i], (long)-103);
+ }
+ test_vi(a2, b2, (byte)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi: b2", i, b2[i], (long)103);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], (long)-103);
+ }
+ test_vi_neg(a2, b2, (byte)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], (long)103);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], (long)-103);
+ }
+ test_vi_oppos(a2, b2, (byte)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], (long)103);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)123);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (long)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (long)-1);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_aln(a1, b1, (byte)123, (long)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (long)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (byte)123, (long)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (long)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (long)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (long)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (long)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (byte)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (byte)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (byte)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (byte)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (byte)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(byte[] a, long[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi(byte[] a, long[] b, byte c, long d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(byte[] a, byte[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(byte[] a, long[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_neg(byte[] a, long[] b, byte c, long d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(byte[] a, byte[] b, long[] c, long[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(byte[] a, long[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_oppos(byte[] a, long[] b, byte c, long d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(byte[] a, byte[] b, long[] c, long[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(byte[] a, long[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_aln(byte[] a, long[] b, byte c, long d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(byte[] a, byte[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(byte[] a, byte[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(byte[] a, long[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_unaln(byte[] a, long[] b, byte c, long d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(byte[] a, byte[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(byte[] a, byte[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, byte elem, byte val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, long elem, long val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestByteShortVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteShortVect
+ */
+
+public class TestByteShortVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Byte + Short vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ byte[] a1 = new byte[ARRLEN];
+ byte[] a2 = new byte[ARRLEN];
+ short[] b1 = new short[ARRLEN];
+ short[] b2 = new short[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (byte)123, (short)103);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (byte)123, (short)103);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (byte)123, (short)103);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (byte)123, (short)103);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (byte)123, (short)103);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci: b1", i, b1[i], (short)-103);
+ }
+ test_vi(a2, b2, (byte)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi: b2", i, b2[i], (short)103);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], (short)-103);
+ }
+ test_vi_neg(a2, b2, (byte)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], (short)103);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], (short)-103);
+ }
+ test_vi_oppos(a2, b2, (byte)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], (short)103);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)123);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (short)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (short)-1);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_aln(a1, b1, (byte)123, (short)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (short)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (short)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (byte)123, (short)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (short)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (short)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ b1[i] = (short)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (short)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (byte)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (byte)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (byte)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (byte)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (byte)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(byte[] a, short[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi(byte[] a, short[] b, byte c, short d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(byte[] a, byte[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(byte[] a, short[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_neg(byte[] a, short[] b, byte c, short d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(byte[] a, byte[] b, short[] c, short[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(byte[] a, short[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_oppos(byte[] a, short[] b, byte c, short d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(byte[] a, byte[] b, short[] c, short[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(byte[] a, short[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_aln(byte[] a, short[] b, byte c, short d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(byte[] a, byte[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(byte[] a, byte[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(byte[] a, short[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_unaln(byte[] a, short[] b, byte c, short d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(byte[] a, byte[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(byte[] a, byte[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, byte elem, byte val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, short elem, short val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestByteVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestByteVect
+ */
+
+public class TestByteVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Byte vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ byte[] a1 = new byte[ARRLEN];
+ byte[] a2 = new byte[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, (byte)123);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, (byte)123, (byte)103);
+ test_ci_neg(a1);
+ test_vi_neg(a2, (byte)123);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, (byte)123, (byte)103);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, (byte)123);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, (byte)123, (byte)103);
+ test_ci_off(a1);
+ test_vi_off(a2, (byte)123);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, (byte)123, (byte)103);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, (byte)123, OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, (byte)123, (byte)103, OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, (byte)123);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, (byte)123, (byte)103);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, (byte)123, (byte)103);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, (byte)123, (byte)103);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (byte)-123);
+ }
+ test_vi(a2, (byte)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (byte)123);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (byte)123);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], (byte)-123);
+ errn += verify("test_2ci: a2", i, a2[i], (byte)-103);
+ }
+ test_2vi(a1, a2, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], (byte)123);
+ errn += verify("test_2vi: a2", i, a2[i], (byte)103);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (byte)-123);
+ }
+ test_vi_neg(a2, (byte)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (byte)123);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (byte)123);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], (byte)-123);
+ errn += verify("test_2ci_neg: a2", i, a2[i], (byte)-103);
+ }
+ test_2vi_neg(a1, a2, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], (byte)123);
+ errn += verify("test_2vi_neg: a2", i, a2[i], (byte)103);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (byte)-123);
+ }
+ test_vi_oppos(a2, (byte)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (byte)123);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (byte)123);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], (byte)-123);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], (byte)-103);
+ }
+ test_2vi_oppos(a1, a2, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], (byte)123);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], (byte)103);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], (byte)-123);
+ }
+ test_vi_off(a2, (byte)123);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], (byte)123);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], (byte)123);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], (byte)-123);
+ errn += verify("test_2ci_off: a2", i, a2[i], (byte)-103);
+ }
+ test_2vi_off(a1, a2, (byte)123, (byte)103);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (byte)123);
+ errn += verify("test_2vi_off: a2", i, a2[i], (byte)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (byte)-1);
+ errn += verify("test_2vi_off: a2", i, a2[i], (byte)-1);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], (byte)-123);
+ }
+ test_vi_inv(a2, (byte)123, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], (byte)123);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], (byte)123);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], (byte)-123);
+ errn += verify("test_2ci_inv: a2", i, a2[i], (byte)-103);
+ }
+ test_2vi_inv(a1, a2, (byte)123, (byte)103, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (byte)123);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (byte)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (byte)-1);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (byte)-1);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : -123;
+ errn += verify("test_ci_scl: a1", i, a1[i], (byte)val);
+ }
+ test_vi_scl(a2, (byte)123);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_vi_scl: a2", i, a2[i], (byte)val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_cp_scl: a1", i, a1[i], (byte)val);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], (byte)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (byte)-123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], (byte)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (byte)-103);
+ }
+ }
+ test_2vi_scl(a1, a2, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], (byte)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (byte)123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], (byte)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (byte)103);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (byte)123);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (byte)123);
+ }
+ test_vi(a2, (byte)-123);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (byte)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (byte)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (byte)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_aln(a1, a2, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (byte)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (byte)123);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (byte)123);
+ }
+ test_vi(a2, (byte)-123);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (byte)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (byte)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (byte)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_unaln(a1, a2, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (byte)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (byte)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (byte)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (byte)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_aln(a1, a1, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (byte)103);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (byte)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (byte)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (byte)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (byte)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (byte)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_unaln(a1, a1, (byte)123, (byte)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (byte)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (byte)103);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, (byte)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, (byte)123, (byte)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, (byte)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, (byte)123, (byte)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, (byte)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, (byte)123, (byte)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, (byte)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, (byte)123, (byte)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, (byte)123, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, (byte)123, (byte)103, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, (byte)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, (byte)123, (byte)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, (byte)123, (byte)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, (byte)123, (byte)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(byte[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi(byte[] a, byte b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi(byte[] a, byte[] b, byte c, byte d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(byte[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi_neg(byte[] a, byte b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(byte[] a, byte[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(byte[] a, byte[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_neg(byte[] a, byte[] b, byte c, byte d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(byte[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ }
+ }
+ static void test_vi_oppos(byte[] a, byte b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(byte[] a, byte[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(byte[] a, byte[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_oppos(byte[] a, byte[] b, byte c, byte d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(byte[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ }
+ }
+ static void test_vi_off(byte[] a, byte b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ b[i+OFFSET] = -103;
+ }
+ }
+ static void test_2vi_off(byte[] a, byte[] b, byte c, byte d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(byte[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ }
+ }
+ static void test_vi_inv(byte[] a, byte b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(byte[] a, byte[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(byte[] a, byte[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ b[i+k] = -103;
+ }
+ }
+ static void test_2vi_inv(byte[] a, byte[] b, byte c, byte d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(byte[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ }
+ }
+ static void test_vi_scl(byte[] a, byte b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(byte[] a, byte[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(byte[] a, byte[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ b[i*SCALE] = -103;
+ }
+ }
+ static void test_2vi_scl(byte[] a, byte[] b, byte c, byte d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_aln(byte[] a, byte[] b, byte c, byte d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(byte[] a, byte[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_unaln(byte[] a, byte[] b, byte c, byte d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, byte elem, byte val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestCharShortVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestCharShortVect
+ */
+
+public class TestCharShortVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Char + Short vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ char[] a1 = new char[ARRLEN];
+ char[] a2 = new char[ARRLEN];
+ short[] b1 = new short[ARRLEN];
+ short[] b2 = new short[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (char)123, (short)103);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (char)123, (short)103);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (char)123, (short)103);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (char)123, (short)103);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (char)123, (short)103);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ b1[i] = (short)-1;
+ b2[i] = (short)-1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (char)-123);
+ errn += verify("test_ci: b1", i, b1[i], (short)-103);
+ }
+ test_vi(a2, b2, (char)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (char)123);
+ errn += verify("test_vi: b2", i, b2[i], (short)103);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (char)123);
+ errn += verify("test_cp: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ b1[i] = (short)-1;
+ b2[i] = (short)-1;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (char)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], (short)-103);
+ }
+ test_vi_neg(a2, b2, (char)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (char)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], (short)103);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (char)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ b1[i] = (short)-1;
+ b2[i] = (short)-1;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (char)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], (short)-103);
+ }
+ test_vi_oppos(a2, b2, (char)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (char)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], (short)103);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (char)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)123;
+ b1[i] = (short)-1;
+ b2[i] = (short)123;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (char)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (char)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = (char)-123;
+ b2[i] = (short)-123;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (short)123);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ b1[i] = (short)-1;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (char)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (short)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (short)-1);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ b1[i] = (short)-1;
+ }
+ test_vi_aln(a1, b1, (char)123, (short)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (char)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)123;
+ b1[i] = (short)-1;
+ b2[i] = (short)123;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (char)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (char)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = (char)-123;
+ b2[i] = (short)-123;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ b1[i] = (short)-1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (char)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (short)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (short)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ b1[i] = (short)-1;
+ }
+ test_vi_unaln(a1, b1, (char)123, (short)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (char)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (short)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (char)i;
+ b1[i] = (short)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ b1[i] = (short)-1;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (char)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (short)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = (char)-1;
+ b1[i+ALIGN_OFF] = (short)-1;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (short)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (char)i;
+ b1[i] = (short)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ b1[i] = (short)-1;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (char)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (short)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = (char)-1;
+ b1[i+UNALIGN_OFF] = (short)-1;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (short)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (char)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (char)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (char)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (char)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (char)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(char[] a, short[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = (char)-123;
+ b[i] = (short)-103;
+ }
+ }
+ static void test_vi(char[] a, short[] b, char c, short d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(char[] a, char[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(char[] a, short[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = (char)-123;
+ b[i] = (short)-103;
+ }
+ }
+ static void test_vi_neg(char[] a, short[] b, char c, short d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(char[] a, char[] b, short[] c, short[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(char[] a, short[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = (char)-123;
+ b[i] = (short)-103;
+ }
+ }
+ static void test_vi_oppos(char[] a, short[] b, char c, short d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(char[] a, char[] b, short[] c, short[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(char[] a, short[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = (char)-123;
+ b[i] = (short)-103;
+ }
+ }
+ static void test_vi_aln(char[] a, short[] b, char c, short d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(char[] a, char[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(char[] a, char[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(char[] a, short[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = (char)-123;
+ b[i] = (short)-103;
+ }
+ }
+ static void test_vi_unaln(char[] a, short[] b, char c, short d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(char[] a, char[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(char[] a, char[] b, short[] c, short[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, char elem, char val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, short elem, short val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestCharVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestCharVect
+ */
+
+public class TestCharVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Char vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ char[] a1 = new char[ARRLEN];
+ char[] a2 = new char[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, (char)123);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, (char)123, (char)103);
+ test_ci_neg(a1);
+ test_vi_neg(a2, (char)123);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, (char)123, (char)103);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, (char)123);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, (char)123, (char)103);
+ test_ci_off(a1);
+ test_vi_off(a2, (char)123);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, (char)123, (char)103);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, (char)123, OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, (char)123, (char)103, OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, (char)123);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, (char)123, (char)103);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, (char)123, (char)103);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, (char)123, (char)103);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (char)-123);
+ }
+ test_vi(a2, (char)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (char)123);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (char)123);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], (char)-123);
+ errn += verify("test_2ci: a2", i, a2[i], (char)-103);
+ }
+ test_2vi(a1, a2, (char)123, (char)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], (char)123);
+ errn += verify("test_2vi: a2", i, a2[i], (char)103);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (char)-123);
+ }
+ test_vi_neg(a2, (char)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (char)123);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (char)123);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], (char)-123);
+ errn += verify("test_2ci_neg: a2", i, a2[i], (char)-103);
+ }
+ test_2vi_neg(a1, a2, (char)123, (char)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], (char)123);
+ errn += verify("test_2vi_neg: a2", i, a2[i], (char)103);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (char)-123);
+ }
+ test_vi_oppos(a2, (char)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (char)123);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (char)123);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], (char)-123);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], (char)-103);
+ }
+ test_2vi_oppos(a1, a2, (char)123, (char)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], (char)123);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], (char)103);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], (char)-123);
+ }
+ test_vi_off(a2, (char)123);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], (char)123);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], (char)123);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], (char)-123);
+ errn += verify("test_2ci_off: a2", i, a2[i], (char)-103);
+ }
+ test_2vi_off(a1, a2, (char)123, (char)103);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (char)123);
+ errn += verify("test_2vi_off: a2", i, a2[i], (char)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (char)-1);
+ errn += verify("test_2vi_off: a2", i, a2[i], (char)-1);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], (char)-123);
+ }
+ test_vi_inv(a2, (char)123, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], (char)123);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], (char)123);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], (char)-123);
+ errn += verify("test_2ci_inv: a2", i, a2[i], (char)-103);
+ }
+ test_2vi_inv(a1, a2, (char)123, (char)103, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (char)123);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (char)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (char)-1);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (char)-1);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : -123;
+ errn += verify("test_ci_scl: a1", i, a1[i], (char)val);
+ }
+ test_vi_scl(a2, (char)123);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_vi_scl: a2", i, a2[i], (char)val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_cp_scl: a1", i, a1[i], (char)val);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], (char)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (char)-123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], (char)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (char)-103);
+ }
+ }
+ test_2vi_scl(a1, a2, (char)123, (char)103);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], (char)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (char)123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], (char)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (char)103);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_vi(a2, (char)123);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (char)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (char)123);
+ }
+ test_vi(a2, (char)-123);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (char)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (char)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (char)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (char)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_2vi_aln(a1, a2, (char)123, (char)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (char)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (char)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (char)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_vi(a2, (char)123);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (char)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (char)123);
+ }
+ test_vi(a2, (char)-123);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (char)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (char)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (char)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (char)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ a2[i] = (char)-1;
+ }
+ test_2vi_unaln(a1, a2, (char)123, (char)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (char)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (char)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (char)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (char)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (char)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (char)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = (char)-1;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (char)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (char)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (char)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ }
+ test_2vi_aln(a1, a1, (char)123, (char)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (char)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (char)103);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (char)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (char)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = (char)-1;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (char)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (char)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (char)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = (char)-1;
+ }
+ test_2vi_unaln(a1, a1, (char)123, (char)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (char)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (char)103);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, (char)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, (char)123, (char)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, (char)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, (char)123, (char)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, (char)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, (char)123, (char)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, (char)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, (char)123, (char)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, (char)123, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, (char)123, (char)103, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, (char)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, (char)123, (char)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, (char)123, (char)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, (char)123, (char)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(char[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = (char)-123;
+ }
+ }
+ static void test_vi(char[] a, char b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(char[] a, char[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(char[] a, char[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = (char)-123;
+ b[i] = (char)-103;
+ }
+ }
+ static void test_2vi(char[] a, char[] b, char c, char d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(char[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = (char)-123;
+ }
+ }
+ static void test_vi_neg(char[] a, char b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(char[] a, char[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(char[] a, char[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = (char)-123;
+ b[i] = (char)-103;
+ }
+ }
+ static void test_2vi_neg(char[] a, char[] b, char c, char d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(char[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = (char)-123;
+ }
+ }
+ static void test_vi_oppos(char[] a, char b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(char[] a, char[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(char[] a, char[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = (char)-123;
+ b[i] = (char)-103;
+ }
+ }
+ static void test_2vi_oppos(char[] a, char[] b, char c, char d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(char[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = (char)-123;
+ }
+ }
+ static void test_vi_off(char[] a, char b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(char[] a, char[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(char[] a, char[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = (char)-123;
+ b[i+OFFSET] = (char)-103;
+ }
+ }
+ static void test_2vi_off(char[] a, char[] b, char c, char d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(char[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = (char)-123;
+ }
+ }
+ static void test_vi_inv(char[] a, char b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(char[] a, char[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(char[] a, char[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = (char)-123;
+ b[i+k] = (char)-103;
+ }
+ }
+ static void test_2vi_inv(char[] a, char[] b, char c, char d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(char[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = (char)-123;
+ }
+ }
+ static void test_vi_scl(char[] a, char b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(char[] a, char[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(char[] a, char[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = (char)-123;
+ b[i*SCALE] = (char)-103;
+ }
+ }
+ static void test_2vi_scl(char[] a, char[] b, char c, char d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(char[] a, char[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(char[] a, char[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(char[] a, char[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = (char)-123;
+ b[i] = (char)-103;
+ }
+ }
+ static void test_2vi_aln(char[] a, char[] b, char c, char d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(char[] a, char[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(char[] a, char[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(char[] a, char[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = (char)-123;
+ b[i] = (char)-103;
+ }
+ }
+ static void test_2vi_unaln(char[] a, char[] b, char c, char d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, char elem, char val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestDoubleVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestDoubleVect
+ */
+
+public class TestDoubleVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Double vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ double[] a1 = new double[ARRLEN];
+ double[] a2 = new double[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, 123.);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, 123., 103.);
+ test_ci_neg(a1);
+ test_vi_neg(a2, 123.);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, 123., 103.);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, 123.);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, 123., 103.);
+ test_ci_off(a1);
+ test_vi_off(a2, 123.);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, 123., 103.);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, 123., OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, 123., 103., OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, 123.);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, 123., 103.);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, 123., 103.);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, 123., 103.);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], -123.);
+ }
+ test_vi(a2, 123.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], 123.);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], 123.);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], -123.);
+ errn += verify("test_2ci: a2", i, a2[i], -103.);
+ }
+ test_2vi(a1, a2, 123., 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], 123.);
+ errn += verify("test_2vi: a2", i, a2[i], 103.);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], -123.);
+ }
+ test_vi_neg(a2, 123.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], 123.);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], 123.);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], -123.);
+ errn += verify("test_2ci_neg: a2", i, a2[i], -103.);
+ }
+ test_2vi_neg(a1, a2, 123., 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], 123.);
+ errn += verify("test_2vi_neg: a2", i, a2[i], 103.);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], -123.);
+ }
+ test_vi_oppos(a2, 123.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], 123.);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], 123.);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], -123.);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], -103.);
+ }
+ test_2vi_oppos(a1, a2, 123., 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], 123.);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], 103.);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], -123.);
+ }
+ test_vi_off(a2, 123.);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], 123.);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], 123.);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], -123.);
+ errn += verify("test_2ci_off: a2", i, a2[i], -103.);
+ }
+ test_2vi_off(a1, a2, 123., 103.);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], 123.);
+ errn += verify("test_2vi_off: a2", i, a2[i], 103.);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], -1.);
+ errn += verify("test_2vi_off: a2", i, a2[i], -1.);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], -123.);
+ }
+ test_vi_inv(a2, 123., OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], 123.);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], 123.);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], -123.);
+ errn += verify("test_2ci_inv: a2", i, a2[i], -103.);
+ }
+ test_2vi_inv(a1, a2, 123., 103., OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], 123.);
+ errn += verify("test_2vi_inv: a2", i, a2[i], 103.);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], -1.);
+ errn += verify("test_2vi_inv: a2", i, a2[i], -1.);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : -123;
+ errn += verify("test_ci_scl: a1", i, a1[i], (double)val);
+ }
+ test_vi_scl(a2, 123.);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_vi_scl: a2", i, a2[i], (double)val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_cp_scl: a1", i, a1[i], (double)val);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], -1.);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], -123.);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], -1.);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], -103.);
+ }
+ }
+ test_2vi_scl(a1, a2, 123., 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], -1.);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], 123.);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], -1.);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], 103.);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, 123.);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], 123.);
+ }
+ test_vi(a2, -123.);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], -123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], -123.);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], -103.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], -1.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_aln(a1, a2, 123., 103.);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], 123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], -1.);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, 123.);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], 123.);
+ }
+ test_vi(a2, -123.);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], -123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], -123.);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], -103.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], -1.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_unaln(a1, a2, 123., 103.);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], 123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], -1.);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], 103.);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (double)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (double)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (double)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -103.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_aln(a1, a1, 123., 103.);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 103.);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (double)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (double)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (double)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -103.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_unaln(a1, a1, 123., 103.);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 103.);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, 123.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, 123., 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, 123.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, 123., 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, 123.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, 123., 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, 123.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, 123., 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, 123., OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, 123., 103., OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, 123.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, 123., 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, 123., 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, 123., 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(double[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123.;
+ }
+ }
+ static void test_vi(double[] a, double b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(double[] a, double[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(double[] a, double[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123.;
+ b[i] = -103.;
+ }
+ }
+ static void test_2vi(double[] a, double[] b, double c, double d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(double[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123.;
+ }
+ }
+ static void test_vi_neg(double[] a, double b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(double[] a, double[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(double[] a, double[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123.;
+ b[i] = -103.;
+ }
+ }
+ static void test_2vi_neg(double[] a, double[] b, double c, double d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(double[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123.;
+ }
+ }
+ static void test_vi_oppos(double[] a, double b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(double[] a, double[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(double[] a, double[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123.;
+ b[i] = -103.;
+ }
+ }
+ static void test_2vi_oppos(double[] a, double[] b, double c, double d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(double[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123.;
+ }
+ }
+ static void test_vi_off(double[] a, double b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(double[] a, double[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(double[] a, double[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123.;
+ b[i+OFFSET] = -103.;
+ }
+ }
+ static void test_2vi_off(double[] a, double[] b, double c, double d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(double[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123.;
+ }
+ }
+ static void test_vi_inv(double[] a, double b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(double[] a, double[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(double[] a, double[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123.;
+ b[i+k] = -103.;
+ }
+ }
+ static void test_2vi_inv(double[] a, double[] b, double c, double d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(double[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123.;
+ }
+ }
+ static void test_vi_scl(double[] a, double b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(double[] a, double[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(double[] a, double[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123.;
+ b[i*SCALE] = -103.;
+ }
+ }
+ static void test_2vi_scl(double[] a, double[] b, double c, double d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(double[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(double[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(double[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123.;
+ b[i] = -103.;
+ }
+ }
+ static void test_2vi_aln(double[] a, double[] b, double c, double d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(double[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(double[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(double[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123.;
+ b[i] = -103.;
+ }
+ }
+ static void test_2vi_unaln(double[] a, double[] b, double c, double d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, double elem, double val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestFloatDoubleVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestFloatDoubleVect
+ */
+
+public class TestFloatDoubleVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Float + Double vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ float[] a1 = new float[ARRLEN];
+ float[] a2 = new float[ARRLEN];
+ double[] b1 = new double[ARRLEN];
+ double[] b2 = new double[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, 123.f, 103.);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, 123.f, 103.);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, 123.f, 103.);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, 123.f, 103.);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, 123.f, 103.);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], -123.f);
+ errn += verify("test_ci: b1", i, b1[i], -103.);
+ }
+ test_vi(a2, b2, 123.f, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], 123.f);
+ errn += verify("test_vi: b2", i, b2[i], 103.);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], 123.f);
+ errn += verify("test_cp: b1", i, b1[i], 103.);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], -123.f);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+ }
+ test_vi_neg(a2, b2, 123.f, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], 123.f);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], 123.f);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], -123.f);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+ }
+ test_vi_oppos(a2, b2, 123.f, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], 123.f);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], 123.f);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], -1.f);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], 123.f);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], -123.f);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], 123.f);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], -123.f);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_vi_aln(a1, b1, 123.f, 103.);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], 123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], -1.f);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], -1.f);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], 123.f);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], -123.f);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], 123.f);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], -123.f);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, 123.f, 103.);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], 123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], -1.f);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (float)i;
+ b1[i] = (double)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (float)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], -1.f);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (float)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (float)i;
+ b1[i] = (double)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (float)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], -1.f);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (float)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, 123.f, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, 123.f, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, 123.f, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, 123.f, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, 123.f, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(float[] a, double[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123.f;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi(float[] a, double[] b, float c, double d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(float[] a, float[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(float[] a, double[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123.f;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_neg(float[] a, double[] b, float c, double d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(float[] a, float[] b, double[] c, double[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(float[] a, double[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123.f;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_oppos(float[] a, double[] b, float c, double d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(float[] a, float[] b, double[] c, double[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(float[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123.f;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_aln(float[] a, double[] b, float c, double d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(float[] a, float[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(float[] a, float[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(float[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123.f;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_unaln(float[] a, double[] b, float c, double d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(float[] a, float[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(float[] a, float[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, float elem, float val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, double elem, double val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestFloatVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestFloatVect
+ */
+
+public class TestFloatVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Float vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ float[] a1 = new float[ARRLEN];
+ float[] a2 = new float[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, 123.f);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, 123.f, 103.f);
+ test_ci_neg(a1);
+ test_vi_neg(a2, 123.f);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, 123.f, 103.f);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, 123.f);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, 123.f, 103.f);
+ test_ci_off(a1);
+ test_vi_off(a2, 123.f);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, 123.f, 103.f);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, 123.f, OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, 123.f, 103.f, OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, 123.f);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, 123.f, 103.f);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, 123.f, 103.f);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, 123.f, 103.f);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], -123.f);
+ }
+ test_vi(a2, 123.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], 123.f);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], 123.f);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], -123.f);
+ errn += verify("test_2ci: a2", i, a2[i], -103.f);
+ }
+ test_2vi(a1, a2, 123.f, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], 123.f);
+ errn += verify("test_2vi: a2", i, a2[i], 103.f);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], -123.f);
+ }
+ test_vi_neg(a2, 123.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], 123.f);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], 123.f);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], -123.f);
+ errn += verify("test_2ci_neg: a2", i, a2[i], -103.f);
+ }
+ test_2vi_neg(a1, a2, 123.f, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], 123.f);
+ errn += verify("test_2vi_neg: a2", i, a2[i], 103.f);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], -123.f);
+ }
+ test_vi_oppos(a2, 123.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], 123.f);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], 123.f);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], -123.f);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], -103.f);
+ }
+ test_2vi_oppos(a1, a2, 123.f, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], 123.f);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], 103.f);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], -123.f);
+ }
+ test_vi_off(a2, 123.f);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], 123.f);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], 123.f);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], -123.f);
+ errn += verify("test_2ci_off: a2", i, a2[i], -103.f);
+ }
+ test_2vi_off(a1, a2, 123.f, 103.f);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], 123.f);
+ errn += verify("test_2vi_off: a2", i, a2[i], 103.f);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], -1.f);
+ errn += verify("test_2vi_off: a2", i, a2[i], -1.f);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], -123.f);
+ }
+ test_vi_inv(a2, 123.f, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], 123.f);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], 123.f);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], -123.f);
+ errn += verify("test_2ci_inv: a2", i, a2[i], -103.f);
+ }
+ test_2vi_inv(a1, a2, 123.f, 103.f, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], 123.f);
+ errn += verify("test_2vi_inv: a2", i, a2[i], 103.f);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], -1.f);
+ errn += verify("test_2vi_inv: a2", i, a2[i], -1.f);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : -123;
+ errn += verify("test_ci_scl: a1", i, a1[i], (float)val);
+ }
+ test_vi_scl(a2, 123.f);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_vi_scl: a2", i, a2[i], (float)val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_cp_scl: a1", i, a1[i], (float)val);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], -1.f);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], -123.f);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], -1.f);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], -103.f);
+ }
+ }
+ test_2vi_scl(a1, a2, 123.f, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], -1.f);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], 123.f);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], -1.f);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], 103.f);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, 123.f);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], 123.f);
+ }
+ test_vi(a2, -123.f);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], -123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], -123.f);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], -103.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], -1.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_aln(a1, a2, 123.f, 103.f);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], 123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], -1.f);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, 123.f);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], 123.f);
+ }
+ test_vi(a2, -123.f);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], -123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], -123.f);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], -103.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], -1.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_unaln(a1, a2, 123.f, 103.f);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], 123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], -1.f);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], 103.f);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (float)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (float)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (float)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -103.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_aln(a1, a1, 123.f, 103.f);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 103.f);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (float)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (float)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (float)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -103.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_unaln(a1, a1, 123.f, 103.f);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 103.f);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, 123.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, 123.f, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, 123.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, 123.f, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, 123.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, 123.f, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, 123.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, 123.f, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, 123.f, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, 123.f, 103.f, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, 123.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, 123.f, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, 123.f, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, 123.f, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(float[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123.f;
+ }
+ }
+ static void test_vi(float[] a, float b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(float[] a, float[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(float[] a, float[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123.f;
+ b[i] = -103.f;
+ }
+ }
+ static void test_2vi(float[] a, float[] b, float c, float d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(float[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123.f;
+ }
+ }
+ static void test_vi_neg(float[] a, float b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(float[] a, float[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(float[] a, float[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123.f;
+ b[i] = -103.f;
+ }
+ }
+ static void test_2vi_neg(float[] a, float[] b, float c, float d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(float[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123.f;
+ }
+ }
+ static void test_vi_oppos(float[] a, float b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(float[] a, float[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(float[] a, float[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123.f;
+ b[i] = -103.f;
+ }
+ }
+ static void test_2vi_oppos(float[] a, float[] b, float c, float d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(float[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123.f;
+ }
+ }
+ static void test_vi_off(float[] a, float b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(float[] a, float[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(float[] a, float[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123.f;
+ b[i+OFFSET] = -103.f;
+ }
+ }
+ static void test_2vi_off(float[] a, float[] b, float c, float d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(float[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123.f;
+ }
+ }
+ static void test_vi_inv(float[] a, float b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(float[] a, float[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(float[] a, float[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123.f;
+ b[i+k] = -103.f;
+ }
+ }
+ static void test_2vi_inv(float[] a, float[] b, float c, float d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(float[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123.f;
+ }
+ }
+ static void test_vi_scl(float[] a, float b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(float[] a, float[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(float[] a, float[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123.f;
+ b[i*SCALE] = -103.f;
+ }
+ }
+ static void test_2vi_scl(float[] a, float[] b, float c, float d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(float[] a, float[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(float[] a, float[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(float[] a, float[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123.f;
+ b[i] = -103.f;
+ }
+ }
+ static void test_2vi_aln(float[] a, float[] b, float c, float d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(float[] a, float[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(float[] a, float[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(float[] a, float[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123.f;
+ b[i] = -103.f;
+ }
+ }
+ static void test_2vi_unaln(float[] a, float[] b, float c, float d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, float elem, float val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestIntDoubleVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntDoubleVect
+ */
+
+public class TestIntDoubleVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Integer + Double vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ int[] a1 = new int[ARRLEN];
+ int[] a2 = new int[ARRLEN];
+ double[] b1 = new double[ARRLEN];
+ double[] b2 = new double[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (int)123, 103.);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (int)123, 103.);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (int)123, 103.);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (int)123, 103.);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (int)123, 103.);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.);
+ }
+ test_vi(a2, b2, (int)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (int)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (int)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+ }
+ test_vi_neg(a2, b2, (int)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+ }
+ test_vi_oppos(a2, b2, (int)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_vi_aln(a1, b1, (int)123, 103.);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (int)123, 103.);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ b1[i] = (double)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ b1[i] = (double)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (int)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (int)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (int)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (int)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (int)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(int[] a, double[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi(int[] a, double[] b, int c, double d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(int[] a, int[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(int[] a, double[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_neg(int[] a, double[] b, int c, double d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(int[] a, int[] b, double[] c, double[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(int[] a, double[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_oppos(int[] a, double[] b, int c, double d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(int[] a, int[] b, double[] c, double[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(int[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_aln(int[] a, double[] b, int c, double d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(int[] a, int[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(int[] a, int[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(int[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_unaln(int[] a, double[] b, int c, double d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(int[] a, int[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(int[] a, int[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, int elem, int val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, double elem, double val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestIntFloatVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntFloatVect
+ */
+
+public class TestIntFloatVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Integer + Float vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ int[] a1 = new int[ARRLEN];
+ int[] a2 = new int[ARRLEN];
+ float[] b1 = new float[ARRLEN];
+ float[] b2 = new float[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (int)123, 103.f);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (int)123, 103.f);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (int)123, 103.f);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (int)123, 103.f);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (int)123, 103.f);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.f);
+ }
+ test_vi(a2, b2, (int)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (int)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.f);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (int)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+ }
+ test_vi_neg(a2, b2, (int)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+ }
+ test_vi_oppos(a2, b2, (int)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_vi_aln(a1, b1, (int)123, 103.f);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (int)123, 103.f);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ b1[i] = (float)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.f;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ b1[i] = (float)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.f;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (int)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (int)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (int)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (int)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (int)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(int[] a, float[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi(int[] a, float[] b, int c, float d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(int[] a, int[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(int[] a, float[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_neg(int[] a, float[] b, int c, float d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(int[] a, int[] b, float[] c, float[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(int[] a, float[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_oppos(int[] a, float[] b, int c, float d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(int[] a, int[] b, float[] c, float[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(int[] a, float[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_aln(int[] a, float[] b, int c, float d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(int[] a, int[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(int[] a, int[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(int[] a, float[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_unaln(int[] a, float[] b, int c, float d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(int[] a, int[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(int[] a, int[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, int elem, int val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, float elem, float val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestIntLongVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntLongVect
+ */
+
+public class TestIntLongVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Integer + Long vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ int[] a1 = new int[ARRLEN];
+ int[] a2 = new int[ARRLEN];
+ long[] b1 = new long[ARRLEN];
+ long[] b2 = new long[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (int)123, (long)103);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (int)123, (long)103);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (int)123, (long)103);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (int)123, (long)103);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (int)123, (long)103);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci: b1", i, b1[i], (long)-103);
+ }
+ test_vi(a2, b2, (int)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (int)123);
+ errn += verify("test_vi: b2", i, b2[i], (long)103);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (int)123);
+ errn += verify("test_cp: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], (long)-103);
+ }
+ test_vi_neg(a2, b2, (int)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], (long)103);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], (long)-103);
+ }
+ test_vi_oppos(a2, b2, (int)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], (long)103);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)123);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (long)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (long)-1);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_aln(a1, b1, (int)123, (long)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (long)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (int)123, (long)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ b1[i] = (long)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (long)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ b1[i] = (long)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (long)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (int)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (int)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (int)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (int)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (int)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(int[] a, long[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi(int[] a, long[] b, int c, long d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(int[] a, int[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(int[] a, long[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_neg(int[] a, long[] b, int c, long d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(int[] a, int[] b, long[] c, long[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(int[] a, long[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_oppos(int[] a, long[] b, int c, long d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(int[] a, int[] b, long[] c, long[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(int[] a, long[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_aln(int[] a, long[] b, int c, long d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(int[] a, int[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(int[] a, int[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(int[] a, long[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_unaln(int[] a, long[] b, int c, long d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(int[] a, int[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(int[] a, int[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, int elem, int val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, long elem, long val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestIntVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestIntVect
+ */
+
+public class TestIntVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Integer vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ int[] a1 = new int[ARRLEN];
+ int[] a2 = new int[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, (int)123);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, (int)123, (int)103);
+ test_ci_neg(a1);
+ test_vi_neg(a2, (int)123);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, (int)123, (int)103);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, (int)123);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, (int)123, (int)103);
+ test_ci_off(a1);
+ test_vi_off(a2, (int)123);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, (int)123, (int)103);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, (int)123, OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, (int)123, (int)103, OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, (int)123);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, (int)123, (int)103);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, (int)123, (int)103);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, (int)123, (int)103);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (int)-123);
+ }
+ test_vi(a2, (int)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (int)123);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (int)123);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], (int)-123);
+ errn += verify("test_2ci: a2", i, a2[i], (int)-103);
+ }
+ test_2vi(a1, a2, (int)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], (int)123);
+ errn += verify("test_2vi: a2", i, a2[i], (int)103);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (int)-123);
+ }
+ test_vi_neg(a2, (int)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (int)123);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (int)123);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], (int)-123);
+ errn += verify("test_2ci_neg: a2", i, a2[i], (int)-103);
+ }
+ test_2vi_neg(a1, a2, (int)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], (int)123);
+ errn += verify("test_2vi_neg: a2", i, a2[i], (int)103);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (int)-123);
+ }
+ test_vi_oppos(a2, (int)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (int)123);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (int)123);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], (int)-123);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], (int)-103);
+ }
+ test_2vi_oppos(a1, a2, (int)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], (int)123);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], (int)103);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], (int)-123);
+ }
+ test_vi_off(a2, (int)123);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], (int)123);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], (int)123);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], (int)-123);
+ errn += verify("test_2ci_off: a2", i, a2[i], (int)-103);
+ }
+ test_2vi_off(a1, a2, (int)123, (int)103);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (int)123);
+ errn += verify("test_2vi_off: a2", i, a2[i], (int)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (int)-1);
+ errn += verify("test_2vi_off: a2", i, a2[i], (int)-1);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], (int)-123);
+ }
+ test_vi_inv(a2, (int)123, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], (int)123);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], (int)123);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], (int)-123);
+ errn += verify("test_2ci_inv: a2", i, a2[i], (int)-103);
+ }
+ test_2vi_inv(a1, a2, (int)123, (int)103, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (int)123);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (int)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (int)-1);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (int)-1);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : -123;
+ errn += verify("test_ci_scl: a1", i, a1[i], (int)val);
+ }
+ test_vi_scl(a2, (int)123);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_vi_scl: a2", i, a2[i], (int)val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_cp_scl: a1", i, a1[i], (int)val);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], (int)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (int)-123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], (int)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (int)-103);
+ }
+ }
+ test_2vi_scl(a1, a2, (int)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], (int)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (int)123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], (int)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (int)103);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (int)123);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (int)123);
+ }
+ test_vi(a2, (int)-123);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (int)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (int)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_aln(a1, a2, (int)123, (int)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (int)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (int)123);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (int)123);
+ }
+ test_vi(a2, (int)-123);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (int)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (int)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_unaln(a1, a2, (int)123, (int)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (int)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (int)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (int)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (int)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (int)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_aln(a1, a1, (int)123, (int)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (int)103);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (int)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (int)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (int)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (int)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (int)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_unaln(a1, a1, (int)123, (int)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (int)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (int)103);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, (int)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, (int)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, (int)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, (int)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, (int)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, (int)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, (int)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, (int)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, (int)123, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, (int)123, (int)103, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, (int)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, (int)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, (int)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, (int)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(int[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi(int[] a, int b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(int[] a, int[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(int[] a, int[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi(int[] a, int[] b, int c, int d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(int[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi_neg(int[] a, int b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(int[] a, int[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(int[] a, int[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_neg(int[] a, int[] b, int c, int d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(int[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ }
+ }
+ static void test_vi_oppos(int[] a, int b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(int[] a, int[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(int[] a, int[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_oppos(int[] a, int[] b, int c, int d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(int[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ }
+ }
+ static void test_vi_off(int[] a, int b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(int[] a, int[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(int[] a, int[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ b[i+OFFSET] = -103;
+ }
+ }
+ static void test_2vi_off(int[] a, int[] b, int c, int d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(int[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ }
+ }
+ static void test_vi_inv(int[] a, int b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(int[] a, int[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(int[] a, int[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ b[i+k] = -103;
+ }
+ }
+ static void test_2vi_inv(int[] a, int[] b, int c, int d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(int[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ }
+ }
+ static void test_vi_scl(int[] a, int b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(int[] a, int[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(int[] a, int[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ b[i*SCALE] = -103;
+ }
+ }
+ static void test_2vi_scl(int[] a, int[] b, int c, int d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(int[] a, int[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(int[] a, int[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(int[] a, int[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_aln(int[] a, int[] b, int c, int d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(int[] a, int[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(int[] a, int[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(int[] a, int[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_unaln(int[] a, int[] b, int c, int d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, int elem, int val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestLongDoubleVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongDoubleVect
+ */
+
+public class TestLongDoubleVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Long + Double vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ long[] a1 = new long[ARRLEN];
+ long[] a2 = new long[ARRLEN];
+ double[] b1 = new double[ARRLEN];
+ double[] b2 = new double[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (long)123, 103.);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (long)123, 103.);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (long)123, 103.);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (long)123, 103.);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (long)123, 103.);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (long)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.);
+ }
+ test_vi(a2, b2, (long)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (long)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (long)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (long)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+ }
+ test_vi_neg(a2, b2, (long)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (long)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (long)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+ }
+ test_vi_oppos(a2, b2, (long)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (long)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_vi_aln(a1, b1, (long)123, 103.);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (long)123, 103.);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (long)i;
+ b1[i] = (double)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (long)i;
+ b1[i] = (double)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (long)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (long)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (long)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (long)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (long)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(long[] a, double[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi(long[] a, double[] b, long c, double d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(long[] a, long[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(long[] a, double[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_neg(long[] a, double[] b, long c, double d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(long[] a, long[] b, double[] c, double[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(long[] a, double[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_oppos(long[] a, double[] b, long c, double d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(long[] a, long[] b, double[] c, double[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(long[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_aln(long[] a, double[] b, long c, double d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(long[] a, long[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(long[] a, long[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(long[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_unaln(long[] a, double[] b, long c, double d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(long[] a, long[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(long[] a, long[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, long elem, long val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, double elem, double val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestLongFloatVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongFloatVect
+ */
+
+public class TestLongFloatVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Long + Float vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ long[] a1 = new long[ARRLEN];
+ long[] a2 = new long[ARRLEN];
+ float[] b1 = new float[ARRLEN];
+ float[] b2 = new float[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (long)123, 103.f);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (long)123, 103.f);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (long)123, 103.f);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (long)123, 103.f);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (long)123, 103.f);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (long)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.f);
+ }
+ test_vi(a2, b2, (long)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (long)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.f);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (long)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (long)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+ }
+ test_vi_neg(a2, b2, (long)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (long)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (long)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+ }
+ test_vi_oppos(a2, b2, (long)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (long)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_vi_aln(a1, b1, (long)123, 103.f);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (long)123, 103.f);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (long)i;
+ b1[i] = (float)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.f;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (long)i;
+ b1[i] = (float)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.f;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (long)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (long)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (long)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (long)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (long)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(long[] a, float[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi(long[] a, float[] b, long c, float d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(long[] a, long[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(long[] a, float[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_neg(long[] a, float[] b, long c, float d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(long[] a, long[] b, float[] c, float[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(long[] a, float[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_oppos(long[] a, float[] b, long c, float d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(long[] a, long[] b, float[] c, float[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(long[] a, float[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_aln(long[] a, float[] b, long c, float d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(long[] a, long[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(long[] a, long[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(long[] a, float[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_unaln(long[] a, float[] b, long c, float d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(long[] a, long[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(long[] a, long[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, long elem, long val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, float elem, float val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestLongVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestLongVect
+ */
+
+public class TestLongVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Long vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ long[] a1 = new long[ARRLEN];
+ long[] a2 = new long[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, (long)123);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, (long)123, (long)103);
+ test_ci_neg(a1);
+ test_vi_neg(a2, (long)123);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, (long)123, (long)103);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, (long)123);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, (long)123, (long)103);
+ test_ci_off(a1);
+ test_vi_off(a2, (long)123);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, (long)123, (long)103);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, (long)123, OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, (long)123, (long)103, OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, (long)123);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, (long)123, (long)103);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, (long)123, (long)103);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, (long)123, (long)103);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (long)-123);
+ }
+ test_vi(a2, (long)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (long)123);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (long)123);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], (long)-123);
+ errn += verify("test_2ci: a2", i, a2[i], (long)-103);
+ }
+ test_2vi(a1, a2, (long)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], (long)123);
+ errn += verify("test_2vi: a2", i, a2[i], (long)103);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (long)-123);
+ }
+ test_vi_neg(a2, (long)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (long)123);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (long)123);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], (long)-123);
+ errn += verify("test_2ci_neg: a2", i, a2[i], (long)-103);
+ }
+ test_2vi_neg(a1, a2, (long)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], (long)123);
+ errn += verify("test_2vi_neg: a2", i, a2[i], (long)103);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (long)-123);
+ }
+ test_vi_oppos(a2, (long)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (long)123);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (long)123);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], (long)-123);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], (long)-103);
+ }
+ test_2vi_oppos(a1, a2, (long)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], (long)123);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], (long)103);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], (long)-123);
+ }
+ test_vi_off(a2, (long)123);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], (long)123);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], (long)123);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], (long)-123);
+ errn += verify("test_2ci_off: a2", i, a2[i], (long)-103);
+ }
+ test_2vi_off(a1, a2, (long)123, (long)103);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (long)123);
+ errn += verify("test_2vi_off: a2", i, a2[i], (long)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (long)-1);
+ errn += verify("test_2vi_off: a2", i, a2[i], (long)-1);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], (long)-123);
+ }
+ test_vi_inv(a2, (long)123, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], (long)123);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], (long)123);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], (long)-123);
+ errn += verify("test_2ci_inv: a2", i, a2[i], (long)-103);
+ }
+ test_2vi_inv(a1, a2, (long)123, (long)103, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (long)123);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (long)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (long)-1);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (long)-1);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : -123;
+ errn += verify("test_ci_scl: a1", i, a1[i], (long)val);
+ }
+ test_vi_scl(a2, (long)123);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_vi_scl: a2", i, a2[i], (long)val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_cp_scl: a1", i, a1[i], (long)val);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], (long)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (long)-123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], (long)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (long)-103);
+ }
+ }
+ test_2vi_scl(a1, a2, (long)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], (long)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (long)123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], (long)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (long)103);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (long)123);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (long)123);
+ }
+ test_vi(a2, (long)-123);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (long)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (long)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_aln(a1, a2, (long)123, (long)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (long)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (long)123);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (long)123);
+ }
+ test_vi(a2, (long)-123);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (long)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (long)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_unaln(a1, a2, (long)123, (long)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (long)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (long)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (long)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (long)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (long)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (long)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_aln(a1, a1, (long)123, (long)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (long)103);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (long)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (long)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (long)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (long)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (long)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_unaln(a1, a1, (long)123, (long)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (long)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (long)103);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, (long)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, (long)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, (long)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, (long)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, (long)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, (long)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, (long)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, (long)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, (long)123, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, (long)123, (long)103, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, (long)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, (long)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, (long)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, (long)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(long[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi(long[] a, long b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(long[] a, long[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(long[] a, long[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi(long[] a, long[] b, long c, long d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(long[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi_neg(long[] a, long b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(long[] a, long[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(long[] a, long[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_neg(long[] a, long[] b, long c, long d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(long[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ }
+ }
+ static void test_vi_oppos(long[] a, long b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(long[] a, long[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(long[] a, long[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_oppos(long[] a, long[] b, long c, long d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(long[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ }
+ }
+ static void test_vi_off(long[] a, long b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(long[] a, long[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(long[] a, long[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ b[i+OFFSET] = -103;
+ }
+ }
+ static void test_2vi_off(long[] a, long[] b, long c, long d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(long[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ }
+ }
+ static void test_vi_inv(long[] a, long b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(long[] a, long[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(long[] a, long[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ b[i+k] = -103;
+ }
+ }
+ static void test_2vi_inv(long[] a, long[] b, long c, long d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(long[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ }
+ }
+ static void test_vi_scl(long[] a, long b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(long[] a, long[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(long[] a, long[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ b[i*SCALE] = -103;
+ }
+ }
+ static void test_2vi_scl(long[] a, long[] b, long c, long d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(long[] a, long[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(long[] a, long[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(long[] a, long[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_aln(long[] a, long[] b, long c, long d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(long[] a, long[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(long[] a, long[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(long[] a, long[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_unaln(long[] a, long[] b, long c, long d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, long elem, long val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestShortDoubleVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortDoubleVect
+ */
+
+public class TestShortDoubleVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Short + Double vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ short[] a1 = new short[ARRLEN];
+ short[] a2 = new short[ARRLEN];
+ double[] b1 = new double[ARRLEN];
+ double[] b2 = new double[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (short)123, 103.);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (short)123, 103.);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (short)123, 103.);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (short)123, 103.);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (short)123, 103.);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.);
+ }
+ test_vi(a2, b2, (short)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (short)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (short)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.);
+ }
+ test_vi_neg(a2, b2, (short)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.;
+ b2[i] = -1.;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.);
+ }
+ test_vi_oppos(a2, b2, (short)123, 103.);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_vi_aln(a1, b1, (short)123, 103.);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.;
+ b2[i] = 123.;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (short)123, 103.);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (double)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (double)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (double)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (double)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (short)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (short)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (short)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (short)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (short)123, 103.);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(short[] a, double[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi(short[] a, double[] b, short c, double d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(short[] a, short[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(short[] a, double[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_neg(short[] a, double[] b, short c, double d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(short[] a, short[] b, double[] c, double[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(short[] a, double[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_oppos(short[] a, double[] b, short c, double d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(short[] a, short[] b, double[] c, double[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(short[] a, double[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_aln(short[] a, double[] b, short c, double d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(short[] a, short[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(short[] a, short[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(short[] a, double[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.;
+ }
+ }
+ static void test_vi_unaln(short[] a, double[] b, short c, double d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(short[] a, short[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(short[] a, short[] b, double[] c, double[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, short elem, short val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, double elem, double val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestShortFloatVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortFloatVect
+ */
+
+public class TestShortFloatVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Short + Float vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ short[] a1 = new short[ARRLEN];
+ short[] a2 = new short[ARRLEN];
+ float[] b1 = new float[ARRLEN];
+ float[] b2 = new float[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (short)123, 103.f);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (short)123, 103.f);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (short)123, 103.f);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (short)123, 103.f);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (short)123, 103.f);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci: b1", i, b1[i], -103.f);
+ }
+ test_vi(a2, b2, (short)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (short)123);
+ errn += verify("test_vi: b2", i, b2[i], 103.f);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (short)123);
+ errn += verify("test_cp: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], -103.f);
+ }
+ test_vi_neg(a2, b2, (short)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], 103.f);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1.f;
+ b2[i] = -1.f;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], -103.f);
+ }
+ test_vi_oppos(a2, b2, (short)123, 103.f);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], 103.f);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], 123.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], -1.f);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_vi_aln(a1, b1, (short)123, 103.f);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1.f;
+ b2[i] = 123.f;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123.f;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], -123.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], 123.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -103.f);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (short)123, 103.f);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], 103.f);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (float)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1.f;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (float)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1.f;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (float)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1.f;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], -1.f);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (float)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (short)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (short)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (short)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (short)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (short)123, 103.f);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(short[] a, float[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi(short[] a, float[] b, short c, float d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(short[] a, short[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(short[] a, float[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_neg(short[] a, float[] b, short c, float d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(short[] a, short[] b, float[] c, float[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(short[] a, float[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_oppos(short[] a, float[] b, short c, float d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(short[] a, short[] b, float[] c, float[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(short[] a, float[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_aln(short[] a, float[] b, short c, float d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(short[] a, short[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(short[] a, short[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(short[] a, float[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103.f;
+ }
+ }
+ static void test_vi_unaln(short[] a, float[] b, short c, float d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(short[] a, short[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(short[] a, short[] b, float[] c, float[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, short elem, short val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, float elem, float val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestShortIntVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortIntVect
+ */
+
+public class TestShortIntVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Short + Integer vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ short[] a1 = new short[ARRLEN];
+ short[] a2 = new short[ARRLEN];
+ int[] b1 = new int[ARRLEN];
+ int[] b2 = new int[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (short)123, (int)103);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (short)123, (int)103);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (short)123, (int)103);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (short)123, (int)103);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (short)123, (int)103);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci: b1", i, b1[i], (int)-103);
+ }
+ test_vi(a2, b2, (short)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (short)123);
+ errn += verify("test_vi: b2", i, b2[i], (int)103);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (short)123);
+ errn += verify("test_cp: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], (int)-103);
+ }
+ test_vi_neg(a2, b2, (short)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], (int)103);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], (int)-103);
+ }
+ test_vi_oppos(a2, b2, (short)123, (int)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], (int)103);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (int)123);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (int)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (int)-1);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_aln(a1, b1, (short)123, (int)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (int)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (int)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (int)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (short)123, (int)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (int)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (int)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (int)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (int)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (int)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (int)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (int)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (short)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (short)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (short)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (short)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (short)123, (int)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(short[] a, int[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi(short[] a, int[] b, short c, int d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(short[] a, short[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(short[] a, int[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_neg(short[] a, int[] b, short c, int d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(short[] a, short[] b, int[] c, int[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(short[] a, int[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_oppos(short[] a, int[] b, short c, int d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(short[] a, short[] b, int[] c, int[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(short[] a, int[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_aln(short[] a, int[] b, short c, int d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(short[] a, short[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(short[] a, short[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(short[] a, int[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_unaln(short[] a, int[] b, short c, int d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(short[] a, short[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(short[] a, short[] b, int[] c, int[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, short elem, short val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, int elem, int val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestShortLongVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,571 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortLongVect
+ */
+
+public class TestShortLongVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Short + Long vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ short[] a1 = new short[ARRLEN];
+ short[] a2 = new short[ARRLEN];
+ long[] b1 = new long[ARRLEN];
+ long[] b2 = new long[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ test_vi(a2, b2, (short)123, (long)103);
+ test_cp(a1, a2, b1, b2);
+ test_ci_neg(a1, b1);
+ test_vi_neg(a1, b1, (short)123, (long)103);
+ test_cp_neg(a1, a2, b1, b2);
+ test_ci_oppos(a1, b1);
+ test_vi_oppos(a1, b1, (short)123, (long)103);
+ test_cp_oppos(a1, a2, b1, b2);
+ test_ci_aln(a1, b1);
+ test_vi_aln(a1, b1, (short)123, (long)103);
+ test_cp_alndst(a1, a2, b1, b2);
+ test_cp_alnsrc(a1, a2, b1, b2);
+ test_ci_unaln(a1, b1);
+ test_vi_unaln(a1, b1, (short)123, (long)103);
+ test_cp_unalndst(a1, a2, b1, b2);
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci: b1", i, b1[i], (long)-103);
+ }
+ test_vi(a2, b2, (short)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (short)123);
+ errn += verify("test_vi: b2", i, b2[i], (long)103);
+ }
+ test_cp(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (short)123);
+ errn += verify("test_cp: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_neg(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_neg: b1", i, b1[i], (long)-103);
+ }
+ test_vi_neg(a2, b2, (short)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_neg: b2", i, b2[i], (long)103);
+ }
+ test_cp_neg(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_neg: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ b1[i] = -1;
+ b2[i] = -1;
+ }
+ test_ci_oppos(a1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+ errn += verify("test_ci_oppos: b1", i, b1[i], (long)-103);
+ }
+ test_vi_oppos(a2, b2, (short)123, (long)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+ errn += verify("test_vi_oppos: b2", i, b2[i], (long)103);
+ }
+ test_cp_oppos(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_oppos: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_alndst(a1, a2, b1, b2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alndst: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_alnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_alnsrc: b1", i, b1[i], (long)123);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_aln(a1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (long)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_aln: b1", i, b1[i], (long)-1);
+ }
+
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_aln(a1, b1, (short)123, (long)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_aln: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = 123;
+ b1[i] = -1;
+ b2[i] = 123;
+ }
+ test_cp_unalndst(a1, a2, b1, b2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalndst: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a2[i] = -123;
+ b2[i] = -123;
+ }
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+ errn += verify("test_cp_unalnsrc: b1", i, b1[i], (long)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_ci_unaln(a1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (long)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_ci_unaln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_vi_unaln(a1, b1, (short)123, (long)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_vi_unaln: b1", i, b1[i], (long)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (long)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_alndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alndst_overlap: b1", i, b1[i], (long)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ b1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1, b1, b1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_alnsrc_overlap: b1", i, b1[i], (long)v);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ b1[i] = (long)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ b1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1, b1, b1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalndst_overlap: b1", i, b1[i], (long)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ b1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1, b1, b1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+ errn += verify("test_cp_unalnsrc_overlap: b1", i, b1[i], (long)v);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, b2, (short)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a1, b1, (short)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a1, b1, (short)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_aln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_aln(a1, b1, (short)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_unaln(a1, b1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_unaln(a1, b1, (short)123, (long)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2, b1, b2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ return errn;
+ }
+
+ static void test_ci(short[] a, long[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi(short[] a, long[] b, short c, long d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp(short[] a, short[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_neg(short[] a, long[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_neg(short[] a, long[] b, short c, long d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_cp_neg(short[] a, short[] b, long[] c, long[] d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ c[i] = d[i];
+ }
+ }
+ static void test_ci_oppos(short[] a, long[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_oppos(short[] a, long[] b, short c, long d) {
+ int limit = a.length-1;
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_cp_oppos(short[] a, short[] b, long[] c, long[] d) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ c[limit-i] = d[i];
+ }
+ }
+ static void test_ci_aln(short[] a, long[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_aln(short[] a, long[] b, short c, long d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_alndst(short[] a, short[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ c[i+ALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_alnsrc(short[] a, short[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ c[i] = d[i+ALIGN_OFF];
+ }
+ }
+ static void test_ci_unaln(short[] a, long[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_vi_unaln(short[] a, long[] b, short c, long d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(short[] a, short[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ c[i+UNALIGN_OFF] = d[i];
+ }
+ }
+ static void test_cp_unalnsrc(short[] a, short[] b, long[] c, long[] d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ c[i] = d[i+UNALIGN_OFF];
+ }
+ }
+
+ static int verify(String text, int i, short elem, short val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+ static int verify(String text, int i, long elem, long val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7119644/TestShortVect.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,953 @@
+/*
+ * 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 7119644
+ * @summary Increase superword's vector size up to 256 bits
+ *
+ * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-OptimizeFill TestShortVect
+ */
+
+public class TestShortVect {
+ private static final int ARRLEN = 997;
+ private static final int ITERS = 11000;
+ private static final int OFFSET = 3;
+ private static final int SCALE = 2;
+ private static final int ALIGN_OFF = 8;
+ private static final int UNALIGN_OFF = 5;
+
+ public static void main(String args[]) {
+ System.out.println("Testing Short vectors");
+ int errn = test();
+ if (errn > 0) {
+ System.err.println("FAILED: " + errn + " errors");
+ System.exit(97);
+ }
+ System.out.println("PASSED");
+ }
+
+ static int test() {
+ short[] a1 = new short[ARRLEN];
+ short[] a2 = new short[ARRLEN];
+ System.out.println("Warmup");
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ test_vi(a2, (short)123);
+ test_cp(a1, a2);
+ test_2ci(a1, a2);
+ test_2vi(a1, a2, (short)123, (short)103);
+ test_ci_neg(a1);
+ test_vi_neg(a2, (short)123);
+ test_cp_neg(a1, a2);
+ test_2ci_neg(a1, a2);
+ test_2vi_neg(a1, a2, (short)123, (short)103);
+ test_ci_oppos(a1);
+ test_vi_oppos(a2, (short)123);
+ test_cp_oppos(a1, a2);
+ test_2ci_oppos(a1, a2);
+ test_2vi_oppos(a1, a2, (short)123, (short)103);
+ test_ci_off(a1);
+ test_vi_off(a2, (short)123);
+ test_cp_off(a1, a2);
+ test_2ci_off(a1, a2);
+ test_2vi_off(a1, a2, (short)123, (short)103);
+ test_ci_inv(a1, OFFSET);
+ test_vi_inv(a2, (short)123, OFFSET);
+ test_cp_inv(a1, a2, OFFSET);
+ test_2ci_inv(a1, a2, OFFSET);
+ test_2vi_inv(a1, a2, (short)123, (short)103, OFFSET);
+ test_ci_scl(a1);
+ test_vi_scl(a2, (short)123);
+ test_cp_scl(a1, a2);
+ test_2ci_scl(a1, a2);
+ test_2vi_scl(a1, a2, (short)123, (short)103);
+ test_cp_alndst(a1, a2);
+ test_cp_alnsrc(a1, a2);
+ test_2ci_aln(a1, a2);
+ test_2vi_aln(a1, a2, (short)123, (short)103);
+ test_cp_unalndst(a1, a2);
+ test_cp_unalnsrc(a1, a2);
+ test_2ci_unaln(a1, a2);
+ test_2vi_unaln(a1, a2, (short)123, (short)103);
+ }
+ // Initialize
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ // Test and verify results
+ System.out.println("Verification");
+ int errn = 0;
+ {
+ test_ci(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci: a1", i, a1[i], (short)-123);
+ }
+ test_vi(a2, (short)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi: a2", i, a2[i], (short)123);
+ }
+ test_cp(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp: a1", i, a1[i], (short)123);
+ }
+ test_2ci(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci: a1", i, a1[i], (short)-123);
+ errn += verify("test_2ci: a2", i, a2[i], (short)-103);
+ }
+ test_2vi(a1, a2, (short)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi: a1", i, a1[i], (short)123);
+ errn += verify("test_2vi: a2", i, a2[i], (short)103);
+ }
+ // Reset for negative stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_neg(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_neg: a1", i, a1[i], (short)-123);
+ }
+ test_vi_neg(a2, (short)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_neg: a2", i, a2[i], (short)123);
+ }
+ test_cp_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_neg: a1", i, a1[i], (short)123);
+ }
+ test_2ci_neg(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_neg: a1", i, a1[i], (short)-123);
+ errn += verify("test_2ci_neg: a2", i, a2[i], (short)-103);
+ }
+ test_2vi_neg(a1, a2, (short)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_neg: a1", i, a1[i], (short)123);
+ errn += verify("test_2vi_neg: a2", i, a2[i], (short)103);
+ }
+ // Reset for opposite stride
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_oppos(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_ci_oppos: a1", i, a1[i], (short)-123);
+ }
+ test_vi_oppos(a2, (short)123);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_vi_oppos: a2", i, a2[i], (short)123);
+ }
+ test_cp_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_cp_oppos: a1", i, a1[i], (short)123);
+ }
+ test_2ci_oppos(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2ci_oppos: a1", i, a1[i], (short)-123);
+ errn += verify("test_2ci_oppos: a2", i, a2[i], (short)-103);
+ }
+ test_2vi_oppos(a1, a2, (short)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ errn += verify("test_2vi_oppos: a1", i, a1[i], (short)123);
+ errn += verify("test_2vi_oppos: a2", i, a2[i], (short)103);
+ }
+ // Reset for indexing with offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_off(a1);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_off: a1", i, a1[i], (short)-123);
+ }
+ test_vi_off(a2, (short)123);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_off: a2", i, a2[i], (short)123);
+ }
+ test_cp_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_off: a1", i, a1[i], (short)123);
+ }
+ test_2ci_off(a1, a2);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_off: a1", i, a1[i], (short)-123);
+ errn += verify("test_2ci_off: a2", i, a2[i], (short)-103);
+ }
+ test_2vi_off(a1, a2, (short)123, (short)103);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (short)123);
+ errn += verify("test_2vi_off: a2", i, a2[i], (short)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_off: a1", i, a1[i], (short)-1);
+ errn += verify("test_2vi_off: a2", i, a2[i], (short)-1);
+ }
+ // Reset for indexing with invariant offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_inv(a1, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_ci_inv: a1", i, a1[i], (short)-123);
+ }
+ test_vi_inv(a2, (short)123, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_vi_inv: a2", i, a2[i], (short)123);
+ }
+ test_cp_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_cp_inv: a1", i, a1[i], (short)123);
+ }
+ test_2ci_inv(a1, a2, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2ci_inv: a1", i, a1[i], (short)-123);
+ errn += verify("test_2ci_inv: a2", i, a2[i], (short)-103);
+ }
+ test_2vi_inv(a1, a2, (short)123, (short)103, OFFSET);
+ for (int i=OFFSET; i<ARRLEN; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (short)123);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (short)103);
+ }
+ for (int i=0; i<OFFSET; i++) {
+ errn += verify("test_2vi_inv: a1", i, a1[i], (short)-1);
+ errn += verify("test_2vi_inv: a2", i, a2[i], (short)-1);
+ }
+ // Reset for indexing with scale
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_ci_scl(a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : -123;
+ errn += verify("test_ci_scl: a1", i, a1[i], (short)val);
+ }
+ test_vi_scl(a2, (short)123);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_vi_scl: a2", i, a2[i], (short)val);
+ }
+ test_cp_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ int val = (i%SCALE != 0) ? -1 : 123;
+ errn += verify("test_cp_scl: a1", i, a1[i], (short)val);
+ }
+ test_2ci_scl(a1, a2);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a1", i, a1[i], (short)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], (short)-123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2ci_scl: a2", i, a2[i], (short)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], (short)-103);
+ }
+ }
+ test_2vi_scl(a1, a2, (short)123, (short)103);
+ for (int i=0; i<ARRLEN; i++) {
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a1", i, a1[i], (short)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], (short)123);
+ }
+ if (i%SCALE != 0) {
+ errn += verify("test_2vi_scl: a2", i, a2[i], (short)-1);
+ } else if (i*SCALE < ARRLEN) {
+ errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], (short)103);
+ }
+ }
+ // Reset for 2 arrays with relative aligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (short)123);
+ test_cp_alndst(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alndst: a1", i, a1[i], (short)123);
+ }
+ test_vi(a2, (short)-123);
+ test_cp_alnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)-123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_alnsrc: a1", i, a1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_aln(a1, a2);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (short)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln: a2", i, a2[i], (short)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_aln(a1, a2, (short)123, (short)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln: a2", i, a2[i], (short)103);
+ }
+
+ // Reset for 2 arrays with relative unaligned offset
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_vi(a2, (short)123);
+ test_cp_unalndst(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalndst: a1", i, a1[i], (short)123);
+ }
+ test_vi(a2, (short)-123);
+ test_cp_unalnsrc(a1, a2);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)-123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_cp_unalnsrc: a1", i, a1[i], (short)123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2ci_unaln(a1, a2);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (short)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln: a2", i, a2[i], (short)-1);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ a2[i] = -1;
+ }
+ test_2vi_unaln(a1, a2, (short)123, (short)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a1", i, a1[i], (short)-1);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln: a2", i, a2[i], (short)103);
+ }
+
+ // Reset for aligned overlap initialization
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_alndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alndst_overlap: a1", i, a1[i], (short)v);
+ }
+ for (int i=0; i<ALIGN_OFF; i++) {
+ a1[i+ALIGN_OFF] = -1;
+ }
+ test_cp_alnsrc(a1, a1);
+ for (int i=0; i<ALIGN_OFF; i++) {
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)-1);
+ }
+ for (int i=ALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%ALIGN_OFF;
+ errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], (short)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_aln(a1, a1);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (short)-103);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_aln_overlap: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_aln(a1, a1, (short)123, (short)103);
+ for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_aln_overlap: a1", i, a1[i], (short)103);
+ }
+
+ // Reset for unaligned overlap initialization
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i] = (short)i;
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_cp_unalndst(a1, a1);
+ for (int i=0; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], (short)v);
+ }
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ a1[i+UNALIGN_OFF] = -1;
+ }
+ test_cp_unalnsrc(a1, a1);
+ for (int i=0; i<UNALIGN_OFF; i++) {
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)-1);
+ }
+ for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
+ int v = i%UNALIGN_OFF;
+ errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], (short)v);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2ci_unaln(a1, a1);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (short)-103);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], (short)-123);
+ }
+ for (int i=0; i<ARRLEN; i++) {
+ a1[i] = -1;
+ }
+ test_2vi_unaln(a1, a1, (short)123, (short)103);
+ for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (short)123);
+ }
+ for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
+ errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], (short)103);
+ }
+
+ }
+
+ if (errn > 0)
+ return errn;
+
+ System.out.println("Time");
+ long start, end;
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi(a2, (short)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi(a1, a2, (short)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_neg(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_neg(a2, (short)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_neg(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_neg: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_neg(a1, a2, (short)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_neg: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_oppos(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_oppos(a2, (short)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_oppos(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_oppos: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_oppos(a1, a2, (short)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_oppos: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_off(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_off(a2, (short)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_off(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_off: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_off(a1, a2, (short)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_off: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_inv(a1, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_inv(a2, (short)123, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_inv(a1, a2, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_inv: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_inv(a1, a2, (short)123, (short)103, OFFSET);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_inv: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_ci_scl(a1);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_vi_scl(a2, (short)123);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_vi_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_scl(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_scl: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_scl(a1, a2, (short)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_scl: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_alnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_alnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_aln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_aln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_aln(a1, a2, (short)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_aln: " + (end - start));
+
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalndst(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalndst: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_cp_unalnsrc(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_cp_unalnsrc: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2ci_unaln(a1, a2);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2ci_unaln: " + (end - start));
+ start = System.currentTimeMillis();
+ for (int i=0; i<ITERS; i++) {
+ test_2vi_unaln(a1, a2, (short)123, (short)103);
+ }
+ end = System.currentTimeMillis();
+ System.out.println("test_2vi_unaln: " + (end - start));
+
+ return errn;
+ }
+
+ static void test_ci(short[] a) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi(short[] a, short b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp(short[] a, short[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci(short[] a, short[] b) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi(short[] a, short[] b, short c, short d) {
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_neg(short[] a) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ }
+ }
+ static void test_vi_neg(short[] a, short b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b;
+ }
+ }
+ static void test_cp_neg(short[] a, short[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = b[i];
+ }
+ }
+ static void test_2ci_neg(short[] a, short[] b) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_neg(short[] a, short[] b, short c, short d) {
+ for (int i = a.length-1; i >= 0; i-=1) {
+ a[i] = c;
+ b[i] = d;
+ }
+ }
+ static void test_ci_oppos(short[] a) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ }
+ }
+ static void test_vi_oppos(short[] a, short b) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[limit-i] = b;
+ }
+ }
+ static void test_cp_oppos(short[] a, short[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[i] = b[limit-i];
+ }
+ }
+ static void test_2ci_oppos(short[] a, short[] b) {
+ int limit = a.length-1;
+ for (int i = 0; i < a.length; i+=1) {
+ a[limit-i] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_oppos(short[] a, short[] b, short c, short d) {
+ int limit = a.length-1;
+ for (int i = limit; i >= 0; i-=1) {
+ a[i] = c;
+ b[limit-i] = d;
+ }
+ }
+ static void test_ci_off(short[] a) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ }
+ }
+ static void test_vi_off(short[] a, short b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b;
+ }
+ }
+ static void test_cp_off(short[] a, short[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = b[i+OFFSET];
+ }
+ }
+ static void test_2ci_off(short[] a, short[] b) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = -123;
+ b[i+OFFSET] = -103;
+ }
+ }
+ static void test_2vi_off(short[] a, short[] b, short c, short d) {
+ for (int i = 0; i < a.length-OFFSET; i+=1) {
+ a[i+OFFSET] = c;
+ b[i+OFFSET] = d;
+ }
+ }
+ static void test_ci_inv(short[] a, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ }
+ }
+ static void test_vi_inv(short[] a, short b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b;
+ }
+ }
+ static void test_cp_inv(short[] a, short[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = b[i+k];
+ }
+ }
+ static void test_2ci_inv(short[] a, short[] b, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = -123;
+ b[i+k] = -103;
+ }
+ }
+ static void test_2vi_inv(short[] a, short[] b, short c, short d, int k) {
+ for (int i = 0; i < a.length-k; i+=1) {
+ a[i+k] = c;
+ b[i+k] = d;
+ }
+ }
+ static void test_ci_scl(short[] a) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ }
+ }
+ static void test_vi_scl(short[] a, short b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b;
+ }
+ }
+ static void test_cp_scl(short[] a, short[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = b[i*SCALE];
+ }
+ }
+ static void test_2ci_scl(short[] a, short[] b) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = -123;
+ b[i*SCALE] = -103;
+ }
+ }
+ static void test_2vi_scl(short[] a, short[] b, short c, short d) {
+ for (int i = 0; i*SCALE < a.length; i+=1) {
+ a[i*SCALE] = c;
+ b[i*SCALE] = d;
+ }
+ }
+ static void test_cp_alndst(short[] a, short[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_alnsrc(short[] a, short[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = b[i+ALIGN_OFF];
+ }
+ }
+ static void test_2ci_aln(short[] a, short[] b) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i+ALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_aln(short[] a, short[] b, short c, short d) {
+ for (int i = 0; i < a.length-ALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+ALIGN_OFF] = d;
+ }
+ }
+ static void test_cp_unalndst(short[] a, short[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = b[i];
+ }
+ }
+ static void test_cp_unalnsrc(short[] a, short[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = b[i+UNALIGN_OFF];
+ }
+ }
+ static void test_2ci_unaln(short[] a, short[] b) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i+UNALIGN_OFF] = -123;
+ b[i] = -103;
+ }
+ }
+ static void test_2vi_unaln(short[] a, short[] b, short c, short d) {
+ for (int i = 0; i < a.length-UNALIGN_OFF; i+=1) {
+ a[i] = c;
+ b[i+UNALIGN_OFF] = d;
+ }
+ }
+
+ static int verify(String text, int i, short elem, short val) {
+ if (elem != val) {
+ System.err.println(text + "[" + i + "] = " + elem + " != " + val);
+ return 1;
+ }
+ return 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7174363/Test7174363.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * 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 7174363
+ * @summary crash with Arrays.copyOfRange(original, from, to) when from > original.length
+ *
+ * @run main/othervm -XX:-BackgroundCompilation Test7174363
+ */
+
+import java.util.*;
+
+public class Test7174363 {
+
+ static Object[] m(Object[] original, int from, int to) {
+ return Arrays.copyOfRange(original, from, to, Object[].class);
+ }
+
+ static public void main(String[] args) {
+ Object[] orig = new Object[10];
+ for (int i = 0; i < 20000; i++) {
+ try {
+ m(orig, 15, 20);
+ } catch(ArrayIndexOutOfBoundsException excp) {}
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7179138/Test7179138_1.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Skip Balk. 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 7179138
+ * @summary Incorrect result with String concatenation optimization
+ * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation Test7179138_1
+ *
+ * @author Skip Balk
+ */
+
+public class Test7179138_1 {
+ public static void main(String[] args) throws Exception {
+ System.out.println("Java Version: " + System.getProperty("java.vm.version"));
+ long[] durations = new long[60];
+ for (int i = 0; i < 100000; i++) {
+ // this empty for-loop is required to reproduce this bug
+ for (long duration : durations) {
+ // do nothing
+ }
+ {
+ String s = "test";
+ int len = s.length();
+
+ s = new StringBuilder(String.valueOf(s)).append(s).toString();
+ len = len + len;
+
+ s = new StringBuilder(String.valueOf(s)).append(s).toString();
+ len = len + len;
+
+ s = new StringBuilder(String.valueOf(s)).append(s).toString();
+ len = len + len;
+
+ if (s.length() != len) {
+ System.out.println("Failed at iteration: " + i);
+ System.out.println("Length mismatch: " + s.length() + " <> " + len);
+ System.out.println("Expected: \"" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "\"");
+ System.out.println("Actual: \"" + s + "\"");
+ System.exit(97);
+ }
+ }
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7179138/Test7179138_2.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Skip Balk. 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 7179138
+ * @summary Incorrect result with String concatenation optimization
+ * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation Test7179138_2
+ *
+ * @author Skip Balk
+ */
+
+public class Test7179138_2 {
+ public static void main(String[] args) throws Exception {
+ System.out.println("Java Version: " + System.getProperty("java.vm.version"));
+ long[] durations = new long[60];
+ for (int i = 0; i < 100000; i++) {
+ // this empty for-loop is required to reproduce this bug
+ for (long duration : durations) {
+ // do nothing
+ }
+ {
+ String s = "test";
+ int len = s.length();
+
+ s = s + s;
+ len = len + len;
+
+ s = s + s;
+ len = len + len;
+
+ s = s + s;
+ len = len + len;
+
+ if (s.length() != len) {
+ System.out.println("Failed at iteration: " + i);
+ System.out.println("Length mismatch: " + s.length() + " <> " + len);
+ System.out.println("Expected: \"" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "test" + "\"");
+ System.out.println("Actual: \"" + s + "\"");
+ System.exit(0);
+ }
+ }
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/7158800/BadUtf8.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,1254 @@
+/*
+ * 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 7158800
+ * @summary Test that 1200 symbols that hash to the same value triggers
+ * the symbol table alternate hashing mechanism. There isn't actually a
+ * way to verify this.
+ */
+//
+// Generate large number of strings that hash to the same value
+// to slow down symbol table lookup.
+
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+
+public class BadUtf8 {
+static String[] strings = {
+ "EOcLKvbddZyPxYpb",
+ "DncLKvbdPxmAGrqj",
+ "DoCjjvbdpxoIHQdY",
+ "EPCkKvbdqYoHfqEY",
+ "DnbkKvbdezvYdiUX",
+ "DnbjjvbdeEoRbXCj",
+ "EObkKvbdbsCkUEKB",
+ "EOcLKvbdnUtyjiqf",
+ "DncLKvbdRWnDcMHc",
+ "DoCkKvbdrSUkOLAm",
+ "DncLKvbdfNFwGmJk",
+ "EPDLKvbdvAdYroFI",
+ "DoDLKvbdiGibyViu",
+ "DncLKvbdYqNEhmFR",
+ "DoCkKvbdEARhlzXX",
+ "DncLKvbdSZjHsCvA",
+ "DncKjvbdqTsgRqkU",
+ "DnbjjvbdqAiFAXHd",
+ "EPDKjvbdGcjvJaij",
+ "DnbkKvbdwtldpxkn",
+ "DoDKjvbdYkrETnMN",
+ "EPCjjvbdbBWEfQQX",
+ "EPCjjvbduMXwAtBX",
+ "DncLKvbdbsCkTcia",
+ "DoCjjvbdczYpYZRC",
+ "EOcKjvbdFeiqmhsq",
+ "DoCkKvbdKCicQibx",
+ "EOcKjvbdZLrEUOLm",
+ "DoCjjvbdaNKbStmH",
+ "DoDKjvbdJbjDQjDY",
+ "EPCkKvbdemFwGmKL",
+ "EPDKjvbdZQleImEq",
+ "DncKjvbdZjShPfbG",
+ "DnbjjvbdqYnhHREY",
+ "DoCkKvbdaRfDIUGL",
+ "DoDKjvbdLrWlyuQz",
+ "DnbjjvbdZisHofaf",
+ "EObjjvbdhtydvrUb",
+ "DnbjjvbdRotHKGEX",
+ "EObjjvbdNeEThhkE",
+ "EPCjjvbdZtJJZESn",
+ "DoDKjvbdnPyxvLYb",
+ "EPDKjvbdeEoRbWbj",
+ "EOcLKvbdFxttaEXb",
+ "EObjjvbddwystRez",
+ "EPCjjvbdJpzEnenF",
+ "DnbkKvbdTppntuIN",
+ "EPCkKvbdTukpKUBR",
+ "DnbkKvbdhlFEOUcZ",
+ "EObkKvbdlhdUQuRa",
+ "DnbjjvbdkClKqHUg",
+ "EOcKjvbdqTtGqqkU",
+ "DncKjvbdtkwvaUBX",
+ "DoDKjvbdsQWOjCuf",
+ "DncLKvbdEKIJuwjA",
+ "DncKjvbdGLErcIMu",
+ "EOcLKvbdNPwpumfs",
+ "EObkKvbdnVUzLJrG",
+ "DoCkKvbdcTDKsdKB",
+ "DncKjvbdKRZdoFme",
+ "EOcLKvbdemFvgNKL",
+ "EPCkKvbdznopdblY",
+ "EPDLKvbdOYPVzdOU",
+ "DnbjjvbdsZlPsAhO",
+ "DoDLKvbdKCjDRKDY",
+ "DoCkKvbdhuZeXSVC",
+ "EPDKjvbdOStVgEtp",
+ "DncLKvbdvwMAvBWV",
+ "EPDKjvbdBcoaWJlf",
+ "EOcKjvbdZxdKODMS",
+ "DoCjjvbdbsCkTcjB",
+ "EOcLKvbdwWlAuaWV",
+ "DnbjjvbdFejRnJUR",
+ "DnbjjvbdmIdTqVSB",
+ "DnbkKvbdqBIeAWhE",
+ "DncKjvbdrMzJyMIJ",
+ "DoCkKvbdZGvdAOsJ",
+ "DncLKvbdjggLfFnL",
+ "DoCjjvbdYqNFJMdq",
+ "DoCkKvbdqZPHfqDx",
+ "DncLKvbdOEdThiLE",
+ "DoCkKvbdZirgpGaf",
+ "EPDLKvbdziuQPdSt",
+ "EObkKvbdKQyeOenF",
+ "DoDLKvbduaDySndh",
+ "DoCjjvbdVUNUGLvK",
+ "DncKjvbdAMhYrvzY",
+ "DnbkKvbdnQZxvKxb",
+ "EPCjjvbdBhjakJFj",
+ "DncLKvbdmfeYNNfy",
+ "DoDLKvbdjlbLydfo",
+ "DoDLKvbdpyPIGpcx",
+ "EOcLKvbdnVUzLJqf",
+ "DoCjjvbdmJETqVSB",
+ "DoDLKvbdJTZAsMxM",
+ "DoCkKvbdnQZxvLZC",
+ "DoDKjvbdACqwizJQ",
+ "DncKjvbdvBEZSoFI",
+ "DncKjvbdGckVjCJj",
+ "DncLKvbdiMFENtcZ",
+ "Dnbjjvbdjuvmcaww",
+ "DnbkKvbdZyEKNblS",
+ "DoCjjvbduMYXBUBX",
+ "DnbjjvbdFWYopNJe",
+ "DoDKjvbdelfXGljL",
+ "DnbjjvbdakLenmcA",
+ "EPDKjvbdfILWRmpg",
+ "EObjjvbdSLYeuHLT",
+ "DoCjjvbdMfbolotk",
+ "EPDLKvbdrRuKnKaN",
+ "EOcKjvbdyzdnRhIh",
+ "DoDLKvbdGAoRZJzm",
+ "DoCjjvbdhlFDnUcZ",
+ "EPDLKvbdmpZyVkYb",
+ "DncKjvbdTpqPUuIN",
+ "DncLKvbdHDjvJaij",
+ "EPDLKvbdYlRcsmkm",
+ "EPDLKvbdvlvAMdFN",
+ "DncKjvbdIsZArmYM",
+ "EOcLKvbdegjuqnQg",
+ "EOcLKvbdZQmFJNFR",
+ "DoCjjvbdZxdJmcMS",
+ "EPCkKvbdlZTSTYgU",
+ "DoDKjvbdqceJPnWB",
+ "DncLKvbdVgwuxGxz",
+ "DncKjvbdDnbkLXDE",
+ "EPDLKvbdatbHYKsh",
+ "DncKjvbdEzsqFLbi",
+ "EPDLKvbdnVVZkKRf",
+ "EOcKjvbdKeegbBQu",
+ "EPCkKvbdKfGHaaRV",
+ "EPDKjvbdmIctRVRa",
+ "EPCjjvbdRMxBxnUz",
+ "DnbjjvbdJYTbILpp",
+ "EPCkKvbdTAEiHbPE",
+ "EOcLKvbdfelZnGgA",
+ "DoCjjvbdOStWGeUp",
+ "EOcLKvbdemGXHNJk",
+ "DoDKjvbdYTMAmUOx",
+ "EPCkKvbdpyOhGpcx",
+ "EPCkKvbdAMgxsWzY",
+ "DnbjjvbdYkrETnMN",
+ "EPDLKvbdUQqPUtgm",
+ "DncKjvbdehKurNqH",
+ "DoCjjvbdZMSETnLm",
+ "DoDKjvbdIHGyyXwg",
+ "EObjjvbdXGYzUAPT",
+ "DoCjjvbdhbPCeWqR",
+ "DoCkKvbdKNADzGuB",
+ "DnbjjvbdFeirOJTq",
+ "DncLKvbdaRecHtFk",
+ "DnbkKvbdzoPpeClY",
+ "EObkKvbdZRMeJMeR",
+ "DnbjjvbdYfvdAPSi",
+ "DncLKvbdJcKCqJcY",
+ "EOcLKvbdqvokbhyR",
+ "DoDLKvbdrRuLNjaN",
+ "DoCjjvbdTlWPBWOi",
+ "DoCkKvbdjvWnEBxX",
+ "DoDLKvbdTkunaVoJ",
+ "DoCkKvbdQZNAHTSK",
+ "EObjjvbdqwPkbhyR",
+ "EOcLKvbdNHDPlpUk",
+ "DncLKvbdIHHZxxYH",
+ "DncLKvbdtkxXAtAw",
+ "DncLKvbdSCEFMJZL",
+ "DnbjjvbdZQmEhldq",
+ "DoCjjvbdNGbolotk",
+ "DnbjjvbdnCKWwnmu",
+ "DncLKvbdzHZMANEw",
+ "DoDKjvbdmttykJrG",
+ "DnbkKvbdlrZUzSci",
+ "EPDKjvbdSKyGVHKs",
+ "DoCjjvbdKVuGEFGi",
+ "EPCjjvbdCIkBkIej",
+ "DncLKvbdzHZMAMeX",
+ "DnbkKvbdaSFbgsek",
+ "DncLKvbdHDjujBij",
+ "DoDKjvbdGZVUaDwb",
+ "DnbjjvbdZnnJFEzK",
+ "DoCkKvbdtcDUwWOo",
+ "DoCkKvbdlBMoNALA",
+ "EOcKjvbdNsUWHFUp",
+ "DoDLKvbdVUNUFlVj",
+ "DnbkKvbdhkdcnUcZ",
+ "DncLKvbdLiBkqYAS",
+ "EOcKjvbdzoPpdcLx",
+ "EPDKjvbdijGIJmXr",
+ "EOcKjvbdZisHofaf",
+ "DoDLKvbdeOdrkUUS",
+ "DoDLKvbdnPyxvKxb",
+ "EPDKjvbdIxUBhMRQ",
+ "DncLKvbdlhctRUqa",
+ "DoDLKvbdmgFXlnGy",
+ "DncKjvbdCJKbKiGK",
+ "EOcLKvbddndrjtUS",
+ "DnbjjvbdkDLjqGuH",
+ "DncKjvbdmIcsptqa",
+ "DoCkKvbdvvlAvBWV",
+ "EObjjvbdjblLQftg",
+ "DnbjjvbdCEQBWKMf",
+ "DnbjjvbdBdPaVilf",
+ "DoCkKvbdZxcjODLr",
+ "DoCkKvbdEObjjwCd",
+ "EPDKjvbdyTNhlqbH",
+ "EPCkKvbdUMVoAvPJ",
+ "DncKjvbdUxhUZjoO",
+ "DncKjvbdqqtjmkAm",
+ "DncKjvbdKfGICBRV",
+ "EPCjjvbdVrOXaeLc",
+ "EPDLKvbdwXLaWBWV",
+ "EPCkKvbdjblKqHUg",
+ "DnbjjvbduDCuWuoP",
+ "EPDKjvbdNGbpMouL",
+ "EObjjvbdBcoaVjNG",
+ "DncLKvbdrWpMDIxq",
+ "DncLKvbdhaoCdwRR",
+ "DnbkKvbdFxtuBDwb",
+ "DncKjvbdIjEAKPgE",
+ "EOcLKvbduCbuXVoP",
+ "DoDKjvbdZtIiZDsO",
+ "DnbjjvbdEztRElCi",
+ "DncLKvbdxmsHwsJD",
+ "DnbjjvbdRbEElIxk",
+ "DoDKjvbdWHwvXgYz",
+ "EOcKjvbdQlwbYnUz",
+ "EOcLKvbdVTltFkuj",
+ "DncKjvbdliETptqa",
+ "DnbkKvbddoErjtTr",
+ "DoCkKvbdgPazvdXh",
+ "DncKjvbdySmhlqag",
+ "DoCjjvbdbPgHDkzd",
+ "DoCkKvbdFWZPomKF",
+ "EObjjvbdssSSxydc",
+ "EObjjvbdzQnliJwA",
+ "EObkKvbdKCjCpibx",
+ "EPCjjvbdpyOhHREY",
+ "DncLKvbddjJqutzn",
+ "EObkKvbdBdQAujMf",
+ "EPCkKvbdLAjflbXq",
+ "DncLKvbdLBLGlaxR",
+ "DoDLKvbdrpWPJbuf",
+ "DoCjjvbdEKHiuxKA",
+ "DoCjjvbdXsMAlsnx",
+ "EObkKvbdptTgSSLU",
+ "DoDKjvbdnHFXmNfy",
+ "DncKjvbdCJKbKhej",
+ "EPCjjvbdhlEdOUby",
+ "EOcKjvbdKWUfEFGi",
+ "DoDKjvbdZQmFJMdq",
+ "EPCjjvbdiGjDZWKV",
+ "EObkKvbdVAbQrprZ",
+ "DoDKjvbdfekzNgHA",
+ "DoDLKvbdnHEwlmgZ",
+ "DncKjvbdwzHeexEr",
+ "DoCjjvbdmpZxujyC",
+ "EPDKjvbdwMvAMcdm",
+ "DoCjjvbdfHkVrNqH",
+ "EPCkKvbdYzbfRiuy",
+ "EPCkKvbdZtIiZDrn",
+ "DnbjjvbdjvWnDbYX",
+ "DoCjjvbdOStVgEtp",
+ "EPDLKvbdZMSETmlN",
+ "EPDKjvbdBhjajhej",
+ "EPCjjvbddoFTLUUS",
+ "DnbkKvbdsQVoJcWG",
+ "EPCjjvbdrEFJQNvB",
+ "DoCjjvbdMpYRWOGs",
+ "EOcLKvbdZirgpHBf",
+ "EPDLKvbdyOTIXsJD",
+ "DoCkKvbdKRZdnfNe",
+ "DnbjjvbdbBWFFoow",
+ "EPCjjvbdgFlZnHHA",
+ "DnbkKvbdGGJrOIsq",
+ "DoDLKvbduDCtwWPP",
+ "EObjjvbdNddUIhjd",
+ "DnbjjvbdxsNiMqag",
+ "EObjjvbddeOrCWbj",
+ "EObjjvbdPxmAGsRj",
+ "EOcLKvbddeOrCXDK",
+ "DoDLKvbddeOrBwCj",
+ "DoCjjvbdVqnYCElD",
+ "DnbkKvbdUyIUZjoO",
+ "EObjjvbdeFOrCXDK",
+ "EObkKvbdVrNxCFLc",
+ "EObjjvbdTfzmkwWF",
+ "EOcKjvbdIHGzZYYH",
+ "EPDKjvbdtbbuXWPP",
+ "DoCjjvbdZisIQHBf",
+ "EObjjvbdbsCkUDjB",
+ "EPCkKvbdVwJXudFH",
+ "EPDKjvbdrouoKDVf",
+ "EPCkKvbdFyVVBEYC",
+ "DncLKvbdZnnIeEzK",
+ "EPDLKvbdxVNFQxkn",
+ "DoDKjvbdpxnggRDx",
+ "DoDLKvbdqZOgfpcx",
+ "DncKjvbdCIjakJGK",
+ "EPCkKvbdCJLBjhej",
+ "DoDLKvbdnPzYvKxb",
+ "EOcKjvbdqTsgSRkU",
+ "EOcLKvbdLBLGlaxR",
+ "DoDLKvbdcbTMrAUN",
+ "DncLKvbdzitoodSt",
+ "DoDKjvbdJvUfDdfi",
+ "EOcLKvbdHDjvKCJj",
+ "EPCkKvbdeOeTKssr",
+ "DnbkKvbdlYrqsYft",
+ "DncLKvbdiiehKMxS",
+ "DncKjvbdURQoVUhN",
+ "DnbkKvbduMYXBUAw",
+ "DoDLKvbdSPtHJfEX",
+ "EObkKvbdqBJFAWgd",
+ "EOcKjvbdFpATWgFy",
+ "DoDLKvbdBsBDTfXS",
+ "DncKjvbdjhHLfFmk",
+ "DoCjjvbdCJKakIfK",
+ "DnbkKvbddoFSjtTr",
+ "EObkKvbdANIYsWzY",
+ "EObjjvbdCTAbtFvr",
+ "EObjjvbdrRtkOLAm",
+ "DnbkKvbdkxsSTYgU",
+ "DoCjjvbdnBiwXnmu",
+ "EObjjvbdwtmEqYlO",
+ "EPDKjvbdrylQTAhO",
+ "DoDLKvbdtbbtvvOo",
+ "EPCjjvbdZLrETmlN",
+ "EPDLKvbdWXJYWDdg",
+ "DoCkKvbdKQzFOfOF",
+ "EPCjjvbdwzIFfXeS",
+ "DncKjvbdRjyFuHLT",
+ "EPDLKvbdULunaWPJ",
+ "DncKjvbdUxhTykOn",
+ "DnbkKvbdJcKCqKDY",
+ "EPDLKvbdcbSmSATm",
+ "DnbkKvbdegjurNqH",
+ "EPDKjvbdZjTIQGbG",
+ "EPCjjvbdiLddNuCy",
+ "DoCjjvbdZQldiNEq",
+ "EOcLKvbdakMGPODA",
+ "EObjjvbdnHEwlmgZ",
+ "EOcLKvbdBsAcUGXS",
+ "EPCkKvbdiVZdwSUb",
+ "EOcLKvbddCTNSAUN",
+ "DnbkKvbdEXxMUUUM",
+ "DncKjvbdYpldiMeR",
+ "DoDKjvbdNddTiIjd",
+ "DoDLKvbdZLqdUNlN",
+ "EPCkKvbdiBncFWpq",
+ "DncLKvbdiCPDEvqR",
+ "EOcKjvbdUyHszKoO",
+ "DncKjvbdhtydvqtb",
+ "EPCjjvbdpxoHgQcx",
+ "EObkKvbdkWWnDaxX",
+ "DnbjjvbdBhkBkJFj",
+ "DoCkKvbdRacdkhyL",
+ "EOcLKvbdZjTHpHCG",
+ "EPCkKvbdMowqWOGs",
+ "DncLKvbdegjurNpg",
+ "EObjjvbdfMfWfmKL",
+ "EPDLKvbdZirgpGaf",
+ "DoDLKvbdiZuFlQnG",
+ "DncLKvbdFxuVAcxC",
+ "EObkKvbdZisHofaf",
+ "EOcKjvbdJSyBSmYM",
+ "EPDLKvbdVYgtZkPO",
+ "EOcKjvbdRbEFMJYk",
+ "DncLKvbdrEFIonWB",
+ "DncKjvbdKDJbqJcY",
+ "EOcLKvbdhfjCxuiu",
+ "EObjjvbdLLAhWAKZ",
+ "DoCkKvbdRXNcblID",
+ "DoDLKvbdcbSmSATm",
+ "EOcLKvbdwWlAvAuu",
+ "EObkKvbdiBnbdvpq",
+ "DoCkKvbdNQXpumgT",
+ "DncLKvbdkVwOECYX",
+ "DnbkKvbdfoazwDxI",
+ "DoDLKvbdbBWFFpPw",
+ "DoDLKvbdvBDxsPEh",
+ "EPDKjvbdJqZdoFme",
+ "DoDLKvbdIryArmXl",
+ "EPCjjvbdANIZSwZx",
+ "EPCkKvbdVhYVxGxz",
+ "DncKjvbdLAjgNCYR",
+ "DncKjvbdxxIjCQZk",
+ "DncKjvbdbiNKKewY",
+ "EPCjjvbdlrZVZsEJ",
+ "EPDKjvbdIryAsMwl",
+ "DoCkKvbdtAHRIAAr",
+ "EPDKjvbdJmAEZfuB",
+ "EPCkKvbdZjSgogBf",
+ "DoDLKvbdOXnuzcnU",
+ "DnbkKvbdehKvRnQg",
+ "EObjjvbdZyDimbkr",
+ "DoDKjvbdmajWwoOV",
+ "EOcKjvbdkMalZeHP",
+ "EOcKjvbdIjEAJpHE",
+ "EPCkKvbdDihKVxKA",
+ "DncKjvbdNddUIiKd",
+ "EObjjvbdqdFIpOWB",
+ "DoCkKvbdxnShXsJD",
+ "DoDLKvbdjmBkzEfo",
+ "EOcLKvbdatagYLTh",
+ "DoCjjvbdVhYVxHYz",
+ "DnbjjvbdJbjDRKDY",
+ "EPCjjvbdLBLHNCYR",
+ "DnbjjvbdnGeYNOGy",
+ "EOcLKvbdUsmTekvK",
+ "EPCjjvbdtkxXBTaX",
+ "EPCjjvbdzoPqFCkx",
+ "DncKjvbdCIjbKhej",
+ "DncKjvbdZLqdTmkm",
+ "DoDKjvbdsPunicVf",
+ "EOcKjvbdmgFXmNgZ",
+ "EObkKvbdiMFENuCy",
+ "DoDKjvbdhanbeXRR",
+ "EObkKvbdACqwiyhp",
+ "DncKjvbdZisIQHBf",
+ "EPCjjvbdgQBzwDwh",
+ "DnbjjvbdyYJJaoyk",
+ "DoDKjvbdxUldqZMO",
+ "EObkKvbdkClLQgVH",
+ "EPCjjvbdZQldiMeR",
+ "EPDLKvbdZyEKOClS",
+ "EPDLKvbdcIlikFvx",
+ "DoDKjvbdrzMQTBHn",
+ "DnbjjvbdVYgtZkPO",
+ "DoDLKvbdHEKuiajK",
+ "EPCkKvbdczZQXxqC",
+ "DoDKjvbdrDdiQNua",
+ "DncLKvbdcImKLGWx",
+ "DoCjjvbdVYgtZkPO",
+ "EPDLKvbdZnnIeFZj",
+ "EPDKjvbdMIakqYAS",
+ "DoCkKvbdSLYfUgLT",
+ "EPDLKvbdiCObdvpq",
+ "DnbjjvbdRpUHKFcw",
+ "DoDLKvbdIHHZyYXg",
+ "EPCjjvbdypoMhiwA",
+ "DnbkKvbdCEPaVjMf",
+ "DnbkKvbderAvzlDP",
+ "DnbkKvbdZQleImFR",
+ "EOcKjvbdKRZdneme",
+ "DoDLKvbdiBnbeXQq",
+ "DncLKvbdEPDKjvcE",
+ "EOcLKvbdauCGwkTh",
+ "DncLKvbdEvZQPmJe",
+ "EPCkKvbdURQnuVIN",
+ "DncLKvbdegjvSOQg",
+ "EPCjjvbdKaKgMawq",
+ "DnbkKvbdRzKISbvA",
+ "DncLKvbdiLdcnUcZ",
+ "EPDLKvbdkDMKpfuH",
+ "DoDLKvbdRbDdkhyL",
+ "DnbjjvbdDwxMUUTl",
+ "DnbkKvbdrpWPKCuf",
+ "DnbkKvbdNVSqjmAX",
+ "DoDKjvbdRbDeMIxk",
+ "EOcLKvbdcyxpXyRC",
+ "DncLKvbdRMwbYnUz",
+ "EObjjvbdqlzJxlHi",
+ "DoCkKvbdJYUCIMQp",
+ "DncLKvbdLZQjSzuG",
+ "EOcKjvbdxVNEqYkn",
+ "DnbkKvbdZoOIeFZj",
+ "DoCjjvbdBraCtFwS",
+ "EOcLKvbdliDsqVSB",
+ "EPCkKvbdeATqNXif",
+ "DncLKvbdkMbLydgP",
+ "EObjjvbdZxdJmbkr",
+ "DoCjjvbdraellHLZ",
+ "EObkKvbduDCuWvPP",
+ "DoCkKvbdpstGrSLU",
+ "DoCjjvbdLGFgbBQu",
+ "DnbkKvbdhtzFWquC",
+ "EObjjvbdoAKztHdO",
+ "EPDLKvbdatafxKtI",
+ "EPDKjvbdkWXNcaww",
+ "DoCkKvbdwkXEHzzG",
+ "EObkKvbdmgEwmNgZ",
+ "DncKjvbdBiLCLJFj",
+ "DoCjjvbdeOdsKssr",
+ "EOcLKvbdfILWSORH",
+ "EObkKvbdCDpAujMf",
+ "EPDKjvbdKDKDQibx",
+ "DoDKjvbdVUMtGLuj",
+ "EObkKvbdrXQMCiYq",
+ "DncKjvbdePEsLTtS",
+ "DncLKvbdDxYLtUTl",
+ "EPCkKvbdGYuVBEYC",
+ "DncLKvbdNeEUIiKd",
+ "EPCkKvbdpxoIHRDx",
+ "EObjjvbdFkEsDHlu",
+ "EObjjvbdssSSxzFD",
+ "DoCkKvbdUtNTfMVj",
+ "DnbjjvbdJcKDRKDY",
+ "DncKjvbdqiAKEmOe",
+ "DoDKjvbdtlXwAtBX",
+ "DnbkKvbdxmsIYTIc",
+ "EObkKvbdLrXMzUpz",
+ "DoCjjvbdkxsSSxft",
+ "DncKjvbdQlwaxnUz",
+ "EObkKvbdjhGlFfNk",
+ "EPCkKvbdxsNhmRag",
+ "DoDLKvbdMfcPmQUk",
+ "DoDKjvbdQvnEDLhD",
+ "EObjjvbdVgxVxHYz",
+ "DoDLKvbdlrYtyrdJ",
+ "DoCjjvbdezvYeIsw",
+ "DncLKvbdNddTiIjd",
+ "EPDLKvbdGGJrNiUR",
+ "EPDLKvbdRzJhTDWA",
+ "EPCjjvbdvvkaWBVu",
+ "EOcKjvbdRXNdCkgc",
+ "EOcKjvbdQZNAHTSK",
+ "EPCkKvbdsCGNLfkZ",
+ "EOcLKvbdDwwktTsl",
+ "EOcLKvbdqlzJyLgi",
+ "EOcLKvbdxsNiMqag",
+ "EOcLKvbdhzVFlROG",
+ "EOcKjvbdEztRFMCi",
+ "DnbkKvbdqiAJdmPF",
+ "EPDLKvbdjcMKqGtg",
+ "EObkKvbdTlWOaWOi",
+ "EPDLKvbdURRPUuHm",
+ "DoDKjvbdelfWgNKL",
+ "EOcLKvbdGAnqZJzm",
+ "EObjjvbdGZUuAdXb",
+ "DoDLKvbduLwwAtAw",
+ "DoCjjvbdZjTIQGbG",
+ "EPCjjvbdRNXbYnUz",
+ "EPDLKvbdiLeENtby",
+ "EObjjvbdMowpunGs",
+ "EOcKjvbdbiNJjevx",
+ "DoDKjvbdEYYLstTl",
+ "DoDLKvbdqUTfrRjt",
+ "DoDKjvbdbsCkUEJa",
+ "DoDKjvbdXsMBNUPY",
+ "EPCjjvbdRNXaxnUz",
+ "DoDLKvbdNGcQNQUk",
+ "DnbjjvbdEARiMywX",
+ "EPDKjvbdSKxfUfkT",
+ "DncKjvbdhtyeXRtb",
+ "DncKjvbdZLqcsnLm",
+ "EObkKvbdZnmheEzK",
+ "EObjjvbdtbcUvuno",
+ "DnbjjvbdrzMQTBHn",
+ "DnbjjvbdDwwktTsl",
+ "EPDKjvbdkxsSTYgU",
+ "DoDKjvbdIryArlxM",
+ "DoDKjvbdnBivxOnV",
+ "DoDKjvbdeATplwif",
+ "EOcLKvbdKeegbApu",
+ "EPCjjvbdMgDQMotk",
+ "DoCjjvbduCbtwWOo",
+ "DnbkKvbdyNsHwrhc",
+ "DnbkKvbdtvNxJpsA",
+ "EOcLKvbdqAheAWgd",
+ "DoCkKvbdURQoUtgm",
+ "EOcKjvbdqceIpOWB",
+ "DoCkKvbdVwIwudFH",
+ "DnbkKvbdbLMFnmcA",
+ "EOcLKvbdZjTHpHBf",
+ "EOcKjvbdRXNdCkhD",
+ "EPDLKvbdiHJcZViu",
+ "DoCjjvbdxxIjCPzL",
+ "DnbkKvbdBcpBWJmG",
+ "EPCkKvbdZyEKOCkr",
+ "EPDKjvbdOTUWHFVQ",
+ "DoCjjvbdIGgZxwwg",
+ "EPDLKvbdFjeSbhMu",
+ "EPDLKvbdhgKCxvJu",
+ "EOcLKvbdNsUWGdtp",
+ "EPDKjvbduVnXipsA",
+ "DncLKvbdGYuVBEXb",
+ "EPDLKvbdZtIhyESn",
+ "DoDKjvbdZxdJmcLr",
+ "DoCjjvbdUsltGLuj",
+ "DoDKjvbdDoDLKvbd",
+ "DncLKvbdrDdhpNvB",
+ "EPDLKvbdKCjDRJbx",
+ "DoDLKvbdxLWdHzyf",
+ "EObkKvbdrzMQTAhO",
+ "EOcLKvbdOFDtJJKd",
+ "EPCkKvbdrSVKmjaN",
+ "EOcKjvbdWWiYVdEg",
+ "EOcKjvbdWWhwvDdg",
+ "DncKjvbdpstHRqjt",
+ "EPCkKvbdKWVFceGi",
+ "DoCkKvbdZjShPfbG",
+ "DoCkKvbdSxKlNzkY",
+ "EPDLKvbdIwtCHkqQ",
+ "EOcKjvbdsCGNLgLZ",
+ "DncKjvbdzaAOfgCM",
+ "DoDLKvbdxmrhYSiD",
+ "DncLKvbdfMfWgMjL",
+ "EPDKjvbdqFdEsuaI",
+ "EOcLKvbdiLeDnUcZ",
+ "DoCjjvbdKVuFceHJ",
+ "DoCjjvbdfekzNgHA",
+ "EOcKjvbdOFEThiLE",
+ "EPDLKvbdqceJPnWB",
+ "DoDLKvbduCbtwWOo",
+ "DncKjvbdTqROtuIN",
+ "DncKjvbdpedFUWBI",
+ "DoDLKvbdrEFJQNua",
+ "DoDLKvbdyXhjCPyk",
+ "EPCkKvbdJYUBhLqQ",
+ "EPCkKvbdtcCuXVno",
+ "DoDLKvbdZLrEUOLm",
+ "EPCkKvbdpstGrRjt",
+ "DncLKvbddePSCXCj",
+ "EObkKvbdauCHXjsh",
+ "DoDLKvbdkHfkefNk",
+ "EObjjvbdMRwMzUpz",
+ "EObjjvbdaMkCTVNH",
+ "DoCkKvbdGGJrNhtR",
+ "EPDLKvbdvBDxrneI",
+ "EPDLKvbdIHHZxwxH",
+ "EOcLKvbdrJAJdmPF",
+ "EOcKjvbdGZUuAdXb",
+ "EOcLKvbdbUbHYLUI",
+ "DnbjjvbdJzofYEAN",
+ "EPDKjvbdFxtuBDxC",
+ "DnbkKvbdQvnDbkgc",
+ "EPDKjvbdJmADzGta",
+ "DoDKjvbdZRMdhleR",
+ "DnbkKvbdsrqsZZeD",
+ "EObkKvbdrovPJbuf",
+ "EPCjjvbddeOqbXCj",
+ "EObjjvbdtcDVXVoP",
+ "DncKjvbdMfbpNQVL",
+ "DoCkKvbdhbPCeXQq",
+ "DoCkKvbdNHComQVL",
+ "EObjjvbdvBDxroFI",
+ "EPCjjvbdnBivwoNu",
+ "EObjjvbdbhljKewY",
+ "EPDKjvbdZyDimcMS",
+ "EObkKvbdWSOXbElD",
+ "EOcKjvbdTfznMXVe",
+ "EPCjjvbdZtJJYcsO",
+ "DoCjjvbdRjxfVHLT",
+ "DoCkKvbdVTltGMVj",
+ "DncKjvbdYfwEAOri",
+ "DncKjvbdYkrEUOMN",
+ "EObkKvbdqGEEsuaI",
+ "DncLKvbdjJfHimXr",
+ "EPDLKvbddndsLUTr",
+ "DnbkKvbdqBJFAWhE",
+ "EPDLKvbdEOcKjwDE",
+ "EPCkKvbdtvOYJqTA",
+ "DncLKvbdkyTRsZHU",
+ "DoCjjvbdTppnuVIN",
+ "DncLKvbdwyhFeweS",
+ "DncKjvbdsBelkgKy",
+ "DoCjjvbdKDKCqJcY",
+ "DoCjjvbdkClKqHVH",
+ "DoCjjvbdcTCjtDia",
+ "EPDLKvbdUVkpJtAq",
+ "EPDLKvbdRyjITCvA",
+ "DnbjjvbdJuuFcdgJ",
+ "DoDKjvbdrJAJdmOe",
+ "DncKjvbdJcJbqKCx",
+ "DoDLKvbdJcJbqJcY",
+ "DoDKjvbdeEoSCXDK",
+ "DoDLKvbdSwjlNzkY",
+ "EObjjvbdzitopDrt",
+ "DoCkKvbdKWVGEEgJ",
+ "DncKjvbdpssfqrKt",
+ "EOcLKvbdUMWPBVoJ",
+ "DncKjvbdyzdmrIIh",
+ "EPCjjvbdxUldqZLn",
+ "DoDLKvbdySnImRbH",
+ "DoCjjvbdGdKvJaij",
+ "DoCkKvbdxZgeewdr",
+ "EObkKvbdiLddNuDZ",
+ "DnbjjvbdSCDdkiZL",
+ "DncKjvbdznpREcMY",
+ "EOcLKvbdaRebhTfL",
+ "DnbjjvbdZQldiMdq",
+ "EPCjjvbdbrbjtEKB",
+ "EOcKjvbdEARiMzXX",
+ "DoDLKvbdXrkaNTnx",
+ "EPCkKvbdQZNAHTRj",
+ "DoDLKvbdEzspeLcJ",
+ "EPCjjvbduVnYKRTA",
+ "EObjjvbdJXtBhMQp",
+ "EPDKjvbdeOdrjssr",
+ "EPCjjvbdLqwMytpz",
+ "EPDKjvbdUMVoBVoJ",
+ "DncKjvbdRpUGifDw",
+ "EPDLKvbdZyDinDLr",
+ "DnbkKvbdNrsufeVQ",
+ "EPCkKvbdZMSDtNlN",
+ "EPCkKvbdySnJNSCH",
+ "EPCjjvbdfMevfljL",
+ "DncLKvbdXsMBNTnx",
+ "DnbkKvbdpxoHfqDx",
+ "DncLKvbdUQpntthN",
+ "DncKjvbdIsZArlwl",
+ "DoDLKvbdZGwEAOsJ",
+ "EOcKjvbdVvhwvDdg",
+ "EOcLKvbduWNxJqTA",
+ "EPCjjvbdHEKvJaij",
+ "DoDKjvbdrpWOjCuf",
+ "DncLKvbdrpWOjDVf",
+ "DoCjjvbdIHGzYwwg",
+ "DoDLKvbdpxoIGqEY",
+ "DoDLKvbdJcJbqKDY",
+ "DoCjjvbdRWmdClHc",
+ "EPCjjvbdFWYopNJe",
+ "DncKjvbdmfdwlmfy",
+ "DoCkKvbdxUleQxlO",
+ "EObjjvbdnGdxMnGy",
+ "EPCjjvbdvvlAvBVu",
+ "DncLKvbddndsKssr",
+ "EObjjvbdZMRcsnLm",
+ "EOcKjvbdFxttaEXb",
+ "DncKjvbdVUNTfMVj",
+ "EOcLKvbdNrtWHFUp",
+ "DoDKjvbdwuMdqYlO",
+ "EPDLKvbdrXPkbhxq",
+ "EObjjvbdrEFIpNua",
+ "EObjjvbdziuQQDrt",
+ "EOcLKvbdqYoIGpcx",
+ "DnbjjvbdsQVoJcVf",
+ "EObkKvbdkDMKpgUg",
+ "EObjjvbdvBDyTPFI",
+ "DncKjvbduCbuWvOo",
+ "EPCjjvbdkVvnECYX",
+ "DncLKvbdZGvdAOri",
+ "DoCkKvbdrXPlDJZR",
+ "EOcLKvbduCcVWvOo",
+ "DoDKjvbdCEPaWJlf",
+ "EPDKjvbddoErjssr",
+ "DncKjvbdACqxKZiQ",
+ "EPCjjvbdUVlPitAq",
+ "EPDKjvbdjJfHjMxS",
+ "EObkKvbdAMhYsWzY",
+ "DoDKjvbdnBivxOmu",
+ "EOcLKvbdbiNKKfXY",
+ "EPDKjvbdYqMeIleR",
+ "EObkKvbdJmADygUa",
+ "EObjjvbdEPDLLWcE",
+ "EPCjjvbdrXPkcIxq",
+ "EOcLKvbdliDtQtqa",
+ "DoCjjvbdmoyxujyC",
+ "EPDLKvbddoFTLTsr",
+ "EOcLKvbdCWzdJEpW",
+ "DnbjjvbdrEEhpOWB",
+ "DoDKjvbdZLrDtNkm",
+ "EOcLKvbdLFfHbAqV",
+ "EOcKjvbdmttzLKSG",
+ "EOcLKvbdmbJvwoOV",
+ "EOcKjvbdUaCQrqSZ",
+ "DnbjjvbdmgExMnGy",
+ "EPDKjvbddndrkUUS",
+ "EObkKvbdDwwkstTl",
+ "DoCkKvbdcJMjLFwY",
+ "DnbjjvbdaNLBruMg",
+ "DoDLKvbdQYmAHTRj",
+ "DnbkKvbdsQWOicWG",
+ "EObkKvbdMRwMzUpz",
+ "DoDLKvbdZshiZDrn",
+ "EPDLKvbdnPzYujxb",
+ "EOcKjvbdCEQAujMf",
+ "EPDLKvbdKefHbApu",
+ "DoDLKvbdYpldiNFR",
+ "DoCkKvbdFWZQQNJe",
+ "DncLKvbdznpQeCkx",
+ "EOcKjvbdnQZxvKxb",
+ "DoCkKvbdVBBprpqy",
+ "DnbkKvbdZirhPfaf",
+ "DnbkKvbdegjvSNqH",
+ "EOcLKvbdqdEiPnWB",
+ "EObjjvbdBhkCKiGK",
+ "EObjjvbdxZgfGYFS",
+ "DnbjjvbdNQYQumgT",
+ "EPCjjvbdxsNhlrBg",
+ "DoCkKvbdQdDApRDr",
+ "DoCkKvbdxxIiaoyk",
+ "EPDKjvbdFeirNhtR",
+ "DoCjjvbdegjvSOQg",
+ "EObkKvbdqcdiQNvB",
+ "DncLKvbdiMEdNtcZ",
+ "DncLKvbdTqRPUthN",
+ "EPCkKvbdwygeexFS",
+ "DoDKjvbdyTOJMrBg",
+ "DncLKvbdeEoRavbj",
+ "EPCjjvbdtbcUvvOo",
+ "EObjjvbdKCicRJcY",
+ "EObjjvbdZyEKODMS",
+ "DnbjjvbdmJDtQtrB",
+ "DncLKvbdEARhlyvw",
+ "DnbjjvbdIxTbILqQ",
+ "EOcLKvbdwygefYFS",
+ "DoCjjvbdznoqFCkx",
+ "DoCjjvbdRpUGjGDw",
+ "DncKjvbdhzVGMQnG",
+ "EPCjjvbdhkeDnVCy",
+ "EObkKvbdOEdUIiKd",
+ "DncKjvbdrDeIomua",
+ "DncLKvbdiHJbxuiu",
+ "EPDKjvbddxZstRez",
+ "EPDLKvbdmSYuZrdJ",
+ "EObkKvbdVUNUFkvK",
+ "EPDLKvbdNeEUJIjd",
+ "DoCkKvbdiMEdNuCy",
+ "DoDLKvbdRDcApQcr",
+ "EPCjjvbdTlVoBVoJ",
+ "EObjjvbdLBKgNBwq",
+ "EPCkKvbdsCFllHKy",
+ "EObjjvbdnVUzLJqf",
+ "DoDKjvbdqrVLNkBN",
+ "DoCkKvbdqFcdtWBI",
+ "DncLKvbdbVCGxLTh",
+ "EOcLKvbdeFPSCXCj",
+ "EOcLKvbdRpTgKFdX",
+ "EObjjvbdznpQeDLx",
+ "EOcKjvbdjvXNcaxX",
+ "DnbjjvbdHDkWJbJj",
+ "DncKjvbdhkeENuDZ",
+ "DnbkKvbdnUtyjjSG",
+ "DoDKjvbdSQUHJfDw",
+ "DncKjvbdbUbHYLUI",
+ "EOcLKvbdNsTvGduQ",
+ "EPDLKvbdSZigsCvA",
+ "DncKjvbdMfcPlpUk",
+ "DoDLKvbdxrnIlrBg",
+ "DncKjvbdiLdcnVCy",
+ "EPCjjvbdmfeYNOHZ",
+ "DoCkKvbdjvWmcaxX",
+ "DoDKjvbdbUbHXkUI",
+ "DncKjvbdBhkBjiFj",
+ "DoDLKvbdNHColpVL",
+ "EOcKjvbdrykosAhO",
+ "DncLKvbdqGDeUVaI",
+ "DnbkKvbdhgJcZViu",
+ "DnbjjvbduLxXAtBX",
+ "EPCjjvbdYpleJNFR",
+ "EPDLKvbdQvmdClHc",
+ "DnbjjvbdJYTbIMRQ",
+ "DncLKvbdznpRFDMY",
+ "EOcLKvbdZnmiFEyj",
+ "DnbkKvbdrRuLOLAm",
+ "EObkKvbdhkeEOUby",
+ "DncLKvbdYlSEUOLm",
+ "DoCjjvbdhkdcmtby",
+ "DncLKvbdddnrCXDK",
+ "DoDLKvbdKaLHNCYR",
+ "EOcKjvbdcyxpYZQb",
+ "EPDLKvbdACqwjZhp",
+ "DoCkKvbdBsBDTevr",
+ "EObkKvbdeKJqvUzn",
+ "EObkKvbdcImJkGWx",
+ "DncLKvbdYSlAltOx",
+ "DncLKvbdlrYtyrdJ",
+ "EObkKvbdKxqJrztf",
+ "EOcKjvbdsQWPJcVf",
+ "DoDKjvbdkySqrxgU",
+ "EObjjvbdeEoRbXCj",
+ "EOcKjvbdHDkVjBij",
+ "DoDLKvbdCTBCsfXS",
+ "DoCjjvbdKCjDQibx",
+ "DoCjjvbdlhdTqUrB",
+ "DoDKjvbdTulQKTaR",
+ "DoCkKvbdRjxetfkT",
+ "EPCjjvbdEuyQQNKF",
+ "EPCjjvbdDoDKkXDE",
+ "DoCjjvbdsQWPJbuf",
+ "DoDKjvbdhuZdvqtb",
+ "EPDLKvbdiHKCyWJu",
+ "EPDLKvbdLFegaaQu",
+ "DoCjjvbdqZPHgRDx",
+ "DncKjvbdUWMPjUAq",
+ "DoDLKvbdTYKkmzjx",
+ "DoDKjvbdegjvSOQg",
+ "DnbkKvbdUtNTekvK",
+ "EObkKvbdNsTvGeVQ",
+ "DoDLKvbdfNFvgMjL",
+ "EOcLKvbdZQmEiNEq",
+ "EPDKjvbdBraDTfWr",
+ "EPDKjvbdNGcQNQVL",
+ "EPDLKvbdZyEKODMS",
+ "EOcKjvbdBvzdIdpW",
+ "EPCjjvbdACqwiyiQ",
+ "DoCjjvbddePRawCj",
+ "EPDKjvbdWWiXucdg",
+ "DoDKjvbdWexzUAPT",
+ "DnbjjvbdwXMBWBWV",
+ "EOcLKvbdUyHszLOn",
+ "EPCkKvbdOYOuzcnU",
+ "EPCkKvbdhancEwQq",
+ "DnbkKvbdjggLefOL",
+ "EPCkKvbdFjdsDIMu",
+ "DoDKjvbdrSUjmkBN",
+ "DoDLKvbdZjTIQGaf",
+ "DoDKjvbdMgDPmPtk",
+ "EPDLKvbdWRmwbFMD",
+ "DoCkKvbdzROmJKXA",
+ "DnbkKvbdrDdiQNvB",
+ "DnbjjvbduDCtwVoP",
+ "EOcLKvbdCIjbLJFj",
+ "EPDKjvbdXrkaMsnx",
+ "EPDKjvbdVhXvXfxz",
+ "DncKjvbdhbPDEwRR",
+ "DoCkKvbdpxoHgQcx",
+ "DoCkKvbduMXwBUBX",
+ "EObjjvbdNeEThhjd",
+ "DoCjjvbdirzhrkJz",
+ "DoDLKvbdaMkCTUlg",
+ "DncLKvbdWRnYBeLc",
+ "DnbjjvbdGBPRZJzm",
+ "EOcLKvbdeOeSjstS",
+ "DoDLKvbdmIctRVSB",
+ "DoCjjvbdZxdJnDMS",
+ "DoCkKvbdRpTgKFcw",
+ "DncLKvbdTukojTaR",
+ "DnbjjvbdKRZdoFme",
+ "DnbkKvbdURQoVUhN",
+ "DoDLKvbdyYJKBozL",
+ "EObkKvbdfNFwHMjL",
+ "DoDLKvbdZisIQHBf",
+ "EObkKvbdqFcdsuaI",
+ "DncLKvbdzoPqFDLx",
+ "DoDKjvbdSKxeuHLT",
+ "EPDKjvbdsBemLfjy",
+ "DoCjjvbdJbjCqJcY",
+ "DoCjjvbdNPxRVnGs",
+ "DncLKvbdGcjvJbKK",
+ "EOcKjvbdrWpMDIxq",
+ "EOcLKvbdQdDApQcr",
+ "DoDKjvbdZMRdTnLm",
+ "EOcLKvbddxZssrFz",
+ "EObjjvbdUtNTfLuj",
+ "EPCjjvbdLLBIWAKZ",
+ "DoCkKvbdgFlZmfgA",
+ "EPCjjvbdUVkoitAq",
+ "DoDKjvbdDncKjvcE",
+ "DoDLKvbdRpUHJfEX",
+ "EPDKjvbdLqvlzVQz",
+ "EPDKjvbdZMRdUOLm",
+ "EOcLKvbdCJLBkIfK",
+ "DncKjvbdaSFbhUFk",
+ "EPDLKvbdZoNheEzK",
+ "DncKjvbdUVlPjUAq",
+ "DnbkKvbdKNADyfuB",
+ "EObkKvbdZdwfzghb",
+ "EPDLKvbdZtIhxcrn",
+ "EObkKvbdGckViajK",
+ "DncLKvbdFfJqmiUR",
+ "DncKjvbdKWUfDdgJ",
+ "DoDKjvbdMtrqjmAX",
+ "EOcLKvbdsQWPKDVf",
+ "DoCjjvbdwtleRZMO",
+ "EObjjvbduaDxsPEh",
+ "EPDLKvbdKxqJrzuG",
+ "EOcKjvbdVAaprprZ",
+ "EObjjvbdEuxopMjF",
+ "DnbjjvbdyOTHwriD",
+ "EPDLKvbdrpVnibvG",
+ "EPDKjvbdkWWnDaww",
+ "DncLKvbdrXPkbiYq",
+ "DoDLKvbddxZssqez",
+ "EOcLKvbdHDkWJbJj",
+ "DncLKvbdEPCkLWcE",
+ "DnbkKvbdEXwkstTl",
+ "EObjjvbdqiAKEmOe",
+ "DncLKvbdjAQGaQGj",
+ "EPCjjvbdNeDtJJKd",
+ "EPCjjvbdvwMBWBVu",
+ "EPDKjvbdFejSOItR",
+ "EOcLKvbdNPwqWOHT",
+ "EPDKjvbdbsCjscia",
+ "EObkKvbdyYIiaoyk",
+ "DoDKjvbdLZQirzuG",
+ "EObjjvbdSLZGVGjs",
+ "DoCjjvbdAMgxsWzY",
+ "DoDLKvbdEObjjwCd",
+ "DnbkKvbdsPvOicWG",
+ "EPCkKvbdrJAKElne",
+ "EPCkKvbdauCGwjsh",
+ "DncLKvbdegkWRnQg",
+ "EPCkKvbdYpmEiNFR",
+ "DoDKjvbduaDxsPFI",
+ "DoCjjvbdcyxoxYqC",
+ "DoCkKvbdkMakzFHP",
+ "DnbjjvbdJbibqJbx",
+ "DnbkKvbdWWhxWDeH",
+ "DoCjjvbdssRsYzFD",
+ "DoDKjvbdpyPIHRDx",
+ "DncLKvbdwNWANDeN",
+ "DoDKjvbdJYUBglRQ",
+ "EObkKvbdXnRAYVVt",
+ "DoCjjvbdUWLpKTaR",
+ "DoDKjvbdTqROttgm",
+ "EPCkKvbdVqnXaeMD",
+ "EObjjvbdADRwiyiQ",
+ "DoDKjvbdlrZUyrci",
+ "EPDKjvbdvAdZSndh",
+ "DoCkKvbdzoQQeDLx",
+ "DnbkKvbdSQUGjFdX",
+ "EOcLKvbdqBJFAXIE",
+ "EObkKvbdSCEFLiZL",
+ "DnbjjvbdzoQQdcMY",
+ "DnbkKvbdpxngfqEY",
+ "DncLKvbdbsDLUEKB",
+ "DoCjjvbdXrlBMtOx",
+ "EObjjvbdKCjDQicY",
+ "DncLKvbdLrWlzUpz",
+ "EObjjvbdaaWEfQQX",
+ "EObjjvbdtlYWaTaX",
+ "DnbkKvbdMowpunGs",
+ "EObkKvbdSLYeuHKs",
+ "EObkKvbdTAEhhCOd",
+ "EPCkKvbdmSYtyrci",
+ "DncLKvbdYkqcsnLm",
+ "DoDLKvbdrylQTAgn",
+ "DncLKvbdJXtCIMRQ",
+ "EObkKvbdSBdElIyL",
+ "DoDLKvbdwygefYFS",
+ "DncKjvbdyXhibPzL",
+ "EPCjjvbduaDxsPFI",
+ "EObjjvbdZoNiFEzK",
+ "EPCjjvbdkNBkyeHP",
+ "EPCkKvbdWRnXadlD",
+ "DncLKvbdRWmdDLhD",
+ "DnbkKvbdmSYtzTDi",
+ "EOcKjvbdkVwODbXw",
+ "DncLKvbdQlxCZOUz",
+ "EObjjvbdbhlijfXY",
+ "EOcLKvbdXmqAXtut",
+ "EOcLKvbdmbKXXnnV",
+ "DoDKjvbdkHgMFfOL",
+ "EPCkKvbdfekymgHA",
+ "DoCjjvbdeKKRvUzn",
+ "DoDKjvbdkHfkefNk",
+ "DoCjjvbdyqPMiKXA",
+ "DnbjjvbdUQqOtuIN",
+ "EOcKjvbdEPCkKwDE",
+ "DoDLKvbdZRNFIleR",
+ "DnbjjvbdRacdlJZL",
+ "EOcLKvbdTukoitAq",
+ "EOcLKvbdZLrDtOMN",
+ "EOcLKvbdgKfzcGAE",
+ "EObjjvbdzjVQQESt",
+ "EOcLKvbdcIlijevx",
+ "EOcKjvbdGKdsDHmV",
+ "DncLKvbdKkBHvAJy",
+ "EOcKjvbdZMRctOLm",
+ "EPCkKvbdADRxKZiQ",
+ "EObjjvbdDwxLsssl",
+ "EPDLKvbdUxgszLPO",
+ "EPCkKvbdSQTfiedX",
+ "EPCjjvbdNeEUJIkE",
+ "DoDLKvbdpyPHfqDx",
+ "DnbkKvbdyOShXsJD",
+ "DncLKvbdLiBkpxAS",
+ "DoDKjvbdaaWEepQX",
+ "DoCjjvbdWSOYBeLc",
+ "EOcKjvbdLFegbAqV",
+ "EPDKjvbdffLzOGgA",
+ "EObkKvbdFkErbglu",
+ "DncLKvbdiZuFlROG",
+ "DncKjvbdegkWRnQg",
+ "DoDLKvbdQdDApRDr",
+ "EOcLKvbdeYZtURez",
+ "EObjjvbdrXQLcIxq",
+ "DoDLKvbdxZhGGXeS",
+ "DoDLKvbdGGKSOItR",
+ "EObjjvbdjhHLfFnL",
+ "EOcLKvbdUQpoUuHm",
+ "DoCkKvbdXrlBNUPY",
+ "DoDKjvbdJXtCIMRQ",
+ "DnbkKvbdZMSDsnLm",
+ "DncKjvbdCTBDUGWr",
+ "DncKjvbdbhlikGXY",
+ "DoDKjvbdXmqAYVWU",
+ "DnbjjvbdliDsqVRa",
+ "DnbkKvbdmajXYOnV",
+ "EObjjvbdJpyePGNe",
+ "DnbkKvbdCTAcUGXS",
+ "DoDLKvbdCDpBVjNG",
+ "EOcLKvbdxwhiaoyk",
+ "DoDKjvbdxVNFQyMO",
+ "EPCkKvbdVvhwvEEg",
+ "DnbkKvbdFWYoomJe",
+ "EOcKjvbdlrZUysEJ",
+ "EPDKjvbdqquKnKaN",
+ "DoCkKvbdTkunaVoJ",
+ "EOcLKvbdfHkVrOQg",
+ "EPDLKvbdiUzFWrUb",
+ "DoDLKvbdtAGqIABS",
+ "DoCkKvbdZRMdhmEq",
+ "DnbkKvbdNsUVfeVQ",
+ "EPDLKvbdqwPkbiZR",
+ "DoCkKvbdNUsSLNAX",
+ "DncKjvbdmpZxvKyC",
+ "EPCkKvbdLYqKSztf",
+ "EPDKjvbdZyEKODMS",
+ "EPDKjvbdNGbomPuL",
+ "DncKjvbdZMSDtNlN",
+ "EPCjjvbdTXjkmzjx",
+ "EObkKvbdBdQAvKMf",
+ "EOcLKvbdkySrTYgU",
+ "DnbkKvbdZoOIddzK",
+ "DoCkKvbdZMSDsmkm",
+ "EPCkKvbdCWzdIdpW",
+ "DncLKvbdBvzdIdov",
+ "DoCjjvbdaRfDHtFk",
+ "DnbkKvbdWeyZtAOs",
+ "DoDLKvbdnCJwYPOV",
+ "DoCjjvbdEYYLstUM",
+ "EOcLKvbdwtldqZMO",
+ "EPCjjvbdFVxoomKF",
+ "EObkKvbdyqPMhiwA",
+ "DoDLKvbdkxrrSxgU",
+ "DoCjjvbdeATqNYKG",
+ "DncLKvbdJKEAJpHE",
+ "DoCkKvbddndsLUTr",
+ "DnbjjvbdqFceUWBI",
+ "DoDLKvbdhkddOUby",
+ "DncKjvbdGKdrcIMu",
+ "EPCkKvbdelevflik",
+ "DoDKjvbdhaoDFWqR",
+ "DoCjjvbdYlSDsmlN",
+ "EPCjjvbdiZuGLpmf",
+ "EObkKvbdnCJvxPNu",
+ "DnbkKvbdhzUelRNf",
+ "DnbkKvbdZeYGzgiC",
+ "DoCkKvbdDnbkLWbd",
+ "DnbkKvbdnHFYMmfy",
+ "DoCjjvbdePEsKtTr",
+ "DnbjjvbdZQmEhleR",
+ "DnbkKvbdTkunaVoJ",
+ "DnbkKvbdFWZPpMjF",
+ "DoDKjvbdSwkMNzkY",
+ "EOcLKvbdwtldpyMO",
+ "EOcKjvbdhkdcmtby",
+ "DoCjjvbdNQXqWNfs",
+ "EPDKjvbdzjUpPdTU",
+ "DnbjjvbdqceJPnWB",
+ "EPDKjvbdUyHsyjoO",
+ "EPCkKvbdZshhxcsO",
+ "DncKjvbdqAiFAWgd",
+ "EObkKvbdgFkzOGgA",
+ "DncKjvbdmgFYNNgZ",
+ "DoDLKvbdDjHjWYKA",
+ "DnbjjvbdJbicRKCx",
+ "DnbkKvbdfNFwHMjL",
+ "EPCkKvbdWSNxBdlD",
+ "EPDLKvbdCJKbLJFj",
+ "EPDKjvbdEOcKkXDE",
+ "EPCkKvbdVrOYCElD",
+ "DnbjjvbdCIkBjhej",
+ "DoDLKvbddoFTKstS",
+ "DnbjjvbduDDVXVoP",
+ "EObkKvbdxwiKCPzL",
+ "DnbkKvbdZGvdAPTJ",
+ "DoDLKvbdBdPaVjNG",
+ "EOcKjvbdIHGzYwxH",
+ "DoCjjvbdGFjSNhsq",
+ "DnbjjvbdlYsSSxgU",
+ "EPCjjvbdqrUjnKaN",
+ "EOcLKvbdtvOXipsA",
+ "DoDLKvbdrounjCuf",
+ "DoCkKvbdFVyPomKF",
+ "EOcKjvbdNHCpNPtk",
+ "EPDLKvbdWeyZtAPT",
+ "EPDKjvbdjcLkQfuH",
+ "EOcLKvbdzHZMAMeX",
+ "DoCjjvbdUMWPBVni",
+ "EOcKjvbdHELWKBjK",
+ "DoDKjvbdMgComQUk",
+ "DnbkKvbdiGjDZWJu",
+ "DncKjvbdyqOmJKXA",
+ "DoDKjvbdVZITyjoO",
+ "DoCjjvbdzQoNJJwA",
+ "EOcLKvbdGAoQxizm",
+ "DoDKjvbdatagYKsh",
+ "EPDKjvbdSBceMJYk",
+ "DoDLKvbdMpYQvOHT",
+ "DncKjvbdiCOcFWpq",
+ "DoCjjvbdUGznLvvF",
+ "EPDLKvbdANIYrvyx",
+ "EPCjjvbdIwtCHkpp",
+ "EObkKvbdJSyBSmYM",
+ "EObkKvbdwuMdqYlO",
+ "EObjjvbdmuVZkKSG",
+ "DncLKvbdSPsfjFdX",
+ "DoDLKvbdSQUHJedX",
+ "DoDKjvbdiVZdwSUb",
+ "EPDLKvbdRjxfVGkT",
+ "EObjjvbdmpZyVkZC",
+ "DncLKvbdhzUelROG",
+ "EPCkKvbdxVMeRZMO",
+ "EOcKjvbdxxIiapZk",
+ "EOcKjvbdJSyBTNYM",
+ "EPDKjvbdMSXMzUpz",
+ "EObkKvbdJmADzHVB" };
+
+ public static void main(java.lang.String[] unused) {
+ try {
+ BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("bad.out"));
+ for (int i = 0; i < strings.length; i++) {
+ out.write(strings[i].getBytes());
+ out.write("\n".getBytes());
+ }
+ out.close();
+ } catch (Exception e) {
+ System.out.println("Some exception occurred");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/7158800/InternTest.java Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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 7158800
+ * @run shell/timeout=400 Test7158800.sh
+ * @summary This test performs poorly if alternate hashing isn't used for
+ * string table.
+ * The timeout is handled by the shell file (which kills the process)
+ */
+import java.util.*;
+import java.io.*;
+
+public class InternTest {
+ public static void main (String args[]) throws Exception {
+ final String badStringsFilename = "badstrings.txt";
+
+ if (args.length == 0 || (!args[0].equals("bad") && !args[0].equals("normal"))) {
+ System.out.println("Usage: java InternTest [normal|bad]");
+ System.exit(1);
+ }
+
+ FileInputStream fstream = new FileInputStream(badStringsFilename);
+ DataInputStream in = new DataInputStream(fstream);
+ BufferedReader br = new BufferedReader(new InputStreamReader(in));
+ String toIntern, toDiscard;
+ int count = 0;
+ long current = 0L;
+ long last = System.currentTimeMillis();
+
+ if (args[0].equals("bad")) {
+ while ((toIntern = br.readLine()) != null) {
+ toDiscard = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString());
+ toIntern.intern();
+ count++;
+ if (count % 10000 == 0 && count != 0) {
+ current = System.currentTimeMillis();
+ System.out.println(new Date(current) + ": interned " + count + " 0-hash strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)");
+ last = current;
+ }
+ }
+ }
+ if (args[0].equals("normal")) {
+ while ((toDiscard = br.readLine()) != null) { // do the same read from the file to try and make the test fair
+ toIntern = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString());
+ toIntern.intern();
+ count++;
+ if (count % 10000 == 0 && count != 0) {
+ current = System.currentTimeMillis();
+ System.out.println(new Date(current) + ": interned " + count + " normal strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)");
+ last = current;
+ }
+ }
+ }
+ in.close();
+ }
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/7158800/Test7158800.sh Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,91 @@
+#!/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.
+#
+#
+# Run test for InternTest.java
+#
+
+if [ "${TESTSRC}" = "" ]
+then TESTSRC=.
+fi
+
+if [ "${TESTJAVA}" = "" ]
+then
+ PARENT=`dirname \`which java\``
+ TESTJAVA=`dirname ${PARENT}`
+ echo "TESTJAVA not set, selecting " ${TESTJAVA}
+ echo "If this is incorrect, try setting the variable manually."
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ SunOS | Linux )
+ NULL=/dev/null
+ PS=":"
+ FS="/"
+ ;;
+ Windows_* )
+ NULL=NUL
+ PS=";"
+ FS="\\"
+ ;;
+ * )
+ echo "Unrecognized system!"
+ exit 1;
+ ;;
+esac
+
+JEMMYPATH=${CPAPPEND}
+CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
+
+THIS_DIR=`pwd`
+
+${TESTJAVA}${FS}bin${FS}java -fullversion
+
+${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}InternTest.java
+
+cp ${TESTSRC}${FS}badstrings.txt .
+
+${TESTJAVA}${FS}bin${FS}java -XX:+PrintStringTableStatistics -XX:+TraceSafepointCleanupTime InternTest bad > test.out 2>&1 &
+C_PID=$!
+
+sleep 60
+
+ps | grep ${C_PID} | grep -v grep
+
+if [ $? = 0 ]
+then
+ kill -9 ${C_PID}
+ echo "Test Failed"
+ exit 1
+else
+ echo "Test Passed"
+ exit 0
+fi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/7158800/badstrings.txt Wed Jul 05 18:15:17 2017 +0200
@@ -0,0 +1,30001 @@
+EOcLKvbddZyPxYpb
+DncLKvbdPxmAGrqj
+DoCjjvbdpxoIHQdY
+EPCkKvbdqYoHfqEY
+DnbkKvbdezvYdiUX
+DnbjjvbdeEoRbXCj
+EObkKvbdbsCkUEKB
+EOcLKvbdnUtyjiqf
+DncLKvbdRWnDcMHc
+DoCkKvbdrSUkOLAm
+DncLKvbdfNFwGmJk
+EPDLKvbdvAdYroFI
+DoDLKvbdiGibyViu
+DncLKvbdYqNEhmFR
+DoCkKvbdEARhlzXX
+DncLKvbdSZjHsCvA
+DncKjvbdqTsgRqkU
+DnbjjvbdqAiFAXHd
+EPDKjvbdGcjvJaij
+DnbkKvbdwtldpxkn
+DoDKjvbdYkrETnMN
+EPCjjvbdbBWEfQQX
+EPCjjvbduMXwAtBX
+DncLKvbdbsCkTcia
+DoCjjvbdczYpYZRC
+EOcKjvbdFeiqmhsq
+DoCkKvbdKCicQibx
+EOcKjvbdZLrEUOLm
+DoCjjvbdaNKbStmH
+DoDKjvbdJbjDQjDY
+EPCkKvbdemFwGmKL
+EPDKjvbdZQleImEq
+DncKjvbdZjShPfbG
+DnbjjvbdqYnhHREY
+DoCkKvbdaRfDIUGL
+DoDKjvbdLrWlyuQz
+DnbjjvbdZisHofaf
+EObjjvbdhtydvrUb
+DnbjjvbdRotHKGEX
+EObjjvbdNeEThhkE
+EPCjjvbdZtJJZESn
+DoDKjvbdnPyxvLYb
+EPDKjvbdeEoRbWbj
+EOcLKvbdFxttaEXb
+EObjjvbddwystRez
+EPCjjvbdJpzEnenF
+DnbkKvbdTppntuIN
+EPCkKvbdTukpKUBR
+DnbkKvbdhlFEOUcZ
+EObkKvbdlhdUQuRa
+DnbjjvbdkClKqHUg
+EOcKjvbdqTtGqqkU
+DncKjvbdtkwvaUBX
+DoDKjvbdsQWOjCuf
+DncLKvbdEKIJuwjA
+DncKjvbdGLErcIMu
+EOcLKvbdNPwpumfs
+EObkKvbdnVUzLJrG
+DoCkKvbdcTDKsdKB
+DncKjvbdKRZdoFme
+EOcLKvbdemFvgNKL
+EPCkKvbdznopdblY
+EPDLKvbdOYPVzdOU
+DnbjjvbdsZlPsAhO
+DoDLKvbdKCjDRKDY
+DoCkKvbdhuZeXSVC
+EPDKjvbdOStVgEtp
+DncLKvbdvwMAvBWV
+EPDKjvbdBcoaWJlf
+EOcKjvbdZxdKODMS
+DoCjjvbdbsCkTcjB
+EOcLKvbdwWlAuaWV
+DnbjjvbdFejRnJUR
+DnbjjvbdmIdTqVSB
+DnbkKvbdqBIeAWhE
+DncKjvbdrMzJyMIJ
+DoCkKvbdZGvdAOsJ
+DncLKvbdjggLfFnL
+DoCjjvbdYqNFJMdq
+DoCkKvbdqZPHfqDx
+DncLKvbdOEdThiLE
+DoCkKvbdZirgpGaf
+EPDLKvbdziuQPdSt
+EObkKvbdKQyeOenF
+DoDLKvbduaDySndh
+DoCjjvbdVUNUGLvK
+DncKjvbdAMhYrvzY
+DnbkKvbdnQZxvKxb
+EPCjjvbdBhjakJFj
+DncLKvbdmfeYNNfy
+DoDLKvbdjlbLydfo
+DoDLKvbdpyPIGpcx
+EOcLKvbdnVUzLJqf
+DoCjjvbdmJETqVSB
+DoDLKvbdJTZAsMxM
+DoCkKvbdnQZxvLZC
+DoDKjvbdACqwizJQ
+DncKjvbdvBEZSoFI
+DncKjvbdGckVjCJj
+DncLKvbdiMFENtcZ
+Dnbjjvbdjuvmcaww
+DnbkKvbdZyEKNblS
+DoCjjvbduMYXBUBX
+DnbjjvbdFWYopNJe
+DoDKjvbdelfXGljL
+DnbjjvbdakLenmcA
+EPDKjvbdfILWRmpg
+EObjjvbdSLYeuHLT
+DoCjjvbdMfbolotk
+EPDLKvbdrRuKnKaN
+EOcKjvbdyzdnRhIh
+DoDLKvbdGAoRZJzm
+DoCjjvbdhlFDnUcZ
+EPDLKvbdmpZyVkYb
+DncKjvbdTpqPUuIN
+DncLKvbdHDjvJaij
+EPDLKvbdYlRcsmkm
+EPDLKvbdvlvAMdFN
+DncKjvbdIsZArmYM
+EOcLKvbdegjuqnQg
+EOcLKvbdZQmFJNFR
+DoCjjvbdZxdJmcMS
+EPCkKvbdlZTSTYgU
+DoDKjvbdqceJPnWB
+DncLKvbdVgwuxGxz
+DncKjvbdDnbkLXDE
+EPDLKvbdatbHYKsh
+DncKjvbdEzsqFLbi
+EPDLKvbdnVVZkKRf
+EOcKjvbdKeegbBQu
+EPCkKvbdKfGHaaRV
+EPDKjvbdmIctRVRa
+EPCjjvbdRMxBxnUz
+DnbjjvbdJYTbILpp
+EPCkKvbdTAEiHbPE
+EOcLKvbdfelZnGgA
+DoCjjvbdOStWGeUp
+EOcLKvbdemGXHNJk
+DoDKjvbdYTMAmUOx
+EPCkKvbdpyOhGpcx
+EPCkKvbdAMgxsWzY
+DnbjjvbdYkrETnMN
+EPDLKvbdUQqPUtgm
+DncKjvbdehKurNqH
+DoCjjvbdZMSETnLm
+DoDKjvbdIHGyyXwg
+EObjjvbdXGYzUAPT
+DoCjjvbdhbPCeWqR
+DoCkKvbdKNADzGuB
+DnbjjvbdFeirOJTq
+DncLKvbdaRecHtFk
+DnbkKvbdzoPpeClY
+EObkKvbdZRMeJMeR
+DnbjjvbdYfvdAPSi
+DncLKvbdJcKCqJcY
+EOcLKvbdqvokbhyR
+DoDLKvbdrRuLNjaN
+DoCjjvbdTlWPBWOi
+DoCkKvbdjvWnEBxX
+DoDLKvbdTkunaVoJ
+DoCkKvbdQZNAHTSK
+EObjjvbdqwPkbhyR
+EOcLKvbdNHDPlpUk
+DncLKvbdIHHZxxYH
+DncLKvbdtkxXAtAw
+DncLKvbdSCEFMJZL
+DnbjjvbdZQmEhldq
+DoCjjvbdNGbolotk
+DnbjjvbdnCKWwnmu
+DncLKvbdzHZMANEw
+DoDKjvbdmttykJrG
+DnbkKvbdlrZUzSci
+EPDKjvbdSKyGVHKs
+DoCjjvbdKVuGEFGi
+EPCjjvbdCIkBkIej
+DncLKvbdzHZMAMeX
+DnbkKvbdaSFbgsek
+DncLKvbdHDjujBij
+DoDKjvbdGZVUaDwb
+DnbjjvbdZnnJFEzK
+DoCkKvbdtcDUwWOo
+DoCkKvbdlBMoNALA
+EOcKjvbdNsUWHFUp
+DoDLKvbdVUNUFlVj
+DnbkKvbdhkdcnUcZ
+DncLKvbdLiBkqYAS
+EOcKjvbdzoPpdcLx
+EPDKjvbdijGIJmXr
+EOcKjvbdZisHofaf
+DoDLKvbdeOdrkUUS
+DoDLKvbdnPyxvKxb
+EPDKjvbdIxUBhMRQ
+DncLKvbdlhctRUqa
+DoDLKvbdmgFXlnGy
+DncKjvbdCJKbKiGK
+EOcLKvbddndrjtUS
+DnbjjvbdkDLjqGuH
+DncKjvbdmIcsptqa
+DoCkKvbdvvlAvBWV
+EObjjvbdjblLQftg
+DnbjjvbdCEQBWKMf
+DnbjjvbdBdPaVilf
+DoCkKvbdZxcjODLr
+DoCkKvbdEObjjwCd
+EPDKjvbdyTNhlqbH
+EPCkKvbdUMVoAvPJ
+DncKjvbdUxhUZjoO
+DncKjvbdqqtjmkAm
+DncKjvbdKfGICBRV
+EPCjjvbdVrOXaeLc
+EPDLKvbdwXLaWBWV
+EPCkKvbdjblKqHUg
+DnbjjvbduDCuWuoP
+EPDKjvbdNGbpMouL
+EObjjvbdBcoaVjNG
+DncLKvbdrWpMDIxq
+DncLKvbdhaoCdwRR
+DnbkKvbdFxtuBDwb
+DncKjvbdIjEAKPgE
+EOcLKvbduCbuXVoP
+DoDKjvbdZtIiZDsO
+DnbjjvbdEztRElCi
+DncLKvbdxmsHwsJD
+DnbjjvbdRbEElIxk
+DoDKjvbdWHwvXgYz
+EOcKjvbdQlwbYnUz
+EOcLKvbdVTltFkuj
+DncKjvbdliETptqa
+DnbkKvbddoErjtTr
+DoCkKvbdgPazvdXh
+DncKjvbdySmhlqag
+DoCjjvbdbPgHDkzd
+DoCkKvbdFWZPomKF
+EObjjvbdssSSxydc
+EObjjvbdzQnliJwA
+EObkKvbdKCjCpibx
+EPCjjvbdpyOhHREY
+DncLKvbddjJqutzn
+EObkKvbdBdQAujMf
+EPCkKvbdLAjflbXq
+DncLKvbdLBLGlaxR
+DoDLKvbdrpWPJbuf
+DoCjjvbdEKHiuxKA
+DoCjjvbdXsMAlsnx
+EObkKvbdptTgSSLU
+DoDKjvbdnHFXmNfy
+DncKjvbdCJKbKhej
+EPCjjvbdhlEdOUby
+EOcKjvbdKWUfEFGi
+DoDKjvbdZQmFJMdq
+EPCjjvbdiGjDZWKV
+EObkKvbdVAbQrprZ
+DoDKjvbdfekzNgHA
+DoDLKvbdnHEwlmgZ
+DncKjvbdwzHeexEr
+DoCjjvbdmpZxujyC
+EPDKjvbdwMvAMcdm
+DoCjjvbdfHkVrNqH
+EPCkKvbdYzbfRiuy
+EPCkKvbdZtIiZDrn
+DnbjjvbdjvWnDbYX
+DoCjjvbdOStVgEtp
+EPDLKvbdZMSETmlN
+EPDKjvbdBhjajhej
+EPCjjvbddoFTLUUS
+DnbkKvbdsQVoJcWG
+EPCjjvbdrEFJQNvB
+DoCjjvbdMpYRWOGs
+EOcLKvbdZirgpHBf
+EPDLKvbdyOTIXsJD
+DoCkKvbdKRZdnfNe
+DnbjjvbdbBWFFoow
+EPCjjvbdgFlZnHHA
+DnbkKvbdGGJrOIsq
+DoDLKvbduDCtwWPP
+EObjjvbdNddUIhjd
+DnbjjvbdxsNiMqag
+EObjjvbddeOrCWbj
+EObjjvbdPxmAGsRj
+EOcLKvbddeOrCXDK
+DoDLKvbddeOrBwCj
+DoCjjvbdVqnYCElD
+DnbkKvbdUyIUZjoO
+EObjjvbdeFOrCXDK
+EObkKvbdVrNxCFLc
+EObjjvbdTfzmkwWF
+EOcKjvbdIHGzZYYH
+EPDKjvbdtbbuXWPP
+DoCjjvbdZisIQHBf
+EObjjvbdbsCkUDjB
+EPCkKvbdVwJXudFH
+EPDKjvbdrouoKDVf
+EPCkKvbdFyVVBEYC
+DncLKvbdZnnIeEzK
+EPDLKvbdxVNFQxkn
+DoDKjvbdpxnggRDx
+DoDLKvbdqZOgfpcx
+DncKjvbdCIjakJGK
+EPCkKvbdCJLBjhej
+DoDLKvbdnPzYvKxb
+EOcKjvbdqTsgSRkU
+EOcLKvbdLBLGlaxR
+DoDLKvbdcbTMrAUN
+DncLKvbdzitoodSt
+DoDKjvbdJvUfDdfi
+EOcLKvbdHDjvKCJj
+EPCkKvbdeOeTKssr
+DnbkKvbdlYrqsYft
+DncLKvbdiiehKMxS
+DncKjvbdURQoVUhN
+DnbkKvbduMYXBUAw
+DoDLKvbdSPtHJfEX
+EObkKvbdqBJFAWgd
+EOcKjvbdFpATWgFy
+DoDLKvbdBsBDTfXS
+DncKjvbdjhHLfFmk
+DoCjjvbdCJKakIfK
+DnbkKvbddoFSjtTr
+EObkKvbdANIYsWzY
+EObjjvbdCTAbtFvr
+EObjjvbdrRtkOLAm
+DnbkKvbdkxsSTYgU
+DoCjjvbdnBiwXnmu
+EObjjvbdwtmEqYlO
+EPDKjvbdrylQTAhO
+DoDLKvbdtbbtvvOo
+EPCjjvbdZLrETmlN
+EPDLKvbdWXJYWDdg
+DoCkKvbdKQzFOfOF
+EPCjjvbdwzIFfXeS
+DncKjvbdRjyFuHLT
+EPDLKvbdULunaWPJ
+DncKjvbdUxhTykOn
+DnbkKvbdJcKCqKDY
+EPDLKvbdcbSmSATm
+DnbkKvbdegjurNqH
+EPDKjvbdZjTIQGbG
+EPCjjvbdiLddNuCy
+DoCjjvbdZQldiNEq
+EOcLKvbdakMGPODA
+EObjjvbdnHEwlmgZ
+EOcLKvbdBsAcUGXS
+EPCkKvbdiVZdwSUb
+EOcLKvbddCTNSAUN
+DnbkKvbdEXxMUUUM
+DncKjvbdYpldiMeR
+DoDKjvbdNddTiIjd
+DoDLKvbdZLqdUNlN
+EPCkKvbdiBncFWpq
+DncLKvbdiCPDEvqR
+EOcKjvbdUyHszKoO
+DncKjvbdhtydvqtb
+EPCjjvbdpxoHgQcx
+EObkKvbdkWWnDaxX
+DnbjjvbdBhkBkJFj
+DoCkKvbdRacdkhyL
+EOcLKvbdZjTHpHCG
+EPCkKvbdMowqWOGs
+DncLKvbdegjurNpg
+EObjjvbdfMfWfmKL
+EPDLKvbdZirgpGaf
+DoDLKvbdiZuFlQnG
+DncLKvbdFxuVAcxC
+EObkKvbdZisHofaf
+EOcKjvbdJSyBSmYM
+EPDLKvbdVYgtZkPO
+EOcKjvbdRbEFMJYk
+DncLKvbdrEFIonWB
+DncKjvbdKDJbqJcY
+EOcLKvbdhfjCxuiu
+EObjjvbdLLAhWAKZ
+DoCkKvbdRXNcblID
+DoDLKvbdcbSmSATm
+EOcLKvbdwWlAvAuu
+EObkKvbdiBnbdvpq
+DoCkKvbdNQXpumgT
+DncLKvbdkVwOECYX
+DnbkKvbdfoazwDxI
+DoDLKvbdbBWFFpPw
+DoDLKvbdvBDxsPEh
+EPDKjvbdJqZdoFme
+DoDLKvbdIryArmXl
+EPCjjvbdANIZSwZx
+EPCkKvbdVhYVxGxz
+DncKjvbdLAjgNCYR
+DncKjvbdxxIjCQZk
+DncKjvbdbiNKKewY
+EPCjjvbdlrZVZsEJ
+EPDKjvbdIryAsMwl
+DoCkKvbdtAHRIAAr
+EPDKjvbdJmAEZfuB
+EPCkKvbdZjSgogBf
+DoDLKvbdOXnuzcnU
+DnbkKvbdehKvRnQg
+EObjjvbdZyDimbkr
+DoDKjvbdmajWwoOV
+EOcKjvbdkMalZeHP
+EOcKjvbdIjEAJpHE
+EPCkKvbdDihKVxKA
+DncKjvbdNddUIiKd
+EObjjvbdqdFIpOWB
+DoCkKvbdxnShXsJD
+DoDLKvbdjmBkzEfo
+EOcLKvbdatagYLTh
+DoCjjvbdVhYVxHYz
+DnbjjvbdJbjDRKDY
+EPCjjvbdLBLHNCYR
+DnbjjvbdnGeYNOGy
+EOcLKvbdUsmTekvK
+EPCjjvbdtkxXBTaX
+EPCjjvbdzoPqFCkx
+DncKjvbdCIjbKhej
+DncKjvbdZLqdTmkm
+DoDKjvbdsPunicVf
+EOcKjvbdmgFXmNgZ
+EObkKvbdiMFENuCy
+DoDKjvbdhanbeXRR
+EObkKvbdACqwiyhp
+DncKjvbdZisIQHBf
+EPCjjvbdgQBzwDwh
+DnbjjvbdyYJJaoyk
+DoDKjvbdxUldqZMO
+EObkKvbdkClLQgVH
+EPCjjvbdZQldiMeR
+EPDLKvbdZyEKOClS
+EPDLKvbdcIlikFvx
+DoDKjvbdrzMQTBHn
+DnbjjvbdVYgtZkPO
+DoDLKvbdHEKuiajK
+EPCkKvbdczZQXxqC
+DoDKjvbdrDdiQNua
+DncLKvbdcImKLGWx
+DoCjjvbdVYgtZkPO
+EPDLKvbdZnnIeFZj
+EPDKjvbdMIakqYAS
+DoCkKvbdSLYfUgLT
+EPDLKvbdiCObdvpq
+DnbjjvbdRpUHKFcw
+DoDLKvbdIHHZyYXg
+EPCjjvbdypoMhiwA
+DnbkKvbdCEPaVjMf
+DnbkKvbderAvzlDP
+DnbkKvbdZQleImFR
+EOcKjvbdKRZdneme
+DoDLKvbdiBnbeXQq
+DncLKvbdEPDKjvcE
+EOcLKvbdauCGwkTh
+DncLKvbdEvZQPmJe
+EPCkKvbdURQnuVIN
+DncLKvbdegjvSOQg
+EPCjjvbdKaKgMawq
+DnbkKvbdRzKISbvA
+DncLKvbdiLdcnUcZ
+EPDLKvbdkDMKpfuH
+DoDLKvbdRbDdkhyL
+DnbjjvbdDwxMUUTl
+DnbkKvbdrpWPKCuf
+DnbkKvbdNVSqjmAX
+DoDKjvbdRbDeMIxk
+EOcLKvbdcyxpXyRC
+DncLKvbdRMwbYnUz
+EObjjvbdqlzJxlHi
+DoCkKvbdJYUCIMQp
+DncLKvbdLZQjSzuG
+EOcKjvbdxVNEqYkn
+DnbkKvbdZoOIeFZj
+DoCjjvbdBraCtFwS
+EOcLKvbdliDsqVSB
+EPCkKvbdeATqNXif
+DncLKvbdkMbLydgP
+EObjjvbdZxdJmbkr
+DoCjjvbdraellHLZ
+EObkKvbduDCuWvPP
+DoCkKvbdpstGrSLU
+DoCjjvbdLGFgbBQu
+DnbkKvbdhtzFWquC
+EObjjvbdoAKztHdO
+EPDLKvbdatafxKtI
+EPDKjvbdkWXNcaww
+DoCkKvbdwkXEHzzG
+EObkKvbdmgEwmNgZ
+DncKjvbdBiLCLJFj
+DoCjjvbdeOdsKssr
+EOcLKvbdfILWSORH
+EObkKvbdCDpAujMf
+EPDKjvbdKDKDQibx
+DoDKjvbdVUMtGLuj
+EObkKvbdrXQMCiYq
+DncKjvbdePEsLTtS
+DncLKvbdDxYLtUTl
+EPCkKvbdGYuVBEYC
+DncLKvbdNeEUIiKd
+EPCkKvbdpxoIHRDx
+EObjjvbdFkEsDHlu
+EObjjvbdssSSxzFD
+DoCkKvbdUtNTfMVj
+DnbjjvbdJcKDRKDY
+DncKjvbdqiAKEmOe
+DoDKjvbdtlXwAtBX
+DnbkKvbdxmsIYTIc
+EObkKvbdLrXMzUpz
+DoCjjvbdkxsSSxft
+DncKjvbdQlwaxnUz
+EObkKvbdjhGlFfNk
+EPCkKvbdxsNhmRag
+DoDLKvbdMfcPmQUk
+DoDKjvbdQvnEDLhD
+EObjjvbdVgxVxHYz
+DoDLKvbdlrYtyrdJ
+DoCjjvbdezvYeIsw
+DncLKvbdNddTiIjd
+EPDLKvbdGGJrNiUR
+EPDLKvbdRzJhTDWA
+EPCjjvbdvvkaWBVu
+EOcKjvbdRXNdCkgc
+EOcKjvbdQZNAHTSK
+EPCkKvbdsCGNLfkZ
+EOcLKvbdDwwktTsl
+EOcLKvbdqlzJyLgi
+EOcLKvbdxsNiMqag
+EOcLKvbdhzVFlROG
+EOcKjvbdEztRFMCi
+DnbkKvbdqiAJdmPF
+EPDLKvbdjcMKqGtg
+EObkKvbdTlWOaWOi
+EPDLKvbdURRPUuHm
+DoDKjvbdelfWgNKL
+EOcLKvbdGAnqZJzm
+EObjjvbdGZUuAdXb
+DoDLKvbduLwwAtAw
+DoCjjvbdZjTIQGbG
+EPCjjvbdRNXbYnUz
+EPDLKvbdiLeENtby
+EObjjvbdMowpunGs
+EOcKjvbdbiNJjevx
+DoDKjvbdEYYLstTl
+DoDLKvbdqUTfrRjt
+DoDKjvbdbsCkUEJa
+DoDKjvbdXsMBNUPY
+EPCjjvbdRNXaxnUz
+DoDLKvbdNGcQNQUk
+DnbjjvbdEARiMywX
+EPDKjvbdSKxfUfkT
+DncKjvbdhtyeXRtb
+DncKjvbdZLqcsnLm
+EObkKvbdZnmheEzK
+EObjjvbdtbcUvuno
+DnbjjvbdrzMQTBHn
+DnbjjvbdDwwktTsl
+EPDKjvbdkxsSTYgU
+DoDKjvbdIryArlxM
+DoDKjvbdnBivxOnV
+DoDKjvbdeATplwif
+EOcLKvbdKeegbApu
+EPCjjvbdMgDQMotk
+DoCjjvbduCbtwWOo
+DnbkKvbdyNsHwrhc
+DnbkKvbdtvNxJpsA
+EOcLKvbdqAheAWgd
+DoCkKvbdURQoUtgm
+EOcKjvbdqceIpOWB
+DoCkKvbdVwIwudFH
+DnbkKvbdbLMFnmcA
+EOcLKvbdZjTHpHBf
+EOcKjvbdRXNdCkhD
+EPDLKvbdiHJcZViu
+DoCjjvbdxxIjCPzL
+DnbkKvbdBcpBWJmG
+EPCkKvbdZyEKOCkr
+EPDKjvbdOTUWHFVQ
+DoCjjvbdIGgZxwwg
+EPDLKvbdFjeSbhMu
+EPDLKvbdhgKCxvJu
+EOcLKvbdNsUWGdtp
+EPDKjvbduVnXipsA
+DncLKvbdGYuVBEXb
+EPDLKvbdZtIhyESn
+DoDKjvbdZxdJmcLr
+DoCjjvbdUsltGLuj
+DoDKjvbdDoDLKvbd
+DncLKvbdrDdhpNvB
+EPDLKvbdKCjDRJbx
+DoDLKvbdxLWdHzyf
+EObkKvbdrzMQTAhO
+EOcLKvbdOFDtJJKd
+EPCkKvbdrSVKmjaN
+EOcKjvbdWWiYVdEg
+EOcKjvbdWWhwvDdg
+DncKjvbdpstHRqjt
+EPCkKvbdKWVFceGi
+DoCkKvbdZjShPfbG
+DoCkKvbdSxKlNzkY
+EPDLKvbdIwtCHkqQ
+EOcKjvbdsCGNLgLZ
+DncKjvbdzaAOfgCM
+DoDLKvbdxmrhYSiD
+DncLKvbdfMfWgMjL
+EPDKjvbdqFdEsuaI
+EOcLKvbdiLeDnUcZ
+DoCjjvbdKVuFceHJ
+DoCjjvbdfekzNgHA
+EOcKjvbdOFEThiLE
+EPDLKvbdqceJPnWB
+DoDLKvbduCbtwWOo
+DncKjvbdTqROtuIN
+DncKjvbdpedFUWBI
+DoDLKvbdrEFJQNua
+DoDLKvbdyXhjCPyk
+EPCkKvbdJYUBhLqQ
+EPCkKvbdtcCuXVno
+DoDLKvbdZLrEUOLm
+EPCkKvbdpstGrRjt
+DncLKvbddePSCXCj
+EObkKvbdauCHXjsh
+DoDLKvbdkHfkefNk
+EObjjvbdMRwMzUpz
+EObjjvbdaMkCTVNH
+DoCkKvbdGGJrNhtR
+EPDLKvbdvBDxrneI
+EPDLKvbdIHHZxwxH
+EOcLKvbdrJAJdmPF
+EOcKjvbdGZUuAdXb
+EOcLKvbdbUbHYLUI
+DnbjjvbdJzofYEAN
+EPDKjvbdFxtuBDxC
+DnbkKvbdQvnDbkgc
+EPDKjvbdJmADzGta
+DoDKjvbdZRMdhleR
+DnbkKvbdsrqsZZeD
+EObkKvbdrovPJbuf
+EPCjjvbddeOqbXCj
+EObjjvbdtcDVXVoP
+DncKjvbdMfbpNQVL
+DoCkKvbdhbPCeXQq
+DoCkKvbdNHComQVL
+EObjjvbdvBDxroFI
+EPCjjvbdnBivwoNu
+EObjjvbdbhljKewY
+EPDKjvbdZyDimcMS
+EObkKvbdWSOXbElD
+EOcKjvbdTfznMXVe
+EPCjjvbdZtJJYcsO
+DoCjjvbdRjxfVHLT
+DoCkKvbdVTltGMVj
+DncKjvbdYfwEAOri
+DncKjvbdYkrEUOMN
+EObkKvbdqGEEsuaI
+DncLKvbdjJfHimXr
+EPDLKvbddndsLUTr
+DnbkKvbdqBJFAWhE
+EPDLKvbdEOcKjwDE
+EPCkKvbdtvOYJqTA
+DncLKvbdkyTRsZHU
+DoCjjvbdTppnuVIN
+DncLKvbdwyhFeweS
+DncKjvbdsBelkgKy
+DoCjjvbdKDKCqJcY
+DoCjjvbdkClKqHVH
+DoCjjvbdcTCjtDia
+EPDLKvbdUVkpJtAq
+EPDLKvbdRyjITCvA
+DnbjjvbdJuuFcdgJ
+DoDKjvbdrJAJdmOe
+DncKjvbdJcJbqKCx
+DoDLKvbdJcJbqJcY
+DoDKjvbdeEoSCXDK
+DoDLKvbdSwjlNzkY
+EObjjvbdzitopDrt
+DoCkKvbdKWVGEEgJ
+DncKjvbdpssfqrKt
+EOcLKvbdUMWPBVoJ
+DncKjvbdyzdmrIIh
+EPCjjvbdxUldqZLn
+DoDLKvbdySnImRbH
+DoCjjvbdGdKvJaij
+DoCkKvbdxZgeewdr
+EObkKvbdiLddNuDZ
+DnbjjvbdSCDdkiZL
+DncKjvbdznpREcMY
+EOcLKvbdaRebhTfL
+DnbjjvbdZQldiMdq
+EPCjjvbdbrbjtEKB
+EOcKjvbdEARiMzXX
+DoDLKvbdXrkaNTnx
+EPCkKvbdQZNAHTRj
+DoDLKvbdEzspeLcJ
+EPCjjvbduVnYKRTA
+EObjjvbdJXtBhMQp
+EPDKjvbdeOdrjssr
+EPCjjvbdLqwMytpz
+EPDKjvbdUMVoBVoJ
+DncKjvbdRpUGifDw
+EPDLKvbdZyDinDLr
+DnbkKvbdNrsufeVQ
+EPCkKvbdZMSDtNlN
+EPCkKvbdySnJNSCH
+EPCjjvbdfMevfljL
+DncLKvbdXsMBNTnx
+DnbkKvbdpxoHfqDx
+DncLKvbdUQpntthN
+DncKjvbdIsZArlwl
+DoDLKvbdZGwEAOsJ
+EOcKjvbdVvhwvDdg
+EOcLKvbduWNxJqTA
+EPCjjvbdHEKvJaij
+DoDKjvbdrpWOjCuf
+DncLKvbdrpWOjDVf
+DoCjjvbdIHGzYwwg
+DoDLKvbdpxoIGqEY
+DoDLKvbdJcJbqKDY
+DoCjjvbdRWmdClHc
+EPCjjvbdFWYopNJe
+DncKjvbdmfdwlmfy
+DoCkKvbdxUleQxlO
+EObjjvbdnGdxMnGy
+EPCjjvbdvvlAvBVu
+DncLKvbddndsKssr
+EObjjvbdZMRcsnLm
+EOcKjvbdFxttaEXb
+DncKjvbdVUNTfMVj
+EOcLKvbdNrtWHFUp
+DoDKjvbdwuMdqYlO
+EPDLKvbdrXPkbhxq
+EObjjvbdrEFIpNua
+EObjjvbdziuQQDrt
+EOcLKvbdqYoIGpcx
+DnbjjvbdsQVoJcVf
+EObkKvbdkDMKpgUg
+EObjjvbdvBDyTPFI
+DncKjvbduCbuWvOo
+EPCjjvbdkVvnECYX
+DncLKvbdZGvdAOri
+DoCkKvbdrXPlDJZR
+EOcLKvbduCcVWvOo
+DoDKjvbdCEPaWJlf
+EPDKjvbddoErjssr
+DncKjvbdACqxKZiQ
+EPCjjvbdUVlPitAq
+EPDKjvbdjJfHjMxS
+EObkKvbdAMhYsWzY
+DoDKjvbdnBivxOmu
+EOcLKvbdbiNKKfXY
+EPDKjvbdYqMeIleR
+EObkKvbdJmADygUa
+EObjjvbdEPDLLWcE
+EPCjjvbdrXPkcIxq
+EOcLKvbdliDtQtqa
+DoCjjvbdmoyxujyC
+EPDLKvbddoFTLTsr
+EOcLKvbdCWzdJEpW
+DnbjjvbdrEEhpOWB
+DoDKjvbdZLrDtNkm
+EOcLKvbdLFfHbAqV
+EOcKjvbdmttzLKSG
+EOcLKvbdmbJvwoOV
+EOcKjvbdUaCQrqSZ
+DnbjjvbdmgExMnGy
+EPDKjvbddndrkUUS
+EObkKvbdDwwkstTl
+DoCkKvbdcJMjLFwY
+DnbjjvbdaNLBruMg
+DoDLKvbdQYmAHTRj
+DnbkKvbdsQWOicWG
+EObkKvbdMRwMzUpz
+DoDLKvbdZshiZDrn
+EPDLKvbdnPzYujxb
+EOcKjvbdCEQAujMf
+EPDLKvbdKefHbApu
+DoDLKvbdYpldiNFR
+DoCkKvbdFWZQQNJe
+DncLKvbdznpQeCkx
+EOcKjvbdnQZxvKxb
+DoCkKvbdVBBprpqy
+DnbkKvbdZirhPfaf
+DnbkKvbdegjvSNqH
+EOcLKvbdqdEiPnWB
+EObjjvbdBhkCKiGK
+EObjjvbdxZgfGYFS
+DnbjjvbdNQYQumgT
+EPCjjvbdxsNhlrBg
+DoCkKvbdQdDApRDr
+DoCkKvbdxxIiaoyk
+EPDKjvbdFeirNhtR
+DoCjjvbdegjvSOQg
+EObkKvbdqcdiQNvB
+DncLKvbdiMEdNtcZ
+DncLKvbdTqRPUthN
+EPCkKvbdwygeexFS
+DoDKjvbdyTOJMrBg
+DncLKvbdeEoRavbj
+EPCjjvbdtbcUvvOo
+EObjjvbdKCicRJcY
+EObjjvbdZyEKODMS
+DnbjjvbdmJDtQtrB
+DncLKvbdEARhlyvw
+DnbjjvbdIxTbILqQ
+EOcLKvbdwygefYFS
+DoCjjvbdznoqFCkx
+DoCjjvbdRpUGjGDw
+DncKjvbdhzVGMQnG
+EPCjjvbdhkeDnVCy
+EObkKvbdOEdUIiKd
+DncKjvbdrDeIomua
+DncLKvbdiHJbxuiu
+EPDKjvbddxZstRez
+EPDLKvbdmSYuZrdJ
+EObkKvbdVUNUFkvK
+EPDLKvbdNeEUJIjd
+DoCkKvbdiMEdNuCy
+DoDLKvbdRDcApQcr
+EPCjjvbdTlVoBVoJ
+EObjjvbdLBKgNBwq
+EPCkKvbdsCFllHKy
+EObjjvbdnVUzLJqf
+DoDKjvbdqrVLNkBN
+DoCkKvbdqFcdtWBI
+DncLKvbdbVCGxLTh
+EOcLKvbdeFPSCXCj
+EOcLKvbdRpTgKFdX
+EObjjvbdznpQeDLx
+EOcKjvbdjvXNcaxX
+DnbjjvbdHDkWJbJj
+DncKjvbdhkeENuDZ
+DnbkKvbdnUtyjjSG
+DoDKjvbdSQUHJfDw
+DncKjvbdbUbHYLUI
+EOcLKvbdNsTvGduQ
+EPDLKvbdSZigsCvA
+DncKjvbdMfcPlpUk
+DoDLKvbdxrnIlrBg
+DncKjvbdiLdcnVCy
+EPCjjvbdmfeYNOHZ
+DoCkKvbdjvWmcaxX
+DoDKjvbdbUbHXkUI
+DncKjvbdBhkBjiFj
+DoDLKvbdNHColpVL
+EOcKjvbdrykosAhO
+DncLKvbdqGDeUVaI
+DnbkKvbdhgJcZViu
+DnbjjvbduLxXAtBX
+EPCjjvbdYpleJNFR
+EPDLKvbdQvmdClHc
+DnbjjvbdJYTbIMRQ
+DncLKvbdznpRFDMY
+EOcLKvbdZnmiFEyj
+DnbkKvbdrRuLOLAm
+EObkKvbdhkeEOUby
+DncLKvbdYlSEUOLm
+DoCjjvbdhkdcmtby
+DncLKvbdddnrCXDK
+DoDLKvbdKaLHNCYR
+EOcKjvbdcyxpYZQb
+EPDLKvbdACqwjZhp
+DoCkKvbdBsBDTevr
+EObkKvbdeKJqvUzn
+EObkKvbdcImJkGWx
+DncLKvbdYSlAltOx
+DncLKvbdlrYtyrdJ
+EObkKvbdKxqJrztf
+EOcKjvbdsQWPJcVf
+DoDKjvbdkySqrxgU
+EObjjvbdeEoRbXCj
+EOcKjvbdHDkVjBij
+DoDLKvbdCTBCsfXS
+DoCjjvbdKCjDQibx
+DoCjjvbdlhdTqUrB
+DoDKjvbdTulQKTaR
+DoCkKvbdRjxetfkT
+EPCjjvbdEuyQQNKF
+EPCjjvbdDoDKkXDE
+DoCjjvbdsQWPJbuf
+DoDKjvbdhuZdvqtb
+EPDLKvbdiHKCyWJu
+EPDLKvbdLFegaaQu
+DoCjjvbdqZPHgRDx
+DncKjvbdUWMPjUAq
+DoDLKvbdTYKkmzjx
+DoDKjvbdegjvSOQg
+DnbkKvbdUtNTekvK
+EObkKvbdNsTvGeVQ
+DoDLKvbdfNFvgMjL
+EOcLKvbdZQmEiNEq
+EPDKjvbdBraDTfWr
+EPDKjvbdNGcQNQVL
+EPDLKvbdZyEKODMS
+EOcKjvbdBvzdIdpW
+EPCjjvbdACqwiyiQ
+DoCjjvbddePRawCj
+EPDKjvbdWWiXucdg
+DoDKjvbdWexzUAPT
+DnbjjvbdwXMBWBWV
+EOcLKvbdUyHszLOn
+EPCkKvbdOYOuzcnU
+EPCkKvbdhancEwQq
+DnbkKvbdjggLefOL
+EPCkKvbdFjdsDIMu
+DoDKjvbdrSUjmkBN
+DoDLKvbdZjTIQGaf
+DoDKjvbdMgDPmPtk
+EPDLKvbdWRmwbFMD
+DoCkKvbdzROmJKXA
+DnbkKvbdrDdiQNvB
+DnbjjvbduDCtwVoP
+EOcLKvbdCIjbLJFj
+EPDKjvbdXrkaMsnx
+EPDKjvbdVhXvXfxz
+DncKjvbdhbPDEwRR
+DoCkKvbdpxoHgQcx
+DoCkKvbduMXwBUBX
+EObjjvbdNeEThhjd
+DoCjjvbdirzhrkJz
+DoDLKvbdaMkCTUlg
+DncLKvbdWRnYBeLc
+DnbjjvbdGBPRZJzm
+EOcLKvbdeOeSjstS
+DoDLKvbdmIctRVSB
+DoCjjvbdZxdJnDMS
+DoCkKvbdRpTgKFcw
+DncLKvbdTukojTaR
+DnbjjvbdKRZdoFme
+DnbkKvbdURQoVUhN
+DoDLKvbdyYJKBozL
+EObkKvbdfNFwHMjL
+DoDLKvbdZisIQHBf
+EObkKvbdqFcdsuaI
+DncLKvbdzoPqFDLx
+DoDKjvbdSKxeuHLT
+EPDKjvbdsBemLfjy
+DoCjjvbdJbjCqJcY
+DoCjjvbdNPxRVnGs
+DncLKvbdGcjvJbKK
+EOcKjvbdrWpMDIxq
+EOcLKvbdQdDApQcr
+DoDKjvbdZMRdTnLm
+EOcLKvbddxZssrFz
+EObjjvbdUtNTfLuj
+EPCjjvbdLLBIWAKZ
+DoCkKvbdgFlZmfgA
+EPCjjvbdUVkoitAq
+DoDKjvbdDncKjvcE
+DoDLKvbdRpUHJfEX
+EPDKjvbdLqvlzVQz
+EPDKjvbdZMRdUOLm
+EOcLKvbdCJLBkIfK
+DncKjvbdaSFbhUFk
+EPDLKvbdZoNheEzK
+DncKjvbdUVlPjUAq
+DnbkKvbdKNADyfuB
+EObkKvbdZdwfzghb
+EPDLKvbdZtIhxcrn
+EObkKvbdGckViajK
+DncLKvbdFfJqmiUR
+DncKjvbdKWUfDdgJ
+DoDKjvbdMtrqjmAX
+EOcLKvbdsQWPKDVf
+DoCjjvbdwtleRZMO
+EObjjvbduaDxsPEh
+EPDLKvbdKxqJrzuG
+EOcKjvbdVAaprprZ
+EObjjvbdEuxopMjF
+DnbjjvbdyOTHwriD
+EPDLKvbdrpVnibvG
+EPDKjvbdkWWnDaww
+DncLKvbdrXPkbiYq
+DoDLKvbddxZssqez
+EOcLKvbdHDkWJbJj
+DncLKvbdEPCkLWcE
+DnbkKvbdEXwkstTl
+EObjjvbdqiAKEmOe
+DncLKvbdjAQGaQGj
+EPCjjvbdNeDtJJKd
+EPCjjvbdvwMBWBVu
+EPDKjvbdFejSOItR
+EOcLKvbdNPwqWOHT
+EPDKjvbdbsCjscia
+EObkKvbdyYIiaoyk
+DoDKjvbdLZQirzuG
+EObjjvbdSLZGVGjs
+DoCjjvbdAMgxsWzY
+DoDLKvbdEObjjwCd
+DnbkKvbdsPvOicWG
+EPCkKvbdrJAKElne
+EPCkKvbdauCGwjsh
+DncLKvbdegkWRnQg
+EPCkKvbdYpmEiNFR
+DoDKjvbduaDxsPFI
+DoCjjvbdcyxoxYqC
+DoCkKvbdkMakzFHP
+DnbjjvbdJbibqJbx
+DnbkKvbdWWhxWDeH
+DoCjjvbdssRsYzFD
+DoDKjvbdpyPIHRDx
+DncLKvbdwNWANDeN
+DoDKjvbdJYUBglRQ
+EObkKvbdXnRAYVVt
+DoCjjvbdUWLpKTaR
+DoDKjvbdTqROttgm
+EPCkKvbdVqnXaeMD
+EObjjvbdADRwiyiQ
+DoDKjvbdlrZUyrci
+EPDKjvbdvAdZSndh
+DoCkKvbdzoQQeDLx
+DnbkKvbdSQUGjFdX
+EOcLKvbdqBJFAXIE
+EObkKvbdSCEFLiZL
+DnbjjvbdzoQQdcMY
+DnbkKvbdpxngfqEY
+DncLKvbdbsDLUEKB
+DoCjjvbdXrlBMtOx
+EObjjvbdKCjDQicY
+DncLKvbdLrWlzUpz
+EObjjvbdaaWEfQQX
+EObjjvbdtlYWaTaX
+DnbkKvbdMowpunGs
+EObkKvbdSLYeuHKs
+EObkKvbdTAEhhCOd
+EPCkKvbdmSYtyrci
+DncLKvbdYkqcsnLm
+DoDLKvbdrylQTAgn
+DncLKvbdJXtCIMRQ
+EObkKvbdSBdElIyL
+DoDLKvbdwygefYFS
+DncKjvbdyXhibPzL
+EPCjjvbduaDxsPFI
+EObjjvbdZoNiFEzK
+EPCjjvbdkNBkyeHP
+EPCkKvbdWRnXadlD
+DncLKvbdRWmdDLhD
+DnbkKvbdmSYtzTDi
+EOcKjvbdkVwODbXw
+DncLKvbdQlxCZOUz
+EObjjvbdbhlijfXY
+EOcLKvbdXmqAXtut
+EOcLKvbdmbKXXnnV
+DoDKjvbdkHgMFfOL
+EPCkKvbdfekymgHA
+DoCjjvbdeKKRvUzn
+DoDKjvbdkHfkefNk
+DoCjjvbdyqPMiKXA
+DnbjjvbdUQqOtuIN
+EOcKjvbdEPCkKwDE
+DoDLKvbdZRNFIleR
+DnbjjvbdRacdlJZL
+EOcLKvbdTukoitAq
+EOcLKvbdZLrDtOMN
+EOcLKvbdgKfzcGAE
+EObjjvbdzjVQQESt
+EOcLKvbdcIlijevx
+EOcKjvbdGKdsDHmV
+DncLKvbdKkBHvAJy
+EOcKjvbdZMRctOLm
+EPCkKvbdADRxKZiQ
+EObjjvbdDwxLsssl
+EPDLKvbdUxgszLPO
+EPCkKvbdSQTfiedX
+EPCjjvbdNeEUJIkE
+DoDLKvbdpyPHfqDx
+DnbkKvbdyOShXsJD
+DncLKvbdLiBkpxAS
+DoDKjvbdaaWEepQX
+DoCjjvbdWSOYBeLc
+EOcKjvbdLFegbAqV
+EPDKjvbdffLzOGgA
+EObkKvbdFkErbglu
+DncLKvbdiZuFlROG
+DncKjvbdegkWRnQg
+DoDLKvbdQdDApRDr
+EOcLKvbdeYZtURez
+EObjjvbdrXQLcIxq
+DoDLKvbdxZhGGXeS
+DoDLKvbdGGKSOItR
+EObjjvbdjhHLfFnL
+EOcLKvbdUQpoUuHm
+DoCkKvbdXrlBNUPY
+DoDKjvbdJXtCIMRQ
+DnbkKvbdZMSDsnLm
+DncKjvbdCTBDUGWr
+DncKjvbdbhlikGXY
+DoDKjvbdXmqAYVWU
+DnbjjvbdliDsqVRa
+DnbkKvbdmajXYOnV
+EObjjvbdJpyePGNe
+DnbkKvbdCTAcUGXS
+DoDLKvbdCDpBVjNG
+EOcLKvbdxwhiaoyk
+DoDKjvbdxVNFQyMO
+EPCkKvbdVvhwvEEg
+DnbkKvbdFWYoomJe
+EOcKjvbdlrZUysEJ
+EPDKjvbdqquKnKaN
+DoCkKvbdTkunaVoJ
+EOcLKvbdfHkVrOQg
+EPDLKvbdiUzFWrUb
+DoDLKvbdtAGqIABS
+DoCkKvbdZRMdhmEq
+DnbkKvbdNsUVfeVQ
+EPDLKvbdqwPkbiZR
+DoCkKvbdNUsSLNAX
+DncKjvbdmpZxvKyC
+EPCkKvbdLYqKSztf
+EPDKjvbdZyEKODMS
+EPDKjvbdNGbomPuL
+DncKjvbdZMSDtNlN
+EPCjjvbdTXjkmzjx
+EObkKvbdBdQAvKMf
+EOcLKvbdkySrTYgU
+DnbkKvbdZoOIddzK
+DoCkKvbdZMSDsmkm
+EPCkKvbdCWzdIdpW
+DncLKvbdBvzdIdov
+DoCjjvbdaRfDHtFk
+DnbkKvbdWeyZtAOs
+DoDLKvbdnCJwYPOV
+DoCjjvbdEYYLstUM
+EOcLKvbdwtldqZMO
+EPCjjvbdFVxoomKF
+EObkKvbdyqPMhiwA
+DoDLKvbdkxrrSxgU
+DoCjjvbdeATqNYKG
+DncLKvbdJKEAJpHE
+DoCkKvbddndsLUTr
+DnbjjvbdqFceUWBI
+DoDLKvbdhkddOUby
+DncKjvbdGKdrcIMu
+EPCkKvbdelevflik
+DoDKjvbdhaoDFWqR
+DoCjjvbdYlSDsmlN
+EPCjjvbdiZuGLpmf
+EObkKvbdnCJvxPNu
+DnbkKvbdhzUelRNf
+DnbkKvbdZeYGzgiC
+DoCkKvbdDnbkLWbd
+DnbkKvbdnHFYMmfy
+DoCjjvbdePEsKtTr
+DnbjjvbdZQmEhleR
+DnbkKvbdTkunaVoJ
+DnbkKvbdFWZPpMjF
+DoDKjvbdSwkMNzkY
+EOcLKvbdwtldpyMO
+EOcKjvbdhkdcmtby
+DoCjjvbdNQXqWNfs
+EPDKjvbdzjUpPdTU
+DnbjjvbdqceJPnWB
+EPDKjvbdUyHsyjoO
+EPCkKvbdZshhxcsO
+DncKjvbdqAiFAWgd
+EObkKvbdgFkzOGgA
+DncKjvbdmgFYNNgZ
+DoDLKvbdDjHjWYKA
+DnbjjvbdJbicRKCx
+DnbkKvbdfNFwHMjL
+EPCkKvbdWSNxBdlD
+EPDLKvbdCJKbLJFj
+EPDKjvbdEOcKkXDE
+EPCkKvbdVrOYCElD
+DnbjjvbdCIkBjhej
+DoDLKvbddoFTKstS
+DnbjjvbduDDVXVoP
+EObkKvbdxwiKCPzL
+DnbkKvbdZGvdAPTJ
+DoDLKvbdBdPaVjNG
+EOcKjvbdIHGzYwxH
+DoCjjvbdGFjSNhsq
+DnbjjvbdlYsSSxgU
+EPCjjvbdqrUjnKaN
+EOcLKvbdtvOXipsA
+DoDLKvbdrounjCuf
+DoCkKvbdFVyPomKF
+EOcKjvbdNHCpNPtk
+EPDLKvbdWeyZtAPT
+EPDKjvbdjcLkQfuH
+EOcLKvbdzHZMAMeX
+DoCjjvbdUMWPBVni
+EOcKjvbdHELWKBjK
+DoDKjvbdMgComQUk
+DnbkKvbdiGjDZWJu
+DncKjvbdyqOmJKXA
+DoDKjvbdVZITyjoO
+DoCjjvbdzQoNJJwA
+EOcLKvbdGAoQxizm
+DoDKjvbdatagYKsh
+EPDKjvbdSBceMJYk
+DoDLKvbdMpYQvOHT
+DncKjvbdiCOcFWpq
+DoCjjvbdUGznLvvF
+EPDLKvbdANIYrvyx
+EPCjjvbdIwtCHkpp
+EObkKvbdJSyBSmYM
+EObkKvbdwuMdqYlO
+EObjjvbdmuVZkKSG
+DncLKvbdSPsfjFdX
+DoDLKvbdSQUHJedX
+DoDKjvbdiVZdwSUb
+EPDLKvbdRjxfVGkT
+EObjjvbdmpZyVkZC
+DncLKvbdhzUelROG
+EPCkKvbdxVMeRZMO
+EOcKjvbdxxIiapZk
+EOcKjvbdJSyBTNYM
+EPDKjvbdMSXMzUpz
+EPCkKvbdNddThhjd
+DoDKjvbdznpREcLx
+DncLKvbdqYoHgREY
+DnbjjvbdiCPCdvqR
+DoCjjvbdsQVoKDVf
+DoCjjvbdqFcdtWBI
+EPCkKvbdFkFTDIMu
+DnbkKvbdQvmdCkgc
+DnbjjvbduCbtwWOo
+DoCjjvbdaNKaruNH
+EOcLKvbdrpWPKCvG
+DoCjjvbdEKHiuwjA
+DoDLKvbdsBfMlHKy
+EObjjvbduCcVWuno
+DoCkKvbdNddUIiLE
+DoDLKvbdVrNwbElD
+EPCkKvbdTqQoUuHm
+DoCjjvbdcJMikFvx
+EOcKjvbdijGIJmYS
+DncKjvbdtvNwipsA
+EPDKjvbdGQASwGey
+DoCkKvbdmJEUQtqa
+DncKjvbdpxnggQcx
+EOcLKvbdDnbjjwDE
+DnbjjvbdxVMdqZLn
+EPCkKvbdTkvPAvOi
+DnbkKvbddijRvUzn
+DnbjjvbdJuuFceGi
+DoDLKvbdeATplxJf
+EObjjvbdiLeDmuDZ
+EObkKvbdzHYlANFX
+EObkKvbdSBdFLiYk
+DncLKvbdMgCpNPuL
+DncLKvbdNsTufeVQ
+EPCjjvbdUQqOtuIN
+EPCkKvbdKDJcQicY
+DnbkKvbdsCFmLfjy
+DnbjjvbdNdctJIjd
+DoDLKvbdzjUpPdSt
+EPDLKvbdMoxRVmgT
+EOcKjvbdbsCjscia
+DoCjjvbdrDeIpOWB
+EPDKjvbdOTUVgFVQ
+EOcLKvbduWNwipsA
+DoDKjvbdJcJcRKCx
+DncKjvbdGZUtaDwb
+EPCjjvbdZtJJYdSn
+DoDLKvbdtcDVWuoP
+EObjjvbdKaLGmCXq
+DoCjjvbddZxoxYpb
+DnbkKvbdWRmxCEkc
+EOcLKvbdNrsufduQ
+DoDLKvbdqlzJxlIJ
+DoCkKvbdFVyPoljF
+DnbkKvbdjggMGGOL
+DoDLKvbdLAkHMawq
+DncLKvbdwuMdpxlO
+DoDKjvbdtSqrxydc
+DoCjjvbdSLZGVHKs
+DnbjjvbdrMzKYlIJ
+DnbjjvbdTAFIhBnd
+EPDLKvbdIxTbIMRQ
+DoDLKvbdbBVeGQPw
+DnbkKvbdvlvANEEm
+EPDLKvbdEOcKkXCd
+DoCkKvbdYqMdhmFR
+EObjjvbdnUtzKiqf
+EPCkKvbdtunXjQsA
+DnbkKvbdddoSBwDK
+DnbjjvbdTqROttgm
+EPCkKvbdzQnmJJwA
+EObjjvbdfpBzwDwh
+DncKjvbdRotHJecw
+EPCjjvbdhtzFWrVC
+DncLKvbdqdEhpNvB
+DnbjjvbdkWWmcbYX
+EOcLKvbdYSkaMsoY
+EObjjvbdDjIKVxKA
+DnbkKvbdrounjDVf
+EObkKvbdJzpFwdAN
+DoDLKvbdsBelkgLZ
+DoDLKvbdwtmEqZMO
+DncKjvbdxmrgwriD
+EOcKjvbdDoDLLWbd
+EPDKjvbdIwtBhLpp
+EPDLKvbdUaBqTRRy
+DoCjjvbdjKFhJlwr
+DoCkKvbdGLFTDIMu
+EPCjjvbdrbFmMHKy
+DoDLKvbdehKurOQg
+DncKjvbdijFhJlwr
+DoCjjvbdjvXOEBww
+EPCjjvbdTXjkmzkY
+EOcKjvbdaSFcHtGL
+EPDLKvbdpyPIHQcx
+EOcKjvbdmaiwXoNu
+DoDKjvbdSBdFMJZL
+DoDKjvbdjKGIKMwr
+DncLKvbdyXiKBozL
+DoCkKvbdqlzJxkhJ
+EObkKvbdrNZiyLhJ
+DoCkKvbdrpWPKCvG
+DncLKvbdVrOXbEkc
+DnbkKvbdOAIrtJrA
+DnbkKvbdrXQMChyR
+EOcLKvbdDnbjjwCd
+EPCjjvbdjvXOECXw
+EPCkKvbdMgDPmPtk
+DoDLKvbdYfwEAPSi
+EPCjjvbdzGxlANEw
+DoDKjvbdmbKWwoNu
+EOcLKvbddZxpXxqC
+DoDLKvbdLGGHbApu
+DoCjjvbdVTltGLuj
+EPCjjvbdOEdThiKd
+DoCjjvbdUyHtZkPO
+DncLKvbdHELWJajK
+EOcKjvbdcarmSAUN
+EObjjvbdqiAJdmOe
+EObkKvbdZQleImFR
+EObkKvbdQccBQRDr
+DoCkKvbdLAjfmBwq
+DncKjvbdSKxeuHKs
+DncLKvbdmJDsqUrB
+EOcLKvbdGFirNhtR
+DncLKvbdEARiMywX
+DnbjjvbdZxcjNblS
+DncLKvbdWXIwudEg
+DoDLKvbdhkeDmuCy
+EObkKvbdUslselWK
+DoCkKvbdLhakqYAS
+DoCjjvbdIMBzmvpk
+EPCjjvbdKaKgMbXq
+EPCjjvbdiLeDmtcZ
+DnbjjvbdsPvPKCvG
+DncLKvbdnVUzLKRf
+DoDLKvbdiUyeWrVC
+EOcLKvbdjblLRGuH
+DnbkKvbdhtydvqtb
+EOcKjvbdTqQnuVIN
+DoCjjvbdMtsRkNAX
+EPCjjvbdGKdrbglu
+DncKjvbdMoxQvOGs
+DoDKjvbdiHKDZWKV
+DoDKjvbdULvPAvPJ
+DnbkKvbdEvZQPmKF
+EObjjvbdkxrrTZGt
+EObjjvbdKCicQibx
+DoCjjvbdKkAgvAKZ
+EOcKjvbdNxOuzcmt
+EPDLKvbdbsCjsdJa
+EObjjvbdHDkVjBjK
+EPCjjvbdYqMdiMeR
+EPCkKvbdczYoxZRC
+DncKjvbdnPzYujxb
+DnbjjvbdMpYRWOHT
+DncLKvbdLFegbBRV
+DncKjvbdxVMdqYlO
+DoDKjvbdFkErbhNV
+DncKjvbdLLBHvAJy
+DoDKjvbdTfzmkwWF
+EPCjjvbdyXiKCQZk
+DoDKjvbdqUUGrSLU
+EObjjvbdGcjuiaij
+EOcLKvbdZRMdhmFR
+DoCjjvbdZoNiEdzK
+DoCjjvbdEARiNZwX
+DoCkKvbdwXMBVaWV
+EPCjjvbdVZHsyjoO
+DoDKjvbdyXhjBpZk
+EObkKvbdtkxWaUAw
+DnbkKvbdLrWmZuQz
+DncLKvbdySnJNRbH
+EPCjjvbdezvYdhsw
+DoDLKvbdhancFWqR
+EObjjvbdyzeORgiI
+EPCjjvbdyXiJbPyk
+EObjjvbduVnXiqTA
+DnbjjvbdZjTHofaf
+EPDLKvbdLrXMyuQz
+DnbjjvbdHffyxxXg
+DoDLKvbdOStWGdtp
+DnbjjvbddijRvUzn
+DoCjjvbdYNqAXtut
+EPCjjvbdUQpntuHm
+DoDKjvbduWOXjQsA
+DoDLKvbdtTRsYydc
+DncKjvbdpfDeUVaI
+DoDLKvbdULuoAvOi
+DnbjjvbdqmZjYkhJ
+EPDKjvbdZMSETmkm
+DoDLKvbdZshhyETO
+DncLKvbdQdCaQQcr
+DncKjvbdQccBQRES
+EOcKjvbdrNZjYlIJ
+EPDKjvbdjAQHBPgK
+DoCjjvbdnUuZkJqf
+DoDKjvbdLAjfmBxR
+EObjjvbdUsltFkuj
+DoDLKvbdZQleJMeR
+DnbjjvbdBraCtGXS
+DoDLKvbdaSFbhUGL
+EObjjvbdrbGMkgLZ
+EPCkKvbdJYUCHlRQ
+EOcKjvbdgFkzNfgA
+DoCjjvbdaRecHtFk
+EPDKjvbdnUuZkKSG
+EPDLKvbdkWWmdBww
+EObkKvbdypoNJKXA
+EOcKjvbdZxdJmblS
+DncLKvbdZirhPgCG
+DoDLKvbddeOrCXCj
+DoCjjvbdOXoVzcnU
+DncLKvbdSBdFMJZL
+DncKjvbdrzMPraHn
+DncLKvbdqZPHfpcx
+DncKjvbdVAbQsQqy
+DoDKjvbdySnJNSCH
+EPDLKvbdtSqsZZeD
+DncLKvbdtvOYKRTA
+DncLKvbdLGGICBQu
+DoDLKvbdDncLKwDE
+EObjjvbdNrtVgEtp
+EOcKjvbdUQqOtthN
+EObjjvbdZtIiYcrn
+EOcKjvbdmuVZjjRf
+DnbjjvbdcJNKKevx
+DoCkKvbdDxXlTtUM
+DncLKvbdqZOhHQcx
+EPDKjvbdIsZBSlwl
+EOcKjvbdNUsRkNAX
+DoDLKvbdRbEFMJYk
+DnbjjvbdiBncFWqR
+EOcLKvbdRzKIScWA
+EOcKjvbdRbEFMIyL
+EPDKjvbdsPunjDVf
+DoCjjvbdhzVFkpmf
+EOcKjvbddxZtUSFz
+DncKjvbdnVUykJrG
+EOcLKvbdEPCkKvbd
+EPCjjvbdnUuZkKSG
+DnbjjvbdnCKWxOmu
+DnbkKvbdYzcFrKVy
+DoDKjvbdvmWAMcdm
+EObkKvbdhkdcmuDZ
+DncKjvbdNsUVgFVQ
+EPDLKvbdYzbeqiuy
+EOcLKvbdUxgszLOn
+DnbjjvbdZQmEiMeR
+DoCjjvbdkHflFemk
+EPDLKvbdhbPCdwRR
+DoDLKvbdWXIwucdg
+DoCjjvbdOYOuzcnU
+DoDLKvbdcSbkTdJa
+EOcKjvbdEvYpQMjF
+EPDLKvbdrykosAhO
+EObkKvbdrovPJbvG
+DoDLKvbdkHflGGNk
+DoCjjvbdZtIiYcsO
+DoDLKvbdZnmiEdzK
+EObjjvbdZMSDsnLm
+EPCjjvbdLAjfmBxR
+DncLKvbdptUGrRjt
+EOcLKvbdNQXqVmgT
+DoDLKvbdCIkCLIfK
+EPDLKvbduVmxKRTA
+EPDKjvbdHbLzEzAD
+EPCjjvbdbUbGxKsh
+DoCkKvbdjlbLzEgP
+EPCkKvbdXGYzUAPT
+DnbkKvbduLxXAsaX
+EObkKvbdJvUfEFHJ
+EOcKjvbdmbKXXoNu
+EPDKjvbdQvnDbkgc
+DoDLKvbdiUzFWrVC
+EObkKvbdZyEKNcLr
+DoDKjvbdrEEhpNua
+DnbkKvbdzitoocsU
+EPCjjvbdmbJvxOnV
+EOcLKvbdNddTiIjd
+DncKjvbdfpBzvdYI
+EObkKvbdBhjbLIfK
+DoCjjvbdFjeTDHmV
+EOcKjvbdRjyGVGkT
+DoCkKvbdZQldhmFR
+EPDKjvbdqlzKZLhJ
+DnbkKvbdZoOIeEyj
+DncKjvbdBdPaVjNG
+EPCkKvbdTulPjUBR
+EPDLKvbdGGJqmiTq
+DoDLKvbdGGJqmhsq
+EOcKjvbdIryBTNXl
+EPDLKvbdIsYaSmXl
+DoCjjvbdVwJXudEg
+EPCkKvbduDCtvuoP
+EOcLKvbddBsMrAUN
+DncLKvbdrouoJcWG
+DoDKjvbdCgLfHAzc
+DncLKvbdhtzEvqtb
+DoDKjvbdZtIiYcsO
+DncKjvbdMfbomPtk
+DncKjvbdYqNEiMdq
+DnbkKvbdCTBCtFvr
+DncLKvbdhtzEvquC
+DoCjjvbdAMhZSvyx
+DoDKjvbdjlbLzEfo
+EOcKjvbdZLrETmkm
+DncKjvbdULvPAuni
+DoCjjvbdtcCtvuoP
+EPCkKvbdOTTugEtp
+EObjjvbdhtzEvquC
+DoCjjvbdkHgLfFmk
+DncKjvbdmoyyVkZC
+DnbkKvbdsBemLgKy
+DoDKjvbddCTMrAUN
+DoCjjvbdmuUykJqf
+DnbjjvbdbQHGckzd
+DoDLKvbdyOShXriD
+EPDLKvbdZRNFImFR
+EOcLKvbdDoDKkWcE
+EPCkKvbdwMvAMcdm
+DnbjjvbdbKlFoNcA
+DoCkKvbdMfbpMpVL
+DncLKvbdhkeDnUby
+DoDKjvbdMSWmZtpz
+EPCjjvbdmfeYMmgZ
+DnbjjvbdqiAKFMoF
+DoCkKvbdSBdElIxk
+EOcLKvbduoTzpkPU
+DncLKvbdDoCjjwCd
+EObjjvbdLGGHbBQu
+DnbkKvbdQcbaQRDr
+EPDLKvbdyNrgxTJD
+EObjjvbdtSqryZdc
+DoDLKvbdegkWSNpg
+EOcKjvbdZLrDsnLm
+EObjjvbdFkEsCgmV
+DoDKjvbdatagXjtI
+DncLKvbdGZUuBDwb
+DoDLKvbduDDUvuno
+EObjjvbdURROtuIN
+DnbkKvbdyXhjBpZk
+DoDLKvbdKaLGlaxR
+DoCkKvbdlZTRrxgU
+EPDLKvbdUsltFlWK
+DncLKvbdGGKRnIsq
+DnbkKvbdijFhKNXr
+DoDKjvbdrWokbiYq
+EObjjvbdUaCRSqRy
+EObjjvbdRkYfVHKs
+DnbkKvbdQvnDcMID
+EObjjvbdvBEYrneI
+DnbkKvbdySmiNRbH
+EPDKjvbdjuvmcaxX
+DoCjjvbdVTmUGLuj
+EPDLKvbdxVMeRYlO
+DnbjjvbdNPwpvNgT
+DoDKjvbdJTZArlxM
+EPDLKvbdjbkkRHUg
+DnbkKvbdSBdFMIyL
+EPDKjvbdMgColpUk
+DncLKvbdVAbQsQrZ
+DncLKvbdyTOJNRag
+DnbjjvbdmgFYMmgZ
+EPDKjvbdTAFIgbOd
+EObkKvbdFWYoomJe
+DoDKjvbdIxUBhMRQ
+DoCjjvbdFWYopNKF
+DoDKjvbdNdcshiLE
+EOcLKvbdwWlBWAuu
+EPCkKvbdYpldiNFR
+EPDLKvbdQwODbkgc
+EPCkKvbdqZOhHQcx
+EObjjvbdHDjujCKK
+DoDLKvbdnBjWwnmu
+EPDLKvbdUQqPUuHm
+DnbkKvbdIryBSlxM
+DnbkKvbdjhGlFfNk
+DnbkKvbdqlyiyMHi
+EPDLKvbdxmsIYTIc
+EPCjjvbdNrsufduQ
+DncLKvbdaaWEepPw
+DnbjjvbdkVvnDaxX
+EOcKjvbdUQpntuIN
+EOcKjvbdQdDAopcr
+DoCkKvbduMXvaUAw
+DnbkKvbdMRwNZuQz
+DoCkKvbdNGcQMotk
+EPDLKvbduWOYJpsA
+DncKjvbdZtJIxcrn
+DnbjjvbdwyhFfXeS
+EOcLKvbdIryAsNYM
+EObjjvbdyTNiNRag
+EPCkKvbdiZuGLqOG
+DncKjvbdHELWJbKK
+DoDKjvbdIGfyxwxH
+EPCkKvbdeOdrkTsr
+DoDKjvbdpstGrRjt
+EOcKjvbdZtJIxdSn
+EObjjvbdZtIiZDrn
+DnbjjvbdOEctIhkE
+DncLKvbdKDJbqJbx
+DncKjvbdEOcLKvcE
+EOcLKvbdgLGzcGAE
+DoCjjvbdGBPQxizm
+EPCjjvbdeFOqbXDK
+EObkKvbdehKuqnQg
+DncKjvbdRosgKFcw
+EOcLKvbdUsmUGLuj
+EOcLKvbdrXQMCiZR
+DoDKjvbdjcMLQftg
+EPDLKvbdHEKvKBjK
+EPDKjvbdbVCHYLUI
+DncKjvbdFfKSOItR
+DncKjvbdYSkaNToY
+DncLKvbdQvmccLhD
+EOcKjvbdnVUykKSG
+DoCkKvbdbsDKsdJa
+EObkKvbdGLFTChMu
+DoCkKvbdqGEFTuaI
+EPCkKvbdddoRbXCj
+EPCjjvbdMfbpNQVL
+DoDKjvbdFjdrbgmV
+EPCkKvbdmRxuZsDi
+DncKjvbdaRfChUGL
+DncLKvbdMJBkqYAS
+EObkKvbdxUmEqYlO
+EPDLKvbdtbbtvuoP
+DoDKjvbdxsOJNSBg
+EPDKjvbdZtIhyDrn
+DncLKvbdKCicRKDY
+EPDLKvbdUtNUFlVj
+EPCjjvbdeATqMxJf
+EOcLKvbdaNLBsUmH
+DoDKjvbdJcJcQjDY
+EPCkKvbdiMEdNtby
+DoCjjvbdiGibyWJu
+DncKjvbdeEnrCXDK
+EPCjjvbdUVlPisaR
+DncLKvbdXGZZtAPT
+DoDKjvbdddoRbXDK
+DoDLKvbdSBdElIyL
+DoCjjvbdRNXbZOUz
+DnbjjvbdTAEhhCPE
+EObjjvbdUMVoBWOi
+DnbkKvbdFjdrcHmV
+DoCjjvbdfIKurORH
+DoDLKvbdVBCRTQrZ
+EOcLKvbdZoNhddzK
+DoCkKvbdULvOaVoJ
+DnbjjvbdZirhPgCG
+EOcKjvbdVBBprqSZ
+DoDLKvbdaSFcIUGL
+DoDLKvbdfIKuqnRH
+DncKjvbdijGIKNXr
+EPDLKvbdrzMPsAgn
+EPDKjvbdNUsSKmAX
+EPCkKvbdLLAhWAKZ
+DncKjvbdkWWnDaww
+DnbkKvbdJYUCHlQp
+EPDLKvbdNwoVzdNt
+DoCjjvbdSLYetfjs
+DoDLKvbdptTgSSLU
+DncKjvbdxVMdqZLn
+DncKjvbdZyDinDMS
+DnbkKvbdnPyxujxb
+EPCkKvbdSiZjRABM
+EPDKjvbdPyNAHSqj
+DncLKvbdqwPlChyR
+EPDKjvbdGckWJbKK
+DoDLKvbdbBWFFoow
+DoCkKvbdkCkkRGuH
+DncLKvbdmJDtQuSB
+EObkKvbdQdCaQQdS
+DncKjvbdKfFhBaQu
+DncKjvbdaNKaruMg
+EOcKjvbdnPzZWLYb
+EObjjvbdxUldqZMO
+DnbkKvbdGckWJaij
+DncKjvbdkVwODaww
+EObjjvbdGKdsDHlu
+EObkKvbdKQyeOfOF
+EPCkKvbdGdKvKCJj
+DnbkKvbdGdKuibKK
+DoDKjvbdOFDtJJKd
+DoCkKvbdwuMdpxkn
+EObjjvbdZjShPgBf
+DoDKjvbdcyxpYZQb
+DnbjjvbdrbGMkgLZ
+DnbjjvbdxsNiMqbH
+DoDKjvbdWSOXbFLc
+EPCjjvbdrDeIomvB
+EOcKjvbdEuxopNJe
+DoDKjvbdKDKCqKCx
+DoCkKvbdkIHLfGNk
+EOcKjvbdnUuZjirG
+DncKjvbdIryArmXl
+DoDKjvbdraemMGkZ
+DncKjvbdEJgivYKA
+DoDLKvbdbhmJkGWx
+DnbjjvbdZyDimcMS
+EOcKjvbdhuZeWrVC
+DnbkKvbdRbEFMJZL
+EPCkKvbdeOdrkUTr
+DoCkKvbdlhdUQuRa
+DnbjjvbdZtIiZDsO
+EPCjjvbdZyEJmcMS
+DnbjjvbdFpATWgGZ
+EOcLKvbduaDxroEh
+DnbkKvbdpeceUWBI
+EOcKjvbdjcMLQftg
+DncLKvbdnPzZWLZC
+DnbjjvbdZyEKNcMS
+DoDKjvbdZMSDsnLm
+DnbjjvbdOAIsTjSA
+DoCjjvbdWSNxCFLc
+DoDKjvbdkClLRHVH
+DncKjvbdZxdJmcLr
+EPCjjvbdOYOuzdOU
+DncKjvbdWHxVxHYz
+DoDLKvbdwXMBWBVu
+EObjjvbdZxdJmcMS
+EOcKjvbdrEFJPmvB
+EOcKjvbdQcbaQQcr
+EPCkKvbdfHkWRnRH
+EOcKjvbdrEEiQNvB
+EObkKvbdcTCjtDia
+DoCkKvbdnCJvwoOV
+DoDLKvbdxnTIYSiD
+EOcKjvbdGQASvfey
+DoDKjvbdUtNTekvK
+DoDLKvbdbUbHXkTh
+DncKjvbdaNLBsVNH
+EPCkKvbdmtuZjirG
+EPDKjvbdvlvANEEm
+DnbkKvbdcIljLGWx
+EOcKjvbdJSyArmYM
+EObjjvbdVTltFlVj
+DncKjvbdTAFIgbOd
+EOcLKvbdUsltGLuj
+EObjjvbdZRNEhmFR
+EOcKjvbdUGznMXVe
+DnbjjvbdTqQoUthN
+DncLKvbdZRNEhmEq
+EObkKvbdKxpirzuG
+EOcKjvbdiVZdvqtb
+EOcLKvbdatbGxKtI
+DnbkKvbdpfDdsvBI
+DnbjjvbdpyPIGqDx
+DoCkKvbdqUUGrRjt
+DoCjjvbdfHjuqmqH
+EPDKjvbdqlzJyLgi
+DoCjjvbdznpREcMY
+EObjjvbdjuvnEBww
+DoCkKvbdQwNdCkgc
+DoCjjvbdxsNhlqag
+EOcKjvbdbsDKtEJa
+EPDLKvbdfIKuqnQg
+DncLKvbdJXsbILqQ
+DoDLKvbdiUydwRuC
+EOcLKvbdUtMsfMVj
+DnbkKvbdfNGWflik
+DoDLKvbdqwQLcJZR
+DncLKvbdYqMeIleR
+DoCjjvbdzaAPGgBl
+EPCkKvbdauBgYLUI
+EPDLKvbdiUydvqtb
+DnbjjvbdRyjITCvA
+DncLKvbdIwsahLqQ
+EPCjjvbdRacdkiYk
+EOcKjvbdRbEFMJZL
+DoCjjvbdrzLoraHn
+EObkKvbdxxIiaozL
+EOcLKvbdJcJbqJbx
+EPCjjvbdZisHogBf
+EOcKjvbdVTmUGMWK
+EPDKjvbdrylQSaIO
+DncLKvbdSCEEkiYk
+DoDLKvbdhtyeXRuC
+EObjjvbdQvmcblID
+DoDKjvbdauCGwjtI
+DnbkKvbdGYtuBEYC
+DoCkKvbdkyTSSxft
+EPDLKvbdIGfyyYYH
+EObjjvbdjlbLzEgP
+EPCjjvbdIwsbHkpp
+EPDKjvbdmuUyjjSG
+DoCkKvbdUQpoUtgm
+EObkKvbdUQqPVVIN
+DncLKvbdXrkaMsnx
+DncLKvbdaMjbTUlg
+DncLKvbdhgJbyVjV
+DnbkKvbdURQoUuIN
+DnbjjvbdFWZQQMie
+EPCjjvbdnCJwYPNu
+EOcLKvbdBcpBVimG
+DoCkKvbdyqPMiKXA
+EObkKvbdnVUzKjRf
+DnbkKvbdVgwvXgYz
+EObkKvbdZsiJZDsO
+EPDKjvbdiCPCdwRR
+EObkKvbdGYuUaEYC
+DnbkKvbdpyPIHREY
+DnbjjvbdiZtfLpnG
+EPCkKvbdVUNTelWK
+DnbkKvbdTppoVUhN
+DnbjjvbdxrnIlrBg
+EPDKjvbdmIdUQtrB
+EObjjvbdkNBkzFGo
+DncKjvbdhbOcFXQq
+DoDLKvbdNGcPmQVL
+EPDKjvbdZoNheEyj
+DnbkKvbdjlbLzEfo
+DoCjjvbdZRMdiNEq
+EObjjvbdczYoxYqC
+EPDKjvbdLAkHMaxR
+DoDLKvbdsPunibuf
+DoDLKvbdNdcshhkE
+EPDKjvbdhkdcnVCy
+EPCkKvbdVZHtZkOn
+DnbjjvbdsrrTYzFD
+DoCjjvbdatbGxKtI
+EOcLKvbdnGdxMnHZ
+EPDLKvbdmaivwoOV
+EObkKvbdjJegjMwr
+EPDKjvbdYfwEAOri
+EOcKjvbdpxngfpcx
+DnbjjvbdEPCjkXCd
+EPDKjvbdxsOImRag
+EObjjvbdEPDKjwDE
+DnbjjvbdYlSETnLm
+DncLKvbdBiLBjhej
+DoDKjvbdrpWPJcVf
+DncKjvbdRpTfiedX
+DoDKjvbdakMGOnDA
+DnbjjvbduVmxKQsA
+DncKjvbdKfFhCBRV
+DnbkKvbdpfEFTvBI
+DncLKvbdqwQLcIyR
+EOcKjvbdlhdTpuSB
+DncKjvbdqwQLbhxq
+DnbkKvbdnHEwlmgZ
+EPDKjvbdDoCjkWbd
+EObkKvbdANIYsWyx
+EObjjvbdpfEEsvBI
+EPDKjvbdCJLCKiFj
+DoDKjvbdqcdhonVa
+EPCjjvbdzjUpQESt
+DncLKvbdZQleImEq
+EPCjjvbdEPCkLXCd
+EPDKjvbdYlRdUNlN
+EObkKvbdxwiKBozL
+DnbjjvbdFjdsChNV
+EObjjvbdwtleRYlO
+DoDLKvbdeOdsLUUS
+EPDKjvbdZLqctOLm
+DoDLKvbdjlbLyeHP
+DoCkKvbdaNLCTVMg
+DnbkKvbdEKHjWXjA
+DnbkKvbdZshhyDsO
+DnbjjvbdsPunibuf
+EPCkKvbdwWkaWBVu
+EPDLKvbdFpATWfey
+EObjjvbdzoQQdcMY
+EPDLKvbdpxngfpcx
+DnbjjvbdgPazwDwh
+EPDKjvbdKVtfEEfi
+EOcLKvbdhkeENuDZ
+EObkKvbdIwtCILqQ
+EPCjjvbdyNrhXsJD
+DnbkKvbdMSWmZuQz
+EOcLKvbdsPunicWG
+DncLKvbdULvPBWPJ
+DoCkKvbdKfFhCApu
+EOcLKvbdTAEhhCOd
+DnbkKvbdSKxetfjs
+DoCjjvbdUtNTfLuj
+EObjjvbdhzVGMROG
+DoCkKvbdxsNhmRag
+DnbjjvbddZyPwxpb
+EObjjvbdEuxooljF
+DncLKvbdVTlsfLuj
+DoCkKvbdZjShQGaf
+EPDKjvbdrSVKnKaN
+DnbkKvbdFxuVBDwb
+DoCkKvbdJXtBhLpp
+EPCjjvbdHffzZXxH
+DoCjjvbdqZOgfqDx
+DncLKvbdqwQMChyR
+EObjjvbdaSGDIUFk
+EPDLKvbdZxdKNcMS
+EObjjvbdhuZdwSUb
+EPDLKvbdfMfWgMik
+DncLKvbdZRNFJMdq
+EOcKjvbdJKEAKPfd
+EPCkKvbdcyxoxYqC
+EOcKjvbdCSaCsevr
+DoDLKvbdKQzEoGNe
+DoDLKvbdjhHLefOL
+DoCjjvbdRjxeuGjs
+DncKjvbdyOTIXsIc
+DnbkKvbdBdQBWKMf
+EOcKjvbduLxXBUBX
+EObkKvbdrSUkNkAm
+DoDKjvbdKfFhBaRV
+EPCjjvbdddoSBvcK
+DncKjvbdyOTHxTJD
+EOcLKvbdiLeENuDZ
+DoCjjvbdJbjDRKCx
+EPDKjvbddoErkUUS
+DoCkKvbdBiKakJGK
+DnbkKvbdCIjbKiFj
+DoCjjvbdIsZBSmXl
+EOcLKvbdBhjajiFj
+DnbjjvbdrzMQTBIO
+EObjjvbdrWolChyR
+EPCkKvbdEARiMzXX
+DoDLKvbdrWpMDJYq
+EOcLKvbdKRZdoGOF
+DoCjjvbdBsAcUFvr
+DoCjjvbdBraDUGXS
+DoCkKvbdIwtBhMQp
+EObjjvbdeATqMxKG
+EPDKjvbdYzbfRjWZ
+EOcLKvbdsCGNLgKy
+DoDKjvbdhficZWKV
+EObjjvbdZQldhldq
+EPDKjvbdsQVoJbvG
+EPDKjvbdsQVnicWG
+DoDLKvbdVZITyjoO
+EPCjjvbdILazmvpk
+EPCkKvbdZMSDsmlN
+DoCjjvbdZGvdAOri
+DoDKjvbdwuMeRYkn
+DnbjjvbdZyEJmblS
+EPDKjvbdhkeENuDZ
+EPDLKvbdGdKvKCKK
+EPCjjvbdjuwOECXw
+EObkKvbdZeXfzghb
+EObjjvbdJmAEZgUa
+EOcLKvbdtcCuWvOo
+EPCkKvbdiiehJlwr
+DoDLKvbdwtldpyMO
+DoCjjvbdjblLQfuH
+DncKjvbdNPwpunGs
+DnbjjvbdSLZFtgLT
+EPDKjvbdyXhjCPyk
+EObjjvbdliETpuSB
+Dnbjjvbdqlyixkgi
+DoDLKvbdmbJvxOnV
+DoCjjvbdZjSgpGaf
+DoCjjvbdqdEhpNua
+DoDLKvbdelfXGmKL
+EPDKjvbdIGgZyYYH
+DncLKvbdfMfXHMik
+DoCjjvbdZoNheEyj
+EPCkKvbdsZlPsBIO
+EOcKjvbdLAjgMbXq
+DncKjvbdVZITykOn
+DnbjjvbdpyOgfqEY
+EPDKjvbdbUagYKtI
+EObkKvbdrSUjnLBN
+DncKjvbdQwNdDLhD
+EOcLKvbdrykosBIO
+EPDKjvbdsPunicWG
+EPCjjvbdliDtQuRa
+EOcKjvbdcSbkTdKB
+EOcLKvbdKaKgNCXq
+DnbjjvbdZshhxcrn
+DnbkKvbdcbTMrAUN
+EPCkKvbdsQWPKDVf
+DncKjvbdijGHjMwr
+EOcLKvbdULvPBVni
+EPCjjvbdffLynHHA
+DoCjjvbdTqQntuHm
+DoDLKvbdjuwNdCXw
+DoCkKvbdVZITzLOn
+EPDLKvbdqrUkOLAm
+EPDLKvbdZQmEhmFR
+DoDKjvbdwjvdHzyf
+EPDKjvbdePErjtTr
+EObjjvbdmozYvLZC
+DnbjjvbdACrXizIp
+EOcLKvbdTvMQJtAq
+DncLKvbdssSTZZeD
+DnbjjvbdmozZVjxb
+EOcLKvbdtSrSxzFD
+EPDLKvbdZyDjOCkr
+DnbkKvbdbBWEeopX
+EOcLKvbdkWWmcbXw
+DoCkKvbdkVwNdBww
+DncKjvbdEzsqFMCi
+DncLKvbdACqxJyhp
+DoDKjvbdYpmFIleR
+DncKjvbdGKdsCglu
+DoCkKvbdZnnJFEzK
+DoDKjvbdBsBCtGWr
+EPDKjvbdBcpAuimG
+DnbjjvbdIGfzYxXg
+DnbkKvbdGLEsCgmV
+EPCkKvbdySnJNSBg
+DoCkKvbdPyNAGrqj
+EPDKjvbdmaivxPNu
+DnbjjvbddoFSkUUS
+DoCkKvbdySmiNRag
+DoDLKvbdEYXlUUUM
+EObkKvbdCTBCtFwS
+DoDLKvbdoznDkXoA
+EOcLKvbdBvzciEov
+DoCjjvbdSPtHJfEX
+EPDLKvbdtvOYJqTA
+EPDKjvbdZisHpHBf
+EPDKjvbdILazmvqL
+EOcKjvbdRpUHKGDw
+DncKjvbdWXJYWDdg
+EPDLKvbdIwtCHlQp
+EPDKjvbdUtNTfLvK
+DncLKvbddZxpXxqC
+EOcLKvbdkNBlZdgP
+EObkKvbdqYnhGqEY
+EPDLKvbdfpBzwDwh
+DncLKvbdTkuoBVoJ
+DnbkKvbdvvlBWAvV
+DoCjjvbdrXQMCiYq
+EPCjjvbdFeiqmiUR
+DncLKvbdzjUopDsU
+DncKjvbdhkeDmuCy
+EPCjjvbdVqnYBdlD
+EOcLKvbdSCDeLiYk
+DoCjjvbdJvUeceHJ
+EPCjjvbdjgfkfFnL
+DnbjjvbdkVwNdBww
+EObkKvbdczYowyRC
+EPCjjvbdZoNhddyj
+EPCjjvbdOSsugEuQ
+EObkKvbdZMRcsnLm
+EObjjvbdrMzJyLgi
+EPDKjvbdrSUjnKaN
+EPDKjvbdSLYfUfkT
+EPDKjvbdUVlQKUAq
+DoDLKvbdJcKCqJbx
+DnbjjvbdeFPRbWcK
+DoCkKvbdVAbQsQqy
+DncLKvbdpeceTvBI
+DoDLKvbdcIlikFwY
+DoDLKvbdbsDLTdJa
+EPCkKvbdRXOEClHc
+DnbjjvbdbKkennDA
+DncLKvbdEzsqEkcJ
+EPCjjvbdJvUedEgJ
+EOcLKvbdzitpQDsU
+DncLKvbdQvnDblHc
+EOcKjvbdbQGgDkzd
+DnbkKvbddZyPxYpb
+EPDLKvbdLrXNZuQz
+DoDKjvbdDjIJvYKA
+EPCjjvbdbVCHXjsh
+EOcLKvbdsPunicVf
+EOcLKvbdEzspdlCi
+DoDLKvbdmRxtzSdJ
+DnbjjvbdsBfNLfjy
+DoCjjvbdcTDLUDia
+EPDLKvbdidjgVPAO
+DoCkKvbduVmxKQsA
+EObjjvbdxLXDgzzG
+EPCkKvbduaEZSoFI
+EOcLKvbddneSjssr
+DoCkKvbdWXJYVdFH
+DncLKvbdHkaznWqL
+DncKjvbdbVCGxKsh
+DnbjjvbdiMEcmtcZ
+DoDKjvbdqAheAXHd
+EPCkKvbdMIalQxAS
+DnbjjvbdVviXucdg
+DnbjjvbdMpXpumgT
+EObkKvbdMJCLqYAS
+EObjjvbdczZQYYqC
+DncLKvbdUxgtZjoO
+EOcLKvbdjuwNdCYX
+DncKjvbdSwjlNzkY
+EPDLKvbdrWpLbhxq
+DoDKjvbdnBjWwoOV
+EPCjjvbdmSYtyrdJ
+DoDLKvbdzeZnzdzQ
+DncLKvbdMowqWOGs
+EPCkKvbdqTsfqrLU
+EObkKvbdraemMHKy
+EOcLKvbdJcJbpjCx
+DnbjjvbdmuUzKjRf
+DncKjvbdNeEThhkE
+DoDKjvbdHakydzAD
+EOcKjvbdXsLaNUPY
+EObjjvbdLFfHbBQu
+DncLKvbdbKlFoODA
+DoCjjvbdRpTfiecw
+DnbkKvbdRkYetgLT
+DoCjjvbdegkVrOQg
+DoDLKvbdhlFEOUby
+DoCkKvbdFyUtaEXb
+DnbjjvbdAMgxsXZx
+EOcLKvbdUQqOtuHm
+EPDKjvbdxrmiMrCH
+EOcLKvbdREDApQdS
+DoDLKvbdWRmxBdlD
+DnbjjvbdiHKCyVjV
+EPCkKvbdxwhjCPyk
+EObjjvbdLKaHvAJy
+EPDLKvbdZtJJYcsO
+DoCjjvbdbPfgDkzd
+EObkKvbdUaBqTRRy
+EPDKjvbdGYtuAcwb
+DnbjjvbdQcbaQRDr
+EPCjjvbdsBfNMHKy
+EPDKjvbdZyDimblS
+DoDKjvbdJXtBglRQ
+EObkKvbdpssfrSLU
+EOcLKvbdMRwMytpz
+DoCjjvbdEYYMUTtM
+DoCkKvbdeAUQmXif
+DncLKvbdUaBqSpqy
+EObkKvbdVAbQrqRy
+EObkKvbdwXMAuaWV
+DncLKvbdCIjakIfK
+DncLKvbdjmBkzEfo
+EOcLKvbdKVtfDeGi
+EObkKvbdnQZyVjxb
+DncLKvbdzRPMhiwA
+DncKjvbdJpydnfOF
+EPDKjvbdqTsfrRkU
+EPDLKvbdEuyQPlie
+DnbjjvbdfSBWzlCo
+DnbkKvbdqiAKFMne
+EPCjjvbdatbHYLUI
+EOcKjvbdNsTugEtp
+EPCkKvbdmgFXmNgZ
+EPDLKvbdMSXNZtpz
+DoDKjvbdUaBprqRy
+DnbjjvbdXmqAXtvU
+EOcKjvbdHlBznWpk
+EOcKjvbdVqmwbElD
+DoCkKvbdqrVLOLAm
+DnbkKvbdZshiYcrn
+DoCkKvbdZoNhddyj
+EOcLKvbdEuxooljF
+DnbkKvbduCcVXVoP
+EPCkKvbdmuVZjirG
+DncKjvbdRzKHrbvA
+EObkKvbdeKJqutzn
+EObkKvbdyOShXsIc
+EPCjjvbdRbDdlJZL
+DoDKjvbdSBdFMIxk
+DncLKvbdKaKgMawq
+EObkKvbdCDpAuilf
+DnbkKvbdRWnDcLgc
+DncLKvbdqlzJxkhJ
+EPCjjvbdNHDQMpUk
+EOcLKvbdRMwbZNtz
+EPDKjvbdOEdThiLE
+DoDLKvbdUyHszKoO
+DnbkKvbdZisIPgCG
+DncKjvbdwzHeeweS
+DncKjvbdQwODcLhD
+DoDLKvbdqdFJPmua
+EOcLKvbdvwMAvBVu
+EPDLKvbdbVBfwjsh
+DoCkKvbdRyjHrcWA
+DoDLKvbdWIYVxGxz
+DnbkKvbdbiMjLGXY
+EOcLKvbdBhjbKiFj
+EObjjvbdCDpAvJmG
+EPDKjvbdLBKfmCYR
+DoCkKvbdbiMijevx
+DnbkKvbdyOSgwriD
+EPDLKvbdlYrqsZHU
+EOcLKvbdwyhGFxFS
+EPDLKvbdRyjHsCvA
+EPCkKvbdHgGzYxYH
+DoDLKvbdGFjRmhtR
+EPDKjvbdFyUtaEYC
+DncLKvbdeFOrCWbj
+DoDLKvbdJSyArlwl
+EOcKjvbdZyEKODLr
+EOcLKvbdemGXGmJk
+DnbjjvbdSCDeLhyL
+DoDLKvbdYTLaMsnx
+DoCjjvbdxKwEHzyf
+EOcLKvbdiVZdvquC
+DnbkKvbdUaBqTQqy
+EPCjjvbdGZVVBEXb
+DoDLKvbdCEQAvKMf
+DoDLKvbdRWmdCkhD
+EPDKjvbdRotHJecw
+DoCjjvbdZxcimblS
+EOcLKvbdtbcUvvOo
+DnbjjvbdZsiJZDsO
+EOcKjvbdRyjHsCvA
+EOcKjvbdxLWdHzzG
+DoCjjvbdFjdrbhMu
+EPCkKvbdxVNFRYlO
+DoCkKvbdmIcsqUqa
+EPDLKvbdfMfWgMjL
+EPDKjvbdTqQoUthN
+EOcKjvbdtkwvaUAw
+DoDKjvbdBdPaVilf
+DoDLKvbdZMRdTmkm
+EPDLKvbdelewGlik
+DoCkKvbdwzHfFxEr
+EPCkKvbdvAcyTPFI
+EObjjvbdQdDBPqES
+DoDKjvbdZtIiYcrn
+EOcKjvbdypnlhiwA
+DoCkKvbdNrtWGduQ
+DncKjvbdxsOIlqbH
+EPCjjvbdANIYrvyx
+DnbjjvbdNwnuzdOU
+EPCkKvbdFyUuBEXb
+EOcLKvbdaaWFGQQX
+DncLKvbdraelkfkZ
+EPCjjvbdTpqPVUhN
+DncKjvbdySmiNSBg
+EPDKjvbdrpWPJbvG
+EObjjvbdwNWANEFN
+EObjjvbdZeYGzhJC
+DoCjjvbddndsKstS
+EPDLKvbdegkWSORH
+EPCjjvbdvwMAvBVu
+EPCjjvbdkySqrxgU
+EPCkKvbdHkaznWqL
+EPCjjvbdqlzKYkhJ
+DncLKvbdZxdJmcMS
+EPCjjvbdqGEFTvAh
+EObjjvbdTYKkmzkY
+EPCkKvbdZisHofbG
+EOcLKvbdzoPpdcLx
+EPDKjvbdZjTHpHCG
+EOcKjvbdKWVGEFHJ
+EPCjjvbdhyuFlROG
+EPCkKvbdFjeTDIMu
+DncLKvbdOYPVzcnU
+DoCjjvbdSZjISbvA
+DoCkKvbdZoNiEdyj
+EPCjjvbdrWpMDJZR
+EObkKvbdkVvnDaxX
+EObjjvbdcSbjtDia
+DnbjjvbdLGGICBRV
+EPDLKvbdkWWmcbXw
+EObjjvbdnHExNOHZ
+DncKjvbdUtNUFlVj
+EObkKvbdEvZPomKF
+DoCkKvbduoTzpjnt
+EOcLKvbdURQoVVHm
+DnbkKvbdTAEiIBnd
+DncKjvbdQwOECkgc
+DnbjjvbdRbDdkiZL
+DoCjjvbdEPCkLWcE
+EPDKjvbdzjUpPdSt
+EPDKjvbdZMSDsmkm
+DoDLKvbdBdPaWJmG
+EPCkKvbdwjwEHzyf
+DnbjjvbdhuZeXSUb
+DoCkKvbdlYrqsYft
+DoCjjvbdEXxMTssl
+DoDKjvbdzoPpdbkx
+DncKjvbdWRnXbFMD
+DoDLKvbddijRutzn
+DncKjvbdnCKWwnmu
+EOcLKvbdZMSDsmkm
+EOcLKvbdUaCRTRSZ
+EObkKvbdkCkjpgVH
+DnbkKvbdirziTKiz
+DoDLKvbdJpyeOenF
+EObkKvbdGKdsDHmV
+EObjjvbdoAKzshDn
+EPDLKvbdlrZVZrci
+DncLKvbdRzKHsDWA
+EObkKvbdKkAhWAKZ
+EPDLKvbdVAaqSqRy
+DoCkKvbdjAPgApHK
+EPCkKvbdBcpBWJmG
+DncKjvbduCbuXWOo
+EOcLKvbdqiAKEmOe
+EPDKjvbdYpldhleR
+DnbjjvbdEPCjjwCd
+DnbjjvbdbsDKtEJa
+EObjjvbdKfGICBRV
+DoDLKvbdRadFMIxk
+DoDKjvbdGGJqmhsq
+EPCjjvbdJbicQjDY
+DncKjvbdbiNKKfWx
+EOcLKvbduLxXAsaX
+EPCjjvbdEKIJuwjA
+EPCjjvbdWRmwadlD
+DnbjjvbdfMewGmJk
+EOcLKvbdNxOuzdOU
+DnbkKvbdfIKvSOQg
+DncLKvbdQZNAHSqj
+DnbjjvbdZLqdUNlN
+EPCjjvbdSLYetgLT
+DncKjvbdeEoSCWbj
+EPDLKvbdsCFmMGjy
+EPDLKvbdLGGHaaRV
+DncLKvbdEuxpQMjF
+EObjjvbdVYhTzLPO
+EPCkKvbdaSFbhTek
+DnbkKvbdDihJuwjA
+EObjjvbdFjeTDIMu
+EObjjvbdhkeDnUby
+DoDKjvbdxUmEpyLn
+DncLKvbdiVZdvqtb
+DoCkKvbdunszqLPU
+DnbkKvbdSBcdkiYk
+EObjjvbdbhmKKevx
+DnbjjvbdVZHtZkOn
+DoDLKvbdZirgogCG
+DoDLKvbdqBIeAWhE
+EPCjjvbdwtmEqYkn
+DncKjvbdKCjDRJbx
+EOcKjvbdTvLpJsaR
+DoDKjvbdyXhjBozL
+DnbjjvbduDDUwVoP
+DoDKjvbdzaAOfgBl
+DoCjjvbdWSOYCElD
+EOcLKvbdqwQMDJYq
+DoCkKvbdNHColpUk
+EPCkKvbdCEPaVimG
+EOcKjvbdjKFhJlxS
+EOcLKvbdxUleRYkn
+DnbkKvbdrNZjZMHi
+DoDKjvbdmuUzLKSG
+EObjjvbdfIKurOQg
+EPDKjvbdQlwbZNtz
+DncKjvbdhkeDnUby
+EObjjvbdwuMdqZMO
+DncKjvbdliDtQtrB
+EPCjjvbdNPwqWNgT
+DncKjvbdjAPgApGj
+EObkKvbdMpYRVmfs
+DnbkKvbdGKeTChNV
+DoDLKvbdHbMZdzAD
+EObjjvbdQlwayOUz
+EPDKjvbdVqnYCFLc
+DoCkKvbdmpZyVjyC
+EObkKvbdUslsfLuj
+DoDLKvbdlhdURVSB
+EOcLKvbdmSZVZrci
+DoCjjvbdYzberJuy
+EPDLKvbdhzVGLpnG
+EPCjjvbdsPvOicVf
+EObkKvbdeOeTLUUS
+DncLKvbdmfdxMnHZ
+EPDKjvbdHffzYwxH
+EPDLKvbdrylPsAgn
+EOcKjvbdwWlBWAvV
+EPDKjvbdVAbQsQqy
+DnbkKvbdsZlPsBIO
+DncLKvbdEzspdkbi
+DncLKvbdhyuGMROG
+DoCkKvbdFaOpxizm
+DoCkKvbdZsiIxcrn
+DoCkKvbdijGHjMwr
+DnbkKvbdcyxpYZQb
+DnbjjvbdEzspdkbi
+DncLKvbdNQYRVnGs
+EObkKvbdkClKpgVH
+EOcLKvbdkClKqHVH
+EOcKjvbdhanbdvqR
+EPCkKvbdmfdwmNfy
+EObkKvbdYTMAmUPY
+DoCkKvbdIGgZxxXg
+EOcKjvbdnHEwlnHZ
+DncLKvbdCDpAuilf
+EPCjjvbdmbKXXoOV
+EObkKvbdapGfdLzd
+EPCkKvbdRjyGVHLT
+DoCkKvbddoFTLTtS
+EPCjjvbdGLFTCglu
+DoCjjvbdiLeENtcZ
+DoCkKvbdKCicQjCx
+EPCkKvbduoTzqLPU
+EPCjjvbduVmwiqTA
+EPCjjvbdWIXuxGxz
+EPCjjvbdpxngfqDx
+EOcKjvbdeOdrkTsr
+DoDLKvbdNrsufduQ
+EOcKjvbdIHHZyXwg
+DoCjjvbdpfEEsvBI
+EOcKjvbdhgKDYvKV
+DnbjjvbdmbJvxOmu
+EPDKjvbdGdKujCKK
+DoDLKvbdfkGzcGAE
+EPCkKvbdZoNiEeZj
+EPDLKvbdaMjbTUlg
+EPCkKvbdSPsgJfEX
+EPDKjvbdDxYLstUM
+EPCjjvbdKVtfDeGi
+EOcLKvbdpeceTvAh
+EObjjvbdHffzYwxH
+DnbjjvbdffMZnHHA
+EOcLKvbdsQVnibvG
+EOcKjvbdZirgpGbG
+EObjjvbdJSxaTMxM
+EOcLKvbdbrcLUEKB
+EPCjjvbdGZUuAcwb
+DnbkKvbdpssgRrLU
+DnbkKvbdKVteceHJ
+EPDKjvbdmajXYOmu
+EPDKjvbdNwoVzdOU
+DnbjjvbdrpVnicWG
+DoDKjvbdjhGlFfNk
+EObjjvbdEXwlTtTl
+DoDLKvbdkCkkQftg
+DncKjvbdDxYLtUTl
+DncKjvbdNQYQunGs
+DoDLKvbdZQleImFR
+DoDKjvbduVmxKRTA
+DoDLKvbdsrqsZZdc
+DoDLKvbdZLqctNlN
+EPDLKvbdNsUVfeVQ
+DncLKvbdhuZeXRuC
+EPCkKvbdiCObdwRR
+DoDKjvbdIwsbIMQp
+EObjjvbdtcCtvvPP
+EOcLKvbdpyOhHRDx
+EObjjvbdmgEwmOHZ
+DoCkKvbdelevgNJk
+DoCjjvbduLwwBTaX
+DoCkKvbdXrlBNTnx
+EPDLKvbduCcUvuoP
+EPDKjvbdURRPVUgm
+EObkKvbdBsBCsfXS
+DoDLKvbdZjSgogCG
+EObkKvbdhgKDZViu
+EPCkKvbdEYXkstUM
+DncLKvbdrMzJyLgi
+DnbjjvbdaSFcIUFk
+EPDLKvbdnBjWxOnV
+EPDLKvbdssRryZeD
+EOcKjvbderAvzkbo
+DoCjjvbdZirhQHCG
+DnbkKvbdBraCtFvr
+EOcLKvbdxZgfFxFS
+DoDKjvbdJuuFdFGi
+EPDKjvbdUQqPUtgm
+EPDLKvbdNHCpMpUk
+EPDKjvbdnCKXYOnV
+DoCkKvbddZyQXyQb
+DnbjjvbdpxoHgREY
+EPCkKvbdfNFwHNJk
+DncLKvbdVBCQsQqy
+EPCkKvbdUxhTzLOn
+EObjjvbdSQTgJfEX
+DoCkKvbdrWpLbiZR
+DoDLKvbdtcDUwWOo
+DoCkKvbdwzHfGXeS
+EPDLKvbdrzMPraHn
+EPCkKvbdDoCjjvcE
+DoDLKvbdbhlijewY
+EObkKvbdUxgsyjoO
+DoDLKvbdbUafxKsh
+DoCjjvbdULuoBWOi
+EPCkKvbdVBBqSqRy
+DoCjjvbdhkeENtcZ
+EPCjjvbdqYnggRDx
+DncLKvbdjhHMFfOL
+EOcKjvbdZxcinDMS
+DoDLKvbdvBDySndh
+DncKjvbdirziTKiz
+DncKjvbdJXsaglRQ
+DncKjvbdhfjDYvJu
+DncLKvbdjuvnDbYX
+EOcKjvbdKaLHMaxR
+DoCjjvbdiGjDZWKV
+DnbjjvbdEObjkWbd
+DnbkKvbdJmADygVB
+EPDKjvbdJvVFdEfi
+EPDLKvbdnGeXmOGy
+DoCjjvbdpssgSSKt
+EPDKjvbdwtldqYlO
+EPDKjvbdmfeXmNgZ
+DoCjjvbdqvokbiZR
+DoDLKvbdqUUHSRjt
+EObkKvbdmbKXYOnV
+EOcKjvbdaSGChTfL
+EPCkKvbdWWiYWDdg
+DoCjjvbduoTzqKnt
+DnbjjvbdHDkVjBjK
+EOcKjvbdbVBfwjtI
+EOcKjvbdjvXOEBxX
+DncKjvbdZLrETnMN
+EObkKvbdfNGXHMjL
+EPCkKvbdkDLkRHUg
+EObjjvbdZjTIQGbG
+DoDKjvbdZsiIyDsO
+DnbkKvbdbrbjscjB
+EPCjjvbdmbJwYPOV
+DoCkKvbdKDJcQicY
+DoDLKvbdZxcinCkr
+DoDKjvbduoTzqLPU
+EOcKjvbddndsKstS
+DnbjjvbdNQXqWNfs
+EOcKjvbdIidAKQGd
+DoDLKvbdTkvOaVni
+DoCjjvbdsPvPJcVf
+DoDKjvbdVqnXbElD
+EOcKjvbdIHGyyXxH
+DnbkKvbdUxgszLOn
+EPDLKvbdwuMdpxkn
+DnbkKvbdqrVLNkBN
+DncKjvbdijFgjMwr
+EPCkKvbdSQUGjFcw
+EObjjvbdRWmdCkgc
+DnbkKvbdVTltFkvK
+EOcLKvbdJbjCqKDY
+EObkKvbdfMfXGmKL
+EObjjvbdzRPNJKXA
+EPCjjvbdBsAbtGWr
+DoDKjvbdJXsahLqQ
+DnbkKvbdlBNOmALA
+DoDLKvbdlrYtzTDi
+EPDLKvbdZtJIxdTO
+DncKjvbdmbJvxPOV
+EPDLKvbdaMkBsUmH
+EPCkKvbdNsUVgFUp
+DoCjjvbdWfYytAPT
+EObjjvbdNHCpMpVL
+EPCjjvbdMgComPtk
+EOcLKvbdeqaWzlDP
+DoCkKvbdFVxopNKF
+EOcKjvbdYkrDsmlN
+DncKjvbdWWiYWEFH
+DoDKjvbdSLYfUfkT
+DnbjjvbdhkeEOVCy
+DoDKjvbdJXsagkpp
+DoDLKvbdZoOIdeZj
+DncLKvbdLiCMRYAS
+DncKjvbdyOTHwsJD
+DncKjvbdvmWANDeN
+DoDLKvbdtTSTYydc
+DoCkKvbddneSjtTr
+EObkKvbdkDMKpftg
+DnbjjvbdbhljKewY
+EPCkKvbdIsZBSlwl
+EPCjjvbdlqxuZsDi
+DnbjjvbdNrtWGeVQ
+EOcLKvbdvBEZSndh
+EOcKjvbdrJAJdmOe
+DoCjjvbdyOTHxTIc
+DoCjjvbdmfdwlnGy
+EOcLKvbdkDMKpgVH
+DoCkKvbdRECaQQdS
+DncKjvbdaMjartlg
+EPCjjvbdVviXuceH
+DnbkKvbdNsUVgFVQ
+DoDKjvbdFkEsDIMu
+EOcKjvbddZyPwyQb
+DoDKjvbdqmZixlIJ
+DoDKjvbdrEEhomvB
+EOcLKvbdlZSqsZHU
+EPCkKvbdehKuqmqH
+DoDLKvbdFxtuBDwb
+EPCjjvbdKjaHvAJy
+DncLKvbdBcpAujMf
+DoCjjvbdNQYRWOHT
+DoCjjvbdHakzEzAD
+EPCkKvbdJTYaSlwl
+DoCjjvbdzitpQETU
+DoDKjvbdvBEZSoFI
+DncLKvbdnBjXXoOV
+DoDLKvbdiZuGMROG
+DoDKjvbdKVtecdfi
+DnbjjvbddjJqvUzn
+EPCkKvbdaMjbStlg
+EOcKjvbdSZjHsDWA
+DnbkKvbdUaCRSqSZ
+DoDLKvbdxZgefXeS
+DncKjvbdjhGkfFnL
+DncKjvbdIjEAJogE
+EPCkKvbdNGcPlpVL
+DncKjvbdUMWPAvOi
+DnbkKvbdatafxKsh
+EObkKvbdjcMLQgUg
+DoDKjvbddeOqavcK
+EOcLKvbdoznELXoA
+EPDLKvbdeOdrjtUS
+DnbkKvbdjKFhJmXr
+EPCkKvbdpxoHfpdY
+DoCjjvbdZLrDsnMN
+EPCkKvbdwyhFexFS
+EOcKjvbdkClKpftg
+DoDKjvbdxnTIYSiD
+DncKjvbdxnShYSiD
+DoCkKvbdFxtuBDwb
+EObjjvbdYkrEUNkm
+DnbjjvbdNQYQvNfs
+EPCkKvbdhlFDnUby
+EOcLKvbdiCObdwRR
+DoCjjvbdVwJXvEFH
+DnbkKvbdBvzchePv
+EObkKvbdZHWdAPSi
+DncKjvbdHgGzYxXg
+DoCkKvbdMJCMQxAS
+EPCkKvbdZLqdTmkm
+DoDLKvbdnCJwYPNu
+EPCjjvbdOSsvGdtp
+DncKjvbdlYrqsZGt
+EOcLKvbdJYUBhLqQ
+DoCjjvbdZisHpGaf
+DnbjjvbdVgxWXfxz
+EPDKjvbdkWXNdBxX
+DoCkKvbdlZTSSyHU
+DncKjvbdjggLeenL
+DnbjjvbdKNAEZfuB
+DoCjjvbdLAkHMaxR
+EOcLKvbdZRNFJNFR
+DoDLKvbdjAQGaPfj
+EObjjvbdjggMGFmk
+DoDLKvbdyfyMAMeX
+DncLKvbdjbkkRHVH
+EOcLKvbdOTTugFVQ
+EOcKjvbdWHxWXfxz
+EPCkKvbdvwMBWBVu
+EPCjjvbdnHEwlnHZ
+DoDKjvbdHEKuiaij
+DoCjjvbdVwIwvEEg
+EPDLKvbdehKvRnRH
+DncLKvbdnVUyjirG
+EObjjvbdfMevgNJk
+EPDKjvbdjbkjqHVH
+DncLKvbdrJAKEloF
+DoCkKvbdGckWJaij
+DnbjjvbdTvMQJtAq
+EPCkKvbdhkddNtcZ
+DnbkKvbdrzMQTBIO
+DncKjvbdsZlQTAgn
+EPDLKvbdOFDtJIjd
+EOcLKvbdnBivwoOV
+DncKjvbdJXtBhLpp
+EPCkKvbdJTYaSmXl
+EOcLKvbdLGFgbBQu
+DncKjvbdnHEwlmgZ
+DoCjjvbdACrYJzJQ
+EPCkKvbdiZuGLqNf
+DnbjjvbdnGdxMmfy
+DnbkKvbdRkZGUgKs
+DoDLKvbdZisHofaf
+EPDLKvbdJKEAJpGd
+DnbkKvbdBsBDUFwS
+EObjjvbdtcDVWuno
+EOcKjvbdBsAbsfWr
+EPDKjvbdrWpMChyR
+DoDLKvbdVTltFkuj
+EPDKjvbdGFjSOJUR
+EOcKjvbdBsAcUGXS
+EPCkKvbdcJNKKfWx
+EPDLKvbdnQZyWKxb
+EPCkKvbdqTtGrSKt
+EObkKvbdjJfIKNXr
+EOcLKvbdVqmxBdkc
+EOcKjvbdFWYopMjF
+DnbjjvbdqdFJPnWB
+DoCjjvbdehKvRnRH
+EPDKjvbdkyTRsZGt
+EObjjvbdozmckYPA
+DnbjjvbdbrcLUDjB
+DoDLKvbdrMyixkhJ
+DoDLKvbdrpWOjCvG
+DoDKjvbdLFehCAqV
+DncKjvbdrWpMCiYq
+EOcKjvbdVTmUFkvK
+EObkKvbdhficZVjV
+EPCkKvbdIsZAsNXl
+DoCjjvbdmfdxNOHZ
+EPDKjvbdznopdblY
+DnbjjvbdLiCMRYAS
+DncLKvbdePEsKstS
+DoDLKvbdUMVoBVni
+DncKjvbdWRnXaeLc
+EObjjvbdrDdiPmvB
+DoDKjvbdDoDKkXDE
+DncKjvbdOAIrtJrA
+EPCkKvbdwzIGGXdr
+EOcLKvbdUQqPUtgm
+EPDLKvbdhlFEOUby
+DncKjvbdZirhPfbG
+EOcLKvbdKVuGEEgJ
+DoDKjvbddePSBvbj
+EPDLKvbdfHjuqmqH
+EPDKjvbdZjSgpHBf
+DncLKvbdunszpjoU
+EPCkKvbdqTtHRrKt
+EObjjvbdfNGXGljL
+EObjjvbdUGznMWue
+DnbkKvbdsPuoJbvG
+EObjjvbdnQZxujxb
+EPDLKvbdczZPwyQb
+DoCkKvbdWXIwvDdg
+EOcKjvbdQvmdDLhD
+DncLKvbdCIkBjiFj
+EObjjvbdjJegjNXr
+DncLKvbdcIlikFvx
+EPDLKvbdRkZFtfjs
+DoCjjvbdczYoxZRC
+EOcLKvbdatagXjsh
+DncLKvbdjcLjqGuH
+DoCjjvbdMSWlyuQz
+DoCkKvbdjuvnDbYX
+DnbjjvbdiMEdOUcZ
+EPCjjvbdcTDKtEKB
+DnbjjvbdwzHeexEr
+EPDLKvbdemGWgNJk
+EObjjvbdakLfOnDA
+EPDLKvbdTfznLvvF
+DoDKjvbdaNLBsUmH
+EOcLKvbdhzVFkqNf
+DoDKjvbdZRNFIldq
+DoDKjvbdlrZVZsEJ
+EObkKvbdbUagXjtI
+DoDLKvbdUyHsykPO
+EObjjvbdkVwNdCYX
+EPDLKvbdUVkpJtBR
+EPDKjvbdrMzJxkgi
+EOcKjvbdSLYfUgLT
+DoCjjvbdMRwNZtpz
+EPDLKvbdIxTaglRQ
+EPDLKvbdJqZdnenF
+DoDLKvbdZMRdTmkm
+DnbkKvbdANHxrvyx
+EPCjjvbdFkErbhNV
+EOcLKvbdWSNxCEkc
+EPCjjvbdiCPCdwQq
+DnbkKvbdbAvEeoow
+EOcKjvbdeFOrBvcK
+DnbkKvbdaRecHtGL
+DnbkKvbdZshhxcrn
+EOcKjvbdqTtHRrKt
+EObjjvbdauBgXjtI
+EOcKjvbdQdCaQRDr
+DoCjjvbdFVxopMjF
+EPDLKvbdIGgZyXwg
+DoDLKvbdRpTfjFdX
+DnbkKvbdSQUGifEX
+DnbjjvbdpxoIHREY
+DoDLKvbdqiAJeMne
+EOcLKvbdCIkBkJFj
+DncLKvbdFfKSNhsq
+DoDKjvbdwWkaVaVu
+EPDLKvbdNeETiJKd
+DnbjjvbdhbOcEvpq
+DoCkKvbdrbGMlHLZ
+DnbjjvbdLAjgMawq
+DncLKvbdlqyUzSdJ
+DncLKvbdYkqdTnLm
+EOcKjvbdYkrDsnMN
+EOcLKvbdnCKXXnnV
+DoCjjvbdDncLLWbd
+DoDKjvbdYpmFJMdq
+EPDLKvbdFpATXHFy
+DoDKjvbdJvUfEEfi
+EPDLKvbdmJEURVSB
+DncLKvbdtbcVWuno
+EOcLKvbdbUagYKtI
+EObkKvbdcJMjKevx
+DnbjjvbdKVuGEFGi
+DoCkKvbdZMRctNkm
+EOcLKvbdYpmEiMdq
+DoDKjvbdYpmEhmEq
+DncKjvbdzjVQQDrt
+EPCjjvbdzHYlAMdw
+EPDLKvbdYkqcsnMN
+EObkKvbdiiehJmYS
+DnbjjvbdDwwktUUM
+EObkKvbdrounjCuf
+DnbjjvbdGGKRmiUR
+EOcLKvbdwzIGFxEr
+EPDKjvbdOEdUJJLE
+DoCkKvbdfNFvgMjL
+DoDLKvbdOEdThhjd
+DnbkKvbdyTOImSCH
+EOcLKvbdzitpQESt
+DoDKjvbduDCuWvPP
+DoCjjvbdTppnuUhN
+DoCkKvbdIBlZdzAD
+DoCjjvbdZQmFJMeR
+DnbkKvbdJXsaglQp
+DoCkKvbdSZigrcWA
+EObjjvbdZsiIyETO
+EPDKjvbdZLqctOLm
+DncKjvbdwyhGFxFS
+DncLKvbdqwPkcIyR
+EPDKjvbdRkYfUgLT
+DoCkKvbdxxIjBpZk
+DncLKvbdqlyjYlIJ
+EPCjjvbdRaceLiYk
+EPDKjvbdjlbLyeHP
+EPDKjvbdrbFmLfkZ
+EPCkKvbdvBEYsPFI
+DncKjvbdSBdElJYk
+EPDKjvbdpxoIHREY
+EPCkKvbdjhHMFfNk
+EPCkKvbdANIYsXZx
+EObjjvbdnGdxNOHZ
+EObjjvbdKQzFPGOF
+DoCjjvbdtunYKRTA
+DnbjjvbdLFfHbBRV
+EOcKjvbdpedEsuaI
+DnbjjvbdYkqcsmkm
+EPCkKvbdbrcLUEKB
+DnbkKvbdNQYQunGs
+DoDLKvbdJcJbqKCx
+EPDLKvbdIxTbHlRQ
+DnbkKvbdvwMAvBWV
+EOcKjvbdfHkVqnQg
+EOcLKvbdbKkfPNcA
+EPDLKvbdVAbQrpqy
+DncLKvbdWRnXaeLc
+EPCkKvbdFpATXGey
+DoDLKvbdyfxlANFX
+DoCkKvbdFVyQQMjF
+EOcLKvbdxnShXrhc
+DoCjjvbdmaivwoOV
+DnbkKvbdbsDLTdJa
+DoCkKvbdUtMtGMVj
+DnbjjvbdNVSqkNAX
+EPDLKvbdWfYytAOs
+EPCkKvbdZyEJnDLr
+EObkKvbdyXhjCQZk
+EObkKvbddoFSkUTr
+EOcKjvbdeATqMxKG
+DnbkKvbdnPyyWKyC
+DncKjvbdkySrTZHU
+DnbjjvbdmfdxNNfy
+EPCkKvbdHlBznXQk
+EPDKjvbdZisIPgCG
+DncLKvbdrEEhonVa
+DoDLKvbdrykosBHn
+EObkKvbdqvpLbiZR
+DoCjjvbdhkeDnUcZ
+DoCkKvbdVwIwudEg
+DncLKvbdyXiJaozL
+DoCkKvbdyzeOSIIh
+EPCjjvbdkVwNcbYX
+DncLKvbdTkuoAuoJ
+EPCjjvbdijFgimYS
+DncLKvbdliEURUrB
+DoDKjvbdURQoUuIN
+DoDKjvbdrMzJxkhJ
+EPCkKvbdqYngfqEY
+EPDLKvbddwzUTrFz
+DoCkKvbdyYIjBpZk
+EPCjjvbdssSSxzEc
+EObkKvbdFejSNiUR
+EPCkKvbdrEFJPmua
+DnbkKvbdiifIJmXr
+EPDLKvbdZLrEUOLm
+EObjjvbdGFiqnItR
+DoCkKvbdjuwNcaww
+DncKjvbdmpZxukYb
+DoDLKvbdqdFJQNua
+EPDKjvbdNQYRWOGs
+DoCjjvbdZeYGzhIb
+EObjjvbdZjSgpHCG
+EObjjvbdhfjDYvKV
+EPCkKvbdJpzFOeme
+DnbkKvbdlhcsptrB
+DncLKvbdFeiqnJTq
+EObjjvbdZxcinCkr
+EPDLKvbdFVyQPmKF
+EObkKvbdelfWfljL
+EOcKjvbdJpydnenF
+DnbkKvbdbVCGwkUI
+EObkKvbdemFwGmJk
+DoCkKvbdBsAbsfWr
+EPDLKvbdJYTbHkqQ
+DncKjvbdyNrgxTIc
+DoDKjvbdGQASvfey
+EOcLKvbdRNYCZOUz
+EOcKjvbdyzeORgiI
+EOcLKvbdZQmEhleR
+EPCjjvbdmttyjjRf
+DnbjjvbdLBLGmBwq
+EOcLKvbdKVuFdFGi
+EPCkKvbdxmsHwsJD
+DoDLKvbdyOTIXriD
+EPDLKvbdZsiJYcsO
+EPCjjvbdjvXOEBxX
+DoCkKvbdlZSqsZGt
+DoDKjvbdADRxKZiQ
+EOcKjvbdzoQREcMY
+EObkKvbdGGKRmhsq
+EObjjvbdJutfDdgJ
+DoDLKvbdUsltFkvK
+EObkKvbdHDkWKBjK
+DncKjvbdLqwMzVQz
+EObjjvbdaRecITfL
+DoDKjvbdakMGPNcA
+DnbjjvbdwXMBWAvV
+EOcKjvbdQwOEDLhD
+EOcKjvbdAMgxrwZx
+DnbjjvbdqqtkNkAm
+DoDLKvbdbhmKKewY
+DoCjjvbdQmYBxnUz
+DnbkKvbdvPTzqKnt
+EPCkKvbdJqZePGOF
+DoDLKvbdTfznMXVe
+DoCkKvbdFyVUaDwb
+DncLKvbdFxuUaDwb
+EObkKvbdhlEcnUby
+DnbjjvbdCJLCKhfK
+DoCkKvbdPyNAGrrK
+EOcKjvbdVgxVxGxz
+EObkKvbdSxKkmzjx
+EOcLKvbdemFwHMjL
+EObjjvbdrEEiPnVa
+DoCkKvbdDjIJvXjA
+EPCjjvbdYTMAmToY
+DoCjjvbdbLMFnmcA
+DoCkKvbdrounjCuf
+EPDKjvbdrJAJeNOe
+DncLKvbdJbicQjDY
+EPCjjvbdmpZxvLZC
+DncLKvbdVrNxCElD
+DnbkKvbdDoDLKwCd
+DoDKjvbdsZkpSaIO
+EPCjjvbdNQYRVnGs
+DoCkKvbdVrOXbFMD
+DoCjjvbdlYrqryHU
+DoDLKvbdVTltGMVj
+DncLKvbdwzHfGXeS
+EPCkKvbdmajXYOnV
+EOcLKvbdZLqdTmlN
+DoDLKvbdqdFJQOWB
+EObkKvbdVgwvXgYz
+EPDKjvbdkMakzFHP
+DoDKjvbdakLfPNcA
+EObjjvbdyYJJbQZk
+DoDLKvbdDigivXjA
+DoDLKvbdHELWJajK
+EObjjvbdZGvdAPTJ
+EOcKjvbdUGzmkvue
+DncLKvbdSZigsCvA
+DoDLKvbddBsMrATm
+EObkKvbdmSZUzSdJ
+DncKjvbdjAPfaQGj
+DoDKjvbdlBMoNALA
+DnbkKvbdJTZArlxM
+EObjjvbdHgHZyXwg
+EPDLKvbdhzUekpnG
+EPDKjvbdEOcKjvbd
+DoCkKvbdjcLkRHUg
+EObjjvbdBiLBkIej
+DnbjjvbdZMSEUNkm
+DoCkKvbdzRPNJJwA
+EPCjjvbdGdKuiajK
+EPDLKvbdrEFIpOVa
+EPCkKvbdKfGHbApu
+EPDKjvbdUtMsfMVj
+DoDLKvbdbVCHYKsh
+EPDLKvbdEztRFMCi
+EOcLKvbdJmADzGta
+DnbjjvbdtSrSxydc
+DoCjjvbdACrYKZiQ
+EPDKjvbdsrqsYzEc
+DoCjjvbduLxXAtAw
+DoCjjvbdEztQdkbi
+DoDLKvbdkClKpgVH
+DoDLKvbdSCDeMJYk
+DoDLKvbdpxoIGqDx
+DoCkKvbdDigjVxKA
+EPDKjvbdGGKSOJUR
+EOcLKvbdiLeDnVDZ
+DnbjjvbdyOSgxShc
+EPDLKvbdNsUWHEuQ
+EOcLKvbdYpmFImEq
+DoDKjvbdZLrDtOLm
+DncKjvbdJvVGEFHJ
+EOcKjvbdZirgogCG
+EPCkKvbdKCjCqJbx
+EObjjvbdgKfzcGAE
+DncKjvbdZjTIQHBf
+DoDKjvbdRDcBQQcr
+DnbkKvbdZQmEiNFR
+EObkKvbdSiZjRABM
+EObkKvbdURROttgm
+EObjjvbdlZSrSxft
+DoCjjvbdNxPVzdOU
+EPCjjvbdqAheAWhE
+EPCkKvbdwXLaWBWV
+DoCkKvbdKDKDQjCx
+EOcKjvbdehLVqnQg
+DoCkKvbdZxdJmcMS
+DncLKvbdDjHjVxKA
+EObkKvbdXrlAmToY
+EOcLKvbdwtleRYlO
+EPCjjvbdtlYWaUBX
+EPCkKvbdiUzFXSVC
+DoCjjvbdcJNJkFwY
+EObkKvbdaRebhUGL
+EOcKjvbdNHDQMotk
+DoDLKvbdyTNhlqbH
+EOcLKvbdKfGIBaRV
+EObkKvbdKaLHMawq
+DoCkKvbdnCKWwoNu
+EPDLKvbdHffzYwxH
+DncKjvbdnGdxMmgZ
+EPCjjvbdNPwpvNgT
+DoDLKvbdYkrEUOMN
+DoDKjvbdTqROuUgm
+DoDKjvbdvBDyTPEh
+DnbkKvbdJKEAKQHE
+EObjjvbdiBoCeWqR
+DnbkKvbdmRyUyrci
+DnbkKvbdJuuGEFGi
+EOcLKvbdFyVVBEXb
+EObkKvbdwyhGFwdr
+EObkKvbdCTBDTevr
+DoDKjvbdjbkkQftg
+EOcKjvbdVAbQrqRy
+EObjjvbdLAkHMawq
+EObjjvbdEztQeLcJ
+EPCjjvbdcIlikFvx
+DncKjvbdZyEJmcLr
+EObjjvbdqceJPmua
+DncKjvbdZnmiEdyj
+EOcLKvbdiGicYujV
+DoCkKvbdFeirNhtR
+DoCkKvbdDjHjVxKA
+DnbkKvbdqFdEsvBI
+EOcKjvbdcImKKevx
+EPDLKvbdQmXbZOUz
+DncKjvbdqcdhpNvB
+EObkKvbdsPvOjCvG
+DoDKjvbdFVyQPmKF
+EOcKjvbdqYnhGpcx
+EPDKjvbdKfGIBaRV
+EPCkKvbdnGeXmNgZ
+DncKjvbdKVtedEgJ
+EObjjvbdCTAbsewS
+DnbjjvbdeEoRavcK
+EPCkKvbdNsUVfeVQ
+EPDLKvbdGdLWKCKK
+DnbjjvbdKfFhCBRV
+DoCjjvbdZLrDtOLm
+EPDLKvbdhtydvrVC
+DoDLKvbdZjTIPfaf
+DoCjjvbdbrcLTdKB
+DncKjvbdzoQRFClY
+DnbjjvbdSKyFuHKs
+EOcKjvbdZQldiMeR
+DncLKvbdkySrTYft
+DnbkKvbdSLZGUgKs
+EPCkKvbduCbuWvOo
+DoDKjvbdsCFlkgLZ
+DoCjjvbdrDdiPmvB
+EPDLKvbdySnJNRbH
+EPDLKvbdDoDKkXDE
+EPCjjvbdijGHjMwr
+EOcLKvbdeJjSWUzn
+EPCkKvbdKWVFdEgJ
+DoDLKvbdVYhTykPO
+EObkKvbdeJiqutzn
+DoCjjvbdRjyFuGkT
+DoDKjvbdHDkWJajK
+EPCkKvbdbKlFnnDA
+EPDKjvbdQwOEDMHc
+DoDLKvbdZshiZESn
+EObjjvbdkyTSSyGt
+DoCkKvbdxUmEpyLn
+EObjjvbdMuSqkNAX
+DncLKvbdbiNJkGWx
+DoCjjvbdWIYVwfxz
+DncLKvbdkVwNcaww
+DoDLKvbdOFEThhjd
+DoDLKvbddndrkUTr
+DnbkKvbdyzeNrHiI
+EPCjjvbdZRNEhldq
+DncKjvbdhlEdNuDZ
+DoCjjvbdqquKmkAm
+DoDKjvbdFyVVBDxC
+EPCkKvbdJuteceHJ
+DnbkKvbdiBoDEvqR
+DoDLKvbdLqvlzUpz
+EPCjjvbdrRuKnLBN
+DnbkKvbdZjShQHCG
+DnbkKvbdcScLTcjB
+EOcKjvbdyNrgxSiD
+EOcKjvbdZirhPfbG
+DoDLKvbdkIGkefOL
+EPDLKvbdkCkkRGtg
+EPDKjvbdbUafxLTh
+EObkKvbdhfjDYvKV
+DoCjjvbdpecdsvAh
+EOcKjvbdpfDeUWAh
+DnbkKvbdPxmAGsRj
+DnbjjvbdZMSEUNlN
+EOcLKvbdqFdFTvAh
+DoCjjvbdWXJXvDeH
+DoCjjvbdqUTfqrLU
+EPCjjvbdvOszqLPU
+EObkKvbdmtuZkJqf
+EOcLKvbdjgfkefNk
+DoCjjvbdhaoCeWqR
+EObjjvbdKaLHMbXq
+DoCjjvbdSLZFtfjs
+DoCjjvbdFfKSOItR
+DnbkKvbdqUUHSSKt
+EPCkKvbdHEKujBjK
+EObkKvbdIsZBSmXl
+EOcKjvbdRDcApQcr
+DoDKjvbduDDVWvPP
+EOcKjvbdLBLGlaxR
+DoDLKvbdIxTbHlQp
+EPDLKvbdrRtkOKaN
+DoCjjvbdRjyFtfkT
+EPDKjvbdGQASwHGZ
+EPDKjvbdMgDPlouL
+EObkKvbdJXtCILqQ
+EObkKvbdrEFJQNvB
+DoCkKvbdeOeTKtUS
+EObkKvbdSQTgJfDw
+EPCjjvbdSQUGiedX
+DoCjjvbdqUUGrRjt
+EPDKjvbdTqRPVUgm
+EPCkKvbdIMBznWqL
+EObkKvbdhancEwRR
+EOcKjvbdrMzJxkgi
+EPCjjvbdhbPDEvqR
+EPDKjvbdZHXEAOsJ
+EPDLKvbdxnShXriD
+DoCkKvbdLLAgvAKZ
+DoCkKvbdhficYvJu
+EObjjvbdZRMeIleR
+DncLKvbdYfwEAOri
+DoDLKvbdDwxMTtUM
+DoCkKvbdWRmwbFLc
+DnbkKvbdNQYRVnHT
+DnbjjvbdjmCMZeHP
+EPDKjvbdaNKbTUlg
+EPCkKvbdidkHVPAO
+DoCjjvbdHfgZxwxH
+EObjjvbdxwhibPyk
+EPDKjvbdFjeTDHmV
+DoDKjvbdiCOcFWqR
+DoCkKvbdJmADyfuB
+EOcLKvbdhficYujV
+DncLKvbdYzbfSJuy
+DoCjjvbdbUagXjtI
+DoDKjvbdjKFhKNYS
+EOcLKvbdCIkCLJGK
+DoDKjvbdZshiZESn
+EPCkKvbdSQTfjFcw
+EObkKvbdiMEcnUcZ
+EPDLKvbdyOTHxSiD
+EPCjjvbdFjeTDHmV
+DnbjjvbdJuuGEFGi
+EPDKjvbdhkeDnVCy
+EPCkKvbdVAaqSprZ
+DncLKvbdVUNTelVj
+DoCkKvbdfILVrNpg
+DncKjvbdNHDQNPuL
+EOcLKvbdLZQirztf
+EObjjvbdGckWKCJj
+EObkKvbdIHGyyXwg
+DncLKvbdiUydwSVC
+DoDLKvbdpecdtWBI
+EOcLKvbdLGFgaaRV
+EOcLKvbdezuxeJUX
+EObkKvbdgGLymgHA
+DnbjjvbdEvZQQNJe
+DncKjvbdJcJbpjDY
+DoDKjvbdIxTahLqQ
+DncKjvbdBcpAvJlf
+EObjjvbdnPyyVkYb
+EObjjvbdfNGWfljL
+DnbjjvbdieLHVPAO
+EOcKjvbdRNYCYmtz
+EPDKjvbdiHJcYuiu
+EObkKvbdMowqVnHT
+DoCjjvbdiUydvrUb
+EObjjvbdZMRcsnLm
+DnbkKvbdaSFcIUFk
+DnbjjvbdZyEKNcLr
+DnbkKvbdZnnJFEzK
+DncLKvbdJSyBSlxM
+DoCkKvbdXsMAmUOx
+EPCjjvbddneSkTtS
+EOcLKvbdVwIxWEEg
+EPCjjvbdxsOJMrBg
+DncKjvbdkIHMGGOL
+DncLKvbdGFjRmhsq
+DnbkKvbdySmiNRag
+EPDKjvbdpyPHgREY
+DnbjjvbdGZUuAcxC
+DnbjjvbdiHKDYvJu
+DoCjjvbdtlXwBUBX
+EObkKvbdTkvPAvPJ
+EOcKjvbdSxLLmzkY
+DncKjvbdhgJcZVjV
+EOcLKvbdZirgogBf
+EOcKjvbdTukpKUBR
+EPDLKvbdQlwaxmtz
+DoCkKvbdNxOuzdNt
+EPDLKvbduCbuXWPP
+EPCkKvbdmbJvwoNu
+EObkKvbdKDKCqJbx
+EPCjjvbdyNsIXrhc
+EPCkKvbdSCEEkiYk
+EObkKvbdOFDshiLE
+DoDKjvbdZnmiFEzK
+EObkKvbdJbjDRKDY
+EObkKvbdYfvdAOri
+DncKjvbdkDLjpfuH
+DoCkKvbdsrqsZZdc
+DoDKjvbdLBLHNBwq
+DncLKvbdDjHjWYKA
+DoDKjvbdZQleIldq
+DoDKjvbdatbGxKtI
+EObjjvbdUWMQKUAq
+EOcLKvbdlhdUQtrB
+EPCjjvbdAMhZTWyx
+DoCjjvbdjhGlGFmk
+DoDLKvbdHgGzZXxH
+EOcKjvbdrykoraIO
+DoDKjvbdjJehJlwr
+EObkKvbdrEEhonWB
+EPCjjvbdiUyeWrUb
+DnbkKvbdNQYRVmgT
+EPCjjvbdVUNUFkuj
+DnbjjvbdEYYMTtUM
+DoDKjvbdYpldhldq
+EPCjjvbdtlYWaTaX
+DoCjjvbdozmdLXoA
+DnbjjvbdZnnJFFZj
+EObjjvbdZshiZDrn
+EPDLKvbdZjShPfaf
+DoCkKvbdrpVnibvG
+DoCkKvbdQwNcblHc
+EObkKvbdxZgefXdr
+DoDKjvbdNddUIhkE
+DncKjvbdcImJkFwY
+DoDKjvbdZirhQGaf
+DoDKjvbdqwPkcJZR
+EPDLKvbdkHgLfFnL
+DncKjvbdlqxuZrci
+DncKjvbdRadFLiYk
+EPDKjvbdIHGyxxXg
+EObkKvbdmpZyVjyC
+EPCkKvbdUaBqSpqy
+EOcKjvbdqZOgfqDx
+EObkKvbdkNBlZeGo
+EObjjvbdOAIrsjSA
+EPDLKvbdEvZPpNKF
+DnbjjvbdczYoxZRC
+DoDKjvbdvAdZTPEh
+DncKjvbdqUTfqrKt
+EPCkKvbdZGwEAPTJ
+EPDLKvbdZMSEUNkm
+EPCjjvbdYkqctNlN
+DnbkKvbdeEnqawDK
+DoCjjvbdKVuGEFHJ
+EOcKjvbdzitopDsU
+DnbjjvbdsBfNLgLZ
+DnbjjvbdcImJkFvx
+EPCkKvbdMgCpNQUk
+EOcLKvbdZQmEhleR
+EPDLKvbdtTRrxzEc
+DncLKvbdKVuFceHJ
+EPCkKvbdyfxlAMdw
+DnbkKvbdsZkosBHn
+EPDLKvbdwWlAvBVu
+DoDLKvbdlqxuZrdJ
+EPDLKvbdMRwMzUpz
+EObjjvbdFkFTCgmV
+EObkKvbdHEKvJbKK
+DncLKvbdkNCMZdfo
+DoCjjvbddoFSkTtS
+EPCkKvbdRpTfjFdX
+DoDKjvbdIGgZyYXg
+EPCkKvbdBiLCLIfK
+DoCjjvbdKQydnfNe
+EPCjjvbdHgGzZYYH
+DnbjjvbdYNqAYUvU
+DncKjvbdGckVjBjK
+DoCjjvbdjhHMFemk
+DnbkKvbdkIGkeenL
+DncLKvbdmaivwnmu
+EPDLKvbdmuVZkJqf
+EPDKjvbdNddUIhjd
+DoCkKvbdRDbaQRES
+DncLKvbdTvLojUBR
+DncLKvbdtSrSxyeD
+DncKjvbdjgflGFmk
+DoCkKvbdQwNdDLgc
+DoCkKvbdEXwksssl
+DoDKjvbdtAHRIAAr
+DoDLKvbdSPsgJecw
+EObkKvbdjggLfGOL
+DoCjjvbdSBdFLhxk
+DoCkKvbdiMEdNuDZ
+DoCjjvbdhtzFWrUb
+EPCjjvbdSKxetgKs
+DoDLKvbddndsLTtS
+DncKjvbdtcCtwVno
+DoDLKvbdACrYJzJQ
+EOcLKvbdyOShXrhc
+EObjjvbdqquKnKaN
+DoCkKvbdnCJvxOnV
+EPDLKvbdFWYpQMjF
+DnbjjvbdnCJvwoNu
+EObkKvbdhfjCyWKV
+DoDKjvbdrNZjZLhJ
+DnbkKvbdyNrgwsIc
+EPCkKvbdSZjITDWA
+DncLKvbdqiAJeNOe
+DoCkKvbdhaoDEvpq
+EOcLKvbdtkwwAtAw
+DncKjvbdsPvOicWG
+DoCjjvbdWXJYVcdg
+DoDLKvbdmIdUQuSB
+DnbkKvbdauBgYKtI
+EOcLKvbdJbicRKCx
+DoDLKvbdsPuoJcVf
+EPCkKvbdfILWRnRH
+EPCkKvbdAMhYrvzY
+DoCjjvbdKWUedEfi
+EPCkKvbdhaoDEvqR
+EObjjvbdxVMeRZMO
+DncKjvbdFaOqZJzm
+DncKjvbdIryArlwl
+EObkKvbdRWmccLgc
+EPCkKvbdsPunibvG
+EOcKjvbdQccBPpcr
+EPDKjvbdssRsYzFD
+DncLKvbdySmiMqbH
+EObkKvbdZLqdTmlN
+EPDLKvbdVAaqTQqy
+DncLKvbdFWZPomJe
+DoDKjvbdUVkojTaR
+DncKjvbdULvPBWPJ
+EObjjvbdUslsfLuj
+DoDKjvbdsBfMlHKy
+DoCjjvbdkySrTYgU
+EPDKjvbdYgXEAPTJ
+EOcLKvbdrzMPsAhO
+DoCkKvbdcyxpXyRC
+DncLKvbdkIGkeemk
+EObkKvbdVqnXbElD
+EObkKvbdMuSqkNAX
+DncLKvbdkNCLydfo
+EOcLKvbdUVlQJsaR
+EOcKjvbdczZPxYqC
+EObkKvbdWIXvXfxz
+DoCkKvbddndsLTtS
+DnbkKvbdFfJqmiUR
+DncKjvbdURROuVIN
+EObkKvbdddnrCXDK
+DncLKvbdZyEJmcLr
+EPCkKvbdVgxVxHYz
+DoDKjvbdFfKRmiTq
+EPDKjvbddCTNSAUN
+DoDLKvbdUxgsykOn
+DoDLKvbdBhjbLIfK
+DoCkKvbdFejRmiTq
+EPDLKvbdmuUykJqf
+DoCkKvbdVTmTfLuj
+DoCjjvbdkNCLydgP
+DnbjjvbdHffzYxYH
+EObkKvbdpxngfpcx
+EPCjjvbdKQzFOfOF
+DncLKvbdOEdThiKd
+EOcKjvbdJSyBTNXl
+DncLKvbdyNsIXriD
+EOcLKvbdJYTagkpp
+DoCjjvbdkMakzEfo
+DoDLKvbdZjSgpGbG
+DnbjjvbdSQUHJfDw
+DncKjvbdRpTgJedX
+DncKjvbdrykosBIO
+EObkKvbdGYttaEYC
+DoCkKvbdZxcjNcMS
+DoCjjvbdRadElIyL
+DoDKjvbdkySqryGt
+EPDKjvbdiHJbyWJu
+EPCjjvbdwzHeewdr
+EPDKjvbdQwNccLhD
+DoCjjvbdbBVeGPow
+EOcKjvbdddnrCWcK
+EPCjjvbdJXtCHkqQ
+EObkKvbdrbFllHLZ
+DncKjvbdACqxKZhp
+DoCkKvbdJXtCILpp
+DncKjvbdEYYMTssl
+EOcKjvbdwjvdHzzG
+EPDLKvbdemGWgMik
+EPCjjvbdqvokcIyR
+DnbkKvbdUaCQrprZ
+DoCjjvbdKCjCqKDY
+EPDKjvbdYSlBMtOx
+EPDLKvbdyXiKBozL
+EObkKvbdZxdKNcMS
+EObkKvbdCDpBVjNG
+DncKjvbdmgExMmgZ
+EObjjvbdHkaznWqL
+EObjjvbdkNCLzEfo
+EPDLKvbdyNrgwsIc
+DncKjvbdnHFYNNfy
+DoCkKvbdDwwktTsl
+EPDLKvbdTlWOaWPJ
+DoDKjvbdmIctRVRa
+EPCkKvbdeEnqbWbj
+EPDKjvbdTYLMNzkY
+DncKjvbdkHgLfGNk
+DncLKvbdnPyxvLZC
+EOcLKvbdjKGHjMxS
+DoCjjvbdiZtfMROG
+EPDKjvbdFeiqmhsq
+EPDKjvbdDoDKjvbd
+EOcLKvbdKRZeOfOF
+DoDKjvbdzoQQeCkx
+EObjjvbdEOcLKwDE
+DoCkKvbdrafNLgLZ
+EObjjvbdMfbomPuL
+DncKjvbdUQqPUthN
+EOcLKvbddjJrWUzn
+DoDLKvbdvBDySoEh
+DnbjjvbdVUMselVj
+DoCkKvbddndrkUUS
+EObkKvbdmpZxvKxb
+EPCkKvbdmbJvxPNu
+EPCkKvbdmfdwlnHZ
+DnbkKvbdZRMdhmFR
+DnbjjvbdYSlBNToY
+DncLKvbdzoQRFClY
+EPCkKvbdVZITzLOn
+DncKjvbdZtIiZDrn
+DncKjvbdFVxopNKF
+EOcKjvbdtTSSxydc
+EObjjvbdUVlQKTaR
+EPDLKvbdkMbLzEgP
+DoDLKvbdKDJcQicY
+DoDLKvbdJmAEZgVB
+EOcKjvbdCWzdJFPv
+DncLKvbddneTLUUS
+EObjjvbdBcoaWJlf
+EPDKjvbdGcjvJbJj
+DoCjjvbdddoRavcK
+EOcLKvbdAMhZSvyx
+DnbjjvbdajlGOmcA
+DoCkKvbdCIkCLJFj
+DnbjjvbdMSWmZtpz
+EOcKjvbdNGcQMpUk
+EOcKjvbdTqROuUhN
+DoCkKvbdFVxoolie
+DoDKjvbdUQpnuUgm
+EPDKjvbdnBiwXnmu
+DnbjjvbdJuuGDdgJ
+EPCjjvbdZLqcsnLm
+EObkKvbdZnmheEzK
+DoDKjvbdXsMAltOx
+EObkKvbdiMEdOUcZ
+DoDKjvbdZRNEhleR
+DoDLKvbdMIbLpxAS
+DoDLKvbdVwIwucdg
+DoCjjvbdRbDeLiZL
+DncLKvbdZMRctNlN
+DoCkKvbdGcjvJbJj
+DnbjjvbdSZihScWA
+EPDLKvbdkDLjqHUg
+DnbjjvbdZisIPfaf
+EObjjvbdmpZyWLZC
+EOcLKvbdrbGNLgLZ
+DnbkKvbdkVvmdBww
+EObjjvbddoFSjstS
+EObjjvbdxwiJbPyk
+EPDKjvbdTvLoitAq
+DoCkKvbdZLrDsnMN
+DoDKjvbdOAJTUJrA
+EObkKvbdURQntuHm
+EObkKvbdkIGkefOL
+DncLKvbdsCFllHKy
+EPCkKvbdatafxKtI
+DoCjjvbdiifHjMxS
+DnbkKvbdZsiIyDsO
+DncKjvbdieKgUoAO
+EPCjjvbdBhkCLIej
+DnbjjvbdDxXktTsl
+EObkKvbdKCjCqKCx
+EOcLKvbdIwsahLqQ
+EPDLKvbdhzUfLpnG
+EObjjvbdbAvEepPw
+EOcLKvbdSLZFuHKs
+DnbkKvbdIidAJogE
+DnbjjvbdJbjDQicY
+EPDLKvbdQwODblID
+EObkKvbdqZOgfqEY
+EObjjvbdkWWnDbXw
+DncLKvbdEvZPpMjF
+EPDLKvbdKQydnfNe
+EObjjvbdUWMQJtAq
+EOcLKvbdqrUjmkBN
+DoDLKvbdJmAEZfuB
+DoCkKvbdhtydvqtb
+DoCkKvbdtAHQhABS
+EPDLKvbdxZhGGXdr
+EPDKjvbdmSZVZrci
+DnbkKvbdZjTHogCG
+EObkKvbdYqMdiMeR
+DoDKjvbddwzUURez
+DoDLKvbdbKlFnnDA
+EPCkKvbdGGKSOJTq
+EObkKvbdLGFgbBRV
+DoCkKvbdKyQjSzuG
+DncKjvbdJcJcRJcY
+EOcLKvbdnBiwYPOV
+EOcLKvbdLGGHaaRV
+EObjjvbddneSkTtS
+DoDKjvbdiLddOUcZ
+EObkKvbdsPvOjCuf
+DnbkKvbdZyEKOClS
+DoCjjvbdyzeORhIh
+DnbkKvbdhkeDmuCy
+EObkKvbdvvkaWAvV
+EOcKjvbdzeZnzdzQ
+DoCjjvbdVAaprqSZ
+EObjjvbdjhGkefNk
+DncLKvbdSKxfVHLT
+EPCjjvbdZRMeImFR
+DncLKvbdFeirOJTq
+DncLKvbdFfJrOItR
+DoDLKvbdmoyyVkYb
+DncLKvbdddoRavcK
+DoDLKvbdauBfxKtI
+EObjjvbdSPtHJfDw
+EPCjjvbdCEQBWJmG
+DoCjjvbdDnbkLWcE
+EPDLKvbdVUNUGMVj
+DnbkKvbdnQZyVjyC
+DnbkKvbdgFkymfgA
+DoDKjvbdRDcBQQdS
+EOcKjvbdtcCuWvOo
+EObkKvbdlrYuZrdJ
+DoCjjvbdZirgogBf
+DoDLKvbdMfcPmPuL
+EOcKjvbdDwwlTtTl
+DncLKvbdwXLaWAuu
+EPDKjvbdUaBqSpqy
+EObkKvbdHlBznXRL
+EPCkKvbdkMakzFHP
+DnbkKvbdqZOgfpcx
+DnbkKvbdUMWOaWPJ
+DncLKvbdMfbolpVL
+EObjjvbdfekynGgA
+EPCkKvbdWWiXvEFH
+DoCjjvbdpxnhGqDx
+DoDKjvbdsQVnjDWG
+EObkKvbdYNqAXtut
+DncLKvbdDnbkLXCd
+EObkKvbdKaLGmBwq
+DoCkKvbdBvzciFPv
+DoDLKvbdjKFgilwr
+EPCkKvbdUaBqTQqy
+DoDLKvbdVgwvYHYz
+EPDKjvbdIHGyyXwg
+EPDKjvbdEXxMTstM
+DnbkKvbdQccBPpcr
+DnbkKvbdMgCpNPuL
+EPDKjvbdSPtHKFcw
+DoDKjvbdkIHMGFnL
+DncLKvbdnGeXmNgZ
+DoDLKvbdhtyeWquC
+EObjjvbdqGEFUVaI
+EOcLKvbdNPwpumgT
+DnbkKvbdZshiYdTO
+DoDKjvbdZMSETmkm
+DncLKvbdRbDdkhyL
+EPCjjvbdTvMQJtBR
+EObkKvbdjvXOEBww
+DncLKvbdrXPkbiZR
+EOcLKvbdFejSOJTq
+EOcKjvbdegjvRnRH
+EPDLKvbdJvVGDeHJ
+EObjjvbdXrlBMtOx
+DncKjvbdFejSNhsq
+EPDKjvbdBiLBjiGK
+EOcKjvbddiirVtzn
+EPDLKvbdVBBqTRRy
+DoCkKvbdeqaWzkcP
+EObjjvbdqYnggREY
+EPDKjvbdEARiNZwX
+EObjjvbdSQTfifEX
+EObjjvbdLBLHNBxR
+EPCkKvbdNHCpMpUk
+EPCkKvbdKVuGDdfi
+EPCkKvbdxrnImRbH
+EOcLKvbdZRNEiNFR
+EOcLKvbdtbcUvuno
+EPCjjvbdJTZAsNXl
+EPDLKvbdFVyQPljF
+DoCkKvbdieKftoAO
+EObkKvbdZMSETnMN
+DoCjjvbddePSBvcK
+DncLKvbdqUUHSSLU
+DoDLKvbdZQldhmEq
+DoDKjvbdOTTugFUp
+DncLKvbdZsiJZESn
+DnbjjvbdtbcUwWPP
+EPDLKvbddwzTtRez
+DnbjjvbdZoNheFZj
+EPCkKvbdKfFgbApu
+DoDLKvbdhytfMQmf
+DnbkKvbdnGeXlnGy
+EPCjjvbdSBcdlIyL
+DncKjvbdbAvFFpPw
+EObjjvbdzoPpeClY
+EOcLKvbdqwQMDIyR
+EPCjjvbdmaivxOmu
+EPCjjvbdIwsahLqQ
+DncLKvbdddoSBwCj
+EOcLKvbdrEEhpNvB
+DoCjjvbdEPCkKvcE
+DncKjvbdePEsLTsr
+DncKjvbdmRyVZsEJ
+DnbjjvbdZLqdTnMN
+EPDKjvbdRbEFMIxk
+EObjjvbdJXsbHlRQ
+DncKjvbdkDMLQftg
+EOcKjvbdOEctJIjd
+DnbkKvbdqTsfrRkU
+EPDKjvbdkIGkeenL
+DoDLKvbdUxhUZjnn
+DncLKvbdwyhFexFS
+EPDKjvbdbLLfOmcA
+DnbkKvbdtbbuXWPP
+EOcLKvbdYpmEhmFR
+DnbkKvbdxmsHxTIc
+DoDKjvbdznoqFDLx
+EObjjvbdmfdxMnHZ
+EObjjvbdYTMBNUOx
+EObjjvbdADRwizJQ
+EOcLKvbdMoxQvOGs
+EOcLKvbdrWolDJYq
+EPCjjvbdeFPRbXDK
+DoDKjvbdrDdhpNvB
+EPDKjvbdZxdKODLr
+EOcLKvbdWSNwadlD
+EOcKjvbdxrmhlqbH
+DoDLKvbdzoPqEblY
+DncKjvbdTkuoBWPJ
+DnbjjvbdrykpSaHn
+EOcKjvbdKWUfDdgJ
+DnbkKvbdZMSEUOMN
+EObkKvbdSBcdkhxk
+DnbjjvbdIGfyyYXg
+EPCkKvbdnBjWwoOV
+EOcKjvbdzaAPGgBl
+DnbjjvbdkVvmdCXw
+DoDLKvbdkDLkQfuH
+DoCkKvbdVqnXbFMD
+DncKjvbdWWiXuceH
+DoCjjvbdBvzdIePv
+DncKjvbdLFfICBQu
+DncLKvbdeFPRawDK
+DncKjvbdjmBkydgP
+EObjjvbdVUMtFkuj
+EPDLKvbdrSUjmkBN
+DoDLKvbdSPsgKFdX
+DoDKjvbduDDVXVno
+DoCjjvbdMuSqjmAX
+EPCkKvbdZyEJmcLr
+DnbkKvbdMfcQMouL
+DoDLKvbdUMWPAuni
+DnbjjvbddZxpYZRC
+EPDKjvbdbAvEeopX
+DnbkKvbddoErkUUS
+DoCjjvbdePErjstS
+EOcKjvbdGKeTDHlu
+EObjjvbdfIKvSORH
+EPCjjvbdUsmTelWK
+EObkKvbdaMkBsVMg
+DoCkKvbdRjxfVHKs
+DnbkKvbdMpYQumgT
+DncLKvbdVwIxWEFH
+DncKjvbdaMkCTUmH
+DoDLKvbdhlFENuDZ
+EPCjjvbdZisIPgCG
+EPCjjvbdZnnJEdzK
+EPDKjvbdGLEsDINV
+EObjjvbdYzcFrKVy
+EPDKjvbdZirhPgBf
+EPDLKvbdKaLGmCXq
+EObkKvbddoErkTsr
+DoCkKvbdRXNdCkgc
+DoDLKvbdEvZQQNKF
+DoCkKvbdZoNhdeZj
+EPCkKvbdhkddNtby
+EPDLKvbdZLrDtNlN
+DncKjvbdRbDdlIxk
+EPCkKvbdEOcKjwCd
+DncKjvbdlqyUyrdJ
+DoDLKvbdNddThhkE
+EOcKjvbdwyhFewdr
+EPDLKvbdiUydwSVC
+DnbkKvbdYzcFqjWZ
+DnbkKvbdiBoCdwRR
+EOcLKvbdpecdsuaI
+EPCkKvbdQlxCYnUz
+EPDLKvbdVvhxWEEg
+EOcLKvbdlZSqryGt
+EPCkKvbdUaCQsQqy
+DoCkKvbdvAdZSndh
+DnbjjvbdmttykKRf
+EPCkKvbdYgWdAPTJ
+DoCkKvbdlYrqsZGt
+DnbkKvbdZsiIxcrn
+DoCjjvbddeOqavbj
+EObkKvbdbVBfwjsh
+EObjjvbdMoxQvOHT
+EPCkKvbdRbEFLiYk
+DoCkKvbdlhdTqUqa
+EOcLKvbdMIbMRYAS
+EObkKvbdDncKkWbd
+DncLKvbdfSAvzkcP
+DnbkKvbdxsOIlqbH
+DoCkKvbdADSYKZhp
+EPCjjvbdZshiZESn
+DoCjjvbdieLGuPAO
+EPCjjvbdkHgMFenL
+EPDKjvbddBrlrAUN
+DncKjvbdddoSCXCj
+EPCjjvbdsQWOibvG
+EObkKvbdKkBHvAKZ
+EObjjvbdkWWmdBww
+EObjjvbdnGeXmNgZ
+EOcLKvbdyNrgwrhc
+DnbkKvbdNddThiLE
+DncKjvbdDjHivYKA
+EObjjvbdWXIxWDdg
+EObjjvbdrMyixlIJ
+EOcKjvbdcyyPxYpb
+DncKjvbdcyxowxpb
+EOcLKvbdhbOcFXQq
+EOcKjvbdHDjuibKK
+DoDKjvbdiVZeXRuC
+EOcKjvbdnBjXYOnV
+DnbkKvbdOTTufdtp
+DoDKjvbdVAbRTRSZ
+DnbjjvbdRXOEDLgc
+EOcLKvbdznopdcLx
+DncLKvbdRNXayOUz
+DncLKvbdSPtHKFdX
+EPDKjvbdxUldqYkn
+DoCkKvbdZRNEiNEq
+EPDKjvbdrbFllGjy
+EPCjjvbdUyHszLPO
+DncLKvbdxwhibQZk
+EOcKjvbdFWYopMie
+EOcKjvbdaNKbTVMg
+DnbjjvbdliETqUrB
+EObjjvbdRXODbkgc
+DnbkKvbdTlWPBWPJ
+EOcKjvbdOFEThiKd
+EObjjvbdMSXMzVQz
+EObjjvbdHDkVjCKK
+EPDLKvbdqFceTuaI
+EOcKjvbdFyUtaDxC
+EOcLKvbdmgExMnGy
+DncKjvbdtlYWaUBX
+DoDKjvbdCDoaWJlf
+EPDKjvbdkyTSTYgU
+DoCjjvbdqqtjnLAm
+DnbjjvbdGYtuAdXb
+DoCkKvbdBhjbLIfK
+EPDKjvbdNPwqVmfs
+DoCjjvbdsrqsYzFD
+EPDKjvbdSPsfjFdX
+EPCjjvbdZyDjNbkr
+EPDKjvbdqZOgfpcx
+EPCkKvbdqGDeUVaI
+DoDKjvbdUVkpKUAq
+DoCjjvbdRpUGjGEX
+DoDLKvbdmgFYMmfy
+EPDLKvbdRpUHKFcw
+DoDLKvbdEvZQPmKF
+DoDKjvbdZshhxdTO
+DoCjjvbdiZuGMROG
+DoDKjvbdfpBzvdYI
+EPCjjvbdmgFYNOGy
+EOcKjvbdNrtWGdtp
+DnbjjvbdWHxVwgYz
+EPCkKvbdJbjDRKDY
+EPCjjvbduWOYJpsA
+DncKjvbdehLVrORH
+DoCjjvbdGFjSOItR
+DoCkKvbdjuwODbYX
+EObjjvbdJTZBSmXl
+DnbkKvbdzQoNIiwA
+EObjjvbdjJfHilwr
+EOcKjvbdJpyeOfOF
+DnbjjvbdqFdEsuaI
+EPDLKvbdUxhTzKoO
+EPDKjvbdBraCsfXS
+DoCjjvbdLAjgNBxR
+EObkKvbdlhdTqUrB
+EPCjjvbdZoOIeFZj
+DnbjjvbdrDdhpNua
+EPCjjvbdIHHZxxYH
+EPCkKvbdiMEdOVCy
+DoDKjvbdhgJbxvKV
+DoDLKvbdUyHsyjoO
+DoDKjvbdGQATXGfZ
+DnbjjvbdvAdYroEh
+EPCkKvbdhtydvrUb
+DoCjjvbdsQWOicWG
+DncLKvbdcJMjLGWx
+DoCkKvbdIwsaglQp
+DoCkKvbdYkrEUOLm
+EObkKvbdVvhxWDeH
+EPDLKvbdZMRdTnLm
+DoCjjvbdADRwizJQ
+DoDKjvbdSwjkmzjx
+DnbkKvbdBiKbLIfK
+EPCjjvbdRyigsDWA
+EPDKjvbdRXOECkhD
+EObjjvbddxZtTqez
+EObjjvbdbBVdfPow
+DncLKvbdMfcQNQVL
+EPDKjvbdVBBqTQrZ
+DncKjvbdZMRctOLm
+DncKjvbdGGJrOIsq
+EPCjjvbdZMSETmlN
+DoDLKvbdhlEdOVDZ
+EOcLKvbdOhAXyAZB
+DoCkKvbdyOTIYSiD
+DoCjjvbdUtNUGMVj
+EObkKvbdWXJYWDdg
+EOcLKvbdBhjbKhej
+EObkKvbdVwIwvDdg
+EPDLKvbdzjUpQDsU
+EOcKjvbdqAiFAXHd
+DoDLKvbdqrUkNjaN
+EOcKjvbdYORAYUvU
+EOcLKvbdcIljLFwY
+DnbkKvbdVwJXvDdg
+DoDKjvbdVBCQsRSZ
+DoDLKvbdmuUzKiqf
+EObkKvbdJYUCILpp
+EPDKjvbdsQVoKCvG
+EPDLKvbdmoyyVkZC
+EPDLKvbdsCGNLfjy
+EOcKjvbdbiNKLGWx
+DoCjjvbdrpVnjDWG
+EObkKvbdfVzxPizs
+DnbkKvbdRXODcLgc
+EPCjjvbdjJfIJlxS
+DoCjjvbdZLqcsnLm
+DncKjvbdjuvnECXw
+DoDLKvbdEPDKkXCd
+DnbjjvbdOSsvGduQ
+DoDKjvbdIMBzmvpk
+EPCjjvbdqrUkOLAm
+EPCjjvbdTkvOaVoJ
+EObjjvbdozmdKwoA
+DncLKvbdDxXkstTl
+EOcKjvbdfMewHMik
+DoDLKvbdGKeTCgmV
+EObjjvbdxnSgwsIc
+EPCkKvbdaaVdepPw
+EObkKvbdqGEFUVaI
+DncLKvbdjblKpgUg
+DoDLKvbdRWnEDLhD
+DnbjjvbdFxuVAcxC
+DncKjvbdqZOhGpcx
+DoCkKvbdfHjvRnQg
+DnbkKvbdwMvANDeN
+EObkKvbdFfKSOIsq
+DoCjjvbdmajXYPNu
+EObkKvbdANHyTXZx
+EPCjjvbdLFfHbAqV
+DoCjjvbdVgwuxHYz
+EPCjjvbdQvmcblHc
+DoDKjvbdaSFbhUGL
+DncLKvbdzHZMANFX
+DncKjvbdySnJNRbH
+DoCjjvbdMpYRVnHT
+EObkKvbddePSBwDK
+EPCkKvbdMfcPmQUk
+EObjjvbdMgCpNQVL
+DoDKjvbdrEFIonWB
+DoDLKvbdFjdsCgmV
+EObjjvbdwtmFRYlO
+DnbjjvbdIwtBgkqQ
+EPCjjvbduaDxrndh
+EPDLKvbdShzKRABM
+DnbjjvbdfHjvRnRH
+EOcKjvbdBiLBjiGK
+EPCjjvbdCEPaWKNG
+DoDKjvbdtbbuWuoP
+DoDKjvbdegkWRmqH
+DnbjjvbdNeETiJLE
+EPCkKvbdjcLkRHUg
+DnbjjvbdjvXOEBww
+EOcLKvbdTlWPAvOi
+DoCjjvbdrMyixkhJ
+EObkKvbdqGEEtWAh
+DncKjvbdbBVeGQPw
+DoDLKvbdpssfqqjt
+DnbkKvbdFWZPomJe
+DoDKjvbdSBcdkiYk
+DoCkKvbdvBEZSoFI
+EOcKjvbdRaceLhxk
+EOcKjvbdJKEAKQHE
+DoDLKvbddZyQYYpb
+EObjjvbdeXzTsqez
+DncLKvbdCSaCtGXS
+EPCkKvbdlZSrSyHU
+EOcLKvbdTJZiqABM
+DncLKvbdvAdYsOdh
+DnbkKvbdcyxoxZQb
+DnbkKvbdhanbdwRR
+EPCjjvbdbBVeFopX
+DncKjvbdGLFTDHmV
+DoCjjvbdiZuGLpmf
+EOcLKvbdJbjCqJbx
+EObkKvbdGdLWJbKK
+DoCjjvbdRkZGVHKs
+DoCjjvbdGckWJajK
+DncKjvbdAMgxrvyx
+EPCjjvbdEPDKjvbd
+EOcLKvbdkDLjqGtg
+DoDLKvbdNPxRVnGs
+DoDKjvbdySmhmRag
+EPCjjvbdVqnXadkc
+EPDKjvbdTulPitAq
+EObjjvbdGLErcHlu
+DoDLKvbdHELWKCJj
+EObjjvbdbVCHYLUI
+DncKjvbdqvpLbiZR
+EPCjjvbdvAdZSoFI
+EOcLKvbdfjfzcGAE
+DnbjjvbdaNKartmH
+EOcLKvbdcTDKsdJa
+DncLKvbdOSsufduQ
+DnbkKvbdyYIiapZk
+DoCjjvbdunszqKoU
+DoCkKvbddndsLTsr
+DoDKjvbdxxJKBoyk
+DoDLKvbdrovOibvG
+EPCkKvbdiLddOVDZ
+EPCkKvbdiBncFWqR
+EOcLKvbdZQldiNFR
+DoCkKvbdOEctJJKd
+DoCkKvbdrMzKZMIJ
+DnbkKvbdVhYVwgYz
+EOcLKvbdQvnDblHc
+DoDLKvbdmJEURVRa
+DoDLKvbdCTBDUFwS
+EPCkKvbdNrsvHEuQ
+DnbkKvbdegkVqnRH
+DoCjjvbddBrlrATm
+DoCkKvbdCJLCLJFj
+EOcKjvbdxZgefXeS
+EPDKjvbdZtJJZDsO
+DoCkKvbdQvmdDMID
+DoDLKvbdRaceLhxk
+DnbkKvbdSBdFLhxk
+DoDKjvbdOTTufdtp
+DoDLKvbdnQZxujyC
+DnbjjvbdZshhyETO
+DoCjjvbdtvOYJqTA
+DncLKvbdRMxBxmtz
+DnbjjvbdEzsqElCi
+EObjjvbdKefHbAqV
+DnbkKvbdmpZyWKyC
+DncLKvbdNQXqWOGs
+EPDLKvbdVTlsekuj
+EPCkKvbdGcjvJajK
+EPDLKvbdIryArlxM
+DoDLKvbdwyhGFwdr
+EPCkKvbdzaAOgGal
+DncLKvbdiHKCxvJu
+EOcKjvbdLBKgMbXq
+DoCjjvbdTppoVVIN
+EPDKjvbdNPxQvOHT
+DnbjjvbdTvLpJsaR
+DncKjvbdnVUyjiqf
+EPCjjvbdVUNTfLvK
+EOcLKvbdDxYLtTtM
+DnbkKvbddePSCXCj
+EPDLKvbdgGLzOHHA
+DoCkKvbdTukpKTaR
+DncLKvbdVUMtGMWK
+EObkKvbdXnRAYVWU
+DncLKvbdyqOmJJwA
+DoDKjvbdFVyQQNKF
+DncKjvbdvOszqLOt
+EPCkKvbdZRMdhmFR
+EPDLKvbdhlFDmuCy
+EOcKjvbdkIHLeenL
+DnbjjvbdqceJQOWB
+DoCkKvbdzitpPdSt
+EPCjjvbdFeiqmhtR
+DoDLKvbdsQVoJcVf
+EPDLKvbdUQpnuVIN
+DoDLKvbdWSNxBdlD
+EPCjjvbdpyPHgQcx
+EOcKjvbdUyHsyjoO
+DoCjjvbdxrnJNSCH
+DoCjjvbdKDKCpjCx
+EPDLKvbdxsOIlrBg
+DoCkKvbdnGdxMnHZ
+EPDLKvbdfHkWSNpg
+DnbjjvbdkHgMGFnL
+EOcLKvbdxmsIYSiD
+DoDLKvbdEXxLsssl
+DoDKjvbdjFLGuPAO
+EOcLKvbdeEoRawCj
+DoDKjvbdyOTIYSiD
+DnbjjvbdIHGyyXxH
+DncKjvbdTqQoUuHm
+EOcKjvbdMfcQNPuL
+DnbkKvbdatbGxKsh
+DoDKjvbdOTUWHEtp
+EPCkKvbdGLFTCgmV
+DoDKjvbdkHfkfGNk
+EObjjvbdJXtBhMRQ
+EObkKvbdRpUHKGEX
+DnbjjvbdiUzFWrVC
+EPCkKvbdliETqUrB
+DnbkKvbdZjTIQHBf
+DoCjjvbdZMSETnLm
+EPDLKvbdFWYoomKF
+EPDLKvbdRaceLhxk
+DoDLKvbdEASJNZwX
+EPDLKvbdGZUtaEXb
+DncLKvbdyNrgxSiD
+EOcKjvbdbVBgXkTh
+EPCkKvbdvOszpkOt
+EObkKvbdKfGHbBRV
+DncLKvbdjvXOEBxX
+EPDLKvbdvAcyTPFI
+EObjjvbdNsUWGeUp
+EPCjjvbdZtIiZDrn
+DoDLKvbdrRtkOLBN
+DncKjvbdptUHSSLU
+DncLKvbdWSOXaeLc
+EPCkKvbdiLeDmuCy
+DoCjjvbdhyuFkqNf
+DnbkKvbdzoPqFDMY
+DoCkKvbdGFirOItR
+DoCjjvbdEObjkXCd
+DnbkKvbdjKFgilwr
+EPDLKvbdVwIwvEFH
+DoDKjvbdfIKvRmpg
+EPDLKvbdOFDsiIkE
+EPDLKvbdGKdrcIMu
+EPDKjvbdZnmiEeZj
+DoDKjvbdKWVFceHJ
+DncKjvbdvBDySneI
+DncKjvbddeOqawCj
+DoCkKvbdEztRFLbi
+EPDKjvbdMpXpumgT
+EPDKjvbdtunYJqTA
+EPCjjvbdegkVqmpg
+EObjjvbdlYsRsZHU
+EOcKjvbdbUagXkUI
+EPDLKvbdANHySvyx
+DnbkKvbdmJEUQtqa
+EPDKjvbdVUNUFlVj
+EPCkKvbdvvlBVaVu
+DoCjjvbdmozZWLYb
+DoDKjvbdwzIFfXeS
+DoDLKvbdNQXpvOGs
+DncLKvbdEYXlTstM
+EPCkKvbdbUbGwkUI
+EOcLKvbdLBLHNBxR
+DnbkKvbdePErkUUS
+EObjjvbdyXiJaoyk
+DncLKvbdVrNxBeLc
+DoCjjvbdaRebhUGL
+EOcKjvbdxsNhmSBg
+EOcKjvbdXrkaMsoY
+EObjjvbdhuZdwSVC
+DoCkKvbdqGEFUWAh
+DoDKjvbdegkVrNpg
+DoCkKvbdtcCtvuoP
+EOcKjvbdmJEUQtrB
+EOcKjvbdWXIwucdg
+DoDLKvbdhgKCyWJu
+EPCjjvbdcSbkUDjB
+EPDKjvbdLrWmZuQz
+EPDLKvbdXrlAlsnx
+DnbkKvbdKNADygUa
+EPDKjvbdyNrhXsJD
+EOcLKvbdIsZBSlxM
+EPCkKvbddndrkTsr
+DnbjjvbdFyUuBEYC
+EPCkKvbdJcKCpjCx
+EObkKvbdbBWFGQPw
+EOcLKvbdFjdrbhNV
+EPDLKvbdrDdiQNvB
+EObkKvbdkHgMGGOL
+EPCkKvbdkySrSyHU
+DncLKvbdaaWEfQQX
+EObkKvbdehKvRmpg
+DnbkKvbdmIdURVRa
+DoDLKvbdvBEZSneI
+DoCkKvbdNdcshhjd
+DncLKvbdZyEKOCkr
+DoCkKvbdVrNwbFMD
+DnbkKvbdnCKXXoNu
+EPDKjvbdSQTgKGDw
+EObkKvbdaRfCgtFk
+EObjjvbdkWXNcaww
+EObkKvbdDihJuxKA
+DncLKvbdnVVZkKSG
+EPCkKvbdVBBqSpqy
+DncLKvbdqGEFUWAh
+DoCkKvbdsPvOjDWG
+DncKjvbdySmiNRbH
+DoDKjvbdraemLfjy
+DoDLKvbdnPzZWKxb
+DnbjjvbdRjxfVGkT
+DoDKjvbdGLEsDHlu
+DnbjjvbdRotHKFdX
+DoCkKvbdRpUGiecw
+DnbjjvbdZjTHogBf
+EPDKjvbdcTCjtDia
+EOcKjvbdrounibuf
+EOcKjvbdVBCRSqRy
+EPDKjvbdEvZPolie
+DnbkKvbdzRPNJKXA
+DncLKvbdBhjbKiGK
+DnbkKvbdqrVKmkBN
+DnbjjvbdBraDTewS
+DnbkKvbdJcKDRJbx
+DoCjjvbdbUbHYLUI
+DoDKjvbdUyITykOn
+DoCkKvbdYlSEUOMN
+EPCkKvbdRpUHKGEX
+EObkKvbdTAFJICPE
+EPDKjvbdrpWPJcVf
+DoCkKvbdZnnJFFZj
+EPCkKvbdkVvmcaxX
+EOcKjvbdyzdnRgiI
+EObjjvbdqAiFAXIE
+DncLKvbdWWiYWDeH
+EPCjjvbdqlzKZLgi
+EObjjvbdauCGwkUI
+DoDLKvbdtTSSxydc
+EObkKvbdbVCGxLTh
+EObkKvbdkWWmdBxX
+EObjjvbdRNXaxnUz
+EOcKjvbdwXLaVaVu
+DncKjvbdqTtGqrKt
+DncKjvbdIjEAJpGd
+EPDKjvbdHffyyXwg
+EObkKvbdSCEFLiYk
+DncKjvbdiVZeXRuC
+DoDLKvbdWWhwudFH
+EPDLKvbdrRuKmkAm
+EObjjvbdxsNhlqag
+EPDKjvbdcJMikFwY
+DoDKjvbdpyPHfpdY
+DncKjvbdwyhGGXdr
+DoCkKvbdkVwODbXw
+DncLKvbdJcJbpibx
+EPCkKvbdsQWPJcVf
+EOcKjvbdZRNEiMdq
+EObkKvbdjvXOECXw
+EObjjvbdZxcjODLr
+DncKjvbdRWmdDMID
+DncKjvbdjvWmcbYX
+DoCjjvbdnBjXXoOV
+DncKjvbdiBnbdwQq
+EPDKjvbdDoDKjwCd
+EPCkKvbdFxuVBEYC
+DncKjvbdFVxopMie
+EOcLKvbdKWUfEEfi
+EPCkKvbdNrtVgEtp
+DoDLKvbdfoazwDxI
+DoDKjvbdqquKmkAm
+EPDKjvbdhbPCeXRR
+DncKjvbdZtIhyETO
+EPCkKvbdQwNdCkhD
+EPDKjvbdhzUfMROG
+DnbjjvbdrpVoKCuf
+EPDLKvbdtlYWaUAw
+EOcLKvbddoErjstS
+DnbkKvbdyzeORghh
+EPDLKvbdZnmhdeZj
+DoCjjvbdcIlikGXY
+EOcLKvbdLAkHNBxR
+DoCjjvbdtkwwBUAw
+DoCjjvbdgGMZnHHA
+DnbkKvbdUsmTfLuj
+EOcLKvbdqZPHgQcx
+EPDLKvbdLqvlytpz
+DoDLKvbdqdFIomvB
+EObjjvbdBhjbKhfK
+EOcLKvbdrMyjYlIJ
+DncKjvbdDncKkXCd
+DnbkKvbdNQXpunHT
+EPDKjvbdZjSgofbG
+DnbjjvbdBiKbLIej
+DoCjjvbdGAoQxizm
+EOcLKvbdwtldqZLn
+DoDLKvbdIrxaSmXl
+DoCjjvbdNHDQMpUk
+EOcLKvbdTkunaWOi
+DncLKvbdNHCpMpVL
+DoDKjvbdelfXHNKL
+EObjjvbdcyxpYYqC
+DoDLKvbdZGwEAOri
+DoDLKvbdIxUCHkqQ
+DoCjjvbdoznEKxPA
+EOcKjvbdbLMGPNcA
+EObjjvbdiiegilxS
+DoDKjvbdZRNFImFR
+DncLKvbdRbDeLhxk
+EPCkKvbdqlzJxlHi
+EOcLKvbdhkeDnUby
+EPCjjvbdhaoDEwQq
+EPCkKvbdFkFScHlu
+EPCjjvbdJKEAKQGd
+DoCkKvbdpxngfqDx
+EObjjvbdUGznLwWF
+EObjjvbdVZHsykPO
+DncLKvbdYlRdUNlN
+EPCkKvbdHDkWKBjK
+DncLKvbdjKFhKMxS
+DnbjjvbdnBjWxPOV
+EObkKvbdtcCtvvOo
+DnbjjvbdTpqPUthN
+DncLKvbdMoxQvOGs
+DnbjjvbdfNGXHMjL
+EPDKjvbdhgJcZVjV
+DoDLKvbdNGbolpVL
+EPDKjvbdatbHYLUI
+DncLKvbdczZPwxqC
+DnbjjvbdZxcimblS
+EPDLKvbdKaKgMbXq
+EOcLKvbdtbcUwWOo
+DnbkKvbdJutfEEfi
+DoCjjvbdmIdURUqa
+EPCjjvbddBrmSATm
+EPCkKvbdXsLaNUPY
+DnbkKvbdNPwpvOGs
+EOcKjvbdIwsaglQp
+DoCkKvbdlhdUQtrB
+DoDLKvbdGdLWJaij
+DoCjjvbdwXMAvAvV
+DnbkKvbdbrbkTdJa
+EPDKjvbdFVxpQNJe
+DoCjjvbdHDkWJbKK
+DnbkKvbdjvXODbYX
+DoCjjvbdemFwGmJk
+DoCjjvbdQdCaPpcr
+EOcKjvbdqcdiQNvB
+DncLKvbdbBWFFoow
+EOcKjvbdKaKgMawq
+EObkKvbdLBKgMawq
+DncKjvbdcbSmSAUN
+DoCjjvbdyOTHwsJD
+EOcLKvbdOStVfeUp
+EObkKvbdHffyyYXg
+EPCjjvbdmuUykJrG
+DoDLKvbdJYTbILpp
+DncKjvbdnGdwlmgZ
+EPDKjvbdZQldhldq
+EObjjvbdUaBpsRSZ
+EOcKjvbdrzLpSaIO
+DnbjjvbdLGFgbAqV
+EPDKjvbdXrlAmUOx
+EPDLKvbdtSqryZeD
+DoDKjvbdtlXwAtAw
+DoDKjvbdaRebgsfL
+EObjjvbdUWLpKUAq
+EObjjvbdQvmccLgc
+EOcLKvbdznopeDMY
+EOcLKvbdIwsbHkpp
+EPDLKvbdziuQPcsU
+EPDLKvbdelevgMik
+DoDKjvbdTAFIgbOd
+DoDLKvbdbBWFGPow
+DoDKjvbdYqNEiMeR
+EOcLKvbdhficYuiu
+EOcKjvbdyTOImRbH
+DncKjvbdiLeDmtby
+EPDLKvbdUsmTekvK
+DoCkKvbdkCkkQftg
+DoCkKvbdVTmUFlVj
+DoCkKvbdTIyjRAAl
+EOcKjvbdbUafxKtI
+EOcKjvbdZsiIxdSn
+DoDKjvbdSCEElIyL
+DnbjjvbdBsAbsfXS
+DoCkKvbdBcpAuimG
+DoCkKvbdVwIwvEEg
+DnbjjvbdajlFoNcA
+EPCkKvbdtSrTYzFD
+DnbkKvbdGFirNhsq
+EOcKjvbdapHHELzd
+DoDLKvbdiUyeXSUb
+DnbjjvbdtAGqIABS
+DnbkKvbdXsLaMsnx
+DoCkKvbdeEnqawDK
+EOcKjvbdDxXkstUM
+DnbjjvbdcyxoxZQb
+DoDLKvbdlrZVZrci
+DoCkKvbdTAEiICPE
+EOcLKvbdpyPHfpcx
+EPDLKvbdVBCRTQqy
+DnbjjvbdmJEUQtqa
+DnbjjvbdkClKqHVH
+EObkKvbdCJKajiGK
+EObkKvbdeAURMxJf
+EPDLKvbdcSbkUDjB
+DncLKvbdsCFmLfjy
+EPCkKvbdIwsahLqQ
+DoCkKvbdrJAJeMne
+DoDLKvbdIHGzYwxH
+DoCjjvbdGckVjBjK
+EObjjvbdegkVqmqH
+DoDLKvbdLKaIWAKZ
+EPDLKvbdaRfChUGL
+DoDLKvbdyYJJaozL
+DoCkKvbdrWpLbhyR
+DoCkKvbdLGGIBaRV
+DoDKjvbdKyRJrztf
+DoCkKvbdjuvnEBxX
+EObkKvbdNeEThhkE
+EPCjjvbdQwNcbkhD
+DoCkKvbdJqZePGOF
+EObjjvbdNGbomQUk
+EObkKvbdkxrqsZHU
+EOcLKvbdrounjDVf
+DoDLKvbdkClLRGtg
+EOcLKvbdbKkfOnDA
+EPCkKvbdRDbaPpcr
+EPDLKvbdkHgLefNk
+EOcLKvbdFVxpPmKF
+EObkKvbdsrrSxzEc
+DnbkKvbdFeirOIsq
+DncLKvbdzitopDrt
+DoCjjvbduWOXjQsA
+EPCkKvbdyXhjCPyk
+DoDKjvbdaaWEfPow
+DncLKvbdvAcySneI
+EObjjvbdADRwjZhp
+EObkKvbdnPyxvLYb
+DncKjvbdijGIJlwr
+EPCjjvbdJcJbqJcY
+DnbkKvbdkMbLydgP
+DoCkKvbdRDbaQQcr
+DoCjjvbdxsOIlrCH
+DnbjjvbdKQydnfOF
+EPDKjvbdcImKKfWx
+DnbjjvbdcImKKewY
+EObkKvbdqdFJPmua
+EObjjvbdajkennDA
+DnbjjvbdZyEKNcLr
+DoCjjvbdKWVFdEgJ
+EPDKjvbdWXIwuceH
+DnbjjvbdqiAJdlne
+EOcLKvbdkyTRryGt
+EPCjjvbdpaJFAWgd
+EPCjjvbdmJDsqVSB
+EPCjjvbdREDAopdS
+DoCjjvbdRpUHKFdX
+DncKjvbdptUHSSKt
+EPCjjvbdiCObdvpq
+DncLKvbdNwnuzcmt
+DncKjvbdqdFIpOWB
+DoDKjvbdjggLefNk
+EObkKvbdrNZiyLgi
+EPCkKvbdaSFcITfL
+DnbjjvbdGLFTDINV
+EPCkKvbdiLeENuDZ
+DncLKvbdZyEJmcLr
+EObjjvbduDCuWvOo
+DoDKjvbdNQXqWNgT
+DncKjvbdVBCRTRRy
+EPCjjvbdSQUGifEX
+EOcLKvbdANIZSvyx
+DoDKjvbdvBDyTPFI
+DnbkKvbdEPCkLWbd
+DoCkKvbdyYIjCPyk
+DnbkKvbdelewGmKL
+EPDLKvbdatbGxLUI
+EPDLKvbdTvLojTaR
+DoCjjvbdhtyeWrVC
+DoDKjvbdzeZnzdzQ
+DnbjjvbdyzdnRhJI
+EPCjjvbduLxWaUBX
+EOcLKvbdkyTRsYgU
+DnbjjvbdCTBCsewS
+EObjjvbdjAPgApHK
+EPDLKvbdwkWdHzyf
+EObjjvbdsPvOicWG
+DoCkKvbdTulPisaR
+DnbkKvbduCcUvuoP
+EObkKvbdZRMdiMeR
+DoCkKvbdSPtHJfDw
+DncLKvbdKaLGlaxR
+DnbkKvbdRpTgKGDw
+DoCjjvbdWXJYWEEg
+EObjjvbdWXJYWDdg
+EOcKjvbdKCjCqKCx
+DnbkKvbdakMGPNcA
+DoDKjvbdwkXDgzzG
+EObkKvbdNHDPlotk
+DncLKvbdyzdmrIJI
+EObkKvbdFkErbhMu
+EPCkKvbdNeDsiIjd
+DoDKjvbdIGfyyXxH
+DoCjjvbdZyDinDLr
+EPCjjvbdemFvfmJk
+EObjjvbdJYTbILqQ
+DnbjjvbdWXIwucdg
+DoCjjvbdiHKCxvJu
+EPDKjvbdfpBzwDxI
+DoCjjvbdaNLCStlg
+EPCkKvbdnVUykJqf
+DoCjjvbdyYIjBozL
+EPCjjvbdzjUpQDsU
+DoDLKvbdZxcjOCkr
+EPCkKvbdeFOrBvcK
+EPDKjvbdKaKflaxR
+EOcLKvbdfMevgMjL
+EPDKjvbdGckWKCKK
+DoCjjvbdKVuFdEgJ
+EObjjvbdfMfWfmJk
+DoDLKvbdMfbomQVL
+EPDLKvbdRkYeuGjs
+EOcLKvbdKfGHaaQu
+EObkKvbdoznDjwoA
+EOcKjvbdUMWPBVoJ
+DoCkKvbdFjeSbgmV
+EPCjjvbdrEFJQOWB
+EOcLKvbdvAcyTOdh
+DnbjjvbdWfYzUAOs
+EObkKvbdTkuoBWPJ
+DnbkKvbdFpASvgFy
+DoCjjvbdczZQXyRC
+DoCjjvbdRDcBQQdS
+DoDKjvbdqYngfqDx
+EObkKvbdWRmwbElD
+EPCjjvbdFyVVBDwb
+EObjjvbdBhjbKhej
+DncLKvbdzaAPGgBl
+EObkKvbdTppoVUgm
+DoCjjvbdbrcLTcjB
+EPCkKvbdGLFTCglu
+DoDLKvbdDwxMUUUM
+EPCjjvbdNQYQumgT
+DncKjvbdmfeXmOGy
+EPCjjvbdwtmFRYkn
+DoCkKvbdsBfMlGjy
+DncLKvbdRpUHKGDw
+EObjjvbdjblLQfuH
+EObjjvbdJYTbHlRQ
+DoCkKvbdmttyjiqf
+DoCkKvbdZQldiMdq
+EPDKjvbdFejSNiUR
+EOcLKvbdjgfkfFnL
+DnbjjvbdMpYQvNgT
+DnbkKvbdUyIUZjnn
+DnbkKvbdJbjDRKDY
+EPCjjvbdeEnrBvcK
+EOcKjvbdyzdnSIIh
+DoDKjvbdDoDKjwCd
+DoDLKvbdCSaDUFwS
+DoDLKvbdIrxaTMwl
+DnbkKvbdRNXayNtz
+DoCkKvbdxxJKBoyk
+DncLKvbdnGdxNOGy
+DnbjjvbdySmhlqbH
+DoCkKvbdxwhjBoyk
+EPCjjvbdZQleIleR
+EPCjjvbdaRfChTek
+EOcKjvbdYTMBNUPY
+DoCjjvbdegkWSNpg
+EObkKvbdziuQPdTU
+EOcKjvbdnCKXYOmu
+DoCkKvbdZnmhddzK
+EObjjvbdzaAPGgBl
+DoDLKvbdePFSjtTr
+EPCkKvbdNrtWGeVQ
+EPCjjvbdelfWfmKL
+DoDKjvbdKxpjSztf
+EPDKjvbdxmsIXsIc
+EPCjjvbddZyPxYqC
+DoDKjvbdvOszqLOt
+DncKjvbdatbGxLTh
+EObjjvbdzoQQdbkx
+DoCjjvbdZRMeImEq
+EOcKjvbdqTtGqqjt
+EOcKjvbdqAheAWgd
+DnbjjvbdySmhmRag
+DncKjvbdjKFhJlwr
+EPDKjvbdqFceUWBI
+DoDKjvbdsBemLgLZ
+EPDLKvbdKQzEoFnF
+EOcKjvbdFjdsCgmV
+EObjjvbdpfEEtWBI
+EPDKjvbdZxcjOClS
+EPDKjvbdnBivwoOV
+EPCjjvbdrylQTAhO
+EPDKjvbdKaLGmBxR
+EPDKjvbdHgGzYwxH
+EObjjvbdkHflGFmk
+DnbjjvbdqGDeUVaI
+EPDKjvbdMgDQNQUk
+DncLKvbdSKyGVHKs
+EOcKjvbdqFdEsvAh
+EOcKjvbdYkrETnLm
+DnbkKvbdqBIeAXHd
+DncLKvbdZQldhmFR
+DncLKvbdFjeSbhMu
+EPCkKvbddePRavcK
+EPCkKvbdssRsYzEc
+EPCkKvbdRadFLhxk
+DnbkKvbdVvhxWEEg
+EOcLKvbdIryArmYM
+EPCkKvbdKfGHbAqV
+DncKjvbdEKIJuxKA
+EPDKjvbdIwsbIMRQ
+EObkKvbdzaAOfgBl
+DncLKvbdeUAUASlv
+DnbjjvbdlqxuZsDi
+DnbjjvbdUWMQKTaR
+EOcLKvbdNGbpNPtk
+EPDKjvbdWSOYCEkc
+DoCkKvbdjggMGGOL
+DoCjjvbdSQUHJecw
+DncLKvbdZyDjODMS
+EObjjvbdfpBzvcxI
+EOcLKvbdTlVoAvPJ
+DnbjjvbdVviYWEFH
+EPCkKvbdZnmiFFZj
+EObjjvbdNGbpNQUk
+DoDLKvbdrbGMkfjy
+DoDLKvbdxnShYSiD
+EObkKvbdJYTahMRQ
+DoDLKvbdoAKzshEO
+DoCkKvbdZxcjOCkr
+EPDLKvbdRWmdCkgc
+EPCkKvbdGFiqnJUR
+DoDKjvbdRzJgsDWA
+DncLKvbdptTfqqjt
+EPDKjvbdmIctRUqa
+EObkKvbdnBiwXoOV
+DnbjjvbdfMevfljL
+EObkKvbdBraDUGWr
+DncKjvbdUxhTzKnn
+DoCjjvbdmfdxMmfy
+DnbjjvbdhuZeWrVC
+DnbkKvbdLiCLpxAS
+DnbjjvbdKfFgbApu
+DnbjjvbdziuPpETU
+DoCjjvbdwuNEqZLn
+EPCkKvbdEXwksssl
+EPCjjvbdhgKCxujV
+DoDKjvbdhlEdOVDZ
+DncKjvbdLAjgMbXq
+DncKjvbdOFEThhkE
+DoCkKvbdANHxrvzY
+EPCjjvbdZtIiZDrn
+DoCjjvbdYpldhmEq
+DncLKvbdqwPlDIyR
+DncLKvbdUtNUFlWK
+EObkKvbdkWXODbYX
+DnbjjvbdRzJhSbvA
+DoCkKvbdEJgjVxKA
+DncKjvbdxnSgxShc
+EObjjvbdbUbHYKsh
+DncLKvbdZoNiFEzK
+EPDKjvbdbiMjKevx
+DnbkKvbdIwsbHlRQ
+EObjjvbdhWyAzzAJ
+EObkKvbdqvpLcIyR
+EObjjvbdGGKSOIsq
+EObkKvbdTpqPUthN
+DncKjvbduaEZTOdh
+EObkKvbdJJdAJofd
+DoCkKvbdEKIJuwjA
+DncLKvbdDnbjkXDE
+DnbjjvbdhbObdwQq
+EObjjvbdunszpkPU
+EPCjjvbdwNWANDdm
+EPDLKvbdozmcjxPA
+EObjjvbdZnmiFFZj
+DnbjjvbduDDUwVno
+EOcKjvbdZjShPfbG
+DncLKvbdADSXiyhp
+DoCjjvbduCcVXWPP
+DnbkKvbdffLzOHHA
+DncLKvbdBdPaWJlf
+EPDLKvbdJvVGEFGi
+EPCkKvbdvwMBWBWV
+EObjjvbdijGHjMxS
+EPCkKvbdaNLCTVNH
+EPCjjvbdbAudeopX
+DoDKjvbdozmcjwoA
+EPCjjvbdYlRctOMN
+DoCjjvbdDoDLKvcE
+EObkKvbdVqmwaeMD
+DnbjjvbdqvolChyR
+EPCkKvbdRkZGVGjs
+DoDKjvbdjvXOEBxX
+DoCjjvbdIHHZyXwg
+DnbkKvbdLBKgNCYR
+EPDKjvbdyNsHxShc
+EOcKjvbdyzdmqhJI
+DnbjjvbdqFcdtVaI
+EObjjvbdrJAKElne
+DncKjvbdTvLpJtAq
+EObkKvbdDoDKjvbd
+EPCjjvbdYlRcsnLm
+DoDKjvbdegkVqmqH
+EPDLKvbdZHXEAPSi
+DoDKjvbdakLennDA
+DncLKvbdrDdiPmua
+DoCjjvbdhbPDEwRR
+EPDLKvbdtcDUvuno
+DnbjjvbdEKHjVxKA
+EOcLKvbdYqMdhmFR
+EPDLKvbdmttzKiqf
+EPDLKvbdTkvPAuoJ
+DncLKvbdVAbRTQqy
+DncLKvbdLBKflbYR
+DoCjjvbdZyDimcMS
+EOcKjvbdFpATXHFy
+EObkKvbdnCJwYOmu
+EPCkKvbdVZHszLPO
+EPCkKvbdCSaDTfXS
+DncKjvbdNVSqjmAX
+EPCkKvbdFjdrbhMu
+EPCkKvbdbsCkUDjB
+EObjjvbdMowpumfs
+DoDLKvbdRotHJecw
+DnbjjvbdTfzmkwWF
+EObjjvbdBcpAvKNG
+DoDLKvbdWHxWXfxz
+EPCjjvbdqUUGrSKt
+DncLKvbdliDsqVSB
+DnbkKvbdBdQAujMf
+DnbkKvbdWXIxVcdg
+DoCkKvbddePSCXCj
+DnbjjvbdZirhPfbG
+DnbjjvbdyXiKBozL
+DnbjjvbdznpREcMY
+DncKjvbdJcKCqKCx
+EPCkKvbdJbibpjDY
+EPDLKvbdkClLRHVH
+EPDKjvbdTvLoisaR
+EOcKjvbdZGwEAPSi
+EPCkKvbdKRZdnenF
+DncKjvbdfMfXGmJk
+EPCkKvbdhfibyWJu
+EOcKjvbdMIbLqYAS
+EPDLKvbdbUbHXjtI
+EObkKvbdCSaDUFwS
+EPDLKvbdGGJqnJUR
+EOcLKvbdDoDKjvbd
+DnbjjvbdFkFTDIMu
+DnbjjvbdgFlZnGgA
+DoCkKvbdakLfPODA
+EPDLKvbdDwwlTstM
+DoCjjvbdMJBkqYAS
+DnbjjvbdiGjCxujV
+EPDLKvbdVwIwuceH
+EPDLKvbdZyEKOCkr
+EPDKjvbddoFTLTtS
+DoCkKvbdXrlAlsnx
+EOcLKvbdZoOIeEzK
+DnbjjvbdaMjbTVMg
+EPDKjvbdeOeTKssr
+DncKjvbdSKxetfjs
+DoCjjvbdpxnhGpcx
+EPDLKvbdmtuZkJrG
+DoCjjvbdYkqdTmlN
+EOcLKvbdJuuGEEfi
+DoCjjvbdhzUfMROG
+DncLKvbdddnrBvbj
+EOcLKvbdWSNwbFMD
+DoDLKvbdtSrTYydc
+EPCjjvbdRjxetgKs
+DncKjvbdFxttaEYC
+EPDLKvbdiBncFWpq
+DnbjjvbdyTOImSCH
+DoDKjvbdcyyQXyRC
+EOcLKvbdZLrEUOLm
+DoCjjvbdXmqAYVWU
+EPCjjvbdUsltFkvK
+DncKjvbdLqvmZuQz
+DnbjjvbdZjTIQGaf
+DoDKjvbdzoPpeCkx
+EPDKjvbdGGKSNhsq
+DncKjvbdtSrSxzFD
+EPCkKvbdyOTHxShc
+DnbkKvbdehKvSORH
+DoDLKvbdWIXvYHYz
+EObkKvbdDoCkLXCd
+DoDLKvbdLBKflaxR
+EPDLKvbdKQzFOenF
+EObjjvbdjFLHVPAO
+EObkKvbdFeiqmhsq
+DoDKjvbdRotHKFdX
+DnbkKvbddZxpYZQb
+DncKjvbdqqtkNkBN
+EPDKjvbdZjShPgBf
+DoCkKvbdNHCpMouL
+EObjjvbdxZgefYFS
+DoCjjvbdNrsvHEuQ
+DoCjjvbdwzHeewdr
+EObjjvbdvPTzpkPU
+EPDKjvbdrounibvG
+DnbkKvbdpstGqqjt
+EPDLKvbdeFOrCXDK
+EOcLKvbdGBPRYizm
+DoDLKvbdNwnuzdOU
+DnbkKvbdRMwaxnUz
+EOcLKvbdDihKWXjA
+EObkKvbdFeirOJTq
+DoDLKvbdSKxeuGjs
+EOcLKvbddndsKssr
+DnbjjvbdiCPDEvpq
+EOcKjvbdMoxQumfs
+DnbkKvbdfNGWfljL
+DnbkKvbdIHGzZXwg
+EObjjvbdTlWPAvOi
+DoDLKvbdnPyyVkZC
+EOcKjvbdkWWmdBxX
+EObkKvbdEJgjWXjA
+DnbjjvbdkMalZdgP
+DnbkKvbdsCGNLfjy
+DnbjjvbdYqMeIleR
+DncLKvbdMgComPtk
+DoCkKvbdMfbolouL
+DncKjvbderAvzlDP
+DnbjjvbdqwQLcIyR
+EObjjvbdcImJkFwY
+EPCjjvbdYzberKVy
+DoCjjvbdEzsqElCi
+EObkKvbdRotGiecw
+EPCkKvbdGLErcINV
+DoCkKvbdYpmEiMdq
+DoDKjvbdJXsaglRQ
+DnbkKvbdFVxpPmJe
+DnbkKvbdxUmEpyLn
+EPCjjvbdLrXMytpz
+DnbkKvbdhtzEvqtb
+EPDKjvbdDxYLstTl
+EPCkKvbdiBoDFXQq
+EPCkKvbdZoOJEeZj
+DoCjjvbduDCuWuoP
+EObkKvbdjcLkQfuH
+DoCkKvbdcImKLGWx
+EPDLKvbdEYXlUUTl
+EOcLKvbdZLqdTnMN
+EOcKjvbdmozYujyC
+DncLKvbdJpzEnfOF
+EOcLKvbdiCPCdvpq
+DncKjvbdADRxKZhp
+DoDLKvbdmJDsqVSB
+EObkKvbdnBiwYPOV
+EObkKvbdqwQMDIxq
+DncKjvbdeFOqbWbj
+EPDKjvbdmfeYMmfy
+DnbkKvbdGLFSbhNV
+DoDLKvbdwkXDgzzG
+EObkKvbdbAvFFpQX
+EPDLKvbdyXhjBoyk
+DoCjjvbdMfbpMouL
+DoCjjvbdREDApRES
+DncLKvbdmajWwnmu
+DoDLKvbdIidAJofd
+DoCjjvbdSZihTCvA
+DoCkKvbduLwvaUBX
+EPCkKvbdiHJbyVjV
+EObkKvbdGYtuAdXb
+DoDLKvbdCTBCtFwS
+EOcLKvbdhlFENtby
+DoCkKvbdySnIlrBg
+EPDLKvbdwuNFQyMO
+DncKjvbdlqxtzTDi
+DoDKjvbdWWhxWEFH
+DoCkKvbdiHJcZVjV
+EPDKjvbdCflGHAzc
+DncLKvbdzROmJKXA
+EPDLKvbdCJLBjhej
+EOcKjvbdVrNwbEkc
+DnbkKvbdUtNUFlWK
+DoDKjvbdLBKflbYR
+EPCjjvbdauBfwkTh
+EPCkKvbdrXQMDJZR
+DnbjjvbdnVUyjjSG
+DncKjvbdiMEdOUby
+DoDKjvbdqiAKFNPF
+EOcLKvbdQdDBQQcr
+DoDKjvbdpxnggQdY
+DncKjvbdtSrTYydc
+DnbjjvbdwzHefXeS
+DoCjjvbdRosfjGEX
+EPCkKvbdnPyxujyC
+EObjjvbdZyEJnCkr
+DnbkKvbdhytelRNf
+EPDLKvbdeYZstSFz
+EObjjvbdTfzmlXVe
+EOcKjvbdbKkenmcA
+DncLKvbdvwMAuaVu
+EObkKvbdwMvAMdEm
+EOcLKvbdkHflFfNk
+EPCjjvbdzoPpeDMY
+DoCjjvbdiLeDmuCy
+EOcKjvbdRpUGjGDw
+DnbkKvbdUslsekuj
+EPCjjvbdmJEURVRa
+DncLKvbdZjSgofaf
+EOcLKvbdaMjasUlg
+DoCjjvbdREDBPpdS
+DnbjjvbdIwsaglQp
+DoCkKvbdkNCLzFHP
+DoDLKvbdaRfChUFk
+EPCjjvbdrRtjnKaN
+EPCkKvbduoTzpkOt
+EOcKjvbdnHFYMmfy
+EOcKjvbdHDkVjBjK
+EObjjvbdEXxMTssl
+DnbjjvbdNPxRWOHT
+EObjjvbdiZtfLpmf
+EObjjvbdTvLojTaR
+DoDKjvbdKkBIWAKZ
+DoDLKvbduCbtwVno
+DncLKvbdmttzKjSG
+DncLKvbdbBVdfQQX
+EObkKvbdyXiKBpZk
+DncLKvbdzGxlAMdw
+DoCkKvbdMpXpvNfs
+DoCkKvbdKQydoGOF
+EPDLKvbdTfzmlXVe
+EPDKjvbdQccBPqES
+EPCjjvbdZtJIyESn
+DoCjjvbdVrOXbElD
+DnbjjvbdbLMGOmcA
+DnbkKvbdnPzZWKyC
+EPDLKvbdmajWwoOV
+EObjjvbdQwOEDMHc
+EPCkKvbdTvMQKUBR
+DoCjjvbdOTUVgEtp
+DoCkKvbdIHHZyXxH
+EPDLKvbdDoDLKwDE
+EObjjvbdiZtfMQmf
+EObjjvbdijGHimXr
+DoDKjvbdVrNxCElD
+EPDLKvbdJutedFGi
+DnbjjvbdmSZVZsEJ
+DncKjvbdqlzKYlIJ
+EOcKjvbdfelZnGgA
+EOcKjvbdYlRctOLm
+DoDKjvbdPxmAHSrK
+EPCjjvbdWWiYWEEg
+DoCjjvbdbAvFFoow
+EOcKjvbdFjeSbglu
+EPDLKvbdlqyVZsEJ
+EOcKjvbdddoRbXDK
+EPCkKvbdaRecHtFk
+DncLKvbdSKyGUgKs
+DoDLKvbdcyyPwyQb
+DoDLKvbdnVUzKjRf
+EObjjvbdYkqdUOLm
+EObkKvbdRbEEkhyL
+DncKjvbdtAHQhAAr
+DnbkKvbdVqmwbFMD
+EOcLKvbdznoqFDLx
+EOcLKvbdEXxLtTsl
+DnbkKvbdtumwipsA
+EObjjvbdmJEUQtqa
+DncKjvbdxwhjCPyk
+DnbkKvbdyfyMANFX
+DncLKvbdiVZeXRtb
+EObkKvbddtAUATMv
+EOcKjvbdxnSgwriD
+EObjjvbdlrZVZrdJ
+EPCkKvbdsBelkfkZ
+DoDKjvbdFVyPomJe
+EPCkKvbdQmYBxnUz
+EOcKjvbdSBdFLhyL
+DncLKvbdmJETpuSB
+DoDLKvbdRECaPpcr
+DncLKvbdIxUBglRQ
+DoCjjvbdpssfrSLU
+DnbkKvbdSQUHJedX
+EObjjvbdkySrTZHU
+EObkKvbdZtIiZETO
+DoCjjvbdtumwipsA
+DoCjjvbddBrlrAUN
+EPCjjvbdKCjDQibx
+DoCjjvbdQccAopdS
+DoDLKvbdSBceLiYk
+EPDKjvbdREDAoqDr
+EOcKjvbdZQleJMeR
+DoCkKvbdEARiMywX
+EPDKjvbdkDLkQgUg
+DncLKvbdFjdsDIMu
+EPCjjvbdlrYtysDi
+EPCkKvbdezuxeIsw
+EObkKvbdyNsHxTJD
+DnbkKvbdemGWgMik
+DoDLKvbdBhkCKhej
+EOcLKvbdjvWmcaww
+EPDLKvbdqTsgRrLU
+EObkKvbdZyDimcLr
+EPCjjvbdlrYtzTEJ
+DoCkKvbdHgGyyYXg
+DoCkKvbdZoNhddyj
+EPDKjvbdhtzFWquC
+EPCkKvbdDoCkKwDE
+DoDLKvbdsrqsZZeD
+EPCkKvbdiHJbxuiu
+DoCjjvbdhlFEOUcZ
+EPDKjvbdDigiuwjA
+EPDKjvbdQdDBPqES
+DoCjjvbdcTCjsdKB
+DncLKvbdUsmUFkuj
+EPDLKvbdnHEwlnGy
+EOcLKvbdxVNEqYkn
+DoDKjvbdEuxopNJe
+EObkKvbdkClLQfuH
+EPCjjvbdcTDLUEKB
+EOcKjvbdEPDKkXDE
+EPCjjvbdXsLaNUOx
+DoDKjvbdFWZQQNKF
+EPDLKvbdUtMtFlVj
+EOcKjvbdzaAPGfal
+DnbkKvbdHlBznXRL
+DoDLKvbdTlVoBWPJ
+EPCkKvbdDoCjkXDE
+EOcKjvbdrzMQTAhO
+EOcLKvbdozmdLXoA
+DoDLKvbdzQnmIjXA
+DoCkKvbdmgExMmgZ
+EPCkKvbdzjUoocrt
+EOcLKvbdwyhGFweS
+EOcLKvbdWWhxVceH
+DncLKvbdqqtkOKaN
+DoCkKvbdOTTvHEuQ
+DoDLKvbdjJehKMwr
+DoCjjvbduDCtvuoP
+DnbjjvbdqdEiPmvB
+DnbjjvbdhtzEwRuC
+DnbkKvbdRkYetfkT
+DoDKjvbdCDpBVjNG
+DoCkKvbdcSbjscjB
+EPDLKvbdYpldiMdq
+DoCjjvbdaaWEfPow
+EOcKjvbdqZPHgQdY
+DoCkKvbdeOdrjtUS
+DoDLKvbdFaPRZJzm
+DnbjjvbdRECaPqES
+DncKjvbdaMjaruMg
+EObjjvbduVnYJpsA
+DnbkKvbdqTsfrSLU
+DncKjvbdYqMeJMdq
+EOcKjvbdvvlBWAuu
+DnbjjvbdUxgtZkOn
+EOcKjvbdOSsufduQ
+EOcLKvbdtumxJqTA
+DncKjvbdIryAsNXl
+DoDKjvbdMuTRkNAX
+DoDLKvbdxnSgwrhc
+EOcKjvbdiHKCxujV
+EObkKvbdeKJrVtzn
+EPDLKvbdjhHMGGNk
+EOcLKvbdkVwNdBww
+EOcLKvbdygZMANEw
+EPDLKvbdRXODcLhD
+EPCjjvbdSPsfjFcw
+DoDKjvbdYpleIldq
+DoDLKvbdOEcsiIjd
+DnbjjvbdddoRavbj
+DncLKvbdHDkWKBjK
+DoCjjvbdxxJKBoyk
+EPDKjvbdYkqdUNkm
+DoDLKvbdDnbjjvcE
+DoCkKvbdVvhxVceH
+EPDLKvbdWRnXbFMD
+EObkKvbdliEUQtqa
+EPCkKvbdNQXqVmfs
+EOcLKvbdIGfyyYYH
+DncKjvbdxUldpxlO
+DoDKjvbdznopdcLx
+DncKjvbdHDkVibKK
+EPDLKvbdjlbLydgP
+DoDKjvbdYTMAltOx
+DoDKjvbdcSbkUEKB
+EPCjjvbdzoQREblY
+EOcKjvbdZxcinDMS
+DoDKjvbdZyDjODMS
+DoCjjvbdxZgfFwdr
+EPDLKvbdaMkBsVMg
+EPCkKvbduDDUvuno
+DncKjvbdsCFmLgKy
+DoDLKvbddeOrCWcK
+DncLKvbdNddThhjd
+EOcKjvbdBvzcheQW
+EPDLKvbdeEnqbXCj
+DoCjjvbdNrtVfduQ
+EOcKjvbdZQmEiNFR
+EPCkKvbdGFjSNiTq
+EPDKjvbdZxcinCkr
+DoCjjvbdkNBlZdgP
+DoCkKvbdEYXkstTl
+DncLKvbdYpmEhmEq
+EOcLKvbdePFSkTsr
+DoCjjvbdemFvfmKL
+DnbkKvbdemFwGljL
+EPDLKvbdmbJvxOnV
+EPCjjvbdtbcVXVoP
+EOcKjvbdFkErcHmV
+DoDKjvbdVUMtFlWK
+EOcLKvbdkMakydfo
+DnbjjvbdIMBznWqL
+EObkKvbdptUHRrLU
+DnbkKvbdjJfHilwr
+EPCjjvbdGYuUaDxC
+EObjjvbdmtuZjjRf
+DncLKvbdkCkkQfuH
+DoDLKvbdtlXwBUBX
+DncLKvbdCWzchePv
+EObkKvbdrEEiPmua
+EOcLKvbdYqNFIldq
+DoDLKvbdfILWRnQg
+DoDLKvbdqUUGrRkU
+DoCjjvbdfMfWflik
+EOcLKvbdOTTugEuQ
+DncLKvbdjvWnDaww
+EOcLKvbdsPuoKDVf
+EPDLKvbdZirhPfaf
+DoCjjvbdDwxLsstM
+DnbjjvbdfHkWRmpg
+DncLKvbdrpWOibuf
+EPDLKvbdZtIhyESn
+DncLKvbdwygfGYEr
+EPCjjvbdeEoSCWcK
+EPCjjvbdjuvmdBww
+EObjjvbdqUTfqqjt
+EOcLKvbdZjSgogBf
+DoDKjvbdYqMdiMeR
+DoCjjvbdKefICApu
+DoDLKvbdMfcQNQVL
+EPCkKvbdjggMGGNk
+EObkKvbdCDoaVjMf
+EObkKvbdWWiXuceH
+EOcLKvbdURROuVHm
+DnbjjvbdpssfrSLU
+DncKjvbdgFkzNgHA
+DnbjjvbdaSFbgtFk
+DncLKvbdIxTahMQp
+EPDLKvbdKWVFceGi
+DncKjvbdFVyPomKF
+DoDKjvbdZirgpHBf
+EObjjvbdVqmwadkc
+EPCkKvbdieLHVPAO
+DncKjvbdZLqdUOMN
+DoDKjvbdWWiYWDeH
+EObkKvbdQwNdClID
+DnbjjvbdMoxRVnGs
+DncLKvbdrDdiPmvB
+DnbjjvbdZQleJNFR
+EOcLKvbdrDdhpOVa
+EPDLKvbdYqNFImFR
+DoDKjvbdEYXlTtUM
+DoCjjvbdhuZeWqtb
+EPDKjvbdMfcPlpVL
+EOcKjvbdNQYQvNfs
+DoDKjvbdiUzFXSVC
+DoCkKvbdmRxtzSci
+DnbjjvbdbiMikGXY
+DoCjjvbdQdDBQQdS
+EObjjvbdqZPIGqDx
+DoCkKvbdkWWmdBxX
+DoDKjvbdKxpirzuG
+DoCjjvbdlBNPNALA
+DoCjjvbdhzVGMROG
+DoCjjvbdzoQREcMY
+EPDKjvbdlAlnmALA
+EPDLKvbdwuMeRZLn
+EOcLKvbdYqMdiNFR
+EObkKvbdOTTugEuQ
+EOcKjvbdYTMAmUOx
+DnbjjvbdRDcBQRES
+DoDLKvbdidkHVPAO
+EPCkKvbdSKyFtfjs
+DoCjjvbdhytelQmf
+DncLKvbdEztRElCi
+EPDLKvbdRWnEDLgc
+DoDKjvbdwuNFQyLn
+EObkKvbdGLFTDHmV
+DnbkKvbdShyiqABM
+EObkKvbdUaCQsRSZ
+EOcKjvbdjuwNcbXw
+DnbkKvbdmfeXlnHZ
+DncKjvbdsPuoKDVf
+EOcKjvbdNGbomPtk
+DoDKjvbdvPTzpkOt
+EPDKjvbdJqZdneme
+DncKjvbdqTtGqqkU
+DnbkKvbdjggLeemk
+DoCjjvbdVZIUZkOn
+EPCkKvbdzjVPodTU
+DncKjvbdnBjXYOnV
+DoDKjvbdHgGzYxYH
+EPCkKvbdSZigsCvA
+EPCjjvbdtbbtvuno
+DoDKjvbdPIAXyAZB
+EObjjvbdRNXaxmtz
+DoCkKvbdUyITykPO
+EPCkKvbdssRryZeD
+EObkKvbdJuuGEFGi
+DoDLKvbdxZgfGXeS
+EObjjvbduoTzqLOt
+DoDKjvbdbrbkTcjB
+DncLKvbdxxIiaoyk
+DoCjjvbdFxtuBDxC
+EPDLKvbdzaAPGgBl
+EPDLKvbdpxnhGqDx
+EOcKjvbdtSqsZZeD
+EOcLKvbdMowpvOGs
+EObkKvbdVBCRSpqy
+DoCkKvbdZRNEiMeR
+EPCjjvbdczYowyQb
+DncKjvbdjgfkfGNk
+DnbkKvbdssSTYzFD
+EOcLKvbdVhYWYGxz
+DncKjvbdKDJcQibx
+DncKjvbdZHWdAPTJ
+EPCkKvbdFjdsChNV
+DoDLKvbdJcJcRJcY
+EPCjjvbdRjyGVHLT
+DnbkKvbdBcpBWKMf
+DoCjjvbdxUmEpyMO
+EPDKjvbdZoNiFEzK
+DoCjjvbdPIAYZAZB
+EOcLKvbdFejSOIsq
+DoDKjvbdjggMGFmk
+EObkKvbdWRnXadlD
+EObkKvbdnGdxMmfy
+DoDLKvbdLBKgNBxR
+DoCjjvbdaSGChTek
+EPCkKvbdSCEElIxk
+EObjjvbdIxTbHlQp
+EPCkKvbdOEcshhkE
+EOcLKvbdbsCjsdKB
+DncLKvbdCSaDUGXS
+EPCjjvbdRzJgsDWA
+EPDLKvbduCbuXVno
+EOcLKvbdGdLViajK
+DncKjvbdCWzdJEpW
+DncKjvbdjuwODbXw
+DncLKvbdqUTfqqjt
+EOcKjvbdxUmFRYkn
+DoCjjvbdVAaqSqRy
+EPDLKvbdaMkBsUlg
+EOcKjvbdGLFTCgmV
+EPCkKvbdZeYGzgiC
+DoCjjvbdwXLaWBVu
+DoCjjvbdelevgMik
+EPDKjvbdkHgMGGOL
+DoCjjvbdcJMjKewY
+EOcLKvbdwzHfGYEr
+DncLKvbdlZTRryGt
+EOcLKvbdfVzwoizs
+EPDKjvbdhzUelRNf
+EPCkKvbdiHKCxvKV
+EOcKjvbdGFjRmhtR
+EPDLKvbdGLEsChNV
+DoDKjvbdYORAXuWU
+DnbjjvbdpstHSSKt
+EObkKvbdegkVqmpg
+EPDLKvbdhyuGMQmf
+EObkKvbdliDtQtqa
+DoCkKvbdfNGXGlik
+DoCkKvbdHfgZyXwg
+DoCjjvbddndsKssr
+EPCjjvbdZMSDsnLm
+EObkKvbdEXxMTstM
+EPDKjvbdJvUecdfi
+DnbkKvbdVUMsekuj
+EPCjjvbdPyNAGsSK
+DoCjjvbdMSWmZuQz
+EObkKvbdBcpBVjNG
+DnbjjvbdezuxdiUX
+EPCjjvbdBdQAvJlf
+DncKjvbdOTUWHFVQ
+DoDKjvbdaSGDIUFk
+EOcKjvbdUGzmlWvF
+EOcLKvbdjlakydfo
+DoCkKvbdWSOXaeLc
+DoDKjvbdznpRFDLx
+DoCkKvbdwtldpxlO
+DoDLKvbdGdLVjBjK
+EObjjvbdmttykKSG
+DoDKjvbdZjShQGaf
+DoDKjvbdrDdhomvB
+EPDLKvbdiUyeXSVC
+DncKjvbdIsYaSmXl
+DnbjjvbdVhXvYHYz
+EPDKjvbdwzHfGXdr
+EOcKjvbdxsOJMqbH
+DoCjjvbdehKuqmqH
+EPCjjvbdZdxGzhJC
+EOcKjvbdsCGMlHLZ
+DoCjjvbdOEcshhkE
+DoCjjvbdEzsqElDJ
+DncLKvbdURRPVVIN
+EPCkKvbdZoOJFEzK
+DnbjjvbdBiKajhfK
+EOcLKvbdbUafwkTh
+EOcLKvbdVZHszKoO
+DnbkKvbdGKdsDIMu
+DnbkKvbddoFSkUUS
+DnbjjvbdPxmAGrqj
+EPCjjvbdKNADzHVB
+EPCjjvbdcyxpXxqC
+DnbkKvbdLBLGmBxR
+EPDKjvbdFWYopNJe
+EPCkKvbdcJNKKewY
+DoCjjvbdGLErcHmV
+EPCjjvbdWXIxWDdg
+DnbkKvbdQvmcbkhD
+EOcLKvbdbVCGwjtI
+DoCjjvbdmgFYMmfy
+EPDLKvbdQdDApRES
+DnbkKvbdWWhwvEFH
+DnbjjvbdxZhFexFS
+EPCkKvbdCIjakJGK
+EPCkKvbdKQyeOfOF
+DncKjvbdEObjkXDE
+DnbjjvbdNGcPlotk
+DoCjjvbdVUMtGMVj
+EPDLKvbdelfWgNKL
+DnbkKvbdqwPlDJZR
+DncLKvbdbiMikFwY
+EObkKvbdkNBkzEgP
+DoCkKvbdmuUyjiqf
+DncKjvbddneSjtTr
+EPCkKvbdRkZFtgLT
+EObkKvbdRjyGUgLT
+EPCkKvbdKaKgMaxR
+DnbkKvbdZMRdTnMN
+EPCkKvbdqZOhGpcx
+EPCkKvbdxwhjBozL
+DncKjvbdGckViajK
+EPCkKvbdiifHilxS
+EOcLKvbdqUUGrRjt
+EPCjjvbdbhljLGWx
+DnbkKvbdhgKCxujV
+DoDLKvbdJSyAsNXl
+DoDLKvbdjgflFenL
+EPCkKvbdMJBlQxAS
+DncLKvbdUMVoAvPJ
+DoCkKvbdkCkjpgVH
+EPDKjvbdqGEEsvAh
+EObkKvbdmRxuZrci
+EObjjvbdNdctIhjd
+EPCkKvbdCSaDTevr
+EPCjjvbdRDcAopcr
+EObkKvbdwtmEpyMO
+EOcKjvbdqZPHfqDx
+EOcLKvbdaNKbStmH
+EOcLKvbdaSFcHsfL
+DnbkKvbdRosgJecw
+EObkKvbdkySrSyGt
+EOcLKvbdwuMdqYkn
+EPCjjvbdrDdhonWB
+EPCkKvbdiBoDEwRR
+EPCkKvbdEztQdlCi
+EObkKvbdFyUuBEXb
+EPDKjvbdOAIsUJrA
+EPDKjvbdKCicRKCx
+EObjjvbdSZihSbvA
+DncLKvbdvAdYsPEh
+DncKjvbdySnImSCH
+EObkKvbdiVZeXRtb
+EOcKjvbdsCFllHLZ
+EPDKjvbdZeXfzgiC
+DnbjjvbdMpXpvNgT
+DoDLKvbdsCFllHKy
+DoCkKvbdqYoHfpdY
+DnbjjvbdRzKHrbvA
+EOcKjvbdNHComPtk
+EOcLKvbdCJLBjiGK
+EPDLKvbdsZlPsAhO
+DnbkKvbdemFvgMik
+DoCjjvbdFyUuBDwb
+DnbjjvbdrafMlGkZ
+DncKjvbddZyPxYpb
+EObjjvbdxZhGFwdr
+EPCkKvbdEXwlTssl
+DnbkKvbdANIYrvyx
+EObjjvbddePRawCj
+EPDKjvbdyNsIXrhc
+EPCkKvbdhkeEOVDZ
+DoDLKvbdAMgxrwZx
+EPDLKvbdsQWPJbvG
+DoCkKvbdkVvmcbXw
+EPDKjvbdJYTbIMQp
+DncLKvbdBsAcTewS
+DncLKvbdxrnJNRag
+EOcLKvbdmSYtzSdJ
+EObkKvbdqdFJQNua
+DoCjjvbdZyEKOCkr
+DoCkKvbdZLrEUOLm
+EPCkKvbdRNXaxnUz
+EPDLKvbdnUuZjjRf
+EObkKvbdmbKXYOmu
+DnbkKvbdlZTSTYgU
+EPDKjvbdGYuUaDxC
+DncLKvbdFyVVAcxC
+DoDKjvbdEvZPpMjF
+EPDLKvbdSwjlNzjx
+EPCjjvbdbKkeoNcA
+DoCkKvbdMfcQMotk
+DnbkKvbdyTNiNRbH
+DncLKvbdFWYpQMjF
+EPCkKvbdEvYopMjF
+DncKjvbdeKJrWUzn
+EOcKjvbdpssfrSLU
+EObjjvbdKCjDRJbx
+DnbkKvbdeUAUATMv
+EPDLKvbdjKGIJlxS
+DnbkKvbdpssfqrLU
+EPDKjvbdqZPHgQdY
+EPDLKvbdeAURNXif
+DoCjjvbdypoMhiwA
+EPDLKvbdGYtuAdXb
+EObkKvbdRaceLiYk
+DoCjjvbdXsMBNTnx
+EOcLKvbdKCjCqKCx
+DoCjjvbdYSlAmUPY
+EPDLKvbdpstGrSKt
+EPDKjvbdhtyeXRuC
+EObjjvbdtlYXBUBX
+EObjjvbdRMxByNtz
+EObjjvbdhanbeWqR
+EOcKjvbdpyPIHQcx
+EPDLKvbdrRtjnLBN
+DoDKjvbdNQYQvNgT
+DnbjjvbdbsDKsdJa
+DnbjjvbdDxYMTssl
+EPDLKvbdnCKWxOmu
+DncKjvbdILazmwQk
+DoDKjvbdhgJcYuiu
+DoCjjvbdlYrrSyHU
+EOcKjvbdVUNUFkvK
+EObjjvbdRyjHrbvA
+DoDLKvbdDnbkKvbd
+EOcKjvbdaNKbStmH
+DnbkKvbdjblLRGtg
+DncKjvbdxUleQyLn
+EPDKjvbdLGFhBaQu
+EObkKvbdqmZiyLgi
+DoCjjvbdJuuGEFGi
+EPDKjvbdqmZixlIJ
+DoCjjvbdXnRAYVVt
+EOcLKvbdWIYVxGxz
+EPCkKvbdxZgfGYEr
+EPDKjvbdfNGWfmKL
+EPDKjvbdbrbjscjB
+DoDKjvbdsPunjCvG
+DoDKjvbdziuQQDsU
+DoDLKvbdbhlijfWx
+EPCkKvbdhgKCyWKV
+EPDLKvbdGLEsCgmV
+EOcKjvbdmIcspuSB
+EPDKjvbdIwsbILqQ
+DoDLKvbdpedEsvBI
+DncLKvbdsPunjDVf
+DncLKvbdIxTbHkqQ
+DncLKvbdcSbkTdJa
+DncKjvbdUWLpJsaR
+DnbkKvbdsQVnjCvG
+EPDKjvbdyXiJapZk
+EPCkKvbdrzLosAgn
+DncLKvbdNsTugEuQ
+DoDLKvbdrykoraHn
+EObjjvbduaDySoFI
+DncKjvbdZHWdAOri
+EPCjjvbdlqxtysEJ
+DnbkKvbdOSsvHEtp
+DoDKjvbdRotGjGDw
+DoDKjvbdYfvdAOsJ
+DoCkKvbdBhjajiGK
+EObjjvbdCgLegAzc
+DoDLKvbdhtyeWrVC
+EOcKjvbdzitoocrt
+EOcKjvbdNVTSKmAX
+EPCjjvbdVYgsyjnn
+EObkKvbdliEUQuRa
+DoCkKvbdqFceUWAh
+EPDKjvbdIsZAsMxM
+DnbkKvbdUVlPjUBR
+DoDKjvbdbUafwjsh
+EObjjvbdQlxCZOUz
+DoCkKvbdQvnEDLhD
+EOcKjvbdUVlQKUBR
+EPDKjvbdehKvRnQg
+DoDLKvbdxmsIYTIc
+EObjjvbdsCGNLfkZ
+EObjjvbdmSYtzSdJ
+DoCjjvbdiMEcnVDZ
+EPCjjvbdypnlhiwA
+DoCjjvbdRyihTDWA
+DoCjjvbdZoOJEdzK
+DoCjjvbdJpzEoGOF
+DoCkKvbdYpmEiMeR
+EPCkKvbdbhljKfWx
+EPDLKvbdqYnggQcx
+EOcLKvbdwjwEHzyf
+EPCjjvbdLFegbAqV
+DoCjjvbdMoxQvNgT
+EPCjjvbdZsiIyETO
+DoDLKvbdZQmFImEq
+DnbjjvbdYkrDtOMN
+EPCjjvbdjggMGGOL
+DncLKvbdDwwlTstM
+EOcKjvbdCWzciFQW
+DoCkKvbdyYIiaozL
+DnbkKvbdNsTufeVQ
+DoDKjvbdjlakydfo
+EObjjvbdUGznLvue
+DoCjjvbdeFOqawDK
+DoCjjvbdZnmiFEyj
+EOcKjvbdVBCQrprZ
+EOcLKvbdrovOjCvG
+DncKjvbdrovPKCuf
+EOcLKvbdlYrqryHU
+EObkKvbdcyyPxZQb
+EObjjvbdnBivwnnV
+EObjjvbdjJehJlwr
+DnbkKvbdOFDtJIjd
+DnbjjvbdVAaqSqSZ
+EObkKvbdrXPkbiZR
+DoCjjvbdzaAPGfal
+DncKjvbdZQldhmEq
+EObjjvbdmoyxvLZC
+DnbkKvbdmpZxujyC
+DoCjjvbdvwLaWBWV
+DncLKvbdiVZdvquC
+DnbjjvbderBWzlDP
+EPCjjvbdjbkjpfuH
+DncLKvbdrafNLfkZ
+DncKjvbdrWokbhxq
+EPCkKvbdsZkosBHn
+EOcKjvbdidjfuPAO
+DnbjjvbdNGcPmQUk
+EPCjjvbdrJAKFNOe
+DnbjjvbdTukoitBR
+DnbkKvbdySmhlrCH
+EObkKvbdrXPkcIxq
+EOcLKvbdFejSOItR
+EObkKvbdmgExMnGy
+EPDKjvbdqrVLOLBN
+DoDKjvbdLAkHNCYR
+EObkKvbdVrOXbEkc
+DnbjjvbdEXwlUTsl
+EPCkKvbdyXhjBpZk
+EObkKvbdiifHjMxS
+EOcKjvbdEKHiuxKA
+EObkKvbdZLqdTmlN
+EObkKvbdWRnXaeLc
+DnbjjvbdWSNwaeMD
+DnbjjvbdfNGWgNKL
+DoDKjvbdoAKztIDn
+DncLKvbdmaivxOmu
+DnbjjvbdZLqcsnMN
+EObjjvbdcTDKscia
+EPCjjvbdOTTufeUp
+DoDKjvbdGdLVjBjK
+DncKjvbdcJNKLFvx
+EOcLKvbdTYKkmzjx
+EOcKjvbdZRMeImEq
+DoDLKvbdKQyePFnF
+DnbkKvbdNrtWGduQ
+EPCjjvbdatbHXjtI
+EPCjjvbdvwMAuaVu
+EPDLKvbdnQZxvLZC
+EObjjvbdtlYXAsaX
+DnbkKvbduDDVWvPP
+EPDLKvbdqTtGrSKt
+EObjjvbdxnSgwsJD
+EObjjvbdbKkenmcA
+EPCkKvbdFaOqYizm
+EOcKjvbdLGGHbBRV
+DoDLKvbdRzJhTCvA
+EPCjjvbdiMFDmtcZ
+DnbjjvbdWWhwvEEg
+EPCjjvbdJmAEZgVB
+DoCjjvbdmuVZjirG
+DoCjjvbdliEURUqa
+DoDLKvbdnCKWwnnV
+EPDLKvbdhgJbyViu
+DnbkKvbdjggMFfNk
+EObkKvbdEuxopMie
+EPDKjvbdssRsYydc
+DncLKvbdliDsqVRa
+EOcLKvbdLBKflbYR
+DncKjvbdzoPpeClY
+DncKjvbdqFdEsvBI
+DoCjjvbdZMRctOMN
+DncKjvbdDnbkLWcE
+EObkKvbdMfcQNPuL
+DoDKjvbdUWMPjTaR
+DnbjjvbdxmsHwsIc
+EObkKvbdrDdhonWB
+EPCkKvbdhgJcYvJu
+DoCkKvbdlYsSSyHU
+EPCjjvbdNdcsiJLE
+DoDKjvbdhlEcmuCy
+EObjjvbdJTZAsNXl
+EPCjjvbdznpQeClY
+DncLKvbdDxYMTssl
+DoCjjvbdkVwNcbXw
+EOcLKvbdMgDPlpUk
+EObkKvbdXsMAlsnx
+DnbkKvbdiBncEvqR
+EPCjjvbdeFPSCWcK
+DoDKjvbdmuUzKjSG
+EPDKjvbdqrUkNjaN
+DoDKjvbdhyuFlQnG
+EOcKjvbdDigivYKA
+DoDLKvbdJYUCHkqQ
+DncKjvbdACqwiyiQ
+EPDKjvbdEYXkstUM
+DoDLKvbdKDKCpicY
+DncLKvbdCDoaVjNG
+EObkKvbdxZhFexFS
+EPCkKvbdKDJcQjCx
+DoDLKvbdEPCkKwCd
+EPCkKvbdTfzmkwVe
+DnbjjvbduWOYJqTA
+DoCjjvbdcJMijfXY
+EPCkKvbdmaiwYPOV
+EOcKjvbddjJrVtzn
+EObkKvbdpstHSRjt
+EOcKjvbdyXiKCQZk
+DnbkKvbdIsYaSmYM
+DnbjjvbdwtmFQxlO
+DnbkKvbdYpleJMdq
+DoCjjvbdkNBkzFGo
+EOcKjvbdbsCkUEKB
+DoDKjvbdYlRctOMN
+DnbkKvbdjuwOECXw
+EPDKjvbdWRnXaeMD
+DncLKvbdkDLkQgVH
+DoDLKvbdFeiqnJTq
+EOcKjvbdzHYlAMeX
+EPCjjvbdJbjCpjDY
+EPDLKvbdzitopDsU
+DnbkKvbdziuPpDrt
+DncLKvbdySnImSCH
+DnbjjvbdySnImRbH
+DoCjjvbdKjaIWAJy
+DnbjjvbdTqRPUthN
+DoCjjvbdURQntuIN
+EObjjvbdQlxCYmtz
+EPDKjvbdMtsSLNAX
+EObjjvbdJbjDQicY
+DoDKjvbdEPCkKwDE
+EObkKvbdKQydoGNe
+DoDLKvbdVwJXuceH
+EObjjvbdnUtykJrG
+DncLKvbdwMvANEEm
+EPDKjvbdpyPHgQdY
+DnbjjvbdUVkpKUBR
+EOcLKvbdhfjCyVjV
+EPDKjvbddoFTKstS
+EPCkKvbdANHyTXZx
+EPCkKvbdUxhTyjoO
+EObjjvbdkVwNdBxX
+EPDKjvbdDoCjjvbd
+DnbkKvbdWWhwudEg
+DnbkKvbdyTNiMrCH
+DoDLKvbdelewGljL
+DncLKvbdUGznMWue
+DncKjvbdwygfFwdr
+EPCkKvbdJqZePFnF
+DnbjjvbdNsTugEuQ
+DoDKjvbdQcbaPqDr
+DncLKvbdfMevgNJk
+DncLKvbdlrZVZrdJ
+DoCjjvbdFjeTCglu
+DnbjjvbdYqNFImEq
+DoCjjvbdsCGMkfkZ
+DncLKvbdhuZdwSUb
+DoCkKvbdrXPkbiZR
+DoCjjvbdZRMdiMdq
+DoDKjvbdemFvgMjL
+DoCjjvbdygZMANEw
+EOcKjvbdZRMeIldq
+EObkKvbdiHJcZWKV
+DncKjvbdCJKbKiFj
+EObjjvbdzROlhjXA
+DnbjjvbdDoDLKvbd
+EPDLKvbdVYgtZjnn
+EObkKvbdDoCjjwDE
+DnbkKvbdrouoJbuf
+DoCkKvbdyTOImRag
+EPDKjvbdBcpBVilf
+DoCjjvbdCWzdJFQW
+EPCkKvbdbrbjscjB
+EOcLKvbdwkWdHzzG
+EPDKjvbdnGeXlnGy
+EPCkKvbdznpREcLx
+EPCkKvbdZMRcsnLm
+EOcKjvbdJSyArmXl
+DnbkKvbdZMSDtNkm
+EPDKjvbdAMgySvzY
+DoDLKvbdyYJJbPzL
+DoCkKvbdLAjgMaxR
+DoDLKvbdWIXuxGxz
+DoCjjvbdqwQLbiYq
+DnbkKvbdpyPIHQcx
+EOcKjvbdfNGXHNJk
+DncKjvbdqYnhHQdY
+DncKjvbdeEnrBvcK
+EPDKjvbdZjTHpGaf
+DoDLKvbduoTzqLPU
+DnbkKvbdIjEAJofd
+DnbkKvbdxnSgxTJD
+DoDLKvbdXsLaMsnx
+DnbjjvbdaRfDHsek
+DoCkKvbduLwwAtBX
+DnbkKvbdrpWPJcVf
+DoDKjvbdrbFlkgLZ
+DoCkKvbdlqxtyrdJ
+EObkKvbdRyihSbvA
+EObkKvbdWRnYCFLc
+DoCkKvbdOEcshhjd
+DnbkKvbdZjTHpHBf
+DnbjjvbdcyyPwxpb
+DncLKvbdkVvmdCXw
+DncLKvbdcScKtEJa
+DnbjjvbdrSVLOLBN
+EObkKvbdiGjDYvKV
+EPCkKvbdEJgjVwjA
+DnbkKvbdRosgKFdX
+EPDLKvbdcScKtDia
+DoCjjvbdtbcVXVno
+DncKjvbdhgJbyViu
+EPCjjvbdjJehKNYS
+EObkKvbdyOTIYTJD
+DnbkKvbdRaceMJYk
+DoCkKvbdqiAKEmOe
+DoDLKvbdEKHiuwjA
+EObkKvbdxUldpxkn
+EObkKvbdFejRmhtR
+DncLKvbdSBcdlIyL
+EPCkKvbdxZhFexFS
+EObjjvbdwjwEHzzG
+EPCjjvbdmRxtzSdJ
+EPDLKvbdEvYooljF
+DoCkKvbdmgFXlmfy
+DoCjjvbdtkxXBTaX
+EObkKvbdmgExMnHZ
+DncLKvbdjvXODaww
+DoCkKvbdSCEFMIyL
+EPDKjvbdVYhTykOn
+DoDLKvbdNsUVgFUp
+DncKjvbdRXOEClID
+DoDKjvbdnVVZkKSG
+DoDKjvbdWWhxVcdg
+EPCkKvbdwuNFQxlO
+DncLKvbdKeegbBRV
+DncLKvbdUWLpJsaR
+EOcLKvbdNxOuzcmt
+EObjjvbddwzUUSFz
+DoCjjvbdJXtBhMQp
+DoCkKvbdLGFgbBRV
+EOcLKvbdcJMjKewY
+DnbjjvbdxUmEqYkn
+DnbkKvbdjbkjqGtg
+EPCkKvbdIHGzYwwg
+DnbjjvbdrpWOjCvG
+DoDKjvbdZMRctNkm
+DnbkKvbddZyPwxqC
+DoCjjvbdtcDVWuno
+DoCkKvbdJcKDRJcY
+EOcLKvbdmbKWwnnV
+EPDKjvbdcasNSAUN
+EPCkKvbdUaBpsQqy
+EObkKvbdJutedFHJ
+DoDLKvbdBhjakJFj
+DnbkKvbdnUuZjiqf
+EPDKjvbdpxoHgQcx
+DnbjjvbdZjTHofbG
+EObkKvbdkxsSSxgU
+DnbjjvbdWRmwbElD
+DoCkKvbdRkZFuGjs
+EPCkKvbdwNWANDdm
+EObjjvbdTkvPBVni
+DoDKjvbddndrkTtS
+DncLKvbdZtJIxdSn
+EOcLKvbduaDyTOeI
+EOcKjvbdxZgfGXdr
+EOcLKvbdkySrTZGt
+EPDKjvbdVwJXucdg
+EPDLKvbdatagYLUI
+DoCjjvbddZxpYZQb
+EPDKjvbdtunXjRTA
+DoDLKvbdWSOYBeMD
+DoCjjvbdHlBznXRL
+EPDLKvbdcyxpXxpb
+DnbjjvbdAMhYsWzY
+EObjjvbdraemLgKy
+EPDKjvbdJpzFOenF
+DoCjjvbdZnnIeEyj
+DoCjjvbdrWpLbiZR
+EOcKjvbdLqwMytpz
+DncKjvbdKQzEoFme
+EPDKjvbdZRMeJMeR
+DncKjvbdEuxpPlie
+EOcLKvbdFWYpPlie
+EOcLKvbdjblKpgUg
+EOcLKvbdiBnbdwQq
+DoDLKvbdOTTufeVQ
+EPDKjvbdpyOggQdY
+DnbkKvbdGBOqYizm
+EObjjvbdRjxfUfkT
+EPCjjvbdUMVoAuoJ
+DoDLKvbdVwJXvEEg
+EObkKvbdnCKXXoOV
+DoDKjvbdNPxRVmgT
+DncLKvbdZsiIxdSn
+EPDKjvbdjlalZeHP
+DoDLKvbdeFPSBvbj
+DoDKjvbdVqnXbFMD
+DncKjvbdHffyyYYH
+EOcLKvbdBhjbLJFj
+EPDKjvbdJvVGEFHJ
+EOcKjvbdgQBzvdYI
+EPDLKvbdpyOggRDx
+EObjjvbdKQyeOfNe
+EPCjjvbdtcCtwVno
+EPCjjvbdQvmdClHc
+DnbkKvbdyXiKBoyk
+DncKjvbdqTsgSSLU
+EObjjvbdyNrgxShc
+DnbjjvbdRkZFuGjs
+EObjjvbdYfvdAOri
+DoDKjvbdkMbMZeGo
+EPDLKvbdCIjbLIej
+DoDKjvbdHffyxwwg
+EPCkKvbdGdLVibJj
+DoCkKvbdaaVdepQX
+DnbkKvbdSQUGifDw
+EPCkKvbdqYngfpdY
+DnbkKvbdxUleQyLn
+DoCjjvbdqlyixkgi
+EPCkKvbdjgfkfGNk
+EObjjvbdeFOqavbj
+DoDLKvbdYkrDtNlN
+DoCkKvbdjhGlFenL
+EPCjjvbdijFhJmXr
+EObjjvbdnGeYMmfy
+EOcLKvbdbhmJjfXY
+EOcLKvbdLBKfmCYR
+DncLKvbdJSxaSmXl
+EPCjjvbdsQVnicWG
+DoDKjvbdjhHLfFnL
+EObkKvbdjuwOEBww
+DoCjjvbdiBncEvpq
+EOcLKvbduLxWaUAw
+DncLKvbdhuZdwRtb
+EOcKjvbdjvWnECXw
+EObkKvbdZeYGzghb
+DoDLKvbdNQYQumgT
+DoDKjvbdJpydoFnF
+EPCkKvbdRjyFuGkT
+DnbjjvbdraelkgKy
+EObjjvbdfNGXHMjL
+DoDLKvbduWNwiqTA
+DncKjvbdnVUzLJrG
+DoDLKvbdehKvSOQg
+EPDLKvbdwtmFRYkn
+DoDKjvbdKfFgaaQu
+DncKjvbdCTBDTfXS
+EObjjvbdDoCjjwCd
+EPCjjvbdYTMAmUOx
+EOcKjvbdiMFDnVCy
+EObkKvbdjlalZeHP
+DnbjjvbdCJLCLIfK
+DoDLKvbdZMRdUNkm
+DnbjjvbdURRPVUgm
+EObjjvbdJcJbpibx
+EObkKvbdrWpMDJZR
+EObjjvbdjuwNdBxX
+EPCjjvbdbBVdfQQX
+EPCjjvbdKRZeOfOF
+DoCkKvbdKDKCqKCx
+DoCjjvbdkVvmdBxX
+EPDKjvbdvAdYroEh
+EOcLKvbdtcCuXWPP
+EPCjjvbdczZQXxpb
+DncKjvbdUxhUZkPO
+EObjjvbdlrYtysEJ
+DncLKvbdcScLUDia
+EPDKjvbdBsAbsevr
+DoDLKvbdqTtGqrLU
+DoDKjvbdSCEFLiYk
+EPCjjvbdRWmccLgc
+DncLKvbdNQYQunGs
+EObkKvbdmbKXYPNu
+EPCjjvbdfMewGmKL
+EObjjvbdzROmIiwA
+DnbkKvbdliETptqa
+EPDKjvbdHlBznWpk
+DoCkKvbdUaBpsQqy
+DoCkKvbdWSOYCFMD
+DoDLKvbdxmrhYTIc
+DncLKvbdLAkGlbYR
+DncKjvbdlhctRUqa
+DoCjjvbduDCtwVno
+DnbkKvbdIjEAKQHE
+DnbjjvbdiLddNuCy
+EPDKjvbdEXwktUTl
+EPCjjvbdyNrgwsJD
+EObkKvbdnPzYujxb
+EPDKjvbdznoqEcMY
+EPDKjvbdZRNEhleR
+DoCjjvbdGQATXHFy
+EPCjjvbdyqPNIiwA
+EOcKjvbdkxrrTYgU
+EOcKjvbdcImKLFvx
+DoCkKvbduoTzpkPU
+EPCjjvbdJXtCIMQp
+EOcKjvbdrpVoJbvG
+DncLKvbdqZPIHRDx
+DnbjjvbdTAFJHand
+EOcKjvbdtcCuWuno
+DncLKvbdfIKurNqH
+DncKjvbdLrWmZtpz
+DoDLKvbdMtsRjmAX
+EObjjvbdLGGHbBRV
+EObkKvbdCWzchePv
+EOcKjvbdZxcjODMS
+EObkKvbdzaAPGgBl
+DoDLKvbdKVtecdgJ
+DnbjjvbdHDjvJbJj
+EPCjjvbdLiCLqYAS
+EPDLKvbdFVxpPmKF
+DoDLKvbdZisIPgBf
+DncLKvbdTppoUtgm
+DnbjjvbdpyPIGpdY
+DoDLKvbdEztRElCi
+DncLKvbdHgGzZYYH
+DnbjjvbdZLqctOMN
+DnbkKvbdqTtGqqkU
+DnbjjvbdiMEcnVCy
+EPDKjvbdvBDxrneI
+DoDKjvbdemGXHNJk
+DoDKjvbdhficYvKV
+EObjjvbdegkWSOQg
+DoDLKvbdOFDtIiKd
+EPCjjvbdBdQAuimG
+DoCjjvbdpyPHgREY
+DncKjvbdJXsbHkpp
+DoDKjvbdRbEElIxk
+DoDKjvbdsQWPJcWG
+EObkKvbdsCGNLfkZ
+EOcLKvbdzaAPGgCM
+EObkKvbdzjUoodSt
+DnbkKvbdemFvgMjL
+DnbkKvbdWWhxVcdg
+DncLKvbdxrmiMqag
+EPCkKvbdMSWlytpz
+EObjjvbdwNWAMdFN
+EPDLKvbdlrYtzTEJ
+DnbjjvbdVqnYBeLc
+DncKjvbdnHEwmOGy
+DnbjjvbdtbbuWvPP
+DncKjvbdmIcspuSB
+EObkKvbdEOcKkXCd
+EOcKjvbdDncKkXCd
+EPDLKvbduaDxrndh
+DoCjjvbdOFDshhkE
+DnbkKvbdRaceLhyL
+EPCkKvbdZshhyDrn
+DoCjjvbdCSaDTfWr
+EOcKjvbdqUTfrSLU
+EPDLKvbdtTRryZdc
+DoDLKvbdkyTRsZGt
+EPDKjvbdyqPNIjXA
+DoCkKvbdNUrrKmAX
+DoCjjvbdSCDeMIxk
+EObkKvbdkMbLzEgP
+DncKjvbdEvZPpMie
+DoCkKvbdyYIibQZk
+EObkKvbdNPxQumfs
+EOcLKvbdDncKjvbd
+EPCkKvbdozmcjxPA
+EPDKjvbdCIkCLIfK
+DncKjvbdcyxoxZRC
+DoCkKvbdeOdrkUUS
+DoCjjvbdhzVFlQnG
+EObjjvbdOFETiJLE
+DncKjvbdhyuGLqNf
+EObkKvbdRWmdClID
+DoCjjvbdFpATWgFy
+DnbkKvbdlqxtysDi
+EObjjvbdqmZjYkhJ
+DoDKjvbdZyDjODMS
+DoCjjvbdEJhJvYKA
+EOcKjvbdqTsgRrLU
+EOcKjvbdZsiIxcrn
+EObkKvbdIHGzZYYH
+EPDKjvbdHgGyxxXg
+EObkKvbdxmrgwriD
+EPCkKvbdxrnJNSBg
+DnbkKvbdjhGkefOL
+EPCjjvbdKQydoGNe
+EOcKjvbdqvpMDJZR
+EObjjvbdQdDBQQdS
+DoDKjvbdSKxfVHKs
+DoDKjvbdbLLeoODA
+DoDLKvbdBsAcUGWr
+DoCjjvbdRzKHrbvA
+EObjjvbdfMfXGljL
+EObkKvbddeOrCWbj
+DoDKjvbddjJrVtzn
+DoDLKvbdhtydvqtb
+DnbjjvbdRNXayOUz
+EPDLKvbdRjyFtgKs
+EObkKvbdsPuoKCvG
+EPCkKvbdYqNEiNFR
+DncKjvbdUxgsyjnn
+EPCjjvbdZRMdhldq
+DoDLKvbdEJhKWXjA
+DoCkKvbdQwODblID
+EPCkKvbdssRrxzFD
+DnbjjvbdZxdKOCkr
+EObjjvbduCcUwVno
+EOcKjvbdmuUzLKRf
+EPCjjvbdfpBzvcwh
+DnbjjvbdMowpvNfs
+EPDKjvbdGLErcHmV
+EPDLKvbdZoOIeEyj
+DncLKvbdSLZGUgKs
+DncLKvbdlqyUzTEJ
+EPCjjvbddePRawDK
+DncKjvbdHEKvKCJj
+DoDKjvbdeEnqavcK
+DoDLKvbdtSrTYzFD
+EPDLKvbdxUmFQxlO
+DnbjjvbdLLBIWAJy
+EOcLKvbdMowqWNfs
+EPDKjvbdptUGrSKt
+DoDLKvbdHEKvKCKK
+EPCjjvbdJcJbpjDY
+DnbjjvbdMuTRkNAX
+DnbkKvbdEzspdlDJ
+DncLKvbdVUMsekvK
+EPDKjvbdOTUVgEtp
+DncKjvbdAMgySwZx
+DoCkKvbdwtmFRYkn
+EObjjvbdIjEAKPgE
+EPDKjvbdRpTfjGEX
+DncKjvbdFjeSbglu
+EObkKvbdjFLGtoAO
+DoCkKvbduWOYJqTA
+EPCkKvbdVAapsQrZ
+DnbjjvbdVwJXudEg
+DoDLKvbdUtMsfLvK
+EPCjjvbdHELVjBij
+DncKjvbdRWnECkhD
+EPDLKvbdZsiJZDsO
+DncLKvbdnPzZWLYb
+EPCjjvbdznoqEcMY
+EOcKjvbdzoQQeDMY
+DnbjjvbdznpQdbkx
+EPDKjvbdeYZtTrFz
+DoCkKvbdkySrTZHU
+DncKjvbdCSaDUGXS
+DoCkKvbdcJNJjfXY
+EOcLKvbdCEQAvJlf
+EPDKjvbdyzdmqhJI
+DncLKvbdNPwpvNgT
+DoDKjvbdqmZixkgi
+EOcKjvbdVYhUZkPO
+EObkKvbdhgJbxvJu
+DoDKjvbdUQqPUuHm
+DncLKvbdqvolChyR
+EPCkKvbdEXxMTssl
+DnbkKvbdHgGzYwxH
+DoDLKvbdIidAJpGd
+DnbkKvbdZLqdUOMN
+DnbkKvbdGckViaij
+DoCkKvbdFVxopNJe
+EOcLKvbdRbEFMIyL
+EObkKvbdLAjflawq
+EObjjvbdziuPodTU
+EPDLKvbdQwNdCkhD
+EPCjjvbdZxdJmcLr
+EPDLKvbdxrmhlqag
+DoCkKvbdSPsgJfDw
+EPCjjvbdkDLjpgUg
+DnbjjvbdtbcUwWOo
+DnbkKvbdWIXuxHYz
+EObjjvbdEvYpQMie
+DoDLKvbdIHGzZXxH
+EPDLKvbdVYgszKoO
+DncKjvbdhancEvpq
+EPCjjvbdcJNKKewY
+EPDKjvbdWWhwvEEg
+EOcLKvbdvAdYsOdh
+EObkKvbdcyyPwxqC
+EObjjvbdSPtGifDw
+EOcLKvbdkMalZeHP
+EPDKjvbdYlRctNlN
+DoDLKvbdKWVGEFGi
+DncLKvbdMgColouL
+DncLKvbdhbPCeXRR
+DncLKvbdDwxMTstM
+DoDKjvbdvAcySndh
+EObkKvbdXGYytAPT
+DoCjjvbdmuVZjjRf
+EOcLKvbdDGlFgAzc
+DoDKjvbdiBncFXRR
+DoDKjvbdkaMnmALA
+DncKjvbdVBCQrqSZ
+DoCkKvbdVviYWEFH
+EObkKvbdAMhZSwZx
+DoDLKvbdeAUQlwjG
+DoDLKvbdZxcjODMS
+EOcLKvbdrpWPKDVf
+EPCkKvbdWRnYCFLc
+DnbkKvbdKeehBaRV
+DoDKjvbdMSXMzUpz
+EOcKjvbdRkZGVGjs
+DoDLKvbdFkFScIMu
+DoCjjvbdZjTHogBf
+DnbkKvbdnBivwnmu
+EOcKjvbdCTAcTevr
+EOcKjvbdVviXvDeH
+DoDLKvbdliDsptqa
+EPDLKvbdZirgpGaf
+EPCjjvbdaRfChUFk
+EPCjjvbdkClKqGtg
+DoCjjvbdKQyeOfOF
+EPCkKvbdqvpLbiYq
+DnbjjvbdCTBDTfXS
+DoCjjvbdOEctIhkE
+EObjjvbdbVCHXkUI
+DncKjvbdxnTIXrhc
+DnbjjvbdezvYdhsw
+EPCjjvbdDwwkstUM
+EPCkKvbdaaVdepQX
+DoDLKvbdjlbMZeHP
+DoDLKvbdqAiFAXHd
+EPDLKvbdGLEsCglu
+EPCjjvbdZyDinClS
+EPCkKvbdSLYeuGkT
+EPDKjvbdwyhGFweS
+EOcLKvbdjJfIKNYS
+DoCjjvbddeOrCXCj
+DoDKjvbdkxrqsZHU
+EOcKjvbdGYuVBEYC
+DncKjvbdHkazmvqL
+DnbkKvbdZsiIxdSn
+EObkKvbdhanbeXQq
+EOcLKvbdMpXqWNfs
+DnbkKvbdEztQdkcJ
+EPCjjvbdDjHjWXjA
+EOcKjvbdNQYQvNgT
+EPCkKvbdNHCpNPtk
+DoCjjvbdbsCkUDjB
+EObkKvbdOStWGeUp
+EOcKjvbdVqnYBdlD
+DoCkKvbdvlvANDeN
+DoDKjvbdnQZyWKyC
+EOcLKvbdkyTRsYft
+EOcKjvbdnVUyjiqf
+EPCjjvbdXnRAXtut
+EPDKjvbddZxpXxpb
+EPDLKvbdfHjvSOQg
+DncKjvbdXsMBNTnx
+DncKjvbdEARiMzXX
+EPCjjvbdOStVgEuQ
+DnbjjvbdHELWKCKK
+EOcLKvbdehLWSOQg
+DncLKvbdYkqctOLm
+DoDLKvbdxsOJMqbH
+DoCjjvbdzGyMANFX
+DoCjjvbdSCEElJZL
+DoDKjvbdRkYeuHLT
+EOcKjvbdXsLaMsnx
+DnbjjvbdePFSkUUS
+DncKjvbdGZUuAdXb
+EOcLKvbdlZSqsZGt
+DncKjvbdiCPCdwRR
+EObjjvbdjvXOEBxX
+EPDLKvbdRXOEDMHc
+EPCkKvbdZisIQHCG
+EPDKjvbdjKGIKNYS
+DncLKvbdWWiYVdEg
+DnbjjvbdaMkBruNH
+EOcLKvbdOFEThiKd
+DoCkKvbdVZHszLPO
+DoDKjvbdiHJcYvJu
+EPCkKvbdwuNFRZLn
+EObkKvbdJqZdoGNe
+EOcKjvbddndsLUUS
+EOcLKvbdBraCtGWr
+DncLKvbdxrnJNRbH
+DoDLKvbdCWzciFPv
+EPCkKvbdtlXvaUAw
+DoCjjvbdMfbomQUk
+DoCjjvbdfoazwDxI
+DoCkKvbdauCHXkUI
+DnbjjvbdaogHELzd
+EPCjjvbdTulPisaR
+EPCkKvbdOSsvHEtp
+DoDLKvbdTkuoBVni
+EPDKjvbdVBBqTRSZ
+DnbjjvbdEJgivYKA
+DncKjvbdJXtBgkqQ
+DnbkKvbdbsCjsdJa
+EPCjjvbdhlEcnUby
+EObjjvbdssSSyZdc
+EObkKvbdhgKCyWJu
+EObkKvbddeOqbWcK
+DoCkKvbdqvpLcJYq
+EPDKjvbdxZgefXeS
+EOcLKvbdkVwOEBww
+EPDKjvbdemFvfljL
+EPCjjvbdFkErcIMu
+EOcKjvbdZyEKNcMS
+EPDKjvbdqlzJxlHi
+EPCjjvbdmbJwXnmu
+EOcLKvbdcTDLTcia
+DoCkKvbdyzdmqhJI
+DnbjjvbdGdLWKBij
+DoDKjvbduaDxsPEh
+DoDKjvbdZshhxdTO
+DncKjvbdptUGqrKt
+EPCjjvbdJvVFceGi
+EOcKjvbdddoRawDK
+DoCkKvbdfMfXHMik
+EObjjvbdVAbRSpqy
+EObkKvbddZyPxYpb
+DnbkKvbdVYgszKnn
+DoCkKvbdZMRdUNkm
+EObjjvbdTvMPitBR
+EObkKvbdIxTaglQp
+EObkKvbdGGKSNiUR
+DoCkKvbdGBOpyJzm
+EPCjjvbdqrUjmjaN
+DncKjvbdIMBzmvpk
+EPCjjvbdcyxoxYpb
+EOcKjvbdmIcsqUrB
+DoCkKvbdqvolChyR
+EPCjjvbdkHgMGGOL
+EPDLKvbdpaIeAWgd
+DncLKvbdqvokcIxq
+EOcKjvbdZsiJYcrn
+EObkKvbdyYJKBpZk
+DoCkKvbdKDKDQicY
+EObkKvbdlhdTptqa
+EObkKvbdyXhjBpZk
+EObkKvbdKNAEZfta
+EOcLKvbdRyihTCvA
+DncLKvbdtcCtwVno
+DnbjjvbdVZITykOn
+DoCjjvbdJSyArlwl
+EPDKjvbdDxYLtUUM
+EPDKjvbdvlvANEFN
+DoDKjvbdrykpTAgn
+DnbjjvbdeYZtUSFz
+DoDKjvbdzjVQQETU
+EObjjvbdiHJbyVjV
+DoCjjvbdcScLTcjB
+DncLKvbdhaoDEwQq
+DnbkKvbdQlwbZNtz
+EPCjjvbdEARiMzXX
+EPCjjvbdGFjSOIsq
+DoDKjvbdrXPlChxq
+DoDLKvbdYqMeImEq
+DoDKjvbdOFETiJKd
+EPCjjvbdCTBDUFvr
+DoCkKvbdZoOIdeZj
+DncLKvbdHgHZyYXg
+EOcLKvbdCSaCsevr
+DoCjjvbdsQWOjCuf
+DoDKjvbdKWUfDeGi
+EOcKjvbdzitpPcrt
+EPDKjvbdZyDimcMS
+EPCjjvbdBcpAuilf
+EOcKjvbdqwQMCiYq
+EOcLKvbdsrrTZZdc
+EObjjvbdSQUHKGEX
+DoDLKvbdcyxoxZRC
+EObkKvbdWXJYWEFH
+DnbkKvbdhgKDYuiu
+DoDKjvbdrSVLOKaN
+EPCjjvbdMoxQumgT
+EPDKjvbdcbTMrATm
+EPDKjvbdznopdcMY
+DnbjjvbdzdzOzdyp
+EObjjvbdGYuVBEXb
+EPDKjvbdiZtekpnG
+DoDLKvbdvvlAuaVu
+DoDKjvbdEYXkstTl
+EPCjjvbdauCHYKsh
+DoCjjvbdDjIJuwjA
+EObjjvbdkNCLzFGo
+EPDLKvbdiGicZWKV
+EPCkKvbdtlXvaTaX
+DoCkKvbdpyOggQcx
+EObjjvbdtTSSyZdc
+DoDLKvbdiZtelROG
+EOcLKvbdWRnYCFMD
+EPDLKvbdNddUIhjd
+DncLKvbdEObjjvbd
+EPDLKvbdVUNTelVj
+EPCjjvbdVhXvYGxz
+DoCkKvbdfRaWzkbo
+DoCjjvbdRjyGVHKs
+DoCjjvbdSKxfUfkT
+EOcKjvbdaRecITek
+DoCkKvbdEJhKVwjA
+DoDLKvbdwXLaWBVu
+EPDLKvbdLYqJrztf
+DncKjvbdUMVoAuoJ
+DnbjjvbdvmWAMcdm
+EObjjvbdpssfqrKt
+DnbjjvbdhlEcnVDZ
+EOcKjvbdNsUWGeVQ
+EObjjvbdVUNTekuj
+DnbkKvbdVYgsykOn
+EObkKvbdpssgSRjt
+DncKjvbdVZITzLOn
+DoDKjvbdGGJrNiTq
+DoDLKvbdACqwizJQ
+DoDKjvbdIryArmXl
+DoCkKvbdZMRdTmlN
+DnbkKvbdrovPKDVf
+EObkKvbdrounjDWG
+DnbjjvbdCSaDTevr
+DnbjjvbdUyITyjnn
+DnbkKvbdKRZeOfOF
+DoCkKvbdDigiuxKA
+EOcKjvbdxsNhlrCH
+EOcLKvbdDjHiuxKA
+DncKjvbdXmqAXtvU
+DnbjjvbdqFdFTvAh
+EObkKvbdxrmhmSBg
+DoCjjvbdIidAKPfd
+EOcKjvbdKQydoGOF
+DnbjjvbdlqyUzSdJ
+EPDKjvbdtvOYKQsA
+EPCkKvbdcIljLFvx
+DoCjjvbdYqNEhldq
+EPDKjvbdczYpYZRC
+DoDLKvbdiBoCeXQq
+EOcLKvbdiCPDFXRR
+EPDLKvbdZisHofaf
+EPDKjvbdmIdURVSB
+EPDKjvbdZRNFIldq
+DoDKjvbdJpydoFme
+DoDLKvbdWWhwudEg
+DncLKvbdDnbjjwDE
+DncKjvbdqTsfqqkU
+DncKjvbdKDKDRKDY
+DoDKjvbdTulQJsaR
+DoCjjvbdSBdFMIyL
+DncLKvbdqTtHSSKt
+EOcKjvbdBcoaVjMf
+EObjjvbdiiehKNXr
+EObjjvbdCWzciFQW
+EPDLKvbdWSNwadlD
+EPDKjvbdKVuGEFHJ
+DoCkKvbdZMRdUNlN
+EPDKjvbdZRMdiMdq
+EPCkKvbdxUmEpyMO
+DoDLKvbdRkYfVHKs
+EObjjvbdIwtCIMQp
+EPDKjvbdmJDsqUqa
+EPDKjvbdrDeJPmvB
+EOcKjvbdTvMPisaR
+DncKjvbdMtsRjmAX
+DnbjjvbdlqyUysDi
+EPDKjvbdQwNdClID
+DncLKvbdRjxfVGjs
+EObkKvbdauBfxKtI
+DoDLKvbdiZtfLpnG
+DoDKjvbdhancFXRR
+DoDKjvbdREDBQQdS
+EObjjvbdrzMQTBIO
+EOcKjvbdcImKKfXY
+DoDLKvbdijGIKNXr
+DncLKvbdgGMZmfgA
+EPCjjvbdZnmheFZj
+EPDKjvbdmuVZjiqf
+EObjjvbdeFPRawDK
+EPDLKvbdrNZiyLhJ
+EOcKjvbdlhdURUrB
+EPDLKvbdGGJrNhtR
+EOcKjvbdiGibyWKV
+EOcKjvbdQlwbZNtz
+DncLKvbdnVUzKiqf
+EOcKjvbdbsDKscjB
+EPDLKvbdDnbjjvcE
+DoCkKvbdySmhmRag
+DncKjvbdkyTSTYft
+DoDLKvbdEYXkstUM
+EOcKjvbdiHJbyVjV
+EOcKjvbdsQVnicWG
+DoCkKvbdoznDkYPA
+EObkKvbdURQoVVHm
+EPDLKvbdFfKSNiTq
+DnbjjvbdVgxVwgYz
+DnbkKvbdmfeYNOHZ
+DoDKjvbdyqPNIiwA
+EObjjvbdFVyQPlie
+EOcLKvbdGdKvKBij
+EPCjjvbdDwxMUTtM
+DoCkKvbdKVtfEEfi
+DoCkKvbddjKRvUzn
+EObkKvbdliEURVSB
+EPDLKvbdWSNwaeMD
+EOcLKvbdJqZdoFnF
+DnbjjvbdKxqJrzuG
+DnbjjvbdmuUyjjSG
+EPDLKvbdADRxKZhp
+EPCkKvbdiCPDEwRR
+EObjjvbdTXkMNzkY
+DnbjjvbdMgDPlouL
+EPCjjvbdyzeNqghh
+EOcKjvbdmuUyjjSG
+EPDKjvbdDoDLKvcE
+EPDLKvbdNxPVzdNt
+DoDKjvbdBhjbKhfK
+DnbjjvbdZLrETmlN
+DoCkKvbdHffyxwwg
+EOcKjvbdYSlAmUPY
+EPCjjvbdtTSTYzFD
+DoCjjvbdFjeTCgmV
+EObjjvbdNwnuzcnU
+DoDLKvbdSPsfiecw
+DoDKjvbdKVtedFGi
+EObjjvbdUaCQsRRy
+EObkKvbdbsDLUDjB
+EObkKvbdEOcKjvcE
+EPCjjvbdyNsIYShc
+EOcLKvbdbVCGxKsh
+DoDKjvbdlZSqsYft
+DoCjjvbdUslselWK
+DncLKvbdbUbHXkUI
+DnbkKvbdYkqcsmkm
+DncKjvbdXsMAmUOx
+DoDKjvbdJuuFcdgJ
+EOcLKvbdGLFTChNV
+DoCkKvbdaaWEfQQX
+DncKjvbdVqnXbFMD
+EOcKjvbdZyEJnClS
+DoCkKvbdNdctJIjd
+DoDLKvbdmaiwYOmu
+EPCkKvbdmbJvxPOV
+DncLKvbdTqRPUuIN
+EPDLKvbdGGKSNiUR
+EPCjjvbdIwtCIMQp
+EOcKjvbdHDjvJajK
+EOcLKvbdZyEJnDMS
+DnbkKvbdrWpMDJZR
+EOcLKvbdbUagXjtI
+EOcLKvbdLGFgbBRV
+EOcKjvbdqvpMDIxq
+EPDKjvbdOAJSsjSA
+DncKjvbdsrqsYyeD
+DnbjjvbdtkwvaUBX
+DnbjjvbdGQASwGfZ
+EObkKvbdURROtuIN
+EObkKvbdiUydwRtb
+EOcLKvbdqlyixkhJ
+EPCkKvbduaEYroFI
+DoCkKvbdnUtyjiqf
+DoCkKvbdssSTYzFD
+DncLKvbdeATqMwjG
+DnbkKvbdqlyjYlHi
+DncLKvbdTAEhhCOd
+EOcLKvbdpxoIHQdY
+EPDKjvbdEXxLsstM
+DncLKvbdbLLfPNcA
+DoDLKvbdCWzdIeQW
+DnbjjvbdWSNwbElD
+DoDKjvbdGFjSOJUR
+DoCjjvbdmttzKjRf
+EPCjjvbdqmZjZMHi
+DncLKvbddwzUTqez
+EObkKvbdrEFIpOVa
+DnbjjvbduMYWaTaX
+EPDKjvbdTAEiIBoE
+EOcKjvbdVrNwaeMD
+DoCjjvbdSwkMNzjx
+DoDKjvbdZoNheEyj
+EObjjvbdFpASvgGZ
+DnbkKvbdvBDxsPEh
+DoDKjvbdIHGzYxYH
+EOcLKvbdhanbeXQq
+EObkKvbdACqxJyhp
+DoDLKvbdgQBzwDxI
+EObjjvbdOYOuzdNt
+DnbjjvbdRWmdDMHc
+EPCkKvbdePFTLUUS
+DnbkKvbdHlBznWpk
+EPCkKvbdqlyixlIJ
+DnbjjvbdIHHZyYXg
+EObjjvbdBcoaVimG
+EOcLKvbdZnnIddzK
+DnbjjvbdBiLBjhfK
+EPDLKvbdeOeTKtTr
+EObkKvbdYlRcsnLm
+DoDKjvbdnHExNOGy
+DoCkKvbdnCJwXoNu
+EOcKjvbdwWlBWBWV
+DnbjjvbdGYuVAdXb
+EObkKvbdLGGHbBQu
+EPCkKvbdEJgjVxKA
+EObkKvbdlqyVZrdJ
+EObkKvbdaNLBsUmH
+EPCkKvbdGQASwHGZ
+DncLKvbdnBjWwnnV
+DnbjjvbdUslsekuj
+DncLKvbdeATqNYJf
+EOcLKvbdIwtCHlQp
+EOcLKvbdGLErcIMu
+DnbkKvbdjvXOECXw
+EPCkKvbdfSAvzkbo
+DnbjjvbdsCGNMHKy
+DoDLKvbdURQnuVHm
+EObjjvbdQvmdCkgc
+EPCjjvbdSPsgKFcw
+EPDLKvbdYpmEhleR
+EPCjjvbdFjdsDHlu
+EPDLKvbdqdFIpOWB
+EObjjvbdnQZyVkZC
+EPCjjvbdQdCaQRES
+DnbjjvbdADRwiyiQ
+DnbjjvbdiiehKNYS
+DoCkKvbdHkaznWqL
+EObjjvbdmoyxujxb
+EOcLKvbdxxIibQZk
+EObjjvbdsPuoKCvG
+EObjjvbdjcMKpftg
+EOcKjvbdZisHofbG
+DncLKvbdUGznLwWF
+DoDLKvbdFfJqnJUR
+DnbjjvbdsBelkgLZ
+DoCkKvbdrbGNLfkZ
+DncKjvbdeYZssqez
+EPCkKvbdyNsHwsIc
+DnbkKvbdrafMkfjy
+EPCjjvbdZyEJnDMS
+DnbjjvbdFpASwGey
+DnbkKvbdLGGIBaQu
+DncLKvbddiiqutzn
+DncKjvbdWIXuwfxz
+DoCjjvbdNPxRVnHT
+DncKjvbdwygefXeS
+EPDLKvbdmJEUQtrB
+EPCjjvbdQwOECkhD
+DoDLKvbdNGbpMotk
+DncLKvbdRyjIScWA
+DncLKvbdVrOXaeMD
+DncLKvbdQmYBxnUz
+DnbjjvbdVBCRSqSZ
+EPCkKvbdRosfifEX
+EPDLKvbdlYrqrxgU
+EPDLKvbdKVuGDeHJ
+DncLKvbdDncLLWcE
+EOcLKvbdfNGXGmKL
+EOcLKvbdQvmdDMHc
+EOcLKvbdEARiMyvw
+DoCjjvbdnHFXlnGy
+EOcKjvbdhtyeXRtb
+DncKjvbdMgDQNQVL
+EObjjvbdpedFUWBI
+EPDKjvbdkHfkfFnL
+DoDKjvbdrXQMChyR
+EObkKvbdREDAoqES
+DoDKjvbdBdQAvKMf
+DoCkKvbdjvWnDaxX
+DnbkKvbdePEsKstS
+EPDKjvbdyOTHwsJD
+DnbkKvbdrSVKnKaN
+EPCkKvbdZirgpHBf
+DoCkKvbdsQVnjDVf
+DnbjjvbdGLEsCgmV
+EPDLKvbdelewHMjL
+EObjjvbdjlbMZeGo
+DoDLKvbdxrmhlrCH
+DoCkKvbdczZQXyQb
+EObjjvbdRDcBQRDr
+DoCjjvbdxLXEHzyf
+DoCkKvbdkySrTZGt
+DoCjjvbdDoDKjwCd
+EObkKvbdKWVGEEfi
+DoDKjvbdTqQoUuIN
+EObjjvbdZRNEiMeR
+DoDKjvbdxUmEpyMO
+EPDLKvbdxxJJaozL
+EObkKvbdraemLfkZ
+EPCjjvbdbiNKLFvx
+DnbjjvbdZjSgpHCG
+EObjjvbdqBIeAXHd
+EObjjvbdVUNUGMWK
+EPDKjvbdliDsqUqa
+EOcLKvbdxZgfGYFS
+DnbjjvbdYpmFJMdq
+EPCkKvbdcTCjtEKB
+DncLKvbdVUMtFlVj
+EPDKjvbdcIlijevx
+DoCjjvbdpstHSSKt
+EOcKjvbdLAjgMaxR
+DoDKjvbdHkaznXQk
+EPDLKvbdrovPJcVf
+EObjjvbdjblLRHVH
+EPCkKvbdfSAvzlCo
+EPDLKvbdkHfkefOL
+DoCjjvbdbiNKKfXY
+EPDLKvbdjJfHilwr
+EOcKjvbdxVMeQxkn
+DncKjvbdqlzJyMIJ
+DoDLKvbdffMZnGgA
+EPDLKvbdrpWPJcVf
+DnbkKvbdNsTvGeVQ
+DncKjvbdZshiZETO
+DoCjjvbdWRnXaeLc
+EPDLKvbdUaCRTQqy
+EOcKjvbdKDKDQjCx
+EPCkKvbdLKaIWAJy
+DoDKjvbdjblKpftg
+EPDKjvbdfHkWSNqH
+EObjjvbdSCEEkiZL
+EPDKjvbdcyxpYZQb
+EPDLKvbdVUMtFkuj
+DnbjjvbdVBCQrprZ
+EObjjvbddoEsLUUS
+DnbkKvbdiHKDZVjV
+EOcKjvbdpyPHgRDx
+EObjjvbdYpleJNFR
+DncLKvbdrDdhpOWB
+DncLKvbdcbSmSAUN
+DncLKvbdQwODcLgc
+EPCjjvbdKVuFcdgJ
+EPDLKvbdJvUecdfi
+EObkKvbddjJqvUzn
+EPCkKvbdLrXNZuQz
+DnbkKvbdDihJuxKA
+DoCjjvbdegkWSORH
+DncKjvbdFyVUaEYC
+DoDLKvbdNHDPlpVL
+DoDLKvbddneTKtUS
+DoCjjvbdEARhlywX
+DncKjvbdmbJwYPOV
+DnbjjvbddeOrBvbj
+EPDKjvbdAMhZTXZx
+DnbjjvbdULuoBVoJ
+DoCkKvbdMfbomQVL
+EObjjvbdyTNhlqbH
+EPDLKvbdcyxowxpb
+DoCkKvbdEPDLLXCd
+DncLKvbdSCEFLiZL
+DnbjjvbdBiLCKiFj
+EPCjjvbdmgExNNgZ
+EOcLKvbdsPvPKDVf
+DoCkKvbdbKkfOmcA
+DncLKvbdIxTaglRQ
+DnbkKvbdFVyQQNJe
+EPDLKvbdbsCjtEKB
+EPDKjvbdakMFnnDA
+EObjjvbdWWiYVcdg
+DnbkKvbdfSAvzkcP
+EOcLKvbdbKkennDA
+EPCjjvbdTppoVUhN
+EPDLKvbdemGWgMjL
+DnbjjvbdJvUedFHJ
+DoDLKvbdqvokbiZR
+EPCjjvbdZMRctOMN
+DoCjjvbdNPwpunGs
+DoCkKvbdZtJIyDrn
+EPCjjvbdFejRnIsq
+EPDLKvbdZshhxdTO
+DncLKvbdxZhGGXeS
+DoDLKvbdKyRKSztf
+EPDKjvbdCflFgAzc
+EPDKjvbdOEdThiKd
+DoDLKvbdTAFIgaoE
+EObjjvbdEARiNZvw
+EOcLKvbdjhHLefOL
+DncKjvbdbVCHXjtI
+EPDKjvbdeFPRawCj
+DoDLKvbdtcCuWuoP
+DoDLKvbdUVkpJtAq
+EPCjjvbdaSFcHsfL
+EPDKjvbdPxmAGrrK
+EPCkKvbdDjHjWXjA
+DnbkKvbdpssfqrKt
+DoDKjvbdePEsKtTr
+EObkKvbdDwxMUTtM
+DnbkKvbdZRMdiNEq
+EPCjjvbdhuZdvquC
+DoCjjvbdGLEsChMu
+EPDKjvbdRDbaQQdS
+EOcKjvbdEJhJvYKA
+DncKjvbdkxsSSxft
+EObjjvbdKRZdnfOF
+EOcLKvbdZQmFIleR
+DnbkKvbdjcLjpfuH
+DnbkKvbdYzbfSKWZ
+EPDLKvbdbUafxLTh
+EPCjjvbdJuuFcdgJ
+DoCkKvbdJcKCqJcY
+DoCjjvbdSKyGVGkT
+DoCjjvbdemFvflik
+DoCjjvbdvBEYsPEh
+EOcKjvbdCWzdJEov
+DncLKvbdqTsgSSKt
+DnbkKvbdUMVoBWOi
+EPCkKvbdOEcsiIjd
+DncLKvbdaSFbhUFk
+DoCkKvbdhtzEwRuC
+DoCkKvbdiCOcEvqR
+DoCkKvbdfILVqnRH
+DnbkKvbdCJLCKhej
+EPCkKvbdakLeoODA
+DnbkKvbdUaCRTQrZ
+DoDKjvbdRacdkhyL
+EPCjjvbdYNqAXtut
+DncKjvbdwzHfFwdr
+DncLKvbdNrsvGeUp
+EPDKjvbdDoCkKvbd
+EPCjjvbdrafNLfkZ
+EObjjvbdmajXXoOV
+DncLKvbdVAbRTQrZ
+EObkKvbdkySrTZHU
+DoDKjvbdZeXfzghb
+EPDLKvbdiCOcFWpq
+EOcKjvbdUQpnuUhN
+DncLKvbdijGIKMwr
+DncKjvbdHgHZxwwg
+DncLKvbdVTmUFlWK
+DoDKjvbdeYZtUSFz
+EPDKjvbdHffyyYXg
+DncKjvbdXsLaMtOx
+DncKjvbdzitoocrt
+DoDKjvbdhtyeWquC
+EPDKjvbdEuyPpNKF
+DnbkKvbdtvOYKRTA
+DncKjvbdZnnJFEzK
+EPCkKvbdqZPIGpcx
+DnbkKvbdVgxWYGxz
+EPCjjvbdOStWHEuQ
+EObkKvbdNddTiIjd
+DoDKjvbdwXMBWAuu
+EPDLKvbdsPvPKDVf
+DncLKvbdQvnDbkhD
+DncKjvbdEKHjWYKA
+EPCkKvbdCgMFgAzc
+EOcLKvbdQvnDbkgc
+EPCjjvbdDoCkLWbd
+DnbkKvbdKCibpicY
+EOcLKvbdhfibyViu
+EOcLKvbdzQnliJwA
+DncKjvbdEASImZwX
+EPDLKvbdFkFTChNV
+DnbjjvbdEuxoomKF
+EOcKjvbdYqMeJMeR
+DnbjjvbdgQBzvdYI
+DoCjjvbdkxrrSxft
+DnbjjvbdjuwNdCYX
+EOcLKvbdfpBzwEXh
+DoCkKvbdnHFYMmgZ
+EOcKjvbdjlbMZeHP
+DoCkKvbdmttzKjSG
+EPDLKvbdzjUopDsU
+EPDLKvbdsZlPraIO
+EOcLKvbdLBLHMbYR
+EPDLKvbdtbcVXVno
+DoDLKvbdaaVeGQQX
+EPCjjvbdWSOYCEkc
+EObjjvbdxUmFQyMO
+DoDLKvbdRbDdkiZL
+DoCjjvbdhlFDnVCy
+EPDKjvbdcTDKscia
+EPCkKvbdjlbMZeGo
+DncLKvbdCIkCKiGK
+DoCjjvbdrbFmMGkZ
+EObkKvbdQccAoqDr
+DnbjjvbdTqRPVUgm
+EPCkKvbdNrsufeUp
+EOcLKvbdrMyjZLhJ
+EPDLKvbdiifHimXr
+DnbkKvbdpstHSRjt
+EOcKjvbdZtIhxdSn
+DnbkKvbdbhmKLGXY
+DnbkKvbdkxsSSxft
+DoCjjvbdTAFIhBnd
+EObkKvbdUtMtGLvK
+EPCjjvbdpstGrSLU
+DncKjvbdxLXDgzyf
+EOcKjvbdSCDdlIxk
+EObkKvbdOFEUIiLE
+DnbkKvbdjggLefNk
+DncKjvbdliEUQtqa
+EOcLKvbdFjdsDHlu
+DncLKvbdeEnqavcK
+EOcLKvbdnPyyVjyC
+DoDKjvbdliDsptrB
+DoCkKvbdrXQLbiZR
+DncLKvbdFkErbhNV
+DoDKjvbdTqROtthN
+DoCkKvbdYSlAmUOx
+DnbkKvbdKVuGDdgJ
+EOcKjvbdvwLaWAvV
+DoDLKvbdEObjjvbd
+DnbkKvbdwXLaWBVu
+DnbkKvbdmtuZjiqf
+DoDKjvbdegkWRnRH
+DoCkKvbdeXzUUSFz
+DncLKvbdfNGXGmJk
+DoCjjvbdEztQdlCi
+EPCkKvbdEuyQPljF
+EPCjjvbdrEEiQNvB
+DnbkKvbdLqwNZtpz
+EObkKvbdKeegbBQu
+EObkKvbdvBEZSoFI
+DoDLKvbdrXQLbhyR
+DnbkKvbdbKlGPODA
+DncLKvbdnCKXYOnV
+EOcKjvbdjcMKpfuH
+DoCkKvbdQdCaQRES
+EPCkKvbdDncKjwCd
+DoDLKvbdYlSDtNkm
+EObkKvbdmbKXXnmu
+EPCkKvbdjgfkfGOL
+DnbkKvbdZyDjNcMS
+EOcLKvbdkNCLyeHP
+DncLKvbdVUMtGLuj
+EOcKjvbdKVtedFGi
+EPCjjvbdKRZeOenF
+DoCjjvbdUQqPUthN
+EPDKjvbdkMbLydgP
+EObjjvbdVqmxBdlD
+EPDKjvbdjAQGaPgK
+DoCkKvbdTlVnaWPJ
+EPCjjvbdwjvdHzzG
+EObjjvbdBsBCtGWr
+EPCjjvbdwuNEqZMO
+DncLKvbdbrcKtEKB
+EPCkKvbdFyVVAcxC
+EPCkKvbdaSGCgsfL
+EPDKjvbdrylQTBIO
+DncKjvbdfSBWzlCo
+EObjjvbdfRaWzlCo
+DnbkKvbdsPvOjDWG
+EPCjjvbdcbSlrAUN
+EObkKvbdrWpLbhxq
+EPCjjvbdhgKDZVjV
+EOcKjvbdhlFDnUby
+DoCkKvbdddoSBvcK
+DoCkKvbdpssfrRkU
+DoDLKvbdJutfEFGi
+EObkKvbdEPDKkWcE
+EOcKjvbdcJNJjevx
+EPCjjvbdcTDKscia
+DncKjvbdYlRcsmlN
+EPDLKvbdkHgMFfNk
+DoCkKvbdjbkjqGuH
+EPDKjvbdTvMPjUAq
+DnbkKvbdQYmAGsRj
+EPCkKvbdKeegbApu
+EPDKjvbdiLdcmtcZ
+DoCkKvbdNeDshhjd
+EOcLKvbdxnShXsIc
+EPDLKvbdyOShXrhc
+EObkKvbdbPgHELzd
+DoCjjvbdDoCkKwDE
+EOcLKvbdmbJvxPOV
+DnbjjvbdkNBlZeHP
+DnbkKvbdRXNdDMID
+DncLKvbdXnRAYUvU
+EObkKvbdBcpAuilf
+EPDKjvbdSLYeuGkT
+DoCjjvbdRaceLiYk
+DncLKvbdZoNiFEzK
+EOcLKvbdGLEsDIMu
+DnbjjvbdnUuZkJqf
+DoCkKvbdlqyUyrci
+DoCkKvbdLGGHaaRV
+DnbkKvbdmoyyWLYb
+DncKjvbdMpYRWOGs
+DnbjjvbdkyTRsYft
+EObkKvbdjKFhJmXr
+DnbjjvbdxLWcgzzG
+DoCkKvbdxnShXrhc
+DnbjjvbdRbEEkiZL
+EOcLKvbdWWiXudEg
+DoDLKvbdDjIKVxKA
+DoDKjvbdgFkzNgHA
+EPDLKvbdvvlAuaVu
+EPDLKvbdauBfwkTh
+DncLKvbdmIctQtrB
+EPDKjvbdCDpBWJmG
+DoDKjvbdvAcxsPEh
+EOcKjvbdrJAKFNOe
+EOcLKvbdbsDKscia
+DncLKvbdAMhYsWzY
+DncKjvbdddnrCXDK
+EOcLKvbdkHflGGOL
+DoDKjvbdbUafxKsh
+DnbkKvbdNdctIiLE
+EOcLKvbdvBDyTPEh
+DoCjjvbdFejSOJUR
+DnbkKvbdUQpntuHm
+EObjjvbdTpqOttgm
+DoDLKvbdddoSCXCj
+DncLKvbdbVCHXkUI
+EPCjjvbdKNAEZgVB
+EPDKjvbdFjdsDIMu
+DnbjjvbdpaIeAXHd
+EOcLKvbdrDdhpOWB
+EPDKjvbdIxUBhLpp
+EPDKjvbdhkddOVCy
+EPCkKvbdTkuoAuni
+EPDLKvbdnPyxujxb
+EObjjvbdfSBWzlCo
+EPDKjvbdMuSrKmAX
+EPDLKvbdmozYvKyC
+DnbkKvbdZirhPfaf
+EPCjjvbdNQXqWOHT
+DncKjvbdZsiIyESn
+DnbkKvbdURQnuUgm
+DoCjjvbdkIHMFfOL
+EPDKjvbdKfGHaaRV
+DncLKvbdtcDUwVoP
+EOcLKvbdxrnImRbH
+EPDLKvbdozmdLYPA
+DoDKjvbdUVkojUBR
+DnbjjvbdqUUHRrLU
+DoDLKvbdEARhmZvw
+EOcLKvbdZHWdAOri
+DoCjjvbdVUMtGLuj
+EOcLKvbdmfeYNNfy
+EPDKjvbdZirgogCG
+DnbjjvbdEJhKVwjA
+DnbkKvbdkVvmdBxX
+DnbjjvbdvBEYsOeI
+EPCkKvbdDoCjjwDE
+DoCjjvbdRXNdClID
+EPDKjvbdkxrrTZGt
+EOcLKvbdZdxGzhJC
+DoDLKvbdxnSgxSiD
+DoDKjvbdIryAsMxM
+DnbkKvbdTYKlNzjx
+DncLKvbdIGfzZYXg
+DncLKvbdQvnEClHc
+DnbkKvbdqUTfrRkU
+DoDKjvbdRDcAopdS
+DoDKjvbdTfznMXWF
+EOcLKvbdauCHYKtI
+EObkKvbdNrsvHEtp
+DoDLKvbdDihJvXjA
+DnbjjvbdliDtRVRa
+DncKjvbdgFlZmfgA
+DncLKvbdmJDsptqa
+DncKjvbdfoazvdXh
+EOcKjvbdJXtBgkpp
+EPCkKvbdqUUGrSKt
+EPDKjvbdrMzJyLgi
+EPCjjvbdiGjDYuiu
+EOcLKvbdkWXNcaww
+EOcLKvbdxxIjBoyk
+DnbkKvbdePErjssr
+DnbjjvbdIryArmYM
+EOcLKvbdRMwayNtz
+EOcLKvbdRkZGUgKs
+DoDKjvbdZLrEUOMN
+DnbkKvbdDHMFgAzc
+DnbkKvbdwXMBVaVu
+DnbjjvbddeOrCXDK
+EPDLKvbdwuMeQyLn
+EPCjjvbdBhjbLIej
+EPDKjvbdaNLCSuMg
+EPCjjvbdBhkCKhej
+EPCkKvbdptUGrSKt
+EObkKvbdVTmTfLvK
+DoCkKvbdDoDKkXDE
+DnbjjvbdfoazvdYI
+DnbkKvbdatbHYKtI
+DnbkKvbdVUMtGLuj
+EPDKjvbdeEoRavbj
+DoCkKvbdJpzFPGNe
+DnbjjvbdNHDQNQUk
+DncKjvbdYNqAXuWU
+EPCkKvbdZnnIddzK
+EObkKvbdYlRdTnMN
+EPDKjvbdEzspdkcJ
+DoDLKvbdCIkBjhfK
+EObjjvbdTkuoAvOi
+DoCkKvbdhkdcnUby
+EPCjjvbdHfgZyYXg
+DncLKvbdbsCkTdKB
+DoCjjvbdLqwMzVQz
+DoDLKvbdRkYfUgLT
+EOcLKvbdbQHHELzd
+EPCkKvbdbVCGxLTh
+EObjjvbdmSYuZsEJ
+DoDKjvbdssRsYyeD
+EPDKjvbdLrWlytpz
+DncKjvbdJTZBSlxM
+DnbkKvbdxrnJMrBg
+EPCjjvbdxZgfFxFS
+EObkKvbdUQpnuVIN
+EObkKvbdzjUpQESt
+EObjjvbduaDxsPFI
+DoDLKvbdkyTRsYft
+DoDKjvbdyTOImRbH
+EObkKvbdegkWRnQg
+DoCjjvbdaSFbgsek
+DoDKjvbdrylPsAhO
+DoCjjvbdgGMZnGgA
+EPCkKvbdlqyUzSdJ
+DncKjvbdwNWAMdFN
+EPDKjvbdTlWPAuoJ
+EOcLKvbdUMWPAuoJ
+DnbjjvbddZxowxqC
+EPCkKvbdEuyQPlie
+DoDKjvbdVAaqSqSZ
+EPDLKvbdwtldpxlO
+EOcLKvbdrRtkNkBN
+DncKjvbdJqZeOenF
+DncKjvbdfHkWSNqH
+DoCkKvbdnUuZjirG
+EOcKjvbdsCFmMGkZ
+DoDLKvbdwzIFfYEr
+EOcLKvbdqqtjmjaN
+DoCjjvbdrbGNLgKy
+EPDKjvbdNHComQUk
+DnbkKvbdIMBznWqL
+EPCjjvbdEKHivXjA
+EPDLKvbdVhYWYGxz
+EPDLKvbdZxcjNblS
+DnbjjvbdJpzEoFme
+EPDKjvbderBWzkcP
+DoDLKvbdpssgRrKt
+EObkKvbdtbbtvuoP
+EOcLKvbdqGDeUWAh
+DoDKjvbdlZSrTYft
+EOcKjvbdFfKRmhtR
+DnbkKvbdNPxRVnGs
+EPDLKvbdZshhxcsO
+EPCjjvbdMoxQvNgT
+EPCjjvbdKaKfmBxR
+EPDLKvbdSwjkmzjx
+DoCkKvbdjbkkRGtg
+DoDKjvbdfoazwDxI
+DoDKjvbdqwQLbhxq
+EPCkKvbdZtIhyETO
+DncLKvbdmpZxukYb
+EOcKjvbdMoxQumgT
+DoCjjvbdLYqJrzuG
+EObjjvbdnGeXlmfy
+EPDLKvbdyzeOSHhh
+EOcLKvbdiZuGMQmf
+EPCkKvbdWSNwadkc
+DncKjvbdhfibyVjV
+EOcKjvbdQmXbZOUz
+DoCjjvbdSKxeuGkT
+DnbjjvbdbrbkUDjB
+EPDLKvbdJcKCqJbx
+DnbjjvbdjSziTLJz
+EOcKjvbdZxdKNcMS
+DoCkKvbdelfWfmJk
+DoCjjvbdFjeScHlu
+EPDLKvbdnCJvwnnV
+EPDKjvbdNrsufduQ
+DnbkKvbdjcLjqGuH
+EObjjvbdmbKXYOnV
+DoCjjvbdRacdkiYk
+EObkKvbdaaVdfQQX
+DoCkKvbdJpydnfOF
+DoCkKvbduCbtwVoP
+DoDKjvbdpxnhHRDx
+EOcKjvbdmJEUQtqa
+EPDLKvbdRkZGVGjs
+EPDKjvbdEObjkXCd
+EObjjvbdCTAbtGWr
+DoCkKvbdqTsfrSKt
+DncLKvbdaMkBsUmH
+DncLKvbdqlyixlIJ
+EPCkKvbdvwMAuaVu
+DncKjvbdiUzEwRuC
+DoDKjvbdiUzFWrVC
+DnbkKvbdkDMKpfuH
+EObkKvbdZnnJFEzK
+EObkKvbdWWhwudEg
+DoCjjvbdypoNIiwA
+DoCjjvbdShyiqABM
+DnbjjvbdOFEThhkE
+DnbjjvbdRXNcbkgc
+DoCkKvbdqUTfrSKt
+EPDLKvbdfNGWgMjL
+EPDLKvbdGFirOJUR
+EOcKjvbdSCEFMJYk
+EOcKjvbdmpZxukYb
+EPDLKvbdrafNLgKy
+DnbkKvbdmJDsqUrB
+DnbjjvbdjKFgimXr
+EOcLKvbdVYgtZjoO
+EObkKvbdTvMPjUBR
+EOcLKvbdSxKkmzjx
+DoDKjvbdnPzYvKxb
+EPCjjvbdaRfDITek
+EObkKvbdjKGIJmXr
+DoCjjvbdliEURVSB
+EObkKvbdFaOqYizm
+EOcLKvbdqGEEsuaI
+DoCjjvbdZQleJNEq
+DoCjjvbdbKlFnnDA
+DnbjjvbdWIXuwfxz
+EPDLKvbdNGcPmPuL
+DoCjjvbdBsBDTevr
+DnbkKvbdczYoxYpb
+EObjjvbdJutedEfi
+DncLKvbdGFirNhsq
+EPDKjvbdUaCQrqRy
+EPCjjvbdQwNdDMID
+EPDLKvbdtSrSyZeD
+DnbkKvbdNHDQMpUk
+DoDKjvbdZirgofaf
+EObkKvbdrpWOibuf
+DoCkKvbdwygfFxEr
+EPCjjvbdSwjlNzjx
+DnbkKvbdjKGHjMxS
+DncLKvbdijFhKNXr
+EOcKjvbdddoRavbj
+EPDLKvbdmIdTpuSB
+DncLKvbdiiehJmYS
+EObkKvbdjcLkQgUg
+DoDKjvbdsQVoJbuf
+EObjjvbdhzUfMQmf
+DnbkKvbdcImKKfWx
+EObkKvbdbQHHELzd
+DnbjjvbdWWiXuceH
+EPDKjvbdjJegjNXr
+EPCjjvbdZyEKNblS
+DoDKjvbdLqvlzVQz
+EPDLKvbdZRNEhmFR
+DnbkKvbdGcjuibJj
+EOcLKvbdGAnpxizm
+EPCjjvbdkVvnDaww
+EOcKjvbdHffzZXwg
+DoCkKvbdKeehCAqV
+EPCjjvbdHEKuiajK
+EOcKjvbdUtMselWK
+EPDKjvbdEXwlTstM
+EPDKjvbdsrrSxzFD
+EOcKjvbdEztQeMDJ
+EPCkKvbddoFSjstS
+DoCkKvbdSCEElIyL
+DncKjvbdFVxpQNJe
+DnbjjvbdXmqAYUut
+DoCjjvbdiZtfLpmf
+DoDKjvbdwygeexEr
+EOcLKvbdiUyeXSUb
+DncKjvbdsZkoraIO
+EOcLKvbdACrYJyhp
+EOcLKvbdTlVoBVoJ
+EPCkKvbdqZPHfqDx
+DnbkKvbdmJDsptqa
+DncKjvbdhkeDnUcZ
+EPDKjvbdURQoUtgm
+EPDKjvbdjAQHAogK
+EObjjvbdCIkCKhfK
+EOcKjvbdYzbfRjWZ
+DnbkKvbdWRnYCEkc
+DncKjvbdyzeORgiI
+EObjjvbdEPCkLWbd
+DoDLKvbdNHComPuL
+DnbkKvbdaRebhUFk
+DnbkKvbdhlEcmtby
+EOcLKvbdliETqUrB
+EPDKjvbdIxTbHkqQ
+DncLKvbdCEPaVjNG
+EOcLKvbdIjEAJogE
+DoCkKvbdsZkpSaHn
+EPDLKvbdEXxLtTtM
+DncKjvbdwXMAvAuu
+EPDKjvbdakMGPODA
+EPCkKvbdauBfxKsh
+EOcKjvbdCJKakJFj
+EPCkKvbdyXhjBozL
+DoDLKvbdkWWnDbYX
+DncKjvbdEPCjkXDE
+DoDKjvbdlqxtzTDi
+EPCjjvbdyTOJNSBg
+DoCkKvbdnGeYMmgZ
+EPCkKvbdaSFbhUFk
+EObjjvbdnCKWxPNu
+DoCjjvbdrWpLbhyR
+EPDLKvbdmRxtyrci
+DnbjjvbdSBdElJZL
+DnbkKvbdrXQLbiYq
+DoDLKvbdWHwuwfxz
+DoCjjvbdZRNFJNEq
+DncKjvbdUVkpJsaR
+DoCjjvbdbiMijfXY
+EPDKjvbdVTmTekvK
+DoCjjvbdeXytTrFz
+DoDLKvbdyYJKCQZk
+DoDLKvbdczZQYZQb
+EObjjvbdRadFMJZL
+DncLKvbdkVvnECYX
+DncKjvbduaDySneI
+DnbjjvbdwuNFQyMO
+DncLKvbdsrqrxzEc
+DoDLKvbdcSbjtEKB
+EPCjjvbdZtJIyETO
+DoDLKvbdJvUfDdgJ
+DnbjjvbdhbPDFWqR
+DncKjvbdcyyQYYpb
+DoDKjvbdWSNwbFMD
+DoCjjvbdmajXXoNu
+EPCkKvbdxZgeexEr
+EOcKjvbdxsOIlrBg
+DoDKjvbdZyEJmbkr
+DncLKvbdTkunaVni
+EOcLKvbdUQpoUthN
+DoDLKvbdyNsHxTJD
+DncKjvbdEztRElCi
+DnbkKvbdXnRAYVVt
+DnbjjvbdqAheAWgd
+DnbkKvbdCJLBkIfK
+EPDKjvbdUGzmkwWF
+EPCkKvbdSiZiqABM
+EPDLKvbdidkGtoAO
+EOcLKvbdYlSDsnLm
+EPDKjvbdMSWmZtpz
+DoDKjvbdlhdURVRa
+EOcLKvbdOYOuzdOU
+DncLKvbdrafMlGkZ
+EObjjvbdrylPraHn
+DnbjjvbdDncLKwCd
+DoCkKvbdoznELXoA
+DoCkKvbdmttykJrG
+DoDLKvbdBvzciEov
+EPCjjvbdeXzUUSFz
+DoDKjvbdtunYKQsA
+EObjjvbdqceJQNvB
+EOcLKvbdqTtGqqkU
+DoCkKvbdiGjDYujV
+EPCkKvbdRWnEDLhD
+EOcLKvbdcSbjtDia
+DncLKvbdTqROuVHm
+EOcKjvbdiifIKMxS
+EObkKvbdlYrqsZGt
+DoDKjvbdSBdFLhxk
+DnbkKvbdVUNUFkuj
+DoCjjvbdrzLpSaIO
+DoDKjvbdzGxlANFX
+DoDLKvbdfHjuqmpg
+EPDKjvbdZRMeIldq
+DncKjvbdMfcPlpVL
+DncKjvbdxKwDgzzG
+EOcLKvbdYzbfRjVy
+EObkKvbdWSNwbElD
+DoCkKvbdeFOrCXCj
+EObjjvbdbKlGOmcA
+EOcKjvbdDxXktUTl
+EPCjjvbdvBDySneI
+EPDKjvbdLFehCBRV
+DoDLKvbdiZuFlROG
+EPDKjvbdDoDLKvbd
+DoCjjvbdQwNdCkhD
+DoCjjvbdCJLBkIfK
+DnbjjvbdlqyUzSci
+DncLKvbdNHCpMpUk
+EOcKjvbdiMFEOVCy
+DoCkKvbdnGeYNOGy
+DnbkKvbdZoOIddzK
+EOcKjvbdFpATWffZ
+DoDKjvbdeOeTKtTr
+DnbjjvbdGGKSNhsq
+EOcKjvbdyXiKCPyk
+DoCjjvbdeAURNYKG
+DoDKjvbdpssfrRjt
+EPDKjvbdnVVZjjRf
+EOcKjvbdiZuGMQmf
+EOcLKvbdNHDPlotk
+DnbjjvbduCbtwVoP
+EOcKjvbdxUleQxlO
+DoDKjvbdnHFYMnGy
+DnbjjvbdUVlPitAq
+EPCkKvbdjAPgAofj
+DoCkKvbdTlVoAuoJ
+EPCkKvbdmSYtyrdJ
+EPDKjvbdBsAcTevr
+EPCkKvbdUyITzKnn
+DnbjjvbdbQHGdLzd
+EOcLKvbdezuyFIsw
+DoDLKvbdEXwlTtUM
+EOcKjvbdKyRJrztf
+DnbjjvbdtTSSxzEc
+DnbjjvbdHDjujBij
+DoCjjvbdsQVnicWG
+EObkKvbdZsiJYcrn
+EPDLKvbdUtNUFkuj
+DoDKjvbdNPwpumfs
+EOcKjvbdSBcdlJZL
+EPDLKvbdmfeXlmfy
+DncKjvbdIsZAsNXl
+DncLKvbdmJDsptrB
+DncKjvbdGYuUaEXb
+DncLKvbdyYJJbPzL
+DnbkKvbdrpVnicWG
+EPCjjvbdTqQoVUgm
+DoDLKvbdFVyPpMjF
+EObkKvbdZnnIeEyj
+EObkKvbdbUagYKtI
+DoCkKvbdqGDdtWBI
+EPDLKvbdFVxpQNKF
+DncLKvbdkWXNdCYX
+EPDKjvbddwystRez
+EOcKjvbdaNKasUlg
+DnbkKvbdNdctIhjd
+EPCkKvbdatagYKsh
+DoCkKvbdfNFvgMik
+EObjjvbdJYTbIMQp
+DoCjjvbdEYYMTtTl
+DncKjvbdWRmxCElD
+EPCkKvbdbsCjsdKB
+EOcLKvbdFVxpQMie
+EObkKvbdpaJFAWgd
+EPDLKvbdijGHimXr
+EPCjjvbdlhctQtqa
+EObjjvbdFVxoolie
+DncKjvbdrJAKEmOe
+DnbkKvbdzQnmIiwA
+EPCkKvbdkHfkeemk
+DnbjjvbdLGGHaaQu
+DnbkKvbdOSsugEtp
+DnbkKvbdZtIiYcrn
+DoCjjvbdQZNAGsSK
+EObjjvbdNPxRWOGs
+DoCkKvbdVUMsfLuj
+DnbjjvbdmJETqUqa
+EPDLKvbdBsAcUFvr
+EOcLKvbdIsZArlwl
+EPCjjvbdNddTiJKd
+DoDKjvbdyXhiaozL
+DncLKvbdjmCLzEfo
+EOcLKvbdRadElJYk
+DncLKvbdjbkkQfuH
+EObkKvbdXFxzUAOs
+DncLKvbdxZhGFwdr
+DoCjjvbdNsTugEuQ
+EObjjvbdRbDdlIyL
+DoCkKvbdePEsLUUS
+DoCjjvbdOStVgFVQ
+EPDLKvbdUtMtGLuj
+EObjjvbdFjdrbhMu
+EOcKjvbddeOrBwCj
+DnbjjvbdxUmFRYkn
+DnbjjvbdCEQBVimG
+EOcLKvbdvAdZTPEh
+EPCkKvbdGcjvJaij
+EPCjjvbdOFETiIjd
+EOcLKvbdemGWgNKL
+DoCkKvbdqTsfrRkU
+DncLKvbdbrcKsdKB
+EPDLKvbdTAFIhBoE
+DoCjjvbdKCjCqJbx
+DnbjjvbdNsUWHFUp
+EPDKjvbdkWWmcaxX
+EPDLKvbdbKlFoNcA
+DoCjjvbdkIGkefNk
+EPCkKvbdXFyZtAPT
+EPDKjvbdpxnhGpcx
+DoDLKvbdhanbeWqR
+EOcKjvbdliEUQtqa
+EObjjvbdbBVeFpPw
+EObkKvbdQdDApQdS
+EPDLKvbdnQZyVkZC
+EObjjvbdhbOcEwQq
+DnbjjvbdBdPaWKMf
+DoCjjvbdCTAbtGWr
+EPCjjvbdEvYpQMie
+EObjjvbdDxYLtUTl
+EObkKvbdCTBDTfXS
+EPCjjvbdmpZxvKyC
+EPCkKvbdRzKITDWA
+EObkKvbdemGXGmJk
+EOcLKvbdIryAsNXl
+DoDKjvbdkWXNcaww
+EObkKvbddCTNSAUN
+DncKjvbdvBDxroEh
+DncLKvbdiCPDEwRR
+EObjjvbdRkZGVHLT
+DoCjjvbdFkFSbhNV
+EPDLKvbdwjvdHzzG
+DoDLKvbdqquKmkBN
+EOcKjvbdsQVoJcVf
+EPCjjvbdYlSEUOMN
+EObkKvbdjKGIKMxS
+DncLKvbdRpUGifDw
+EObkKvbdEuxooljF
+EPDLKvbdzitpQETU
+EOcKjvbdTvLpKUAq
+DoCjjvbdrSVKmkAm
+EOcLKvbdEvZQPmJe
+EPCkKvbdfelZnHHA
+EOcLKvbdjhGlGGNk
+DncKjvbdCEPaWJmG
+DncLKvbdrpVnjDWG
+DoDLKvbdeOeTKtUS
+DoCkKvbdtbbuXVno
+EObkKvbdYpleJMeR
+DnbjjvbdiCPDEvqR
+DoDLKvbdUslsekuj
+DnbkKvbdGBPQyJzm
+EPCkKvbdtbcUwVoP
+DoDKjvbddxZssrFz
+DncLKvbdkIGlGFmk
+EPCkKvbdhuZdwRtb
+EObkKvbdehLWSOQg
+DoCkKvbdatafwjsh
+DoDKjvbdhfjCyViu
+DoCjjvbdFyUuAcxC
+EObkKvbdUMWPAvPJ
+EPDLKvbdxxIjBoyk
+DnbjjvbdMRvlytpz
+EPCkKvbdDxYLtUTl
+DnbjjvbdiVZeXSUb
+DoCjjvbdffMZmgHA
+EPDLKvbdnPyyVkYb
+EPCkKvbdZtIhyETO
+DncKjvbdRECaPqDr
+EPDKjvbdVrNxBeMD
+DnbkKvbdKVuFdFGi
+EOcLKvbdrzLosAgn
+EPDKjvbdLLAgvAKZ
+EOcLKvbdLYpirztf
+DncKjvbdnGeXlnHZ
+EOcLKvbdQdDAopdS
+DnbkKvbdptTfrRkU
+DoCjjvbdqGEFUVaI
+DncLKvbdrDeIomvB
+DoDLKvbdyOTHxSiD
+EOcLKvbdRpTfjGDw
+DoDLKvbdzitpPdTU
+DnbjjvbdUxhTykOn
+EOcKjvbdGFjSNhtR
+EObkKvbdidkGuPAO
+EObjjvbdVAapsQrZ
+EPDLKvbdQccAopdS
+EObjjvbdmozYukZC
+EOcKjvbdGFjSOIsq
+EPCkKvbdyzeNrHiI
+DncLKvbdEOcKjvcE
+DncLKvbdLFfIBaQu
+DoDKjvbdtlXwBUBX
+DoCjjvbdeOeTLTsr
+DncKjvbdiZuGLpnG
+DoCkKvbdWRnYBdkc
+DncLKvbduCbtvvOo
+DnbkKvbdGGKRnIsq
+EOcLKvbdVTmUFkuj
+EOcKjvbdFkEsDHlu
+DoDKjvbdQwNcbkgc
+DncLKvbdWRmwbFLc
+DnbjjvbdHlBzmwRL
+EPDKjvbdDncKjwCd
+EObkKvbdGBPRYizm
+EOcKjvbdqrVLNjaN
+EObjjvbdqFceUVaI
+DoCkKvbdZQmFImFR
+EPDLKvbdmIctRVSB
+EObkKvbdjAQHBPfj
+EObjjvbdrEFIonWB
+DnbjjvbdsPuoKCuf
+DoDKjvbdtbbuXWPP
+EPDLKvbdOStWGduQ
+DoCkKvbdUQqPUuIN
+EPDLKvbdwyhFewdr
+EObkKvbdShyiqAAl
+EPDLKvbdGZUuBEXb
+EPCkKvbdHffyyXwg
+EObjjvbdGBOpyJzm
+EObkKvbdZirgpGaf
+EObkKvbdRjxfUfkT
+EPDKjvbdZHWdAPSi
+DnbjjvbdVrOYBdkc
+DoCjjvbdGGKSNhsq
+EOcKjvbdJqZeOenF
+EOcLKvbddBsNSAUN
+DncKjvbdZtJJYcsO
+EPDKjvbdBraDTevr
+DoCkKvbdRDcApQdS
+EObjjvbdGGJrNiTq
+DoCjjvbdGLFTCgmV
+DoCjjvbdtlXwBUAw
+DncLKvbdQwNdClHc
+DoDLKvbdygYlAMeX
+EPDLKvbdTvMQKTaR
+EPCjjvbdiMFDnVDZ
+DoCjjvbdiBoDFXRR
+EObkKvbdUQqOuUgm
+EOcKjvbdaMkBsVNH
+EObkKvbdwuNEqZMO
+EObjjvbdLAkGlbXq
+EObkKvbdkCkkQgUg
+DncLKvbdVqnYCFLc
+EPCkKvbdxVMeRZLn
+DncLKvbdRXOEClHc
+EObjjvbdvwMAvBWV
+EObjjvbdIwsahLpp
+EObjjvbdKDKCpicY
+DoDKjvbdlrZUzTEJ
+EOcLKvbdyYIjBpZk
+DncLKvbdxsNhlqag
+EPDKjvbdgPazvdXh
+EPDLKvbdbKlGPNcA
+DoCjjvbdqUUHSRjt
+DnbkKvbdNeDsiJKd
+DnbjjvbdqGEFTvAh
+DoDKjvbdnUtykKRf
+EPDKjvbdZtJJZDrn
+DoCjjvbdmRxtysEJ
+EOcKjvbdQmXbYnUz
+EPDKjvbdjmCLzFGo
+DncKjvbdsBfMkfkZ
+EPCkKvbdFVxpPlie
+DnbkKvbdZLrEUOMN
+DoCkKvbdEOcKkXDE
+EObkKvbdvBEYsPEh
+EPDKjvbdcJMjLGXY
+EOcLKvbdOYPVzcnU
+DnbkKvbdsQWOjDWG
+EOcLKvbdfHjvRnRH
+DoDLKvbdmbKXYPOV
+DncKjvbdrpWPJcVf
+EOcKjvbdURROuUgm
+DnbkKvbdrovOicWG
+EObjjvbdLYpirzuG
+DnbjjvbdGQASvgGZ
+DnbkKvbdYzcFqjVy
+DncKjvbdBsBCtFvr
+DoDLKvbdYgXEAOri
+EOcLKvbdqTsfqqjt
+DncKjvbdPIAYZAYa
+EOcLKvbdypnliJwA
+DnbkKvbdhyuGLqNf
+EOcLKvbdjhGkfGOL
+DncKjvbdjblLRGuH
+EPCjjvbdxwhibPyk
+EOcKjvbdBhkCLIfK
+DnbjjvbdJTZArlxM
+DoCkKvbdRjxetgKs
+EObkKvbdiUyeWrVC
+EOcKjvbdwXLaWAuu
+EPDLKvbdssSTZZdc
+EObkKvbdcSbjtDia
+DncKjvbdgGMZnHHA
+DoCkKvbdatafwkUI
+DncLKvbdnCKWxPNu
+EObjjvbdyOShXrhc
+EPCjjvbdpyPHfqEY
+DoDKjvbdbUbGxKsh
+EOcKjvbdypoNJKXA
+EObkKvbdyTOJMrBg
+DoDLKvbdiZtfLpmf
+EPCkKvbdLGFgbBQu
+EOcLKvbdCJLBkJFj
+DnbkKvbdUxgszLPO
+DoDKjvbdUQqPVVHm
+EPCjjvbdijGIKNYS
+EPDKjvbdCJKajhej
+EPDLKvbduoTzqLPU
+DnbjjvbdJTZBTMwl
+EOcLKvbdLAjfmBwq
+DoDLKvbdQwOECkhD
+DoCjjvbdQYmAHTSK
+DoDKjvbdEuyQQMjF
+DoDKjvbdZdwfzhIb
+EOcKjvbdyTOJNRag
+DoDLKvbdbBVdfQPw
+DoCkKvbdbVBfxLUI
+DncKjvbdcIljKevx
+EOcLKvbdhgKDZViu
+EObjjvbdOTUWHEtp
+DncKjvbdZRMeIldq
+DnbjjvbdkHgMGGNk
+EOcLKvbdZMSETmlN
+EPCkKvbdjcMKpfuH
+EPDLKvbdiBncFXQq
+EObjjvbdJcKCqKDY
+DoDKjvbdQwOEClID
+EPCkKvbdRpUHJecw
+DoDKjvbdZjSgogBf
+DoCkKvbdEObkKvbd
+DoDLKvbdDwwktUTl
+DoCkKvbdSKyGVHKs
+DnbkKvbdZMSETnMN
+DncLKvbdiZuGLpmf
+EObjjvbdjcLjpgVH
+EOcLKvbdYzcFqjVy
+EPCjjvbdQvnDcLhD
+DoCkKvbdDihJvYKA
+EPDLKvbdJqZeOenF
+EOcKjvbdWXJXvDdg
+DoCjjvbdznpQeCkx
+EPCjjvbdjJehJmXr
+DoDKjvbdmSYuZsDi
+DoDKjvbdFVyPolie
+DnbjjvbdULvPAvOi
+DncKjvbdwzIGFwdr
+DnbkKvbdOEcsiJKd
+EPCkKvbdEJhJuwjA
+EObkKvbdYSkaNUOx
+EObkKvbddoFSkTtS
+DoDLKvbdFkFTDHlu
+DoCjjvbddwzTtRez
+EOcLKvbdDwwlUTtM
+DoDKjvbdHDjvJaij
+EObkKvbdyTOIlrBg
+EOcLKvbdtSqsYzFD
+EObkKvbduVmwjQsA
+EPDKjvbdbiMjKfXY
+DncLKvbdsQWPKDWG
+DncLKvbdRbEElIyL
+DnbjjvbdGKeTDHlu
+EPCkKvbdrpWOjDWG
+EObjjvbdVwJYWEFH
+EPCjjvbdvBDySoFI
+EPCkKvbdZMSDsmkm
+EObkKvbdqYnhHREY
+EObjjvbdyqPMiJwA
+DncLKvbdCTBCtGXS
+EPCkKvbdfekynGgA
+EPCkKvbdvvkaWBVu
+DoCjjvbdGZUuAdYC
+DoDKjvbdpyOgfqDx
+EPCjjvbdePFTKstS
+EOcLKvbdVviXudFH
+EPCkKvbddZyQYZQb
+DnbkKvbdUaCQrqRy
+EPDLKvbdQwNdDMID
+DncKjvbdUaCRTQrZ
+DnbjjvbdHDkWJbKK
+EOcKjvbdOTTvGduQ
+DnbjjvbdssRrxzEc
+EObjjvbdezuxdiTw
+EOcLKvbdGLFTCgmV
+EPDLKvbdUxgtZkOn
+EOcLKvbdbrbjscia
+DnbjjvbdjJfHimXr
+EOcKjvbdjcMLQgUg
+DoDKjvbdlYrqrxft
+EPDKjvbdGYttaEXb
+EOcLKvbdhbPDEwQq
+EOcKjvbdvAcxroEh
+DoDKjvbdVgxVxHYz
+DoCkKvbdTqQnuVIN
+DoCjjvbdrXQMCiZR
+EOcKjvbdMSWlytpz
+DoCjjvbdBiLCLJFj
+EObkKvbdUyHtZkPO
+DoDLKvbdGcjujCJj
+EPCjjvbdfkGzbfAE
+DoCjjvbdDoCjjwDE
+DnbkKvbdqGDdsvAh
+DoDLKvbdjvXNdBww
+EOcKjvbdANHySvyx
+DoCjjvbdeJjRvUzn
+DncKjvbdqUTgRqkU
+DncLKvbdEvZQPljF
+DnbjjvbdSPsgKFdX
+EOcKjvbdGLFScHmV
+EPCjjvbdqUTgRqkU
+EPCkKvbdNxOuzdOU
+DoCkKvbdpfEEtWBI
+EOcLKvbdDwwlTtTl
+EPCjjvbdSZjITDWA
+DncKjvbdQwNcblID
+DnbjjvbdijGIKMwr
+DnbjjvbdYpldiMdq
+DncLKvbdemGXHNKL
+EPCkKvbdEKHjWYKA
+DoDLKvbdwXMBWAvV
+DnbjjvbdQwOEClHc
+DnbkKvbdbUbHYKtI
+DncLKvbdCSaCtFvr
+DncLKvbdEuyPpNJe
+EPDKjvbdFVyPolie
+DncKjvbddneSkTtS
+EOcKjvbdZtJIxcsO
+EOcKjvbdiGicZWJu
+DncLKvbdOFDtIiLE
+DoDLKvbdOSsufduQ
+DnbkKvbdMfcPmQVL
+EObjjvbdiUzEwSVC
+DoCkKvbdCIkBkJFj
+DncLKvbdYkrETmlN
+EObjjvbdqZOggREY
+EPCkKvbdHDkViajK
+DnbkKvbdbsDLTdKB
+EPDLKvbdlqxtzTDi
+DncKjvbdLGFgbAqV
+EObjjvbdoAKztHcn
+EPDLKvbdRXODblID
+DoCjjvbdIHGzYwxH
+EObkKvbdNPwqVnHT
+EOcKjvbdxrnImRag
+EOcLKvbdiLddNuCy
+DoCkKvbdkMakzEfo
+EObkKvbdnPyxukYb
+EPCjjvbdZdwfzgiC
+EPCkKvbdnHEwmNfy
+EObjjvbdySmiNRag
+EOcKjvbdzeZnzdyp
+EPCjjvbdJvVFdEgJ
+EOcKjvbdZQldiMeR
+EOcKjvbdFyVVAdYC
+DncKjvbdJXsahMRQ
+DnbjjvbdfNGXGljL
+EOcLKvbdwWlAvAvV
+DncLKvbdkIHLefNk
+DncLKvbdliDtQtrB
+DoCkKvbdxZgefXdr
+DncKjvbdCWzchdpW
+EPCkKvbdpyPHfpdY
+EOcKjvbdhbOcFWqR
+DnbjjvbdzjUpPdSt
+DoDLKvbdZMRdUOLm
+DncLKvbdVwJXucdg
+EPCjjvbdWXIxVcdg
+DnbkKvbdMpXpvOHT
+DncLKvbdRkZGVHKs
+DoDKjvbdmpZyWKxb
+DoCjjvbdegkWRmpg
+DncLKvbdyzeOSHhh
+EPDLKvbdRECaPpdS
+EPDKjvbdqvpLcJZR
+DoCjjvbdRDbaPqDr
+EObjjvbdRECaPqDr
+EOcLKvbdsBfNLgLZ
+DncKjvbdZyEKOCkr
+DnbkKvbdSPsgJfEX
+EPDKjvbdZRMdiMeR
+EPDLKvbdDwwktTsl
+EPDLKvbdLhbLpxAS
+EPDKjvbdZirgpHBf
+DoCkKvbdmtuZkJqf
+DnbjjvbdwWkaWAuu
+DnbjjvbdRDcBPqES
+DnbkKvbdyzeNqgiI
+EObjjvbdYkrEUOLm
+DoCkKvbdmtuZkKRf
+DoCkKvbdNdctIhkE
+DnbjjvbdhytfLqOG
+EOcLKvbddZyPwxpb
+EPCjjvbdYzbeqivZ
+EOcKjvbdwygfGXeS
+EOcLKvbdRosfifEX
+EPCkKvbdznopdbkx
+EObkKvbdVBBqSqSZ
+EObjjvbdQlxCZNtz
+EPCkKvbdhlFDmtby
+DoDLKvbdCDpAvJmG
+EPDKjvbddeOrCXDK
+EOcLKvbdrovOjDWG
+DnbkKvbdIGfyyYYH
+EObkKvbdmbKWwnmu
+EOcLKvbdkDLjqGuH
+EPDLKvbdqrUkNjaN
+EPDKjvbduDDVXWPP
+EObjjvbdZnnJFEzK
+DnbjjvbdaRfCgtGL
+DoCkKvbdGKdsDHlu
+DncKjvbdqlyiyMHi
+DoDLKvbdSLYetgLT
+DnbkKvbdZQleJNEq
+EOcLKvbdZLrETnMN
+DnbjjvbdiUydwRuC
+EObjjvbdnPzYvLYb
+EPCjjvbdGYuUaEYC
+EObjjvbdACqwiyiQ
+DncKjvbdIHGzZYXg
+DncKjvbdxrnIlqag
+DnbjjvbdySmhlqag
+DoCjjvbdSCEFMJZL
+EObjjvbdSKxfUfjs
+DnbjjvbdnUtyjjRf
+DncLKvbdkyTRsZGt
+DoDLKvbdWRnXbElD
+EOcKjvbdjvXNcbYX
+EOcKjvbddjKSWUzn
+DoDKjvbdvBDxrneI
+EOcLKvbddndsKtTr
+DoDLKvbdZjTHpGbG
+DnbkKvbdpfDdsuaI
+EPCkKvbdfMfWgNJk
+DoCkKvbdjJegjNXr
+DoDKjvbdcTDLTdKB
+EPDLKvbdwzHfFxEr
+DncKjvbdfMfWgMik
+DnbkKvbdrbFllGkZ
+EPCkKvbdCIkCLJGK
+EObjjvbduDDUvvOo
+EOcKjvbdDxYMUTsl
+EOcLKvbdsPvOibuf
+DncKjvbdUsltGLvK
+EPCjjvbdyOShYTIc
+DoDKjvbduaEZSoEh
+DncKjvbdLrXMzUpz
+DoCkKvbdNsTufeUp
+EObkKvbdLGGIBaQu
+EPCjjvbdmSZVZsEJ
+DncLKvbdQdDAoqDr
+DoCkKvbdKCicRJbx
+EPCkKvbdxwhibQZk
+DoDKjvbdTvMQJsaR
+DoCkKvbdYzcGSJuy
+DnbkKvbdwyhGFwdr
+DoCjjvbdEOcLKwDE
+DoCkKvbdGGKRmhtR
+EOcLKvbdrzMQTAgn
+DoDLKvbdJvVFceHJ
+DnbkKvbdfMfWfmJk
+EPCkKvbdmajWwnmu
+EPCjjvbdxrmiMqag
+EOcKjvbdqUTfqqkU
+EObkKvbdoAKztHcn
+EObkKvbdkyTSTZHU
+EPCjjvbdiCOcEwRR
+DnbkKvbdGZUtaDwb
+EPCjjvbdYORAXuWU
+DoCkKvbdULvPAuoJ
+DnbjjvbdcSbjscjB
+DoDKjvbdLrXMytpz
+DncKjvbdIryBTNYM
+DoCjjvbdZyDinCkr
+EPDLKvbdZoOJFEyj
+DncLKvbdajkfOmcA
+EPDLKvbdRNYCYmtz
+DoCkKvbddePRawDK
+EOcKjvbdbUbHYKtI
+EPCjjvbdbrbjscjB
+EPDKjvbdKDJcRKCx
+EObjjvbdqcdiQOVa
+EPDKjvbdZjTIPgBf
+DnbjjvbdrSUjmjaN
+DnbjjvbdEXxLsstM
+EPCkKvbdFjeSbglu
+DnbkKvbdLqwMytpz
+DoDKjvbdUGznMXVe
+EObkKvbdpstHRrLU
+DoDKjvbdYTLaNUPY
+DnbkKvbdGKdrbhNV
+EObjjvbdRMxCZNtz
+DncLKvbdDihJuwjA
+EPCjjvbdOFDtJIkE
+DnbkKvbdliEUQuSB
+DoDKjvbdkCkkQftg
+EPCkKvbdGZVVAcwb
+EObjjvbdkyTSSxgU
+EPDKjvbdIryBSlxM
+EOcKjvbdWIXvXfxz
+DoDLKvbdhfjCyWKV
+DoDKjvbdNQXpumfs
+DncKjvbdiMEcnVCy
+EPDLKvbdxVMeRZLn
+EPCkKvbdDoDKjwDE
+DnbkKvbdSCEFLiZL
+DoCjjvbdqYoHgQcx
+EObjjvbdxZhFexFS
+EOcLKvbdkDMLRGuH
+EPCkKvbdVwJXvDdg
+DoCjjvbdjhHLefOL
+EOcLKvbdiCOcFWpq
+DnbjjvbdrovOjCvG
+DncLKvbdRzKHsCvA
+EPCkKvbdDoDLKwDE
+EOcKjvbdrNZjZLhJ
+EObjjvbdTAFIhBoE
+DncKjvbdlqyVZsDi
+DncLKvbdjggMFenL
+EPDLKvbdUsltGMWK
+DoCjjvbdkyTRsZGt
+EOcLKvbdrzMPsBHn
+EPCkKvbddZxpYYpb
+DncLKvbdGKdsCgmV
+DnbkKvbdvAdYsPEh
+DoDLKvbdqUUGrSKt
+EPCjjvbdxnTHxTIc
+EOcKjvbdZisIQGaf
+DncLKvbdBhjbLJFj
+DoCkKvbdJSyBTNYM
+DnbjjvbdmfdwlmgZ
+EOcLKvbdJcJcRJbx
+DncLKvbdmoyyWLYb
+EObjjvbdSKxfUfkT
+EObjjvbdlAlnmALA
+DoDLKvbdTlVnaVoJ
+EOcKjvbdnCKWwnnV
+EPCjjvbdjbkkRGtg
+EPCjjvbdULuoBVoJ
+EPDKjvbdwMvAMceN
+DnbkKvbdznopdcLx
+EPCkKvbdeuzwoizs
+EPCjjvbdpssfrRjt
+EOcKjvbdiGibyWJu
+DnbkKvbdYSlBNToY
+EPDKjvbdkVwNcbYX
+DoCjjvbdsPuoJcVf
+DnbkKvbdrbGNLgLZ
+DnbkKvbdRbEFMJYk
+EObjjvbdqceIonVa
+DnbkKvbdTpqPUuHm
+EOcLKvbdVviXvEEg
+EOcLKvbdvAcxrndh
+DnbjjvbdTYKkmzkY
+EOcLKvbduDCuXVno
+EPCkKvbdEvYpPlie
+DncLKvbdaSGCgtFk
+DoCjjvbdpfDdtWBI
+DncLKvbdHDkWJbJj
+DncLKvbdqZOgfpdY
+EPCkKvbdFxuVBEXb
+DoDKjvbdnBivwnnV
+EPCkKvbdRWmcbkhD
+EObjjvbdfIKvSOQg
+DnbkKvbdcIlikGWx
+EOcKjvbdQdDBQQdS
+EPCjjvbdnPzZWKyC
+DnbkKvbdZxcimbkr
+DncLKvbdLFfHaaRV
+DoCjjvbdYSlBNToY
+DnbjjvbdKCicRKDY
+EPCkKvbddneSjtUS
+EObjjvbdmIctRUqa
+DncKjvbdYqMdiNFR
+DnbjjvbduaDyTPFI
+EPCkKvbdePEsLTtS
+EPCkKvbdbUagYKsh
+DoDLKvbdssSSxzFD
+EObkKvbdMuSrLNAX
+EPDLKvbdddnqbWbj
+DnbkKvbdvAcySneI
+EPDKjvbdatbGxLUI
+EOcLKvbddePRbWbj
+DoDLKvbdijGIKNYS
+EPCjjvbdNrsugEtp
+EOcLKvbdxZhGGYEr
+DnbkKvbdTkvPAvPJ
+DoCjjvbdFyUuAcwb
+DnbjjvbdJTZBTMxM
+EPDLKvbdaMkCStmH
+EPDLKvbdjKGHimYS
+DnbkKvbdelewGlik
+EObjjvbdkHgMGGOL
+EObkKvbdURRPUuHm
+EOcLKvbdjKFhKNYS
+EPDLKvbdhyuFkpnG
+EOcLKvbdRosgJecw
+DoCjjvbdczYoxYqC
+DncLKvbdzaAPGgCM
+EPDKjvbdiUzEwSUb
+DoCjjvbdKQzEneme
+EObjjvbdatagXkTh
+DoCjjvbdwtldqYkn
+EOcKjvbdUxgszLOn
+EPCkKvbdUaBprprZ
+EOcLKvbdYNqAYVVt
+EObjjvbdbUafwkTh
+EPDLKvbdcIljLGWx
+DnbjjvbdNHDPlotk
+EOcLKvbdkIHMFfOL
+EPDKjvbddePSCXDK
+EOcLKvbdbUafxLTh
+DoDKjvbdQlwaxmtz
+DoCkKvbdbQHHELzd
+EPDLKvbdhficZWKV
+DoDKjvbdqrVLOLAm
+DoCjjvbduDDUvvPP
+EPCjjvbdCEQAuilf
+EOcLKvbdEASIlywX
+DncLKvbdRNXayNtz
+EOcKjvbdVrOXaeMD
+EPCjjvbdFWYopNKF
+DnbkKvbdSQTfjFcw
+DoDLKvbdJTZAsMwl
+DoCjjvbdiCPDEvpq
+DncKjvbdVwIwuceH
+EPDLKvbdJvVFcdfi
+EPCjjvbdcbSlrATm
+DnbjjvbdqBJFAXIE
+EPCkKvbdTAFJHbOd
+EPCjjvbdcTCkUEKB
+EPCkKvbdxwhibPzL
+EPCkKvbdRpTfifEX
+EPDLKvbdvAdYsOeI
+DncKjvbdpxngfpdY
+EPCjjvbdEXwksstM
+DnbkKvbdNrsufeUp
+DnbkKvbdJKEAJogE
+DoCkKvbdNsUWGduQ
+DoCkKvbdbrcLTcjB
+EOcKjvbdiHJcZViu
+EObkKvbdEztQdkcJ
+DoCjjvbdliETptqa
+EOcLKvbdOEdUIhjd
+DoCkKvbdSKxfVGkT
+EPCjjvbdIsZAsMxM
+EOcKjvbdZsiIyDsO
+DncLKvbduDCtwWOo
+DnbkKvbdEztQdlCi
+DnbjjvbdLZQjSztf
+DoDLKvbdXmqAXuVt
+EPCjjvbdxsOJNSCH
+DoDLKvbdRadElJZL
+EOcLKvbdWRnXbEkc
+DncKjvbdSCEFLiYk
+EPDLKvbdidkHVPAO
+DoCjjvbdkClKqGtg
+EPDKjvbduLxXBUAw
+DncLKvbdqUTfqqkU
+EObjjvbdcImKKevx
+DoDLKvbdMgCpMpVL
+DnbjjvbdtTRsYydc
+DnbkKvbdKefHbBQu
+EOcKjvbduoTzpjnt
+DoCjjvbdjuwNcaww
+DncKjvbdTkvPBVni
+EPDLKvbdapGfdLzd
+EPDKjvbdvAdZTPEh
+EPCkKvbdwXLaVaWV
+EOcKjvbdZoNhddyj
+DncKjvbdqceIonVa
+DnbjjvbdIwsbHkqQ
+DoDKjvbdjFKfuPAO
+EOcLKvbdbhmJkFvx
+DncKjvbdDxYMUUTl
+DnbjjvbdMfbpNQVL
+DoDLKvbdZeXfzhIb
+EOcLKvbdVAbRSpqy
+DncLKvbdZxcjOCkr
+EOcKjvbdyTNiNSCH
+EObkKvbdiLddOUcZ
+DoCjjvbddwystRez
+DoDKjvbdUsmTelWK
+EPDLKvbdEPCjkWcE
+DoDKjvbdIwsaglQp
+EObkKvbdGcjvJbKK
+DoCkKvbdRzJgrbvA
+EObkKvbdkxsSSxft
+DncLKvbdfHjvSNpg
+DnbkKvbdxsNiMqag
+DoDLKvbdcImKKevx
+EOcLKvbdJutfDdgJ
+DoDLKvbdhancEwRR
+EObkKvbdnPzYvKyC
+DoDKjvbdNHDPlouL
+EPCkKvbdKaKgMbXq
+EOcLKvbdqUTgSRkU
+EPCkKvbdZjSgpHBf
+DncLKvbdHffzYxXg
+DoCkKvbdFkErbhMu
+EObjjvbdhancEwQq
+EPDKjvbdJYUCHkpp
+EPDKjvbdtkwwBUAw
+EOcLKvbdiZuGMRNf
+EObkKvbdrJAKElne
+DnbjjvbdIHHZxwwg
+EPDKjvbdkHgMGGNk
+DoCjjvbdeOeSjtUS
+DoDLKvbdJbicQjCx
+DncKjvbdnGeXlnGy
+EPDKjvbdKVtecdfi
+EOcKjvbdULuoBVni
+DnbkKvbdmJDtRVRa
+DncLKvbdJTZAsMxM
+EPDKjvbdVgxVxHYz
+EPCjjvbdVBCRSqSZ
+EPCjjvbdJqZdnfOF
+DncKjvbdqdEiQOVa
+DnbkKvbdZLqdTnLm
+EOcKjvbdzHZMANFX
+DncKjvbdVrNxBdkc
+DnbjjvbdKkAgvAKZ
+DnbjjvbdmbKWxOnV
+DoDKjvbdYqMeImEq
+EObjjvbdbUagYKtI
+DncKjvbdQZNAHSqj
+DoDLKvbdfoazvcwh
+DnbkKvbdVvhwvDdg
+DoDKjvbdURQoUthN
+EPDLKvbdvBDyTOeI
+DnbjjvbdrRuKmkBN
+DnbkKvbdRbDdlIxk
+EObjjvbdSCDdkhyL
+DoDKjvbdSBceMJYk
+DoDLKvbdwyhGGYFS
+EPDKjvbdQvmcblID
+DoDLKvbdaaWFGQQX
+DoDKjvbdEASImZvw
+EPDLKvbdnQZyWLYb
+EPDKjvbdbrcLUEJa
+EOcLKvbdKCicQjDY
+EPCjjvbdVBCQsQqy
+EPCkKvbdkaNPNALA
+DncLKvbdaNKartmH
+DoDLKvbdCTAbtFvr
+EObjjvbddZxowxpb
+EObkKvbdTpqOuUgm
+DncLKvbdZQleJNFR
+DnbjjvbdUVlPisaR
+EObjjvbdBsBCtFvr
+EPCjjvbdJutecdgJ
+EOcKjvbdfNFvgNKL
+DncKjvbddneSjtUS
+DoDKjvbdjcMKqGtg
+EOcLKvbdGdLWKCKK
+EOcKjvbdRDcBPpdS
+DoCkKvbdauCGwkTh
+EPCjjvbdaNLCStmH
+EOcKjvbdelfWgMjL
+DoDLKvbdtSrSxyeD
+EPCjjvbdemGXGmKL
+EOcLKvbduDCuXWOo
+DncKjvbdauBfxLUI
+DnbjjvbdIHGyyXwg
+EPCjjvbdEvYooljF
+EObjjvbddneTLUTr
+DoCjjvbdySmiNRag
+DoDKjvbdqUUHSRjt
+EObjjvbdczYpXxpb
+EObkKvbdaMkBrtlg
+EPDLKvbdnUuZkKRf
+DoDKjvbdcScKsdJa
+EPCjjvbdsrrTYydc
+EObjjvbdZoNiFEyj
+EPDLKvbdmttyjirG
+EOcLKvbdYqMeIleR
+DoDKjvbdKWUfEFGi
+EOcLKvbdcyxoxYqC
+EObkKvbdNeETiJLE
+EPCkKvbdUMWOaVoJ
+EPCjjvbdWSOXbElD
+EPCkKvbdNHCpNPuL
+EObkKvbdEuyQQNJe
+DoCkKvbdmgExNOGy
+EOcKjvbdZtJJYcsO
+EOcLKvbdMpXqVnGs
+EObjjvbdbsDLTcjB
+EPCjjvbddoFTLUTr
+EOcLKvbdaNKbTVNH
+DoCjjvbdJcKCpicY
+DoDLKvbdsBfMlGjy
+EPDKjvbdqiAJdlne
+EObkKvbdKefHaaRV
+DoDLKvbdbiNJjewY
+EPCkKvbdVTltFlWK
+DoDLKvbdbBWFGPpX
+DncLKvbdVZITzKoO
+EPCjjvbdnUtzLKSG
+EPCkKvbdBraDTevr
+EPDLKvbdTkunaWPJ
+EObjjvbdZRNFJNEq
+DnbkKvbdxUldqYkn
+EPDLKvbdtvOYJpsA
+EOcLKvbdJvUfEEgJ
+DoDKjvbdlYrqsZGt
+DncKjvbdePFSjstS
+EPDLKvbdqquLOLAm
+DoCkKvbdSPtHKFdX
+DoCjjvbdZyDjNcMS
+EPDKjvbdTlVnaWPJ
+EPCjjvbdZirgpHCG
+EObkKvbdNQYQvNfs
+DncKjvbdqqtjnLBN
+DoDKjvbdjJehJmYS
+DncLKvbdrNZixlHi
+EPDLKvbdMfcPlpVL
+EPCjjvbdUWMQJtBR
+DoCkKvbdfMfWfljL
+DnbjjvbdaRfDHtFk
+DncLKvbdiMFDnVDZ
+DoCkKvbdXrkaNToY
+DoCjjvbdZLqdUNlN
+EObkKvbdRjxetfkT
+EOcLKvbdmgFXmOGy
+EPDKjvbdUQpntuHm
+DoDKjvbdpstHRrKt
+DncLKvbdHkazmwRL
+EObjjvbdpfEFUWAh
+DoDKjvbdZyEJnDMS
+EObkKvbdiBoCeXQq
+DoCkKvbdeATplxKG
+DncLKvbdWRmwadkc
+EPDKjvbdUQqPUthN
+DoCjjvbdnBjXXnmu
+EPDLKvbdZjTIPfbG
+EPCkKvbdWHwuxGxz
+DncKjvbdYpmFJMdq
+DoDKjvbdhbPDFXRR
+DnbkKvbdBdQBVimG
+DoCjjvbdmIctRUqa
+EPDKjvbdZyDjNbkr
+EOcLKvbdQYmAHSrK
+DnbjjvbdqYoHgQcx
+DncKjvbdqiAKFMoF
+DncKjvbdOTUWHEuQ
+DoCjjvbdVTmTfLuj
+DoCkKvbdddoRbWcK
+EPDKjvbdIsYaTNYM
+EObkKvbdRosfiedX
+EOcKjvbdcTDLUEKB
+EOcLKvbdmozYujxb
+DnbjjvbdZirgogBf
+EPCjjvbdKWUeceHJ
+DnbjjvbdZoOJEdzK
+EPDKjvbdEJhKVwjA
+DoCkKvbdfpBzvcxI
+DoDKjvbdlrYtysDi
+DoDLKvbdZjSgofbG
+DoCjjvbdUtMtGMVj
+EPCjjvbdGGKRmiTq
+EPCkKvbdQvnDcMID
+DnbkKvbdKCjCqJbx
+EPCkKvbdYpleImEq
+DoDLKvbdjKFgjNXr
+DoDLKvbdZshhxcrn
+EPDLKvbdnVVZjjRf
+EOcKjvbdqdFIpNua
+DnbjjvbdVwIxVdEg
+DoCkKvbduaEZSneI
+DnbkKvbdznoqFClY
+DoCjjvbdoAKzsgcn
+EOcKjvbdSLZGVGkT
+DncKjvbdiCObeWqR
+EPCjjvbdWRnXbEkc
+EObjjvbdRotGiecw
+EObkKvbdKDKDQibx
+DnbjjvbdlYsRsYft
+EOcKjvbdUaBqSprZ
+DoCjjvbdhkdcmuDZ
+EOcKjvbdjgflFfNk
+DoCjjvbdGKdrcINV
+EOcLKvbdEJgjVxKA
+EObkKvbdSxKkmzkY
+DnbjjvbdsZkosBIO
+DoCjjvbdBvzchePv
+EObkKvbdGYtuBEXb
+EPDKjvbdiLeENtby
+EPCkKvbdRNXbYnUz
+EObjjvbdfHkWRnQg
+EObkKvbduDDVXWOo
+DoCkKvbdJbjCqJbx
+EPDLKvbdpedFTvBI
+DncLKvbdjJegjMwr
+EPCjjvbdUxgszLPO
+EObkKvbdxmrhXsJD
+EOcKjvbdJSxaSmXl
+EPDLKvbdfNFwGmJk
+EPDKjvbdsrrTYydc
+DncKjvbdhgKDZVjV
+EPCkKvbdZMRctNkm
+DoDKjvbdezuyEhtX
+EPCkKvbdEXwlUTsl
+EPDLKvbdeAUQlxKG
+DoDKjvbdZnmiEdyj
+EObkKvbdrzMPraIO
+EPCjjvbdxxIibPyk
+EPCkKvbdKfFgbBRV
+DoDKjvbdyzeORhIh
+DnbkKvbdbAvFGPpX
+DncKjvbdZoOJEdyj
+DnbkKvbdrJAJdmOe
+DoDKjvbdKVuFdEfi
+EOcKjvbdqdFJQNvB
+EPDLKvbdOEctIhkE
+EPDLKvbdvBEYsOeI
+DncKjvbdHELVjBjK
+DncLKvbdZshhyDsO
+EPDKjvbdGdKuibJj
+DoCkKvbdEYXkstUM
+DnbjjvbdJpyeOfNe
+EPDKjvbdzoPpdbkx
+DoCkKvbdMSXMytpz
+DncLKvbdqZOggQcx
+DoDKjvbdmuUyjirG
+DnbkKvbdNVSqkNAX
+DncLKvbdRotHJfEX
+EOcKjvbdZyEJnCkr
+EPDLKvbdyYJKBpZk
+DnbkKvbdxmrgxTJD
+DnbkKvbdhaoDFWqR
+DncKjvbdbhmJjevx
+EObjjvbdSKyGVGjs
+DnbjjvbdSKxfVHKs
+DnbjjvbdqdFIomua
+DnbkKvbdkHflGGOL
+DoDLKvbdqGDeUVaI
+EObjjvbdjmBlZeHP
+EPCkKvbdmttykJrG
+DncLKvbdRXOEDLgc
+DoDLKvbdhaoDFWqR
+DoDKjvbdvvkaWAuu
+DoCkKvbdbhmKKfWx
+EObjjvbdSBdFMJZL
+DnbjjvbdnUuZjjSG
+EPDLKvbdliDtQuSB
+EOcLKvbdsCFmMGjy
+DnbjjvbdtunXjQsA
+EObkKvbdkCkjqHUg
+EObjjvbdDoCkKvbd
+DnbkKvbdiZuFlROG
+EOcKjvbdRNYCZNtz
+EOcLKvbdxUmEpxlO
+EPCkKvbddePSBwDK
+EOcLKvbdauBfxKsh
+DoCjjvbdtkwwBTaX
+EObjjvbdmgEwmNfy
+DnbjjvbdOStWHEuQ
+EPCkKvbdGLFTChNV
+EPCkKvbdKDJbpjDY
+DoDLKvbdnPzZVjxb
+DoCjjvbdFVyPomJe
+DncLKvbdACqwizIp
+EPCkKvbdZirhQGaf
+DncKjvbdtTRsZZeD
+EObkKvbdLBLHMbYR
+EOcLKvbdrNZjZLgi
+EObjjvbdTXkLmzkY
+EPCkKvbdBsAbsfXS
+EOcKjvbdeATpmXif
+DoCkKvbdMSWmZuQz
+DncLKvbdVTmTfMVj
+DoDLKvbdZxdKODMS
+EPDKjvbdZjShPgCG
+EPDLKvbdxVMdpxkn
+EPDLKvbdcSbjsdKB
+EPDLKvbdiifIJlwr
+DoDKjvbdKQydoFnF
+EObkKvbdegkWRmpg
+EObkKvbdiBncFXQq
+DoDLKvbdNdctJJLE
+EOcKjvbdUyHszKnn
+EOcLKvbdSQUHKFcw
+EObkKvbdUaBqSprZ
+DoCkKvbdSCDeLiZL
+EPCkKvbdKDKCpjCx
+EPDLKvbdwygfFweS
+DoDKjvbdiVZeWqtb
+DoCjjvbdMRwMyuQz
+DoCjjvbdsCGNLfkZ
+DoCkKvbdmRxuZsEJ
+EPCkKvbdkDMLRGtg
+EObkKvbdGdKuibJj
+EPCkKvbdePFTLUTr
+EOcKjvbdXrlAlsoY
+DoDLKvbdZjTHogBf
+DnbjjvbdZirhQGaf
+EPCkKvbdFVxooljF
+DoCkKvbdbKkeoNcA
+DoDKjvbdqYngfqEY
+EPDLKvbdrWokcJYq
+DoCkKvbdMowqVnHT
+EPCkKvbdqqtjnKaN
+DoDLKvbdiCPDFWqR
+DoDLKvbdeJiqutzn
+EObkKvbdqcdiPmvB
+EPCjjvbdMgComQUk
+DoDLKvbduVnYKQsA
+DnbjjvbdjhHLfFmk
+EOcKjvbdVvhwvEEg
+DnbkKvbdZtIhyESn
+DncLKvbdznopeClY
+EPCkKvbdwtldqZLn
+EOcKjvbdeEnrBwDK
+DoCkKvbdkxrqsZHU
+DoDKjvbdijGHimYS
+DncLKvbdfNGWgMjL
+EOcKjvbdmbKWxOnV
+EPCkKvbdhtzEvrVC
+DoDLKvbdhfibyWJu
+DoCkKvbdXrkaMsoY
+DoCkKvbdzoPpdbkx
+EPDLKvbdSLYeuGjs
+EOcLKvbdqlyixlIJ
+EObjjvbdnVVZjiqf
+EOcLKvbdyNrhXriD
+DoCjjvbdRjyFtgLT
+EOcLKvbdkyTRryHU
+EPCjjvbdrykpTBIO
+EObjjvbdlqxtzSdJ
+EObjjvbdcarmSATm
+EOcKjvbdXsLaNToY
+EOcKjvbdlqxtysDi
+EOcLKvbdaMkCStmH
+DncKjvbdbAvFGPow
+EPDLKvbdTulQKTaR
+DncKjvbdXGYzUAOs
+DncKjvbdezuxeItX
+DnbkKvbdrykpTBIO
+DoCkKvbdxnShXsIc
+DoDLKvbdEPCjkXCd
+DnbkKvbdIxUBgkpp
+DnbkKvbdBiKbKhfK
+DoDKjvbdKNADygVB
+EObjjvbdADRxKZiQ
+EPCjjvbdMfcQMotk
+EObjjvbdSBcdkhxk
+EPDKjvbdNrtVgFVQ
+EPDKjvbdZMRdTnLm
+EObkKvbdehKvRnQg
+DoCkKvbdliETptqa
+DoDLKvbdEXwktUUM
+EObjjvbdBiLBjiFj
+EOcLKvbdRkYeuGjs
+EOcKjvbdmttzKjRf
+EObkKvbdxrmhmRbH
+DnbkKvbdyXiJaoyk
+EObkKvbdxmrgwsIc
+DoDLKvbdiZtfMQmf
+DnbkKvbdpxoHfpcx
+EObjjvbduaEZTOdh
+EObkKvbdqqtkNkAm
+DoDKjvbdxmrgxTIc
+DncLKvbdMgColpVL
+EPCkKvbdZnnJEeZj
+EPCjjvbdVYgszKoO
+EPCkKvbdBcpAuilf
+EObkKvbdlhdUQuSB
+EObkKvbdMIbLpxAS
+EPCjjvbdnVUyjirG
+DoDKjvbdKRZeOenF
+DnbjjvbduCbuXWPP
+DnbjjvbdssRsYydc
+EPCkKvbdlhctQtqa
+DoCkKvbdsQVoJcVf
+EObjjvbdegkWSNpg
+DoDLKvbdOAJTUKSA
+DoDLKvbdliEURVSB
+DoDKjvbdxsNhlqbH
+DnbjjvbdOSsvGdtp
+EPDKjvbdaaVeGPow
+EObjjvbdNeETiIjd
+DnbkKvbdJKEAJpHE
+EPCjjvbdANIYsWzY
+DoCjjvbdjvWmdCXw
+EPDKjvbdrouoJcVf
+DnbjjvbdiUzFWquC
+DnbjjvbdFxtuBEYC
+DnbjjvbdRkYfVHLT
+EObjjvbdQwNccMID
+DoCjjvbdXsMAmTnx
+DoCjjvbdjJfIKMxS
+EOcLKvbdbiMikGXY
+DoCjjvbdQdDAoqES
+EPCkKvbdVwIxVcdg
+EOcLKvbdCEQAvKMf
+EPDLKvbdzROmJKXA
+EPDLKvbdZLrDsnLm
+DncKjvbdjggMGFmk
+DnbkKvbdddnrBvcK
+DnbjjvbdpecdsvBI
+EPCkKvbdijFgjNYS
+EOcLKvbdUaBqTQqy
+DncKjvbdkHgMFfNk
+EObkKvbdZGvdAPSi
+DnbjjvbdqUTgSRjt
+DoDLKvbdqvpLcIyR
+DncLKvbdLqvlytpz
+DnbkKvbdKDJbpjCx
+DoCjjvbdlqyUyrci
+DnbkKvbdUQqPUuIN
+EObkKvbdTlVnaVni
+EOcLKvbdNdcshiLE
+EObkKvbdkDMLRHUg
+DncKjvbdIxTbILpp
+EPCkKvbdePFTKssr
+DnbjjvbddeOrCWcK
+DnbkKvbdatbGxLTh
+EObkKvbdqlzKZLgi
+EPCjjvbdOTUVgFUp
+EOcLKvbdpfEFTvAh
+DncLKvbdZnnIdeZj
+EObkKvbdZxdKODLr
+DoDKjvbdjggLfGNk
+EPCjjvbdRDcAopdS
+DncKjvbdlZTRryHU
+DncKjvbdZshiYdSn
+EPDKjvbdatbHYLTh
+EPDKjvbdLAjfmCXq
+EPDKjvbdOFEUIiLE
+DncKjvbdxVNFQxlO
+DoCjjvbdrafNLfkZ
+DoCjjvbdGFiqnJTq
+EPCkKvbdUsmUFlWK
+EObkKvbdLBLHMbXq
+EPCkKvbdtlYWaUBX
+EPCjjvbdSPsfjGEX
+EObjjvbdIjEAJogE
+DoDLKvbdNHCpNQUk
+DncLKvbdYkqdUNkm
+DoCjjvbdqquKmkBN
+DnbjjvbdEuyQQMjF
+EOcKjvbdURRPUthN
+EObjjvbdmoyxvLYb
+EObkKvbdGYtuAdYC
+DnbjjvbdZeYGzhJC
+DoDLKvbdCgLfHAzc
+DoDLKvbdhuZeXSUb
+DoCkKvbdjlbMZdgP
+DoCkKvbdemGWgMjL
+EPCkKvbdxxJJaoyk
+EPDLKvbdqGEEsuaI
+EObkKvbdEKHjVwjA
+EOcKjvbdiBoDFWpq
+EPCkKvbdffLzNfgA
+EObjjvbdDoCjkXDE
+EPDKjvbdhficZWJu
+DoCjjvbdWWiYVdFH
+EPCkKvbdKQzFOenF
+DoCkKvbdmbJvxPOV
+DnbkKvbdtAHQhAAr
+EPDLKvbdmSYtzSci
+EPDLKvbddeOqavcK
+DoCjjvbdCEQBVjMf
+EPDLKvbdlYrqsYft
+DnbkKvbdJSyBTNXl
+EPCjjvbdcbSmSATm
+DoDKjvbdfNFwGmJk
+DoCkKvbdGLErbhNV
+EObkKvbdiZuFlQnG
+DnbjjvbdxUmEpxlO
+EPDKjvbdUWMPitBR
+EPDKjvbdrafNLfjy
+EPDLKvbdrWolDJZR
+EObjjvbdhbPDFXQq
+DncLKvbdqrUkNjaN
+DnbkKvbdBiLCKhej
+DoDKjvbdSCEFMIxk
+DoDLKvbdffLzNgHA
+EPCkKvbdZLqcsmkm
+DnbkKvbdZMSEUOMN
+DnbjjvbdzaAPHHCM
+DnbjjvbdCIkBjhfK
+DoCkKvbdZirgpHBf
+DnbjjvbdIwtBhLpp
+EObkKvbdeOeTLUTr
+EObkKvbdUxgszLPO
+EObkKvbdhzVGLqOG
+DnbjjvbdOTTufdtp
+EOcKjvbdZRNEhleR
+EPCjjvbdKyRKSzuG
+DoCkKvbdZtJJYcsO
+EOcLKvbdemGXGmKL
+EPDKjvbdJXsahMQp
+DoDLKvbdhbObeWqR
+EObjjvbdFVxpPljF
+EOcKjvbdaNLBruMg
+DoCjjvbdpyPIGpcx
+EOcLKvbdZMRcsmkm
+EOcLKvbdnGeXmNgZ
+DoDLKvbdjlalZeGo
+DoDLKvbdaSGDHtGL
+EPCkKvbdCTAbsewS
+EPCjjvbdZjSgofbG
+DnbjjvbdJutecdfi
+EPCkKvbdIryBSmYM
+DoCjjvbdfekzOHHA
+DnbkKvbdREDAoqES
+EPCjjvbdtTSTYzEc
+EPCkKvbdmoyyVkYb
+EObkKvbdmfdxMnGy
+DoCkKvbdwuNFQxkn
+DncKjvbdsBelkfjy
+EPDLKvbdQvmdDLhD
+EPDKjvbdBhkCLJFj
+DoCkKvbdeJiqutzn
+EOcLKvbdqTsfrSKt
+DoDLKvbdakLfOmcA
+DncKjvbdKaLHMawq
+EPCkKvbdznopdcMY
+DoDKjvbdZtJIyDsO
+DoDLKvbdsQVnjCvG
+DncKjvbduDDUvuno
+DoCkKvbdJYUCHlQp
+DnbkKvbdnBiwYPNu
+EObjjvbdlYrqryHU
+EPCjjvbdqcdiPnWB
+DoCjjvbdUQpoUthN
+EPDKjvbdsZlQTAhO
+EOcKjvbdtbbtwWOo
+EPDLKvbdJuuGDdgJ
+EOcKjvbdjggMGGOL
+EPDLKvbdHffyxwxH
+EOcLKvbdSCEElIxk
+EObkKvbdIwsbHkqQ
+EPDLKvbdjbkjqHUg
+DnbjjvbdnQZxujxb
+EPDKjvbddePRbWbj
+DoCkKvbdhtydwRuC
+DoDKjvbdCDoaWKMf
+EOcKjvbdRjyGVGjs
+EObjjvbddCTNSATm
+EOcKjvbdZLrETmlN
+EPDKjvbdlrZUysDi
+EOcLKvbdwtmFRZMO
+EPCjjvbdtTRrxydc
+EObjjvbdeFPSBvcK
+DoCkKvbdwuNFRZLn
+DnbjjvbdhytfLpmf
+EPCkKvbdrykpTAgn
+EObkKvbdRDcApRDr
+DoCjjvbdZnnIeFZj
+EOcLKvbdePErkUTr
+DoDLKvbdrbGNLgLZ
+EObjjvbdVZIUZjoO
+DncLKvbdzHYlAMeX
+DnbkKvbdbsDLTcia
+EPCjjvbdOSsufdtp
+DncKjvbdpstHSSLU
+DncKjvbduDDVWuoP
+EPDKjvbdiMEdNuCy
+EOcKjvbdtbcVWuno
+DoDKjvbdqUTgRqjt
+DncLKvbdZyDjNcLr
+DoDLKvbdRWmdDLgc
+DncKjvbdZLqdUOMN
+DoDKjvbdijGIJlwr
+EObjjvbduMYXBUAw
+DoCkKvbdHDkWJajK
+DoCjjvbdRpTfifEX
+DoCjjvbdUyHszKnn
+EPDKjvbdqZPIGpdY
+EPDKjvbdRWmdCkhD
+EObkKvbdsrrSyZdc
+EOcKjvbdYlSDtNlN
+DncKjvbdbKkennDA
+EPCkKvbdiZuGMQmf
+EPCkKvbdEztQeLbi
+EPCkKvbdaRebgsfL
+DoCkKvbdBcpAuilf
+EOcKjvbdyNsIYShc
+EPCjjvbdcIlijewY
+DoCjjvbdmbKXXoOV
+DncLKvbduDCtwWPP
+EPDKjvbdnCJwXoOV
+EPCjjvbdjcLkQgUg
+DnbkKvbdtcCtwVno
+DncKjvbdGFjRmiUR
+DncLKvbdrWpLcJYq
+DncLKvbdKWVGDdfi
+EPCkKvbdnUuZkJrG
+EPCjjvbdiCPCeWqR
+DncKjvbdEYYMUUTl
+EObjjvbdrpWOicWG
+DoDKjvbdFejSOIsq
+DnbjjvbdqiAJdmOe
+EOcKjvbdUyITzKnn
+DoDKjvbdfMfWgMjL
+DnbkKvbdXrkaMtOx
+DoCkKvbdKefIBaRV
+EPCjjvbdyTNhlqbH
+EPCjjvbdtlXwBUAw
+EOcKjvbdRosfjFdX
+DoCjjvbdYpldiMeR
+DnbjjvbdwzIFexFS
+DncKjvbdSCDeLhyL
+DncLKvbdrzLpSaHn
+DncKjvbduCcVWuoP
+DoDLKvbdatagXkTh
+DnbkKvbdsCGMlGkZ
+EPCkKvbdkWXNdBww
+DncKjvbdJcKCpjCx
+EOcKjvbdNxPVzdNt
+EPCkKvbdKRZeOfOF
+DncLKvbdcIljLGXY
+EPDLKvbdVhXuwfxz
+DoCjjvbdaoffckzd
+EOcKjvbdLhbLpxAS
+DnbjjvbdnHExMmgZ
+EObjjvbdbhljKfXY
+DnbjjvbdkDLkRGuH
+EPDLKvbdfHkWSORH
+EObjjvbdzoPqFClY
+DncKjvbdznopdbkx
+EObjjvbdnUtzLKRf
+EPCkKvbdZQldiMeR
+DoDKjvbdFjeScHmV
+EPDKjvbdEOcLKwCd
+EPDKjvbdyqOmJKXA
+EOcKjvbdSQTfiecw
+DoDLKvbdDoDLLXDE
+DoDKjvbdhlEcmuDZ
+EObjjvbdfHkWRmqH
+DnbkKvbdIGfzYwwg
+DncLKvbdUWMPjUAq
+EPDKjvbdkHflGGOL
+DnbkKvbdnPzZVjyC
+EPDLKvbdSBceLiYk
+DncLKvbdUtMsfLvK
+DnbkKvbdbrcLTdJa
+EObkKvbdIwtCHkqQ
+EPDKjvbdtbcVWvPP
+EObkKvbdtbcVWuoP
+DoDKjvbdKVtfEFGi
+EPCjjvbdMRvlytpz
+DoDLKvbdwuMeRYlO
+EOcKjvbdlhdTqVRa
+EPDKjvbdiGjCyVjV
+DnbjjvbdrDeJQNua
+DoDKjvbdrbFmMHKy
+EOcKjvbdfHjurNpg
+DnbkKvbdZRNFJMeR
+EOcKjvbdqFdEsvBI
+DnbjjvbdZirgogCG
+DoDLKvbdDncKjwDE
+DoCkKvbdjhGlFfOL
+EObjjvbdmaivxOnV
+EObkKvbdKkAhWAJy
+EOcKjvbdNrtWHEuQ
+DnbkKvbdFkFTChMu
+EObkKvbdeOdrjstS
+EOcKjvbdIwsbHlQp
+DoCkKvbdeATpmXif
+EOcLKvbdKaKgMaxR
+EObkKvbdUGznLvvF
+DnbkKvbdbLMGPODA
+EObjjvbdTkvOaVoJ
+EOcKjvbdsQVoKDVf
+EPDKjvbdznopdcLx
+DoDLKvbdpfDdsvAh
+DncKjvbdrDdhpNua
+EOcLKvbdhficZVjV
+DncKjvbdFxuVBEYC
+EPDKjvbdzjVQQETU
+EObkKvbdKRZePGNe
+EObjjvbdDncLLXDE
+EOcLKvbdYkqctNkm
+DoDKjvbdtvOYKRTA
+DoCkKvbdmajWxPNu
+DncKjvbdIjEAJofd
+EPCkKvbdiCPDFWqR
+EOcLKvbdIHHZxwwg
+EOcKjvbdYpmEiNFR
+EOcLKvbdQmYCZNtz
+EOcLKvbdVYhTykPO
+EPCkKvbdJKEAKPfd
+DoCjjvbdRkYfUfjs
+EPDLKvbdlZTSTZGt
+DoDLKvbdNGbpNQVL
+DoCjjvbdvAdZTOdh
+EPCjjvbdliDsqUqa
+EPDKjvbdSPsfiecw
+EOcKjvbdYlRcsmkm
+DnbkKvbdwXMAvBVu
+EPCkKvbdRjxfVGjs
+EOcLKvbdCIkCKiFj
+DoCkKvbddxZssrFz
+EOcKjvbdREDApRES
+EOcLKvbdTpqPVVIN
+EObjjvbdaaWEeoow
+EOcKjvbddeOrCXCj
+EOcLKvbdAMgySvyx
+EPDLKvbdNPwqVnHT
+EObkKvbdwuMeRYlO
+DoCkKvbdTkuoAuoJ
+EPDKjvbdmJDspuRa
+EPCjjvbdNHCpNQVL
+DncKjvbdGcjvKBij
+EOcKjvbdbQHHELzd
+EPDKjvbdPxmAGrqj
+EPCjjvbdRbDdkiYk
+EPDLKvbdTAFJHand
+DoDKjvbdqmZjZMHi
+EObjjvbdtSrTYzFD
+DncLKvbdhlEcmtby
+EObjjvbdmJEUQuSB
+DncKjvbddndsKstS
+EPDLKvbdmgFYNOGy
+DnbjjvbdSCEElIyL
+DncKjvbdmaivxOmu
+DoDKjvbdFVyPomKF
+DnbkKvbdMpXqWOHT
+EObjjvbdKefICBRV
+EObjjvbdqGDdtWBI
+DnbkKvbdCJLCLIfK
+EObkKvbdLqwNZtpz
+DoDLKvbdiifHjMwr
+DoCkKvbdddoRawDK
+DncKjvbdbrcKscjB
+DnbjjvbdrSVLNkAm
+DnbjjvbdffLynHHA
+EObkKvbdTAFJHbPE
+DncKjvbdDncKkWcE
+EOcLKvbdrouoKDVf
+EOcLKvbdZisIPfbG
+EOcLKvbdiGicYuiu
+DoDLKvbdVgxWXfxz
+DoCkKvbdffMZmgHA
+EObjjvbdWfZZtAPT
+EPDLKvbdEzsqElCi
+DoCkKvbdYSlAlsoY
+EPDLKvbdFWYpPmKF
+DoDKjvbdkNCMZdfo
+EPDLKvbdehLWSOQg
+DnbjjvbdxxJKCPyk
+EOcLKvbdMfcQMpVL
+EOcLKvbdnVVZkKRf
+EObjjvbdczYoxZQb
+EPCkKvbdSQUGiedX
+DoDKjvbdeuzwpJzs
+DoDLKvbdqZPHfqDx
+DoCjjvbdKeehCBQu
+DnbkKvbdADSYJyiQ
+DoCjjvbdFkFTDHlu
+EPDKjvbdZoOJEdzK
+EPCjjvbdZjTIQGbG
+DncKjvbdZHWdAOri
+EPCjjvbdeXystRez
+EObkKvbdIxTagkpp
+EObjjvbdxZgfFxEr
+DoDLKvbdjhHLfGNk
+EObkKvbdTfznMWue
+DoDLKvbdOSsufeVQ
+DncKjvbdVUNTelWK
+EPCjjvbdZQmFImEq
+DnbjjvbdkClLQftg
+DnbjjvbdRXNdDLhD
+DncKjvbdTqQoVUgm
+EPCjjvbdNQYRVmgT
+DoDLKvbdnUuZjiqf
+DoDKjvbdbsCjsdJa
+EOcKjvbdFkEsDINV
+DoDKjvbdyOTHxSiD
+EOcKjvbdkMbMZdgP
+DnbkKvbdeEnqavcK
+DoCkKvbdxZhFfYEr
+DncKjvbdNPxQunGs
+EOcLKvbdOYOuzdNt
+DncKjvbdJbicRKDY
+DncKjvbdjAQHAofj
+EOcKjvbdWWiYVcdg
+DnbjjvbdjFKftoAO
+EPCkKvbdTXkLmzjx
+EPCkKvbdWSNxBeMD
+DoCkKvbduMXwBTaX
+DoDLKvbdLBKfmBxR
+DoCjjvbdEObjjwDE
+EPDKjvbdTlVnaVoJ
+DoDLKvbdhgJcZViu
+EObjjvbdatbHXjtI
+EOcLKvbdZeXfzgiC
+EPCkKvbdeFPRbXCj
+EPCkKvbdZQleJMdq
+DnbjjvbdUWLojUAq
+EPCjjvbdFaOpyJzm
+DnbkKvbdANIYrwZx
+EPCkKvbdbBWEeopX
+DoDLKvbdczYpYYpb
+EPCkKvbdbVBfxLTh
+DoDKjvbdLBKflawq
+DoCkKvbdyOSgxSiD
+EPDKjvbdkDLkQgVH
+EObkKvbdjmBlZdfo
+EPDKjvbduoTzqLOt
+EOcLKvbdaRebhUFk
+EPDKjvbdatbGwjtI
+EOcLKvbdCIjbLIfK
+DncKjvbdkIGkeemk
+DncKjvbdxVMeRZMO
+EOcKjvbdRXODcMHc
+DnbjjvbdqquLOLAm
+DoDKjvbdDHLfHAzc
+DoCkKvbdnVVZkKRf
+DoDLKvbdGcjvJbKK
+DoCjjvbdzoQRFDLx
+DoDLKvbdmuUzLKRf
+EPDLKvbdtumwiqTA
+EOcKjvbdmJDsptrB
+EPCjjvbdIGgZxwwg
+EPDLKvbdxLXDgzzG
+DnbkKvbdQwNdCkhD
+DnbjjvbdcasNSAUN
+EPCkKvbdTulQKTaR
+EOcKjvbdhgJbyVjV
+DoDLKvbdKVteceHJ
+DnbjjvbdHgGzYwxH
+EPCjjvbdxnSgxTJD
+EPDKjvbdyYJKCPzL
+EOcKjvbdOFDtJJKd
+EObkKvbdRadEkhxk
+DoCkKvbdiifHjNXr
+DoCjjvbdnUtyjirG
+EObkKvbdJpydoGNe
+DoDKjvbdZLqctOLm
+DnbkKvbdsBfMkfkZ
+EOcLKvbdOStWGeVQ
+EPDLKvbdijGIJmYS
+DoDLKvbdxxJJbQZk
+DncKjvbdHbLydzAD
+EOcLKvbdyTNiMqag
+EPDKjvbdMgComQVL
+DoDLKvbdzitoocsU
+EPDKjvbdsBfMkfjy
+DoCkKvbdFyUtaEYC
+DoDLKvbdJKEAJpGd
+DoCkKvbdygZMAMeX
+EPCkKvbdJqZdoFnF
+DnbkKvbdiBnbdvqR
+EOcLKvbdSQUGjFdX
+DnbkKvbdmSYtzTEJ
+DoCjjvbdehKvSOQg
+EOcLKvbdGckVibJj
+DncKjvbdhficYvJu
+EPDKjvbdwuMeRYkn
+EOcLKvbdFejSNiUR
+EPCjjvbdOFEUJJLE
+DnbkKvbdXsLaMtOx
+EPDKjvbddZyPxYpb
+EPCkKvbdhzVFkqNf
+DoDKjvbdOEdUIiLE
+EPCkKvbdnGeXmOHZ
+EObkKvbdiMEdNuCy
+DoDLKvbddoFTLTtS
+EObkKvbdIxTbHlQp
+DncLKvbdZRMdhmEq
+DoDLKvbdZnmheEyj
+EPDKjvbdKeegbApu
+DncLKvbdNVTSLNAX
+EOcKjvbdKDJbqKCx
+EPCjjvbdFfKSOIsq
+EPCjjvbdxnShYSiD
+EOcLKvbdOStWHFVQ
+DncLKvbdsPvOicWG
+DnbjjvbdxnTHwsJD
+DoDKjvbdLAkGmBwq
+DoCkKvbdwMvAMceN
+EOcLKvbdmRyVZsDi
+EPCkKvbdmpZyWKyC
+DoDLKvbdrykpTBIO
+DoCjjvbdVgwvYHYz
+EPDLKvbdTvMPjUBR
+EOcLKvbdgFkzOGgA
+DnbkKvbdVBBpsRRy
+DnbjjvbdRzKISbvA
+EObjjvbdxnTIXsJD
+EObjjvbdZoOJEdyj
+EPCjjvbdHDjuibKK
+EPCjjvbdezuxdiUX
+EOcKjvbdYTMAmToY
+EObjjvbdJYTbILpp
+DoDKjvbdkClLRHUg
+EPDKjvbdTkvPAvPJ
+EObkKvbdeAURNXjG
+DncLKvbdTukpKUBR
+DoCjjvbdcTDKsdJa
+DoDKjvbdBsAcUGXS
+EObjjvbdDoCjjvcE
+EOcKjvbdtlYWaTaX
+DnbjjvbdRDbaPpcr
+EPCjjvbdrylPsAgn
+DoCkKvbdOhAYZAYa
+DnbjjvbdiUydwSVC
+DoCjjvbdwzIFfYFS
+DoCkKvbdZshiZDrn
+DoCkKvbdZoOIddyj
+DncKjvbdpssgSSKt
+EPCjjvbdrSUkNkBN
+EPDKjvbdjJfIJlxS
+EOcLKvbdxVNFRYkn
+DoDKjvbdWWhwvEFH
+DncLKvbdRDcBQQcr
+DnbkKvbdliETpuRa
+EPCjjvbdZRMdiMeR
+DnbkKvbdiMEdOVCy
+EPCjjvbdznpREbkx
+DoCkKvbdwzIFexFS
+DnbjjvbdmSYuZrdJ
+DoDLKvbdCWzchdov
+EPDLKvbdpfEFTvAh
+EPDLKvbdyOTIYTIc
+DncKjvbdNQXqVnHT
+DoDLKvbdCgMFgAzc
+EOcKjvbdIwtBgkpp
+EPDKjvbdRjyGUfjs
+EObjjvbdACqwjZiQ
+DoDKjvbdpstGrSKt
+DnbkKvbdnGdwmOHZ
+DncKjvbdiZtfLpnG
+DoDLKvbdaSGCgtFk
+DoCkKvbdFfJqnIsq
+EPCkKvbdkNCLzEgP
+EOcKjvbdFeirOJTq
+EOcLKvbdUtNUGMWK
+EObkKvbdSQUHJfEX
+EPCkKvbdqquKmkBN
+DnbjjvbdbhmKKfXY
+DoCkKvbdIsYaTNXl
+DoCjjvbdZoNheFZj
+EOcLKvbdBhjbLIfK
+EOcKjvbdatafwjsh
+DoCjjvbdkxrrSyHU
+EPDLKvbdSCEElIxk
+EOcKjvbdfMevfmKL
+EPCjjvbdMJBlRYAS
+DoCjjvbdSxKkmzkY
+DnbkKvbdkNCLydgP
+EObkKvbdkxsSTZHU
+DoCjjvbdRpUGiedX
+EOcKjvbdjblLRGuH
+EObkKvbdyTNiMrCH
+DnbjjvbdZeXfzhJC
+DoDKjvbdZxdJmblS
+DncKjvbdOStWHEuQ
+DoCkKvbdyNsHwsIc
+EPDKjvbdkxrqryHU
+EObjjvbdZLqctNlN
+DoDLKvbdxnSgxShc
+EPDLKvbdnBjWwoNu
+DoDKjvbdkIHMGGOL
+EObjjvbdqUUGrRkU
+DncLKvbdRjyGVHKs
+EPDKjvbdhfjCyWJu
+EPCkKvbdHELVjBjK
+DncKjvbdgQBzvcwh
+DoDLKvbdVAaqSpqy
+DoCkKvbdySnJNSBg
+DoDLKvbdpeceUWAh
+DncLKvbdaRebgsfL
+EOcKjvbdZLqctNlN
+EObjjvbdtbbtvvPP
+DoCkKvbdZMSDtNlN
+EOcKjvbdsBelkfjy
+EPDLKvbdTpqPVVIN
+DnbjjvbdBiKbKhfK
+DnbjjvbdOFEUIiKd
+EPCkKvbdSiZjRAAl
+EObkKvbdwjwDgzyf
+EPCjjvbdhlEdNtby
+EPCjjvbdhtydwSUb
+EOcKjvbdnQZyVjyC
+DoDKjvbdRzKIScWA
+EOcLKvbdLBLHNCXq
+DoDLKvbdssSTYzFD
+EObjjvbdEvYpPlie
+DncLKvbdhficYvKV
+EPCjjvbdnUuZkJqf
+DnbjjvbdXnRAXtut
+EPDKjvbddijRutzn
+EOcLKvbdEvYpPljF
+DoCjjvbdTulQKUAq
+EObkKvbdxmsIYShc
+EPDLKvbdkyTRryHU
+EObjjvbdCEQAvKNG
+EObjjvbdGYuVBEYC
+EPDKjvbdvAdYsOeI
+EObjjvbdRpUHKGEX
+EPCkKvbdKDJcQjDY
+DoDLKvbdunszqKoU
+DoCjjvbdJvUfEEfi
+DncLKvbdrpWPJcWG
+DoCkKvbdajkfPNcA
+DnbjjvbdFpATXHFy
+EObkKvbdFfJrOJTq
+DncLKvbdZnnJFEyj
+DoCjjvbdOEctIiKd
+EPDLKvbdVhXuxGxz
+EPDKjvbdySmhlrCH
+EOcKjvbdiGjDZWJu
+DncKjvbddZyQYZRC
+DncLKvbdziuPpETU
+DncLKvbdJTYaTNXl
+EPCjjvbdNddThiKd
+DnbkKvbdbAudepPw
+EOcKjvbdMowpunHT
+DoDLKvbdmbKXYPNu
+DoDLKvbdezvZEiTw
+DnbjjvbdrMyixkgi
+DnbkKvbdKWVGEFGi
+DoCjjvbdkDLjpftg
+DnbjjvbdJqZePFme
+EObkKvbdDwxLsssl
+EPCjjvbdmoyyWLYb
+EPCkKvbdFjdrcHmV
+DoCkKvbdDwxLtTsl
+EOcLKvbdoAKztHdO
+EPDLKvbdTkuoAuoJ
+DncLKvbdURRPVVHm
+EPCkKvbdKCicRJcY
+DoCkKvbduDCuXWOo
+DoCjjvbdRXNdDMID
+DoDKjvbdBcpBWJlf
+DoCjjvbdTqROttgm
+DncKjvbdRadFMIxk
+DoDLKvbdCSaDTewS
+EOcKjvbdQlxCYmtz
+DncLKvbdeOeSkUTr
+DnbkKvbdTqQntthN
+DnbjjvbdhbObdvpq
+EPDLKvbdMowqVmgT
+DncKjvbdANIZTWzY
+EPDLKvbdiVZeXRtb
+DncLKvbdYNqAXtvU
+EOcKjvbdfIKurNpg
+DoCkKvbdFpATWfey
+EPCjjvbdHkazmwRL
+DoDKjvbdJvUfDdgJ
+EPCkKvbdSBdElIxk
+DoCkKvbdbsCjtEJa
+DoDLKvbdvBEYsOdh
+EOcLKvbdGGJqmhsq
+EOcLKvbdJSyBSlxM
+DncLKvbdnQZxukZC
+EOcLKvbdySnIlrCH
+DoCjjvbdIjEAKPgE
+DoDLKvbdhlEcnVDZ
+EPDKjvbdZeYGzghb
+EPDKjvbdbKlGOnDA
+EPDKjvbdkMbMZdgP
+EOcLKvbdDoCkKwCd
+DnbjjvbdLBLGlbXq
+EPDLKvbdZxcinCkr
+DoCkKvbdqTsfrRjt
+DoCkKvbdADSYJzIp
+DoDKjvbdbUagYKsh
+EObjjvbdjAQHAofj
+EOcKjvbdDoDKkXDE
+EPDKjvbdSZigsCvA
+EPCkKvbdKRZePGOF
+EPCjjvbdKaKgNCXq
+EObkKvbdxxJKBoyk
+EOcKjvbdxmrgwsIc
+DnbkKvbdmozYvKyC
+DoCkKvbdqquLOLAm
+EObkKvbdDncLLXCd
+EPDLKvbdjcMKpftg
+EPCjjvbdwkXDgzzG
+DoDLKvbdHffyxwwg
+DoCkKvbdvAdZSneI
+EOcLKvbdrovOjDVf
+EOcLKvbdsPuoJbuf
+DoDLKvbdySnJNSBg
+EObkKvbdXsMAltOx
+DncLKvbdFfKSOJTq
+EPCkKvbdddnrCWcK
+DoCjjvbdySmhlrBg
+DnbjjvbdNxPVzcnU
+DncKjvbdhtzEvrVC
+DoCjjvbdQwODblHc
+DoDLKvbdjcLjpgVH
+EOcLKvbdbKlGOmcA
+EPDKjvbdfMfWflik
+DncKjvbdmbJwXnmu
+EOcLKvbdTkuoAvOi
+DnbjjvbdsZkoraIO
+DoDKjvbdZMSEUOLm
+EOcLKvbdsCFmLfkZ
+DncKjvbdUxhTyjnn
+EPDKjvbdRosfjGEX
+EOcLKvbdmuUzKirG
+EPCkKvbdGGJrOItR
+EObjjvbdEXwktUUM
+DnbkKvbdiifHimXr
+EPDKjvbdmJDspuSB
+EObjjvbdwyhGFwdr
+DncKjvbdatafwkUI
+EPDLKvbdYNqAXtut
+DoDLKvbdEPCkLWcE
+EOcLKvbdqceJQOWB
+EPDKjvbdySnJNSBg
+DnbjjvbdyzdnSIIh
+DoDKjvbdrDdiQNvB
+DoCkKvbdYkqdTnLm
+DoCkKvbdlZTSTYgU
+EPDKjvbdMpXqWNfs
+EObkKvbdJbicQjDY
+DoDLKvbdGAoRYizm
+DncKjvbdmgExNOHZ
+DoCjjvbdznoqFDLx
+EOcKjvbdieLGtoAO
+DoCjjvbdMfbpMotk
+EObkKvbdyzdnSHiI
+EObkKvbdcSbjscia
+DoDKjvbdNGcQNQUk
+EPDKjvbdNGbpMpVL
+DoDLKvbdUQqPVUgm
+DnbjjvbdVvhwuceH
+EPDKjvbdDxXkstTl
+EPCjjvbdPyNAHTRj
+EPDLKvbdeOdsLTtS
+DoDKjvbdTAEiICPE
+DoDKjvbdZisIQGaf
+EObkKvbdxVMdpxkn
+EPCkKvbdnUtzKjRf
+EOcKjvbdhtydvrVC
+DoDKjvbdbrcLTcia
+EPDLKvbdbhlikFvx
+EPDKjvbdANIZSwZx
+EPDKjvbdtbbuXWOo
+EObjjvbdliDtQtqa
+DncLKvbdGLFScIMu
+DnbkKvbdfMfXGljL
+EObkKvbdCTBDTewS
+EPDKjvbdSiZiqAAl
+EOcKjvbdFfKSNhsq
+EPCjjvbdyYJKBpZk
+DncKjvbdAMgyTWyx
+DnbkKvbdpaJFAXIE
+EOcKjvbdEYYMUUTl
+EPCjjvbdeFOrBvcK
+DoDLKvbdptUHSRkU
+DoCkKvbdOYPVzcnU
+DnbjjvbdijFhKMxS
+DnbkKvbdEKHivXjA
+DncLKvbdsPvOicVf
+DoCjjvbdmbJvxOmu
+EOcKjvbdDxYMUUTl
+DoDKjvbdZtIhxdTO
+DncKjvbdTlVoAuoJ
+DoDKjvbdFyUuBDwb
+EObkKvbdQYmAGsSK
+DnbkKvbduLwwAsaX
+EPDKjvbdegkWRmpg
+EPDLKvbdRDcAoqDr
+DoCjjvbdFWZPolie
+DoCkKvbdbhmJkGWx
+DncLKvbdrWpMDJYq
+DnbjjvbdaaWEeoow
+DoDLKvbdzHYlANFX
+DoCkKvbdjFLHUoAO
+DnbjjvbdZyEKNbkr
+DoDKjvbdLrXMyuQz
+EPDLKvbdwNWAMdFN
+DoCkKvbdkWXODaxX
+EOcKjvbdraelkgKy
+EOcLKvbdmSZVZsDi
+EPCjjvbdkMbLzEfo
+EObjjvbdaSFbgtFk
+EObkKvbdmIctRUqa
+DncKjvbdhtydvquC
+EPDKjvbdZoOJEeZj
+DoDLKvbdyXiJaozL
+EOcLKvbdVwIxWEFH
+DnbkKvbdYpmFJMdq
+EPDLKvbdjKGIKMwr
+EPCkKvbdFpASwHGZ
+DncKjvbdKQzEnfNe
+DoDLKvbdkVwODaxX
+EPCjjvbdzaAOffal
+EObjjvbdnHEwlnGy
+DncLKvbdLqwMyuQz
+EPCkKvbdWRnXaeMD
+DoCkKvbdcbSlrAUN
+EPDKjvbdMJBlRYAS
+EOcLKvbdZxcimbkr
+DncLKvbdCDpBVimG
+DoDKjvbdGdKvKBjK
+EPDLKvbdziuPodSt
+DnbkKvbdbrbjtEKB
+EOcLKvbdmIcsptqa
+EPDKjvbdMRwMyuQz
+DoDLKvbdfHkVrNqH
+DnbkKvbdLZRKSzuG
+EPDKjvbdTfzmkwWF
+EOcLKvbdSKxeuHLT
+EPDLKvbdkHgLfGNk
+DoDLKvbdVhXuxHYz
+EOcKjvbdkHgMGGOL
+DoDKjvbdEARhmZvw
+EPDLKvbdjKFgimXr
+EObkKvbdSQUGiecw
+EPCjjvbdjKFhJlxS
+DoDKjvbdDxXlTtUM
+EPDLKvbdelfWgMik
+EOcKjvbdtcDVXWOo
+DoDKjvbdiZuFlRNf
+DoCkKvbdsBellHKy
+EPCkKvbdjlbLyeGo
+EOcKjvbdhfibxujV
+EObjjvbdhyuGMROG
+DoDLKvbdgQBzvdYI
+DoDKjvbdeATpmXjG
+EPDLKvbdjKFgilxS
+DoDKjvbdrpWPJbuf
+DncLKvbdDncLKvcE
+DoCkKvbdkVvmdCXw
+DncLKvbdGcjujCJj
+DncLKvbdpxngfpcx
+DnbjjvbdiCPCdwQq
+EPDLKvbdijFhJlwr
+DncKjvbdhgJbxvKV
+EPCjjvbdZxcjNbkr
+DncKjvbdZQleJMdq
+DncLKvbdyfxlAMeX
+EPCjjvbdFfJrNiUR
+EPDLKvbdzjVQPdSt
+DoDLKvbdjAQHBPfj
+EObjjvbdZoOJFEzK
+EObkKvbdFpATWgGZ
+EPDKjvbdvAcxrneI
+DoDLKvbdxrnJMrCH
+DoCkKvbdjmCLydfo
+EPCkKvbdegjuqmqH
+DoCkKvbdSBdFLiZL
+EObkKvbdbAvFFopX
+DncLKvbdGQASwGey
+DnbkKvbdQccAopdS
+EPCkKvbdZshiYdSn
+EPCjjvbdHDjujCKK
+EObjjvbduDDVWuno
+DoCjjvbdzjVQQDsU
+EOcLKvbdeFOqavcK
+DoDLKvbdyXhibPzL
+DoDLKvbdrzMPsAgn
+EObkKvbdUtNTfMWK
+EOcLKvbdLqwNZuQz
+EPDKjvbdqBJFAXHd
+DoCkKvbdnUuZkKSG
+DoCjjvbdZHXEAOsJ
+DncKjvbdQdDBPpcr
+DnbkKvbdCIkBkIej
+DnbkKvbdMgDPmQUk
+DnbkKvbdxxIjCPyk
+DnbjjvbdZsiIxdSn
+DoCkKvbdADRxJzJQ
+EObjjvbdkxsSTZHU
+DncKjvbdWXIxVdEg
+DnbjjvbdLrWmZtpz
+EPDKjvbdhzUelQnG
+DoDLKvbdSBceLhxk
+EObjjvbdWIXvYGxz
+EPDKjvbdEYXktUUM
+EObkKvbdhlFENtby
+EPDLKvbdNwnuzcmt
+EOcKjvbdaaWEfPpX
+DncLKvbdddoSCWcK
+EPDKjvbdmaiwXnnV
+DoDLKvbdMgDQMpUk
+DoDLKvbdjFKfuPAO
+DncLKvbdnGeYMmfy
+DncLKvbdrSUjmkAm
+EOcLKvbdfHkWRnQg
+DnbjjvbdnCKWxPNu
+DnbjjvbdraemLgKy
+EObkKvbdWWiYWDdg
+DoCkKvbdKfFgaaQu
+EPCkKvbdaSFcIUGL
+EOcKjvbdkxrqryHU
+DncKjvbdRDbaQQcr
+DncLKvbdbVBgXjtI
+DoCjjvbdqZPHfqDx
+DnbkKvbdcyxowxpb
+EPCkKvbdWXIxWDeH
+DoCkKvbdyXiKBozL
+DnbkKvbdlZSrTYft
+EObjjvbdGdKujBij
+DnbjjvbdtcDVXWPP
+DoDKjvbdZnmhddyj
+EObkKvbdTukoisaR
+EObkKvbdzoPqFCkx
+DncLKvbdLhalQxAS
+EPCkKvbdVwIwudFH
+DoDKjvbdjKGIKNYS
+DoDLKvbdjhHLeenL
+EPDKjvbdJTZBSlxM
+DoCjjvbdFaOqZJzm
+DoDLKvbdnBjXXnnV
+DoCjjvbdeFPSCXDK
+EPCjjvbdbAvFGPow
+DnbkKvbdVwIwvEFH
+EObjjvbdqUTfrSLU
+DncKjvbdqlyixkhJ
+DoDKjvbdSLZFuGjs
+DncLKvbdsCGNLfkZ
+EPDLKvbdaofgDkzd
+DoCkKvbddiirWUzn
+EOcKjvbduCcVWuno
+DnbkKvbdSPsfjGDw
+DoCkKvbdFWYpQMie
+DoDLKvbdRECaQRES
+EPDLKvbdhfibyVjV
+DnbjjvbdqTsgSSLU
+EObkKvbdrXQMChyR
+DncLKvbdNrtVfduQ
+EObjjvbdiUzEvqtb
+DncKjvbdUaCQsRRy
+EPCjjvbdRbEEkiYk
+DncKjvbdUtNUGMVj
+EPCjjvbdzHYlAMeX
+EPCkKvbdeEoRbXCj
+DoDLKvbdcScLUDia
+DoDLKvbdtbbuWuno
+EOcKjvbdbUafwkTh
+DoCjjvbdtcDVXWOo
+EOcKjvbdHgGyxxYH
+EOcLKvbdWSOXbEkc
+DoCkKvbdKeehCBRV
+DncLKvbdMgComQVL
+DoDKjvbdUMVoBVoJ
+DoCjjvbdzoQRFCkx
+DoCkKvbdUWMQJsaR
+DnbjjvbdkNCLydgP
+EOcKjvbdmozYvKyC
+DnbkKvbdmgExMnGy
+DncKjvbdznpQeDMY
+DoDKjvbdZxcjNbkr
+EOcKjvbdqdEiQNua
+EPDLKvbdfHkVrNpg
+DnbkKvbdXsMBMsoY
+EObkKvbdcJNKLGXY
+EPDLKvbdVqmwbEkc
+EPCkKvbdJcJbpibx
+EObjjvbdYNqAXtvU
+EObkKvbdjAQHApGj
+EPDKjvbdrbFmMHLZ
+DnbkKvbdPIAXyAYa
+DoDKjvbdSLZGVHLT
+DoCkKvbdDnbkLWcE
+DncKjvbdzoPpeDMY
+EPDKjvbdQwNdDLhD
+EPDKjvbdhfjCxuiu
+DoCjjvbdajkenmcA
+EPDKjvbdtTSTYyeD
+DoCjjvbdijFhKMwr
+DoDLKvbdpfDeTuaI
+EPCjjvbdJXtCHlQp
+EOcKjvbdjbkkRGuH
+EObkKvbdVTlselWK
+DoCkKvbdauCHXkTh
+DnbjjvbdSLZGVGjs
+DoDLKvbdehLWRmqH
+DncKjvbdSBdFLhyL
+DoDLKvbdmajXYPOV
+EOcKjvbdpeceTvAh
+EPCjjvbdNdctIhkE
+EOcLKvbduWNwjQsA
+DoCjjvbdtvOYKRTA
+DncKjvbdqiAJeNOe
+DnbjjvbdUtNUGLvK
+EPDKjvbdMgColotk
+EOcKjvbdQlxCZNtz
+DoDKjvbdmfdwmNfy
+EPDKjvbdrovPKDVf
+DnbjjvbdDjIJuwjA
+EPCjjvbdsBfNMHLZ
+DoCjjvbdJbjDRJcY
+EPDLKvbdZRMeJNEq
+EPCkKvbdRkYfVGkT
+DncLKvbdRbDeLiYk
+EPCjjvbdqiAJdloF
+DoCjjvbdFyVUaDwb
+DoCjjvbdMRvmZtpz
+DoDLKvbdGQATWffZ
+EPCjjvbdwtmFQyMO
+EOcKjvbdTIzKRAAl
+DoCkKvbdsQVnicVf
+DoDLKvbdFfKRmhtR
+EOcKjvbdsCFmLfjy
+DoDKjvbdddnqbXDK
+DoDKjvbdYgWdAOri
+DoCkKvbdmuUyjjSG
+EObkKvbdhficYvJu
+DoCkKvbdQlxCZNtz
+EPCkKvbdGZVUaEXb
+DncLKvbdEXxMTtTl
+DoDKjvbdGFirNiUR
+EPCjjvbdpssgRrLU
+EObkKvbdVZHsykOn
+DncKjvbdyTOJMrBg
+EOcKjvbdRacdlIyL
+EObkKvbdiCOcFWqR
+DoDLKvbdRjxfVGkT
+EOcLKvbdiBncFXQq
+DncLKvbdnQZxukYb
+DoDKjvbdpaIeAWgd
+DncKjvbdVqnYCEkc
+DnbjjvbdZRMdhmEq
+EPCjjvbdhgKDYuiu
+EOcLKvbdCIkBjhfK
+EPCkKvbdZnmhdeZj
+EOcKjvbdTppnuUhN
+EOcLKvbdbVBfxKsh
+EPDKjvbdFVxpQNKF
+DnbjjvbdjvWnDaxX
+EObjjvbdANIYrwZx
+EObjjvbdauCHXjtI
+EObkKvbdZirgpGaf
+EObjjvbduoTzqLPU
+DoDLKvbdxZhFeweS
+DoCjjvbdILaznWqL
+DncLKvbdaMkBrtlg
+EObjjvbdNrtVgFUp
+DnbkKvbdRzKHsCvA
+DoCkKvbdiZuFkpnG
+DnbkKvbdEztRElDJ
+EPCjjvbdRECaQQdS
+EPCjjvbdqqtkNkAm
+EObkKvbdyNrhXriD
+DoDLKvbdegkWRmqH
+DncKjvbdNQXqWNfs
+DoDLKvbdRadFLhxk
+EPDKjvbdxUmFQyLn
+EPCjjvbdxxJKBoyk
+EObkKvbdnVUzLJqf
+DnbjjvbdSQUGiedX
+DncLKvbdrpVnjCvG
+DoDKjvbdZirgpGbG
+DncKjvbdOAJTUJrA
+DnbjjvbdUyHsyjoO
+EPDKjvbdfpBzvdXh
+EPCjjvbdyTNhlqag
+DncKjvbdLBKflaxR
+DoCjjvbdVwJXvEEg
+EOcKjvbdVqnXadlD
+DoDKjvbdyNrgxSiD
+EObjjvbdnVVZjjRf
+DnbjjvbdFeiqmiTq
+EObkKvbdFVxpQMie
+DnbkKvbdIBkydzAD
+EPCkKvbdZjTHofaf
+DncLKvbdnPzYukZC
+EObkKvbdLYqKSzuG
+Dnbjjvbdxmrgwrhc
+EObkKvbdTkuoBWOi
+EObkKvbdIrxaSlxM
+EOcLKvbdJqZeOfOF
+DoCjjvbdBhjbKiFj
+EPCkKvbdrDeJPnVa
+EPCkKvbdNwoVzcnU
+EOcLKvbdXmqAYVWU
+EPCkKvbdZeYGzhJC
+EOcKjvbdNddUIhjd
+DoDKjvbdjggLeemk
+EObkKvbdxZgefXeS
+EOcKjvbdgFkzOGgA
+EObkKvbdNdcsiIkE
+EPDKjvbdbiMikFwY
+EPDKjvbdelfWfmJk
+EOcKjvbdHELWJajK
+DoDLKvbdZRMeIldq
+EOcLKvbdRXNccMHc
+EPCkKvbdQlxCZNtz
+DoCkKvbdyTOJMqag
+EPDLKvbdCTAcTevr
+EOcKjvbdrpVnicWG
+DnbkKvbdZLrETmkm
+EOcLKvbdRpTfifEX
+DnbjjvbdQcbaPqDr
+DoCkKvbdEuxpQNKF
+EPCjjvbdNeEThiKd
+EPDKjvbdVYgtZjoO
+DoCjjvbdZRMdhleR
+DoCjjvbdZsiIyDrn
+EPDLKvbdaSGCgtGL
+EPDLKvbdqTtGqrKt
+DoCkKvbdnVUzKjSG
+EPCjjvbdzQoMiJwA
+EPDKjvbdXrlBMtOx
+DoCjjvbdNHColpVL
+EObkKvbdXnRAXuVt
+EObjjvbdMJCMQxAS
+EObkKvbdIrxaTMxM
+DnbjjvbdbAudfQQX
+DnbkKvbdnCKXYOmu
+DoDKjvbdEXxMUUTl
+EObkKvbdyXhiaozL
+EObjjvbdEJhKVwjA
+EOcKjvbdpfEFTuaI
+EOcKjvbdbVCHYLTh
+DncLKvbdyqOliJwA
+EOcKjvbdkxrqsZHU
+DncKjvbdDjHjVwjA
+EPCkKvbdkDMLQfuH
+EPCjjvbdUVlPjUBR
+DoDLKvbdjJfHimXr
+DoCkKvbdEuxooljF
+DoDLKvbdYzcGRjWZ
+DoDKjvbdwyhGGYFS
+DnbkKvbdsrrSxyeD
+EPCkKvbdxmrhXrhc
+EPDKjvbdDjHivXjA
+EObkKvbdfMfXGlik
+EPDLKvbdGdKvKBij
+DoCkKvbdbLMGOmcA
+EPCkKvbdRXNdDLgc
+EPCjjvbdZsiIxcrn
+DoDKjvbdpyPIGqEY
+EPDKjvbdlZTRryHU
+DoDKjvbdUslsekvK
+DncKjvbdKfFhCBQu
+DncLKvbdSCDeMIyL
+EPDKjvbdJcJcRJcY
+DoDLKvbdraellHLZ
+EPCjjvbduDCtwWPP
+DnbkKvbdBdPaWJlf
+EPCkKvbdqFceUVaI
+DnbkKvbdcyxoxYqC
+DnbkKvbdlYsSTYft
+EObjjvbdZHXEAOsJ
+EObjjvbdURROtuHm
+EPCjjvbdZLrDsnMN
+EPCjjvbdfIKvRmpg
+EPDLKvbdwWlBVaVu
+EObkKvbdZMSDsmkm
+EPDKjvbdKNAEZfuB
+DnbjjvbdhyuGMROG
+EObjjvbdJuuGDdgJ
+EPDLKvbdgQBzwDxI
+EObjjvbdjvXNdCXw
+EPCjjvbdlZSrSyGt
+DoDKjvbdXsLaMsnx
+DoDLKvbdTlVoAuoJ
+DnbkKvbdptUGrSLU
+EObkKvbdEztRFMCi
+EOcLKvbdTkvOaVoJ
+EObkKvbdDoCjjwCd
+EPCkKvbdTfznLwVe
+EObkKvbdRjyGUfjs
+EPDKjvbdVviXvEFH
+DnbjjvbdKkBIWAKZ
+EOcLKvbdqFdFUVaI
+EOcLKvbdBhjakJFj
+DncKjvbdauBgYKsh
+DnbjjvbdxKvdHzyf
+DoCjjvbdxVMdqYlO
+EPCjjvbdEPDLLXDE
+EPDLKvbdVvhwucdg
+DncKjvbdaRfDITfL
+EPDKjvbdfpBzvcxI
+DoCkKvbdGLFTDHmV
+DoDLKvbdcTDKtDjB
+DnbkKvbdZRMeIldq
+EObjjvbdRjyGVGkT
+EPCjjvbdlhctRVRa
+DnbjjvbdyXhibPzL
+DnbjjvbdFpASvgFy
+DnbjjvbdKCicRJcY
+DnbkKvbdPxmAGrrK
+EPCjjvbdpstHSSKt
+EObkKvbdiZtelQnG
+DoDLKvbdKkAgvAJy
+EObjjvbdsPvPKCuf
+EOcLKvbdhyuGLqOG
+EPDLKvbdyOSgxShc
+EObkKvbdmJDsptqa
+EPCjjvbdbVCHYKtI
+DoCkKvbdCJLBkIfK
+EPDKjvbdTqQnuUgm
+EOcLKvbdypnmIjXA
+DoDLKvbdiLddOUby
+DoCkKvbdaSFbgtGL
+EPDLKvbdraellGjy
+EObkKvbdWRmwbEkc
+EPCjjvbdDoDLKvcE
+DnbjjvbdjEjfuPAO
+DnbjjvbdqvokbiYq
+DnbkKvbdVZITzLOn
+EPDKjvbdUWLpJtAq
+EObkKvbdwtmFQyMO
+DoDLKvbdFWZQPmKF
+EPDKjvbdLBKgMawq
+DncLKvbdANIYsWyx
+EObkKvbdqvolDJYq
+EOcKjvbdQlwbZOUz
+EPCkKvbdlqyUzTEJ
+EPCkKvbdSLYfUgKs
+DoCjjvbdRotHJfEX
+EOcKjvbdrXQMCiZR
+DncLKvbdaofgELzd
+DoDKjvbdehKvSNqH
+EPCkKvbdzaAOfgBl
+DoCkKvbdVUMsfMVj
+DoDLKvbdUGznLwVe
+EPDLKvbdDoDKjwDE
+DoCjjvbdANHxsXZx
+EPCkKvbdJpydnenF
+EPCjjvbdtTRsZZeD
+DoDLKvbdnQZyWLZC
+EPCkKvbdKNADyfta
+EPCkKvbdUVlPjTaR
+DncLKvbdeOeSjstS
+DncKjvbdXrlAmUOx
+DoCkKvbdxnTIXrhc
+EPDLKvbdZjTIQGaf
+DoCjjvbdPxmAGrrK
+EPDKjvbdLZQirztf
+DoDLKvbdkHflGFnL
+DoCjjvbdiMFEOUby
+DnbjjvbdhaoDFXQq
+EPCkKvbdyzeNqhIh
+EPDKjvbdbUbGwkUI
+DoCkKvbdEXxLsstM
+DoDLKvbdaRebhUGL
+EObjjvbdMfbpNQUk
+DoDLKvbdCEQAuilf
+EObjjvbdMowpunHT
+DoDLKvbdzHYlAMeX
+DoCkKvbdegkVqnQg
+DnbkKvbdwWlAuaVu
+DncKjvbdFfJqnItR
+EObjjvbdZjTHpHBf
+EPCkKvbdbsDKtEJa
+EOcLKvbdZtIiZESn
+DoDLKvbdpxoIHRDx
+EPDLKvbdTpqOtuIN
+DnbjjvbdmoyxvKxb
+DncKjvbdqGEEtWBI
+EPCkKvbdQwNdClHc
+DoCkKvbdHELViajK
+EPDLKvbdCJLBkIfK
+EPDLKvbdvwMBWBVu
+EPDKjvbdxrmiNRag
+EOcKjvbdxVMeQyLn
+DoCkKvbdraelkgLZ
+EPCjjvbddndsLUUS
+DoCjjvbdhgKDYvKV
+EPDKjvbdBiKbKiFj
+DncKjvbdKkBIWAKZ
+DnbjjvbdjlakzEgP
+EObjjvbdNrtWGeUp
+EPDKjvbdidkGuPAO
+DnbkKvbdjAQHBPgK
+DoCkKvbdUxgtZkPO
+DoDLKvbdDoCkLXDE
+DoDLKvbdkVvmcaxX
+EPCkKvbdmfeXmOHZ
+DoCjjvbdHDkWJajK
+DoDLKvbdkHgMGFnL
+EObjjvbdBdQAuilf
+EPDKjvbdxUleQxlO
+DoDKjvbdJbjDRJcY
+EPDKjvbdXsMAltOx
+EOcKjvbdIrxaSmXl
+DoDLKvbdyYJJbQZk
+DoDLKvbdQlwaxnUz
+EObkKvbdqvpMDIyR
+DoCkKvbdhzVGLpnG
+DncKjvbdJKEAJofd
+EOcLKvbdZLrETnLm
+DncKjvbdQvnDcMID
+EPDLKvbdiLddOUby
+EOcKjvbdeJiqvUzn
+DnbjjvbdsBemMGkZ
+EPCkKvbddtAUASmW
+EPCjjvbdiLeEOVCy
+EPDKjvbdkxrrSyHU
+DoCjjvbdURQoVUhN
+EOcKjvbdtkwwBUBX
+EOcKjvbddeOqawCj
+EOcKjvbdbAvEfPow
+EPCkKvbdzROmIjXA
+EObjjvbdKDKCpibx
+EPDKjvbdIGfyyYXg
+EOcLKvbdeOdsKssr
+EOcKjvbdsBelkgKy
+DoDKjvbdJYUCIMRQ
+EOcLKvbdjcMLQgVH
+EOcLKvbdJTYaSmXl
+DoDLKvbdNddUJIkE
+DoDLKvbdFjdsChNV
+DnbjjvbdmttyjjSG
+EPDLKvbdVgwuxHYz
+EOcLKvbdsCGMkfjy
+EOcKjvbdKWVGDeHJ
+EPDLKvbdjJegjMwr
+DoCkKvbdNHDQMotk
+DoDLKvbdjmBkydgP
+DnbkKvbdSLZFtfjs
+EPDKjvbdjbkjpfuH
+EObjjvbdkVwNdBww
+DncKjvbdFxtuBEYC
+EPCkKvbdrMzJxkhJ
+DoDLKvbdptUGrSKt
+EOcKjvbdhzUelQnG
+EObkKvbdsQVoKCuf
+DoCkKvbdzitpPcsU
+DoCkKvbdySnJMqag
+DncKjvbdZRMeImFR
+EObkKvbdYzcFrKVy
+DoDKjvbdrNZjZMIJ
+EPCkKvbdEvYoolie
+EOcLKvbdLBKgNCXq
+DnbkKvbdrpVnjDWG
+EObkKvbdLLBHvAJy
+DoCkKvbdqmZixkgi
+DoCjjvbdhytfLpmf
+DnbkKvbdVZHsyjoO
+EObkKvbdWWhxWEEg
+EObkKvbdhfjDZWJu
+DoCjjvbdZoOIddzK
+DoCjjvbdCDoaWJmG
+DoCkKvbdzitoocrt
+EOcLKvbdOSsvGduQ
+EOcLKvbdVqnXbElD
+EPDKjvbdgFlZnHHA
+EOcKjvbdUsltFkvK
+EPCkKvbdePFSkTsr
+EPCkKvbdssSTYzFD
+EOcLKvbdVTlselWK
+DncKjvbdZRMeJMdq
+EOcKjvbdYSlAlsnx
+DncLKvbdSZihTDWA
+DnbjjvbdvvlBWAuu
+EOcLKvbdEvZPoljF
+EPDKjvbdHELWJbJj
+DoDKjvbdDjHiuxKA
+DncLKvbdrMyjYkgi
+EOcLKvbdRbDdlIxk
+DoDLKvbdFVyQQMie
+EOcLKvbdZxdJmcMS
+EPDKjvbdFejRmiUR
+EPCjjvbdnPyxujxb
+DoCkKvbdjKGIKNXr
+DoCjjvbdYSlBNUPY
+DoDLKvbdZshiZDsO
+EPDLKvbdkyTRsYft
+DncKjvbdJbicQicY
+DoCkKvbdXGZZtAOs
+DnbkKvbdZjSgpGbG
+DncKjvbdWSOYBeMD
+DoDLKvbdKNADyfta
+DoDLKvbdLBKgMbYR
+EObjjvbdNddThhkE
+EPCjjvbdQdCaPqES
+DnbkKvbdvBDySoFI
+EPCkKvbdDoDLLWcE
+DncLKvbdaSGDHtGL
+EObkKvbdKNADzGta
+DncLKvbdTAFJHaoE
+EOcLKvbdTAFJIBoE
+DoDLKvbdUtNTelWK
+EPCkKvbdKefICApu
+EObkKvbdySmhlqbH
+EPDLKvbduaEYroFI
+DnbjjvbdSKxfVHLT
+EObkKvbdhkdcnVDZ
+DnbkKvbdCSaDTevr
+DoCkKvbdiBoCeXQq
+DncLKvbdZjShQGaf
+EPCkKvbdIwsagkqQ
+DnbkKvbdnCKWwoNu
+DncKjvbdelfWgNJk
+EOcLKvbdSPtHKFcw
+EObjjvbdZRNEhleR
+DoCkKvbdbLMGPNcA
+DoCkKvbdRkZFtfjs
+EOcLKvbdySmhmSBg
+DoCkKvbdWHxVwgYz
+EObjjvbdURQntuHm
+EPDKjvbdySnJMqbH
+EOcLKvbdOStWHEtp
+EPCjjvbdeOeTKstS
+DncLKvbdssRsZZdc
+EObjjvbdrovPKCuf
+EPDKjvbdiZuFkqOG
+DncLKvbdsBfNLfjy
+EOcLKvbdCDpAujNG
+EPDKjvbdOSsugFUp
+DoDLKvbdNQYRVmfs
+EOcLKvbdTAEiHaoE
+DoCjjvbdEPDKjwDE
+EPCkKvbdqUUGqqkU
+EPDKjvbdtbcVXVoP
+DnbjjvbdhbOcEvqR
+EOcKjvbdCTAcUGWr
+EPCkKvbdQdDApQcr
+DnbjjvbdTfznLwWF
+DnbkKvbdCDoaVjMf
+EPCjjvbdBsBDUFvr
+EPCkKvbdWWiXuceH
+DoCjjvbdJcJcRJbx
+DoDLKvbdsCGMlHKy
+EPCjjvbdSBceLhyL
+DoDKjvbdHffzZYYH
+EPCkKvbdvAdZTOeI
+DnbkKvbdxwhjBpZk
+DncKjvbdOFDtIhjd
+DoCjjvbdmpZxujxb
+EOcKjvbdIryAsMwl
+EPCkKvbdTqQnuUhN
+DncKjvbdOSsvHEtp
+EPDLKvbdZoOIdeZj
+DnbkKvbdKeegbAqV
+EPCjjvbdqFceUWAh
+DnbkKvbdCWzchdpW
+EPCkKvbdzQnlhiwA
+DoDLKvbdqdEiQNua
+DncKjvbdddoRawCj
+EPDLKvbdlYrrSxft
+DnbkKvbdRWnECkgc
+DncKjvbdGYuUaEYC
+EPDLKvbdZsiIxcrn
+DoCjjvbdJbibqJbx
+EPDKjvbdGYtuBDxC
+DnbjjvbdCEQAvKMf
+EObjjvbdvAcyTPEh
+DoCkKvbdxwhjBozL
+DoDKjvbdNsTugFVQ
+DoDKjvbdkHgLeemk
+EOcLKvbdwWlBVaWV
+EOcLKvbdrNZjYkgi
+DnbkKvbdJYUBglRQ
+DnbkKvbdjvWmdCXw
+EObjjvbdmajXYPOV
+DncKjvbdDihJuxKA
+EPCjjvbdwzIGGYFS
+DoDKjvbdMpYQvOHT
+DncLKvbdbhljLFwY
+EObjjvbdelevgMik
+DnbjjvbddePSCWbj
+DnbjjvbdKQydnenF
+DnbkKvbdZQmEhmFR
+DoDKjvbdjKFgimYS
+EObjjvbdANIZSvyx
+DoCjjvbdfHkWRnRH
+EObkKvbddiiqutzn
+EOcKjvbdqYnhHQdY
+DoDKjvbdKCjDQjCx
+DoDLKvbdjgflFfNk
+EOcLKvbdtTRrxzEc
+DnbkKvbduLwwBUAw
+DncLKvbdkWXOEBxX
+EPDKjvbdNxPVzcnU
+EPCjjvbdUMVnaWOi
+EObkKvbdZQmFImEq
+DncLKvbdQvmdDMID
+EObjjvbdGFjSNhsq
+EOcLKvbdbAvFFpQX
+DoCjjvbdkCkjqGuH
+EPCkKvbdbLLeoNcA
+DoDLKvbdemFwGmJk
+EOcKjvbdVUMtFlWK
+EPDLKvbdWXJXucdg
+DncLKvbdqcdhpNua
+DncLKvbdGYuUaDxC
+EPCkKvbdGZUtaDwb
+EOcLKvbdjuwODaxX
+EOcKjvbdSKyFuHKs
+EOcLKvbdNQYQvOHT
+EPCkKvbdNGcQNPuL
+EOcLKvbdPIAYZAZB
+EObjjvbdMfcPlpVL
+EPCjjvbdLAjflbXq
+EPCjjvbdySmhmRbH
+EPDKjvbdxsNhmSBg
+EOcKjvbdZMSDsmkm
+DoCjjvbdbAudfQQX
+DoCjjvbdePErjtTr
+DncKjvbdtkxXBUBX
+DoCkKvbdqvokbiYq
+DnbjjvbdMfbpMouL
+DnbjjvbdijFhKNXr
+DoDKjvbdhgJcZVjV
+EPDKjvbdIHGzZYYH
+DnbjjvbdNsTufeVQ
+DnbjjvbdqlyixlIJ
+EPDLKvbdmaivxPOV
+DnbkKvbdmJDsptrB
+DnbjjvbdQYmAGsSK
+EOcKjvbdZjTIQHCG
+EPDKjvbdqGDeTuaI
+EOcLKvbdADSYJzIp
+DncLKvbdeuzwoizs
+EObjjvbdFyUuBEXb
+DncLKvbdnUtykJqf
+EPCjjvbdelfXGmKL
+EOcKjvbdKCjDQjDY
+DncKjvbdaaVeGPow
+DncKjvbdqvolDJYq
+DoCjjvbdDnbjkWbd
+DoCjjvbdjlakyeHP
+DoCkKvbdLZRJrztf
+DncKjvbdZisIQHCG
+EPDLKvbdZyDjNbkr
+DnbkKvbdLAjfmBwq
+EOcKjvbdtSqryZeD
+EOcLKvbdIMBzmvqL
+EObjjvbdiVZdvqtb
+DoDLKvbdMgDPmQVL
+EPDLKvbdMgCpNPtk
+EObjjvbdKVuGDeHJ
+EOcLKvbdjJehJlxS
+EPCkKvbdhlEcmuDZ
+DoDKjvbdHfgZyXwg
+EPCjjvbdShyiqABM
+EPDLKvbdMgColouL
+EPDLKvbdVqmwadkc
+EPCjjvbdnCKWwnmu
+DncKjvbdRpUGjGEX
+DoDKjvbdkWWnECYX
+DnbjjvbdkMalZeGo
+EOcKjvbdxUleRYkn
+EObkKvbdFxtuBDxC
+EObjjvbdnGdwlnGy
+EObkKvbduaEYsOeI
+EPCkKvbdyTOJMrBg
+EObjjvbdDHMFgAzc
+DnbjjvbdEOcKkXCd
+EPDLKvbdBhjbLIfK
+EPCkKvbdZtJJZETO
+EOcLKvbdIwsagkqQ
+DoCkKvbdZyDjNbkr
+DnbjjvbdBsAbsfWr
+DoCjjvbdeOeSjssr
+EObkKvbdVUNUGMWK
+DncLKvbdfMfWfmKL
+DoCjjvbduaEZTOdh
+DoCkKvbdZisIPgBf
+DnbjjvbdVZHtZjoO
+DoCjjvbdCWzchePv
+EObjjvbdJmAEZfuB
+EObjjvbdvvkaVaWV
+DoCjjvbdiiegjNXr
+DnbjjvbdcScLUEJa
+DncLKvbdJXsbHlQp
+EPCjjvbdrpWOjDVf
+DoDLKvbdDnbjjwDE
+DnbjjvbdxnShYSiD
+DoCjjvbdqGEFUWBI
+DoDKjvbdtSrTYzEc
+EObkKvbdEPDLLWcE
+DoDKjvbdKQzEnfOF
+EPDLKvbdIwtBhMRQ
+DoCjjvbdTvLojUBR
+EPDLKvbdZyDimbkr
+EPDLKvbdptTfrSKt
+DncLKvbdkMbLyeHP
+EOcKjvbdKfFhBaQu
+EObjjvbdeEoRbXDK
+EOcKjvbdHDjvJbJj
+EObkKvbdEztQeLcJ
+DncKjvbdUtMsfLuj
+DnbjjvbdRXOECkgc
+DncKjvbdLAjfmBxR
+EOcLKvbdsPvPJcVf
+EPCjjvbdygYlAMdw
+DnbjjvbdmuVZkKRf
+EPCkKvbdSZigrcWA
+DncLKvbdcJMikGWx
+EOcKjvbdGLErcHlu
+DoDKjvbdKNADygUa
+EPDLKvbdMfbolpUk
+DoDLKvbdUxhTyjoO
+EPCkKvbdMtrqjmAX
+EPDLKvbdLBLGmBxR
+DoCjjvbdrzMQTAgn
+EPDLKvbdUxhTykPO
+DnbkKvbdnVUzLJqf
+DoCkKvbdLYpirztf
+EPDLKvbdFejSOItR
+DncLKvbdvlvANDeN
+DncLKvbdwtleRYkn
+EObkKvbdcJNKLFvx
+EPCjjvbdYSkaNTnx
+EOcLKvbdSxKlNzjx
+DnbjjvbdHbMZdzAD
+EPCjjvbdXnRAXuVt
+DoDKjvbdQmYBxnUz
+DoCkKvbdWSOYCEkc
+DnbkKvbdemGXGlik
+EObjjvbdNeDsiJLE
+DoCkKvbdbiMijfXY
+EPCjjvbdmIdTptrB
+DoCjjvbdEztQeMDJ
+DncLKvbdCIjbLIfK
+EPCjjvbdhkeENuDZ
+DoCkKvbdAMgxsWzY
+DoCjjvbdiZtelQnG
+EOcKjvbdWXJXuceH
+EOcLKvbdZRMeJMeR
+EPCkKvbdiVZdvquC
+DoDLKvbdkVvmdCXw
+EObjjvbdnHExMmgZ
+EPDKjvbdHgHZyYYH
+EPDKjvbdRbEFMJYk
+EPCkKvbdvBEZSndh
+DnbkKvbdcScLTdJa
+DoDLKvbdcJMijfXY
+DnbjjvbddndrjstS
+EPDLKvbdbiNJjevx
+DnbkKvbdOSsvGduQ
+DoDKjvbdMowpvNfs
+DoCkKvbdZjSgpGaf
+DnbkKvbdddnqawDK
+DoDLKvbdKaLGmCYR
+DoCjjvbdmuVZkKSG
+EOcKjvbdZQldiMdq
+EObjjvbdRNXayOUz
+DncLKvbdeuzxQJzs
+DncLKvbdEOcKkXCd
+DncKjvbdhtyeXSUb
+DnbjjvbdEObjkXDE
+DncLKvbdKQyePGNe
+EOcLKvbdHgGzZXwg
+EObkKvbdrMzJxlIJ
+EObkKvbdRXNdClHc
+DoDLKvbdwzIFexEr
+EPDKjvbdJYUCIMQp
+DnbkKvbdhbOcFWqR
+EOcKjvbdnGdxMmgZ
+EObjjvbddeOqawCj
+EPCjjvbdqTsgSSKt
+DncKjvbdJXtBhLqQ
+DoDLKvbdatagYKsh
+EOcKjvbdjEkHUoAO
+DncKjvbdLFfICBRV
+DnbkKvbdKQydoFme
+EPDKjvbdhlFEOVCy
+EPCkKvbdZxdJmblS
+EPDKjvbdJbjCqKCx
+DncKjvbdwNWANDdm
+EPDLKvbdpyPHfqDx
+EPCjjvbdOTTufeVQ
+EPCkKvbdtbbtvvOo
+DoCjjvbdbBWEfQQX
+EObjjvbdKNAEZgVB
+DnbjjvbdJXtBgkqQ
+EPCjjvbdGYtuBEXb
+DoDLKvbdZjShQGaf
+DoDLKvbdQmYCYnUz
+EOcLKvbdpedFTvAh
+EObjjvbdKQydoGNe
+EPCkKvbdKDJcRKDY
+EObkKvbdrafMkfkZ
+EObkKvbdiCObdwRR
+EPCjjvbddBsMrAUN
+DoDKjvbdWIXvXgYz
+DoDKjvbdkClKpftg
+EOcKjvbdkCkjpftg
+EOcLKvbdVrOYBeLc
+EObkKvbdmoyxukZC
+EPCjjvbddZyQXyRC
+DoCkKvbdhbPCdvqR
+DoCkKvbdJvUeceGi
+EOcLKvbdVqnXaeMD
+DoCkKvbdWWhxVceH
+EPDKjvbdiGjDZVjV
+EObjjvbdGAnpxizm
+DoCjjvbdiZuFlQnG
+EOcKjvbdTqRPVVIN
+EPCjjvbdqdEhomvB
+DoCkKvbdLAkHMaxR
+EPDLKvbdOEdThiKd
+DnbkKvbdkxrrTZGt
+EOcLKvbdEPDLLXCd
+DoDLKvbdTIzKRAAl
+EPDLKvbdSCDeLiZL
+EPCkKvbdpyOgfpdY
+EPCjjvbdtkwwBTaX
+EPDKjvbdiBoCeWqR
+DoCjjvbdhgJbxujV
+DoDLKvbdqdEhpNvB
+EOcKjvbdkCkjqGuH
+EPCjjvbdhbObeXQq
+EOcKjvbdxsOImRbH
+DoCjjvbdKWVFceHJ
+DoDKjvbdBiKbKiGK
+EPDKjvbdnGeXmNgZ
+EPDKjvbdiifHjNYS
+EOcKjvbdauBgXjsh
+DnbkKvbdUtMsfLvK
+DncKjvbdNrtVgEuQ
+EPDLKvbdUsmUGLvK
+EOcLKvbdNGcQMpVL
+EPCkKvbdqmZjZLhJ
+EObkKvbdFfKSOJUR
+DncKjvbdhaoCeXRR
+DoCkKvbdmfdwlnGy
+EPCjjvbdjbkjqGuH
+DoDKjvbdlqyVZsEJ
+DnbjjvbdWWiYVcdg
+EOcKjvbdeATqMwjG
+EOcKjvbdqUTgSSKt
+DncKjvbdqwQMDJZR
+EPCkKvbdsQVoJbuf
+DoCjjvbdVTmUFlVj
+DoDKjvbdmajWxPOV
+EOcKjvbdUQpoUthN
+DoDKjvbdwMvAMdEm
+EPDLKvbdDnbkLXDE
+DncLKvbdFfKSNiTq
+DncKjvbdIryBSlwl
+DoDKjvbdmgEwlmfy
+DncKjvbdqwPkbhyR
+DncLKvbdNeETiJKd
+EObjjvbdDoCjkXCd
+EObkKvbdjgflFfNk
+DncLKvbdxsNhlrCH
+DoCjjvbdeFOrCWbj
+EObjjvbdkNBkzFHP
+DoCjjvbdxrmiNSCH
+EOcLKvbdVwJXvDeH
+EPCkKvbdZRMdhmEq
+EObjjvbdjSzhsKiz
+DoCkKvbdqdEiQOVa
+EOcLKvbdpaJFAWhE
+EPDLKvbdRkYfVGjs
+DncKjvbdMpXqWNgT
+EOcLKvbdVYhUZkPO
+DoCjjvbdUxhTyjnn
+DoCkKvbdOYOuzcmt
+DoDKjvbdZLqdUNlN
+DoDLKvbdJSyBTMxM
+DoDLKvbdYORAXtut
+DncKjvbdHffzYxXg
+DncLKvbdmpZyVjyC
+EOcKjvbdmfeXlnGy
+DoDLKvbdkHfkeenL
+DoDLKvbdJTZBSmYM
+EObkKvbdrMzKZMHi
+DncLKvbdiLeDmuCy
+DoDKjvbdjvXNcbYX
+DnbkKvbdrJAJeMne
+DoDLKvbdvlvAMdFN
+EPCjjvbdZLrDsmlN
+DnbjjvbdaaVdfPpX
+EObkKvbdrbFlkfjy
+DoDKjvbdGLErbhNV
+DoCjjvbdCIkCKhfK
+DnbjjvbdeEoSBwDK
+DncLKvbdirziSjiz
+EPDKjvbdwzIGGYEr
+DncKjvbdbVCGwkTh
+EObkKvbdakMFnmcA
+DnbkKvbdRpUHKFdX
+DoDLKvbdMSWlytpz
+DncLKvbdpssgRrKt
+EPCjjvbdZRMeImEq
+DoCjjvbdqrVKmjaN
+EObjjvbdjAQGaPfj
+DoDLKvbdyqOmJJwA
+DnbjjvbdQccApRES
+DoDLKvbdIsYaSmXl
+EPCjjvbdrovPKDWG
+EPDLKvbdqdEhpOVa
+DoCkKvbdVviYVdEg
+DoCjjvbdqZPIGqEY
+EPCkKvbdOTTvGeVQ
+DoCkKvbdDncLLXCd
+EObkKvbdvBEYsOeI
+DoCjjvbdYORAYVVt
+EOcLKvbdhgKCxuiu
+DoDKjvbdddoRbWcK
+EObkKvbdmoyyWKyC
+EOcLKvbdyYJJbQZk
+DnbjjvbdUyIUZkPO
+DncKjvbdFyUuBDxC
+DoCjjvbdnQZyVjyC
+DoDLKvbdatbHYKsh
+DoCjjvbdczYowxpb
+DncLKvbdIsZAsMxM
+EPDKjvbdGKeTChMu
+DoCkKvbdptTgSRjt
+EPDKjvbdMtrqjmAX
+DncLKvbdKQzEoFme
+EObjjvbdFxtuAcxC
+DncKjvbdkDLkRHVH
+EPCkKvbdunszqKnt
+DoCkKvbdezuxeJTw
+EObkKvbdzjVQQDsU
+EPDLKvbdjKGIKMxS
+DoCjjvbdcyyQXxqC
+EObkKvbdhtydwRtb
+DnbjjvbdfNGXHNKL
+DoDKjvbdmoyxujxb
+DncLKvbdmuVZkJqf
+EObkKvbdZyDjNbkr
+DnbkKvbdyXhiaozL
+EObkKvbdKWUfDeHJ
+DoCkKvbddoFTLUUS
+DnbjjvbdJvUfEFHJ
+EObjjvbdsrqrxzFD
+EObjjvbdmgFYMmfy
+DnbjjvbdbrcLTcjB
+EPDKjvbdZtIiZETO
+DncKjvbdSLZGVHLT
+EObjjvbdhtzFXSVC
+EOcKjvbdvAcxsPEh
+EOcKjvbdbrbjsdKB
+DoDKjvbdezuxdiTw
+DoDKjvbdhkdcnVDZ
+DoCkKvbdNddUJIkE
+DnbjjvbdsCGMlGjy
+EOcKjvbdssSSxydc
+DoCjjvbdSPtHJfDw
+DoDLKvbdmRyVZrdJ
+EOcLKvbdBdQBVjNG
+EPCjjvbdtvOXipsA
+EOcLKvbdDwwlUUUM
+EObkKvbdhkeENuDZ
+EOcKjvbdwygfGYEr
+DncKjvbdbsCkUEJa
+DnbkKvbdvlvAMceN
+EPDKjvbdTvMPitAq
+EPDLKvbdMowpvOHT
+EOcKjvbdNQXpvNgT
+DncKjvbdYzcFqiuy
+EObjjvbdqUUGrRjt
+EOcKjvbdUaBqTRSZ
+DnbjjvbdrafMkfjy
+DncLKvbdmgFXmNfy
+DncKjvbdNrtVfdtp
+EOcKjvbdVZITyjoO
+EPDKjvbdTukpJtBR
+DoDLKvbdyOTHxTIc
+DnbjjvbdsBfNLfkZ
+EPCjjvbdmJDtRVSB
+EObjjvbdmJDtRUrB
+DnbjjvbdiVZeWrVC
+DncKjvbdBiKajhfK
+DnbkKvbdziuQPcsU
+EOcKjvbdGFiqnJTq
+DoCjjvbdAMhZTXZx
+DncLKvbdDjHiuwjA
+DnbkKvbdBdQBVjNG
+EPCjjvbdqlzKYkgi
+DncLKvbdLLBIWAJy
+DncLKvbdbhljKfXY
+DncKjvbdaogHELzd
+DnbkKvbdjEkGtoAO
+DnbjjvbdGdKvJbKK
+EPDLKvbdqrUjnKaN
+EObjjvbdnVUykKSG
+EPDKjvbdVrNwbFMD
+DoDKjvbdvlvAMdEm
+EPCjjvbdaaWEeopX
+EPDLKvbdULuoBVoJ
+EPDLKvbdzjUpPcsU
+EPDKjvbdZnnJEdyj
+EPDKjvbdtlXwAsaX
+EPCjjvbdjJfHimXr
+EPCkKvbdxwiKBpZk
+DoCkKvbdLiBlQxAS
+EObkKvbdXFxytAOs
+EObjjvbdnQZxukYb
+DncKjvbdZxcjNcMS
+DnbkKvbdQcbaQQcr
+EObkKvbdVgxVwgYz
+DoDLKvbddoEsLUUS
+EOcKjvbdTppnttgm
+DoDKjvbdBhkBjhej
+EPCkKvbdlhcsqVRa
+DoDKjvbdZshiYcsO
+DoDKjvbdtcDUvvPP
+DnbkKvbdRkZFuGjs
+DoCkKvbdaaVeFopX
+EObkKvbdYORAXtut
+DncLKvbdqwPlDJYq
+DoDLKvbdbBWEepPw
+DnbkKvbdVvhxWDdg
+EObkKvbdfHkVqmpg
+DncKjvbdaMjartmH
+EPCkKvbdBhjbLIej
+DoCjjvbdCIjbKiFj
+DoDKjvbdkIHLefOL
+EOcKjvbdrbGMlGkZ
+DncLKvbdPxmAGsRj
+EOcKjvbdZxdKODMS
+DncKjvbdkDLjqHUg
+EOcLKvbdjEkHUoAO
+DoDLKvbdrovOjDVf
+DncLKvbdZshiZESn
+DncKjvbdUyIUZjnn
+EPDLKvbdxmrhYSiD
+DoCjjvbdaNKasUlg
+DnbkKvbdYqMeJMdq
+DncKjvbdZoOIeEyj
+EOcKjvbdemGXGlik
+EObjjvbdyzdnRhIh
+DncKjvbdHEKvJbJj
+EObkKvbdSCDdlIxk
+EPCjjvbdGAoQxizm
+DoCjjvbdaNKasVMg
+EObkKvbdePErkTtS
+EPCjjvbdlhdUQuSB
+EPDKjvbdNQXpvOGs
+DoCkKvbdXnRAYUut
+EObkKvbdcTCkUEKB
+DncLKvbdmRyUzSdJ
+EPDLKvbdrSVLNkAm
+DoCkKvbdJvUecdgJ
+DoDLKvbdRDbaQRDr
+EPDKjvbdYlSETmlN
+EPCkKvbdbUagYKtI
+EPCjjvbdssRrxzFD
+EPCjjvbdRMwbYmtz
+DnbjjvbdxrmhmRag
+DoDKjvbdTvLpJtAq
+EPDKjvbdVBBprprZ
+DnbkKvbdRkYeuGkT
+EOcKjvbdmbKWwoOV
+EOcKjvbdZeYGzghb
+EPCjjvbdFeirOJUR
+DoCkKvbdZsiIxcrn
+EPDKjvbdDnbkKvcE
+DoDLKvbdsrrTZZeD
+DncKjvbdJbjCpicY
+DnbjjvbdcyxpXxpb
+EPCjjvbdrXQLbhxq
+DncKjvbdzROmJJwA
+DoDKjvbdqdFIpNvB
+EPDKjvbdkHfkfGNk
+DoDKjvbdFjdsDINV
+DoDKjvbdUyITyjoO
+EOcLKvbdiUzEwRtb
+EPCkKvbdmfeYMmgZ
+DncLKvbdHgGyyXxH
+EObkKvbdMuTSLNAX
+DncKjvbdtbcUwWOo
+DoCjjvbdVwIxWEFH
+EOcKjvbdhgJcZWKV
+DoCjjvbdsCFllHLZ
+EPDKjvbdGcjvJbKK
+EOcLKvbdnGeYNNfy
+DncKjvbdZnnIeFZj
+DoDKjvbdxUldqZLn
+EOcKjvbdrovOibvG
+DoDKjvbdUWLpKTaR
+DncKjvbdePFTKtTr
+EPDLKvbdFxtuAdYC
+DoDLKvbdfIKvRnQg
+EPDLKvbdypnmIjXA
+DncKjvbdbUagYLUI
+EPDKjvbdnVUyjiqf
+EObkKvbdKWVGDeGi
+EObkKvbdaNKbSuMg
+DoDKjvbdNVSqkNAX
+EObkKvbdhbPDFWqR
+DoDLKvbdLGFhBaRV
+EOcKjvbdbrcLUDjB
+EObjjvbdZHXEAPTJ
+EPCjjvbdCSaDTevr
+DncLKvbdgQBzvcxI
+EObjjvbdidjfuPAO
+DoDLKvbdzjUoodTU
+DncKjvbdGLEsChNV
+EPCjjvbdNeDshiLE
+EObjjvbdGGKRnIsq
+EObkKvbdeYZtTqez
+EOcKjvbdQwODblHc
+DoCkKvbdkClLRHVH
+EPCkKvbdxUldqYkn
+EPCkKvbdvBDxsPFI
+DnbkKvbdqvpLcIyR
+DncKjvbdqmZixkhJ
+DoDLKvbdkVwNdCYX
+EObkKvbdUxgsykPO
+EPCkKvbdjcLjpgUg
+DnbjjvbdbUagYKtI
+EObjjvbdDjHjWXjA
+EObjjvbdrykpSaIO
+EObjjvbdrbGMlGjy
+DncLKvbdVYhUZjnn
+DoDLKvbdjlakydfo
+DnbkKvbdVTmUGMVj
+EObjjvbdZjTIQHCG
+EOcLKvbdZxcjNcLr
+DoCkKvbdqTsgSRjt
+DnbjjvbdCIkBkJFj
+EPCkKvbdaogHELzd
+EPCjjvbdNPxQunGs
+EObjjvbdxZhFfXeS
+DoDKjvbdjblKqHUg
+EObkKvbdNPxRWNgT
+DoDKjvbdkaNOmALA
+EPDLKvbdxsOImSCH
+EOcLKvbdZshhyETO
+EPDLKvbdIHHZyYYH
+DoDKjvbdliEURVRa
+EObjjvbdiVZeXRtb
+EOcKjvbdiHJcYvJu
+EOcKjvbdIsYaTNXl
+DoCkKvbdtlXvaTaX
+EOcKjvbdNQYRVnHT
+DoDKjvbddjJqvUzn
+DoDKjvbdULuoBVoJ
+DoDLKvbdUslselVj
+EPCkKvbddePSCWbj
+EPDKjvbdNeDtIiKd
+EOcKjvbdiUzFXSUb
+DoCkKvbdmRyVZsEJ
+EPCjjvbduLwwAtBX
+EPDLKvbdxZgfGXdr
+DnbkKvbdBcpAujNG
+DnbjjvbdZtJIyDrn
+EObjjvbdmbJvwnmu
+EPCjjvbdXnRAYVWU
+EOcLKvbdyOShXsJD
+DoCjjvbdptUGqqkU
+DnbkKvbdFpASwHGZ
+DnbkKvbdwtleRYlO
+EPCkKvbdnHFYMmfy
+EPDKjvbdKCjDQjDY
+EObkKvbdeqaWzlDP
+DoCkKvbdbLMGPODA
+DoCjjvbdpyPIGqDx
+EOcKjvbdbhmKLFwY
+DoDLKvbdEOcKjwCd
+EPCkKvbdePFTKtUS
+EPCkKvbdtvNwipsA
+EPCkKvbdzoQQdblY
+EOcLKvbdKjaHvAJy
+EPDKjvbdvPTzpkOt
+EPDKjvbdMJCLpxAS
+EObkKvbdWWhwvEEg
+DnbkKvbdcJNJjevx
+DoCkKvbdNQXpunGs
+EPDKjvbdWSNxBdlD
+EPDKjvbdwyhFeweS
+DncKjvbdddnrCWcK
+EObjjvbdeKJrVtzn
+EObjjvbdrykosBIO
+EPDKjvbdiiehKMxS
+DncKjvbdrWpMCiZR
+DoCjjvbddoFSjssr
+DoCjjvbdbhmKKfWx
+EObjjvbdmajWwoNu
+EOcLKvbdDxYLstUM
+EPCjjvbdddoRawDK
+DncKjvbdmuUzKjSG
+DoDKjvbdLFegbBRV
+EPCkKvbdySnJMqbH
+DnbjjvbdLLAgvAKZ
+EPCjjvbdraemMHLZ
+EObjjvbdnUtzLKSG
+EPDKjvbdkDMLQgVH
+DoDKjvbdkHgMGGOL
+DoCjjvbdxsNiNSCH
+EObkKvbdNQXpvOHT
+EObkKvbdQwNdDLgc
+DnbjjvbdegkWRnRH
+DnbkKvbdGZUuAcwb
+DncLKvbdiMEcmuCy
+DoDLKvbdFfJqnJTq
+DoDKjvbdZnnJFEzK
+EOcLKvbdTqRPUtgm
+EOcLKvbdRjyFuHLT
+EOcKjvbdhtzEwRtb
+EObjjvbdTXjkmzjx
+DoDKjvbdqdFJQOVa
+DoCkKvbdGckViajK
+DncLKvbdDxXlUTsl
+EOcLKvbdeUAUASlv
+DnbkKvbdzjUpQETU
+DnbkKvbdtcCuWuoP
+DncLKvbdauBgXkUI
+DoCjjvbdUVlPitBR
+DnbkKvbdFfJrOItR
+DoDLKvbdxnSgwsJD
+EPCkKvbdXsMBNToY
+DncLKvbdCTAcUFwS
+DoDKjvbdhgJbxvJu
+DoDLKvbdhkeDnUby
+EObkKvbdEvZPpNKF
+EPCjjvbdiHJcZWJu
+EObjjvbdIHHZyYXg
+DoCkKvbdegkVqmqH
+DoCjjvbdxVNFRZMO
+DoDLKvbdUQpntuIN
+DoDKjvbdEJhJuwjA
+DoDKjvbdkHflGGNk
+DnbkKvbdmttykKRf
+DncLKvbdZxdJmblS
+DnbjjvbdZQmEhmEq
+DoCjjvbdJcJcQjDY
+DoDKjvbdBhkCLIej
+DoDLKvbdmIcspuRa
+DnbjjvbdqiAKElne
+DoCjjvbdJpzEoFnF
+EOcKjvbdyOShYTJD
+DoCkKvbdmuVZjiqf
+DoDLKvbdSCDeLhyL
+EOcKjvbdJvUedFGi
+EObkKvbdehLWRnRH
+EPDKjvbdxmrhXriD
+DoDLKvbdOTUWGeVQ
+EPCjjvbdzRPMhiwA
+EPDKjvbdKRZePGOF
+DoCkKvbdrDeIomvB
+EPDKjvbdkVvmdBww
+DoDKjvbdIGfzYwwg
+EPDLKvbdFVyPpNKF
+DoDKjvbdhytfLqNf
+DnbjjvbdMfbomQUk
+EOcLKvbdtcDVXWOo
+DoDKjvbdqwPlDJYq
+EOcLKvbdZshiZETO
+EOcLKvbdeEnrCXCj
+EOcKjvbdZLrDsnLm
+EPCjjvbdLYqKSzuG
+DncLKvbdMtsRjmAX
+DoCjjvbdJTZArlxM
+EPCkKvbdlZSrTZGt
+DncKjvbdRyjITCvA
+DoCjjvbdEuxpPmKF
+DnbkKvbdTYKkmzjx
+DoDLKvbduDDVXWPP
+DncLKvbdjAPfaPgK
+DncLKvbdrEFJPnVa
+EPCjjvbdrXQMChyR
+DnbkKvbdznpQeDLx
+DoCkKvbdjgflFfOL
+EObjjvbdjlalZdgP
+DoCjjvbdtbcUvvOo
+DoCkKvbdrEFIonWB
+EObjjvbdwXMAvAuu
+DncLKvbdePFSkUTr
+EPCkKvbdTppoUuIN
+EPDKjvbdIxUCHlQp
+DnbkKvbdBiLBjiGK
+DoDKjvbdliDspuRa
+EObjjvbdFkFTDIMu
+EPCjjvbdsQVnjDVf
+EPCjjvbdKefIBaRV
+DoDKjvbdIryAsNYM
+DoCkKvbdsrqrxzEc
+EPCjjvbdLqwNZuQz
+EOcLKvbdcIlikGXY
+DoCjjvbdADSXizIp
+DoCkKvbduaEZTOeI
+DncKjvbdvBDyTPEh
+EPCkKvbdRkZFuHKs
+DoDLKvbdSLZFuGkT
+EOcLKvbdfekzOHHA
+EOcLKvbdkaMoNALA
+DncLKvbdkNCMZeGo
+EObjjvbdNsUVfduQ
+EPCjjvbdZoNiEeZj
+DoDLKvbdLYpirzuG
+EPDKjvbdmoyxujyC
+DoCkKvbdaMjbSuNH
+EPDLKvbdxxIjCPzL
+DnbkKvbdVAaqSprZ
+DoCjjvbduVmxJqTA
+DoCkKvbdRkZGVHLT
+DoDKjvbdEuyQPljF
+DnbkKvbdptUHSRkU
+DncLKvbduLxWaUAw
+EObjjvbdaaVdfQQX
+EPDLKvbdWWiYVdFH
+EOcLKvbdfelZmgHA
+DoCjjvbdADRxKZiQ
+EOcKjvbdfHkWSORH
+EObkKvbdTAEiIBoE
+DncKjvbdEKIKVxKA
+DoCkKvbdkDMKpgVH
+DnbkKvbdCWzciEpW
+EObjjvbdxZgefXeS
+EOcLKvbdsZkpTBIO
+DoDLKvbdrJAKFMne
+EPDKjvbdkWXNdBww
+DnbkKvbdRbEFLhyL
+DncLKvbdWXJYWDeH
+EOcLKvbdijFgjMwr
+DoDLKvbdnHExMnGy
+EObkKvbdZeYGzhJC
+DnbjjvbdEvZPpMie
+EObjjvbdYpldiMdq
+DoCjjvbdfRaWzlCo
+EPCjjvbdGYtuBDxC
+EOcLKvbdQYmAGrrK
+EPCkKvbdlhcspuSB
+DoDLKvbdezvZFIsw
+EOcKjvbdlYsSTZHU
+DnbkKvbdmfeXmOGy
+DncLKvbdKDKDQicY
+DncKjvbdZjTIQHCG
+DnbkKvbdgFkzOHHA
+DnbkKvbdaNLBsVNH
+DoCjjvbdBsBCtGWr
+DncKjvbdqdFIomvB
+DnbkKvbdkNBlZdfo
+DnbkKvbdSQTgKGDw
+DoCkKvbddoFTLTsr
+DoDKjvbdEYYLtTtM
+EOcKjvbdVwJYWEEg
+DoDLKvbdyOSgwrhc
+DoCkKvbdZMRdUOLm
+DoDLKvbdYSlBMtOx
+EPCkKvbdkxsRsYft
+DnbkKvbdrzLpTAgn
+DncKjvbdRjxfUgKs
+DnbkKvbdqquLNkAm
+DoDLKvbdRMxCYnUz
+EPCjjvbdZoOIdeZj
+EObkKvbdrpWOicVf
+EPDLKvbdkCkjqHVH
+EOcKjvbdmSZUzSci
+EObjjvbdRjxfUgLT
+EObjjvbdNddThhjd
+DoCjjvbdKVuFcdfi
+EPDKjvbdzjVPodTU
+DncKjvbdJTYaSmXl
+DncKjvbddZyQXyQb
+EPCjjvbdCIkCKiFj
+EPDKjvbdTkunaWOi
+EObjjvbdfIKuqnRH
+DoCjjvbdZRMdiMeR
+DnbjjvbdMpXpunHT
+DoDLKvbdZRNEhmFR
+EObjjvbdaoffdLzd
+DoDLKvbdvAdYsOdh
+DnbjjvbdSLZGUgLT
+DoCjjvbdSCDdkiZL
+DoDLKvbdelewHNKL
+DoCjjvbdRXNdDMHc
+EObjjvbdkWWnDaww
+EObjjvbdcyxoxZRC
+DncKjvbdelfWfljL
+EObjjvbdZnnJEdzK
+EOcKjvbdkHflGFnL
+DoCkKvbdhbPCdwRR
+EPDLKvbdHDkWKCKK
+DnbkKvbdRadEkiYk
+EOcLKvbdFWYopNJe
+DoDLKvbdqTsfrSKt
+EObjjvbdxnSgxTJD
+EPDLKvbdxZhFewdr
+EPCkKvbdTvLojTaR
+EObjjvbdfIKuqnQg
+EPCjjvbdDxXlTssl
+EObjjvbdQvmccLhD
+EObkKvbdRNXayOUz
+EPCjjvbdatbGxLTh
+EOcKjvbdOSsvGeVQ
+EPDKjvbdePFTKstS
+DnbjjvbdlYsRsZHU
+DnbjjvbdZisIQGaf
+DoCkKvbdsrqsYzEc
+EObjjvbdfILVqnRH
+DnbkKvbdZHWdAPTJ
+DoDLKvbdEPCkLXCd
+EObjjvbdEXwktTsl
+DncLKvbdFVyQPlie
+DncKjvbdNsUWHEtp
+EOcKjvbdyqOmJKXA
+EOcKjvbdADSYJyhp
+EPDKjvbdUyIUZjoO
+EOcKjvbdmJEURVSB
+DnbjjvbdIwtBgkpp
+EPCjjvbdZQmEhldq
+EPCkKvbdDjHiuxKA
+DoDKjvbdrEEiQOVa
+DncKjvbdKDKDQjCx
+DncKjvbdZRNFJMeR
+DncLKvbdwygeeweS
+DncLKvbdnUuZkKSG
+DoDKjvbdvwMAvBWV
+DoCjjvbdBhkCLIfK
+DnbjjvbdoznDkXoA
+EOcKjvbdjgflFemk
+EObkKvbdKVtfDdgJ
+DnbjjvbdXrkaNUPY
+DncKjvbdhlEdNtby
+EPDKjvbdemGWfmJk
+DoDLKvbdlhctQtrB
+EObjjvbdnVVZkJqf
+EObjjvbdwuNEpyMO
+DoCjjvbdTpqOuVHm
+EObjjvbdbLLennDA
+DoDLKvbdiGjDZWKV
+EPDLKvbdFjeTDHlu
+DoDLKvbdDxYLstUM
+EPDLKvbdiUzFXSVC
+DncKjvbdJYTbHkpp
+DoCkKvbdZshhxdSn
+EPDKjvbdxrnIlqag
+EOcLKvbdiHJcYvJu
+DnbjjvbdkVwNcaxX
+EObjjvbdpyPIGpcx
+EPCkKvbdauCGxLUI
+EObkKvbdWRnXadkc
+DnbkKvbdVUNUGLvK
+EObkKvbdDxYLsssl
+DnbkKvbdCJKbKhfK
+DncLKvbdbhmKKfXY
+EOcLKvbdZoOIeFZj
+DoDLKvbdkNCLzFHP
+EObkKvbdpxnggQdY
+EObkKvbdYqNFJNEq
+EPCjjvbdyzdnSHhh
+EOcKjvbdczZQYZQb
+DncKjvbdZyDimblS
+DncLKvbdyOTIXrhc
+EObjjvbdhzUelQnG
+EObjjvbdFjeTChNV
+DoCjjvbdwMvANEEm
+DoDLKvbdRXOEDMID
+DncKjvbdiHJcYvJu
+EOcLKvbdhtzFWrVC
+DncKjvbdVYgsykPO
+DoCjjvbdGGKRmiUR
+EPDLKvbdQmXbYnUz
+DnbkKvbdkIGlFemk
+DoCjjvbdSPsgJfDw
+DncKjvbdzjVQPcrt
+EPDKjvbdmfdxNNfy
+EPDKjvbdZyDimblS
+DoDKjvbdANIZSvzY
+DoCkKvbdJqZdoGOF
+EOcKjvbdcJMijewY
+DncLKvbdNQXqWNfs
+DncLKvbdkNBlZeGo
+DoCjjvbdHffzZYXg
+DoDKjvbdjhHMGGOL
+DnbkKvbdiCObdvpq
+DoDLKvbdYlRctNkm
+EObkKvbdiUzEwRuC
+DncLKvbdMfbomPuL
+EPCkKvbdlZSrSyGt
+DncLKvbdvAcxroFI
+DoCjjvbdNGcQNQUk
+DncKjvbdWSNxBeLc
+EPCkKvbdqvokcIyR
+DncLKvbddZyQXxqC
+DoCkKvbdvPTzqLPU
+DncLKvbdZxcjNblS
+EPCjjvbdkMbLzFHP
+EPCkKvbdlYrqsYgU
+DnbjjvbdWSOXbFMD
+DnbkKvbdWeyZtAPT
+EPCkKvbdEKHivYKA
+DoCkKvbdkNBkyeGo
+DoDLKvbdiBoDEvqR
+DoDLKvbdRkYfVGjs
+EOcKjvbddneSkUTr
+EObjjvbdFejRnItR
+DncLKvbdLAjgMbXq
+DnbkKvbdUGznLwVe
+DoDKjvbdLqwNZtpz
+EPDKjvbdUxhTyjnn
+EPDLKvbdkNBkyeHP
+DoCjjvbdgFkzNgHA
+EObjjvbdunszpjnt
+EPCkKvbdtAHQhABS
+DnbjjvbdbKkfOnDA
+DoCjjvbdVviYWEFH
+DoCjjvbdGZUuAdXb
+EObjjvbdhlFDmuCy
+DncLKvbdyfyMAMdw
+EObjjvbdFyUtaDxC
+DnbkKvbdeEoSCXDK
+EOcKjvbdbVCGwjtI
+EOcLKvbdTAEhgand
+EObkKvbdRpUHJecw
+DnbjjvbdZsiJZDrn
+DncLKvbdtSqrxyeD
+DoDKjvbdJSxaSmYM
+EPCkKvbdjuvnECYX
+DoDLKvbdrMyjYkgi
+DnbkKvbdjJegjNXr
+DoDLKvbduaDxsOdh
+DoDLKvbdmIcsptrB
+EObkKvbdFkFTDHmV
+DnbjjvbdYORAYVVt
+DncLKvbdddoRbWcK
+EPDLKvbdLrWmZuQz
+DoDLKvbdliETpuRa
+DoCjjvbdbrcKsdKB
+DoCkKvbdHkazmvpk
+EPCjjvbdUaBpsRRy
+EObkKvbdKfFhBaQu
+DoCkKvbdKQydnfNe
+EOcLKvbdDjIKVxKA
+DncKjvbdpeceUWBI
+DncLKvbdKaLHNBxR
+EPDLKvbdptTfrRkU
+EPDKjvbddndsLTtS
+EObjjvbdMpXpvOHT
+DnbkKvbdaMjaruNH
+DoCkKvbdpecdtVaI
+DncLKvbdRpTfjGEX
+EObkKvbdCSaCsevr
+DoCkKvbdnHEwmNgZ
+EObjjvbdfHjuqmqH
+DoDKjvbdKWVGDeGi
+DoDLKvbdWHxVxHYz
+DnbjjvbdXsLaMsnx
+EPDLKvbdDjHiuwjA
+DnbjjvbdaaWFGQQX
+DnbjjvbdsrrTZZdc
+DoCjjvbddneTKtUS
+DoDKjvbdcJMjLFvx
+DoDKjvbdaNKbTUlg
+DnbjjvbdkHflFfOL
+EObjjvbdJpzFOeme
+DoCjjvbdrounibuf
+DoCjjvbdHgHZxwxH
+EOcLKvbdSKxeuGkT
+EOcLKvbdzQoNJJwA
+EObjjvbdZnnJEdzK
+DoDLKvbdJuuFcdfi
+DncKjvbdIryBSmYM
+EObkKvbdyYJJaozL
+EObjjvbdFkEsDHmV
+DnbkKvbdfMfXHMjL
+DnbkKvbdLGGIBaRV
+EOcLKvbdRXNdDMHc
+DoDKjvbdegjvRnRH
+DnbkKvbdKeegaaQu
+DnbjjvbdkMakzEgP
+DoDKjvbdcTDKtEKB
+DncLKvbdhaoDEvqR
+DncLKvbdmgEwmNfy
+EPDKjvbdCIjbLIfK
+DncLKvbdJvUedEgJ
+DoCjjvbdFVxpPljF
+EOcLKvbdJYUCIMRQ
+EPDKjvbddwyssrFz
+DoDKjvbdiMEdOUcZ
+DoDKjvbdZQleIldq
+EPCkKvbdnQZyVkYb
+DoCjjvbdNGbpNPuL
+DoCkKvbdOStVgFVQ
+EOcKjvbdGBPQxizm
+DnbjjvbdOXoVzcnU
+DncKjvbdyqPNIiwA
+DoDLKvbdkIGlGGNk
+EPDKjvbdbiNKLFvx
+DoCkKvbdCTBCsfWr
+DoDKjvbdShyjRABM
+EPCjjvbdxwhjBozL
+DoCkKvbdqUUHSSLU
+DoDKjvbdbBVdfPow
+DoCkKvbdqYnggRDx
+DoCkKvbdtkwwAsaX
+EPDLKvbdZMSDsnMN
+EPDLKvbdZjTIQGbG
+EPCjjvbdzoPpdblY
+EPDKjvbdVviYWEFH
+DnbjjvbdUsltGLuj
+DoCkKvbdQdDAopcr
+EPDKjvbdZxcjNbkr
+EPCjjvbdZisHpGbG
+EPDKjvbdEuxpPmKF
+EOcKjvbdQwNccLgc
+EPCjjvbdEYYLstUM
+EObkKvbdZRNEhmEq
+DoDKjvbdaRfDIUGL
+DncKjvbduaDxsOeI
+EObkKvbdmaiwYPOV
+EOcKjvbdKDJbqJbx
+DoDKjvbdQvnEDLgc
+DnbkKvbdtlXvaTaX
+EPDKjvbdzQoNIiwA
+EOcLKvbdNeDsiIjd
+DnbkKvbdBdQAvJlf
+DoCkKvbdhzVGMROG
+EPDLKvbdUaCQsRRy
+EOcLKvbdZisHogCG
+DoCkKvbdlqxtzTDi
+DoCjjvbdRkZGUgKs
+EObkKvbdZnmhdeZj
+EOcLKvbdZjTHogBf
+DncLKvbdhytfLqNf
+EPCkKvbdnPyxvKxb
+DncLKvbdjcMKqHVH
+EPCkKvbduWNwjRTA
+DnbkKvbdwygfGXeS
+EObjjvbdTlWOaVoJ
+EPCjjvbdUtNUGLvK
+EObkKvbdKkAgvAKZ
+EObkKvbdaMkCTUmH
+EPDKjvbdOFDshhjd
+EPDLKvbdhzUfLpmf
+EPCkKvbdkySrTYgU
+EOcLKvbdFfKSNhsq
+DncKjvbdOAJTUKSA
+EPDLKvbdrDeJPmvB
+EPCkKvbdKRZdnfNe
+EPCjjvbdRDcAoqDr
+EOcKjvbdNHDQNPtk
+EOcLKvbdVTmTfMVj
+EOcKjvbdrXQMChyR
+DoCjjvbdZQmFJNEq
+EPCkKvbdWRmwadkc
+EObkKvbdSCDeLhyL
+DncKjvbdyNsHxTJD
+EPDKjvbdtSrTYydc
+DoDLKvbdiGjCxuiu
+DoCkKvbdrNZjZLgi
+EPDLKvbdJmADzGuB
+DncLKvbdtcCuWuno
+DnbjjvbdDxXktTtM
+EPCjjvbddZyPxZQb
+EPDLKvbdlqxtysDi
+DoDLKvbdbAueGPpX
+EObjjvbdVviXvDdg
+EPDKjvbdBdQAvKMf
+DnbkKvbdPxmAHSqj
+DoDLKvbdUsltFlWK
+DncKjvbdVhYWYHYz
+DoDKjvbddwzTtSFz
+DncLKvbdIGfzYwwg
+EPCjjvbdmJDsqUrB
+EPCkKvbdGQASwGey
+EOcLKvbdTlWOaVoJ
+DncLKvbdLFehCBRV
+DnbjjvbdTkvOaVoJ
+EPCkKvbdwXMAvBWV
+EObjjvbdpxnhGqDx
+EOcLKvbdsrqryZeD
+DoDLKvbduVnXjQsA
+DncLKvbdRotHKFdX
+EOcKjvbdnUtyjirG
+EOcKjvbdCJLCLJFj
+EOcLKvbdSCEFLiYk
+DoDLKvbdjcMLQgVH
+DoCkKvbdLBLGlaxR
+EObkKvbdZQldiNFR
+EOcLKvbduMXwAsaX
+DncKjvbdxrnIlrBg
+EObkKvbdehKvRnRH
+DoDLKvbdRosfiecw
+DoCkKvbdFjdrcINV
+EPCjjvbdkWWmdBxX
+DnbjjvbdFkFTDHlu
+DoCjjvbdTAEhgaoE
+DoDKjvbdANIZTWyx
+EObkKvbdJSyAsNYM
+EPDLKvbdqTtHRqkU
+EPDKjvbdbBVeFoow
+EPCkKvbdYSkaMsoY
+DncLKvbdDnbkKwDE
+DncKjvbdMSWlzUpz
+DncKjvbdauCHXjsh
+DoCjjvbdTvMQKUBR
+DoDLKvbdrRuLOLAm
+EOcKjvbdatbGxKtI
+DncLKvbdNGcQMotk
+EPDKjvbdiCObeWqR
+DoDKjvbduDDUwVno
+DncLKvbdYlRcsmkm
+DncKjvbdbAueFoow
+EObkKvbdYTMBNToY
+DncKjvbdvAdYsPEh
+EObjjvbdBdQBWKMf
+DnbkKvbduCbuWuno
+EOcLKvbdKWVGEFHJ
+EObkKvbdcyyQXxqC
+DnbkKvbdaMjasUmH
+EPCkKvbdmgEwlmfy
+DoDLKvbdrDdiQOVa
+DoDKjvbdUyIUZjnn
+DnbkKvbdnBjXYOnV
+EOcKjvbdRpTgJfDw
+DncKjvbdjcLjqGuH
+DnbkKvbdZjTIQHCG
+EOcKjvbduVnYKRTA
+DnbkKvbdGckWJbKK
+EObjjvbdZyEJnDMS
+DncKjvbdNsUWGduQ
+EObjjvbdKQzEoFme
+EOcKjvbdVUMtGLvK
+EPDKjvbdrJAKFMoF
+DoCkKvbdNrsvHFVQ
+DncLKvbdSKyGUfjs
+DoCkKvbdVvhxWEFH
+DncLKvbdFejRnIsq
+EObjjvbdVYhUZkOn
+DoCjjvbdxUmEpxkn
+DoDLKvbdBiLCKhej
+DoDKjvbdIjEAJofd
+EOcKjvbdwzHfFwdr
+DncKjvbdFjeTDHlu
+DnbjjvbdbiMjKewY
+DnbjjvbdaNLCTUlg
+EObjjvbdDwxMUUTl
+DoCkKvbdmttykKSG
+EPDKjvbdiUyeXSVC
+EPDLKvbdWIYVwfxz
+EPDLKvbdemFvgMik
+DoCkKvbdUyHszKoO
+EObkKvbdTXkMNzjx
+DoDKjvbdSQTgKFdX
+DnbjjvbdLiBkpxAS
+EPCkKvbdRosgKGEX
+DoCkKvbdmfdwmNgZ
+DncLKvbdiHJbyViu
+DncLKvbdxrnJMqbH
+EOcKjvbdhlFENtcZ
+DoCjjvbdbKkennDA
+DnbkKvbdGckWKBjK
+DnbjjvbdUyIUZkOn
+EPDKjvbdeEnrCXDK
+EOcKjvbdsBfMkgKy
+DncKjvbdxsNiNSBg
+EPDKjvbdkNCLzEgP
+EPDKjvbdSKyGVGjs
+DoDKjvbdrWolChyR
+DncLKvbdWSNwaeLc
+EOcKjvbdJYTbHkqQ
+DnbjjvbdZshiZDsO
+DoDKjvbdSKxfUfjs
+EPCkKvbdptTgRrKt
+EPCjjvbdREDApQdS
+DncLKvbdtvOXjRTA
+EPDKjvbdemGXGljL
+EObjjvbdBdQAvJmG
+EPDLKvbdhuZdwRuC
+DncLKvbdjvWnDaxX
+EPDLKvbdFVxopMie
+EPCkKvbdajkeoNcA
+EPCjjvbdSPsfifEX
+DnbkKvbdBsAcTfWr
+EPCjjvbdEOcLLWcE
+DoCjjvbdZLrDsmlN
+EPCkKvbdxnSgxTIc
+EObjjvbdGQATXGey
+EObkKvbdbsDLUEKB
+DoCjjvbdrSVKmjaN
+EPCkKvbddneTLUUS
+DoCkKvbdxmrgwsJD
+EPDKjvbdGYuVAdXb
+DncLKvbdauBfxLTh
+EPDLKvbdrMzKZLgi
+EObkKvbdUsltGLvK
+DnbjjvbdDxXlTstM
+EObkKvbdsBfNLgLZ
+DncKjvbdidjgUoAO
+EPDLKvbdJJdAKQHE
+EOcKjvbdbBWFFpQX
+EPCjjvbdSZihTDWA
+EPCkKvbdhgKCxuiu
+DncKjvbddneTLUTr
+DoDKjvbdczZPxZRC
+DnbjjvbdlYrrTYft
+DoDKjvbdWXJXvEEg
+EPDLKvbdbhmJkFvx
+EPCjjvbdDxYLtTsl
+EPDKjvbdqdFIonVa
+EObjjvbdCIjbLIej
+DnbjjvbdmbKXXnmu
+EPDKjvbdlZTSTYft
+EPDKjvbdwXMBVaWV
+DnbjjvbdSPtGjGEX
+DoDKjvbdrMzKYlHi
+EPCkKvbdiVZdwSVC
+DnbjjvbdptUHSSKt
+DncLKvbdcSbjscjB
+DoDKjvbdSPsfiecw
+EOcKjvbdegkVqnQg
+EObkKvbdjuvmcbXw
+DncKjvbdCJLCKhfK
+EObjjvbdVqnYBeMD
+DoCjjvbdKCjCqJcY
+DncLKvbdZRMdhmEq
+EOcKjvbdrRtkOKaN
+DoDLKvbdRpTfiedX
+DoCjjvbdRMwbZOUz
+DoCjjvbdrXQMDIxq
+EObjjvbdsrqsZZdc
+DnbjjvbdfjfzbfAE
+DoCkKvbdJSyBTMxM
+EPDKjvbdnCJvwoNu
+DoCjjvbdmbJvwoNu
+DnbkKvbdFWZQPljF
+DncLKvbdxnSgwriD
+DnbjjvbdVvhwucdg
+DoCjjvbdjgfkfFnL
+DncLKvbdzRPMiKXA
+EOcLKvbdqZPHgREY
+EPCkKvbdrylPsAgn
+EPCkKvbdVZITykPO
+DoCjjvbdhkeEOVDZ
+EOcKjvbdUVkpJtAq
+EOcKjvbddCTMrAUN
+EPDKjvbdZeXfzghb
+EPCjjvbdiMFDmuDZ
+EPCjjvbdJKEAJpHE
+EOcLKvbdajkeoODA
+DnbjjvbdZRNEhmFR
+EOcLKvbdNHCpNQVL
+EObjjvbdmRxtzSci
+DoCjjvbdzRPMhjXA
+DnbkKvbdnGdwmNfy
+EObkKvbdvAcxsOeI
+DoDLKvbdBsAcTevr
+DoCkKvbdozmdKxPA
+DnbkKvbdTlVoBVoJ
+EPCkKvbdqwQLcIxq
+DncLKvbdbiMjLGWx
+DoDLKvbdfHkWRnRH
+EOcKjvbdbVCGxKsh
+DoCjjvbdTqRPUthN
+DoCkKvbdbQGgELzd
+EOcLKvbdQZNAHSrK
+DoDLKvbdZyDjNbkr
+EPCjjvbdqiAJdmOe
+EObkKvbdKaLHNBxR
+DncKjvbdyXhjBozL
+EObjjvbdDjIKWYKA
+EOcKjvbdLFegaaQu
+EPDKjvbdZjTIPgCG
+EOcLKvbdfHjuqnQg
+DnbjjvbdlhcsqVRa
+DoCjjvbdMuSqkNAX
+DncLKvbdCIkBkIej
+DncKjvbdUaCQsQqy
+EObjjvbdRbDdkhyL
+EOcKjvbdpssfrRkU
+EOcKjvbdLGFhBaQu
+EPCkKvbdqqtjnLBN
+EOcLKvbdWRmwbEkc
+EObjjvbdpedFTuaI
+DoCkKvbdJJdAJofd
+DoDLKvbdwNWANEEm
+EPCkKvbdYgWdAOri
+DoDLKvbdvAcyTOeI
+DnbkKvbdbhmJjfWx
+EOcLKvbdypnliKXA
+EOcKjvbdZyEJnClS
+DoCjjvbdZoNhdeZj
+EPCkKvbdkDLkRGtg
+EObjjvbdNsUWGdtp
+DnbjjvbdZQldhmFR
+EOcKjvbdYpmEhldq
+EPCkKvbdZQmEiMeR
+DnbjjvbdhytfLpnG
+EObjjvbdmtuZkJrG
+EObjjvbdGLEsDINV
+EPCjjvbdVhXvYHYz
+DoDLKvbdKefICAqV
+DncKjvbdUtMsfLvK
+EOcLKvbduaEZTOeI
+EPDKjvbdddoSBwDK
+DoCkKvbdffLymgHA
+DnbkKvbdbAueGQQX
+DnbkKvbdbrcLTcia
+EPCjjvbdRbEElJYk
+DoCkKvbdGFirNiTq
+DoDKjvbdNdctIhkE
+EPDLKvbdQccAoqES
+DnbkKvbdFfKRnJUR
+DnbjjvbdFfJrNiUR
+EPDLKvbdCfkegAzc
+EPCjjvbdRXNccMHc
+DoCkKvbdZjShPgBf
+EOcKjvbdSLZGUfkT
+DoDLKvbdBcpAujMf
+EOcLKvbduWNwiqTA
+DoDLKvbdpyOgfqEY
+EOcKjvbdcScKtEJa
+EObjjvbdnCJwXoNu
+DnbkKvbdjFLGtoAO
+DoCjjvbdXrlBMsnx
+EPDKjvbdhgJcZWJu
+DoCjjvbdiBoDEvpq
+EPDKjvbdczYoxYqC
+DoDLKvbdjFLHVPAO
+DnbjjvbdbPgGdLzd
+DoDKjvbdWIYWYGxz
+DncKjvbdhytfLpnG
+EObjjvbdfHjuqnQg
+DnbjjvbdmgExMmgZ
+EOcLKvbdhgKDYuiu
+EPDKjvbdmJEURVRa
+DoDLKvbdJpyePGNe
+DoDLKvbdlhdUQuRa
+EObkKvbdmuUzLKSG
+DnbjjvbdxwhjBozL
+EPDLKvbdVZIUZjnn
+EPDLKvbdJpydnfOF
+EPCkKvbdqqtjmjaN
+EPCkKvbdZoOJFFZj
+DnbjjvbdmttzKjRf
+EPDLKvbduWOXjQsA
+EOcLKvbdwtleRYkn
+DoCjjvbdLYpjSzuG
+EObjjvbdIsYaSmYM
+DnbjjvbdyzeORhJI
+EOcLKvbdkWWnECXw
+EPDKjvbdVviYVcdg
+DoDKjvbdBcoaVjMf
+DoCkKvbdiMEcmuDZ
+EObjjvbdLKaHvAKZ
+DncLKvbdJTZArlwl
+EOcLKvbdhaoCeWpq
+DncLKvbdrWpLcJZR
+EObkKvbdHkaznWpk
+DnbjjvbdzjVPocrt
+EOcKjvbdyqPMhiwA
+DoCkKvbdpstHRqkU
+DnbkKvbdRkYfVHKs
+DoDLKvbdVgwvYGxz
+EOcKjvbdFfKSNiUR
+DnbkKvbdqquLOLBN
+DncKjvbdOAJTTjSA
+DoDKjvbddneSkUTr
+EObkKvbdlqyUysEJ
+DoDKjvbdbhmKKevx
+EOcLKvbdiCObdwQq
+EPCkKvbdFejSNiTq
+EObkKvbdwygfGYEr
+EPDLKvbdsQWPKDVf
+DncKjvbdjbkjpfuH
+EPDKjvbdRkZFuGjs
+EPDKjvbdwyhFfXdr
+DncKjvbdcIlikFvx
+DoCkKvbdiUydwSVC
+DncKjvbdiUzFXSVC
+EOcKjvbdjKFgimYS
+EPDKjvbdjvXODaww
+EPCkKvbdRbDdlJZL
+EObkKvbdrEEhpNvB
+EObjjvbdrpVoKDWG
+DoCjjvbdNxPVzcnU
+EPDKjvbdVgwvYHYz
+DnbjjvbdmuUyjirG
+EObjjvbdrSVLNkBN
+DncKjvbdUWLojUBR
+EOcLKvbdwygefXeS
+EObkKvbdhaoDEvqR
+EOcLKvbdGGKRmiUR
+EOcKjvbdeEnqawDK
+EPDLKvbdGGJqnItR
+DoDLKvbddeOrBvbj
+DnbkKvbdiVZeWquC
+DncLKvbdJcJcQjDY
+EPDLKvbdkDMLQgUg
+EObjjvbdemFvflik
+EObkKvbdwzHeewdr
+DoCjjvbdHDjuiajK
+DoCkKvbdrEEiPnVa
+EOcLKvbdypnmJKXA
+DoDLKvbdmgFXmOHZ
+EObkKvbdUsmUFkuj
+EPDLKvbdcScKtDjB
+EPCkKvbdUyITzLOn
+DncKjvbdZnnIddyj
+EPCkKvbdaaVeGPow
+DoCjjvbdSQTfifDw
+DoDKjvbdDoDKkXCd
+DncLKvbdhtzEwRuC
+EObkKvbdMpXqVnGs
+DoDKjvbdDncLLXCd
+DoCkKvbdtcDUwVoP
+DoDKjvbdtSqryZdc
+EPDKjvbdbBWFGPpX
+EPCjjvbdmRxtyrdJ
+DoDLKvbdGckVjCJj
+EObjjvbdzoPpeCkx
+DnbjjvbdKWVFceHJ
+EPCjjvbdSKyGVHLT
+DoDLKvbdelevgNKL
+DoCjjvbdTXjlNzkY
+DoDLKvbdpstHSSLU
+EPDKjvbdhgKCxuiu
+EObkKvbdZQleJMeR
+EPCjjvbdKVuGDdfi
+DncKjvbdUGzmkvvF
+DncKjvbdxrnJMqbH
+EPCjjvbdKVuGDdgJ
+EObjjvbdptTgRqjt
+EObjjvbdCDpAujMf
+EPDKjvbdczZQXyRC
+DncLKvbdqYngfpdY
+EOcLKvbdqBIeAXIE
+EPDLKvbdZLrETmlN
+EPDKjvbdNeEThhjd
+EOcLKvbdmbKWxOnV
+DoCkKvbdCDoaWKNG
+EOcLKvbdEOcKkWbd
+EPCkKvbdNQXpvOGs
+EPDLKvbdFyUtaDxC
+EPDKjvbdbLMGOnDA
+DoDLKvbdJcJcQjDY
+EPDLKvbdOTUWHFUp
+DoCjjvbdmgFXlnGy
+EOcLKvbdRDbaQRES
+DoDLKvbdcyxowxpb
+EPDLKvbdliEURVSB
+EOcKjvbdXnRAXuWU
+DoCkKvbdDnbjjwDE
+DoCkKvbdKVuGEEfi
+EObkKvbdyOTHxShc
+EPDKjvbdySnIlqbH
+DoDLKvbdHELWJbJj
+DnbjjvbdyOTHxShc
+DnbjjvbdczZQXxpb
+EPDLKvbdZLrDsmkm
+EPCjjvbdfNGWflik
+EPDKjvbdmbKWwnmu
+DncKjvbdrDdiPnWB
+EObjjvbdHDjvKCKK
+DnbkKvbdUVkojTaR
+EObjjvbdptTfrSKt
+EPDKjvbdFxttaEXb
+DoCkKvbdjvXNcbYX
+DoCkKvbdSLYfUgKs
+EOcKjvbdHakzEzAD
+DncLKvbdiCObdwQq
+EPDLKvbdZLqdUNlN
+DoDLKvbdhkeDnVCy
+EPCkKvbdemFvgNKL
+EObjjvbdliDtQuRa
+EObkKvbdwuMdpxkn
+EObkKvbdirzhrkJz
+EPCjjvbdJYTahLqQ
+DncLKvbdIHGyxwwg
+EPCjjvbdSQUHKGEX
+DoCjjvbdZshiYcsO
+EOcLKvbdPyNAHSrK
+EPCjjvbdbsCjscia
+EObjjvbdUWLojUBR
+DoDLKvbdKeehBaQu
+EObjjvbdjuwODaww
+DoDLKvbdtkxXAsaX
+DncLKvbddneSkTtS
+DnbjjvbdZtJIxcsO
+DnbjjvbdJTYaTNXl
+EPCjjvbdGKeTDHlu
+DoDLKvbdKQydoGNe
+DoDKjvbdVrOXaeLc
+EPCkKvbdzHYlAMeX
+DoDLKvbdBvzchdov
+EObkKvbdapGgELzd
+DoDKjvbdaMkBsUlg
+DnbjjvbdVUNTelWK
+EObjjvbdiHJcZWKV
+DncLKvbdZoNheEyj
+DncKjvbdDHMFgAzc
+DnbkKvbdFpATXGey
+EPDKjvbdMpXqWOHT
+EPCjjvbdmSZVZrdJ
+EPDKjvbdcIljKfXY
+DoCkKvbdjcLkRGuH
+DoDLKvbdGYuVBEXb
+EObkKvbdWXIxWDeH
+DncKjvbdQlxCZOUz
+DnbjjvbdYNqAXtut
+EPDLKvbdGdKvJbJj
+DoDLKvbdGLFSbglu
+EPCkKvbdRjxfVGkT
+DoCkKvbduCbuXWOo
+DoCjjvbduCbtvuno
+EObkKvbdjAQGaQGj
+DoDLKvbdqBJFAXHd
+EOcKjvbdkClKpgVH
+EOcLKvbdiMFDmtby
+EPDLKvbdjvXNcbXw
+EPCkKvbdxUmFRYkn
+DoDKjvbdHgGyyYXg
+DoCjjvbdRzJhScWA
+DnbkKvbdlZTRsYgU
+DnbkKvbdFVxpQNJe
+EPCkKvbdZyEJmcMS
+EObjjvbdZQldhmFR
+EObjjvbdYSlBMtPY
+DncLKvbdvBDxsOdh
+DoDLKvbdvAdYrndh
+DoCjjvbdZyEJmcLr
+DnbkKvbdKaLGmCXq
+DnbkKvbdZQmFImEq
+EOcKjvbdqvolDIxq
+DnbkKvbdVqnYBdkc
+DoCkKvbdnPyxvLZC
+EOcLKvbdmJEURUqa
+DoDLKvbdfHkVrNpg
+DoCjjvbdznopdblY
+DoCkKvbdjvWmdCXw
+EOcKjvbdunszpjnt
+EObkKvbdzoPqFDMY
+EObjjvbdDxXktTtM
+EObjjvbdBcoaVjMf
+DncKjvbdtcDVWuno
+EObjjvbdpyOggQdY
+DnbkKvbdwWkaWAuu
+EPCjjvbdajkeoODA
+EOcKjvbdKNAEZfta
+EOcKjvbdZisIQHCG
+DncLKvbdEXwksstM
+DoDKjvbdtbbuXVoP
+DncLKvbdDxYMTstM
+DoCkKvbdcyyPwxpb
+EPCkKvbdxmrgwsJD
+DoDKjvbdYSkaNUOx
+EOcLKvbdxwhjCPyk
+DncKjvbdUsmTekuj
+DnbkKvbdkVwOECXw
+EObkKvbdnBjXYOnV
+DncKjvbdcasNSATm
+EPDKjvbdTAFIhCOd
+DnbkKvbdkWWnECYX
+DnbkKvbdFjeSbgmV
+DoCjjvbdJzoewdAN
+DnbkKvbdZeXfzhIb
+DncKjvbdMJCLqYAS
+DoCkKvbdGLFTCglu
+DoDLKvbdMuSrLNAX
+EOcKjvbdqceIomvB
+DoDLKvbdegkVqnRH
+DoDKjvbdKfGICBQu
+EOcKjvbdEvYopNKF
+DnbjjvbdlrZVZsEJ
+DoDLKvbdqqtjmjaN
+DncLKvbdQmXaxmtz
+EPDKjvbdCDoaVjNG
+EPCkKvbdqquLNjaN
+DnbjjvbdKRZdoFnF
+DoCkKvbdkVwOECYX
+DncKjvbdGQATXGfZ
+DncLKvbdCDpAujMf
+EOcKjvbdDxXlUUTl
+EPCjjvbdYkrEUNlN
+DnbjjvbdZtJIyETO
+DoCjjvbdXsMAltPY
+EOcLKvbdxxIjCPzL
+DoDLKvbdSLZFuHLT
+DncKjvbdFVyQQMjF
+DoCjjvbdFaOpyJzm
+EPCjjvbdrJAJdmPF
+EOcLKvbdMuSqjmAX
+DncLKvbdEJgiuxKA
+EPDKjvbdBdQAuimG
+DnbjjvbdWXIxVdFH
+DnbkKvbdHDkVjBjK
+EPDKjvbdnHEwlmgZ
+EPCkKvbdBiKbKhfK
+EPDKjvbdhyuGLpnG
+DoCkKvbdZsiJZDsO
+DnbjjvbddBrlrAUN
+DoCkKvbdYqMeIldq
+DncLKvbdZLqdUNkm
+EOcLKvbdMuSrKmAX
+DoCkKvbdDxXksstM
+EOcKjvbdqdEiPmua
+DoCjjvbdOEdUJIjd
+DoCkKvbdEObkLWbd
+EObkKvbdfekynHHA
+EPCkKvbdrEFIpNvB
+DnbkKvbdnBjXXoOV
+EPCjjvbdmgEwmOGy
+DncKjvbdKCjDQjCx
+EPDKjvbdJqZdoGOF
+DncKjvbdUsmTfLuj
+DoDLKvbdjcMKpgUg
+EPDLKvbdSQUGjGDw
+DnbjjvbdRacdlJYk
+DncKjvbdYgXEAOsJ
+EPCjjvbdhficZWKV
+DoDKjvbdGAnpxizm
+EPCkKvbdRbDeLhyL
+DoDKjvbdiBncEwQq
+DoCkKvbdxZgfFxFS
+DoCjjvbdqvpMChyR
+EObjjvbdbUbGxKtI
+DoCkKvbdEObkKvcE
+DnbjjvbdKQzEnfNe
+DoCjjvbdRWnDblID
+DnbkKvbdkxrqsYgU
+DncLKvbdqwPlCiYq
+EPDKjvbdSZjHsDWA
+DncLKvbdEPCjjvbd
+EOcLKvbdpyPIGpcx
+DncLKvbdbVCGwkTh
+DnbkKvbdnPzZWKxb
+EObkKvbdGKeTDIMu
+EOcKjvbdiifIKNYS
+DncLKvbdnQZxvKxb
+EPDLKvbdGFjSNiUR
+DnbjjvbdRNXaxnUz
+EPCjjvbdOTTvGduQ
+EObkKvbdUtMselVj
+DoCjjvbdnUuZkKSG
+EPDKjvbdQmXaxnUz
+EPCkKvbdNeDtIhjd
+DncLKvbdNxOuzdOU
+DncKjvbdJJdAJpGd
+DoDKjvbdwuNEqYkn
+DncKjvbdZMSDtOLm
+DnbjjvbdNeDsiJLE
+EPCjjvbdJpzEoGOF
+EPCjjvbdkDLkRGtg
+DoCjjvbdUWLpJtAq
+EPDKjvbdfMfWfljL
+EPCkKvbdrMzJyMIJ
+DoCjjvbdJKEAJofd
+DnbjjvbdnBiwXoNu
+DoCjjvbdDihJvYKA
+DnbkKvbdSZigsDWA
+DoCjjvbdFejRmhsq
+DnbkKvbdaMkCTVNH
+EObkKvbdczZPxZRC
+EPDKjvbdVZIUZjnn
+DoDKjvbdkySrTZGt
+DoDLKvbdsPvPKDVf
+DoCkKvbdwWlBVaVu
+EPDKjvbdANIZSvyx
+EPCkKvbdnHFYNNgZ
+DnbkKvbdNdcsiIkE
+EPDLKvbdDoCkLWbd
+EPDKjvbdQccBPqDr
+EObkKvbdSPsfifEX
+EOcKjvbdelfXHNJk
+EObkKvbdFfKRmiUR
+EOcLKvbdKCibqKDY
+EPDLKvbdUWLpJsaR
+EPCkKvbdKfFhCBQu
+EOcKjvbdmuUzLJrG
+EOcLKvbdBdQBVjMf
+EOcKjvbdfpBzvcwh
+EOcKjvbdmRyUzSci
+EOcKjvbdFVxpPlie
+DnbjjvbdDwwlUUUM
+DncKjvbdUyHsyjoO
+DoCkKvbdUslselVj
+DncLKvbdmuUykJqf
+DncLKvbdLFfHbApu
+DncLKvbdhyuFlROG
+EPDKjvbdxnTIYTJD
+EPDKjvbdTulPjUAq
+DoCjjvbdCDoaWJlf
+DoCkKvbdbLMGOnDA
+EPDKjvbdOStVfdtp
+EPCkKvbdZRMeImFR
+DoDLKvbdiVZeXRuC
+EPDKjvbdRosfiedX
+DoCjjvbdnGeYMnGy
+DoCjjvbdiiehKNYS
+DncKjvbdbhmKKfXY
+EOcLKvbdnBjXXoNu
+EPDKjvbduLwwAtAw
+EOcLKvbdygYlAMeX
+DoCkKvbdNsTvHEtp
+EPCjjvbdsrrTYzFD
+EPCkKvbdBdQAuimG
+DncKjvbdmfeYMnHZ
+EOcKjvbdxZhFexEr
+DncLKvbdZshhyETO
+EObkKvbdOFEUJJLE
+DoDLKvbduDCtvuoP
+EOcKjvbdGZVVBEYC
+EObjjvbdZRMeJNEq
+DnbkKvbdkxsRsYft
+DnbkKvbdsBfNLfjy
+EOcLKvbdNPxQvOHT
+DnbjjvbdpstHRqkU
+EOcLKvbdZQleJNFR
+EPCjjvbdxVNEpxkn
+DoCkKvbdwtmEqZLn
+DoCkKvbdGAoQxizm
+DoDLKvbdVqmwaeLc
+DoDKjvbdKfGHaaQu
+DoCjjvbdcJNKLGWx
+EPDLKvbdrzMPsBHn
+DncKjvbdfoazwDxI
+EPDKjvbdZyEJnClS
+DnbjjvbdwMvANDeN
+EObjjvbdZshiZETO
+EPDKjvbdUslselVj
+DoDKjvbdwtmEpyLn
+DncLKvbdJTYaTMxM
+EPDKjvbdvBDxsOeI
+DoDKjvbdxrmhmSCH
+EPDLKvbdjJegjNYS
+EOcKjvbdJvUedEgJ
+DnbkKvbdVZITyjoO
+DoDKjvbddePSCWbj
+DncKjvbdWIXvXgYz
+EPDKjvbdZQmFJMeR
+DnbjjvbdqdEiPnWB
+DoDLKvbdUVkojTaR
+DoDLKvbdFVxpPmJe
+EPCjjvbdxmsHwsIc
+EPDLKvbdiiehJlxS
+EPDLKvbdCTAbsewS
+EPCjjvbdzoPpdbkx
+DnbkKvbdijGHilxS
+EPDLKvbdOYOuzdNt
+EOcLKvbdTppoUuIN
+DnbkKvbdcScLUDia
+EOcLKvbdePFTLUTr
+EOcLKvbdhgKCxvKV
+EPCkKvbdrJAKFNOe
+EOcKjvbdVwJXucdg
+EPCkKvbdNddUJJKd
+DncLKvbdJYUCHlQp
+EObjjvbdkVvnDaxX
+EPCjjvbdNeDsiJLE
+EPDKjvbdyzeNqhJI
+EPCjjvbdmIdTqUrB
+EPDKjvbdZoOJFEyj
+DoDKjvbduaDxsOeI
+EPCkKvbdKjaIWAKZ
+DncLKvbdKaLHMbYR
+EOcKjvbdrafMlHKy
+EPCjjvbdhtzEvqtb
+EPCkKvbdddoSCXDK
+EOcKjvbdzjUpPdTU
+EPCjjvbdLZRJrzuG
+EOcKjvbdaMjaruMg
+DoCkKvbdyOSgwsJD
+EPCjjvbdKDKCqJcY
+EObkKvbdvAcxrneI
+EObjjvbdwuMeQxkn
+DncLKvbdmSZUysDi
+DnbkKvbdcIlijfWx
+DoDKjvbddndrjtTr
+EOcKjvbdwtmEqYlO
+EOcKjvbdYzcFqivZ
+DnbkKvbdCDpBWJmG
+EOcKjvbdaSGCgsfL
+EObjjvbdIwtBhLqQ
+DnbkKvbdyzdmrIIh
+EPDLKvbdWexzUAOs
+DncLKvbdRXNdCkgc
+EOcKjvbdkVwNdBww
+DncLKvbdIGfzYxYH
+DoCkKvbdbAvFGPow
+DoCkKvbdQlxBxnUz
+DncKjvbdqrUkOKaN
+EPDLKvbdZisIQGaf
+DoDKjvbdsQWPJbvG
+DncLKvbdjhHMFfNk
+EObkKvbdwNWAMdFN
+DoCkKvbdeKKRutzn
+EObkKvbdJpyeOfNe
+EOcKjvbdQmXayNtz
+DncKjvbdnHExNNgZ
+EPCjjvbdULuoBVni
+DoCjjvbdqquLNjaN
+EPDKjvbdyzdnSIJI
+DnbkKvbdQvnDcLgc
+DoCkKvbdtcDUvvOo
+DnbjjvbdnGeXmNfy
+DoDKjvbdxsNhmRbH
+DoDKjvbdtTSSyZeD
+DoDKjvbdRadFMJZL
+EOcKjvbdUaCQrpqy
+DoDLKvbdEJgivXjA
+EOcLKvbdGFjSOItR
+EPDLKvbdaSGDIUGL
+DnbjjvbdJYTagkqQ
+EOcLKvbdZLrDsmlN
+EOcLKvbdEJgiuwjA
+DoDKjvbdxUleRYlO
+DnbjjvbdQwODcLhD
+EObkKvbdOTUVgEtp
+EObkKvbdRMwaxnUz
+EObjjvbdrEFJPmua
+EOcLKvbdiUzEvquC
+DoDKjvbdMpYQumfs
+EPCkKvbdhancEvqR
+DncKjvbdkNCMZdfo
+DncLKvbdZHWdAOri
+EObjjvbdlrYuZrci
+EObjjvbdgLGzbfAE
+EObjjvbdcTCkUEJa
+EPDLKvbdVAbRTRRy
+DoCjjvbdYqNEiMeR
+DncKjvbdBvzchdpW
+DnbkKvbdtSqryZdc
+EPCjjvbdwygeeweS
+DoCkKvbdqlzJyLhJ
+EOcLKvbdtbbtvvOo
+DoDKjvbdrSVKnLAm
+DnbkKvbdfMevgNKL
+EObjjvbdRacdkhyL
+EPCkKvbdFpASvgGZ
+EPDLKvbdZoOJFEyj
+EPCjjvbdzjUpPcrt
+EOcKjvbdcbSlrATm
+EOcKjvbdqwPkbhxq
+DnbjjvbdHELVibKK
+EPDKjvbdZQldiMeR
+DnbjjvbdpstGqrKt
+DoDKjvbdGFjRmiUR
+EPCkKvbdssRsZZdc
+DnbkKvbdlqxuZsDi
+DncKjvbdEXwlUTtM
+DnbjjvbdyzdnRhIh
+EPCjjvbdkCkkRGtg
+EOcLKvbdLrWlytpz
+EPCkKvbdCEQAvKNG
+DncLKvbdVwIxWDeH
+EObkKvbduMYXBTaX
+DoCkKvbdRyihTDWA
+DnbjjvbdkaMoNALA
+DnbjjvbdaMjartlg
+DoCkKvbdNVTSKmAX
+DoDLKvbddwystRez
+EPCjjvbdcImJjevx
+DoCkKvbdeAUQlwjG
+DoDKjvbdZxcjNblS
+DncLKvbdkIGlFenL
+DoCjjvbdfHjurNqH
+DoCkKvbdiBoDFXRR
+EPDLKvbdvBDyTPFI
+DnbkKvbdUxhUZkPO
+EObjjvbdqZOhHQdY
+EOcKjvbdSCDeLiZL
+DncKjvbdozmckYPA
+DncKjvbdgGLymgHA
+DncKjvbdILaznWpk
+EPCjjvbdqUTgSSKt
+DoCkKvbdrovOjCuf
+EOcLKvbdKfGIBaQu
+EPDKjvbdCIjajiFj
+EPCkKvbdmoyxujyC
+EObkKvbdySnJMrCH
+EOcLKvbdHDjujBij
+EObjjvbdrMyiyMHi
+DoCkKvbdiifHimXr
+DnbkKvbdbsCkTcia
+DnbkKvbdMfbpNPtk
+EOcLKvbddoErkUTr
+DncLKvbdqZOhGqDx
+DnbjjvbdDncKkXCd
+DoCjjvbdSCEElIxk
+EPCkKvbdbUbHXjsh
+DnbkKvbdCTAcUGWr
+EPDLKvbdZtIiZESn
+DnbjjvbdrDeJPnVa
+DoCkKvbdZisIQHCG
+DncLKvbdgFkzOHHA
+EPCkKvbdmfdxMmfy
+DncLKvbdMIbMRYAS
+EOcKjvbdaogGckzd
+EOcLKvbdLAkHMawq
+DncLKvbdxwiJbQZk
+DncLKvbdauBgYLUI
+DnbkKvbdnQZxvKyC
+EOcKjvbdFkEsChNV
+DoDLKvbdpstGrRjt
+EPDLKvbdlYrrSxgU
+DnbjjvbdZQmFIldq
+DoCjjvbdbhmKLFvx
+EObkKvbdsBellGjy
+DncLKvbduCcUwWOo
+EObkKvbdJuuGEEfi
+DoCkKvbdIwtCHkqQ
+EPCkKvbdaMkBruMg
+DncLKvbdEARiMyvw
+EObjjvbdmgExNOGy
+DoCjjvbdpfDdsuaI
+EPDLKvbdEzspdlCi
+EPDKjvbdqdFJQNua
+DnbkKvbdnBjWxOnV
+EPDLKvbdZisHogBf
+EPCkKvbdjcMKpftg
+DnbkKvbdauCGwjsh
+DoDKjvbdlYrrTZHU
+EOcLKvbdzjVPpDrt
+DoCkKvbdQdDApQdS
+DoDKjvbdehLWRmpg
+EPDLKvbduoTzpkPU
+DoCkKvbdliDspuRa
+DoDKjvbdEXxLsssl
+EObjjvbdZsiJYcrn
+DoCkKvbdaaWFGPpX
+DoCkKvbdrafNMHLZ
+DoCjjvbdmgEwlnHZ
+EPCkKvbdFkEsCgmV
+DncKjvbdqmZjYlHi
+DoCkKvbdfILWSORH
+DoDLKvbdnCKXYOnV
+DnbkKvbdHgGyyYYH
+DoDLKvbdEKHjVxKA
+EPDKjvbdbAueGPow
+DnbkKvbdFyUuBDwb
+EPDKjvbduCcUvvOo
+EObkKvbdauBfxKsh
+EObjjvbdZjTIPgBf
+EObkKvbdNGbolpVL
+EOcKjvbdeFOqbWbj
+DoCjjvbdvwMAvBVu
+DnbkKvbdzRPMhjXA
+DncKjvbdFkErcIMu
+EPCjjvbdhlFEOUcZ
+DoCkKvbdJbjCpicY
+EPCkKvbdZGwEAOri
+DnbkKvbdNQYQunHT
+DoCkKvbdkIHMFfOL
+EObkKvbdHELVjBij
+DoDLKvbdZQldhleR
+DoDLKvbdVTmTelVj
+DnbjjvbdJTZArlwl
+DnbkKvbdCDpAvKMf
+DoCjjvbdDxYLtUTl
+DoDLKvbdwkWcgzyf
+EPDLKvbdLBKgNCYR
+DoDLKvbdZMSEUNkm
+EOcLKvbdxUmEpxkn
+EOcKjvbdGLFTDHlu
+EOcLKvbdyYJKCPyk
+DoCjjvbdDnbjjvcE
+DoDLKvbdatbHXjtI
+EObjjvbdbiMjLGWx
+EPDKjvbdTYKlNzjx
+EOcKjvbduDDUvvPP
+EObkKvbdliETpuSB
+DnbjjvbdrWolDIxq
+EObjjvbdqZOggQcx
+EOcLKvbdyXiKBoyk
+DnbjjvbdqmZiyMIJ
+EPCjjvbdULuoAuoJ
+DoDLKvbdYzcGRivZ
+DnbjjvbdtkwwBTaX
+DnbjjvbdJbicQicY
+DoCkKvbdTukojTaR
+EPCkKvbdHbLydzAD
+EObjjvbdVTltGLvK
+EPCjjvbdUsmUFkuj
+EPDLKvbdTqROuVIN
+DncLKvbdYkrETnLm
+DoCkKvbdeFPSBwDK
+DnbjjvbdNGcPmPtk
+DnbjjvbdWHwuxHYz
+DoDLKvbdNUsRjmAX
+EOcKjvbdZjTHpHBf
+DncKjvbdWXIwvDeH
+EOcLKvbdrJAKEloF
+DoCjjvbdFeirOJUR
+EOcKjvbdWWhwvEEg
+DncKjvbdKeehBaQu
+DnbjjvbdZLrDsmlN
+EOcLKvbdZnnIeFZj
+DoCkKvbdjKGHjMwr
+EObkKvbdmIctQtqa
+DoCjjvbdkClKpfuH
+DnbjjvbdcTDKscia
+DnbjjvbdADSYKZiQ
+EObkKvbdygZMANFX
+EPCjjvbdaMkCTUlg
+DoDKjvbdzjVPodTU
+EPCkKvbdIxTagkpp
+EPCjjvbdZjSgpHBf
+EOcLKvbdiCOcEvpq
+EOcLKvbdsQWOibvG
+DoDKjvbdEuxoomJe
+DoDKjvbdmuVZkKSG
+DoCjjvbdSZjITDWA
+DoCkKvbdCJLBkJGK
+EPCkKvbdliDsqVSB
+DoCjjvbduaDxrneI
+EOcLKvbdtvNxJpsA
+EOcKjvbdEuyPoljF
+DnbjjvbdwWlAuaWV
+DncLKvbduMXvaTaX
+EObjjvbddxZstSFz
+EPDLKvbdmttykKSG
+EPCjjvbdfIKvRnRH
+DoDLKvbdjgfkeemk
+DoCkKvbdHELVjBjK
+EObjjvbdaRecIUGL
+DnbkKvbdmSYuZrci
+DoDLKvbdKfGHaaQu
+EOcLKvbdIwsahLpp
+EOcLKvbdEuyPomKF
+DoCkKvbdsQWPJcVf
+DnbjjvbdbPgHDkzd
+DoDKjvbdZMSETnMN
+DoDKjvbdJSyBTMwl
+EPCkKvbdSCDeMIxk
+DoDLKvbdtkwwBTaX
+DoCjjvbdtbcVWuoP
+EPCjjvbdozmdKxPA
+DoCjjvbdtkwwBUBX
+DoDLKvbdQdDBPpcr
+DoCjjvbdJbjCpjDY
+EPCjjvbdCTBDTfWr
+EPDKjvbdYNqAYUut
+DoDKjvbdURRPVUgm
+EOcLKvbdNPwqVmfs
+DoDKjvbdsCGMkgLZ
+DoDLKvbdZtIiYcsO
+EObjjvbdhficZWJu
+EPCjjvbdTqRPUuIN
+EPCjjvbdyOShXsIc
+EOcLKvbdliETqVRa
+DncKjvbdYqMdhmEq
+DoCkKvbdKfGHbBQu
+DnbkKvbdqBIeAXIE
+EPDLKvbdQZNAHTRj
+EObkKvbdRosgJecw
+EPCjjvbdKQzEnfOF
+DoDKjvbdzRPMiKXA
+DnbkKvbdGcjvJbJj
+DoCjjvbdbAvEeoow
+DncKjvbdFVyQPmKF
+EPDLKvbdRzKIScWA
+EPCkKvbdKkAhWAJy
+EPCkKvbdJqZdnenF
+DoCkKvbdVUMtGMWK
+DncKjvbdBiLBjiGK
+DnbkKvbdjvWnDbYX
+DnbkKvbdwuNEqYkn
+DoDKjvbdegjurORH
+EObjjvbdpeceTvAh
+DoCkKvbdAMgySwZx
+EPCkKvbdlZSqsZGt
+EPDLKvbdbrbkTdKB
+EPDKjvbdhzUekpnG
+DncLKvbddeOqbWbj
+EPCjjvbdsPunibvG
+EOcLKvbdVwIxVdEg
+DoCjjvbdkIHLefNk
+DnbkKvbdxmrhXrhc
+EPCkKvbdziuPocrt
+EOcLKvbdNUsSLNAX
+DncKjvbdhkddNtcZ
+DoCjjvbdMpYRWNgT
+EObjjvbddZxoxYqC
+EOcLKvbdNVTRjmAX
+EPDKjvbdZjTIQHCG
+DnbkKvbdHEKvJbKK
+EOcKjvbdiGibxvJu
+DnbjjvbdsCGNMGjy
+DoCjjvbdBhkBjhfK
+EPCkKvbdSCDdkhyL
+DnbjjvbdNPwpvNfs
+EOcLKvbdJTZBTNYM
+DncKjvbdqGEFTvBI
+EObkKvbddneSjtTr
+DncLKvbdqdFJPmua
+EPDKjvbdrbFmMGkZ
+DoCjjvbdhXZAzzAJ
+EOcKjvbdkxsSSxgU
+EPDKjvbdrEEhonVa
+DnbkKvbdYzcGSKVy
+DoCjjvbdzROmJJwA
+EPDLKvbdOEdUJJKd
+EPCjjvbdqquKmkAm
+EOcLKvbdZyEKODLr
+DnbkKvbdIsZAsMxM
+DnbjjvbdZjTHofaf
+DoCjjvbdrSUkOLAm
+EPCjjvbdBsAbsewS
+EObkKvbdUsltGLuj
+EPCkKvbdANHyTWyx
+EObkKvbdsBemMGjy
+EObjjvbdMoxRVmfs
+EPCkKvbdNGbolouL
+EPDLKvbdjKGHimXr
+DncKjvbdUMWPAuni
+EOcLKvbdOEdUIhkE
+EPCkKvbdjKGHimXr
+EPCkKvbdhuZdwSVC
+DoCjjvbdCIkBjiFj
+EPCkKvbdxZhGFxFS
+EObjjvbdOFDtJJKd
+DoCkKvbdfNGWgNKL
+EPDLKvbdcarmSATm
+DoDKjvbdkNCMZeHP
+DoDLKvbdkMakyeGo
+DnbjjvbdiHJcYvKV
+DnbjjvbdWWhxVcdg
+EPDKjvbdVUNTelVj
+DoDKjvbdZGvdAPTJ
+DoCjjvbdDncLLXCd
+EPDKjvbduDCuWuno
+DoCkKvbdPyNAHTSK
+DncKjvbdqwPlDIyR
+EOcKjvbdYzbfSJvZ
+DnbkKvbdRotGifDw
+DoDLKvbdRDcBQRDr
+DoDKjvbdEARiNZvw
+DncKjvbdJSxaTNYM
+EPDKjvbdVwJXvDeH
+EOcKjvbdQwOECkhD
+DoCjjvbdEPCkLWbd
+EPDKjvbdVBBpsRSZ
+EOcKjvbdddoSBwCj
+EOcKjvbdFkFScINV
+EObjjvbdpstGrSLU
+EPDLKvbdhaoDFXRR
+EPDKjvbdKfGICApu
+EObkKvbdBsAcTevr
+EObkKvbdhkeDmtby
+DoCkKvbdqYngfpdY
+EOcKjvbdsPvPKCvG
+DoDLKvbduVmwiqTA
+EOcKjvbdidkGtoAO
+EPCkKvbdyzeORgiI
+DoCkKvbdmJDsqUqa
+DncLKvbdiGibyVjV
+DncKjvbdhtzEwSVC
+EOcLKvbdZRMdiNFR
+EOcKjvbdrafMkgKy
+DoDKjvbdZGwEAOsJ
+EOcLKvbdjmCMZeHP
+DncLKvbdjKFgimYS
+EPCjjvbddZxpYZRC
+DncKjvbdjmBkzEgP
+EObkKvbdkIHLeemk
+EPDKjvbdjAQGaQGj
+DncLKvbdSPtHJfDw
+DoCkKvbdGKdsChNV
+EPCjjvbdrouoJbuf
+EPDKjvbdlhcsqUqa
+DoCjjvbdwXMBWAvV
+DnbkKvbdhkdcmtby
+EOcLKvbdFkEsDHmV
+EOcLKvbdCIkBjhej
+DoCkKvbdiLeDnVDZ
+DoDLKvbdDxXlTssl
+DnbjjvbdNrtVfduQ
+EPCkKvbdHDkWJajK
+EPCjjvbdTulQKUBR
+DoDKjvbdJYUBhLpp
+DncKjvbdiCOcFXRR
+DoCkKvbdxsNiMrBg
+EObkKvbdQlxByNtz
+EPCjjvbdBhkBjiFj
+EPCjjvbdNeDsiIjd
+DncLKvbdBsAcTfXS
+DncLKvbdDwwlUTsl
+EOcKjvbdUQqPVUgm
+DncKjvbdmttzKirG
+EPCjjvbdKWUfEFHJ
+EPCjjvbdGKdrcINV
+EPDLKvbdkxrrTYgU
+DoCkKvbdQdCaQQcr
+DnbkKvbdvAdYroFI
+EObkKvbdFxttaDwb
+DnbkKvbdQdDBPqES
+DncKjvbdkVwODbXw
+DoCkKvbdrounicVf
+EPCjjvbdBcoaVjMf
+DncKjvbdcImKKevx
+DoCjjvbdxLWdHzyf
+EOcLKvbdcbTNSATm
+EPDKjvbdRacdlJZL
+EPDLKvbdZQleIleR
+EPCkKvbdTfznLwWF
+EObkKvbdsCFmLgKy
+DoDKjvbdyqOlhiwA
+EOcKjvbdtcCtwVoP
+DnbjjvbdRWmdCkgc
+EOcKjvbdqUTfqrKt
+DnbkKvbdRyjHsDWA
+DoDLKvbdYqMdiNEq
+EOcKjvbdhbPCeXRR
+EOcKjvbdVrNwbFLc
+EObkKvbdZLqcsmkm
+DoDKjvbdRWmdDMID
+EPCjjvbdkWXNcbYX
+DncLKvbdZyDinClS
+EOcLKvbdqUTfqqjt
+DncLKvbdUtNTelWK
+EPDKjvbdkWWmdCXw
+DoDKjvbdezuxdhtX
+DoCkKvbdaSGCgtGL
+EPDKjvbdVwJYWDdg
+DoDLKvbdWSOYCFMD
+EObkKvbdxwiJaozL
+DoCjjvbdTpqOuVIN
+DoCkKvbdrzLpSaHn
+DnbkKvbdJutecdfi
+DnbkKvbdhgKDZVjV
+DncKjvbdCJKajiGK
+EPCkKvbdbrcLTcia
+DncKjvbdxxIibPzL
+DoDLKvbdNUsRkNAX
+DoCkKvbdZRMeJMdq
+DnbjjvbdxsOJMqbH
+DncKjvbdqAheAWhE
+DoCkKvbdZnnIddyj
+DoCjjvbdrpWOibuf
+DoCjjvbdDxXlUUTl
+EPDKjvbdZirgofbG
+DnbjjvbdDnbkKvbd
+EOcLKvbdoznDkXoA
+DnbjjvbdozmdKxPA
+DnbkKvbdfHkVqmqH
+DoDLKvbdkDMLRGtg
+EPDKjvbdDxXlUTtM
+DoDLKvbdZLrETmkm
+DoCjjvbdLAkGlbYR
+DncLKvbddndsLUUS
+DoCjjvbdaRfDIUFk
+DnbjjvbdjJfHjNXr
+DncLKvbdeFPRbXDK
+DoCkKvbdJYTbIMRQ
+DnbkKvbdptUGrRjt
+EOcKjvbdkMbLzEfo
+DoCjjvbdezuxeJUX
+DoCjjvbdZMRctOLm
+DoDLKvbdWWiXudEg
+DnbkKvbdiiehKNXr
+DoCkKvbdXrkaNUOx
+EPDLKvbdZjTIQGbG
+EObjjvbdeOeTLTtS
+EPDKjvbdBraCsewS
+EPDLKvbdLBKflaxR
+DncKjvbdRzJhScWA
+EPDLKvbdGKdrbhMu
+DoDKjvbdFeiqmiUR
+DnbjjvbdFWYooljF
+DnbkKvbdUWLoisaR
+EPDKjvbdfRaWzkbo
+EPDLKvbdKQzEnfNe
+DoDLKvbdnUtyjiqf
+DnbjjvbdyNrgxSiD
+EOcKjvbdjlakzFHP
+DoCkKvbdjvXODaxX
+DnbkKvbdLFfHaaRV
+EPCkKvbdwuMeRYlO
+EPDLKvbdtSqrxzEc
+DncKjvbddwytTqez
+EOcKjvbdZLqcsnMN
+DoCjjvbdkxsSTZHU
+EPDKjvbdiZtekqNf
+EObkKvbdnCKWwnmu
+EObjjvbdauBgYKsh
+EPDKjvbdrSVKmkBN
+EObkKvbdxrnImSBg
+DncKjvbdZnnJEeZj
+DoDKjvbdZjTIQHBf
+DncLKvbdmIctRVRa
+DoCjjvbdziuQQDsU
+EPDKjvbdZRNFJNEq
+EOcKjvbdTqRPUthN
+EPCkKvbdePFSjssr
+EPDLKvbdfIKuqmqH
+DoDKjvbddZyQYYpb
+DoDLKvbdWRmwaeMD
+DoDLKvbdOYOuzcmt
+DoDLKvbdxsNiNRbH
+EPCkKvbdNeEThiLE
+EPCkKvbdNPxQunHT
+EPCjjvbduCbtvuoP
+EOcLKvbdjgfkeemk
+EObjjvbdjlbLydfo
+DoDLKvbdxmsIXrhc
+DoCkKvbdlrZVZsDi
+DoDKjvbdEztRElCi
+EObjjvbdBsAbsfWr
+DoDLKvbdZHWdAOsJ
+DnbjjvbdSCDdkhxk
+EObjjvbdeFOqbWcK
+EPDLKvbdZtJJZESn
+EPCkKvbdKfFhBaQu
+DoCkKvbdMpYQvNfs
+EObjjvbdrpWOjCvG
+EPDLKvbdJSxaTMxM
+EPCjjvbdOSsvGduQ
+DoDLKvbdtumxKRTA
+EPDKjvbdBcpBWKMf
+DnbkKvbdtbbuWvPP
+DoDLKvbdKWUfDdfi
+EPDKjvbdOStVgFVQ
+EObkKvbdZnmheFZj
+DoDLKvbdQwODcMID
+DoDKjvbdVrNxBeMD
+DoCkKvbdaSFbgsek
+DoCjjvbdTvMQKTaR
+DoCkKvbdZsiIxdSn
+EObkKvbdakMFnnDA
+DoDLKvbdJutedFHJ
+EOcLKvbdhzVFlQnG
+EObjjvbdzjUpQDsU
+EPCkKvbdzoQQeCkx
+DncKjvbdZjShPgCG
+DnbjjvbdMgCpMpVL
+DnbkKvbdNGbpNPuL
+EObkKvbdKfFhBaRV
+DnbjjvbdKQzFPFnF
+EPDKjvbdCIkBkJGK
+EObkKvbdmajXXnnV
+DoCkKvbdNwnuzcnU
+EObjjvbdauCGwkTh
+DnbkKvbdbiNKKfXY
+DnbjjvbdQmYCYnUz
+DoDKjvbdiLddNtcZ
+EOcKjvbdeEoSBwDK
+DoDKjvbdcTCkUDia
+DnbkKvbdZRNEhmEq
+EPCkKvbdHfgZxxXg
+EObjjvbdbsDLUDjB
+EPDKjvbdhbPDFWqR
+DncLKvbdKNADyfuB
+EObkKvbdEztREkcJ
+DncLKvbdbLMFnnDA
+EObkKvbdZjShPgBf
+DncLKvbdbVCHXkTh
+DnbkKvbdqTtHSRkU
+EObkKvbdfSBWzlDP
+DnbkKvbdGKeTDIMu
+EOcLKvbdGcjvJbJj
+EPCkKvbdMowqWOHT
+DncKjvbdYpmFIleR
+EPDKjvbdZxcjNblS
+DncLKvbdNrtVgEuQ
+EOcKjvbdqrVKnLBN
+DnbkKvbdatbHXkUI
+DoCkKvbdEPDKkWbd
+EPDLKvbdmIdURVRa
+DoCkKvbdMoxRWNgT
+EObjjvbdLBKflbXq
+DoCkKvbdSwjkmzkY
+DoDKjvbdJbicQicY
+EObkKvbdNQYQumgT
+DoDKjvbdxxJKCPzL
+DncLKvbdnGdxNNgZ
+DoCkKvbddijSVtzn
+EPDKjvbdrJAJdmOe
+DnbjjvbdzoQQeDLx
+DoCjjvbdZRMeIldq
+DnbjjvbdkHgMGGOL
+DoCjjvbdaSGChTfL
+EOcLKvbdCJLCKiFj
+DoCkKvbdVhXvYHYz
+EPCjjvbdcSbjscia
+EOcKjvbdxZgeewdr
+EPDLKvbdYkqdUNlN
+DnbkKvbdREDApQdS
+DnbjjvbdmozZVkYb
+EPDKjvbdaRecITfL
+DncLKvbdZyEJmbkr
+EOcKjvbdZnnIdeZj
+DncLKvbdeXzTsrFz
+DoCjjvbdZRMdhmEq
+EOcLKvbdGGJqmhtR
+EPDKjvbdIidAJpHE
+DncKjvbdMRwNZtpz
+DncLKvbdnBiwXoOV
+DoDLKvbdqYnhGqEY
+EOcKjvbdWexytAOs
+EOcKjvbdiZuFlQnG
+EObkKvbdVAaqTRRy
+EPCkKvbdTAEhgaoE
+DoDKjvbdMoxQvNfs
+EPDKjvbddjJqvUzn
+EObkKvbdBiKajhfK
+EPDLKvbdZLqcsmlN
+DoCjjvbdgPazwDwh
+EPCkKvbdwkWcgzzG
+EPDKjvbdlYsSSyGt
+EObjjvbdZLrDsmkm
+DncLKvbdbsCkUDia
+EObkKvbdkxrrSyGt
+DnbkKvbdnBivxOnV
+DoDLKvbdZirhPgCG
+EObjjvbdfMevfmKL
+EPDKjvbdSQTgJecw
+DoDLKvbdUWMPitAq
+DoDKjvbdwtleRZMO
+EObjjvbdKRZdoGNe
+DoCjjvbdauBgYKsh
+DoDKjvbdXrlAlsnx
+DncKjvbdUMVnaVni
+DncKjvbdiHKDYvKV
+DnbkKvbdySnJNSCH
+EPCjjvbdfNGWgNKL
+EOcLKvbdnQZxujxb
+EObjjvbdVgwvXgYz
+EOcLKvbdjKGHimYS
+DnbkKvbdhanbeXQq
+DncLKvbdhzUfLpmf
+DoDLKvbdczZPxZRC
+EPDKjvbdRNYBxnUz
+EOcLKvbdlrZVZrdJ
+DncKjvbdtcDUwWOo
+EPCkKvbdQvmdDLhD
+EPCjjvbdfMfWfljL
+DoCjjvbdZyEKNbkr
+EOcKjvbdgPazvcxI
+DncKjvbdfNGXHMjL
+DncLKvbdEKHjWXjA
+EObkKvbdZjSgogCG
+EPCjjvbdxnSgxShc
+EPCjjvbdqrVKmkBN
+EPCjjvbdbBVdepQX
+DoCkKvbdrXQLbhxq
+DoCjjvbdbVBfxLTh
+EPCkKvbdHlBznWqL
+EPDKjvbdTAEhgaoE
+DnbjjvbdCfkfHAzc
+DnbkKvbdptTfqqjt
+EPDLKvbdWIXuwgYz
+EObjjvbdrJAJeNPF
+DncLKvbdKDKDRJcY
+DnbkKvbdrDeIpNvB
+DncLKvbdVwIwudFH
+DncKjvbdICMZdzAD
+EPCkKvbdsQVnjDVf
+EPDKjvbdiZuGMRNf
+DoDLKvbdIGfyyXwg
+EPDLKvbdYORAXtut
+DoCjjvbdhzVGMQnG
+EPDLKvbdQwNcbkgc
+EObjjvbdsBemLgLZ
+DoDLKvbdZtIiYdSn
+DoCjjvbdelevfljL
+DoCkKvbdcyxowxqC
+EPDLKvbdZMRdUNlN
+EOcLKvbddZyPwyRC
+EPCjjvbdZLrDsnLm
+EPCkKvbdgPazwEYI
+DoDKjvbdqFdEsvBI
+EOcKjvbdVviXvDdg
+EPCjjvbdCWzdIdov
+DncKjvbdrSVKnLBN
+EObkKvbdiLddNtcZ
+EPDLKvbdrDdiPmvB
+EPDKjvbdKDKDRKCx
+DoDKjvbdtSqsZZeD
+DoDLKvbdwuNFRYlO
+DoCjjvbduLwvaTaX
+EObjjvbdtkxXBUBX
+EOcLKvbdSQTgJfEX
+EObjjvbddneTKtUS
+DoDLKvbdAMhYsXZx
+EOcLKvbdczZPwxqC
+EPDLKvbdjbkjqGtg
+EOcLKvbdFkEsChMu
+EObjjvbdbsCkUDia
+EObkKvbdEzsqElDJ
+EPDLKvbdGZUuBEYC
+DoCkKvbdzROmJJwA
+EPDKjvbduMXwAsaX
+EPCjjvbdqwQMDJZR
+DoDKjvbdqUUHSRkU
+DoCkKvbdwtleQxkn
+DnbkKvbdQvnEClHc
+EPDKjvbdjvXNcaww
+DoCjjvbdjggMFenL
+EPDLKvbdJYUBhLpp
+DnbkKvbdkNCLyeGo
+DoCjjvbdDoCkLWcE
+EOcKjvbdYqMeJNFR
+EPCjjvbdRDcApQdS
+EObjjvbdjblKpgVH
+EPDKjvbdqqtjnKaN
+DoDLKvbdwtmFRYlO
+DoCjjvbdnHEwmNgZ
+DncLKvbdaMjasVNH
+DncKjvbdnUtzLKSG
+DoDLKvbdkySrSyGt
+EPCjjvbdyNsIXriD
+DoCkKvbdRadFMIyL
+EOcKjvbdqvokbhxq
+EPCjjvbdYkrEUOLm
+EPDKjvbdrpWPKCvG
+DncKjvbdxUldpyLn
+EObjjvbdrbFmMHKy
+DoCjjvbdZHWdAPTJ
+DncKjvbdEPDLKwDE
+DnbjjvbdZHWdAPTJ
+DoDLKvbdNrsvHFUp
+DncLKvbdCTBDUFvr
+EPDLKvbduDDUvuno
+DoDLKvbddwystSFz
+DnbkKvbdmbJvwoNu
+EPCjjvbdcbTNSAUN
+DnbjjvbdnVUzKjRf
+EOcLKvbdYlRdUOMN
+DoCjjvbdTAFIgand
+DnbkKvbdpeceUVaI
+DoDLKvbdlZSrTYft
+EPCjjvbddePRbXDK
+EOcLKvbdJqZdnfNe
+EPCkKvbdRaceLhyL
+EPDKjvbdLAkGlaxR
+EPCjjvbdqGDdsvAh
+DnbjjvbdxZgefYEr
+EObkKvbdKWVGEFGi
+EPCjjvbdSQUHKFdX
+EPDKjvbdDxYLsssl
+EPCjjvbdfHjvSNqH
+EPCkKvbdQwODbkhD
+EOcKjvbdZnmiFEyj
+EPCkKvbdqwQMChyR
+EOcLKvbdZyDimcLr
+EObjjvbdjAQGaQGj
+EPCkKvbdZtJJYdTO
+EObjjvbdjFKgUoAO
+DnbkKvbdcScLUEKB
+EPDKjvbdjcMLRGuH
+EObjjvbdqlzKZLgi
+EOcKjvbdFfJrNiUR
+EObkKvbdKaKgNBxR
+EOcKjvbdHDjujBij
+EObkKvbdFejSOJUR
+DncLKvbdMIalRYAS
+EOcKjvbdVTlsekvK
+DoCjjvbdUQqOtthN
+DnbjjvbdVYgtZkOn
+DnbkKvbdrovOicVf
+DncKjvbdKfGIBaQu
+DnbjjvbdjuvnDaxX
+EPDLKvbdHakzEzAD
+EPDLKvbdyzdnRhIh
+DoCjjvbdZGvdAPTJ
+DoDLKvbdqvolChyR
+DncLKvbdjlbLyeHP
+EPCkKvbdmIdTptrB
+EPCkKvbdQcbaPqES
+DoDLKvbdddoSBwCj
+DnbjjvbdjvWnECXw
+DnbjjvbdZisHofbG
+EOcKjvbdZQldhldq
+DnbkKvbdfekymfgA
+DnbjjvbdLBKgMbYR
+EPCjjvbdEARiMzWw
+EObjjvbdtSrTYzEc
+EPDKjvbdZoOIddyj
+DnbkKvbdcSbjtEKB
+EObjjvbddndsKssr
+DoCjjvbdxnSgxShc
+EPCjjvbdOTUVfdtp
+DoCkKvbdUtMselWK
+DnbjjvbdJpydoGNe
+DoCkKvbdGQASwGey
+DnbjjvbdnGdxMnGy
+EPDKjvbdHDkVibKK
+DoCjjvbdtbbuXWOo
+EPDKjvbdKWVGEEgJ
+EObkKvbdGLEsCgmV
+DoCkKvbdbrbjtEKB
+EPDLKvbdRzJgrcWA
+EPCkKvbdaRecITfL
+EObjjvbdrbGMlHKy
+DnbkKvbdZdwfzgiC
+EPDKjvbdVwJXudFH
+DoCjjvbdiZtekqOG
+EObkKvbdqrUkOKaN
+EObkKvbdySnImRbH
+EObjjvbddoFTKstS
+EOcKjvbdyOTHxTJD
+DncKjvbdFVxoolie
+DoCkKvbdFejRnIsq
+EPDLKvbdptUGrRkU
+EOcKjvbdajlGOnDA
+EPDKjvbdrRtkOKaN
+EOcKjvbdzoQQeDLx
+EPCjjvbdrafMlGkZ
+EPCjjvbdmpZyWKyC
+DoCkKvbddBrlrAUN
+DnbkKvbdMgDPlpVL
+DnbjjvbdUxhTzKoO
+DoCkKvbdSCDdlIyL
+EPDKjvbdmbJvxPOV
+EPCkKvbdNGcQMpUk
+EPCjjvbdVqmxCFLc
+DoDKjvbdrDdhonWB
+EOcLKvbdYTLaNToY
+DoCkKvbdkIGlFemk
+EPDKjvbdNrsvHFVQ
+EPDLKvbdrzLoraHn
+EObkKvbdraelkgLZ
+DoDLKvbdBdQAujMf
+DncKjvbdwzIGGYFS
+EOcKjvbdZeXfzhIb
+DoDKjvbdbAueGPpX
+DoCjjvbdZtJJYcrn
+DoDKjvbdyqPNJKXA
+DoCkKvbdTAFIhCPE
+DoDLKvbdjblLQgVH
+DoCjjvbdZtJJZDsO
+EOcLKvbdrNZixkhJ
+DoCjjvbdzoPpdblY
+DnbkKvbdqcdhpNvB
+DncKjvbdYpldhleR
+DoCjjvbdmRyUysEJ
+DoCjjvbdJXtBgkqQ
+EOcKjvbdVwJYWDeH
+DoDLKvbdZLqdUOLm
+EPDKjvbdEXwlUUTl
+EObkKvbdoznDkYPA
+EPCkKvbdEASJNZvw
+EPCjjvbdFjdsCglu
+DoCkKvbdTlWPBWOi
+DnbjjvbdcTCjsdKB
+EObkKvbdkySrTYft
+EPCkKvbdLrXMytpz
+DncKjvbdZQmEhleR
+EOcLKvbdHkaznWpk
+DnbkKvbdHfgZyXxH
+EObkKvbdpecdtWAh
+DnbkKvbdRadElJYk
+EPCjjvbdTXkMNzjx
+DoCjjvbdmSYtzTEJ
+EPCkKvbdZsiJZDsO
+DncKjvbddoErkTtS
+DoCkKvbdZRMdiMeR
+EObkKvbdTfzmkvvF
+DncKjvbdpxnhHQcx
+EPDLKvbdaMjbStlg
+DoCjjvbdkHfkefOL
+DoCjjvbdqqtkOLAm
+DnbjjvbdyzeNqgiI
+EOcKjvbdiLeDnUby
+DncKjvbdyYIjCPyk
+EOcKjvbdpfEFUVaI
+EPCjjvbdZirgpHBf
+DnbkKvbdKWUecdgJ
+EOcLKvbdiHKCxvJu
+EPDKjvbdcTCkUEKB
+EOcLKvbdaMkBsVNH
+EPDLKvbdJutfEFGi
+EPCkKvbdFaOqZJzm
+EObjjvbdhaoCdvqR
+EPCkKvbddZxpXxqC
+DnbjjvbdZxcinDLr
+DoDLKvbdpssfqrKt
+DoCjjvbdqTsgRrLU
+EPDLKvbdEYXlUTtM
+EObjjvbduVmwjQsA
+EOcLKvbdNPxQunHT
+DnbjjvbdBhjajiGK
+DoCkKvbdUGznMXVe
+EPDKjvbdVwIwvEFH
+EObkKvbdRMwayNtz
+DoDLKvbdQZNAGrrK
+EObjjvbdKWUedFGi
+DoDLKvbdaNKartlg
+DncKjvbduWOXipsA
+EObjjvbduVmxKRTA
+DoDKjvbdygZMAMdw
+DoDLKvbdqTsfrRkU
+DoCjjvbdEvYpQMjF
+EObkKvbdNPxQunGs
+EObkKvbdsZlPsAgn
+DnbkKvbdZnnIddzK
+EPCkKvbdNQXqWOHT
+DnbkKvbdGLFSbhMu
+DoDKjvbdrzMPraIO
+DnbkKvbdZirgofaf
+EPDKjvbdijFhJlxS
+DncKjvbdWRmxBeLc
+DnbkKvbduDDUvuoP
+DoDKjvbdiZuGMQmf
+EObkKvbdelfXGljL
+EPDLKvbdfNFvfljL
+DncKjvbdGKdrcINV
+EObjjvbdFfJqnIsq
+EOcLKvbdILaznWqL
+DncLKvbdJutedFHJ
+EOcLKvbdIwtBhLpp
+EPDLKvbdsrrSyZdc
+EPDKjvbdczZQXxpb
+DncLKvbdDoCjjvcE
+EPCjjvbdpxoIHREY
+DoCkKvbdxxJJbPzL
+EPCkKvbdVZIUZkPO
+EPDLKvbdULuoBWPJ
+EPCkKvbdfMfWfmJk
+DnbjjvbdZtIiZETO
+DoCjjvbdiMEcnUby
+DoCkKvbdcyyPxZQb
+DoCkKvbdZirgofaf
+EObkKvbdozmdLYPA
+DoDKjvbdYkrEUNkm
+DoCkKvbdLqwMzVQz
+EObjjvbdLFfICBRV
+EObjjvbdjJehKNYS
+DoCjjvbdEJgiuwjA
+EPCkKvbdyqPNIiwA
+EPDKjvbdNdcsiIjd
+EPCjjvbdauBgXjsh
+DnbkKvbdyzeORgiI
+EPCkKvbdsCGNLgLZ
+EObkKvbdtbbtwVno
+EObjjvbdwuMdqZLn
+EObjjvbdSQTfiedX
+EPCjjvbdmttyjjSG
+DncLKvbdnHFYMnGy
+DncKjvbdxmsIXrhc
+EPDKjvbdQYmAGsRj
+EObjjvbdfoazvdYI
+DoDLKvbdhaoDEvpq
+EObjjvbdDihKVwjA
+DoCjjvbdZMSDtNlN
+DnbjjvbdhlFDnVDZ
+EPCjjvbdiCPCdwRR
+DncLKvbdULuoBVoJ
+DoDLKvbdyYJKBpZk
+DoDLKvbdRbDdlIyL
+EOcKjvbdYSlAlsoY
+DoCkKvbdySmhlqbH
+EOcKjvbduWNxKRTA
+DnbkKvbdFjeTDIMu
+DoDLKvbdzaAPGgCM
+EPCkKvbdBhkCLJGK
+DnbkKvbdYpmFJNFR
+EPCjjvbdQccBQQdS
+EOcKjvbdqGDdtVaI
+EOcLKvbdILazmvqL
+EPDLKvbdajkennDA
+DoDKjvbdxVMdqZLn
+EPDKjvbdNPxQunGs
+EObjjvbdhytfMROG
+EPDKjvbdEXxLtTtM
+EPDKjvbdZnnIdeZj
+DoDKjvbdGKeTChNV
+DncLKvbdjmCMZeGo
+DnbkKvbdQwNdClHc
+DncKjvbdXrlBMtOx
+DoCkKvbdzaAOgHBl
+DncLKvbdcIlijewY
+EObjjvbdrbFllHKy
+EOcKjvbdmbJwXnmu
+EObkKvbdssSSxydc
+DoDKjvbdSQTgKGEX
+DnbjjvbdUyHtZkPO
+EPCjjvbdFyUuAdYC
+DoCkKvbdqFcdsvBI
+EOcLKvbdqwQLbhyR
+DoCkKvbdbsCkUEKB
+EPCjjvbdIjEAKQHE
+DnbkKvbdaNKbTUmH
+EObkKvbdnCKWxPOV
+EOcLKvbdZxcinClS
+EObjjvbdhlFDnVDZ
+DncLKvbdpyPHfpdY
+EOcKjvbdTlVoAuoJ
+EOcKjvbdmbKXXoOV
+DoCkKvbdxsOImSBg
+DncKjvbdZHXEAPTJ
+DoDLKvbdDjIKVwjA
+DoDLKvbdnCJvwoNu
+EPCjjvbdZeYGzghb
+EPDKjvbdHffzYxXg
+EObjjvbdirzhrkJz
+DoCjjvbdZnnJFFZj
+EPDKjvbdeATqMwif
+DoDKjvbdbVCHXjsh
+DoCjjvbdGckVjCKK
+EOcLKvbdyYJJbPzL
+DoCjjvbdiCPDFWpq
+EOcLKvbdIwtCILqQ
+DoDLKvbdKQzFOfOF
+EOcKjvbdNPwqWNgT
+EObjjvbdZLqcsmkm
+EPDLKvbdnPyxvKxb
+DoDLKvbdKjaHvAKZ
+EObjjvbdjKFgjNYS
+DnbkKvbdLAkGmCXq
+DoDLKvbdeEoSBwCj
+DnbjjvbdHlBznXRL
+DnbjjvbdKfGHbBRV
+DnbkKvbdZQldiMdq
+EOcLKvbdnBivwnnV
+DncKjvbdsQVoKDWG
+EObkKvbdypnlhiwA
+EObkKvbdrykpTAgn
+DoCjjvbdaMkBsUmH
+EPDLKvbdRDcBPqES
+DoCjjvbdpxngfpdY
+EOcKjvbdEztRFLbi
+EOcLKvbdcbTNSAUN
+DoCkKvbdjcLjpfuH
+EPCkKvbdjSzhsKiz
+EPCkKvbdoAKztIDn
+EPCjjvbdMgDQNPuL
+DoDLKvbdKNAEZgVB
+EPCjjvbdZsiJZDsO
+EOcLKvbdkCkkQfuH
+DoCjjvbdnGeXmNfy
+DnbjjvbdrpVoJbuf
+DoCkKvbduCbuWuoP
+EObjjvbdSwkMNzkY
+DoCkKvbdrNZiyMHi
+DnbjjvbduDCtvuoP
+DoDLKvbdMuSqjmAX
+EObkKvbdsQVnicVf
+EPCjjvbdmfeYNNgZ
+DncLKvbdmIdURUqa
+EPCkKvbdGBPQyJzm
+EPCjjvbdZRNFImEq
+DncKjvbdNddUJJLE
+EObkKvbdaSFbgsek
+DncKjvbdDoCkKwDE
+DoCjjvbdtkxWaUBX
+DncLKvbdfNGXHMjL
+EPCkKvbdqTtHSSKt
+DnbkKvbdxmrhXsJD
+DnbjjvbdmttykKSG
+EObjjvbdqcdhomua
+DoCkKvbdVTlsfMVj
+DnbkKvbdRECaPpcr
+DnbkKvbdijFhKNYS
+EObkKvbdIwsbIMRQ
+EPDLKvbdJbibqJbx
+EPDKjvbdxxJKCPyk
+EOcKjvbdjuvnECYX
+DnbkKvbdKRZePFme
+DnbkKvbdMpYRVnGs
+EOcKjvbdfMevgNKL
+DoCkKvbdmfeXmOHZ
+DncLKvbdFpATXGey
+DoDKjvbdJXtCIMQp
+EObjjvbdZshiZDsO
+EPDLKvbdaRfDHsfL
+DncKjvbdMIakqYAS
+EObjjvbdSLZGUfjs
+DoDKjvbdBcoaWJmG
+DoDKjvbdEuxpPlie
+EObjjvbdJcJbqKCx
+DoCjjvbdxwhiapZk
+DnbkKvbdsBemLfkZ
+DoDLKvbdHgGyxwxH
+EOcKjvbdQdDApRDr
+EPDLKvbdKWUfDeHJ
+DnbjjvbdjvXODbYX
+DoDLKvbdHELWJbKK
+DncLKvbdgFkynHHA
+EPCkKvbdPxmAHSqj
+DoDLKvbdYkqdTnLm
+EPCkKvbdJYUCILpp
+EOcKjvbdxwhjBpZk
+DoCjjvbdiMFENtcZ
+DoCjjvbdnCJvwoOV
+DoDKjvbdSKxetgKs
+EOcKjvbdWRmxCFMD
+EOcLKvbdpedFTvBI
+EObkKvbdbAvEfPow
+EObkKvbdZnmiEeZj
+DnbkKvbdtTSSyZeD
+EPCkKvbdPxmAGsRj
+EPCkKvbdVTmUGLvK
+EObkKvbdJmADyfta
+EOcKjvbdwWlBVaWV
+DoDLKvbdjcMKqGtg
+EOcLKvbdGGJrNiTq
+DnbkKvbdgPazvdYI
+EPCkKvbdGLEsDHmV
+DnbjjvbdqceIomua
+DncLKvbdjbkjpgUg
+DoCjjvbdSxLLmzkY
+EPDLKvbdjKGHilxS
+EPDKjvbdmbJvwoNu
+EPDKjvbdjmBkyeHP
+EPDLKvbdzROliJwA
+DnbjjvbdUaBprprZ
+DoDKjvbdtbbtwWPP
+DnbjjvbdURQoVVHm
+DoCjjvbdjbkjqGuH
+DoCjjvbdRbEFLhyL
+DncKjvbdBcpAujMf
+DoCkKvbdPxmAGrqj
+EPDLKvbdZRMeImFR
+EOcLKvbdcScKscia
+EObjjvbdeXytTrFz
+EPCjjvbdKfGICBQu
+DncKjvbdijGIKMwr
+EObjjvbdZLqctOLm
+EObkKvbdSLZFuGjs
+DnbjjvbdZMRcsnMN
+EPCkKvbdWSOYBeMD
+EObjjvbdRacdlJYk
+DnbjjvbdFyVUaEXb
+EObjjvbdRbEFLiYk
+EObjjvbdZjTIQGaf
+EPCkKvbdNsTugEtp
+DoCkKvbdEASIlyvw
+DoCjjvbdsrrSxzFD
+DoDLKvbdQwOEDMID
+EPDKjvbdaaVeGQPw
+DoCjjvbdFejRnItR
+EObkKvbdRacdlIyL
+DnbjjvbdGGJqnIsq
+DoDLKvbdGYtuBDxC
+DncKjvbdbLMGPODA
+EObjjvbdqYoIGpcx
+DncKjvbdrykosAgn
+EPCjjvbdJbjDQjCx
+EObjjvbdkySqsYft
+EPDKjvbdxwhjBpZk
+DncKjvbdauBfwkTh
+EPCkKvbdtSrSxydc
+DoDKjvbdMRvmZuQz
+DncLKvbdnUtyjiqf
+DoDKjvbdSLYetgKs
+DoDLKvbdJbjCqJcY
+EPDLKvbdShyiqAAl
+EPDLKvbdSQUHJfDw
+EOcLKvbdijFhJmYS
+EPDLKvbdvwMBWAvV
+EObjjvbdeXytUSFz
+EObjjvbdWXJXuceH
+EPCkKvbdrDeIomvB
+DncKjvbdczZQXyRC
+DnbjjvbdQlxCZOUz
+EPCjjvbdQccApRDr
+DoCkKvbdqiAJdloF
+DoCjjvbdDwwktTtM
+EPCjjvbdRpUGjGEX
+DnbkKvbdWfYytAPT
+EPCjjvbdUMVoBVni
+EObkKvbdxnShYTIc
+EObjjvbdVAaqSprZ
+DncLKvbdKVtfDdgJ
+DoCjjvbdliEUQtqa
+DnbjjvbdiGjCyWKV
+DnbjjvbdqrVLOLBN
+EObkKvbdUaCRSqSZ
+EObkKvbdTkvPAuni
+DoCjjvbdIGgZyXwg
+DoDLKvbdssRsYzEc
+DnbjjvbdZLqdTmkm
+EPCjjvbdUtNTfLvK
+DncKjvbdfMewGmJk
+EOcLKvbdCTBDTfWr
+EPDKjvbdFpASwGey
+EPCjjvbdZLrETmkm
+EPDLKvbdyXhjCQZk
+DnbkKvbdeATqMxJf
+DoCjjvbdjJfHilwr
+EPDKjvbdzitopESt
+EPDKjvbdEuxopMjF
+DoCkKvbdvBEYroFI
+DnbkKvbdrNZiyMIJ
+EPCjjvbdxVMdpyMO
+DnbkKvbdQlxCZOUz
+DnbkKvbdqmZiyLhJ
+DncLKvbdXnRAXuWU
+EObkKvbdRadElJYk
+DncKjvbdLiBkqYAS
+DnbjjvbdmRyUysDi
+DoDKjvbdKCicQjDY
+EOcLKvbdRkZGVGjs
+DoDKjvbdtSrSyZdc
+EOcKjvbdRyjISbvA
+EPCjjvbdHffyyYYH
+EOcKjvbdaogHDkzd
+EPCjjvbdidkGuPAO
+EOcKjvbdCDpAujMf
+DoCkKvbduVnXjQsA
+DnbjjvbdTulQJtAq
+DncKjvbdqTsgRrLU
+DoCkKvbdzdynzdyp
+EObkKvbdemGXHNKL
+EOcKjvbdJXtCHlRQ
+EPDKjvbdegkWRnQg
+DoCjjvbdyXiKCPyk
+EPDLKvbdlZTRsZHU
+DoCjjvbdfNFvgNKL
+DnbjjvbdbVBgYLTh
+DncKjvbdcJMikFvx
+EPDLKvbdUMVnaVoJ
+DoCkKvbdgQBzvcxI
+DoCjjvbdZtIhxdSn
+EPCjjvbdRWnEDMID
+EObkKvbdjlakydfo
+DncLKvbdrpWOicVf
+EOcKjvbdhgKDYuiu
+DoDKjvbdmIdTqUqa
+EPCjjvbdwtleQxkn
+EObkKvbdcJNKKfWx
+DncLKvbdNsUWGdtp
+DoDKjvbdWSOXbEkc
+EPCkKvbdpyOhHREY
+DoDKjvbdkyTSTYft
+EPCjjvbdFjdrbgmV
+DncLKvbdrounjDWG
+DoDKjvbdVTmTfLvK
+EPDLKvbdSCDeLiYk
+DoCkKvbdrXPlDIxq
+DncLKvbdKVuGDeHJ
+DnbjjvbdrWokcIxq
+EObjjvbdKVuGEEfi
+EPDLKvbdrbGMlGjy
+EPDKjvbdlqxtzSci
+EOcLKvbdwygeeweS
+EObjjvbdjKGIKNYS
+EObkKvbdVrOXbElD
+DnbjjvbdrMzKZLgi
+EPCkKvbdMpXqWNfs
+EPDLKvbdrSUkOLAm
+EPDKjvbdZisIPfbG
+EPDLKvbdRDbaQRES
+DncKjvbdVTmUGLvK
+EOcKjvbdYzcGRjWZ
+EObjjvbdMuSrLNAX
+DncKjvbdjgflGFnL
+DncLKvbdWIXvXfxz
+DoDLKvbdNHComPtk
+EOcLKvbdSBceLhyL
+DoCkKvbdZRMeImFR
+EPDLKvbdiifIKMwr
+DoCkKvbdvBDxsOeI
+EPDLKvbdxmsHxShc
+EOcKjvbdcyyPxZRC
+DoCkKvbdsBfNMHKy
+DoDLKvbdaRebhTfL
+DncLKvbdypoNJKXA
+EObkKvbdzRPNJKXA
+DnbkKvbdTvLoitBR
+EOcKjvbdWHwuxGxz
+EObjjvbdZHWdAPTJ
+DnbjjvbdySnJMqag
+EPCkKvbdtTRsYzFD
+EPDLKvbdhytelQnG
+EPCkKvbdTppntuHm
+DnbjjvbdZeYGzhIb
+EPCjjvbdIwsaglQp
+DoCkKvbdpstGrRkU
+EObjjvbdCJLBjiFj
+EOcLKvbdePErjstS
+EPDKjvbdpxnhGqDx
+DnbjjvbdZyEKOClS
+DoCjjvbdpyOhHREY
+DncLKvbdNGcPmPuL
+DoDLKvbdQwNccLgc
+EPDKjvbdmbJvxPNu
+DnbkKvbdQwOEDMHc
+DoDKjvbdXrlAltOx
+EPCkKvbdGQASvgGZ
+EOcLKvbdmttykKSG
+EOcLKvbdGLFSbgmV
+DncLKvbduCbuWvOo
+EPDKjvbdSQTfiecw
+DoCkKvbdYkqctNkm
+DoDLKvbdlZSqsZHU
+DoDLKvbdqGEEtVaI
+EObjjvbdhytekpmf
+DoDKjvbdmuUzKiqf
+EObjjvbdrMyiyLhJ
+DoDLKvbdEARhlzWw
+EObjjvbdaRfCgsek
+EPDKjvbdaNKaruNH
+EOcLKvbdJqZeOenF
+DnbjjvbdTfzmlXVe
+DoCjjvbdzQoNIjXA
+EObkKvbdMpYQvNfs
+DncLKvbdVrOYCElD
+DoCjjvbdijGIJlwr
+DoDLKvbdrXQMDIyR
+EPDLKvbdEYYMUTtM
+DncKjvbdkHgMFenL
+DnbjjvbdqdFIpOWB
+EObkKvbdqFceTvAh
+EObjjvbdyOSgxSiD
+EOcKjvbdDnbkKvcE
+DoDLKvbdYqMeImFR
+EObkKvbdwtleRZMO
+EPCkKvbdrWolCiYq
+EObjjvbdrXPkcJYq
+DoCkKvbdtlXvaUBX
+EOcLKvbdeYZssrFz
+DoDLKvbdnGeYMnHZ
+EObkKvbdYTLaMtOx
+DoDLKvbdJcJcRKDY
+EPDKjvbdeKJrVtzn
+DoCkKvbdrSUkNjaN
+DncKjvbdeATqNXjG
+EObkKvbdqlzJyLhJ
+EObjjvbdDjIJvXjA
+EObjjvbdzGyMAMdw
+DoDLKvbdFfJrNiTq
+EOcLKvbdBhkCKiGK
+EObjjvbdpssgSRjt
+DncKjvbdKaLGlbXq
+EOcLKvbdlYrqrxgU
+EPCjjvbdVqmxBeLc
+EPDLKvbdZQmFJNFR
+DoCkKvbdkCkkQfuH
+DncKjvbdauCGwjsh
+DoCjjvbdEASIlywX
+DncKjvbdLAjgNBxR
+DncKjvbdCDpBVimG
+EOcLKvbdqlzJxkhJ
+EPDLKvbdtvNxKRTA
+DnbkKvbdGLFScINV
+DoCkKvbdQvmdCkhD
+EPDKjvbdFjdrbhNV
+EPCkKvbdZLrETnLm
+EPDLKvbdTvLoisaR
+EPDLKvbdsrrTZZdc
+EPCkKvbdZMRcsmlN
+DncLKvbdxnTHxTIc
+EOcKjvbdzROliJwA
+EOcKjvbdsQVnjDVf
+EObkKvbdqGDdsvBI
+DncKjvbdwtleQxkn
+EObjjvbdTqRPUuHm
+DnbjjvbdVwIwvEFH
+EPCjjvbdZshhxcsO
+DoCkKvbdKCibqJbx
+EOcKjvbdUVlQKTaR
+EObkKvbdVTmUFlWK
+EOcLKvbdmIctRVRa
+DoDKjvbdPIAYZAYa
+DoCkKvbdjvWnDbXw
+DnbjjvbdtvNwjRTA
+EObjjvbdNHComQUk
+EOcKjvbdySnImRbH
+DoCjjvbdDjIKVxKA
+DncLKvbdKefHbApu
+EObjjvbdehLWRmpg
+EOcLKvbdJTZAsMwl
+DoDKjvbdZirgpHCG
+EObkKvbdozmcjxPA
+EObkKvbdsZkosAgn
+EPCjjvbdSxKlNzjx
+DoCjjvbdfILVrNpg
+EPCjjvbdGGKRnJTq
+DnbjjvbdpssgSSLU
+DoDKjvbdrDdiPmvB
+EPCkKvbdZtJJYcsO
+DoDLKvbdNdctIhkE
+EPCjjvbdcImJkFvx
+EOcLKvbdGLErbhNV
+DoCkKvbdnQZxukYb
+EPCkKvbdWSNxBeLc
+EPCkKvbdsPvOjDWG
+EOcLKvbdeFOqavbj
+EPCjjvbdjAQHApHK
+EPDKjvbdwXMBVaVu
+DncLKvbdMowqWNfs
+DoCkKvbdRbEFMJYk
+DoCkKvbdrNZjZLhJ
+DoCjjvbduDCtwWPP
+EObjjvbdNeEUJIjd
+DnbkKvbdlYsRsYgU
+DoCjjvbdUxgsyjnn
+EObkKvbdbLMGPODA
+DoCkKvbddneTKtUS
+EOcKjvbdvvkaWAuu
+EPDKjvbdVUNUFkuj
+EObjjvbdKDKDQjCx
+EPDKjvbdnUuZjiqf
+DoCkKvbdsCFmMGkZ
+DncKjvbdrpVnjDWG
+DnbjjvbdiZtfMQmf
+DoCkKvbdwWkaVaVu
+DoCjjvbdSCDeLiZL
+DncKjvbdEYYLtTsl
+EPDLKvbdOSsufeVQ
+EOcLKvbdWSOXadlD
+EPDLKvbdpaJFAXHd
+DncKjvbdSCDdkhyL
+DoCjjvbdIMBzmvqL
+DnbkKvbdVUMsfLvK
+DoCkKvbdlhctQuSB
+DncKjvbdJuuGEFGi
+EPCjjvbdJSyAsMwl
+EOcKjvbdUtMtGMVj
+EPCkKvbdHDkWKCKK
+DncLKvbdySnImRag
+EPCjjvbdwMvAMcdm
+DnbkKvbdelevfmJk
+EPDKjvbdYORAYUvU
+EPCkKvbdVwIxWDeH
+EObjjvbdtvOXipsA
+DncLKvbdhlEdOUcZ
+EOcLKvbdTlVoAuoJ
+EPCkKvbdNQXpunHT
+EOcLKvbdWXJXvDdg
+DnbkKvbdZoOJFEzK
+EObkKvbdmbKWwoOV
+DnbjjvbdiHKDYvKV
+DncKjvbdfSBWzlDP
+DoCkKvbdLBKflawq
+EObkKvbdUsmUFkvK
+EObjjvbdLqwNZtpz
+DoCkKvbdsBfNLfjy
+DncLKvbdjvWmcbYX
+EObkKvbdaMkBruMg
+EPCkKvbdHkazmvqL
+DnbjjvbdRyjHrbvA
+EPCkKvbdNQXpvOHT
+EObjjvbdOYPVzcnU
+DoCjjvbdaSGCgtFk
+DoDKjvbdxmsHxSiD
+EObjjvbdZirgogCG
+EOcLKvbdmuVZkKSG
+DncLKvbdUyHszKnn
+DnbkKvbdxmsHxTJD
+EPCkKvbdVrOYBdkc
+EOcLKvbdhkdcmuDZ
+DncKjvbdwuMdpyLn
+EObkKvbdxVMdpxlO
+EPDKjvbdmbKWwoOV
+DoCjjvbdhkeDmtby
+DncLKvbdLFehCBQu
+DoCkKvbdYSkaNUOx
+DnbkKvbdmaivxPNu
+EPDKjvbdfNFvgNKL
+EPDKjvbdhlEdOUcZ
+EPDLKvbdTukpKUAq
+DncKjvbdUVlQKTaR
+DnbkKvbdYgWdAPSi
+DoDKjvbdIwsbHkpp
+EOcKjvbdlZTSTYgU
+DoCkKvbdNHColpVL
+EPCjjvbdxrmhmRag
+EObkKvbdUxgsyjnn
+DoCjjvbdsQVoJbvG
+DoCkKvbdBdQBVjMf
+EObkKvbdIHHZxxXg
+EOcKjvbdJuuFdEgJ
+DoDLKvbdwyhGGXeS
+DnbkKvbdSKyFuGkT
+DoDKjvbdiGibxvKV
+DncKjvbdnBjXXoNu
+DnbkKvbdFpATWffZ
+EPCjjvbduDCtvvOo
+EObjjvbdIsZArlxM
+DncKjvbdEvYopMjF
+EObjjvbdwuMdqYkn
+DoCjjvbdwyhFfYEr
+EPCjjvbdqUTfrSLU
+EOcLKvbdzGxlANEw
+EPCjjvbdEOcKjwCd
+EPCkKvbdOSsvGeUp
+DncKjvbdhlEcnUcZ
+EPCkKvbdUVkoitAq
+DnbjjvbdOAJTTjSA
+DncKjvbdqmZiyLhJ
+EObjjvbdpstGqrLU
+EPDLKvbdFxuVAcwb
+DoCkKvbdauBgYKsh
+DnbjjvbdZMRcsmkm
+EOcLKvbdqrVLNkBN
+DoDKjvbdNQYRWNgT
+DoCjjvbdCTBCtFvr
+DncKjvbdZyEKNcMS
+EPCkKvbdVviYVdFH
+DoDKjvbdePErjtUS
+EObkKvbdwtmFRZLn
+DncKjvbdpedEsvAh
+EPCkKvbdzoQRFClY
+DoDKjvbdIxTbIMQp
+DoDLKvbdxsOImSCH
+EPCjjvbdYfwEAOri
+EOcKjvbdnPyyWLZC
+EOcKjvbdhlFEOVCy
+DoCjjvbdwyhFfXdr
+DnbkKvbdZQmEhleR
+DnbjjvbdbAudepPw
+DnbjjvbdMpXqVmgT
+DncLKvbdNeEUIhjd
+EObkKvbdMfbomQUk
+DoCkKvbdqvpMDJYq
+DoDLKvbdfekzNfgA
+EOcLKvbderAvzlCo
+EOcLKvbdiZtelQnG
+EPDLKvbdRXNdClHc
+EPDKjvbdNrsufeUp
+DncKjvbdZQldiMeR
+EObkKvbdiLdcmtby
+DncLKvbdZQmEhleR
+DncLKvbdZRNEiMdq
+DncLKvbdWRmwadlD
+EPDLKvbdGLEsDHlu
+DncLKvbdZjTIPgCG
+EObjjvbdxnTIXsIc
+EPCjjvbdliETptqa
+EOcKjvbdlrZUyrci
+DoDKjvbdbKlFnnDA
+DnbjjvbdwXLaWBWV
+DoCkKvbduaEZSoFI
+EPCjjvbdRyjHrbvA
+EPCjjvbdLhakpxAS
+DoCkKvbdmaiwXoNu
+EOcKjvbdyNrhYShc
+EObjjvbdsCFllGjy
+DnbkKvbdZshhxdTO
+DoDKjvbdZjShPfaf
+EOcKjvbdmajWwnmu
+EObjjvbdJvUfEFHJ
+EPCkKvbdOEcsiIkE
+EPCkKvbdkNBlZeGo
+DoCjjvbdVviXudFH
+DnbkKvbdjJfHjMxS
+DoDLKvbdGBPRZJzm
+EOcKjvbdiCObdvqR
+DnbjjvbdVwJYWDeH
+DncKjvbdGAoQxizm
+EObjjvbdxmsIYSiD
+DncLKvbdqqtkOLAm
+EObjjvbdvvlAvBWV
+DncKjvbdvAdZTPFI
+EOcKjvbdjAQHAogK
+EObkKvbdpxoIHRDx
+EPCkKvbdffLynGgA
+EPDLKvbdTvLpKUAq
+EOcKjvbdmttzKjSG
+DoCkKvbdqwQMChyR
+DoDKjvbdrzMPsAgn
+DoDLKvbdyYJKCPyk
+DoCkKvbdRbEEkhxk
+EPCkKvbdBdQAuilf
+EPDLKvbdRaceMIyL
+EOcKjvbdraelkfjy
+EOcLKvbdEASIlzWw
+DnbkKvbdOSsvGeUp
+DnbjjvbdmuVZkJrG
+DnbkKvbdVwIwvDeH
+DoDKjvbdwWlAvBVu
+DncKjvbdSKyFuGjs
+DoCkKvbdOXnuzcmt
+DncKjvbdrXPlDJZR
+EPDLKvbdsBfNMGjy
+EPDLKvbdiifHilwr
+DnbkKvbdjvWmcbYX
+DoDLKvbdZnmhddyj
+EPCkKvbdemFvfmKL
+EPDLKvbdNxPVzcnU
+DnbjjvbdRkYfUgLT
+EPCkKvbdZRMdhldq
+EObjjvbdYqMdhmFR
+DncLKvbdJvVGDeGi
+EPDKjvbdUtMsfLuj
+DoDLKvbdZyEJnClS
+DnbkKvbdjcMKqGtg
+EPCjjvbdDnbjkXDE
+DnbjjvbdLGGICAqV
+EPDKjvbdWIXvYGxz
+EOcLKvbdBiLCKhfK
+DnbkKvbddwzUURez
+EOcLKvbdZQldiMdq
+DncLKvbdKVtfEFGi
+DoCkKvbdvAcxsPEh
+DncLKvbdjvWmcbXw
+EObkKvbdqiAJeNOe
+EOcLKvbdUMWPBWPJ
+EPCjjvbdOFDshhjd
+EOcLKvbdVrNxBeMD
+EPDKjvbdiGicZWKV
+EObkKvbdtTRrxzFD
+DoCjjvbdjJfHilxS
+DoCjjvbdelfXGmKL
+EPCjjvbdIrxaTMwl
+EOcLKvbdRECaPpcr
+DnbkKvbdiLeDmtby
+EPDLKvbdGcjvKCJj
+EOcKjvbdWWiXuceH
+DoCkKvbdpstHRrLU
+EPDLKvbdkHgLeemk
+EPCkKvbdzGxlANEw
+EObkKvbdjKGHjMwr
+EPCkKvbdiUzEvquC
+EOcLKvbdwXMBWBVu
+EObkKvbdeKKRvUzn
+DncLKvbdSBceLhxk
+DoDLKvbdJbibqJbx
+DncKjvbdeAUQlxJf
+EPDKjvbdbUafwkUI
+DoCkKvbdxnTIXriD
+EPDLKvbdRacdlJYk
+EOcLKvbdmgFXlnGy
+EOcKjvbdHELWJaij
+EPDLKvbdLhbMQxAS
+DnbkKvbdhbPDFXRR
+EOcKjvbdqwQMDIxq
+DncKjvbdeOdrkTsr
+EObjjvbdyOSgwriD
+EPCkKvbdjmCLyeHP
+DnbjjvbdZisHpGbG
+EOcKjvbdIHGzZXwg
+DncLKvbdwWkaWAvV
+DoDKjvbdffLzOHHA
+EPCjjvbdqZPIHREY
+DoCkKvbdDjHivYKA
+DoDLKvbdYNqAYVWU
+EPCkKvbdzjUpPcrt
+DncLKvbdlqyVZrdJ
+DncLKvbdDoDLLXDE
+DoCjjvbdcSbjtDia
+DoDKjvbdDxXlUTsl
+DncLKvbdJYTahLpp
+EObkKvbdNQXqVnHT
+EObjjvbdijGIJlxS
+EObjjvbdOStVfdtp
+EPCkKvbderBWzlCo
+EObjjvbdKQzEnenF
+EPCjjvbdmtuZkKRf
+EPCkKvbdEJhJuxKA
+EPCjjvbdgGLymfgA
+EObjjvbdRbDeLhxk
+EOcKjvbdrSUkNkAm
+DoDLKvbdEOcLLXDE
+EObjjvbdBhjbKiFj
+DoDLKvbdBdQAuimG
+DnbjjvbdDwwkstTl
+DoDLKvbdVwJYVdEg
+EOcKjvbdACqwizJQ
+EObjjvbdZsiIyETO
+EObkKvbdGLFSbhMu
+EOcLKvbdFkFTChNV
+DnbjjvbdVBCRSprZ
+DoCjjvbdssRsYydc
+DoCkKvbdUMWOaWOi
+DoDKjvbdYSlBMsnx
+EObkKvbdNsTvHFVQ
+EPDKjvbdZisIPfaf
+EOcLKvbdpssfqqjt
+EPCkKvbdNHCpMpVL
+EPDKjvbdczZPwxpb
+EPCjjvbdnBivxPOV
+DoDKjvbdUtNTelVj
+EPDKjvbdjhHMFfNk
+EObjjvbdEuyPolie
+EPDLKvbdKQydneme
+EPCkKvbdQvnECkgc
+EPDLKvbdatbGxLTh
+DoDLKvbdNPxQvOGs
+DoDLKvbdySnImSCH
+EObkKvbdvBEZTOeI
+DoCjjvbdatagXkUI
+DnbjjvbdmbKXXnnV
+EOcLKvbdmbKXXoNu
+EPCkKvbdNsUWGduQ
+DncLKvbdpssgSRjt
+EPDLKvbdiUzFXSUb
+EObkKvbdyzeORgiI
+EOcLKvbdKDKDQibx
+DoCjjvbdmJDtQuSB
+DncLKvbdaNKaruMg
+DnbkKvbdOEctJJKd
+EObjjvbdkVvnECXw
+EObkKvbdKaLHMbXq
+DoCjjvbdYzcFqiuy
+DoCkKvbdvwLaWAvV
+EPDLKvbdnBiwXoNu
+EOcLKvbdLBKgNBwq
+EPCkKvbdCJLBjiFj
+EObjjvbdptUGqrLU
+DoCkKvbdWXJYWEFH
+EOcLKvbdNeEThiLE
+EPCjjvbdtAHQhAAr
+EOcKjvbdUGzmlXVe
+DnbkKvbdrylPsBIO
+EPCjjvbdICLzEzAD
+EPDKjvbdrpVoKCuf
+EPCjjvbdRkZFuGjs
+Dnbjjvbdznopdbkx
+DoDLKvbdmgFYNNfy
+EObjjvbdptUHRrKt
+DoCkKvbdhfjDZWJu
+DncLKvbdLGFgbBRV
+EPCjjvbdZnnIeEyj
+DoDKjvbdmtuZjirG
+EPCkKvbdmbJvwoOV
+DncLKvbdJpydoFme
+EPDKjvbdFyUtaEXb
+DnbkKvbdqFcdtWAh
+DnbjjvbdWRnXaeMD
+EOcKjvbdCIkBkJGK
+EOcKjvbdJTZBSlxM
+DnbjjvbdziuPocsU
+DnbjjvbdhzUelQmf
+EPCjjvbdUaBqSprZ
+DncLKvbdxZgefXdr
+EObjjvbdKVuFdEgJ
+EPCjjvbdAMgyTWzY
+DnbjjvbdiHJbxuiu
+DoDLKvbdUtNTekuj
+EPCjjvbdUQpnttgm
+DoDLKvbdVAbRTRSZ
+DncKjvbdkxsSTYgU
+DnbkKvbdMfbomQUk
+DoCjjvbdTAEiHbOd
+DoCjjvbdczZPxYpb
+DnbkKvbdUVkojUBR
+DncKjvbdddnqavbj
+DoDLKvbdxwhiapZk
+DoDKjvbdZirhPfaf
+DoDKjvbdTukoitAq
+DoCjjvbdrJAKFMne
+EObkKvbdZQmEhmFR
+DoCjjvbdHgHZyXxH
+DncLKvbdNHCpNPuL
+DoCkKvbdfIKvRmpg
+DoCjjvbdNsUWHEtp
+DoCjjvbdpfDdtWAh
+DoDLKvbdBhkCKiGK
+EObjjvbdtSqsYydc
+EPDLKvbdQccBPqES
+EOcLKvbduMXvaUAw
+EOcLKvbdZMRctNkm
+EObjjvbdRadFMIxk
+DncLKvbdjhGlFfOL
+DoCjjvbdhtzEvqtb
+DnbjjvbdUtNUGMWK
+EPCjjvbdaaWEfQQX
+DncKjvbdunszpkOt
+DoDKjvbdEJgjWYKA
+DoCkKvbdQYmAGsRj
+DoCjjvbdmozYujyC
+DnbkKvbduVnYKRTA
+DnbkKvbdZxcjNblS
+EPDKjvbdzRPNIiwA
+EObkKvbdzitopESt
+EObjjvbdfILVrNpg
+DoCjjvbdNGcPmPuL
+DnbjjvbdEYXlUUTl
+DnbjjvbdraellHKy
+DoDKjvbdZQmEhmFR
+DoCkKvbdZnnIdeZj
+DnbjjvbdjcMKpgVH
+EObkKvbdTfznLvue
+EOcKjvbdFkErcIMu
+DncKjvbdGdKvKBjK
+DoCjjvbdVvhwvEFH
+EPCkKvbdmJEUQuSB
+DncKjvbdIsZBSlxM
+DnbkKvbdmbJvxPNu
+DoDKjvbdTqRPVUhN
+DoDLKvbdwygefXdr
+DnbjjvbdLGGHbBRV
+DncLKvbddijSVtzn
+EObkKvbdZnnJFFZj
+EOcKjvbdCTBCsfXS
+DoDLKvbdmttzKjSG
+EOcKjvbdyNsIXsIc
+EOcKjvbdbVBgXjtI
+EOcLKvbdGFjRnJUR
+DnbkKvbdYTMBMtOx
+EPCkKvbdNGcQMouL
+DoDKjvbdJcKDQibx
+DoDLKvbdrpWOicWG
+EOcKjvbdRaceMIyL
+EPDLKvbdWWiYWDeH
+EPDLKvbdczZQXxqC
+DoDKjvbdLBKgMaxR
+DnbjjvbdZjShQHBf
+DoCkKvbdKaLGlbXq
+DnbkKvbdGdKujCJj
+EObkKvbdIBkydzAD
+DnbkKvbdqUTgSRkU
+EOcLKvbdBiKbKhfK
+DoDKjvbdVwIwvEEg
+EPDKjvbdIjEAKQHE
+DoCkKvbdEPCkLWcE
+DoDLKvbdrDeJQNua
+EOcLKvbdNddUIhjd
+EPCkKvbdYNqAXtvU
+EObkKvbdUaCRSqRy
+EPCjjvbdqqtjmjaN
+EPDLKvbdhbOcFWpq
+DoDKjvbdULvPBVni
+DoDKjvbdGGJrOJTq
+DoCkKvbdqceIpNvB
+EOcKjvbddePSCXCj
+EPCjjvbdVUNTekuj
+DnbjjvbdLGGHbApu
+DoCkKvbdcTDLTcia
+DnbkKvbdNsUWGeVQ
+EObjjvbdZLqcsmlN
+EObkKvbdxrnJMrCH
+DnbjjvbdqvolChxq
+EPCjjvbdaNKbSuNH
+DnbkKvbdlYrrTYft
+EPCjjvbdwtldpyMO
+DnbkKvbdNddThiKd
+EPCkKvbdjJfIJlwr
+EPCjjvbdJpzEoFme
+DnbkKvbdiMEcmuDZ
+EOcKjvbdkVvmdBww
+EOcLKvbdAMgxrwZx
+EObjjvbdatbGwjtI
+EOcKjvbdTAEhhCOd
+DnbjjvbdfNFwHNJk
+EObjjvbdVBBqSpqy
+EPCjjvbduaEZSndh
+EPDLKvbdpstGqqkU
+DnbkKvbdIwtCHlQp
+DncKjvbdrbGNMGkZ
+EOcKjvbdILaznWqL
+DoCjjvbdTXjkmzkY
+DoCjjvbdIGfyyXxH
+EOcKjvbdjKFhKNXr
+EPDKjvbdRDcApRES
+EObjjvbdmfdxNNfy
+EObjjvbdDihKWYKA
+DoCjjvbdzaAOffal
+EPDLKvbdQccBQQcr
+EPCjjvbdTlWPAvOi
+DnbjjvbdqUTfrSLU
+EObjjvbdVAbRTRRy
+DoCkKvbdnCKWxPOV
+EOcKjvbdFjdrbhNV
+DnbjjvbdrzLpTAhO
+DoCjjvbdDxYMUUUM
+DnbjjvbdmoyxujyC
+DnbjjvbdUVkoitAq
+EObjjvbdrEEhpOWB
+DncKjvbdRjyGVGjs
+DoCkKvbdJJdAKPgE
+DoDKjvbdKDJbqKCx
+EPDLKvbdcTDLUDia
+DoCkKvbdePEsKssr
+EPCjjvbdJbjCqJbx
+DoDLKvbddBrmSATm
+EOcLKvbdlhcsqVRa
+EOcLKvbdKfGICBRV
+EPDLKvbdrovPJbvG
+DoCjjvbdbAvFGQQX
+EPDLKvbdlZTSSxft
+DnbjjvbdLqvmZuQz
+DncLKvbdZshiYdSn
+EOcLKvbduMXvaTaX
+EObjjvbdZtJJYcrn
+EOcLKvbdczZPwxpb
+EPDKjvbdatafwjtI
+EObkKvbdsQVnicWG
+DnbjjvbdrWokcIyR
+DncLKvbdJuteceGi
+EOcLKvbdADRwiyiQ
+EPDKjvbdCIkBjiFj
+EPDKjvbdrNZjYkgi
+DnbkKvbdSLYeuHLT
+DoDKjvbdkNBkzEfo
+DnbkKvbdcyxowyQb
+EPDKjvbdYkrETnMN
+DoDKjvbdwWlAvAvV
+EPCkKvbdczZPxZQb
+EPCkKvbdKCibpjCx
+EOcKjvbdhytfLqOG
+DnbjjvbdxmsHwriD
+EPDKjvbdmfeYMmgZ
+DoCkKvbdNQXpvNfs
+DncLKvbdirziSkJz
+EOcKjvbdHffzYxYH
+EOcKjvbdWXIxWDdg
+DncLKvbdVvhwuceH
+DoDLKvbdFxtuBDxC
+DncLKvbdJcKCqJbx
+DoCkKvbdxLWcgzyf
+DnbjjvbdCJLBjiGK
+EPCjjvbdcasMrATm
+DoDLKvbdLFfICAqV
+EPDKjvbdqmZjZMHi
+DncKjvbdczZPwxqC
+EObkKvbdrWpMDJYq
+EPCjjvbdLFehCBQu
+EPCkKvbdRzJgsDWA
+DoDKjvbdIsZArlxM
+DncLKvbdqFcdsuaI
+DncLKvbdULvPBVni
+EOcLKvbdWXJXuceH
+EPDLKvbdaNLCTVMg
+EObkKvbdUxhUZjnn
+DncLKvbdeATplxKG
+DoCjjvbdmSYtzSci
+EOcLKvbdkMbLzEfo
+EPCjjvbdrpVoJcWG
+EPCjjvbdXrlAlsoY
+DoDLKvbdUxhTzKnn
+EPCjjvbdOEdUJJLE
+EObjjvbdKDJcRKCx
+EPDKjvbdcyxpXxqC
+DnbkKvbdZxdKODMS
+DncLKvbdcImJjfWx
+DnbjjvbdpfEFTuaI
+DnbkKvbdZoNheEyj
+EOcKjvbdjFKfuPAO
+DnbkKvbdFVyQQNKF
+DnbkKvbdDjHiuwjA
+EPCkKvbdMgDPlotk
+EPDKjvbdxnShXsIc
+DoDLKvbdOTUVfduQ
+DncKjvbdFejRnIsq
+DncKjvbdSQUHJfEX
+DncLKvbdRXOEDMHc
+DoCkKvbdsZkosAgn
+DoDKjvbdUsmUGLuj
+EPDKjvbdiifIJmYS
+DoDLKvbdZQmEhmFR
+EObjjvbdeUAUASlv
+DoDLKvbdUsltFlVj
+DoCjjvbdSiZjRABM
+EOcLKvbdegkVrORH
+DoDKjvbdYlRdTnLm
+DncKjvbdzitopESt
+DnbkKvbdhbPDEwQq
+DncKjvbdSKxetgLT
+DncKjvbdZQmEiNFR
+EPDLKvbdUyITzLPO
+DnbjjvbdznpQdblY
+EObkKvbdbLMFoODA
+EPDLKvbdBhjbLJFj
+DoDKjvbdNwoVzdOU
+DncKjvbdvBDxsPEh
+DnbkKvbdSBceLiZL
+EPCkKvbdOhAXyAZB
+EObjjvbdZisIQGbG
+EOcLKvbdAMgxrvyx
+EPDKjvbdCDpAvKMf
+DoDKjvbdxVMdpxlO
+EOcKjvbdJbicRJbx
+DoCkKvbdTppnuVIN
+EObjjvbdZjTIPfbG
+DoCkKvbdpyOhHQcx
+DoCjjvbdfHjvSOQg
+DoCjjvbdzoPpdcMY
+EPDKjvbdmfeYNNfy
+EPCjjvbdXGYzUAPT
+DoDLKvbdypnmJKXA
+DnbkKvbdBsAcUFwS
+DoDLKvbdQYmAGsRj
+EObjjvbdUxhTyjnn
+DoCkKvbdrouoKCvG
+DoDLKvbdhtydwSUb
+EPCkKvbddwytUSFz
+EOcKjvbdrbFmLgLZ
+EObkKvbdbPffckzd
+EObjjvbdDxXlTtUM
+DnbkKvbdqGEFTvAh
+EPCjjvbdDoCkKwDE
+EOcLKvbdVviYWDeH
+EPCjjvbdWSOYCFLc
+DncKjvbdmbKWxPNu
+DoCkKvbdZshhxdTO
+DoDKjvbdwtldqYkn
+DoDLKvbdYSlBMsoY
+EPDKjvbdRkZFuHKs
+DnbkKvbdeYZstRez
+DoCjjvbdrNZixlIJ
+DoCjjvbdmgFXlmgZ
+EPCkKvbdYlRcsmlN
+DoCjjvbdOFETiJKd
+EPDLKvbdBhkCLJFj
+EPCjjvbdmuVZkJrG
+DnbkKvbdFjeTChMu
+DoCjjvbdJTZBSlwl
+DnbkKvbdozmdLYPA
+EObjjvbdtbbtvuoP
+DncKjvbdqUTfrSKt
+DncKjvbdyTOImSBg
+DnbjjvbdcTCkTdKB
+EOcKjvbdKaKgNCXq
+EPDKjvbdZoOIeEyj
+DoDKjvbdYqMeIleR
+DncKjvbdnPzZWLZC
+EPDLKvbdZirhPfbG
+DnbkKvbdGQATXGey
+EOcKjvbdZsiJYcsO
+DnbkKvbdrWpMDJYq
+DoCkKvbdMuTSLNAX
+EObjjvbdpxnhHRDx
+EOcKjvbdzitpQESt
+EPCjjvbdhuZeXSUb
+DoCjjvbdNeDtJIkE
+DoCkKvbdCEQBWKMf
+EPCkKvbdHEKvKCJj
+EPCjjvbdatbHYLTh
+EObkKvbdLGGICBRV
+DncKjvbdRjxeuGjs
+DoDKjvbdnHFYNOHZ
+EObkKvbdIryAsNYM
+EObjjvbdmfdwlnGy
+EOcLKvbdNeDsiIkE
+DnbjjvbdJTYaSlxM
+DoCkKvbdRadEkiYk
+DncLKvbdjKFgjNYS
+EObkKvbdZjShQGaf
+EOcKjvbdKfFgaaQu
+DoDKjvbdhgJbyVjV
+DoCkKvbdwuNFRZMO
+DncLKvbdfekzNfgA
+DncKjvbduCcVWuno
+EPDLKvbdVrNxBdkc
+DnbkKvbdRkYeuHLT
+DoDLKvbdwuNEpxlO
+DoCjjvbdQccAoqDr
+EOcKjvbdUGzmkvvF
+DncKjvbdEJhKWYKA
+EOcLKvbdssSSxyeD
+DoCjjvbdVviXvEEg
+DnbjjvbdEuxopNKF
+EObkKvbdLAkGlbXq
+DoCkKvbdZsiJZESn
+DoCkKvbdhkeEOUby
+DnbkKvbdbhlikGXY
+EObkKvbdLBLGmCYR
+EPCjjvbdxUleQyLn
+DncLKvbdrbGNMGjy
+DoCkKvbdddoSBwDK
+EPDLKvbdkyTRsYgU
+EPDKjvbdehLVqmqH
+EPDLKvbdrbFmMHKy
+DncLKvbdmbJvwoOV
+EOcLKvbdVUNUFkvK
+EPDLKvbdrpWPJbvG
+DncKjvbdGAnpxizm
+EOcKjvbdyzeNqghh
+DoDLKvbdhbPDFWpq
+DoDLKvbdfVzxQJzs
+DoDLKvbdUMWPBVoJ
+EOcLKvbdRpTfjFdX
+EPCkKvbdpfDeUWBI
+EObjjvbdmuUyjirG
+EObjjvbdtbbtwWOo
+EObkKvbdrylPsAgn
+EOcLKvbdmSYtysEJ
+DncKjvbdSCDeMJYk
+DoCjjvbdTppoUthN
+EPDKjvbdVTmUFkuj
+EObjjvbdIsZAsNXl
+EOcKjvbdSBcdlJYk
+DnbkKvbdZQleIleR
+DnbjjvbdddoSBvcK
+EOcLKvbdNHComPuL
+DncKjvbdiCPCdvqR
+EOcKjvbdliDspuSB
+EObkKvbdzoPpeCkx
+DnbjjvbdcJMijevx
+DoDKjvbddZxpYZQb
+DoDKjvbdkySrSxft
+DoDKjvbdyXhiapZk
+EPCkKvbdOAIrsirA
+EObkKvbdUaBqSqSZ
+EPCkKvbdZtJIyESn
+DnbkKvbdTvLoitAq
+EPCjjvbdyzeNrIJI
+EOcKjvbdiCPDEwRR
+EPCkKvbdnCJvwoNu
+EPCkKvbdIGfzZYXg
+DoCkKvbdkySqrxft
+DoCjjvbdZdxGzgiC
+DncKjvbdzitpPcsU
+DncLKvbdbVCHXjsh
+EPCkKvbdlhcsqVSB
+EPCjjvbdGYtuAcxC
+EOcLKvbdjAQGaQHK
+EObjjvbdjlakzFGo
+EOcLKvbdvwMAvAuu
+EPCjjvbdTqQoVUhN
+EPCkKvbdeEnrBwCj
+DoCkKvbdsCGMkgKy
+DnbjjvbdhkeDnVDZ
+EPCjjvbdOFDshiLE
+DnbjjvbdDwwlUTsl
+EPCkKvbdKWUedEgJ
+EPDLKvbdsQVnicWG
+EPCkKvbdjgflFfOL
+EObkKvbdQYmAHTSK
+EObkKvbdSPsgJecw
+EObjjvbdjAQGaPgK
+DoDLKvbdDxXlUUUM
+DoCjjvbdegjuqnQg
+DnbkKvbddwzTsqez
+DncKjvbdxxJJbPyk
+EOcKjvbdGKeTChMu
+DoCkKvbdeFPSCWcK
+EObkKvbddeOrBwDK
+EPCkKvbdaNLBsUmH
+DoDLKvbdRpTgJedX
+EPCkKvbdkySrSxgU
+EPCkKvbdVYhTzKoO
+EPCjjvbdxxIjCPyk
+EPDLKvbdVrOXadkc
+EOcLKvbdEOcKjwDE
+DncLKvbdmfeYMnGy
+EPCkKvbdVAaprprZ
+EPCjjvbdFWYpQMjF
+DoCkKvbdqrUjmkAm
+DoCjjvbdQvmdDLhD
+EPDLKvbdeATqNYKG
+DnbkKvbdLGGHaaQu
+EObjjvbdezvZEhtX
+DnbkKvbdjuwNdBww
+DncKjvbdJTZAsMwl
+EPDKjvbdkxrrTYgU
+EPDKjvbdbAudfQQX
+DoCkKvbdVUNUGMVj
+EPDLKvbdaNLBsUlg
+EPDLKvbdDwxLtUUM
+EPCjjvbdMgColpUk
+EPDLKvbdaogGdLzd
+EPDKjvbdzGxlANFX
+EPCkKvbdUQqOuUgm
+DoDKjvbdEPDKkXCd
+EPDKjvbdbsCkTcia
+EObjjvbdTAEhhBnd
+EPCkKvbdhzVFkpmf
+DnbkKvbdaSFcHtGL
+DoCjjvbdGBOpxizm
+DncLKvbdGYttaEYC
+DoDKjvbdqYoHfpdY
+EOcKjvbdrouoKCuf
+EOcKjvbdiCPDFWqR
+DnbjjvbdVAaprqRy
+EPCjjvbdePFSjtUS
+DnbkKvbdLGGICBRV
+EPDLKvbdkMalZeHP
+DoDLKvbdJutfEFHJ
+DoDKjvbdVBCRSqSZ
+EObjjvbdvvlBWBWV
+EOcLKvbdFVxpPmJe
+DoDLKvbdKfGHaaRV
+DnbjjvbdBvzdIdpW
+DncKjvbdNsUWHFUp
+EPDLKvbdrSVLNjaN
+EPDKjvbdgGMZnGgA
+DnbkKvbdSBceMIyL
+EOcLKvbdSBdFLiYk
+EOcLKvbdRyigrcWA
+EPDKjvbdaMkBruNH
+DncKjvbdUaCRSpqy
+DnbjjvbdIMBzmvpk
+DnbkKvbdbVCGxKtI
+DncLKvbdliDtQuSB
+EObkKvbdHDkVjBjK
+DncKjvbdmSYtyrci
+DnbkKvbdxVMdpxlO
+EPCjjvbdRpTfjGDw
+EPCkKvbdhancEvpq
+EPDLKvbdNsTvHEuQ
+DoDKjvbdfekymfgA
+EObkKvbdUWLojUBR
+EPCjjvbdJXtBgkpp
+DoCjjvbdEPCkLXCd
+EPCjjvbdZxcjNcLr
+DoCjjvbdZsiJYcrn
+EPCkKvbdZtIiZDrn
+EObkKvbduLxWaUBX
+EObkKvbdZdxGzghb
+EOcKjvbdkClLRHVH
+EOcLKvbdFjdsDINV
+DncKjvbdNeEUIiKd
+EPCkKvbdYpmFJNFR
+EPDKjvbdlhcsptqa
+DoDLKvbdnCKWwoOV
+EObkKvbdDnbkLXCd
+EObkKvbdQwOECkhD
+EOcKjvbdUaCRSpqy
+EPCjjvbdBcoaVjNG
+DnbjjvbdxmrhXsJD
+EObjjvbdcImKKewY
+DnbkKvbdpyOgfpdY
+DnbjjvbdpyOggRDx
+EObjjvbdEOcKjwDE
+DnbkKvbduCcUwVoP
+EOcKjvbdhgKCxuiu
+DoDKjvbdiZtelQmf
+DoDKjvbdnBjXYOnV
+EPDLKvbdczZPwxpb
+EPCjjvbdADRwizJQ
+EObjjvbdfVzwpJzs
+DnbjjvbdxxIiapZk
+EPCjjvbdjcLkQfuH
+EPCjjvbdcyyQYYqC
+DoCkKvbdEuyPpNJe
+DncLKvbdcJNJkGWx
+DoDKjvbdZoOIdeZj
+DoCjjvbdWHxVwgYz
+DnbjjvbdeEoRbWbj
+DncKjvbdZMSDsnLm
+EOcLKvbdbiNKLFvx
+DnbkKvbdjcLjqHVH
+DnbjjvbdEYXktTtM
+EPCjjvbdCSaCsfWr
+EOcLKvbdBdQAuimG
+EObkKvbdqdFIpOWB
+DncLKvbdelevgNKL
+EObkKvbdZMRdUNkm
+EPCkKvbdrDdiQOVa
+DoDLKvbdCWzdJFQW
+EObjjvbdxUleQyMO
+DncKjvbdBsAcTfXS
+EOcKjvbdRMxBxmtz
+EOcKjvbdSKyFuGkT
+EPCkKvbdEuxooljF
+DncLKvbdYgWdAPSi
+DoCkKvbdiHJcYvKV
+EPCkKvbdZQldiNFR
+DncKjvbdjAPgAofj
+EObjjvbdkVvmdBxX
+DoDLKvbdsBfMlHLZ
+DoDLKvbduWNxKQsA
+EObjjvbdOTTugEtp
+DoCjjvbdIxUBgkqQ
+EOcKjvbdqFceUWAh
+DnbjjvbdTkunaVoJ
+EPDKjvbdiZtfLqOG
+DoCjjvbdcImJkGXY
+DncLKvbdpstGrSLU
+DncLKvbdRpTfjGDw
+DnbkKvbdznpREblY
+DnbjjvbdqdEhomvB
+DncLKvbdIwtBhMRQ
+DoDKjvbdhtzFWqtb
+EOcKjvbdiBncEwQq
+EPDKjvbdZQleJMdq
+EOcLKvbdLAkGlaxR
+DoCkKvbdZsiIyDsO
+EObkKvbdeOdsKssr
+DnbjjvbdJcKCpjDY
+EPDLKvbdSBdElIyL
+EPCkKvbdyOTHwrhc
+EPDLKvbdGLEsDIMu
+EPCjjvbdmJETqVRa
+DncKjvbdKDJbqJbx
+EOcKjvbdbsCkTdKB
+EOcKjvbduDCuXVno
+EOcKjvbdrXPlDIxq
+EOcKjvbdqlyixkhJ
+EObjjvbdRkYfUgLT
+EPDLKvbdLAkGmCXq
+DnbjjvbdHgGzYxXg
+DncKjvbdpstHSSKt
+DoCkKvbdqvolCiYq
+DoCkKvbdmgFYNOHZ
+DnbkKvbdqGDeTvBI
+DoDLKvbdyzeNrHhh
+DnbkKvbdwzHefXeS
+DoDKjvbdbiMjLGXY
+DnbkKvbdTulQKTaR
+DnbjjvbdsPunicVf
+DncKjvbdqvpLcIyR
+DncLKvbdOFEThhkE
+EOcKjvbdZshhxdSn
+DncKjvbdpyPHfpdY
+DoDLKvbdNGcPmQUk
+DoCkKvbdVgwvXfxz
+DoCjjvbdCgLegAzc
+DnbjjvbdauCGxLTh
+DoDKjvbdqFceTvBI
+DoCjjvbduMYXAsaX
+EPCkKvbdrSVKmkAm
+EObkKvbdOYOuzcnU
+DncKjvbdYkqctNlN
+DncKjvbdSZjHrcWA
+DoCjjvbdrEFJQNua
+EPCjjvbdRosfjFcw
+EObkKvbdZoNiFEyj
+EPDKjvbdVgwvXfxz
+DoDLKvbdhbPCdvqR
+DncKjvbdqvokcIyR
+DnbjjvbdpssfqqkU
+DncLKvbdzoPpdbkx
+DnbjjvbduaDySoFI
+EOcKjvbdEASImZwX
+DncKjvbdbrcKtDjB
+DoCjjvbdQccBQQdS
+DoCkKvbdDigjVwjA
+DnbkKvbdbVBfwkUI
+EOcKjvbdIsYaSlxM
+DoDLKvbdKVtedEgJ
+EPCjjvbdIryArlxM
+DncKjvbdpeceTuaI
+EObkKvbdZshiYdSn
+DncLKvbdZtIhyESn
+DnbjjvbdOYOuzcnU
+DoDKjvbdUxhTyjoO
+EObjjvbdTppoVVHm
+DncKjvbdrWolCiYq
+DoDLKvbdNVSrKmAX
+EObkKvbdiGicZWKV
+DoDKjvbduVmwipsA
+EPCjjvbdNPwqVnHT
+EObjjvbdelewGmJk
+EOcLKvbdgGLzNgHA
+DoDKjvbdcJNJjfWx
+DoCkKvbdyOTHwriD
+EObjjvbdEzspeLcJ
+DnbjjvbdjhHLeenL
+DncKjvbdOStWHFVQ
+EOcLKvbdsZlPsBHn
+EPDLKvbdtcCuWuno
+DnbkKvbdULunaVni
+EPDKjvbdJqZdnfNe
+EOcKjvbdqwPkcIxq
+EObjjvbdrJAJeNOe
+DnbjjvbdRECaPpdS
+EPCjjvbdpfEEsvBI
+EPDLKvbdIsZArmYM
+EPDLKvbdJYUCILpp
+EOcLKvbdYlSDtNlN
+EPCjjvbdJYTbHkpp
+EPDKjvbdYzbfSJvZ
+EPCjjvbdRaceMJYk
+EObjjvbdZisHofaf
+DnbkKvbdRbEElIyL
+EOcLKvbdijFhKNXr
+EOcKjvbdRXNdDMID
+DncLKvbdbiNKLGXY
+DoDLKvbdlZSrSyHU
+EObkKvbdqZPIHRDx
+DoDKjvbdnPzYujxb
+EObkKvbdnHEwlmfy
+EObkKvbdCWzdIePv
+EObkKvbdqlyiyLgi
+EPCjjvbdkySqryHU
+EObkKvbdcImKKevx
+DncKjvbdEASJMzWw
+DncKjvbdRkYfUfkT
+EPCjjvbdqYoIGpcx
+DncKjvbdGckWKBjK
+EPCjjvbdYTLaNUOx
+EPDKjvbdwtleRZMO
+EObkKvbdGFiqnJUR
+DncLKvbdlhdURVRa
+EObjjvbdqlzJxkhJ
+DncLKvbdFaPQyJzm
+EPCkKvbdpssgRrLU
+EObjjvbdiCOcFXRR
+DncKjvbdqTtGqrLU
+EPCjjvbdsCFlkgLZ
+EOcKjvbduWOXiqTA
+EOcKjvbdkClKqGuH
+EPCjjvbdMowpvOGs
+EPCkKvbdxrmhmRag
+DoCjjvbdiUzFXRuC
+EOcLKvbdUMWPAvOi
+DoDLKvbdmfdwlmgZ
+EPCjjvbdehKurNpg
+EOcLKvbdBsAcTevr
+EPCjjvbdZjTIPgBf
+EObjjvbdPIAXyAZB
+EPCjjvbdCDoaVjNG
+DncKjvbdrpVnicVf
+DoDKjvbdlZTSSxgU
+DncKjvbdGZVVAdYC
+EPDLKvbdsCGMkfjy
+EPCjjvbdSPsfjFdX
+DoCjjvbdJXsbIMQp
+DncKjvbdzeZnzdyp
+DnbkKvbdlYsRsYft
+DncKjvbdbiMjLFwY
+EPDKjvbdyOShYSiD
+DoCkKvbdOTTufduQ
+EPDLKvbdVwJYVcdg
+DoCkKvbdGFiqnJTq
+EOcLKvbdUslselWK
+EObjjvbdkxsSSyHU
+EOcLKvbdxsNhmSBg
+DnbjjvbdqqtkOLAm
+DnbjjvbdeFPRawDK
+DnbkKvbdLZQirzuG
+EPCkKvbdFWYpPlie
+EObkKvbdrWpMCiYq
+EOcKjvbdiiehKNXr
+EPDKjvbdEvYopNJe
+EPCkKvbdxrmhmSCH
+DoCkKvbdptUHSRkU
+EOcKjvbdKCjDRJcY
+DoDLKvbdrMzKYkgi
+DoCjjvbdZLrDtNkm
+DoCkKvbdqYnggQcx
+DnbkKvbdrovOibvG
+DncKjvbdADRwizIp
+EOcLKvbdZisHpHCG
+EPCjjvbdZRNFImFR
+EPDKjvbdVwIxVceH
+EOcKjvbdrDeJQNua
+EPCkKvbdIxTaglQp
+DncKjvbdGFiqmiUR
+EPCjjvbdVwJXvEEg
+DnbkKvbdwuMeRZMO
+EPCkKvbdZRNFImFR
+EPCkKvbdnHEwlmgZ
+EPDKjvbdLYqKSzuG
+DoDKjvbdZsiJYdTO
+DoDLKvbdShyjRAAl
+DoDKjvbdRadFLiYk
+DnbkKvbdjbkjpgUg
+EObkKvbdUaBpsRRy
+EOcKjvbdehKuqnRH
+EObkKvbdDwxMUTsl
+EOcKjvbdptUHSSKt
+EPDKjvbdHEKuibJj
+EOcKjvbdxxIjBpZk
+EObkKvbdelewGmJk
+DncLKvbdTvLpKUAq
+EPCjjvbdGLErbhNV
+DncLKvbdfHjvRmqH
+DnbjjvbdkMakyeHP
+EPDKjvbdJcKCpjDY
+DoCkKvbdRECaPpcr
+EOcLKvbdmgFYMmgZ
+EObjjvbdZRMdiMeR
+DoCjjvbdYzcFqivZ
+DoCkKvbdeOeTKtTr
+EPCkKvbdXFxytAPT
+DncLKvbdZnnJEdzK
+DncLKvbdhtyeWrUb
+EOcKjvbdEJgivXjA
+EPDLKvbdssSTYyeD
+EPDLKvbdLBLGmCXq
+DnbkKvbdKeegbApu
+DoDLKvbdJYUBhLqQ
+EPDKjvbdwNWANDdm
+DoCjjvbdKfGIBaRV
+DoCjjvbdbhljLFwY
+DncLKvbdmgFXmNgZ
+DoDKjvbdZRMeJNFR
+DoCkKvbdWeyZtAOs
+DoCkKvbdbiNKLFvx
+EPDKjvbdUsmTfMVj
+EPCkKvbdijFgjMwr
+DnbkKvbdbsCjtDia
+DnbjjvbdZQleJNFR
+DoDLKvbdNQXqWNfs
+EOcLKvbdULunaVoJ
+DncLKvbdrEEhpOVa
+DncLKvbdRyigsCvA
+DoCkKvbdVwJYWEEg
+DncLKvbdjKGIKMwr
+EObkKvbdrEFIpNvB
+DoCjjvbdGLEsDINV
+EOcLKvbdJSyArlxM
+EPCjjvbdTJZiqABM
+DncLKvbdCTAbsewS
+DnbjjvbdZjTIPfaf
+EPCjjvbdbPfgELzd
+DnbjjvbdLBLHMbXq
+EPCjjvbdqiAKFMoF
+DnbkKvbdIBlZdzAD
+EPDLKvbdyTNiNRag
+DoDLKvbdZjSgogCG
+EPCjjvbdjAPgAofj
+EPCjjvbdxmrgxTJD
+EObjjvbdSPsgKGEX
+EObkKvbdRWnDblHc
+DnbjjvbdZQmFImFR
+DoCjjvbdjuwODaww
+EOcLKvbdVviXvEFH
+EPCjjvbdcImJkGXY
+EPDKjvbdVAbQrqSZ
+DoCjjvbdWWiXudFH
+EPDKjvbdapGfdLzd
+EObkKvbdQwOEDMID
+EPCjjvbdKDKCqKCx
+DncKjvbdJvUfEEgJ
+EObkKvbdDoDLKvcE
+EOcKjvbdqwPkbhyR
+EObjjvbdyTOJNSCH
+EObkKvbdZsiIxdTO
+DoCjjvbdaSFbhTfL
+EOcKjvbdUslsekvK
+DoDKjvbdehLWSORH
+EPCkKvbdBsBDTfWr
+DoCkKvbdMfbpNQVL
+DoCkKvbdezvZFJUX
+EObjjvbdJYUBhMRQ
+DncKjvbdlhcsptqa
+DoCkKvbdiZtfMQnG
+EObkKvbdZRMdhleR
+EPDLKvbdkySrSxgU
+DoCkKvbdYlSDsmkm
+DnbkKvbdkNBkzEfo
+EPDLKvbdyYJKCPzL
+EOcKjvbdqwPkbiZR
+DncLKvbdqdFJQOWB
+DoDKjvbdFyUtaDxC
+DnbjjvbdZyDinDMS
+EOcKjvbdqrVKnKaN
+DoCjjvbdMgDPlotk
+EPCjjvbdUVlPitBR
+DoDLKvbdbsCkTcjB
+EPCjjvbdnGdwlnGy
+DnbkKvbdapGfdLzd
+EPDKjvbddndsKtTr
+DncLKvbdsrrTZZeD
+EObkKvbdqdFJQOWB
+DncKjvbdRadFLhxk
+DnbkKvbdfILWSORH
+DnbkKvbdqZOggQcx
+EPDKjvbdCDpAujMf
+EObjjvbdxsOImSBg
+DoDKjvbdrSUjmjaN
+EObkKvbdrMyjYkhJ
+EObkKvbdANHySvzY
+EObkKvbdgGLynGgA
+DoDLKvbdNdcshiKd
+EObjjvbdePErkTtS
+EPCkKvbdSCEFLhxk
+DoDKjvbdIxUBhLqQ
+EPCkKvbdVvhxWDdg
+EOcLKvbdKfGHbBQu
+DoCjjvbdajlFoNcA
+DoCkKvbdQdDAopdS
+DoDKjvbdSBceMJZL
+DoDKjvbdOStWGdtp
+DoCjjvbdGdLWKBij
+DnbkKvbdvOszpjnt
+DncLKvbdUVlPjTaR
+DoDLKvbdliDsptrB
+EOcKjvbdZisHpHCG
+DoDKjvbdkVwODaxX
+DoDLKvbdfVzwpJzs
+DnbkKvbdDjIKWYKA
+EObkKvbdrJAJdmPF
+EObjjvbdeATpmYJf
+DnbkKvbdQmYByOUz
+EPDLKvbdxmrhXsJD
+EPDLKvbdCJLBjiGK
+DoCkKvbdYpmFJMeR
+DoDKjvbdXnRAXuWU
+DoDKjvbdiMFDmtby
+DnbkKvbddZyQYZQb
+DncLKvbdZtIiYdSn
+EObjjvbdwMvANDdm
+EPDLKvbdIwsbHkqQ
+DncKjvbdURQntthN
+EObkKvbdTqROttgm
+EPCjjvbdTkvOaVni
+EOcLKvbdfNFwHNKL
+EObkKvbdjgflFfOL
+EObjjvbdUQqOuUhN
+DncLKvbdegjurNqH
+EPDLKvbdxUmEqZMO
+DoDKjvbdGcjvKBjK
+DoDKjvbdVTltFkuj
+DnbkKvbdLYqKSztf
+DoDKjvbdUyHtZkOn
+EPDLKvbdvAcyTOdh
+DncKjvbdqFcdsvAh
+DncLKvbdrbFmMHKy
+EOcKjvbdYlRdTnLm
+DoCjjvbdEASJMzXX
+EObkKvbdMoxQvNfs
+EOcKjvbdiHJcYujV
+DnbjjvbdvAcyTPEh
+DoDLKvbdGQASwGfZ
+EObkKvbdMoxRVnHT
+EObkKvbdhgJcYvJu
+DnbjjvbduWOXipsA
+DoDLKvbdQcbaQQdS
+EObkKvbdUsltFkvK
+EPDKjvbdKyQirzuG
+EPCjjvbdmJDtQuSB
+EObkKvbdXrkaMsoY
+EOcKjvbdrEFIpOVa
+EPDKjvbdVqmwadkc
+EOcKjvbdqYoIGqDx
+EObkKvbdtbbtwWOo
+EPCkKvbdSKxfUfkT
+EPCkKvbdmJDsqUrB
+DncKjvbdhaoCeWpq
+EObjjvbdFxuVAdYC
+EPCkKvbdqFcdsvBI
+EPDLKvbdOTUWGeVQ
+EPCkKvbdlhdUQtrB
+DoDKjvbdCJLCLJGK
+EPDKjvbdMgCpMotk
+DnbjjvbdrbFlkgLZ
+DoDKjvbdqBJFAWhE
+EPCjjvbdpyPHfqDx
+EOcKjvbdTlVoBVni
+EPCjjvbdrRtkNkBN
+EPCkKvbdWWhwuceH
+EPDKjvbdcImKKewY
+EOcKjvbdYSlBNToY
+EObkKvbdZRMeIldq
+EPDLKvbdMoxRWNgT
+EObjjvbdMIbMQxAS
+EPCjjvbdQdDBQQdS
+EObkKvbddZyPwxqC
+EOcLKvbdACrXiyiQ
+EPDLKvbdcSbkUEJa
+DncLKvbdTkunaWPJ
+DnbjjvbdvBEYrndh
+EObjjvbdmIctQuRa
+DncKjvbdiUydvqtb
+DoCjjvbdhkdcnUby
+EOcKjvbdePFTLTsr
+EOcLKvbdiHJbxujV
+EObjjvbdZsiJZESn
+EOcKjvbdpxoHfqEY
+EPDKjvbdFyUuBDwb
+DoDLKvbdBiLBkJGK
+EPCkKvbdliDtQuRa
+DoDKjvbdhbOcEwQq
+DncLKvbdRosgJfDw
+EObjjvbdrzMQSaIO
+EObkKvbdUsmTfMVj
+EOcKjvbdWXIxWEFH
+EPCjjvbdcTCjtDjB
+EObkKvbdbBVeGQPw
+EOcLKvbdaSGDHtFk
+DoDLKvbdqFdFUVaI
+EPCkKvbdxxIjBozL
+DncLKvbdNddUIiLE
+EObjjvbduMYWaUAw
+EPCkKvbdWWiXvDdg
+EObjjvbdJXsbILqQ
+DnbkKvbdDnbjjwCd
+DnbkKvbdxUldqZMO
+DoCjjvbdKyRKSztf
+DncLKvbdLFehBaQu
+EPDLKvbdjvXNdBww
+EOcLKvbduaEZTPFI
+DoCkKvbdfMevfmKL
+EPCkKvbdpxoIGqEY
+EPCkKvbdKWUecdgJ
+EObkKvbdmbJwYOmu
+EPCkKvbdIsZArmYM
+DnbjjvbdxLXDgzyf
+DncLKvbdEvYopMjF
+DncLKvbdmJETqVRa
+DnbkKvbdrouoKDWG
+EPDLKvbdbVCGwkTh
+DoDKjvbdZirhPgCG
+EPDKjvbdTvMQKUAq
+DnbkKvbdLrWlzVQz
+EOcLKvbdrEEiPmua
+DnbjjvbdczZQXyRC
+DncKjvbdnUtzKjSG
+EPCjjvbdkNCLzFHP
+DncKjvbdZyEKNbkr
+EObkKvbdJuuFdEgJ
+DncLKvbduCbuXWPP
+EPCjjvbdyNrhXriD
+DnbkKvbdIxTaglQp
+EPCjjvbdJvVFceHJ
+EPCkKvbdVBBprqSZ
+EOcKjvbdkxrqsYgU
+EPCjjvbdGLFSbhMu
+EObjjvbdnPzZWLYb
+EObkKvbdjblLRGuH
+DoDLKvbduaDyTPFI
+EPCjjvbdiifIJmXr
+EObkKvbdYkqctOMN
+EPCkKvbdelfXHMjL
+EPDLKvbdeFOrCWbj
+EObjjvbdeUAUATNW
+EPCjjvbdWRmxBeMD
+DoCjjvbdZxcinDMS
+EOcLKvbdWRmwbElD
+DoDLKvbdpssfrSLU
+DncLKvbdQccApRES
+DoDKjvbdGdKujBij
+DoDKjvbdZLqdTmlN
+DoCjjvbdbiNKLGXY
+DoCjjvbdVZITzKoO
+DoCkKvbdsPuoKCvG
+EPDKjvbdNGbomQVL
+DnbkKvbdkIHMGFnL
+EPDKjvbdvPTzpjoU
+EOcKjvbdczZPxZQb
+DncKjvbdliEURUrB
+DnbkKvbdGZUtaDxC
+EPCjjvbdrMyjZLhJ
+EPCjjvbdTulPjTaR
+DoCkKvbdZeYGzhJC
+DncLKvbdwygefYEr
+DnbjjvbdehLVrOQg
+DnbjjvbdZxcjNblS
+DoCjjvbdSLYetgKs
+EPCkKvbdVAbQrpqy
+EPCjjvbdtTSTZZdc
+DnbkKvbdSCEFMIyL
+DoDKjvbdrDeJPmvB
+EOcLKvbduDDVXVno
+DoDLKvbdZdxGzhIb
+EObkKvbdhgJbxujV
+DncLKvbdlYsRsZHU
+DoDLKvbdhzUelQmf
+EObkKvbdWWhwvDeH
+EPCjjvbdjgfkfFmk
+EObkKvbdzaAPHGal
+DoDLKvbdEPDLLXDE
+DoCjjvbdTukpKTaR
+EOcKjvbdhaoCeWpq
+EPDKjvbdwjvdHzzG
+EPDLKvbdJTZBTNYM
+DoDLKvbdRECaPqDr
+DncKjvbdjhGkfGNk
+EObkKvbdjhGkfFmk
+DncLKvbdqlyixkhJ
+EObkKvbdjEkHUoAO
+EPCkKvbdcasMrAUN
+EObjjvbdhzUfLqOG
+DoCkKvbdEvYopNKF
+EPCjjvbdjuwODaxX
+DncLKvbddiirWUzn
+EObkKvbdOStVfduQ
+DnbjjvbdypnmIjXA
+DnbjjvbdRWnEClHc
+EOcLKvbdbhljLFvx
+EPDLKvbdJXsaglRQ
+EObkKvbdhzUfLqOG
+EObkKvbdnPyxujyC
+DoDKjvbdBiKajiFj
+DoDKjvbdZjTHpHBf
+EPCjjvbdaSFcITek
+EObjjvbdYzcFqiuy
+DncLKvbdqdFIpNvB
+DoDKjvbdLYqJrzuG
+DoDLKvbdVwJXucdg
+DnbjjvbdhbObdvqR
+DoCkKvbdCEQBWJlf
+DoDLKvbdSCDdlJYk
+EPDLKvbdZyEJnCkr
+DoDKjvbdvAcyTOeI
+DoDKjvbdkIHLfFmk
+EPCjjvbduaEYroFI
+DnbkKvbdjblKpgUg
+EOcKjvbdwygefYFS
+EOcKjvbdliDsqUqa
+DnbjjvbdjcMLRGtg
+EObkKvbdRbEElJYk
+EPCkKvbdqrUkNjaN
+EOcLKvbdRotGifDw
+DnbkKvbdUsmUGLuj
+DoCjjvbdeKJqvUzn
+EPDKjvbdQwNdClHc
+EOcLKvbdcScLTcjB
+DoCjjvbdvBDxroEh
+DoDLKvbdIxUBglQp
+EPDLKvbdfVzxQJzs
+DncLKvbdqlzKYlIJ
+DoDKjvbdaNLCSuMg
+EOcKjvbdwjwDgzyf
+EPDKjvbdIxTaglRQ
+DoDKjvbdVTltGLuj
+DoCkKvbdiMFENuDZ
+EOcLKvbdZyEJnDMS
+DnbkKvbdiBoCeXRR
+EPCkKvbdbiMijewY
+EOcKjvbdmttzLJqf
+DncKjvbdYTLaMtOx
+EPCjjvbdfIKuqmqH
+DoCjjvbdBdQBVjNG
+EObkKvbdieLGuPAO
+EPDLKvbdsZlQSaIO
+DnbkKvbdEztQeMDJ
+EPCjjvbdIjEAJpHE
+EOcLKvbdfILWRmpg
+EPCjjvbdZyDinDLr
+DncKjvbdLGGIBaRV
+DncLKvbdmozZWLZC
+DoCkKvbdlZSrSxft
+EOcLKvbdFjdrcINV
+EOcKjvbdQvnDblHc
+DoCkKvbdqUUHRqkU
+EPDKjvbdnBjWwnmu
+DoCjjvbdZxcjNbkr
+DncKjvbdZisIQHCG
+DoCkKvbdJcJcRJbx
+EPDLKvbdlhdUQtqa
+DnbkKvbdrzLpSaHn
+DoDKjvbdziuPpDrt
+EPDKjvbdEYXlTtUM
+EObkKvbdqdFIpOVa
+DncKjvbdpxnhHQdY
+DnbkKvbdLhakqYAS
+EPCkKvbdrRtkNkBN
+EObkKvbdqrVKmjaN
+EOcKjvbdxUldqZMO
+EOcKjvbdrbFllHKy
+DoCkKvbdySmhlrBg
+EPCkKvbdkxrqsYgU
+EPCkKvbdZLqcsnMN
+DncKjvbdFpATXHFy
+EPDLKvbdZRMdiMeR
+EPDLKvbdRNXbYmtz
+DoCkKvbdpyPIGqEY
+DoDLKvbdKaKfmCYR
+EPDLKvbdrylPsBIO
+EObjjvbdUQqOuVHm
+EPCkKvbdezvZFItX
+EOcKjvbdZirhQHCG
+DoDKjvbdePFSjssr
+EOcKjvbdCTAcTfXS
+EOcKjvbdkxsRsYft
+EPDLKvbdQwODcMHc
+DoDKjvbdwuNFRZMO
+EPCjjvbdEuyPomKF
+DoCkKvbdpxnhGpcx
+DncKjvbdiVZeWrUb
+EOcKjvbdrEEiPmvB
+EOcLKvbdZxdJnDLr
+EObjjvbdUtNUFkvK
+DoDLKvbdZQmFIldq
+EObjjvbdnCJvwnmu
+EPCkKvbdRWmccLgc
+DnbkKvbdnUtykJqf
+DnbkKvbdVBBqSpqy
+EPCkKvbdZoOIddyj
+DnbkKvbdZQldiNFR
+DncLKvbdmRyVZsDi
+DoCjjvbdcasMrATm
+EOcLKvbdtbbtvuno
+DoDLKvbdZtJJYdSn
+DnbkKvbdGKeTDHlu
+DoCkKvbdZjTHpGbG
+EOcKjvbdHDjvKCKK
+EObjjvbdddnqbXCj
+EObkKvbdlZTSTYgU
+EPCjjvbdqqtjmkBN
+EObjjvbdtAGqIAAr
+EObkKvbdrRtjmjaN
+DnbjjvbdMRwMytpz
+EPCkKvbdsQWPJbuf
+DoDKjvbdqFceUWBI
+DoCkKvbdnBjWxPNu
+DoDLKvbdiUzFXRuC
+EObkKvbdQccBPqES
+DnbjjvbdOFDtIiLE
+EPDKjvbdYlRcsnMN
+DncKjvbdFfJrNhsq
+DoCkKvbdsCFmMHKy
+EPDLKvbdYkrETnMN
+DoCjjvbdYNqAXuWU
+EPDKjvbdrovPKDWG
+DoDLKvbdbKlGOmcA
+DoCkKvbdOStWHFVQ
+EObjjvbdhbObeXQq
+EPCjjvbdeEnrBwDK
+DoDLKvbdrbFmMGkZ
+DncKjvbdxZhGGYFS
+EPDKjvbdbrbkTdKB
+EPDKjvbdraellGkZ
+EPCkKvbdssSTZZeD
+EPDKjvbdDjHiuxKA
+DoCjjvbdzoPqFDMY
+EPCjjvbdlAlnmALA
+DoDKjvbdmtuZjjRf
+DoDKjvbdFpASvfey
+DoCkKvbdjlakyeGo
+DoDKjvbdxnSgxTIc
+EPCjjvbdxZhFfXeS
+EPCkKvbdqcdiPnVa
+EOcLKvbdmfeYMnHZ
+DoDLKvbduCbuWvOo
+DoDKjvbdmIcsqUqa
+EPDKjvbdzoQQdblY
+DoDLKvbdRNXayOUz
+DnbjjvbdrJAKFNOe
+DnbjjvbdZLrEUOMN
+EOcKjvbdwygeexEr
+EPCkKvbdbVBfwjtI
+EObkKvbdKDKDRJbx
+DoCkKvbdGckWKBij
+EOcKjvbdzjVQPdSt
+EPDLKvbdqlzKYkhJ
+DnbjjvbdajkennDA
+DoDLKvbdRzJgsCvA
+EObjjvbdehKuqmqH
+DncKjvbdajlFnnDA
+DnbjjvbdjEkHUoAO
+DoCjjvbdFVyPomKF
+DoCkKvbdJcJbpjCx
+DnbkKvbdRaceLiZL
+EPDKjvbdeEnrBwDK
+DoDLKvbdxKvdHzyf
+DoCkKvbdSPtHKFcw
+EObkKvbdjhHMGGOL
+EOcLKvbdGGJqnItR
+DoCjjvbdnGdxNNgZ
+DoDKjvbdbKkfOmcA
+DnbjjvbdelewHNKL
+EPCkKvbdcSbjsdJa
+EPCkKvbdTAEhgbOd
+DncLKvbdUslselVj
+DnbjjvbdVrOYBeMD
+EObjjvbdEzspeMDJ
+EPCjjvbdcTDLTcjB
+EPDLKvbdsPvPJbuf
+EOcKjvbdqGEFUWBI
+EPDKjvbdVgxWYGxz
+EOcLKvbdSPtGjGDw
+EObkKvbdGckVibJj
+DoDLKvbdeEoSCWcK
+EPCkKvbdQvmdClID
+DncLKvbdhytelROG
+EPCkKvbdeXzTtSFz
+EPCkKvbdrXQMDIxq
+EObkKvbdtlXvaUAw
+DnbkKvbdiMFDmtcZ
+EPDLKvbdJqZeOfNe
+EPDLKvbdmIdUQtrB
+DoDKjvbdVTltGLvK
+DncLKvbdZRNEhleR
+EPDKjvbdjlakydfo
+DnbjjvbdFpASvfey
+EPCkKvbdkySrTYft
+EOcLKvbdVUMtGMVj
+EPDLKvbdmRyUysDi
+EPCkKvbdGKeScHlu
+EObjjvbdczZPwyRC
+EPDLKvbdVYhUZkOn
+DncLKvbdJbibqKDY
+EPDLKvbdfekzNfgA
+EObkKvbdKQydoGOF
+EObkKvbdVgwvXfxz
+DncLKvbdQdDApQcr
+DncLKvbdGFjRnJUR
+DncKjvbdjgflFemk
+DoDKjvbdlhctRVSB
+DncLKvbdZLqctOLm
+DncKjvbdfSAvzlCo
+EPDKjvbdZRMeIleR
+EObjjvbdZRMeJMdq
+EOcKjvbdMuTSKmAX
+DncKjvbdqYngfpdY
+DnbkKvbdxrmiMqbH
+EObjjvbdbPgGckzd
+DoCkKvbdpstGqqkU
+DncLKvbdmJDsqVSB
+EPDLKvbdtunYKQsA
+EObkKvbdDnbkKwCd
+EPDLKvbdEXwkstUM
+DoDKjvbdrRtkNkBN
+DncLKvbdIwtCIMQp
+EPDLKvbdZQmEhmEq
+DnbkKvbdxmrhYTIc
+DoCjjvbdCSaDUGWr
+EPCkKvbdatagXkUI
+DncLKvbdEPDKkWcE
+DncKjvbdZjShPgBf
+EPDKjvbdHDkVjCJj
+DoCjjvbdsrrTYzEc
+EObjjvbdhlEcnUby
+DnbjjvbdemFvfmKL
+EObkKvbdlhcsqUqa
+DoCkKvbdZtIiYdTO
+EObkKvbdEXwlTssl
+DoDKjvbdhaoCdvqR
+EObkKvbdliEURUrB
+DoDLKvbdEYXkstTl
+DncKjvbdFkEsDINV
+DoDKjvbdFkErcHmV
+DoDLKvbdKCjCpjDY
+EPCjjvbdjJegjMxS
+DnbkKvbdnCKWwnmu
+DnbjjvbdqwQLbiYq
+DoDLKvbdSZigsDWA
+EObjjvbduVnYKRTA
+EOcKjvbdTlWOaVoJ
+DnbjjvbdSCDeMJYk
+DnbkKvbdQvmdClID
+EPCkKvbdziuQPdTU
+EOcLKvbdhficZWJu
+EOcKjvbdZLqdTmkm
+DoDKjvbdcImKKevx
+EOcLKvbdGFirOJUR
+EObkKvbdREDApRES
+DoDKjvbdHELWKBij
+EOcKjvbdrSVLNkBN
+EOcKjvbdBdQBWJlf
+DoCjjvbdFpATXHGZ
+DnbjjvbdqZOhGpdY
+EPDLKvbdCSaDUGWr
+DoDLKvbdrpWPJcWG
+DnbjjvbdZsiJYdTO
+EPDKjvbdJvVGEFGi
+EPCkKvbdmIctRVSB
+DncKjvbdBiLCKhfK
+DoCkKvbdZisIQGbG
+DoCjjvbduWNwjQsA
+EOcLKvbdiHKCyVjV
+EPCjjvbdlZSrTZGt
+EObjjvbdNPxRWNgT
+DncKjvbdeAURNXif
+DncLKvbdOStWGeVQ
+DoCjjvbdJvUeceGi
+DoDKjvbdXsMBMsnx
+EPDKjvbdGLFSbhMu
+EPDLKvbdEvZPolie
+EOcKjvbdrRtjnLBN
+EPDKjvbdyOTHxTJD
+EPDKjvbdmajWwnmu
+EPCjjvbdrNZjZLhJ
+DncKjvbdajlFoODA
+DoDKjvbdrEFIpOVa
+DnbkKvbdpedEtWBI
+DncKjvbdqwQMChyR
+DnbjjvbdnCKWwnnV
+DoCjjvbdNUsRkNAX
+EOcLKvbdULvPBWPJ
+DncLKvbdjlalZdfo
+EPDKjvbdjJfHjNYS
+DoDKjvbdPxmAHTSK
+DnbkKvbdmIctQtqa
+EObjjvbdnHFXmNfy
+EPCkKvbdqlzJyLhJ
+DnbjjvbdVqnYCElD
+EPDKjvbdqTsgRqkU
+EPCjjvbdADSYKZhp
+EPDLKvbdEvZPoljF
+DoCkKvbdLFfICBRV
+EOcLKvbdZRNFJNFR
+EPDKjvbdpedFUWBI
+EPDKjvbdVwJYVceH
+DoCjjvbdGYtuBDwb
+DoCjjvbdVYgtZjoO
+DncKjvbdQccApQcr
+EOcLKvbdWWiYWDdg
+DncKjvbdyTOJNSBg
+DnbjjvbdbAueFpQX
+DnbkKvbdiUydwSUb
+DoDKjvbdKVtfDeHJ
+DoDKjvbdEObjkXCd
+EOcKjvbdqlyjYlHi
+EOcKjvbdfRaWzlCo
+EObjjvbdRWmcblID
+DoDLKvbdCDpAvKMf
+DncLKvbdmuVZjjSG
+EPDLKvbdkaMnmALA
+EPCkKvbdcSbkTdKB
+DnbjjvbdZtJIyESn
+EPCkKvbdQvmccMHc
+DncLKvbdfHjvRmpg
+DoCjjvbdVvhwvEEg
+EPCjjvbdXrkaNTnx
+DnbkKvbdGFirNiUR
+EObkKvbdZLrDsnLm
+EObkKvbdySnJNRbH
+DncKjvbdaMkBsUmH
+EPCkKvbdqGEFUWBI
+EObjjvbdmajXYOnV
+DnbkKvbdHELWKBjK
+EPDKjvbdWSOYCFLc
+DncLKvbdehKurNqH
+EPDLKvbdSZjIScWA
+DncKjvbdZQldiNEq
+DncLKvbdVwIwvEEg
+DnbjjvbdauCGxKsh
+DnbkKvbdKefHbApu
+DoCkKvbdssSTYyeD
+DnbjjvbdSPsgJfEX
+DoCkKvbdeKKRvUzn
+DoDLKvbdiMEcnVCy
+DoDLKvbdoAKzsgcn
+DoDKjvbdDoDKjvbd
+DncKjvbdFWYopMie
+EPDLKvbdRNXaxmtz
+EOcLKvbdKefHaaRV
+EPDKjvbderAvzkbo
+EObjjvbdzoQREcMY
+DnbkKvbdijFgjMwr
+EObjjvbdhbObdvqR
+EPCkKvbdySmiMqbH
+EObkKvbdyzeOSIIh
+DnbkKvbdjcLkRHUg
+DoDLKvbdJpydoGNe
+DoDKjvbdwXMBWBWV
+EObkKvbdsBfMkgKy
+DnbkKvbdYkqdTnMN
+EPCjjvbdEPDLLWbd
+EObkKvbdDwxLtUUM
+DncKjvbdNrtVgFUp
+EPDKjvbdZQleJNFR
+EPDKjvbdJKEAKPfd
+DnbjjvbdhgKCxvJu
+EObkKvbdLAkHMbXq
+EPDKjvbdhancEvqR
+DoCjjvbdNsUWHEuQ
+DnbkKvbdZjTHofaf
+EPCjjvbdrDdiQOVa
+EPDKjvbdkMbLzEgP
+EPCkKvbdZoOJFEyj
+EPCkKvbdADRxJyhp
+EObjjvbdaSGCgsfL
+DnbjjvbdJbjDQibx
+EPCjjvbdpfEEtWBI
+EOcLKvbdZxdJmblS
+EPCkKvbdRpTgKGEX
+DoCjjvbdzRPNIiwA
+EObkKvbdzoPpeClY
+EObjjvbdeFOrBwDK
+DoCkKvbdOTTvHEtp
+DnbjjvbdGQATWgFy
+EPCjjvbdEvZQQNJe
+EObkKvbdjvWnECYX
+DoDLKvbdyTOIlqag
+DnbkKvbdEASJNZvw
+EOcKjvbdsZkosBHn
+DoDLKvbdtSqsYyeD
+DncKjvbdqlyixkgi
+EPCjjvbdTppnuVHm
+DncKjvbdatbHYKsh
+DoCkKvbduVmwjQsA
+EPCkKvbdvAcxsOeI
+EObkKvbdRjyFuHLT
+EObjjvbdTukoitAq
+EOcLKvbdkySqrxft
+EObjjvbdQccBPpdS
+DoDKjvbdffLzNfgA
+DoDKjvbdiCOcEvqR
+DncKjvbdIBkzEzAD
+EObjjvbdVZHsyjoO
+EOcLKvbdZoNheEzK
+DnbkKvbdsZkpTAhO
+DnbjjvbdqFdEtVaI
+DnbkKvbdIGfzZXwg
+EPDLKvbdlrZVZsEJ
+EObjjvbdBcpAvJmG
+DnbjjvbdtSqsYzFD
+EPDLKvbdJJdAJogE
+DncKjvbdxVMdpyMO
+EPCjjvbdQwOEDLhD
+DoCjjvbdmgFXmNgZ
+DoDLKvbdjEkGuPAO
+EPCjjvbdACrXjZiQ
+DoCjjvbdZMRdTmlN
+DncLKvbdiLeDnVDZ
+EObjjvbdVAaprpqy
+DoDLKvbdRjyFuGjs
+DnbjjvbdVAbQrprZ
+EObkKvbdSZjHrcWA
+EPDKjvbdVrOYBeMD
+EPDLKvbdDwxMUTsl
+EPDKjvbdRadElIxk
+DnbjjvbdmozZWKyC
+DoDLKvbdptTgRrKt
+EPCjjvbdatagXkUI
+DncLKvbdZLqcsnMN
+DoDLKvbdfNFwGmJk
+EObkKvbdqTsfrSKt
+DncLKvbdZjTHpGbG
+DoCjjvbduWNwipsA
+EPDKjvbdauCGwkTh
+DncLKvbdKVuGEFGi
+EObjjvbdZirhPfaf
+DoDKjvbdxKvcgzyf
+DnbkKvbdxsNhlrCH
+DoCkKvbdBsBDUGWr
+DncKjvbdfMfXHNJk
+DnbjjvbdOSsugFVQ
+DncKjvbdZisIPfaf
+DnbjjvbdZHXEAOsJ
+DnbjjvbdLZRJrzuG
+EObkKvbdwuNFQxlO
+DncKjvbddxZtURez
+EPCkKvbdxrmiNSCH
+DoDKjvbdiUydwSVC
+EObjjvbdiifIJlwr
+DncLKvbdssSSxyeD
+EPDKjvbdOEcsiJLE
+EOcKjvbdySnIlrBg
+EPCkKvbddZyQYZRC
+DnbjjvbdWXJXudEg
+DoDLKvbdKaLHNCXq
+DoDKjvbdGGKRmiTq
+DnbkKvbdlrYtyrdJ
+EPDKjvbdhtzEvrVC
+EObkKvbddZyQYYqC
+DoDLKvbdhaoCdwRR
+EPCkKvbdxLWdHzyf
+DoDKjvbdySmhmRbH
+DnbkKvbdZLqcsmlN
+EObjjvbdZtJIxdTO
+DoDKjvbdDwwksssl
+EPDKjvbdFyVVAdXb
+DoCkKvbdUtNUFkvK
+EPDLKvbdxmsIXsIc
+EPDLKvbdUsmUFkuj
+EOcKjvbdGKdsDHlu
+EOcKjvbdACqwjZiQ
+EPDKjvbdFpASwHGZ
+DoCkKvbdGZUtaDxC
+DncKjvbdmSZVZsEJ
+DoCjjvbdJbicRKCx
+DncLKvbdTvMQJsaR
+DoCjjvbdNeDtJJKd
+EPCjjvbdnPzYvKxb
+DoDLKvbdyTNhlrCH
+EPDKjvbdRosgJecw
+EObkKvbdTAEiICOd
+EOcKjvbdapHHDkzd
+DoCkKvbdjlakzFGo
+DncLKvbdrpWPJbuf
+DnbjjvbdNQXqVnHT
+EOcLKvbdkNCLzFHP
+EObjjvbdTukpKTaR
+EOcLKvbdEuxpPlie
+EPCkKvbdJuuFdFHJ
+EPDKjvbdGGJqmiTq
+DnbjjvbdOAIrtJrA
+DnbjjvbdelfWgNKL
+EObkKvbdhbOcEwRR
+DncLKvbdqiAKFNPF
+DncKjvbdVqnYCFMD
+DoDLKvbdWHxWXgYz
+EOcLKvbdNVTSKmAX
+EPDKjvbduaDySndh
+DnbkKvbdiifIJlxS
+EPDKjvbdeATpmYJf
+DncLKvbduCcVWuoP
+EPCjjvbdhficYvJu
+DncKjvbdehLVqnQg
+EPCkKvbdrDeJPmua
+DoCjjvbdTfzmlWue
+DncKjvbdZoNiFEyj
+DoDLKvbdxmsHxSiD
+EObkKvbdVwJYVdFH
+EPCjjvbduMXwBUBX
+DnbkKvbdTqROuVIN
+EPCjjvbdGKeTCglu
+EPDLKvbdcyyPwxpb
+EPDLKvbdQmXayOUz
+EPDLKvbdZyDinCkr
+EPDLKvbdZoNheEyj
+DncLKvbdmfdxMnGy
+DnbkKvbdkClLRGuH
+DncLKvbdJXsbIMQp
+DnbjjvbdjJegilxS
+DoCkKvbdnPyxukZC
+EPDKjvbdZMRcsnLm
+DoCkKvbdHffzYxYH
+DnbkKvbdbsDLTcjB
+DoDLKvbdSwjlNzjx
+DncKjvbdkaMnmALA
+DncLKvbdqmZjZLhJ
+DoDKjvbdqrUkNkBN
+DncLKvbdmfeXmOGy
+EPCjjvbdZMRdTmlN
+DnbkKvbdypnlhjXA
+EPDLKvbdyOTHxTJD
+EObjjvbdMRwMzVQz
+EPCjjvbdSCDeMIxk
+EObjjvbdOXnuzdOU
+EPDKjvbdOStWHFVQ
+DoDLKvbdrzLpTAgn
+DnbkKvbdULuoAvPJ
+EPDKjvbdZxdKODMS
+EOcKjvbdbAvEfPpX
+DncKjvbdyOSgwriD
+EPDLKvbdrJAJdmPF
+EPDLKvbdauCGxKtI
+DncLKvbdqrVLOLAm
+EPDKjvbdkHgLfFmk
+DncKjvbdUaCRSqSZ
+DnbkKvbdbQGgELzd
+EOcKjvbdcJMijfXY
+EPCkKvbdeOeTLUTr
+EOcKjvbdQmYByNtz
+EPDLKvbdFxuVBDwb
+EOcKjvbdGGJrNiUR
+DoDKjvbddndsLTtS
+EOcLKvbddZyPxYqC
+EPCkKvbdSKxfVHLT
+EOcKjvbdSCDdkiYk
+DnbjjvbdtvNwjQsA
+EOcKjvbdJXsbILqQ
+EObjjvbdjcLkRHVH
+EObjjvbdkCkkQgUg
+DoCjjvbdTqQnttgm
+EPCkKvbdEuyPoljF
+DoCkKvbdTqQnuUgm
+DoDLKvbdLrWlzVQz
+EPCjjvbdRjyGVGkT
+DoDLKvbdHEKvKBjK
+DoCjjvbdnCJvxOnV
+EObkKvbdptUGrRkU
+EPDKjvbdQwNcblID
+DoCjjvbdIidAKPgE
+DoCjjvbdTYLMNzkY
+DnbjjvbdEztRFMCi
+EObkKvbdBhkCLJGK
+EPDLKvbdZisHpGbG
+EPDLKvbddePRbXDK
+EObkKvbdUQpntuIN
+EObjjvbdEPCjjvcE
+DncKjvbdbiNJjewY
+EPDLKvbdVrOYCElD
+EPCkKvbdSBdElIyL
+DoDLKvbdzjVQQETU
+DoCjjvbdCDpAvKNG
+EObkKvbdNHComPuL
+EOcKjvbdGdKvJaij
+DnbkKvbdqmZjYkgi
+DncKjvbdQvnEClID
+DncLKvbdWWiXudFH
+DoDLKvbdCEQBWJlf
+DncKjvbdMpXqWOGs
+EPDKjvbdVBCRSqRy
+EPDLKvbdqUTgSRjt
+EOcLKvbdJXtCHkqQ
+EObkKvbdBiLBkJFj
+EOcLKvbdVvhwvEEg
+EOcKjvbdCTBCsewS
+EOcKjvbdyNsHwriD
+DoDKjvbdwzHfFxEr
+DnbjjvbdypoMiJwA
+DoCjjvbdJbicQjCx
+EOcLKvbdVUMsekuj
+EOcKjvbdCEQBWJlf
+EObjjvbdIjEAKQGd
+DoCjjvbdDjIJvXjA
+DoDLKvbdFyUuAdYC
+DncLKvbdRotGiedX
+DoCjjvbdBhkBjhej
+EOcKjvbdBhkCKhfK
+EPCkKvbdLFfHbBRV
+DoCkKvbdNUrrLNAX
+EOcKjvbdZoOIeEzK
+EPCjjvbdkMbMZeHP
+DoCjjvbdkVwNdBxX
+EPCkKvbdNddThiKd
+DnbjjvbdjcLkQftg
+DnbkKvbdFkErcHmV
+DnbjjvbdqGEEtWAh
+DncKjvbdmSYuZsEJ
+DoCjjvbdUsmTfMWK
+DoCkKvbdVUMtFkvK
+EOcKjvbdKfGICBRV
+DnbkKvbdMSWlzUpz
+EOcLKvbdVBBprpqy
+EPCjjvbdnHEwmNgZ
+DoCkKvbdeEoRawDK
+DnbkKvbdpssgSSLU
+DncKjvbdOSsugFUp
+DnbkKvbdwzHfGYFS
+DoCjjvbdTAEiHbPE
+EObkKvbdKaLGmCXq
+DnbkKvbdCWzciFQW
+DncLKvbdnVVZjiqf
+EPCjjvbdOStWHEtp
+DoDKjvbdkIGkfFmk
+DoDKjvbdZjTIPfbG
+EOcKjvbdXsMAlsnx
+DnbjjvbdILazmwRL
+EOcKjvbdrDdiPmvB
+EPDKjvbdiUzEwRuC
+EOcKjvbdqAheAXHd
+EPCjjvbdRyigsCvA
+DoCjjvbdpyOggQcx
+EPCkKvbdZyDjNblS
+DncLKvbdFejSNiTq
+EPDKjvbdzRPNIjXA
+DncLKvbdaMkBsVMg
+EObkKvbdLYqJrzuG
+DncKjvbdsBfNMHLZ
+EPDKjvbdjgflFfOL
+DoDKjvbdCTAcUGWr
+DnbjjvbdSLZGVGkT
+DoCkKvbdZQmEhldq
+EPDKjvbdUsmTfMWK
+DoCjjvbdKefICBRV
+EPCjjvbdZMSDsnMN
+EObkKvbdwzIGGXdr
+EObjjvbdrRtjnLAm
+EPDKjvbdXrlAmTnx
+EPCjjvbdZtJJZETO
+DnbjjvbdieLGtoAO
+DnbkKvbdnCJvxPOV
+EPDKjvbdjKFgjNYS
+DoCkKvbdlhcspuRa
+EPDKjvbdbAvEfQPw
+EOcLKvbdiGjDYuiu
+DncKjvbdnQZxvLZC
+DoDLKvbdaogHDkzd
+DnbjjvbdMfcQMouL
+DncKjvbdKaKgMbYR
+DncKjvbdrbGNMHKy
+DoCkKvbddoFSjtUS
+EPDLKvbdNddTiIjd
+EPDKjvbdhgKDZViu
+EPDLKvbdkMbLzEfo
+DoDKjvbdjmCMZdfo
+DoDKjvbdSCDeLhyL
+DoCkKvbdQwODcMID
+DnbkKvbdgGLymgHA
+EPDKjvbdWIYVwfxz
+DnbkKvbdZLqdUNkm
+DoCkKvbdYlSETmkm
+DnbkKvbdLqvlyuQz
+DnbkKvbdZRMdiMdq
+EOcLKvbddePSCXCj
+EPDLKvbdRacdkiYk
+DnbjjvbdZisIQGbG
+EObjjvbdrpVnibvG
+DncLKvbdIxUCHlRQ
+EPCkKvbdhuZeXRtb
+DnbjjvbdQwODblID
+DoDKjvbdezuyEhsw
+DncKjvbdiLddNtcZ
+EPCkKvbdiLeENtby
+DnbjjvbdxKvcgzzG
+EPDLKvbdRXNdClID
+DncLKvbdEKHjVwjA
+EOcLKvbdzoPqFCkx
+DoDLKvbdliEURUqa
+DoCjjvbdyOTIYTJD
+DncLKvbdIHGyyXwg
+EPCjjvbdShyjRABM
+DoCkKvbdnPyyWLYb
+EObjjvbdsPvPJcVf
+EPDKjvbdTXjlNzjx
+DoDKjvbddneTLUUS
+EOcKjvbdmuUyjiqf
+DncKjvbdZoOIddzK
+DoCjjvbdpyOhGqEY
+DoCkKvbdwjwDgzyf
+DnbkKvbdxZgeexEr
+EOcLKvbdHDjvKCKK
+DoCkKvbdpxnhHQdY
+DoDLKvbdLrWlzUpz
+EPDKjvbdatbHXkTh
+DoDLKvbdZyDinDLr
+EPCjjvbdGGJqnJTq
+DoDKjvbddneTLTsr
+DncLKvbdyzdmqhJI
+EObkKvbdRjxfVGkT
+EPDKjvbdOAJTTirA
+EPCjjvbdZoNiFEzK
+DnbjjvbdOhAXyAYa
+DnbjjvbdACqwizIp
+DoDLKvbdcImJjevx
+EPDLKvbdxmrhYTIc
+DoDLKvbdjcLkRGuH
+EPCkKvbdxVNEpxlO
+EPCkKvbdKCibqJbx
+DoCkKvbdjJfIKMxS
+DoDLKvbdVYhUZjoO
+EPDLKvbdrJAKEmPF
+EOcLKvbdRDbaQRDr
+DoCkKvbduWOXiqTA
+DoCjjvbdZyDjNcLr
+EObjjvbdbBWEeoow
+EPDLKvbdUQpnttgm
+EOcKjvbdlBNOmALA
+DnbjjvbdSPsfiecw
+DnbjjvbdwzIGGYFS
+EOcKjvbdLGFgaaRV
+EOcKjvbdrXQLcJYq
+DnbkKvbdmbKXYPOV
+DoCkKvbdZisHogCG
+EPCkKvbdFVyPpMjF
+EOcKjvbdYkrDsmkm
+DoDKjvbdxUmEqYlO
+EPDKjvbdKNAEZgUa
+DoDLKvbdqZPIGpcx
+DoCjjvbdMgComPtk
+EObjjvbdUyHszKoO
+DoCkKvbdeEnqavcK
+EPDKjvbdqYoIGqEY
+DoDLKvbdCDoaWJmG
+EPDLKvbdlZSrTZHU
+EPCkKvbdZxcinDMS
+DoCkKvbdgFkzNfgA
+EOcKjvbdYNqAXtvU
+EObjjvbdwygefYEr
+EPCkKvbdbBVdfQQX
+DnbkKvbdqrVLOLAm
+EOcKjvbdFjeTDINV
+DnbjjvbdnHFYMnGy
+EPCjjvbdrbFllHKy
+EPCjjvbdZLrDtOMN
+EPDLKvbdcJNKKfWx
+DoCjjvbdraemMHLZ
+DoDKjvbdeJjSWUzn
+EPCkKvbdZnmiEdyj
+DnbjjvbdwtleQxlO
+DnbkKvbdDwwlUTtM
+DoDKjvbdrWpMDJZR
+EOcKjvbdegkVrORH
+EPCkKvbdiCOcFWqR
+DnbkKvbdBsBDTevr
+DoCjjvbdjcLjpfuH
+DnbjjvbdZxdKODLr
+DoCjjvbdqceIpOVa
+DoDLKvbdVvhxVceH
+EObkKvbdsrqryZdc
+DnbkKvbdMSWlytpz
+DoDLKvbdqTsfqrKt
+EPCjjvbdjKGIKNYS
+EOcLKvbdiGibxvKV
+EPCjjvbdKDKCpibx
+EPDKjvbdQdDBPqDr
+DncKjvbdozmdLYPA
+DoCkKvbdTvLojUAq
+DnbkKvbdbhmKLFwY
+EPDKjvbdCIjbLIej
+DncKjvbdkHfkeenL
+DoDKjvbdtAGqIABS
+EPCjjvbdRosfjFdX
+EOcKjvbdraemLgLZ
+DnbkKvbdxmrgxTIc
+DoCkKvbdOAJStJrA
+EPCjjvbdqYngfpdY
+EPDLKvbdBvzdJEov
+DoDKjvbdrDeIpOWB
+EObjjvbdqUTfrSKt
+EOcKjvbdxnShXsIc
+DoDKjvbdEzsqFLcJ
+EObjjvbdDxYMUUUM
+EOcKjvbdjKFhKNYS
+EOcKjvbdjgflGFmk
+DoCkKvbdGGKRnItR
+EPCkKvbdREDApRDr
+EOcLKvbdNQYRWOHT
+EPCjjvbdxmrgwriD
+DncLKvbdbsCjsdJa
+EOcKjvbdypoNIiwA
+DncKjvbdZoOJFEyj
+DoCjjvbdrbGMkgKy
+EPDKjvbdyTNiNSBg
+DoCjjvbdczZPwyQb
+DoDKjvbdWfZZtAOs
+EPDKjvbdznoqFClY
+DncKjvbdTlVoBVoJ
+EPCkKvbdIxUBhMRQ
+DoCkKvbdZQmEiNEq
+DoDKjvbdnVUykKRf
+DnbjjvbdUtMtFlWK
+EObjjvbdOTUVfeUp
+DoCjjvbdZMSEUOMN
+DoCjjvbdwjwDgzzG
+DoDKjvbdYqNEiNFR
+DoDLKvbdqiAKEmOe
+EPDLKvbdfNGXHNJk
+DnbjjvbdCEQBVjMf
+EObkKvbdqUUGrRjt
+DnbkKvbdjmCLyeHP
+DnbjjvbdcJMikFwY
+EPCjjvbdjuwNdBxX
+DoCkKvbdeqaWzkbo
+DncKjvbdTkvOaVoJ
+DoDKjvbdZoOIeEzK
+DoDLKvbdKDKDRKDY
+DncLKvbdqwQMDJYq
+EObkKvbdKeegbBRV
+EPDKjvbdegjuqnRH
+DoDKjvbdxwhjBpZk
+EObjjvbdziuQPdSt
+EPCjjvbdZyEKOCkr
+EPCjjvbdRWmdCkhD
+EOcLKvbdQcbaQRES
+DncLKvbdIrxaTNYM
+DnbjjvbdGFiqmiTq
+DoCjjvbdZeXfzghb
+DoCjjvbdSLZFuGkT
+EPDKjvbdIryBSmYM
+EOcLKvbdRyjHsCvA
+EPDKjvbdzoPqFCkx
+EPDLKvbdFeirOIsq
+EObkKvbdLiBkpxAS
+DoCjjvbdmuUyjirG
+EOcKjvbdpfDeTuaI
+DncLKvbdtSqsYyeD
+EOcLKvbdAMhYrwZx
+EOcKjvbdJSyAsNYM
+DncLKvbddneTLTsr
+EPDLKvbdANIYsWyx
+EObkKvbdRXODblHc
+DoCkKvbdYzcGRjWZ
+DoDLKvbdkHgLfFnL
+DoCkKvbdpyPIGqDx
+EObkKvbdwuNEpxkn
+DoDLKvbdJSxaTNYM
+DoDLKvbdRNXbZOUz
+DnbjjvbdNHDPlpUk
+EObjjvbdKQzFPFnF
+EOcKjvbdwkWdHzzG
+EObkKvbdiCPCdvpq
+EPCkKvbdwzHfFwdr
+DoDLKvbdwuMeQxkn
+DoDLKvbdmoyxujyC
+DncLKvbdyYJKBoyk
+EOcKjvbdhgJbxujV
+EOcKjvbdvAcySndh
+EPCjjvbdOYPVzcmt
+DncKjvbderBWzlCo
+DncLKvbdEuxoolie
+DoDLKvbdUsmTelVj
+DoCkKvbdcImKKfXY
+EPCkKvbdKDJcRJcY
+DoDLKvbdfILWSOQg
+DoDLKvbdtcDVWuno
+DoDKjvbdegjvSNpg
+DncKjvbdjvXOEBxX
+DncKjvbdvOszpjoU
+EOcLKvbdkIGkfFnL
+EPDKjvbdZxcinCkr
+EOcKjvbdNxPVzcnU
+DnbkKvbdNrsvHEtp
+DnbjjvbdwygefXeS
+EObkKvbdnHEwmOGy
+EObkKvbdZRNFIleR
+DoCjjvbdNHColotk
+EPDKjvbdTkuoBVni
+EObkKvbdkHgLfGNk
+DoCkKvbdVvhxWEEg
+EOcLKvbdtbcVWvOo
+DoDKjvbdULvOaWOi
+EObkKvbdNdcsiJLE
+DoDLKvbdOYPVzdNt
+DoCkKvbdNeDsiJLE
+EOcLKvbdXGYytAOs
+EOcKjvbdcIljLGWx
+DoDKjvbdIMBzmwQk
+EPDKjvbdbrcKscjB
+DoCjjvbdqdEhpOWB
+DnbjjvbdzoPqFClY
+DnbjjvbdKDKCqJcY
+EPDLKvbdZRNEhldq
+DncLKvbddZyQXyRC
+DncLKvbdRzKHrcWA
+EObkKvbdTAFIgbPE
+EObjjvbdwtmFRYkn
+DoDLKvbdCTAbtFwS
+EObjjvbdJzpFwdAN
+DoCjjvbdCTAbsevr
+EObjjvbdyzdmrIIh
+DnbkKvbdANIZTXZx
+EPCkKvbdVwJXvDeH
+DncKjvbdmfdwlnHZ
+DoCjjvbdZirhPfaf
+EPCkKvbdiHJcYvJu
+DnbjjvbdRMxCYmtz
+EPDLKvbdZHWdAPSi
+DnbjjvbdWSNxBdkc
+DoDKjvbdNxPVzdNt
+EObjjvbddePRawDK
+DncKjvbdaSGCgtGL
+DncKjvbddoFSjstS
+DnbjjvbdOFETiJLE
+DoDLKvbdeAUQmYJf
+EObjjvbdZshiZESn
+EPCjjvbdVwIwvEFH
+DnbkKvbdKDKDQjDY
+EPDLKvbdRbEFMJZL
+DoDKjvbdiZuGLpnG
+DoCjjvbdqGEEtWAh
+DnbjjvbdnBiwYPNu
+DnbjjvbdtlXwBTaX
+DoCjjvbdqYoHfqEY
+EPCkKvbdIsZArmXl
+DoDLKvbdmfeYNNgZ
+DoCkKvbdrafNLgKy
+DnbkKvbdYfwEAOsJ
+DoDLKvbdrEFIonWB
+EPCjjvbdRXODcMID
+EPCjjvbdZisIPfbG
+DncKjvbdoAKzshEO
+EOcLKvbdNQXqVmfs
+DnbkKvbddoEsKssr
+EPDKjvbdNeETiJLE
+EPCkKvbdVgwvXfxz
+EOcKjvbdIsZBTNXl
+EObkKvbdFeirOJUR
+EPCjjvbdVAbRSpqy
+DnbjjvbdeXyssqez
+EPDLKvbdZGwEAOri
+DoCkKvbdVAaqSqRy
+DoDLKvbdiVZeWrVC
+EPDKjvbdGYuUaDwb
+DncLKvbdLrXMyuQz
+EPDKjvbdGZUtaEXb
+EOcLKvbdzoQRFDLx
+EPCkKvbdTAFJICOd
+EPDKjvbdNPxRVmfs
+DoCjjvbdauBfxKsh
+DncLKvbdMIbLpxAS
+DoCkKvbdmgEwmNfy
+DoDLKvbdhanbdvqR
+DoCkKvbdSLYfUfjs
+DoCjjvbdTvMQJsaR
+DnbkKvbdlhcspuRa
+DnbjjvbdJSyBSlxM
+EPCjjvbdSLZFuHLT
+DoCkKvbdYTLaNUPY
+EObjjvbdFeiqnJUR
+EPDKjvbdYlRctNkm
+EOcKjvbdHDjvJaij
+DnbkKvbdnCJvwnnV
+DoCjjvbdNHDPlouL
+DncLKvbdWXIxWDdg
+DoCkKvbdJSyAsMwl
+EObkKvbdxmrhXriD
+DnbkKvbdJzpGYEAN
+EOcLKvbdddnqawDK
+EOcLKvbdhyuFkpnG
+DnbkKvbdtAHQhABS
+DoCjjvbdjhGlFemk
+DncLKvbdjJehJmXr
+EPDLKvbdHffyyXwg
+DoCkKvbdRbEFLiZL
+DoCjjvbddePSBwCj
+EPDKjvbdeOeTKtUS
+DnbjjvbdrDeIomvB
+DnbjjvbdVZIUZjoO
+EPDKjvbdxmsIYTIc
+EPCjjvbdDnbkLXDE
+DnbkKvbdYlSDtNlN
+EObkKvbdeFPSBvbj
+EPCkKvbdkDMKpgUg
+DoCkKvbdbKlGPODA
+EObjjvbdGdLVjCKK
+EPCkKvbdkCkjqGuH
+EOcLKvbdqYngfpcx
+EPDLKvbdeKJqvUzn
+DoCkKvbdkIHMGGOL
+DncKjvbdDoDKkXDE
+EPCkKvbdsCGNMHLZ
+EOcKjvbdyzeNqhJI
+DnbjjvbdqwQLbhxq
+EObjjvbdaaWEepPw
+EObjjvbdDxXktUTl
+DnbjjvbddwzTtRez
+DnbjjvbdKQyeOfNe
+EPDKjvbdbBVdepPw
+DncLKvbdfSAvzkbo
+DoDKjvbdqYoIHQcx
+DoCkKvbdeEnrBwCj
+DncKjvbdehLVqnRH
+EPDLKvbdhfjDYuiu
+EPCkKvbdvmWANEEm
+EPCkKvbdZRNEiNFR
+EOcLKvbdCSaCtGXS
+DoDKjvbdbhljKevx
+DoDKjvbdbBVdepQX
+DncLKvbdqTsfrSKt
+EPDKjvbdjEjgVPAO
+DoCjjvbdFeiqmiTq
+EObjjvbdcImJkGXY
+EObjjvbdJbjCqJcY
+DnbkKvbdjcLjpftg
+EPDLKvbdWXJYWEEg
+DoDKjvbdznpREbkx
+EObjjvbdfILVqmqH
+DnbkKvbdxwiKCQZk
+EPDLKvbdOEdUJIjd
+DnbkKvbdsCFmLgKy
+DncKjvbdijFhKMxS
+EPCjjvbdzitpQDrt
+EPCkKvbdZQleImEq
+DoDKjvbdZxdKNcLr
+DncKjvbdGdLVjCKK
+EOcKjvbdhzUfLpnG
+DncLKvbdwzHfGYEr
+EObjjvbdEObjjvcE
+EOcLKvbdfHkVqmpg
+DnbjjvbdXnRAXuVt
+EOcLKvbdeFOrBwDK
+EPCjjvbdzitoocsU
+EPDKjvbdZxdJmblS
+EObjjvbdFjeScHlu
+DoDKjvbdjhGkfFmk
+EOcLKvbduDDVXWPP
+EPDLKvbdJYUCHkpp
+EPCkKvbdkClKpgVH
+EObkKvbdJcKCqJbx
+DncKjvbdEXwlUTsl
+EObkKvbdxwiJbPzL
+DncLKvbdHDjujCKK
+DnbkKvbdEuyQQMie
+EPCkKvbdUaBpsRSZ
+EPCkKvbddoFTKstS
+EPCjjvbduaEYsOeI
+DoDLKvbdcTDKscjB
+DncLKvbdNdcshiKd
+DnbjjvbdWSOYCEkc
+EOcKjvbdZnmiEdzK
+EPDKjvbdUQpnttgm
+DoCjjvbdnGdwmOGy
+DoCkKvbdZyDjNblS
+EOcKjvbdShyjRAAl
+DncKjvbdTkvOaWPJ
+DoDKjvbdOEcsiJKd
+DncKjvbdbVBfxKtI
+EPCkKvbdrafNLfjy
+DoDKjvbduaEZTOeI
+DncLKvbdGGKSNhtR
+EPCjjvbdnBjWxOmu
+EObkKvbdKefICBRV
+DncKjvbdZoNheFZj
+DnbkKvbdEOcKkWbd
+EPDKjvbdNGcPmQUk
+EObkKvbdaMjbStlg
+DnbkKvbdJYTbIMRQ
+DncLKvbdJXsahLpp
+DncKjvbddeOrBvbj
+DoDLKvbdJSyAsMwl
+EPCkKvbdZdwfzhJC
+DoCjjvbduDDVWuno
+DnbjjvbdEztQdkbi
+EOcLKvbdUyHsykOn
+EObjjvbdDjHivYKA
+DoDLKvbdnUtzLKSG
+DncLKvbdSLZFuGkT
+DoDKjvbdlYrrTZGt
+EOcLKvbdqUUGqrKt
+EPDLKvbdEPCjjvcE
+EPDKjvbddxZtTrFz
+EObkKvbdlYrqrxgU
+DoCjjvbdauCGwjtI
+DnbjjvbdQZNAHTRj
+DoDKjvbdMoxRVmfs
+DncLKvbdOTTvGeUp
+DncKjvbdcJNKKewY
+DoDKjvbdmuVZjjSG
+EPDKjvbdUWLpKUAq
+EOcLKvbdSLZGVGjs
+EObjjvbdCIjakJGK
+EPDLKvbdZnmhddyj
+EOcKjvbdLBKgMaxR
+EOcLKvbdDjHjVwjA
+DnbkKvbdYlRcsnLm
+DoCjjvbdrRuKnKaN
+EPCkKvbdptUHSSLU
+DncLKvbdYpmEiNFR
+EObkKvbdMIalQxAS
+DnbjjvbdJuteceHJ
+DncLKvbdFWYpPlie
+EPCkKvbdmgFYMmgZ
+DoCjjvbdmbJvxOnV
+DncKjvbdIGfzZYXg
+EPDLKvbdqTtGqrLU
+EPCjjvbdWRmwbElD
+EPDLKvbdGLErcIMu
+EPDLKvbdwygefYEr
+EPDKjvbdrSUkOLBN
+DoCkKvbdNQYQumfs
+DoCkKvbdRjyGVGjs
+EPDKjvbdmajXXoOV
+DncKjvbdIGgZxwwg
+DnbkKvbdxwiJapZk
+DoDKjvbdYqMdhleR
+EOcLKvbdZtJIxdSn
+EPDLKvbdTIzKRABM
+EPDKjvbdCEPaWJlf
+EOcLKvbdjgflFfOL
+EPCjjvbdZjShQGbG
+DoDLKvbdHDjvJbKK
+EOcLKvbdBiKbLIfK
+DncLKvbdiHJbxujV
+EObkKvbdKeehBaQu
+EPDLKvbdYSlBMsnx
+EObkKvbdmJDsptrB
+DoDKjvbdTkuoAvPJ
+EPDKjvbdZyEJnDLr
+EPCkKvbdZoNhddyj
+EPDKjvbdVZHsykOn
+DnbkKvbdjJegjNYS
+DoDLKvbdtcCtwVno
+EOcKjvbdkIHLefOL
+EOcKjvbdYkqdTnLm
+DnbkKvbdiZuGMQmf
+DoCjjvbdZLrDsnLm
+DoCjjvbdDwwktTsl
+EObjjvbdRzKHrbvA
+DoDKjvbdQlwaxnUz
+EObkKvbdyTOImRag
+EPCjjvbdQmYByOUz
+EObjjvbdbrbkUDjB
+DoDLKvbdGYtuAcwb
+DncLKvbdePFSjssr
+DoDKjvbdRbDdlIxk
+DoDKjvbdwzIGGXeS
+EPCjjvbdOTUVgEuQ
+EPCkKvbdemGWfmJk
+EOcLKvbdZQmEhmEq
+DoCjjvbdZRMeJNFR
+DoCjjvbdvBEZSoEh
+DncLKvbdhlFDnVDZ
+DoCjjvbdJJdAKPfd
+EObjjvbdyYJKCQZk
+EObjjvbdRzKITCvA
+EPCjjvbdUMVnaWPJ
+DoCjjvbdNddThhjd
+EOcKjvbdNPwpvOHT
+DnbjjvbdZisHpHCG
+EObkKvbdGLFScINV
+EOcLKvbdbsDLTdJa
+EObjjvbdbhlijfWx
+DoDLKvbdVZHszLPO
+EObjjvbdZnnJFEyj
+DoDKjvbdeOeSkTtS
+DoDLKvbdkCkjpgUg
+EPCjjvbdFejRnJUR
+DoCjjvbdZsiIyDrn
+DoDLKvbdtunYJqTA
+DnbkKvbdoznELXoA
+DoCjjvbdZtIiYcsO
+EOcLKvbdGGKSOJUR
+DoCjjvbdUMWPAuni
+DnbkKvbdEPDKkWbd
+EPCkKvbdUxhTzLPO
+DoDKjvbdGdKvKBij
+DncKjvbdmSZUzSci
+EPCjjvbdZjShQGaf
+DncLKvbdWRmxCElD
+EPDLKvbdqvpMDIyR
+DncKjvbdCJKakIfK
+EPDKjvbdHELWJbKK
+DoDKjvbdjlbLzFGo
+EPCjjvbdTkvPBWOi
+DoCkKvbdJvVGEFGi
+EOcLKvbdUyHszLPO
+EObjjvbdVBBpsQqy
+DnbkKvbdZdxGzhIb
+DnbjjvbdsPvOicVf
+DoDKjvbdtcCtwWPP
+EOcLKvbdwtmFRYkn
+EPDKjvbdegjvSNqH
+DoDKjvbdIxUBglQp
+EOcLKvbdBcpAvKNG
+DnbjjvbdwXMAvAvV
+DnbkKvbddoEsLUUS
+DncKjvbdCIkCKiGK
+DoDKjvbdlZTSTYft
+EPCjjvbddoEsKtTr
+EObjjvbdFfJrOJTq
+EPDLKvbdliDsqVSB
+DncLKvbdbUagXjtI
+EObkKvbdIsYaSlxM
+EPCjjvbdHkaznXRL
+DnbkKvbdxUmFQyMO
+DoCjjvbdWWiXvDdg
+EPCjjvbdSQUHKFcw
+EPDLKvbdjKGIJlwr
+EOcKjvbdXFxytAOs
+DncKjvbdmbKWwoNu
+EObjjvbdiZuFkpmf
+DoCjjvbdFyVVBDwb
+DnbjjvbdeqaWzlDP
+EPCjjvbdRyjHsDWA
+DnbkKvbdqlzJyMHi
+DnbkKvbdZRNFImFR
+DoCkKvbdYfwEAPSi
+DoCjjvbdOAIrsjSA
+EPCkKvbdaNLCTVMg
+DnbjjvbdqceIomvB
+DnbjjvbdsCFlkgLZ
+DoDLKvbdmIdURUqa
+EOcKjvbdZshhxcrn
+DoDKjvbdZjTIPgCG
+DncKjvbdemGWfmJk
+DnbjjvbdACqxKZiQ
+EObkKvbdkVvnEBxX
+DncLKvbdUtNTfMWK
+EPDLKvbduaDxsPFI
+EObkKvbdgQBzvcxI
+EObkKvbdSZihTDWA
+EOcLKvbdqYnggREY
+EPDKjvbdqiAJdmPF
+EOcLKvbdiGjDZVjV
+EOcLKvbdGZVVAdXb
+DoDKjvbdhfjCxuiu
+DnbkKvbduMYXBTaX
+DoCkKvbdjSziTKiz
+DoDKjvbdqlzKZMIJ
+DnbjjvbdkVwOEBxX
+DoCjjvbddtAUASmW
+DoDLKvbdzjVQQESt
+EOcLKvbdkySrSyHU
+DncLKvbdNGbolotk
+DnbjjvbddeOrBwCj
+DoDLKvbdiLdcmuDZ
+DoDKjvbdSPsfjFdX
+DoCkKvbdbUafxKtI
+DnbkKvbdcJNJkFvx
+EObjjvbdFejSNiUR
+EPDKjvbdQmYCYmtz
+DncKjvbdfVzwpJzs
+EPDKjvbdWRmwbEkc
+DncLKvbdFkEsDIMu
+DoCjjvbdQccBPqES
+EObkKvbdKCibpjCx
+EOcKjvbdLBLHNBwq
+DoCkKvbdUMWOaVoJ
+DoCjjvbdrbFmMGjy
+EOcLKvbdJvVFdEgJ
+EPCkKvbdjhHMGFnL
+DncKjvbdNxOuzcmt
+EPDKjvbdEXxLstUM
+DoDKjvbdwygfGXeS
+EObkKvbdyTNiMrBg
+DncKjvbdlZSrSxgU
+EPDKjvbdJXtCHlQp
+EPCkKvbddndsLTsr
+EObjjvbdNdcshhkE
+DncLKvbdSCDeLhyL
+DncLKvbdNsTvHEuQ
+EOcKjvbdACqxKZiQ
+DoCjjvbdptTgRqjt
+EPDKjvbdOEdTiJLE
+DoDKjvbdrpVoKCvG
+DnbjjvbdFjeSbhNV
+EPCjjvbdNGbolouL
+EPDLKvbdrEFIonVa
+DnbkKvbdOFDsiIjd
+DoCkKvbdTqQoUuIN
+EPDKjvbdeOdsKtTr
+DncKjvbdyNrhXsIc
+EPDKjvbdnQZxujyC
+EPCkKvbdYqMdhmFR
+DncLKvbddeOrBvbj
+DoCjjvbdLGFgbApu
+DoCjjvbdemFwHMik
+DoCkKvbdRXOEClHc
+DoCkKvbdZQmEiNFR
+EPCjjvbdEASIlzXX
+DnbkKvbdrWokbiZR
+EObkKvbdHELWKBij
+DnbkKvbdbUagXkUI
+EOcKjvbdbsDLUDia
+EOcLKvbdUWLojUAq
+DnbjjvbdQvmccMID
+DoDKjvbdZxcjODMS
+EPDKjvbdTulPjUBR
+DncLKvbdjSzhsKiz
+EOcKjvbdTAFJICOd
+DnbkKvbdKNADzHVB
+DoCjjvbdliDtRVSB
+EObjjvbdWXIxVceH
+EPCjjvbdfHkWRnQg
+EObkKvbdjAQGaPgK
+EObkKvbdkClLRGuH
+DncLKvbdZnnIdeZj
+EObjjvbdlYsRsYgU
+DoDLKvbdpyPHgQcx
+DnbjjvbdnPyyWKyC
+EObjjvbdQwNcblID
+DnbjjvbdCJKajhfK
+EPDKjvbdiHKCyWKV
+EObjjvbdeEoRavbj
+EOcKjvbdmaivwnnV
+EOcKjvbdwNWANDeN
+EPDKjvbdTAFIhCPE
+DoCjjvbdZQleJMeR
+EPDKjvbdmtuZjiqf
+DnbkKvbdEPCkLXCd
+EObkKvbdqGEEsvBI
+EOcKjvbdmIdTqVSB
+EObjjvbdJTZBSlwl
+EPCjjvbdqlzKZMIJ
+EPDKjvbduCbtwWOo
+EPDLKvbdnPzYukYb
+EPDKjvbdeFPSBvbj
+EPDLKvbdHEKvKCJj
+EPDKjvbdVUNUGLuj
+EOcLKvbdJuuGEEgJ
+EOcKjvbdzQnmJKXA
+EOcLKvbdrbGMkfjy
+DnbjjvbdUsltFkuj
+DnbkKvbdDxYMUUUM
+DnbjjvbdUQpoUuHm
+EPDKjvbdRbDdlJZL
+DncLKvbdmgFXlmfy
+EPCjjvbdJbibqJcY
+DoCjjvbdEPDLLWcE
+DoDLKvbdMJCMRYAS
+DoCkKvbdQZNAGsSK
+EObjjvbdiCPDFXQq
+EOcLKvbdVwJXvEEg
+DoDLKvbdsrqsYzFD
+DncLKvbdjuvnDbXw
+EPDKjvbdhgKCyWKV
+DoDLKvbdNdctIiKd
+EObkKvbduaEYrneI
+DoCkKvbdNVSrKmAX
+DncKjvbdXnRAXtvU
+DoDKjvbdhkddNtcZ
+DoCkKvbdiBnbdwQq
+DnbkKvbdLBLGlawq
+DoDKjvbdygZMANEw
+DnbkKvbdZsiIxcsO
+EObjjvbdiBoDEwRR
+DoCjjvbdHbLzEzAD
+EPCkKvbdjbkkQgVH
+EOcLKvbdsBemLgLZ
+EOcLKvbdptUGrRkU
+EPCjjvbdznpQdbkx
+DoDKjvbdGYtuAdXb
+EOcKjvbdzjUpQETU
+EOcLKvbdypoNIjXA
+DnbkKvbdSQUHJfDw
+EPCkKvbdbsCjtEKB
+DoDLKvbdajlFoODA
+DoDKjvbdelevfmKL
+DnbkKvbdCTAbsfWr
+DoDKjvbdjhGlGGNk
+DoCkKvbddCTMrATm
+EPDLKvbdaMjbSuMg
+DoCkKvbdKaLHNCYR
+DncLKvbdGGKSNiTq
+DoCjjvbdLZRJrztf
+EPDLKvbdjlakyeGo
+EObkKvbdwuMdpyLn
+DnbkKvbdegjuqnQg
+EPDKjvbdtTSTYydc
+EObkKvbdZyDjOClS
+DnbkKvbdqGEEtWAh
+EOcLKvbdKQydoFnF
+EPDLKvbdqUTgSSKt
+DnbjjvbdMJCMQxAS
+EPCkKvbdiMFDnUby
+EOcKjvbdfpBzwEXh
+DoCkKvbdSBceMIxk
+EObjjvbdfMevgMik
+EPCjjvbdjAQHAofj
+EPCjjvbdZLrETnMN
+EObkKvbdDoDLLXCd
+DncLKvbdSZjHsDWA
+DnbjjvbdOStVgFVQ
+EObkKvbdbhlijfXY
+DnbkKvbdjEjftoAO
+DoCjjvbdeEnrCXDK
+EOcLKvbdZyEKNcMS
+EPDKjvbdWSNwadkc
+EPCjjvbdkDLjqHUg
+DoCkKvbdSCEFLiYk
+DncKjvbdtkwwBTaX
+EPDKjvbdCTAbsevr
+DncLKvbdmfdwlnGy
+DncLKvbdTukpJtBR
+DoCjjvbdlYrrTZGt
+EOcKjvbdnCKWwoOV
+DncKjvbdMgColpVL
+EPDLKvbddwytURez
+DoCkKvbdakLenmcA
+EPCkKvbdQvmdCkhD
+DncLKvbdEARhlzWw
+EOcLKvbdrXQMDJYq
+EObkKvbdmJETptrB
+EOcKjvbdAMgxsXZx
+EPDKjvbdULvPBVni
+DoDKjvbdqGEFTvAh
+DoDKjvbdGLFTChMu
+DoCjjvbdLBKgNCXq
+DoCjjvbdOEcsiJLE
+EObjjvbdSLZFuHKs
+DoCjjvbdtkxXAsaX
+DnbjjvbdNGbpNQVL
+EOcLKvbdiLeEOUby
+EObjjvbdDoCjjwDE
+EPCkKvbdxrnJMrCH
+EPDKjvbdJTZBTMwl
+DncKjvbdBcpBWJlf
+DncLKvbdGKdsDHmV
+DncLKvbdDwwlUUTl
+EPDLKvbdbQHHELzd
+EPDLKvbdYlSEUOLm
+EObjjvbdhtyeXSUb
+EPCjjvbdACqxKZiQ
+EObjjvbdrDdiPmua
+EPCkKvbdcyxpYYqC
+EPDKjvbdrXQLbiZR
+DncKjvbdjmBlZeHP
+DncKjvbdlYrrTYft
+EObkKvbdaaWFFpPw
+DncKjvbdwyhGFwdr
+EPCkKvbduLxXAtBX
+EObjjvbdhancEvpq
+DncLKvbdbiMjKevx
+DncKjvbdTIyjRABM
+DoCkKvbdcImKLFvx
+DnbkKvbdZjSgpHBf
+EPCkKvbdGdKvJbJj
+EOcLKvbdSCDeMIyL
+EOcKjvbdZxdJnClS
+EOcLKvbdHDkVibJj
+DoDKjvbdezuxeJTw
+EOcKjvbdqFceUVaI
+EPDKjvbdWIYWXfxz
+DoDKjvbdNQXqWOHT
+DnbkKvbdOStWHEtp
+EPDKjvbdLAkGmBxR
+EPDKjvbdDxXksssl
+EPCkKvbdTqRPVUgm
+DoDLKvbdrDdhomvB
+DncLKvbdptUGrSKt
+EOcKjvbdiBnbeWqR
+DoDKjvbdezvYeJUX
+DnbkKvbdOAJStJrA
+DnbjjvbdtcCuWvPP
+DnbjjvbdIjEAKPgE
+EObkKvbdWWiXvEEg
+DnbkKvbdSBdFMJYk
+EOcKjvbdQdCaQQcr
+EPDLKvbdLZRKSzuG
+DoCkKvbdpfEFTuaI
+DnbkKvbdVBBqSqRy
+DncLKvbdMoxRVnGs
+EOcLKvbduoTzqKnt
+DoCjjvbdxxJKCPyk
+DncLKvbdVvhwvEFH
+EPDLKvbdOYPVzcnU
+EOcLKvbdBdPaWJlf
+DnbkKvbdJSyAsMwl
+DoCkKvbdYTLaMsnx
+EOcKjvbdUWLpJsaR
+DoCjjvbdhbOcEwRR
+DncKjvbdKfGHbAqV
+DoCjjvbdlZTSSyGt
+DncLKvbdatbGxLTh
+EPDLKvbdiGicYvKV
+EOcLKvbdTIyjRAAl
+EPDKjvbdZsiIyDsO
+DnbjjvbdZLqcsmlN
+EOcLKvbdeOeTLTtS
+DncKjvbdQdCaPqDr
+EPCjjvbdUGznLvvF
+EObkKvbdrDdhpNvB
+EPDLKvbdRadFLhxk
+DnbjjvbdhytelQmf
+EPDKjvbdFkFSbhNV
+DoDKjvbdaSGDHsek
+EObkKvbdzHYlAMdw
+DnbjjvbdliDsptrB
+EPCkKvbdYlSDtNlN
+DoDKjvbdnPyxujxb
+EObjjvbdRkYfVGjs
+EPCjjvbdRaceMJZL
+EOcLKvbdnUuZkJrG
+DncKjvbdOYOuzdNt
+DoCkKvbdJbjDQicY
+DnbjjvbdRyjHsCvA
+EOcLKvbdUGzmlXVe
+EPCjjvbdMoxRWOGs
+DncKjvbdlrZUzTEJ
+DoCjjvbdJYUBgkpp
+EOcLKvbdACrXizJQ
+EPDKjvbdsCGMkfkZ
+DncKjvbdqYnhGqEY
+DncLKvbdjgflFemk
+DncKjvbdrzMQTAgn
+DoCjjvbdlZTSSxgU
+EPDLKvbdKCibqKCx
+EOcLKvbdmJDtQuSB
+DncLKvbdQcbaPqES
+DoCjjvbdOXoVzdNt
+EObkKvbdbsCjsdKB
+EPDKjvbdySmiMqbH
+DoCjjvbdrMzKZLhJ
+DncKjvbdtAGqIAAr
+EPCjjvbdEXxMTtUM
+EOcKjvbdVrOYBdkc
+DoDKjvbdzROlhiwA
+DncKjvbdqTtHRrLU
+DnbkKvbdiUzEwSUb
+DoCkKvbdZLqcsnMN
+DnbjjvbdUaBqTRRy
+DoDKjvbdRosgKGEX
+EObkKvbdShzKRABM
+DoDLKvbdqZOhHRDx
+EPDLKvbdiUzFWqtb
+DoCkKvbdZyEJmbkr
+DncKjvbdREDBPpdS
+EPCjjvbdMSWmZtpz
+EPDLKvbdTAEiHaoE
+DoDKjvbdNeETiIjd
+EOcLKvbdqdFJPmua
+DoCkKvbdRpTfjFcw
+DncLKvbdznoqEcMY
+DoCkKvbdFfJqmiUR
+EOcLKvbdSPsfifEX
+DnbjjvbdtunYJpsA
+EPDKjvbdqcdiQOVa
+DnbkKvbdeXyssrFz
+EPDLKvbdQYmAGrqj
+EObjjvbdegjuqmpg
+EOcLKvbdbLLenmcA
+EOcLKvbdpyPHgREY
+DoDKjvbdZRMdhmEq
+DncLKvbddZxoxZRC
+EOcKjvbdKxpjSztf
+EPDKjvbdKkBHvAJy
+EObkKvbdnBiwYOnV
+EObkKvbdrWolDJYq
+DoCkKvbdZyEJmbkr
+DoDKjvbdkDMLRHUg
+EPCjjvbdQwNccMID
+DncKjvbdSZihSbvA
+DncLKvbdnHFXmNgZ
+DncKjvbdGKeSbhMu
+DncLKvbdULvPAuoJ
+EOcLKvbdYqNFJMeR
+DoDLKvbdMfcPmQVL
+EPDKjvbdFpATWgGZ
+EObjjvbdeqaWzkbo
+EOcKjvbdZoNhddzK
+EObjjvbdFeiqmiTq
+DoDKjvbdauBfwjsh
+EOcLKvbdBraDUFvr
+DoDLKvbdyYIjCPzL
+DnbjjvbdmRxuZsEJ
+EObjjvbdMfcQMpUk
+EOcKjvbdyNsIXrhc
+EPDKjvbdREDBPpcr
+EPCjjvbdRkYeuGkT
+EPCkKvbdtAHRIAAr
+DnbkKvbdxUmFQxkn
+EObkKvbdtTSTZZdc
+EOcKjvbdmIdUQtqa
+EOcKjvbdXrkaNUPY
+DoDKjvbdCWzdIePv
+DoDKjvbdbBVdfQPw
+EPCjjvbdZyEJmblS
+DncKjvbdlZTRrxft
+EPDLKvbdIxUCIMQp
+DnbjjvbdKyRKSztf
+EOcKjvbdNeEUIhjd
+EOcLKvbdjKGIJmXr
+DoDLKvbdCEPaVimG
+EPCkKvbdOFDsiIkE
+EOcLKvbdehKvSORH
+DoDKjvbdwWkaWAuu
+EPDKjvbdpxoHfpcx
+EPDKjvbdJbjCqJbx
+DncKjvbdZtJJZETO
+EPDLKvbdsZkpTBHn
+EPCkKvbdTlWPAuoJ
+DoCjjvbdjggMFfOL
+DoDKjvbdfMewGlik
+EPDLKvbdnBivwoOV
+DoCjjvbdwuNEpxkn
+DnbkKvbdiifIKNYS
+EOcKjvbdKVuFdFGi
+EPCjjvbdZdxGzgiC
+EOcLKvbduaDxsPEh
+EPCkKvbdRotHJfEX
+DncLKvbdCIjajhej
+DoCkKvbdcImJjfWx
+EOcLKvbdKVtecdgJ
+DoCjjvbdeFOrBwCj
+EPDKjvbdqvpLcIxq
+EObjjvbdEARiMyvw
+DncKjvbdbUafxLTh
+DncLKvbdLAkGmCYR
+DoDKjvbdxVMdqYkn
+EPDKjvbdWWiYWDdg
+EObkKvbdKDJbpjCx
+DoCkKvbdnPyxvKyC
+DoCkKvbdZsiJYcsO
+EObkKvbdJpzFOeme
+EOcLKvbdOSsufeUp
+DoDLKvbdTfznMWvF
+EPDLKvbdfNFwGlik
+EPDLKvbdCDpAuilf
+EPDKjvbdbiMikGWx
+DoCkKvbdrbGMkfjy
+DoCjjvbdWIXuxHYz
+EPDKjvbdGFiqnIsq
+EPDLKvbdNGbpMpVL
+EOcLKvbdtSrTYyeD
+DoDKjvbdjJfHjNXr
+EPCkKvbdzitpPcrt
+DoDLKvbdxmrgxSiD
+EPDLKvbdcJNKLFvx
+EPDLKvbdsrrSxydc
+DnbkKvbdqceIonWB
+EPCkKvbdZnnIddzK
+DoCjjvbdLYpirztf
+EPCjjvbdLrWlzUpz
+DnbjjvbdRkZGVGjs
+EObjjvbdnBivxOmu
+DoCjjvbdmIdUQuSB
+EObkKvbdtcCtvuoP
+DnbjjvbdANIYrvzY
+DncKjvbdmaivwoNu
+EOcLKvbdrouoJcWG
+DoDLKvbdTppoVVIN
+DoDLKvbdVUMtFkuj
+DncLKvbdznpQdblY
+DncKjvbdEPCkLXDE
+EOcLKvbdfHkVqmqH
+EPDKjvbdapGgDkzd
+EPCjjvbdSPsfifDw
+DoDLKvbdGKeTDINV
+EObjjvbdyqPNIjXA
+EPCjjvbdatbGwkUI
+DoCjjvbdCTAcTewS
+DnbjjvbdxnTIXsJD
+EOcKjvbdbKlFnnDA
+DncKjvbdjJegjNXr
+EObjjvbdMuTRkNAX
+EObkKvbdUxgsykOn
+DoCkKvbdRaceMIxk
+EPDLKvbdJbibpibx
+DoDKjvbdEztQdlCi
+EPDKjvbdcyyPwyRC
+DncKjvbdjlbMZdfo
+EPCkKvbdRXNdClID
+DncLKvbdtbbuXVoP
+DoDKjvbdieLHVPAO
+DoDKjvbdFVxopMie
+EObjjvbdzoPpdblY
+EPCjjvbdmIdUQuSB
+EPCkKvbdYkrEUNkm
+DoCkKvbdVwIxVdEg
+DoCjjvbdOSsvGdtp
+EPCjjvbdmSYtysDi
+EObkKvbdWWiYVceH
+DoDKjvbdrNZixkgi
+EPDKjvbdbVCHYKsh
+DnbkKvbdjKFgimXr
+EPDKjvbdNsUWHFUp
+EObkKvbdeAUQlwjG
+EOcKjvbdTAEiICPE
+DoCkKvbdZLqdUNkm
+EOcKjvbdZisHogCG
+EPCkKvbdKVtfEEgJ
+EObjjvbdaSGDIUGL
+EPDKjvbdZRNFIleR
+DoDKjvbdyXiJaoyk
+EObkKvbdRkYfVHKs
+DnbkKvbdLAkHNCXq
+DncKjvbdJpyePFnF
+EPCkKvbdkHgMFenL
+DoDLKvbdOFDtIhkE
+DoCkKvbdtTSTZZdc
+EOcLKvbdkClKpfuH
+DoCjjvbdBcpBVjNG
+DnbkKvbdfMfXHNJk
+DoDKjvbdBsBCtFvr
+DoCjjvbdHgGzYwwg
+DncLKvbdSwjkmzkY
+DoCkKvbdDihJuwjA
+EPDKjvbdQccBPpdS
+EPDKjvbdehLVqnQg
+DoCjjvbdmozZVkZC
+DoDLKvbdaNKasVNH
+EObkKvbdrRtkOLBN
+DoDKjvbdehLWRnRH
+EObkKvbdSCEEkiYk
+DoCjjvbdRXOEDMID
+EOcKjvbdFejRmiUR
+EOcLKvbdFkEsChNV
+DncKjvbdWWhwuceH
+EPCkKvbdNwoVzdOU
+EOcKjvbdePFSkUTr
+DoDKjvbdMRwMzUpz
+EObjjvbdLrXMzUpz
+EPDKjvbdZxdJnDLr
+EOcLKvbdrRtkNjaN
+EPCkKvbdTvLoitBR
+DncKjvbdKeehCApu
+EPDLKvbdemFvfljL
+DncLKvbdeFOqawCj
+DoDKjvbdZyEJnCkr
+DoCjjvbdlZTRsZHU
+DnbkKvbdRbDdlJZL
+DnbjjvbdYqMdiNFR
+EObjjvbdSQTfjFdX
+DoCjjvbdgFlZnGgA
+DoDLKvbdwtldqYkn
+EObkKvbdjggLfFmk
+DncLKvbdMgCpNPtk
+DncKjvbdmpZyWKxb
+EPDKjvbdVqnYBeMD
+DoDKjvbdULuoBWOi
+DncLKvbdezvZEiTw
+EPCkKvbdjblLRHUg
+EPCjjvbdBiKakJGK
+DncKjvbdTukpJtAq
+DoCkKvbdkWWnEBxX
+EPCjjvbdnPzYvLZC
+EOcLKvbdWHxVxGxz
+DncLKvbdNsUWHEtp
+EObkKvbdHDkWKBij
+EObkKvbdVAbQsQrZ
+DnbkKvbdKCibqKDY
+EObjjvbdLYqKSztf
+DoCkKvbdZLrDtOMN
+EOcKjvbdemFvgNJk
+DncLKvbdiCOcEvpq
+DnbkKvbdEXxLtTtM
+EObkKvbdFjdrbglu
+EObkKvbdmttykJrG
+DoCjjvbdePFTLUTr
+DoCkKvbdWRmwadlD
+DoDLKvbdVqmxCElD
+EPCkKvbdnBiwXoOV
+DnbjjvbdEvZQPmKF
+EObkKvbdSKyGVGkT
+EPCjjvbdauBgXkTh
+EPCjjvbdVrNxBeLc
+EObjjvbdOEcshiLE
+DoDLKvbdbLMGPNcA
+DnbkKvbddZxpYYqC
+DoCkKvbdlZTSTZHU
+EObkKvbdtlXwBTaX
+EObkKvbdHffyxwxH
+EPDKjvbdrpWOicVf
+DncKjvbdkVvmdBww
+EPDKjvbduaDySoFI
+EObkKvbdsZkosBHn
+DoDLKvbdTAFJICOd
+DnbjjvbdpstHRrLU
+DncKjvbdUQqOtuIN
+EPDKjvbdVUMtFlWK
+DoDLKvbdrouoKDVf
+DoCjjvbdmRyUysDi
+EPDKjvbdgFkzNgHA
+DnbjjvbdZshiZDsO
+DnbjjvbdIMBzmwRL
+EObjjvbdZshhxdTO
+EOcLKvbdZGwEAOri
+EPCkKvbdkHflFfOL
+DoCkKvbdKDJcQibx
+EOcLKvbdFkEsCgmV
+EPCjjvbdJutfEEgJ
+DoCkKvbdOXnuzdNt
+EPDLKvbduLwwAtAw
+DoDKjvbdqvpLbiZR
+EPCjjvbdGYuVBEXb
+EOcLKvbdCJKajhfK
+DnbjjvbdkMbLyeGo
+EPCkKvbdijGIKMwr
+DoDLKvbdJzpGXdAN
+DoDKjvbdNwnuzdOU
+EOcLKvbdtSqsYyeD
+EOcLKvbdmRxuZrdJ
+EPDKjvbdhlEcmtcZ
+DoCkKvbdbiNJjevx
+DoDKjvbdGckVibJj
+DoDLKvbdGLFSbhMu
+EPDKjvbdEObjkWbd
+EObkKvbdBhkBjiGK
+EPDKjvbdtAGqIAAr
+DoCkKvbdWRmwadkc
+EObjjvbdQdDAoqDr
+EOcLKvbdwNWANDeN
+EPCjjvbdMowqVmgT
+EPDLKvbdegkWSNpg
+EPDLKvbdjAQHAogK
+DoDLKvbdvwLaVaWV
+EPCjjvbdLGFgbBQu
+DoCjjvbdxsOJMrCH
+EObkKvbdFkFTChMu
+EObjjvbdbLLenmcA
+EPDLKvbdiCObeXRR
+EPCjjvbdhbObdvpq
+EObkKvbdVZIUZkOn
+EPDLKvbdfVzxPizs
+EPDKjvbdnPyyVjyC
+DncLKvbdRzKITCvA
+EOcLKvbdUtMsfLuj
+DncKjvbdVBBpsRRy
+DnbkKvbdzeZnzdzQ
+EOcLKvbdUtNTfMVj
+EObjjvbdqcdiQOWB
+DoCkKvbdNddTiIjd
+DncLKvbdrykosBHn
+EPDKjvbdWRnYBeLc
+DncLKvbdrXQLcIxq
+EPCkKvbdUWLpKTaR
+DoCkKvbdZRNFJMeR
+EPDLKvbdunszpjoU
+DoDKjvbdzitpPdSt
+EObkKvbdvBDxrneI
+DoDLKvbdVviXvDeH
+EPCkKvbdDihJuxKA
+EPCkKvbdNPxQunGs
+DoCjjvbdmuUzKjRf
+DnbkKvbdbPffdLzd
+DoDLKvbdXrlBNTnx
+DoDKjvbdZQmEhmFR
+EObjjvbdmttzLKRf
+DoCkKvbddijRvUzn
+EPDLKvbdHffyyYXg
+EPCkKvbdcTDKtEJa
+EPCkKvbdpecdtWAh
+DncKjvbdRjxeuGkT
+EPCjjvbdqdEhpOVa
+EPCjjvbdelfXGmJk
+EObkKvbdWWhwudFH
+EPDKjvbdhbObeXQq
+DoCkKvbdffLynHHA
+DnbjjvbdpaJFAXIE
+DoDKjvbdqZPIGpcx
+DoDLKvbdmaivxPOV
+DncKjvbdqFdEsvAh
+EPCjjvbdrpWOibvG
+EPCkKvbdyfyMAMdw
+DoDLKvbdhuZdvqtb
+DncLKvbdWRnYBeMD
+DncLKvbdDncLKvbd
+EObkKvbdhzUfLpnG
+EOcLKvbddoFSkTtS
+EPDKjvbdbKlFoODA
+DoCkKvbdRWmccLhD
+EObjjvbdeAUQlxJf
+DncLKvbdKVuGEEfi
+EObkKvbdVvhwvEEg
+EPDLKvbdhaoDEvqR
+EPDKjvbdpfEFTvBI
+EPCkKvbdyzeNrIJI
+DoDLKvbdGckViaij
+EObjjvbdnHExNNfy
+EObkKvbdZLqdUOLm
+DoDLKvbdDxXktTsl
+EObkKvbdFVxpPmKF
+DoDKjvbdNdctJJLE
+DnbkKvbdTXkMNzjx
+DncKjvbdbrbkUEKB
+DoCkKvbdGKeSbhNV
+EPDKjvbdYSkaMtOx
+EPCjjvbdiGicYujV
+EObjjvbdnHFXmOGy
+DoDKjvbdZyDjNblS
+EOcLKvbdGYtuBEXb
+DnbjjvbdqGDeUWAh
+DnbkKvbdTppnuVHm
+EOcLKvbdPyNAGsRj
+EPCkKvbdIrxaSlxM
+DncKjvbdCfkfHAzc
+DnbkKvbdIHHZxxXg
+EPCjjvbdjKFhKMxS
+EOcKjvbdehKvRnRH
+EObjjvbdxVMdpyMO
+DnbjjvbdSLYetgKs
+EObkKvbdRjyGUfkT
+DoCjjvbdwyhFeweS
+DncLKvbdrJAKElne
+EPCjjvbdiGjCxvKV
+EPCjjvbdCIjajiFj
+DoDLKvbdunszqLPU
+DnbjjvbdySmhlrCH
+DnbkKvbdnBjWxPNu
+DoDKjvbdlhdTqUrB
+DoCjjvbdGdKvJajK
+EObjjvbdkySqryHU
+EPCjjvbdYkqdTmkm
+EObkKvbdDnbjkXDE
+EPDKjvbdKDKCqKDY
+EOcLKvbdeYZstSFz
+EPDKjvbdZyDjNbkr
+DncLKvbdPyNAGrrK
+DoCkKvbdTlVoAuni
+DncKjvbdEPCkKvbd
+EPCkKvbdcTCkTcjB
+DnbkKvbdcJNKLGXY
+DnbjjvbdRkYfVHKs
+DoDLKvbdaaWEfQQX
+EPDKjvbdmbJvwnmu
+EOcLKvbdZyDimcMS
+DoDLKvbdYkrEUNkm
+DoDKjvbdmaivwnmu
+DoDLKvbdqYoIHQcx
+EPDKjvbdLrWlyuQz
+DncLKvbdkCkkQgVH
+EObjjvbdrXPlChyR
+DoCjjvbdJTYaTMwl
+EPCkKvbdNsTvHFVQ
+DnbjjvbdeEnqavcK
+EPCjjvbdVvhwuceH
+EPCkKvbdbLMFoODA
+EPDLKvbdCIkCLIfK
+DoDLKvbdbLLennDA
+DncLKvbdyNrhYTIc
+EPDLKvbdNHCpNQUk
+DnbkKvbddndsLUTr
+DncKjvbdaogHDkzd
+EPDLKvbdZjSgpGbG
+DnbjjvbdaSGDIUGL
+EPCkKvbdjhGlFfNk
+EPDLKvbdbKkenmcA
+EOcKjvbdIHHZyXxH
+DoCjjvbdiUydwRtb
+EPDLKvbdauBgYKtI
+EPDLKvbdZMSDsmlN
+DoDKjvbddneSjtTr
+EPCjjvbdJbibqJbx
+DnbjjvbdGYtuAcwb
+DoDLKvbdsQVoJbvG
+DoCkKvbdxmrhXsIc
+DoCjjvbdyNsHwsJD
+DoCkKvbdKWVFceGi
+DoDLKvbdsBfNMGkZ
+DnbkKvbdJzoewdAN
+EPDKjvbdwzHefYFS
+DnbjjvbdBiKbKhej
+EOcKjvbdjuvmdCXw
+EOcKjvbdbhmKKevx
+DoCjjvbdehLWRmpg
+EPCjjvbdACrYJzJQ
+EOcKjvbdhuZeXSUb
+DoCkKvbdJcJbqJcY
+EPDKjvbdYqMeJNEq
+DncLKvbdmJDtRUqa
+EPDKjvbdnBjWxOnV
+DoDLKvbdOEctJIkE
+DoCjjvbdDxYLtTtM
+EOcLKvbdZnnJFFZj
+EOcKjvbdKRZeOfNe
+DoCjjvbdTukpJtAq
+DoDKjvbdhyuGLpnG
+DoDKjvbdhtzFWrUb
+DnbkKvbdQccBQRDr
+EPCjjvbdTukojUBR
+EPDKjvbdeKKRvUzn
+EOcLKvbdeXzTtSFz
+DncKjvbdyTOJNSCH
+EObkKvbdjmBkydfo
+EPCjjvbdelevflik
+DoDKjvbdZtJIxcrn
+DoDKjvbdqiAJeNOe
+DoCjjvbdddnqavbj
+DoCjjvbdZLrDtOMN
+EPDKjvbdZyEKNcLr
+EObkKvbdMgDPmQVL
+EPCjjvbdxrmiMrBg
+EObjjvbdZGvdAPSi
+EPCkKvbdvvkaWBWV
+DncKjvbdfMewHNJk
+DoCjjvbdlrYtyrdJ
+DncLKvbdiLeDnVCy
+DnbjjvbdvwLaWBWV
+EOcLKvbdVBCRSprZ
+DoDLKvbdYzbfSKVy
+DnbkKvbdXrlBNUPY
+EObjjvbdKfFhCAqV
+DoCkKvbdVTmTekvK
+EPDLKvbdaSGChTfL
+DncLKvbdauCGwjsh
+EObjjvbdBcpBWJlf
+DnbjjvbdZjTIQHCG
+DoCkKvbdDjHiuxKA
+EObkKvbdZxdKNblS
+DoDLKvbdptTfrRjt
+DoDLKvbdJbjCqKDY
+EOcKjvbdEJhKWYKA
+DnbkKvbdssSSyZeD
+EOcLKvbdZshhyESn
+EPDKjvbdRjxfUgKs
+DncKjvbdwygefYEr
+EPCkKvbdiLeEOVCy
+DnbkKvbdTvLojTaR
+DoCkKvbdzdzOzdyp
+EPDKjvbdVUNUGMWK
+EObjjvbdqdEhonVa
+EPDKjvbdKefHbAqV
+DncKjvbdtSqsYzFD
+DoDLKvbdZjTIPgBf
+EPCkKvbdRjyFuHLT
+EOcKjvbdUtMsfLvK
+DoCjjvbdnHEwlnGy
+DnbjjvbdURQnttgm
+DoCkKvbdFfJrOIsq
+DoDLKvbdjKGIKMwr
+EOcKjvbdTAEiIBnd
+EPDLKvbdFxttaEXb
+DoDKjvbdJTZAsNYM
+EPCkKvbdFejSNhtR
+EPDKjvbdwkXEHzyf
+DnbjjvbdbUafxLTh
+DoCkKvbdZQleJNEq
+EPCjjvbdmpZyVkZC
+DnbjjvbdmJEUQuRa
+EObkKvbdrEFIpNua
+EOcLKvbdJpzEnfNe
+DnbjjvbdyTNiMqag
+EObjjvbdNQYQvOHT
+EPDKjvbdGKdrbgmV
+EOcLKvbdCJKakIej
+DncLKvbdlhcsptrB
+DnbjjvbdZirhPfaf
+DncKjvbdZoNiFFZj
+EOcLKvbdjuwNcaww
+EOcKjvbdUyITzLPO
+DnbjjvbdxVMdpyLn
+EObjjvbdnCJwXnnV
+EPCjjvbdIMBznWqL
+EObkKvbdJpzFOenF
+EObjjvbdlhdTpuRa
+DncLKvbdSCDdkiZL
+EObjjvbdZxcimcMS
+EOcKjvbdxVMdqZLn
+DoCkKvbdrJAKFMne
+EObjjvbdXsMAmUPY
+EObjjvbdeFOqbWbj
+DncKjvbdCTBCsfWr
+DoCjjvbdRyjHsCvA
+EPDKjvbdziuQQDrt
+EOcLKvbdziuPocrt
+EPCkKvbdWWhwvEEg
+EPCkKvbdeEoRavcK
+EPCjjvbdSKyFuGkT
+EPCjjvbdrEFIonWB
+EObjjvbdrEFIpOVa
+DncKjvbdzGyMANEw
+EPDKjvbdrRtjmjaN
+DoCkKvbdJbjDRKDY
+EObkKvbdfNFvgNKL
+DnbkKvbdZHWdAPTJ
+EPCjjvbdCDoaWKMf
+DncLKvbdJKEAKPgE
+DnbjjvbdssSTYydc
+EOcKjvbdIsYaTNYM
+EPCkKvbdgPazvcxI
+DoCjjvbdmozYvLYb
+DnbkKvbdeATqNYKG
+EObjjvbdIwsbIMQp
+EPDLKvbdpssfrSKt
+EPCkKvbdhzUfLpmf
+EOcKjvbdNGcPlpUk
+DncLKvbdhkeEOVDZ
+EPDKjvbdLFfIBaRV
+EPCkKvbdJuuGEFGi
+EOcKjvbdRacdlJYk
+EPCjjvbdmbKWxOmu
+EPDLKvbdwtmFQxkn
+DnbjjvbdgvyAzzAJ
+EPDKjvbdNrsugFVQ
+DncKjvbdmttzLKRf
+DnbkKvbdZyEKNcLr
+EObkKvbdxrmiNRag
+DoDLKvbdiMFDnVCy
+EObjjvbdWSNxBdlD
+DnbkKvbdCTBDUFwS
+DoDKjvbdYTLaMtPY
+EOcLKvbdZtIiZDrn
+EObjjvbdYzcGSJvZ
+EObkKvbdCSaDUFvr
+DoCjjvbdTppnuUgm
+DoCkKvbdOTUVfduQ
+EOcLKvbdfpBzwDwh
+DncKjvbdGBPQyJzm
+EPCjjvbdVZITyjnn
+EObkKvbdVhXuxGxz
+EObjjvbdiifHimXr
+EPDKjvbdvwMAvAvV
+EOcKjvbdkWXODbYX
+DoDKjvbdmbKXXnnV
+DoDLKvbdZsiJZDrn
+DoCkKvbdlrZUzTDi
+DoDKjvbdSQTfjGEX
+EOcKjvbdqcdiPnWB
+EOcLKvbdpssgSSKt
+EPDLKvbdhkeENuCy
+EPDKjvbdZQmEhmEq
+DoDKjvbdZtJIxcrn
+DncLKvbdhgJbxujV
+DoCkKvbdDoDKkXCd
+EObkKvbdZGvdAOsJ
+EObkKvbdwjvdHzyf
+EPCjjvbdUQpoUuHm
+EPDKjvbdUGznMXVe
+DnbjjvbduaEYroFI
+DoDLKvbdehLWRnRH
+DoDLKvbdgQBzwEYI
+EObkKvbdbUagYKsh
+EObjjvbdyqPMhiwA
+EPDKjvbdvvkaWBWV
+DnbkKvbdJTYaTNYM
+DoDKjvbdZtIhxdSn
+EOcLKvbduaEZTOdh
+EObjjvbdkNCMZeGo
+EPCjjvbdZLqdTnLm
+DoCkKvbdUsltFkuj
+DncKjvbdnPyyVkZC
+DoDLKvbdwjvdHzzG
+EPCkKvbdGKdsCgmV
+DnbjjvbdiMFDmtby
+EObjjvbddneSjtUS
+DncLKvbdezvZFJUX
+EPCjjvbdhbOcFWqR
+DoCkKvbdaMjbTVMg
+DoDLKvbdHDjvKCJj
+EOcLKvbdpxoIHRDx
+DoDKjvbdZshhxcrn
+EOcLKvbdcJNKKewY
+EObjjvbdTppntuHm
+EPCjjvbdemGWfmJk
+DoCkKvbdjcLkQftg
+EObkKvbdQwODbkgc
+EPDLKvbdCTAcUFwS
+DnbjjvbdvOszpkPU
+EOcKjvbdkClLRHUg
+EOcLKvbdNHCpMpVL
+EObjjvbdZMRcsnMN
+DoCjjvbdpxnggQcx
+EOcKjvbdyTOJNRbH
+EPDKjvbdeKKRutzn
+DncKjvbdrzLosAgn
+EPDKjvbdYzcGRjWZ
+EPDKjvbdQcbaPpdS
+DnbkKvbdtkxXAsaX
+DncKjvbdCDpAvKMf
+EPDKjvbdHEKvKBjK
+EOcKjvbdfpBzvdYI
+DncLKvbdiifIJmYS
+EPDLKvbddeOqbWbj
+DnbkKvbdZyDinDMS
+DoDLKvbdkNCLydgP
+EOcLKvbddePSCWbj
+DnbkKvbdZxcjNcMS
+DoCjjvbdQwNccMID
+EPDLKvbdiiehKMwr
+EOcLKvbdCTBDUFwS
+EPDLKvbdbLMGOnDA
+EOcLKvbdUMWOaVni
+DnbjjvbdyqPMhjXA
+DncKjvbdCTAbsewS
+DncKjvbdMpYQvOHT
+EPDKjvbdTqRPVVIN
+DoCjjvbdZxdJnClS
+DoCjjvbdWSNwbElD
+DnbkKvbdrWokcIxq
+EObkKvbdWIYWXgYz
+EPDKjvbdzitopDsU
+EObjjvbdUVkojUBR
+EPDLKvbdEObkLXCd
+EOcKjvbdrbFmMHKy
+DnbjjvbdehKuqmpg
+EOcLKvbdZshiYcrn
+DoCjjvbdZnnIdeZj
+EOcLKvbdmttzLKRf
+EObjjvbdGZUuBDwb
+DoCjjvbdHDjvJaij
+DnbjjvbdKQzFPGNe
+DncKjvbdRbDeMJYk
+DoCjjvbdezuyEhsw
+DoDKjvbdwkWdHzzG
+DncKjvbdEASJMyvw
+DncLKvbdyfyMANEw
+EPCjjvbdCSaDTfXS
+EOcKjvbdCJKajiGK
+EObjjvbdrJAKFNOe
+DnbjjvbdFWZPoljF
+DnbjjvbdmpZyVjyC
+EPDKjvbdiifIKNYS
+DncKjvbdGAnqYizm
+EOcKjvbdiMFEOVDZ
+DnbjjvbdJXtBglRQ
+DoCkKvbdijGHilwr
+DoCjjvbdDwxMUUUM
+DoDLKvbdUMWPBVni
+EPCjjvbdDwwksssl
+DnbkKvbdNeDshhkE
+EObkKvbdbAudfQQX
+DnbkKvbdwuMdqZLn
+DnbjjvbdijGHjNXr
+EPCjjvbdOFETiIkE
+DoCjjvbdxsOImSCH
+DoCkKvbdLiBkqYAS
+DncKjvbdFkFTDHmV
+DoCjjvbddoErjstS
+EObjjvbdyOTIXsIc
+DncKjvbdeXzTtSFz
+DoCjjvbdqdFIonWB
+EPDLKvbdMpYRWNgT
+DoDLKvbdfNGXHNJk
+EPCjjvbdePErkTsr
+DoCjjvbdNHCpNQVL
+EObjjvbdsQVnjCuf
+DnbjjvbdtcDUwWPP
+DoCjjvbduaDySndh
+EPDKjvbdqZPIGqDx
+EObjjvbdijFgimYS
+DncKjvbdZyEJmblS
+DoDKjvbdirziSkJz
+DncLKvbdeOeTKtTr
+EOcKjvbdfpBzwEYI
+DnbkKvbdezvZFItX
+EPCjjvbdrRuLOKaN
+DncLKvbdbrbjscjB
+EObkKvbddBrlrAUN
+EPDKjvbdZoOIdeZj
+EOcKjvbdGYuUaEYC
+EPCkKvbdNxPVzdNt
+EOcLKvbdhlFDmuDZ
+DncKjvbdKVtecdgJ
+EPDLKvbdqlzJxkhJ
+EOcKjvbdySmhlqbH
+EPCkKvbdxsNiNRag
+EPDKjvbdTYKkmzjx
+EObkKvbdIryBTMxM
+EPDLKvbdxnShXsIc
+EPCjjvbdaSFbhUGL
+EObjjvbdRDbaQQdS
+EObkKvbdrbFmMGkZ
+EPCkKvbdWXJXudEg
+EOcLKvbdcJNKKfXY
+DncKjvbdEuxpPljF
+DncKjvbddCTNSATm
+EOcLKvbdFVyQPmKF
+EPCkKvbdpeceUWBI
+DoDLKvbdVTmUGMWK
+DoCjjvbdFyVVBEXb
+EOcLKvbdTukpKTaR
+DncLKvbdDHLegAzc
+EPCjjvbddxZtTrFz
+DncKjvbdssRsZZeD
+DoDKjvbdeOeSjstS
+DoDKjvbdQdDApQcr
+DncLKvbdURQoUuIN
+DnbkKvbdezuxdiUX
+EPCjjvbdbPgHDkzd
+EOcKjvbdFWZQQMjF
+DoDKjvbdMfcQMotk
+EPCjjvbdrWokbiYq
+DoDKjvbdnGdwmOGy
+EOcKjvbdnBjXYOmu
+EOcLKvbdDoCjjvbd
+DoDLKvbdsQVoJbuf
+EObkKvbdZirhQHBf
+EPCkKvbdIGgZxwwg
+DncLKvbdrMzKZMIJ
+DnbkKvbdkHflFemk
+EObkKvbdfHkWSORH
+DnbkKvbdwygfGYEr
+EOcKjvbdxmrgxTJD
+DnbjjvbdGdLViaij
+DoDKjvbdmSYtysEJ
+EObkKvbdfILVqmpg
+DncLKvbdADSXizIp
+DoCjjvbdznpQdbkx
+DncLKvbdmbKWxOnV
+EPCkKvbdJvUfEEfi
+EOcLKvbdcScLTdJa
+DnbjjvbdQcbaPpdS
+EPDKjvbdDoDKjvcE
+DncKjvbdhzUfMROG
+DncKjvbdbrcKtDia
+EOcLKvbdJpydoFme
+DnbjjvbdxLWdHzyf
+EPCjjvbdwuMeQyMO
+EOcLKvbdiifHimXr
+EOcLKvbdySmiNSCH
+EPCjjvbdznopeCkx
+EPDLKvbdZshhyESn
+DoDLKvbdrDeJQNvB
+DoDLKvbdILaznXQk
+DoCjjvbdnUtzKiqf
+DnbkKvbdjJehKMwr
+EOcLKvbdDxXlUUUM
+DoCkKvbdtSqsYyeD
+DoDKjvbdxVMeQxlO
+EPDLKvbdZjTHofaf
+EObkKvbdZisHogBf
+DnbkKvbdnBiwXoOV
+DoCkKvbdYSkaMtPY
+DncLKvbdHELVibKK
+EPCkKvbdhlEcnVCy
+EPCkKvbdZLqdTnMN
+DoDKjvbdbsCkUEKB
+EPCkKvbdMpYRVnHT
+EOcLKvbdFWZQPljF
+DoDLKvbdznoqEcLx
+DnbkKvbdcImJjewY
+EPCkKvbdvvlBVaWV
+DoCkKvbdmIdTqUrB
+DncKjvbdxZgeexFS
+EOcLKvbdrouoJbvG
+DoCkKvbdWRnYBdlD
+DoCkKvbdBhjbLJFj
+DnbjjvbdrouoKDWG
+DoDKjvbdUxgsyjnn
+DoDLKvbdakMFnnDA
+EOcLKvbdZtJJYcsO
+DncLKvbdrbFllHKy
+EPCjjvbdmajXXnmu
+DncLKvbdpyPHgQdY
+EObjjvbdyNrgwsJD
+EPCjjvbdaMjaruMg
+DncLKvbdYfwEAPTJ
+DoDKjvbdbiNKLFvx
+DoCjjvbdajkfOnDA
+EObjjvbdZoOJEeZj
+EOcKjvbdqZOhGqEY
+EOcKjvbdziuPodTU
+DoDKjvbduLxWaUBX
+EObkKvbdyXhjBoyk
+DoDKjvbdTkunaWPJ
+EObkKvbdBraCsfXS
+DoDLKvbdTAEiICPE
+DnbkKvbdDjHjVwjA
+EOcKjvbdqlzKZLhJ
+EObkKvbddneTLTsr
+EObkKvbdWRmwaeMD
+DoDLKvbdLBLHNBwq
+DoDLKvbdUxhUZkPO
+DncKjvbdYlSDsmkm
+DoCkKvbdxZhGFwdr
+EObjjvbdbsDKsdJa
+EPCkKvbdGYuVAdYC
+EObkKvbdRXNccLhD
+DnbjjvbdFVxpQMjF
+DoDLKvbdMgDQNPtk
+EObkKvbdQvmccMHc
+DncKjvbdMpXqVnHT
+DoCjjvbddZxoxYqC
+DncKjvbdnVUzKjRf
+DoCjjvbdEuyQPmKF
+DoDKjvbdLYqKSzuG
+EPDLKvbdTAFJICOd
+DoCjjvbdCJLCKiFj
+EOcLKvbdFyVVAcwb
+DoCjjvbdbQHHDkzd
+DoCkKvbdNrsvGduQ
+DnbjjvbdRWmcblID
+DnbkKvbdQvnEDLgc
+DnbjjvbdVZITzKnn
+EPDLKvbdxxJJaoyk
+EObkKvbddoEsLUTr
+DncLKvbdZQldhldq
+DoDLKvbddCSmSAUN
+DoDLKvbdYpldhldq
+DoDLKvbdDxXlUTsl
+EPCkKvbdnGdxMmfy
+DncKjvbdwWlBWAuu
+EOcLKvbdkDMKpgUg
+DoDLKvbdZshiYdSn
+EPDLKvbdhfjCyWKV
+EObjjvbdKRZeOeme
+DoCkKvbdznopdcLx
+EPCkKvbdZMSDsnMN
+DnbkKvbdkWWmcbXw
+EObjjvbdpxoHfqEY
+DnbkKvbdtlYXAsaX
+EPDLKvbdjvXNcaww
+EPDLKvbduDDVXVoP
+DoDKjvbdLGFgbBQu
+EObjjvbdmuUzLKRf
+EObjjvbdRaceMIyL
+EPDLKvbdiHKCyVjV
+DoCkKvbdxnTHwriD
+EOcLKvbdZjTIPgCG
+DncLKvbdBcpBVjNG
+EPDLKvbdVwIxVceH
+DoCkKvbdkIGkeemk
+DnbkKvbdozmdKxPA
+DoDKjvbdjuwNdCXw
+DoCkKvbdeEoSCXCj
+EPCkKvbdcScKtEJa
+EPDLKvbdySnIlrBg
+EPCjjvbdnQZyVkYb
+DoDLKvbdqYnggREY
+EObkKvbdBsBDUGXS
+DnbkKvbdUWLoitAq
+DoCkKvbdIGgZxxYH
+DoDLKvbdvwLaWBVu
+EObjjvbdmfeXlnHZ
+EPDLKvbdRXNdDMID
+EPCjjvbdZLrDsmkm
+EOcKjvbdUQpoUuHm
+DnbkKvbdEzsqFMDJ
+EOcLKvbdQlwayOUz
+EPDKjvbdyzdnRhJI
+DoDLKvbdwzHfGXeS
+EOcKjvbdTvMPitBR
+EOcKjvbdJbicRJcY
+DoDLKvbdFVxpQNJe
+DoDLKvbduLxXBTaX
+DoCjjvbdLYpirzuG
+DnbjjvbdvwMAvBWV
+EPCkKvbdBiKbKiFj
+DncLKvbdIryArmYM
+DncKjvbdySmiNRag
+DncKjvbdeEoRbWbj
+DoDLKvbdjuwOECXw
+EPDLKvbdFWZPomJe
+EObkKvbdjcMLRGtg
+DncLKvbdQwNccMHc
+EPDLKvbdzQoMiJwA
+DoDKjvbdmSYtzSdJ
+EOcLKvbdelfWgMjL
+EOcLKvbdiMFENuCy
+EPCkKvbdezvZEhsw
+EPDLKvbdUVlPisaR
+EPDKjvbdbKlGOmcA
+EObkKvbdzGyMANEw
+DoDKjvbdXFxzUAPT
+EPDLKvbdqrUkNkAm
+EOcKjvbdPxmAGsSK
+EOcLKvbdyfyMAMeX
+EObjjvbduDDUwVoP
+DncLKvbdyYJJbQZk
+DoDLKvbdxVNEqYkn
+EPCjjvbdNPxRWOHT
+EObkKvbdYqNEiNEq
+EPDKjvbdXrlAlsoY
+EPDLKvbdbrcKtEJa
+EObjjvbdGdKvJbJj
+DoCjjvbdrDeJPnVa
+DoDKjvbdZLrETnMN
+DoDKjvbdKVuGDeGi
+DoCkKvbdZtJIyETO
+EObjjvbdYSlAlsoY
+DoDLKvbdCSaDUGWr
+EObjjvbdmfeYNNgZ
+DoDKjvbdtumwiqTA
+DncKjvbdqFdEtWAh
+EPCkKvbdauCHXjtI
+DnbjjvbdvOszqKoU
+EOcKjvbdxrnImSBg
+DoCkKvbdjvWmdBww
+EPCjjvbdmuUzKiqf
+EObjjvbdNdcsiIjd
+EOcLKvbdNPxRVnGs
+EObkKvbdSPsgKFdX
+EPDLKvbdVAbQsQqy
+EPDKjvbdVZHsyjoO
+DncKjvbdJzofXdAN
+EObkKvbdFjeTChNV
+DnbjjvbdjJegjNXr
+DnbkKvbdZLrDsnLm
+DnbjjvbdbAueGQQX
+DncLKvbdQcbaQQdS
+DnbjjvbdFjdrbglu
+DncLKvbdAMgxsWyx
+DnbjjvbdRpUHKGDw
+DncLKvbdMfcPlpVL
+EObjjvbdIwtBhMRQ
+EPCkKvbdelfXGmKL
+DoDLKvbdFkErbhMu
+EPCjjvbdHffyyYXg
+DoDKjvbdOEctJIkE
+DoCkKvbdKkAgvAKZ
+EObjjvbdzitopDsU
+EPCjjvbdRpUHJfEX
+DoCkKvbdZLrDtNkm
+EPCkKvbdijGIKNXr
+DoCjjvbdxUmEpxlO
+DnbjjvbdIxTbIMRQ
+EPCkKvbdMfbpMotk
+DncLKvbdjlbLzFGo
+EObkKvbdrRtkNjaN
+DnbkKvbdRosgKFcw
+EPDLKvbdpfDeUWAh
+DnbkKvbdkxsRryHU
+EPCkKvbdkVvmcbXw
+EOcKjvbdhficZWJu
+EPDKjvbdCEQBWKMf
+DoCjjvbdUyITzKoO
+DnbjjvbdaNKbStmH
+EPDLKvbdFWYpQMie
+EObjjvbdhytekqNf
+EObjjvbdeXyssqez
+DnbkKvbdLAjgNCYR
+DncKjvbdSBdFLiZL
+EPDKjvbdBhkBjiGK
+DoDKjvbdmajWxOmu
+DoCjjvbdrMzJyMHi
+DoDKjvbdZLqctOMN
+EOcKjvbdnPzYujxb
+DncKjvbddoFTKstS
+DncLKvbdjcMLRGuH
+DoCkKvbdbUagYKtI
+DncLKvbdVAaqTRSZ
+EPCjjvbdOEdTiJLE
+EPCjjvbdJvUfEFHJ
+DnbjjvbdIryBTNYM
+EPDKjvbdYpleJNEq
+DncKjvbdZGwEAOri
+DncLKvbdBdQAvJmG
+DoCkKvbdmIdTqUqa
+EPCkKvbdtcCuWuno
+EPCjjvbdmuUyjjSG
+DncLKvbdjAQHApHK
+EPCjjvbdGdKujBjK
+EPDKjvbdYkrETmlN
+DncKjvbdYORAYUut
+DnbkKvbdiHKCxvJu
+EPCjjvbdkHgLfGOL
+DoCjjvbdpssfqqkU
+EPDKjvbdZnmheEzK
+EPDLKvbdySmhlrCH
+EPCkKvbdjJegilxS
+DoCkKvbdqcdhpNua
+EPDKjvbdIHHZyXxH
+DnbjjvbdjmBkydgP
+DoCjjvbdYkqcsnLm
+EPCkKvbdZnmhdeZj
+EPDLKvbdDjIJuwjA
+EOcLKvbdnQZxvKyC
+EPCkKvbdBhkCKiGK
+DnbjjvbdYkrDsnMN
+DncLKvbdyzeNqghh
+DncLKvbdrRuKmjaN
+EPCjjvbdssRsYzEc
+DoDLKvbdZQleJNFR
+EObjjvbdZQleJMeR
+EPDKjvbdtvNxJqTA
+EObjjvbdbBWFGPpX
+EPDLKvbdajkeoODA
+EPDLKvbdSZihTCvA
+EObkKvbdZMRdTnMN
+EPCkKvbdsCFmLgKy
+EObjjvbdVvhxVceH
+EPCkKvbdaaVeFpQX
+DoCjjvbdZQmEhleR
+EOcKjvbdhzUfLpmf
+EPCkKvbdREDBQRDr
+DncLKvbdemFwHNJk
+EOcKjvbdGAnqYizm
+DncLKvbdtTRsZZdc
+DoDLKvbdGGKRmhtR
+DoDLKvbdIidAJogE
+DoCkKvbdxZhGFxEr
+DncLKvbdpxoHgREY
+DnbjjvbdQcbaQRES
+EPDKjvbdjAPfaPgK
+EPCkKvbdvwMAuaWV
+EOcKjvbdZLrDsnMN
+DncKjvbdyqOlhiwA
+EObkKvbdRacdkiYk
+DoDKjvbdUWMQJsaR
+EPDKjvbdUGzmkvvF
+DoCjjvbdhbPDFXRR
+EObjjvbdXGZZtAPT
+EPCjjvbdMoxRWNgT
+EOcKjvbdGFiqmhtR
+DoCkKvbdNPxRWNgT
+EObkKvbdyNrgxTJD
+EPDKjvbdrXPkcJYq
+EOcLKvbdFjeTChMu
+DncKjvbdjvXNcaww
+DncKjvbdkMbMZdgP
+EOcKjvbdDnbkLXDE
+EObjjvbdbBWFGPow
+DoCjjvbdAMhZSwZx
+EPDLKvbdZRNEiMeR
+DoDKjvbdqdEiQNvB
+DoCkKvbddePRavbj
+EPDKjvbdaMjbStlg
+EObkKvbdHgGyxxYH
+EOcKjvbdtkxXBUAw
+DnbjjvbdmSZUysEJ
+EObkKvbdrXQLbhxq
+EObkKvbdVTlsfMWK
+DoDKjvbdSLZGUfjs
+DoCkKvbdFVyPpMjF
+DoCjjvbdhgKCyViu
+EPCkKvbdZMSDtOLm
+EPCjjvbdySmhlqag
+EPDKjvbdWRmwadlD
+EPCjjvbdqZPHfpdY
+DoDLKvbdXsMBMsoY
+DncLKvbdelewHMjL
+EObjjvbdYpleImEq
+DoDKjvbdZirgogBf
+EOcLKvbdrXPlChxq
+EPCkKvbdFVxpQMie
+DoCkKvbdrNZjZMHi
+EOcKjvbdDjIJuxKA
+DncLKvbdeOeSkTsr
+DoCjjvbdZoNhddyj
+DoDKjvbdkWXNcaxX
+DoDLKvbdTpqOtthN
+DnbjjvbdehKuqnQg
+EPCjjvbdmgFXlmfy
+DncLKvbdShyiqAAl
+EOcKjvbdKaKgNBwq
+EPDKjvbdEztREkbi
+EOcKjvbdVviXvEFH
+EPDKjvbdcIlikGWx
+EPCkKvbdUWLojUAq
+EPDLKvbdOStWHEtp
+DoCjjvbdHlBzmwRL
+DnbjjvbdWIYVxHYz
+EPDLKvbdADSXjZhp
+EPDKjvbdRzJgrcWA
+EObkKvbdxrnIlqag
+EObjjvbdRosgKFcw
+DoDKjvbdkySrTYgU
+DncKjvbdsrqrxydc
+EPDLKvbdZyEKODLr
+EPCjjvbdEXxMUUTl
+EOcKjvbdtcCtwWOo
+DncLKvbddndrkTtS
+EPDKjvbdrafMkfjy
+EPCjjvbdJcJbpibx
+EObkKvbdFfJqnIsq
+EPCkKvbdyNsHwriD
+DoCjjvbdaRebgsfL
+DnbjjvbduoTzpjnt
+EPCjjvbdZGvdAOsJ
+DoDKjvbdmozYujyC
+EPDKjvbdZGvdAPSi
+DnbjjvbdmSYtzTDi
+DoCjjvbdRotGjFdX
+EObkKvbdSBceLhxk
+DoCjjvbddijRvUzn
+EObkKvbdMgDQNPtk
+DoCkKvbdFVxoomKF
+DncKjvbdGcjujBjK
+EPDKjvbdBcpAvJlf
+DncLKvbdLBLHNCYR
+EObkKvbdmIctQtrB
+DoDLKvbdFpATXGey
+EPCkKvbdbrbkUDjB
+DncLKvbdcTCjtEJa
+DncLKvbdBsAbsfXS
+EPDKjvbdFpATXGfZ
+DoDKjvbdwuMeQxlO
+EObkKvbdqUUGqrKt
+DncKjvbdZyEKODLr
+EPDKjvbdjhHLefNk
+EPCkKvbdrbFmMGjy
+DoCkKvbdsQWOjCvG
+DoCjjvbdLBLHMbXq
+EObjjvbdrpVnicVf
+EPCjjvbdVqmwaeMD
+DncLKvbdRNYCYnUz
+EObjjvbdRXNdCkhD
+DncKjvbdIHHZyYXg
+DnbjjvbdyTOJMrCH
+DoDLKvbdUsmUFkuj
+DncKjvbdQcbaPqES
+DnbkKvbdmgFYNNgZ
+EOcKjvbdkySrTYgU
+DoCjjvbdHlBzmwQk
+DnbjjvbdaSFcITek
+EObjjvbdQdCaPqDr
+DncKjvbdxVMdpyLn
+EOcKjvbdiMEdOVCy
+DoCjjvbdRosgJecw
+DncLKvbdkDMLQftg
+EPCkKvbdKDKCqKDY
+DoCjjvbdjvWnDaww
+EOcLKvbduVnYJpsA
+DoDLKvbdWRnYBdlD
+DoDKjvbdssSSxzFD
+EPDLKvbdJYTaglRQ
+EOcLKvbdhzUfLpmf
+DoDLKvbdJutfDdgJ
+EOcKjvbdxmrgwrhc
+EObkKvbdwWkaVaVu
+EOcKjvbdxrmiMrBg
+DoDKjvbdRDcApRES
+DoCjjvbddjJrVtzn
+EOcKjvbdxVNEqYlO
+DoCjjvbdJJdAJofd
+DoDLKvbdemGWfmJk
+EOcKjvbdnPyyWKyC
+DoCjjvbdbrcLTcia
+DoDKjvbdjuvmdCXw
+DncLKvbdtkwvaUAw
+EOcKjvbdHDkViaij
+EObkKvbdRDbaPpcr
+EOcLKvbdtSqryZeD
+EOcKjvbdrRuLOKaN
+EOcKjvbdczYowyRC
+DnbkKvbdjcMLQfuH
+DncKjvbdmbJwYOnV
+EPDLKvbdZnmiFEzK
+EPDKjvbdjbkkQgVH
+EObkKvbdJTZArmYM
+DncKjvbdSPsgJfEX
+DncLKvbduMYXBUBX
+EObkKvbdkIHMFfOL
+EOcKjvbdYORAYVWU
+DoCjjvbdyzdmqghh
+DncLKvbdtumwiqTA
+EPDKjvbdQmYCZOUz
+DoCjjvbdtcCtvvPP
+EObjjvbdVTmUGMVj
+EObkKvbdBsAcUGXS
+DoCjjvbdqYngfqDx
+EPCkKvbdtkxXBTaX
+DoDLKvbdACqwiyhp
+DncKjvbdraelkgKy
+EPDKjvbduLwvaUBX
+DncKjvbdpssgSSLU
+EPCjjvbdIxTbHlRQ
+EPDKjvbdPyNAGrqj
+DoDLKvbdnCJvxOnV
+EObkKvbdZRNFJNEq
+DoCjjvbdFxuVBEYC
+EOcKjvbdVAbRSpqy
+DnbjjvbdJbibqKDY
+DoDLKvbdKCicQjCx
+EPCjjvbdNrtVgFUp
+EOcLKvbdZQleJNEq
+DoDLKvbdaRebgsfL
+DoCkKvbdCIjakIej
+EOcLKvbdBraDUGWr
+EPDLKvbdADRxKZiQ
+DoCjjvbdHkazmvpk
+EPDKjvbdUsltGLvK
+EOcKjvbdTkvOaVoJ
+DncLKvbdZnmiEdyj
+DoDKjvbdZtJJYdSn
+DoDLKvbdbiNJjfWx
+DnbjjvbdIsZBTNYM
+EPCkKvbdhbPDEvpq
+DncKjvbdqlyjYlIJ
+DoCkKvbdbsDLTcia
+DoDKjvbdKCjCqKCx
+DoDLKvbdnBiwYOmu
+DnbkKvbdjKGIKMwr
+EPCjjvbdHgGyxxYH
+EOcLKvbdcyxpXxqC
+DncLKvbdlZSrSyGt
+EPCjjvbdTAFIhCPE
+EObkKvbdZdwfzgiC
+DoDLKvbdSLYfUgLT
+DoCjjvbdRMwayNtz
+DnbjjvbdCflGHAzc
+DoCjjvbdrJAKFNOe
+EPCjjvbdjblKpgUg
+EPDLKvbdQccAoqDr
+DnbjjvbdCJKbKhfK
+EPDLKvbdiGibyWJu
+EOcLKvbdyNsHxShc
+EPDLKvbdmIcspuSB
+DnbjjvbdnGdxNOHZ
+DoCkKvbdhzVGMRNf
+DoDLKvbdeFPRawDK
+EObjjvbdsQWOjCvG
+EObkKvbdhzUelQmf
+EObkKvbdeJirWUzn
+DncLKvbdxxIibPzL
+EObkKvbdSBceMIxk
+DoCkKvbdehKvRmqH
+EObjjvbdRbDeLiZL
+EObjjvbdGYtuAdYC
+DnbjjvbdHDkVibKK
+DoCjjvbdKQyeOfNe
+DoCkKvbdmbJvxOmu
+DoCkKvbdULvOaWPJ
+DncLKvbdrWpMCiZR
+EObjjvbdhytfLqNf
+DoCjjvbdgPazvdXh
+DoCjjvbdiHKDYuiu
+EPDKjvbdRWnDbkhD
+DncLKvbdrMzKZLhJ
+EObkKvbdyXhiaoyk
+EPCkKvbdjmCLydfo
+DnbkKvbdDxYMUTsl
+EPDKjvbdxmrgxSiD
+DnbkKvbdmSYtyrci
+EPCjjvbdqvokcIxq
+DoDLKvbdXsMAmUPY
+DncKjvbdDoDKkWcE
+EPCkKvbdMgDPmQUk
+DoDLKvbdKyQirztf
+EPCjjvbdmajWwnmu
+EOcLKvbddCSlrATm
+EPDLKvbdrJAKElne
+DoCkKvbdIsZBTMxM
+DnbkKvbdffMZnGgA
+EOcKjvbdJcKDQjDY
+EObjjvbdxsOJMrCH
+EObkKvbdEKHiuwjA
+DncKjvbdunszpjnt
+DoDLKvbdZjTIQHCG
+DnbjjvbdsQVnibvG
+DnbkKvbdGQATXHGZ
+DnbkKvbdBsBDTfXS
+DoCkKvbdBsAbsevr
+DoCkKvbdRXNdDLhD
+EPCjjvbdRadElJZL
+DnbkKvbdxwhibPzL
+EOcKjvbdCJLBjiFj
+DncLKvbdZMSDsmkm
+DoDKjvbduaEZSoFI
+EPCjjvbdhgJbxujV
+EOcLKvbdCJLBjhfK
+DoCkKvbdZisHpHBf
+DoCkKvbdqFdFUWBI
+EPCkKvbdDGlFgAzc
+DncKjvbdZxcjNblS
+EPDLKvbdLqvmZuQz
+DoDKjvbdxZhGFxFS
+EObkKvbdZdxGzhIb
+DoDLKvbdqwQMChyR
+DoCkKvbdjlalZeGo
+DncKjvbdZRNEhldq
+EPCkKvbdZHXEAPSi
+DoDKjvbdDoDLKwCd
+DnbkKvbdmbJwYPNu
+DncKjvbdMfcPlouL
+DoCkKvbdQwODblHc
+DoCjjvbdNQYQunGs
+DnbjjvbdlqxtzSci
+EOcLKvbdrDdhpNua
+DncLKvbdKefICApu
+EPDKjvbdatagXkUI
+DoCjjvbdaofgDkzd
+EObkKvbdIrxaTMwl
+DncLKvbdSLYfVGkT
+EPCkKvbdelevfmKL
+DncKjvbdFfKSOIsq
+EObjjvbdfILVqnQg
+DncLKvbdZjShPgCG
+DoCjjvbdrNZixlHi
+DnbkKvbddoFTKstS
+EOcKjvbdWSNwbFMD
+EPDLKvbdpxngfqDx
+EOcKjvbdIHGyxxYH
+EOcLKvbdvwMAuaVu
+EOcKjvbdkxrqryGt
+DncLKvbdZjShQHBf
+DnbjjvbdiUzEvquC
+EObkKvbdpxoHfpcx
+DoCkKvbdGAoRZJzm
+EOcKjvbdehLVrOQg
+EPDKjvbdkDMLRGuH
+DnbkKvbdKCjDRKDY
+EPCjjvbdLGFhBaRV
+EPDLKvbdaMjbSuNH
+DncKjvbdWfYzUAOs
+DoCjjvbdsBelkfjy
+DncLKvbdZnmheFZj
+EOcLKvbdatagYLUI
+EObkKvbdWXJXvEEg
+DoDKjvbdZMRdTmlN
+EPCjjvbdWXIwvEEg
+DoCjjvbdkCkjqHUg
+EPCjjvbdijFhJlxS
+EPDKjvbdmSZUysEJ
+DoDKjvbdMgDQMouL
+EPCkKvbdrDdhomvB
+EPCjjvbdRNXbYmtz
+EPCkKvbdUtMtFlWK
+DnbjjvbdGcjvJajK
+EPDKjvbduaDyTOeI
+DncLKvbdziuPocrt
+DoCjjvbdcScKscjB
+DncKjvbdmgExMmfy
+EObjjvbdJcJcQibx
+EPDKjvbdMpXpvNfs
+EObkKvbdyqPNIjXA
+EPCjjvbdCSaDUGWr
+EOcKjvbdZnnJFEyj
+EObkKvbdyOSgwriD
+EPCjjvbdtkwwAtBX
+DnbkKvbdDncLLXDE
+EOcKjvbdZshhxcsO
+DoCjjvbdxVMdpxlO
+DncKjvbdLGGHaaQu
+DoCkKvbdxUmFQyMO
+EPDKjvbdpfEEsvAh
+DoCkKvbdZRMdhldq
+EPDLKvbdYzberJuy
+EObjjvbdfHkWSOQg
+EPDLKvbdRMxByNtz
+DncLKvbdmoyyWLZC
+EObkKvbdhtydvrVC
+DoCkKvbdVhYWYGxz
+EPDKjvbdbVCHXjsh
+EPCkKvbdTlWPBVni
+DncLKvbdFkEsCgmV
+DnbkKvbdIsYaSlxM
+DncKjvbdzaAOffbM
+DncLKvbdaSFcHtGL
+DoDLKvbdiGjDYuiu
+EObjjvbdDigjVwjA
+DncKjvbdqmZixlIJ
+DnbkKvbdRjxfUgLT
+EObkKvbdeAURNYKG
+EPCjjvbdjvWnECXw
+EPCjjvbdNQXqVmgT
+DoDLKvbdxmsHxShc
+EPCkKvbdqwPlChxq
+DnbjjvbduLwwAsaX
+DncKjvbduCbuWuno
+DnbkKvbdJpydnenF
+EPDLKvbdRXOEClID
+DncKjvbdSKyFuGkT
+DncKjvbdczZQYZRC
+EPCkKvbdGZUtaDxC
+EPCjjvbdOAJTUKSA
+DnbkKvbdsZlQSaHn
+DncKjvbduWNwiqTA
+DoDLKvbdRNYCZOUz
+DoCkKvbdVTmTfMVj
+EOcLKvbdeATpmYJf
+DncKjvbdbUbGxKsh
+DnbkKvbdLZRKSztf
+DncKjvbdcJMjLFwY
+DnbkKvbdRadEkhyL
+EPCkKvbdauBgXkTh
+EObkKvbdrJAKFNOe
+EOcKjvbdDnbjkXDE
+DoDKjvbdrafMlGjy
+EOcLKvbdliDtRVRa
+EObjjvbdZjShQHCG
+DnbjjvbdZnmiFEyj
+EPDKjvbdbAueFpQX
+EPCjjvbdVwJYVcdg
+EObkKvbdijGIJmYS
+DoCjjvbdJpyeOenF
+DoDKjvbdYlSDsnMN
+DncLKvbdehLVqmqH
+DnbjjvbdTppnuVHm
+EOcKjvbdSLYetgLT
+EPCkKvbdZyEKOClS
+DoDKjvbdHDjujBij
+EPCkKvbdHkazmvpk
+EObkKvbdkxrrTYft
+EPCjjvbdOTUVfeVQ
+DoCjjvbdYzbfSKWZ
+DncKjvbdkxrrSxgU
+EObjjvbdEOcKkXCd
+EPDKjvbdcTCkTcia
+DoDKjvbdatagXkTh
+DoDLKvbdNHCpMpUk
+DoDKjvbdhtzEvquC
+EPCjjvbddePSBvbj
+DoDLKvbddneTLUUS
+DncLKvbdijFhKMwr
+EPDLKvbdpxoIHRDx
+DncLKvbdqquLOKaN
+EPCkKvbdSCEEkiZL
+DoDLKvbdvAdYroEh
+DncLKvbdDwwksstM
+EOcKjvbdKWVFcdgJ
+EPDKjvbdZnmhdeZj
+DoCjjvbdJSyBTMxM
+DoDLKvbdtcDVXVoP
+EOcLKvbdbAudfPow
+EPCjjvbdpfDdtWAh
+DncKjvbduCcUwWOo
+DnbjjvbdGFirOItR
+DnbjjvbdLBKgNBxR
+DnbjjvbduVnYJpsA
+DnbjjvbdjuvnDbXw
+DoDKjvbdFkFTDINV
+EOcKjvbdEvZQQMie
+DoCkKvbdMfbolpUk
+EPCjjvbdhbPCdwQq
+DoDKjvbdZyEKNblS
+EPCjjvbduCbtwWPP
+DnbjjvbdgLGzbfAE
+EObjjvbdqGDdsvAh
+EPDLKvbdNGbolotk
+DoCkKvbdSPsfifEX
+DncLKvbdbVCGwjsh
+EObkKvbdijGHjMwr
+DnbjjvbdRosfifDw
+DoCjjvbdQccApRDr
+DoDKjvbdqTtHSSKt
+EOcLKvbdsQWPJcVf
+EObkKvbdeOdsLTsr
+DncLKvbdcTDLUDjB
+DoDKjvbdVgwvXfxz
+EOcKjvbduoTzqKnt
+EPCjjvbdYNqAYVWU
+EObjjvbdemGXGmJk
+DoCkKvbdVgxWXfxz
+DoCjjvbdqlzKZLgi
+EPDLKvbdLFfHaaQu
+DnbkKvbdcSbkTcjB
+EObjjvbdgGLzNgHA
+EObjjvbdZjSgpGbG
+DnbjjvbdGckVjBij
+EOcLKvbdUMVnaWOi
+EObkKvbdrylQSaHn
+EPDLKvbdZHWdAOri
+DoDKjvbdyfxlAMdw
+DnbjjvbdZMSDsnLm
+DoDKjvbdOTUVgEtp
+DnbkKvbdJSxaSlwl
+DncKjvbdkNCLzFGo
+DoDKjvbdfMevgMik
+DnbjjvbdMgDPlpVL
+DncKjvbdqquLOLAm
+DoCkKvbdfNFwGlik
+DncLKvbdpxnhHRDx
+DoDLKvbdZMRdTmlN
+EPCkKvbdURRPVVHm
+EPCkKvbdmgEwmOHZ
+EOcLKvbdVAapsRSZ
+DoCjjvbdczZPwxpb
+EPDLKvbdWXIxWDdg
+EPCkKvbdUVlQJtBR
+EOcKjvbdelfWgNJk
+EPDKjvbdUtMtFkuj
+DnbjjvbdRkZFtfjs
+EObkKvbdCJLCLJGK
+DoDLKvbdKVuGEEgJ
+DncKjvbdIxTbHkqQ
+DncLKvbdMSWlzUpz
+EPCkKvbdKefICAqV
+EOcKjvbdtunXjRTA
+DoDLKvbdZMSETmlN
+EObkKvbdapHHELzd
+EObkKvbdmRxtyrdJ
+DoCjjvbdtTSSxzEc
+EObjjvbddeOrBvbj
+DncLKvbdJYUBgkpp
+EPCjjvbduLxXBUAw
+DnbjjvbdSLYetfjs
+DncKjvbdzQnmIiwA
+EPCjjvbdRpUGjFdX
+EOcLKvbdddnqbWcK
+EOcKjvbdWWhwucdg
+EOcLKvbdCWzdJEov
+EPDKjvbdTkuoAuni
+DncLKvbdqUTgSSLU
+DoDLKvbdNHDQMotk
+DncLKvbdWXJXvEEg
+EPCjjvbdaNKaruNH
+EPDLKvbdraelkfjy
+DncLKvbdLqvmZtpz
+DnbjjvbdNddThhkE
+DoDKjvbdzoQQdcLx
+EPDKjvbdYpldiNFR
+EObjjvbdZtJIyDsO
+DoCkKvbdWWiYWDeH
+DoCkKvbdeEoSBwDK
+DoCjjvbdBsAcTevr
+EObjjvbdqvpMChyR
+EPCjjvbdsCGMlHKy
+DnbkKvbduLwwAtAw
+EObkKvbdMRwMyuQz
+DncLKvbdwWlAuaWV
+DncLKvbdHgHZxwxH
+DncKjvbdBsAcTewS
+DoDLKvbdJpyePFme
+DncKjvbdVUNUFlWK
+DncKjvbdEYXktTtM
+DncLKvbdwMvANDeN
+DnbkKvbdtSrTZZeD
+EOcLKvbdJYUBhMRQ
+DncKjvbdlYrrTZGt
+DoDLKvbdliDsqUrB
+EObjjvbdegjuqnQg
+EObjjvbdlZSrTZHU
+DncLKvbdfNGWfljL
+DoDLKvbdLFegbBQu
+DncLKvbdemGXGmKL
+EPDKjvbdDwwksssl
+DnbjjvbdxmsIYTJD
+DoDLKvbdBsBCtGWr
+DoCjjvbdIsYaTNYM
+DncKjvbdJuuGEEgJ
+EObkKvbdkySqsYgU
+DnbkKvbdNPwqWNfs
+EPDLKvbdmIdTptrB
+DoDLKvbdyqOmIjXA
+EPCjjvbdhkeEOUcZ
+DoDKjvbdJqZePFme
+EPDLKvbdfSAvzlCo
+EObjjvbdbhljLFvx
+EOcLKvbdaMkBsUmH
+DoCjjvbdKyRKSzuG
+EObjjvbdcSbjtEJa
+EOcLKvbdkHflGFmk
+DoDLKvbdemFwHMjL
+EObjjvbdSLZGVHLT
+DoCjjvbdJXtCILpp
+EOcLKvbdaaVdfPow
+EOcLKvbdFpATWgGZ
+DoCjjvbdxZgeewdr
+EObkKvbdeEnqawCj
+EObjjvbdhytfMQmf
+DnbjjvbdoznEKxPA
+DnbjjvbdoAKzsgdO
+DoCkKvbdYzbfRivZ
+DoDLKvbdqqtkOKaN
+DncLKvbdqvokcJYq
+EPDKjvbdOStVfeUp
+DoDKjvbdZxcinDLr
+DoCkKvbdcyyQYYqC
+EObkKvbdcIlikGWx
+EOcLKvbdffLzNgHA
+EPCjjvbdMtsRkNAX
+EOcKjvbdpeceTvBI
+EOcKjvbdZsiIxcsO
+DncLKvbdJvVGDdgJ
+DnbkKvbdZMRdTmlN
+EPDLKvbdnCJwXnnV
+EObkKvbdxUldqZLn
+EPCjjvbdNddUJIkE
+DoCjjvbdyYJJapZk
+DnbjjvbdpxoHgQcx
+EObjjvbdHDjvKBij
+DncKjvbdUtNUFlWK
+EPCkKvbdkVvmdBww
+DnbjjvbdgGMZmgHA
+DoDLKvbdmIdTqVSB
+EOcLKvbdzitpPdTU
+DncLKvbdkxrqrxgU
+DoCjjvbdVBBpsRSZ
+EOcLKvbdGFiqmiTq
+EOcKjvbdxsOJMqag
+DoCkKvbdHDkVjCJj
+EPDKjvbdjSziTKiz
+EOcKjvbdCTAbsewS
+EPCkKvbdkWWnDbYX
+DoDLKvbdJSxaTMxM
+DoDLKvbdMoxRWNgT
+DoDLKvbdmuVZkJrG
+EPDKjvbdbUbHXjtI
+DnbjjvbdkWWnEBxX
+EOcLKvbdnPyxukZC
+DnbjjvbdXrlBMtOx
+DoDLKvbdJuuGEFGi
+EPDKjvbdUaBprprZ
+EObjjvbdsrqrxydc
+EObjjvbduCbtwWOo
+DoCkKvbdSLYeuHLT
+DoDKjvbdKQyePFme
+EOcKjvbdeYZssrFz
+DoDKjvbdpxoHfpdY
+EPCkKvbdcIljKfXY
+EPDKjvbdDwwksstM
+DnbkKvbdsQWOicVf
+EPDLKvbdIidAKQHE
+DoDLKvbdrDeJPnWB
+EOcLKvbdZoNiEeZj
+EObjjvbdptTgRrLU
+EPDKjvbdmRyUzTEJ
+DoDLKvbdFxtuBEYC
+DnbkKvbdehLVqmqH
+EPCjjvbdUtNUGLuj
+DoDLKvbdxVNEqZLn
+DncKjvbdySnImRbH
+DoCjjvbdbLMGPNcA
+EPCkKvbdzQoMiKXA
+DnbkKvbdbiMijevx
+EOcKjvbdSQTfiedX
+DnbjjvbdZisIQHBf
+EObkKvbdYpleIldq
+DncLKvbdjmBlZeHP
+DncKjvbdSCDdkhxk
+DnbkKvbdrykpTAgn
+EObkKvbdZQldiMeR
+DnbjjvbdeYZssqez
+EPDLKvbdlYrrSyHU
+EOcLKvbdTpqOttgm
+EOcKjvbdCJLCLIej
+EPDKjvbdUQqOttgm
+EObkKvbdGBOqZJzm
+DncKjvbdqwQMDIyR
+EPDKjvbdbBWFFoow
+EOcLKvbdZMRctOLm
+EPCkKvbdHEKuibKK
+DnbjjvbdNddThiKd
+DncKjvbdJuuFdEgJ
+DncLKvbdRzJgsDWA
+DncLKvbdRWmdCkhD
+EPCjjvbdZRNFImEq
+EOcLKvbdUaBqTRSZ
+EObkKvbdWIXvYGxz
+DoDKjvbdrRuKnKaN
+DoCjjvbdYgXEAPTJ
+DoCkKvbdwuMeQyMO
+EPDLKvbdkHfkfFmk
+DoDKjvbdTqQnuUhN
+DoCkKvbdbKlFoODA
+EObkKvbdrzLoraIO
+DncLKvbdFxuVAdYC
+DoCjjvbdZQldiMeR
+EOcKjvbdJTZBTNXl
+EPDKjvbdsQWPKCvG
+EOcLKvbdeEoRawDK
+EPDLKvbdtTSSxzEc
+DncLKvbdliDsqUqa
+DnbjjvbdZQleImEq
+EPCjjvbdaSGDITek
+DoDLKvbdRWnDbkhD
+EPDLKvbdpedEsvAh
+EPCkKvbdYpldhldq
+DoCjjvbdZoOJEdyj
+EOcLKvbdmoyxvKyC
+EObjjvbdmSZVZsEJ
+DoDLKvbdqUUGrSLU
+EPDLKvbdmpZxujyC
+EPCjjvbdCDpBVilf
+EPCjjvbdFfJrNhsq
+DoDKjvbdsZkosBIO
+DnbjjvbdiBnbdvpq
+DncKjvbdkDMKpftg
+EPCkKvbdatbGxLTh
+DoCjjvbdJTYaTNXl
+DnbjjvbdhkdcnVCy
+DncLKvbdyNrgxTIc
+EPDLKvbdyNsHwriD
+EPDLKvbdBdQBVilf
+DoDLKvbdIsYaTNXl
+DnbkKvbdkxsSTZHU
+EPCjjvbdBsBDUGWr
+EOcLKvbdgQBzwDxI
+DnbjjvbdjblLQfuH
+DnbkKvbdbVBgYKsh
+DncLKvbdMgComPuL
+EPDLKvbdqceIpOVa
+DnbjjvbdqFceTvAh
+EPCjjvbdFWYpQNJe
+DoDLKvbdHDjujBjK
+DncLKvbdIHGyyXxH
+DnbjjvbdeFOqawCj
+DoDKjvbdGQASwGfZ
+DncLKvbdrWokbhyR
+DncKjvbdSKyFtfkT
+DoCkKvbdemFvfmKL
+EPDKjvbdxsNhmRbH
+EOcKjvbdsPunicVf
+EObjjvbdrbGNMGjy
+EPDLKvbdOXoVzcnU
+EOcLKvbddZxpYYpb
+DoDKjvbdVBBpsRRy
+EPDKjvbdHDkWKCKK
+DoCkKvbdSiZjRAAl
+EPDKjvbdURQoVVHm
+DoCkKvbdpyPHgQdY
+EOcKjvbdGAoQxizm
+DnbjjvbdMpXpvNfs
+DncKjvbddndrjtUS
+DnbkKvbdlhcsptqa
+DoCkKvbdfNFvfmKL
+EPCkKvbdHffyxxXg
+DoCkKvbdYpleImFR
+DoCkKvbdbBVdfPpX
+DncLKvbdWSNxBdlD
+EPDKjvbdSQTfjFcw
+EPCjjvbdkxrqsYgU
+EPDKjvbdrovOjCvG
+DoCjjvbdaSGCgsek
+DncLKvbdZGwEAOri
+DoDLKvbdJmADzHUa
+DoCjjvbdNdcshiKd
+DoCkKvbddneTLTtS
+EObkKvbdMoxQumfs
+DncKjvbdVgxVwfxz
+DoDKjvbdGcjuibKK
+EObkKvbdTqQnuUhN
+DncKjvbdURRPUuIN
+EObkKvbdbrbjtEJa
+DnbkKvbdKQyeOenF
+EObjjvbdbKkfOnDA
+EPDLKvbdlhdTptrB
+EObjjvbdxnTHxTJD
+EObjjvbdKCjCpjDY
+DoDLKvbdMSWmZtpz
+DoCkKvbdBsBCsfXS
+DnbkKvbdfRaWzkcP
+EPDKjvbdbAvFGQQX
+DoCjjvbddoFSjtUS
+DnbjjvbdypoNJJwA
+EPDKjvbdzdzOzdyp
+EObjjvbdJpzEoFme
+DoCkKvbduCbuXWPP
+EPCkKvbdFfJrOItR
+DoDLKvbdkIGlFfOL
+DnbjjvbdbAudfPpX
+DoDLKvbdtAHRIABS
+EOcLKvbduDCuWuno
+DoDKjvbdkHgLfGNk
+EOcLKvbdxZhFeweS
+EObkKvbdUxgszKoO
+EOcKjvbdiBoCeXRR
+DnbkKvbdZeXfzhJC
+EObkKvbdtcDUvvPP
+EOcKjvbdMtrrLNAX
+DnbkKvbdWXJYVceH
+DnbkKvbdJbjCpibx
+EPCkKvbdajlFnnDA
+DnbjjvbduaEZTPEh
+EOcKjvbdGcjuibJj
+DncLKvbdKefHbAqV
+DoDKjvbdUxgtZjnn
+EPCjjvbdVZITzKnn
+EPDKjvbdHkaznXRL
+DnbkKvbdOEdTiIkE
+DnbjjvbdiGjDYvJu
+DoDKjvbdnUtykJrG
+EPCkKvbdBdQBWKNG
+EPDKjvbdsBemLfkZ
+EPCjjvbdtumwiqTA
+EOcKjvbdnCKXYPOV
+DncLKvbdVwIxVdFH
+DnbjjvbdWIYWYGxz
+EObkKvbdFpATXHFy
+DoCjjvbdauBgXjtI
+DnbkKvbdTqROuVHm
+DnbjjvbdlhcsqUqa
+EPDLKvbdxZhGGXeS
+DoDLKvbdZjTHogCG
+EOcKjvbdbKlGOnDA
+EObjjvbdLiBlRYAS
+DncKjvbdxrnJMrCH
+EOcLKvbdMJBlRYAS
+EOcKjvbdUsmTekuj
+DnbjjvbdEYYMTssl
+EObkKvbdZMSEUNkm
+DncLKvbdGGKSNhsq
+DoDKjvbdGZVVAdXb
+EPDKjvbdKRZdoFnF
+EOcLKvbdEXwlUTtM
+DoDKjvbdEztQeLcJ
+DoCkKvbdJYUBglQp
+DoCkKvbdJTZAsNXl
+EObjjvbdvmWAMdEm
+EPCjjvbdxZgefYFS
+DncKjvbdtTRrxzEc
+EOcLKvbdiGjDZWJu
+DoCkKvbdYlRctOLm
+DncKjvbdDxXlTtUM
+EPCjjvbdcyxpYYqC
+EOcLKvbdqGDeUWBI
+DnbjjvbdnPyxvLZC
+DoDLKvbdKefHbApu
+DoCkKvbdjblKqHVH
+EObkKvbdTfzmkvue
+EOcKjvbdZnmiEdzK
+EOcKjvbdDxXkstTl
+EPDLKvbdBdQAujMf
+DoDKjvbdGZVVBDwb
+DoDLKvbdEvZPpMie
+EPCjjvbdVwJXuceH
+DoDLKvbdRjyFtgLT
+DoCkKvbdXsLaNTnx
+DnbjjvbdDHLfHAzc
+DoCkKvbdVBCQrprZ
+DoCkKvbdyNsIYShc
+EPDKjvbdyXiJbPzL
+DoCjjvbdUsltFlWK
+EPCkKvbdcyyQYZRC
+DnbkKvbdddnqbWbj
+EPCkKvbdmuUyjjSG
+EObkKvbdZyDinDLr
+DnbjjvbdZtIiZESn
+EPCjjvbdVBCRTRRy
+EOcLKvbdCWzciFPv
+EObkKvbdrEFJPnWB
+DnbkKvbdqUUHSRkU
+EPDLKvbdlqyUyrci
+DoCjjvbdIMBznXQk
+DoCjjvbdUxgsykOn
+EPCjjvbdXsMBMsnx
+DncKjvbdjuvmdBxX
+EOcLKvbdkIGkeemk
+DoCjjvbdjKGIKNYS
+EPDLKvbdSLZGVGjs
+EOcKjvbdMfcPmQUk
+DoCjjvbdrNZjYlIJ
+EOcLKvbdkyTSTZHU
+EObjjvbdjAQGaQHK
+EPDKjvbdMoxRVnHT
+EObkKvbdeATpmXif
+EObkKvbdFjdsDHmV
+DncLKvbdbLLfOmcA
+EPCkKvbdunszqLOt
+DnbkKvbdnQZxvLZC
+DncLKvbdZyDjNblS
+DnbkKvbdptTfrSKt
+DoDLKvbdzaAOgHCM
+EPCjjvbdhbPCeXRR
+DnbkKvbdmuVZkKSG
+DoCkKvbdziuQQESt
+DnbkKvbdhgKDZWKV
+DnbjjvbdULuoBWPJ
+DncLKvbdWXJXucdg
+DoCjjvbdRacdlJYk
+DoDLKvbdegjvSNqH
+EOcLKvbdnUtzLKRf
+EOcKjvbdFxtuBEXb
+DoCkKvbdmIcsqUrB
+EObjjvbdULvPAvPJ
+EOcLKvbdSwkLmzkY
+EPCkKvbdSZjITCvA
+EPCkKvbdeOdrjtUS
+EPCjjvbdIxUBhLpp
+EObkKvbdqiAJeMoF
+DnbkKvbdhlEcmtcZ
+EOcLKvbdFejRnJTq
+EOcKjvbdwXMAvBWV
+DoDKjvbdmpZyWLZC
+DoCjjvbdGLErbhNV
+DoDLKvbdmaivwnmu
+EOcLKvbdOXoVzcnU
+DncLKvbdBhjbLJGK
+EPDKjvbdZjTIQGaf
+DoCkKvbdgPazwEYI
+DncLKvbdGGKRmiUR
+EObjjvbdfHkWRmpg
+DnbkKvbdXrkaNUPY
+EPCkKvbdzQoMhiwA
+EOcKjvbdrpWOjDVf
+DncKjvbdZtJJZDrn
+EPDKjvbdqZOggRDx
+DnbjjvbdhgJbyWKV
+DoDKjvbdiVZdwRuC
+DoDKjvbdIwtCHkpp
+DoDKjvbdVAapsRRy
+EPDLKvbdwjvcgzzG
+DoDLKvbdRyihScWA
+DoDLKvbdrRuKmkAm
+DnbkKvbdqGDdsuaI
+EPCkKvbdAMhYrwZx
+DncKjvbdSPsfjGEX
+DncKjvbdczYpXxpb
+DoDLKvbdkIHMGFmk
+EPCjjvbdkClKqHUg
+EObkKvbdxVMdqZMO
+DoDKjvbdBdQBVjMf
+EObkKvbdZjTHpGbG
+EPDKjvbdTfzmkvue
+EPCkKvbdLAjfmCXq
+DoCjjvbdLGGHbApu
+EPDKjvbdEzsqEkcJ
+DoDKjvbdwygfGYFS
+DoDLKvbdhgJbyWKV
+EPDLKvbdZshiZETO
+EPDLKvbdKWUfDdfi
+DnbkKvbdqYoHgQcx
+DncKjvbdnGeYMmgZ
+EPDKjvbdKCjDRKDY
+DoCkKvbdJcKDQibx
+EObkKvbdZoNiFFZj
+EPCkKvbdUyHsykPO
+EOcKjvbdtvNxKQsA
+EObjjvbdatafwjtI
+DoDLKvbdhzVFkpmf
+EObkKvbdMgComQVL
+EPCkKvbdSCEEkhxk
+DoDLKvbdgFlZnGgA
+EObjjvbdZMSETnLm
+EObkKvbdtumxKQsA
+EObjjvbdZoOIddyj
+EOcLKvbdqZOggQcx
+EOcLKvbdKfFhBaQu
+DncLKvbdzGxlANEw
+EObjjvbdehLWRnQg
+EObkKvbdEPCjkWbd
+EObkKvbdqYnhHRDx
+EObkKvbdjvXODaww
+DnbjjvbdqTsgSRkU
+EOcKjvbdTqQoVVHm
+DnbjjvbdQmYBxnUz
+DnbjjvbdpyOhGqEY
+EOcLKvbdLGGHbAqV
+EObkKvbdZirgpHCG
+EObkKvbdqYnhGpcx
+DncLKvbdrbGNLgKy
+EObkKvbdkySrSxgU
+EOcLKvbdeAUQlwjG
+DncKjvbdkVwNdCYX
+DoCjjvbdJvVGDeHJ
+EPCkKvbdEuyPpNKF
+EOcKjvbdDjHivXjA
+DnbjjvbdkNCLydfo
+EPCjjvbdZjTHogBf
+DoDKjvbdGKeTDINV
+DnbkKvbdJXtBglQp
+DnbjjvbdFejSOIsq
+EOcKjvbdhytelRNf
+DnbjjvbdbBVdeopX
+DoCkKvbdFjdsDINV
+DoDLKvbdjvXNcbXw
+DnbkKvbdZdxGzhJC
+EPDLKvbdjAPgBQGj
+EObjjvbdJXsbHkqQ
+EPDKjvbdiVZdwRtb
+EObjjvbdGFjSNiTq
+EPDKjvbdznpQdbkx
+EPCjjvbdemFvgNKL
+EPDKjvbdWXIxWEEg
+DncLKvbdEObkKvcE
+DnbjjvbdLAjfmCYR
+EPDLKvbdEXwkstTl
+EObjjvbdFfKSNhsq
+DncKjvbdygZMANFX
+EPCkKvbdYqNFIleR
+DoCkKvbdSKyGUgLT
+DncKjvbdBdQBVjNG
+DnbkKvbdbUagYLTh
+EOcKjvbdsPunjDWG
+DncLKvbdrEFIonVa
+DncKjvbdaSGChTfL
+DoCkKvbdcJNKKfXY
+EObkKvbdULuoBWOi
+DncLKvbdKWVGEEgJ
+EPCkKvbdqFdEsuaI
+EPDKjvbdAMgySvyx
+DncLKvbdiUzEwRuC
+EObjjvbdZoNheEzK
+DnbkKvbdZLrETnMN
+EObjjvbdKWVFcdfi
+DoDLKvbdcScLUEJa
+EPCkKvbdIwsbIMRQ
+EOcKjvbdsBemMHKy
+EOcLKvbdzitoodSt
+EPDKjvbdrMyjZLhJ
+DnbjjvbdaRfCgsfL
+DoCkKvbdKQzEnenF
+EOcLKvbdUGznLvue
+DncLKvbdZxcinCkr
+DnbjjvbdEuyPpNKF
+DncKjvbdGFirOIsq
+EOcLKvbdVqmxBeMD
+EOcLKvbdwuMeRZLn
+DnbkKvbdBhkBkIej
+EOcKjvbdNQXpumfs
+EObkKvbdVBCRTRSZ
+DoDLKvbdZeYGzhJC
+DncLKvbdREDBPqES
+DnbjjvbdvBEZSoFI
+EPCjjvbdakLeoNcA
+EPDLKvbdeFOqbWbj
+EPDLKvbdiGicZWJu
+EPCkKvbdEKHiuwjA
+EPCjjvbdwkWcgzyf
+DoDKjvbdmpZyVkZC
+EPCkKvbdSZihSbvA
+EPDKjvbdelevfmKL
+DnbjjvbdeATplwif
+DoCjjvbdGAnpxizm
+EPDKjvbdTlWPBWOi
+EOcKjvbdmSYtzTEJ
+DncLKvbdnGeXmNfy
+DoDKjvbdTIzJqAAl
+EOcKjvbdqdEiPnVa
+EOcKjvbdcTCkUEKB
+DoCjjvbdEvYopMjF
+DoDLKvbdwuMdpyMO
+EPDKjvbdEuyQPlie
+EOcLKvbdVUMsfMVj
+EObjjvbdijFgilxS
+DoDKjvbdnPyxujyC
+EOcKjvbdTAFIgbPE
+DnbkKvbdZxdJnDLr
+DncLKvbdqdEiPmua
+EOcKjvbdhgJcZVjV
+DnbkKvbdRbEFLhxk
+DoDKjvbdmaivwoNu
+DoCkKvbdZQmFJMdq
+DncLKvbdeYZtTqez
+EObkKvbdqYoIGpdY
+DnbjjvbdEASJMyvw
+DoDKjvbdwzHfGYFS
+DncKjvbdjvXOECYX
+DncLKvbdbBVdepQX
+DoDLKvbdrEFIomua
+DnbjjvbdYgWdAOsJ
+EOcKjvbdkMakydfo
+EPCjjvbdegkWSNqH
+EPDLKvbdYlSEUNkm
+EPDLKvbdzRPMhjXA
+DnbjjvbdmSZUyrci
+EPDKjvbdiiehKNXr
+EPDLKvbdwzIGGXdr
+DncKjvbdSLYetfkT
+EOcLKvbdURROtuHm
+EPDLKvbdEYYLtUUM
+EOcLKvbdaSGDIUFk
+DnbkKvbdhfibyViu
+DncKjvbdeFOqavcK
+EPDLKvbdZtIhyETO
+EOcKjvbdsPuoKDVf
+DoDLKvbdBhkBjiGK
+EPDLKvbdnQZyVkYb
+DncLKvbdNsTugEtp
+EPCjjvbdCDpBWJmG
+DoCkKvbdmIdTqVRa
+EOcKjvbdptUHRqjt
+DnbjjvbdRpTfifDw
+DncKjvbdaRebgtFk
+EPDLKvbdEARiMyvw
+EOcKjvbdyNsHxShc
+DoCkKvbdxKwDgzyf
+DncKjvbdwuNFQyLn
+DncLKvbdegjvSORH
+DncLKvbdOStWGdtp
+EOcLKvbdcTCkTdKB
+DncKjvbdRECaQRES
+DoDLKvbdkIHMFemk
+EPCkKvbdfjfzcGAE
+DncKjvbdZLqdTnLm
+EOcKjvbdIMBzmwRL
+EOcKjvbdwzHeexFS
+EPCjjvbdKVuFdFHJ
+EPCjjvbdRXODcLgc
+DoDLKvbdlrZVZrdJ
+EPDKjvbdjKGIJmYS
+EObkKvbdHEKujCJj
+DncKjvbdNddTiIjd
+DoDKjvbdZjSgpGaf
+DoCjjvbdmfeXlnHZ
+EPCjjvbdRosfifDw
+DoCjjvbdZxcinDLr
+DoCjjvbdNeDsiIjd
+EPDKjvbdVgxVwgYz
+DnbkKvbdqTtGrRjt
+DnbkKvbdTqQntuIN
+DncKjvbdBvzdJEpW
+EPCjjvbdqUUHRrLU
+DnbjjvbdqcdhonWB
+DncKjvbdHDkWKBjK
+DnbkKvbdxVMeQxlO
+EObjjvbdkClKpgVH
+EOcLKvbdCSaDUGXS
+DncLKvbdUQqOttgm
+DoCkKvbdZxcjOClS
+EPDKjvbdVqmxCFMD
+DnbjjvbdqmZixlHi
+DnbjjvbdiUydvquC
+DoCkKvbdOTTugFVQ
+EOcKjvbdUQpoVVIN
+DoCkKvbdNHDPlpVL
+EOcLKvbdDncLKwCd
+EOcLKvbddeOrCXCj
+EObjjvbdqvolChyR
+EOcLKvbdaofgELzd
+DoDLKvbdrpVoKDWG
+DncKjvbdaMjasUmH
+EObjjvbdliETqUrB
+DncLKvbdXsLaMtOx
+EObkKvbdrykpTAhO
+EPDKjvbdehKvRmpg
+EObjjvbdUxhTzKnn
+DncLKvbdTfznMXVe
+EPDLKvbdqUTfqqkU
+DoCjjvbdHELWKCKK
+DoDLKvbdwuNFQyMO
+DoCjjvbdffLynGgA
+EOcLKvbdSLYetfkT
+EPDKjvbdtTRryZeD
+EPDKjvbdddoRbXDK
+DoDKjvbdFVxooljF
+DoDLKvbdxsNiNSCH
+DoDLKvbdsCGNMGkZ
+EOcLKvbdkHfkfFnL
+EPCkKvbdqrUjnLAm
+DnbkKvbdHELViajK
+EOcKjvbdNHDQMouL
+EPCkKvbdWWhxVdFH
+DnbkKvbdUWMPitBR
+DncLKvbdZoOJFFZj
+DncKjvbdcIljKewY
+DoDLKvbdVUNUGLvK
+EObkKvbdNsTufdtp
+DnbjjvbdGKdsCgmV
+EObkKvbduDCtwWPP
+EObjjvbdkMbMZeGo
+EPCkKvbdJSyAsNXl
+DnbjjvbdmbJwXnmu
+EPCkKvbdRjxeuGkT
+EObkKvbdaSFcITek
+EPDLKvbdGYtuAdYC
+DoDKjvbdFeirNiUR
+EPCjjvbdhyuGMQmf
+EObjjvbdDxYLstUM
+EObkKvbdFfKRmhtR
+DnbkKvbdyTNhmSCH
+EPCjjvbdJSyAsNYM
+EPCkKvbdEuxpQMie
+DoDLKvbdkClLQgUg
+DnbkKvbdssRrxzEc
+EPDLKvbdRMwbZNtz
+EPCkKvbdssSTYyeD
+DoCkKvbdYqMeImEq
+EOcLKvbdjuwOECXw
+EOcKjvbdOTUWHFUp
+EPCjjvbdliDtQtrB
+EPDKjvbdZxdJmblS
+DoDKjvbdbVCHXkTh
+DoDKjvbdpstHSRjt
+EOcLKvbdNPwpunGs
+DoCkKvbdLAjgNCXq
+DoCjjvbdDoDKjvbd
+DoCkKvbdZirgpHBf
+EPDLKvbdezuxdiTw
+DoCkKvbdLrXMyuQz
+DncLKvbdqlyjYkgi
+DnbkKvbdLrWlzUpz
+DoCjjvbdhytfLpnG
+EObjjvbdxrmiNSBg
+EPDLKvbdqquLNjaN
+EObjjvbdiHKCyVjV
+DncKjvbdjSziTKiz
+EPCjjvbdCflGHAzc
+EPCjjvbdZtJJZDrn
+EPCjjvbdJKEAKQHE
+EPDKjvbdIxTbHlRQ
+EOcKjvbdZRMdhmEq
+EOcLKvbdmttykJqf
+DncLKvbdEzsqFMDJ
+EPDKjvbdJuteceGi
+EOcKjvbdemFvfmJk
+DoCkKvbdkySqsZGt
+EOcLKvbdlrZVZsDi
+EOcLKvbdEXxLstTl
+DnbkKvbdkNBlZeHP
+DncLKvbdauCHYKsh
+EPCkKvbdhuZeXSVC
+EPCjjvbdOTTufdtp
+DoDKjvbdDoCkKwCd
+DoDLKvbdOAIrsirA
+EPCjjvbdlAmPNALA
+EOcLKvbdiBoCdwQq
+DoCkKvbdnCJwYOnV
+EOcLKvbdqwQLbhxq
+DncLKvbdGYuVBEYC
+EPCjjvbdcyyQXxqC
+EPDKjvbdrEEiPmvB
+DnbkKvbdJbibqJbx
+DncLKvbdiGjCxuiu
+EObjjvbdjKGIJmXr
+EPCjjvbdFkEsDIMu
+EPDKjvbdCWzchePv
+EObjjvbdEObjjwDE
+EPCkKvbdQdDApRDr
+DoDLKvbdbAvEfQPw
+DoDLKvbddtAUATNW
+DnbjjvbdUxhUZkOn
+DnbjjvbdwNWANEEm
+EPCjjvbduDCuWuoP
+DnbjjvbdjAQHApHK
+DncLKvbdJzpFxEAN
+DncKjvbdwtldpxlO
+EObjjvbdBraCtGWr
+EPDKjvbdJmADzGuB
+DoDLKvbdRadEkiZL
+DoCkKvbdAMhZTXZx
+DoCjjvbdqGDeUVaI
+DoCjjvbdVvhxWDdg
+EOcKjvbdSBceMIyL
+DnbkKvbdRkYfUfjs
+EOcLKvbdFWYpQMjF
+DoDLKvbdhlFENuCy
+EObkKvbdiCObeWpq
+DnbkKvbdHELWJaij
+EObkKvbdCTAcTfWr
+EPDKjvbdbrcLTdJa
+DoDLKvbdDncKkXDE
+DoCkKvbdmSYtzSdJ
+EOcLKvbdVZHszLPO
+DnbjjvbdhkdcmuCy
+DnbkKvbdLrXNZuQz
+EPDKjvbdZnmiFEzK
+EPCkKvbdlrZVZsEJ
+DnbjjvbdqmZixkhJ
+DoDLKvbdcTCjsdKB
+DoCkKvbdcyyPxYqC
+DoDKjvbdssRrxydc
+DoDKjvbdvPTzpjnt
+EObjjvbdZLqctOMN
+DoDLKvbdRNXbYnUz
+DncKjvbdJYUBglRQ
+EObkKvbdkIGlGFnL
+DoDLKvbdiUzEwSUb
+EPDKjvbdeEnrCWbj
+DoDLKvbdRbDdkhxk
+EObjjvbdYzcFqjWZ
+EOcLKvbdjggLfFnL
+DncLKvbdgQBzwEXh
+DoCjjvbdQlxByNtz
+DnbkKvbdoznDjwoA
+DnbkKvbdVgwuxHYz
+DoDLKvbdaaVdepQX
+DoDKjvbdLZRKSztf
+EPDKjvbdbUbHXkUI
+EOcLKvbdjhGkfFmk
+EObkKvbdeEoSBvcK
+DncKjvbdUtMtGMVj
+EPDLKvbdJTZAsMxM
+DnbkKvbdOEdUJJKd
+DoDKjvbdZHXEAPSi
+EObkKvbduaDyTPFI
+DnbjjvbdqAiFAWhE
+EObjjvbdelevgNKL
+DnbjjvbdTAEhgbPE
+DoDKjvbdnPzZVkZC
+DoDKjvbdQwNdDLhD
+DnbjjvbdnBjWwoNu
+EObkKvbdfMewGljL
+DncKjvbdrpVnjCuf
+EPDLKvbdLGFgbBRV
+EObkKvbdkCkkRHUg
+EObkKvbdTlVoAuoJ
+EPDLKvbdrMyjZMHi
+EOcLKvbdWHwuxHYz
+EOcKjvbdLrXNZtpz
+EObjjvbdbQHHDkzd
+EOcLKvbdfILWRnRH
+EPCjjvbdyfyMAMeX
+DncLKvbdNHCpNQVL
+EPCjjvbdFkEsDHlu
+DncKjvbdGGJqmhtR
+DnbkKvbdvAcxrndh
+DoCjjvbdqGDeTvBI
+DoCjjvbdJvUfDdgJ
+DoCjjvbdUVlPisaR
+DoCkKvbdqTsgSRkU
+EObjjvbdjblKpftg
+EObkKvbdtcDVXWPP
+DnbkKvbdfHkVqnRH
+DncLKvbdmoyxvLZC
+EObjjvbdkHfkfFnL
+EPDKjvbdwNWAMcdm
+EPCjjvbdJpzFOfNe
+DncKjvbdmbJvxOnV
+DncKjvbdTqQnuUgm
+EOcLKvbdTpqOuVHm
+DoCjjvbdYlSETmkm
+DoDKjvbdjEkGuPAO
+DoCkKvbdwygefXdr
+EObkKvbdrXPkcJYq
+DoCjjvbdxUleQyMO
+EOcLKvbdBsAcTfXS
+EPDLKvbdLBLGlbXq
+EObjjvbdmbJvwnnV
+DnbjjvbdbVCGwjsh
+DnbkKvbdxUmEpyMO
+EPCkKvbdYSlBNTnx
+DoDKjvbdeOeSkUTr
+DncLKvbdqmZixlHi
+EPCkKvbdNHCpNQVL
+DoCkKvbdDigjWXjA
+EObjjvbdrDeJQNvB
+EOcLKvbdJuuGDeHJ
+DoCkKvbdddnrCXCj
+DoDKjvbdqTtGqrKt
+DoDKjvbdeOeTKstS
+EObjjvbdySmiNRbH
+DnbjjvbdZshiYdTO
+EObjjvbdnCKXXnmu
+EPDKjvbdqiAKFMne
+DoDKjvbdNeEUIiKd
+DnbjjvbdzitpPdTU
+EPCkKvbdzaAOffal
+EOcKjvbdZtIiZDrn
+DoCjjvbdtSrTYyeD
+DoDLKvbdFVxopNJe
+DoDLKvbdJJdAJpHE
+DoDLKvbdHDjuiaij
+EObkKvbdUWMQKUAq
+EPDKjvbdTpqOuVIN
+EOcLKvbdqvpMChyR
+DoCkKvbdVviXudEg
+DoCkKvbdGLErbgmV
+EPCkKvbdZirhPfbG
+DoCkKvbdWXJYVceH
+DnbjjvbdhkeEOUcZ
+DncKjvbdSPtHJedX
+DncKjvbdFfKRnIsq
+DncKjvbdWWhxVdEg
+DoCkKvbdOStWHEuQ
+DoDLKvbdEuyQPmKF
+DncKjvbdrpVoKDWG
+DoCjjvbdKVtfEEfi
+DoCjjvbdWXIwudEg
+EPDKjvbdSCDeMIyL
+EPDKjvbdDoDKkXCd
+DoCkKvbdJpzEnenF
+EPDKjvbdaaWEfPow
+DoCjjvbdVwJXucdg
+EPCjjvbdauCHYKtI
+EOcLKvbdNeDshhkE
+DncLKvbdNGcQMpVL
+EOcLKvbdIryBSmXl
+DnbkKvbdTAFJICPE
+EOcLKvbdrMzKYlHi
+EOcKjvbdznopeDMY
+EOcLKvbdMRvmZuQz
+DncKjvbdeFOqbXCj
+DncLKvbdbhlijfWx
+EOcKjvbdqdEhpOWB
+DoDLKvbdUWMQJsaR
+DoDLKvbdptUGqrLU
+EObjjvbdaSGChUFk
+EPCjjvbdYTMAltOx
+DncKjvbdEPCkLWbd
+EOcKjvbdKCjDRKCx
+EPDKjvbdZyDjNcMS
+DncLKvbdFfKRnJUR
+EPDKjvbdrNZiyLhJ
+EOcKjvbdZeXfzgiC
+EOcKjvbdbUbGwkTh
+EPDLKvbdHfgZxwxH
+DncLKvbdrovOjCuf
+DnbjjvbdfNGWflik
+DnbkKvbdZoNiFEyj
+EPCjjvbddneTKtUS
+EObjjvbdRbDdlIxk
+EOcKjvbdKfFgbBRV
+EPDKjvbdFyUuBDxC
+EPCkKvbdiUzFXRtb
+EPCjjvbdrJAJeNPF
+DncLKvbdVAbRSqSZ
+EObjjvbdaNKbTVMg
+DoCkKvbdlhctQtqa
+DoDKjvbdZshiZDrn
+EPDLKvbdFkFSbglu
+EPCjjvbdHffyxwxH
+DncKjvbdTvLojTaR
+DnbkKvbdauCHXkUI
+DoDKjvbdGdKuiajK
+EOcKjvbdkClKqHVH
+EPDLKvbdnUtykKSG
+DnbkKvbdBiKbKhej
+DoDLKvbdHffzZXwg
+EPCjjvbdbrbkTcjB
+DoCkKvbdVwJYWDdg
+DncLKvbdJJdAJogE
+EPCkKvbdJvUfDdfi
+DoDKjvbdZeYGzgiC
+EObjjvbdZyEJnDMS
+EOcLKvbdmSZVZsEJ
+EPCkKvbdDnbjjvbd
+EPCkKvbdJvVGDeGi
+DoCjjvbdTXkLmzkY
+DnbkKvbdLqwNZuQz
+DncKjvbdZtIiYcsO
+DoDKjvbdLYqKSztf
+DnbkKvbdULuoBVni
+EObkKvbdiBnbeWqR
+EObjjvbdfILWRmqH
+DncKjvbdezvYdhsw
+DnbjjvbdJvUfEEfi
+EPCkKvbdRpUHKGDw
+EObkKvbdZGwEAPTJ
+EOcLKvbdcTCkUEKB
+EObjjvbdGAoQxizm
+DnbjjvbdNwoVzcmt
+DncLKvbdJbicRKDY
+DnbkKvbdGZVVAcxC
+EPCkKvbdRadFMJYk
+DnbjjvbdxsNiNRag
+DnbjjvbdiBncFXRR
+EPCjjvbdySmiNRbH
+DoDKjvbdeATqMxKG
+DnbjjvbdtSrSyZdc
+EOcKjvbdwtldpyLn
+EPDKjvbdqwPkbiYq
+EPDLKvbdzitpPcsU
+DoDKjvbdDjHiuwjA
+EPCkKvbdfMewGmKL
+DncKjvbdlrYtyrci
+EPCjjvbdZQldiMdq
+EPDKjvbdJbjDQjCx
+DncKjvbdqTsgRrKt
+EPCkKvbdEvZQPljF
+DoCkKvbdUsltGMWK
+EOcLKvbdEJgivXjA
+DnbkKvbdePFTLTtS
+EPDKjvbdEYYLstTl
+EPDKjvbdMfcPmPuL
+DoDKjvbdBsAcTevr
+EPDLKvbdwtleRZMO
+EObjjvbdRotHJfDw
+EOcKjvbdJuuFdFHJ
+DnbjjvbdZoOIeFZj
+DoDLKvbdsZlQSaHn
+EPCjjvbddoFTLTtS
+DncKjvbdbVBgXjsh
+EPCkKvbdaMkBrtlg
+EPDKjvbddiiqutzn
+EObkKvbdiZuFkpnG
+EPCkKvbdIxTaglRQ
+EOcKjvbduaEYrndh
+DnbjjvbdzQoMiJwA
+DoCkKvbdsCGNMHKy
+EObjjvbdMoxQunHT
+DnbkKvbdxwiJbPzL
+EOcLKvbdJbibpjCx
+DncKjvbdIxTbHkpp
+DoCkKvbdwuMeQxlO
+EOcKjvbdKeehCBRV
+EPCkKvbdZxdKNblS
+EPCjjvbdLFegbBQu
+DoCkKvbduLwwBUBX
+DoDKjvbdjlbMZeHP
+DoDLKvbdjAPfaPfj
+EObjjvbdqGEFTvBI
+EObjjvbdeAURNXif
+EObjjvbdxmrgxTJD
+EPCkKvbdqGDeUWAh
+DncKjvbdqTsfqrKt
+EObjjvbdjEjftoAO
+EOcKjvbdNrtWHFUp
+EObkKvbduCcUvvOo
+EPCkKvbdvwMAvBWV
+DncLKvbdtkwwBUBX
+DoCjjvbdVZHsyjnn
+EPDKjvbdQccBQQdS
+DnbkKvbdjgfkeemk
+EPDLKvbdFyVVBDxC
+DncLKvbdrNZiyMIJ
+EObjjvbdHfgZxwwg
+DoDKjvbdqceIomvB
+EPCkKvbdNGcPlouL
+DoCkKvbdCIkBkIej
+DoCjjvbdjKFhJmYS
+EObkKvbdBsBDUGWr
+EObkKvbdnQZxvKyC
+DnbjjvbdhzVFkqOG
+EPCjjvbdGLFScHlu
+DoCjjvbdtlXwAtBX
+DoDLKvbdUtMtFkvK
+DoCkKvbdBvzchdov
+DncLKvbdlZSrTZHU
+EOcKjvbdZnnJEdyj
+DncKjvbdYpleJMdq
+EPDKjvbdiMEcmtcZ
+EPCjjvbdfelZmgHA
+DnbkKvbdLhalRYAS
+DncKjvbdehLWRnRH
+DnbjjvbdeKJqvUzn
+EPCjjvbdqqtkOLBN
+EOcLKvbdfRaWzlDP
+DncLKvbdhtzFWquC
+EObkKvbdJvVFdFGi
+EObkKvbdMfcPlotk
+DoCjjvbdtcCuWvPP
+DnbjjvbdwtmFRZMO
+DoDKjvbdsPvPKCvG
+EPCjjvbdmfdwmOHZ
+EPDLKvbdMgDPlouL
+DoDKjvbdnGdwlnHZ
+DoCkKvbdVwJXudFH
+EObjjvbdQdCaQQcr
+DnbkKvbdYSkaNUPY
+DoCjjvbdULvPAuni
+EPCjjvbdSZihScWA
+DoCkKvbdBiLCKhej
+DnbkKvbdhXZAzzAJ
+EOcLKvbdQYmAGsRj
+EOcLKvbdZtJIyDrn
+DnbkKvbdNsTufduQ
+EOcKjvbdEXxMUTsl
+DoDLKvbdKyRJrzuG
+DoDKjvbdrWpLbhxq
+DnbjjvbdrDeIonWB
+EPDKjvbdHELViaij
+DoDLKvbdBdQBWJmG
+DncLKvbdRjyGUfkT
+EPDLKvbdYNqAYUut
+EPDKjvbdRXNdClID
+EPCkKvbdNwnuzdOU
+EOcLKvbdjmBkydfo
+DoCjjvbdrpWPKDVf
+EPCkKvbdZyEKNbkr
+EOcKjvbdQZNAHTRj
+EOcKjvbdwtmEpxkn
+DncLKvbdLhbMRYAS
+DoCjjvbdsrrTZZdc
+DncKjvbdxmrgxShc
+EPCkKvbdmozZVkZC
+EPCjjvbdbsDLTcia
+DoDKjvbdGKeScIMu
+EPCjjvbdrEFIpOWB
+EOcKjvbdmpZxukZC
+DoCkKvbdTkunaVni
+DoCjjvbddneSkUUS
+EPCjjvbdTlVoBWPJ
+DoDKjvbdxsNhmSCH
+EPCkKvbdVviXvDdg
+DnbjjvbdwzHfFwdr
+EPDKjvbdfMewHMjL
+DoCjjvbdbsDKtDjB
+EPDLKvbdUQpoVVIN
+EObkKvbdrEFJPmua
+EObkKvbdhlEcnUcZ
+DoDKjvbdZRMeIleR
+DnbjjvbdmajXYOnV
+DoDKjvbdaRfDHtGL
+DoCjjvbdbhljKewY
+DoDLKvbdDwwksssl
+DncLKvbdUMWOaVoJ
+DncKjvbdWWiYWDdg
+DoCjjvbdyXiJbQZk
+DnbkKvbdHDkVibKK
+EPCjjvbdtSrSxzEc
+EOcLKvbdaSGChUFk
+DnbkKvbdYSlBNUOx
+EPDLKvbdJTZBSmYM
+DoCjjvbdTkvOaWOi
+DncKjvbdMowpvNfs
+EPDKjvbdeEnqavcK
+EOcLKvbdiifIJlxS
+DnbkKvbdqceIpNua
+EPDKjvbdrNZixkhJ
+DncKjvbdiHKDZViu
+DnbkKvbdrDdiPnWB
+DncLKvbdLGFhCAqV
+DoCjjvbdwuMdqYlO
+EPCjjvbdePFTKssr
+EObjjvbdVBCQrpqy
+EObjjvbdbrcKsdKB
+DnbkKvbdBvzciEpW
+DoCjjvbdIHGyyXxH
+EObjjvbdrzLpTAhO
+EOcKjvbdemGWgNJk
+EObkKvbdVZHtZjnn
+EOcKjvbdiCObeXRR
+EPCkKvbduoTzpkPU
+DoCkKvbdrNZjYkgi
+DnbkKvbdTAEhgand
+EOcKjvbdhuZdwRuC
+DoDLKvbdWWiXuceH
+EPDKjvbdZoOIddzK
+DncLKvbdVAbRSprZ
+DnbjjvbdhgKDZWJu
+DoCkKvbdVZITykOn
+DoCkKvbdiGibyWKV
+EPDLKvbdwyhGGYFS
+DoDKjvbdiHKCxvJu
+EPDLKvbdhyuGLpnG
+EPDKjvbdOAJStKSA
+EOcKjvbdzitpPdSt
+DoCkKvbdzROlhjXA
+DoDLKvbdtTSSxzEc
+DoDKjvbdzoQRFCkx
+DnbkKvbdxnSgxShc
+DnbjjvbdiBoDFWqR
+DoCjjvbdnBjWwoNu
+DncLKvbdVYhTzKnn
+DncLKvbdkIGkefNk
+DnbkKvbdlqxuZsEJ
+EOcLKvbdACrYJzIp
+EPDKjvbdmaiwYOnV
+EOcKjvbdYkrEUNlN
+DoCjjvbdVUNTfLuj
+DoDLKvbdfHkWSOQg
+DnbkKvbdBraCsfXS
+EOcKjvbdMJBkpxAS
+DoDKjvbdcyyQXyQb
+EObkKvbdeEnrCXDK
+EObkKvbdFejSNiTq
+DoCjjvbdEYXkstTl
+EPDKjvbdyYIjBpZk
+DncKjvbdiHJcZWKV
+DncKjvbdQdDAoqDr
+EObkKvbduDDUvvOo
+EPCkKvbdzGyMANEw
+DoDKjvbdQvnECkgc
+DncKjvbdVviXudEg
+DoDLKvbdQZNAHTSK
+EPDKjvbdkCkjqHUg
+EObjjvbdwyhFeweS
+DoCjjvbdxwiJbQZk
+EOcLKvbdEPDLLXDE
+DncLKvbdVrNwbFLc
+DoCkKvbdjAPgBPgK
+EOcKjvbdpstGqqjt
+EPDLKvbdHDkVjCKK
+DncKjvbdirzhrjiz
+DnbjjvbdxrnJNSBg
+EPCkKvbdraelkgLZ
+DncLKvbdptTgRqjt
+DoCkKvbdIsYaTMxM
+DoCjjvbdMpXqVnGs
+DoDLKvbdUVkoitBR
+DoCkKvbdjmCLyeHP
+DoCjjvbdiVZeWquC
+DoCjjvbdVUMtFlWK
+EPDLKvbdxKvdHzzG
+DoDKjvbdiMEdNuCy
+EPDKjvbdwzIFfYEr
+EObjjvbdJXsagkpp
+EPCkKvbdxrmhmSBg
+DoDKjvbdlqxuZsDi
+EPDKjvbdsQVoJcVf
+DnbjjvbdEYYLstUM
+DncLKvbdkHgLfGNk
+EPCjjvbdbsDKtDjB
+DnbjjvbdJcKDQibx
+DoCjjvbdyzdnSIIh
+DnbkKvbdrpWOjCuf
+EObjjvbdbAudeopX
+DnbkKvbdYkqctNlN
+EPDLKvbdfHkWRnRH
+EPDLKvbdXmqAYUut
+DncKjvbdFyVVBEXb
+DnbkKvbdrDdhpNua
+DncKjvbdeAURNXjG
+DoCkKvbdOTUVgEuQ
+EPCjjvbddwyssrFz
+DoCjjvbdMpYRWNfs
+DoCkKvbdjuvnDaww
+DnbkKvbdVhXvXgYz
+EObjjvbdTulQKTaR
+EObjjvbdOAJTUJrA
+EPDLKvbdsZkosBIO
+DoCkKvbdhgJbxvKV
+EPCjjvbdnBivxOnV
+DncKjvbdxrnIlrCH
+DncLKvbdzaAPHGbM
+EPCkKvbduMXvaUBX
+DnbkKvbdSBceMJZL
+EObjjvbdJpzEoGOF
+DnbkKvbdWexytAPT
+DnbkKvbdkVwNcaxX
+EOcLKvbdEYYLsstM
+DoCkKvbdRosfiedX
+EOcKjvbdwuMdpyMO
+EObjjvbdUsmUFlWK
+EObjjvbdjuwOECXw
+DncKjvbdqlzJxkgi
+DoCkKvbdiHJbxujV
+EPDLKvbdakMFoNcA
+EOcLKvbdmIcsqUqa
+EPCkKvbdeKKSVtzn
+EPCkKvbdvBEZTOeI
+DncKjvbdpstHSRjt
+EOcKjvbdKVuGEEfi
+DoDLKvbdZQldiNFR
+EPCjjvbdxnTIYShc
+EOcKjvbdtunXjQsA
+EPDKjvbdjcLkRHVH
+DncKjvbdDoDLLXCd
+DnbjjvbdZyEJnDMS
+DoDLKvbdFkFTCgmV
+EOcKjvbdhkddOUby
+EPDLKvbdNeEUJIkE
+DnbkKvbdyzeNqghh
+EPDKjvbdFVxopMjF
+EOcKjvbdGdLVibKK
+DncKjvbdBdQAvJlf
+DoDKjvbdbiNKLFwY
+EPCkKvbdnGeYNNgZ
+EPDLKvbdEYXlUTsl
+DncLKvbdOEcsiIjd
+DncKjvbdKaLHMbYR
+DncKjvbdyTOIlrCH
+EPCkKvbdMpXpumgT
+EPCjjvbdtbbtwVno
+DoDKjvbdrRtkOLAm
+EObjjvbdbLLfPNcA
+DncKjvbdjmCLydgP
+DnbkKvbdTkuoBVoJ
+DnbkKvbdSCDdlJYk
+EObkKvbdCEPaVjNG
+DoDLKvbdFaOpxizm
+EPCjjvbdfMevgMjL
+DoCkKvbdYzcGRjVy
+DnbjjvbdKRZdoGNe
+EPDLKvbdZisIQHCG
+EOcLKvbdZMSEUOMN
+DoCjjvbdiGibxuiu
+EPDLKvbdZQmFJMeR
+DoCkKvbdsBemLfjy
+DncLKvbdzoPqEcMY
+DncLKvbdMoxRWOGs
+EOcLKvbdFeirOJUR
+DoDLKvbdpyOgfpdY
+DncLKvbdyzeOSIJI
+DoDLKvbdRkZFuHKs
+DnbkKvbdxVNEqZLn
+DoCjjvbdMgDPmPuL
+EPDKjvbdZQmEhmFR
+DncKjvbdBraDUFwS
+DoCkKvbdqqtjmkAm
+EPDLKvbdLZQirzuG
+DoDLKvbdlYsRryGt
+EOcKjvbdKaLHNBxR
+EOcKjvbdTqQoUthN
+EObkKvbdhbObeXRR
+EPDKjvbdJutfDeGi
+DoDLKvbdRkZFuGkT
+EOcKjvbdrbGNLgKy
+DnbjjvbdmpZyWKyC
+EPDKjvbdHELVjBij
+EPCjjvbduDDUvuoP
+EOcKjvbdrDeIonWB
+DoCjjvbdnPyyWLZC
+EPDKjvbddndrjtUS
+EObjjvbdjuvnDbYX
+EPDLKvbdCIkBjhfK
+EObkKvbdZjTHogCG
+EOcKjvbdjJehKNYS
+DnbkKvbdSxLMNzkY
+DoDLKvbdKDKDRJcY
+EPCkKvbdmpZxvKxb
+DnbjjvbdssSTYyeD
+EObjjvbdHDkVibJj
+DnbkKvbdSLZFtgLT
+DoCjjvbdxnTIXriD
+DnbkKvbdcSbjsdJa
+DoCkKvbduoTzpjoU
+DoCjjvbdXsLaNUOx
+DoDLKvbdcScKtEJa
+DnbkKvbdfpBzwDwh
+EPDKjvbdjlakyeGo
+DnbjjvbdYzcFqivZ
+DncLKvbdCIkBjiGK
+EPDLKvbdxZhFfYFS
+EObjjvbdrEFJQNvB
+DoDLKvbdjAPgBQHK
+EOcLKvbdkDLjqHUg
+DoCkKvbdiUzFWqtb
+DoCkKvbdKVtfDdfi
+DoDLKvbdwkXEHzyf
+EObjjvbdqcdhpOWB
+EPCkKvbdeEnrBvbj
+DoCkKvbdCTAbsewS
+DnbjjvbdNHCpMouL
+DoDKjvbdSQUGiecw
+DoDLKvbdelevfmKL
+DoCkKvbdySnImSCH
+DncKjvbdANIZSvzY
+DncKjvbdrJAJeNPF
+EPCjjvbdqTtGqqjt
+EObjjvbdaRfDHsfL
+EPCkKvbdrJAJeMne
+EPDKjvbdiGjDYvJu
+DoDKjvbdMgCpMpVL
+DncKjvbdZjTIQHCG
+EOcLKvbdJYTbILqQ
+DoCkKvbdzoPqEbkx
+EPDLKvbdvlvANDeN
+DncLKvbdatafwjsh
+DncLKvbdJuuFcdgJ
+DncLKvbdwXMAvBWV
+DoDLKvbdaMjbStmH
+DoCkKvbdeOdsLTtS
+DoDKjvbdbLLeoNcA
+EPDKjvbdJKEAJpGd
+DnbjjvbdZnnIeEyj
+EOcLKvbdunszpjnt
+EObkKvbdmoyyWKxb
+EObkKvbdILazmvpk
+EPDKjvbdQlwbYmtz
+EPCjjvbderAvzkcP
+EObkKvbdegjvSORH
+EOcKjvbdsrqsYydc
+EOcKjvbdfIKvSORH
+DnbkKvbdFjdsDIMu
+EPDKjvbdpstHRqjt
+EOcLKvbdWRmxCElD
+EOcLKvbdkHflGFnL
+DoCjjvbdZjTHofbG
+EObjjvbdeEoSBwCj
+EPCkKvbdJSyBTNXl
+DnbkKvbdUaCRTQqy
+EPDKjvbdSLZFtfkT
+DncKjvbdyNrgwsJD
+DoDKjvbdezuxdiUX
+DoDLKvbdACrXiyhp
+DoDLKvbdxwiJaoyk
+EOcKjvbdUxhTzLOn
+DnbjjvbdnHFYNNfy
+EOcLKvbdhanbeWqR
+DoDKjvbdzHYlAMdw
+DoCjjvbdKyRJrzuG
+DncLKvbdliETpuRa
+EObkKvbdczYpXyRC
+DoDKjvbdFfKRnIsq
+EPDKjvbdVAbQsRSZ
+DncKjvbdezvZEiUX
+DoCkKvbdZisHofbG
+EPDKjvbdjKFgilxS
+EOcLKvbduVmxKQsA
+DnbjjvbdhuZeWrUb
+EObkKvbdGYuUaDxC
+DoDLKvbdaaWFGPpX
+DnbkKvbdUQpoVUhN
+EPCjjvbdZxdJmcMS
+DncKjvbdhbPCdwRR
+EObkKvbdZRMeJNFR
+DnbjjvbdTlVoBWOi
+DoCkKvbdatbHYKtI
+EObkKvbdiHJbxvJu
+DncKjvbdsQWOjCvG
+DncLKvbdRosfjGEX
+EObkKvbdREDBQRDr
+EOcLKvbdeEnqawCj
+EPDLKvbdGZVUaEXb
+EPDLKvbdIryArmXl
+EObjjvbdiiehJlwr
+DoCkKvbdMJCMRYAS
+DnbkKvbdlrYtzTDi
+DoDLKvbdnGeXlmfy
+DoCkKvbdSCDeMJZL
+EObkKvbdLFegaaRV
+DoDKjvbdGGKRmhsq
+EObkKvbdiLdcnVDZ
+DnbjjvbdGBOqZJzm
+DnbjjvbdhfjCxvKV
+EPCjjvbdlBNPNALA
+EOcKjvbdtbbuXWPP
+DncLKvbdEPCjjwDE
+DoDLKvbdLqwNZtpz
+EPDLKvbdbVCGwkUI
+DncLKvbdZyDimcLr
+DncLKvbdfILWSNpg
+DoDKjvbdFVyPpNJe
+DncKjvbdqiAJeMoF
+EOcKjvbdqrVLOLAm
+DoCjjvbdehKuqnQg
+DoDLKvbdGLFTCglu
+DoCjjvbdXrlBMtPY
+DncKjvbdlYrrTYgU
+EPCkKvbdWSNxCFMD
+DncKjvbdUVkoitAq
+DncLKvbdfHjvSORH
+DoCkKvbdCEPaWKMf
+EObkKvbdmbJvxPOV
+EPDKjvbdwzHefXeS
+EOcKjvbdvvlAvAuu
+DncLKvbdpxngfqDx
+DnbjjvbdIwtCIMQp
+DncKjvbdHDjvKBjK
+EOcKjvbdjmCLzFGo
+DnbkKvbdZMRdTnMN
+EObjjvbdEOcLLWbd
+DoDLKvbdkNBlZdfo
+EPCjjvbdemGXHNKL
+EOcLKvbdkxrqryGt
+EOcKjvbdsPvPKDWG
+EOcKjvbdXsMAlsoY
+DnbkKvbdmIcspuSB
+DoCjjvbdUaBpsRRy
+EOcLKvbdSPsfiedX
+EOcKjvbdSCEEkiYk
+DncKjvbdWXJXudEg
+DncLKvbdRyigrbvA
+DoDLKvbdUMVoAvOi
+DnbjjvbdZtIhxcsO
+EOcLKvbdJXsbHkpp
+DnbkKvbdZtIhyETO
+DncLKvbdHlBzmvpk
+EObkKvbdzHZMAMeX
+EPDKjvbdKCjCpjDY
+EOcKjvbdjblKqHUg
+DoDKjvbdGGJrNiUR
+DoDLKvbdrEFIomvB
+EPCkKvbdrovPKDVf
+DoDKjvbdpxnhGpdY
+EPDKjvbdemGWgNKL
+EPDLKvbdTlWPAuoJ
+EOcLKvbdhuZeWqtb
+DnbkKvbdhyuGLpnG
+EObjjvbdSBcdlJZL
+DnbkKvbdeEnqbWcK
+DnbjjvbdJKEAJofd
+EObjjvbdbQGfckzd
+EPCjjvbdRkYeuHLT
+DoDLKvbdXrlBMtOx
+EObkKvbdznoqFCkx
+EPDLKvbdjggLfFnL
+EPDKjvbdhuZdwSVC
+EPCkKvbdeEoRbXDK
+EPCkKvbdKaKgNCYR
+DoDLKvbdWWhxWDdg
+EPCjjvbdqUTfqqjt
+EOcKjvbdcSbkTdJa
+DncKjvbdauCHXjtI
+DoCkKvbdQlwbZNtz
+DnbjjvbdqvolCiYq
+EOcLKvbdePFSjstS
+EOcKjvbdhgKDZWKV
+EObkKvbdCgLfHAzc
+DncKjvbdnUuZkKSG
+DnbjjvbdlhctRUrB
+DoDKjvbdpyPHgREY
+DoCkKvbdjJegimXr
+EPDKjvbdfHkVrORH
+EPDKjvbdyTOIlqbH
+EPDKjvbdjKFhKNYS
+EPDKjvbdFWZPpMie
+EPCjjvbdIwsahLpp
+EObkKvbdKfGIBaQu
+DncKjvbdGFirOJTq
+DnbjjvbdpedFUWBI
+EPCkKvbdNeDshiKd
+EObjjvbdBiLBjhej
+EObjjvbdCJKbLJFj
+DncKjvbdvwMAuaWV
+DnbjjvbdZRMdhleR
+DncKjvbdhgKCyViu
+DoCkKvbdhficZWKV
+DnbjjvbdwkWdHzyf
+DncLKvbdVBBqSprZ
+EOcLKvbdUsmTelVj
+EOcLKvbdFxuVBEYC
+DoDKjvbdKaLHMbYR
+EPCkKvbdGdKuiaij
+EPDKjvbdfIKvRnQg
+DncKjvbdfekzNfgA
+DoCkKvbdJbicRJbx
+EOcKjvbdIwsagkpp
+DncKjvbdOEctIiKd
+DncKjvbdOTUVfduQ
+EPCkKvbdFWZPomKF
+EObjjvbdezvZFJUX
+DoCjjvbdtSrTYzFD
+DoCkKvbdbVCHYLTh
+EPDLKvbdZMRdUOLm
+DoDLKvbdNwoVzdNt
+EPDLKvbdFaPRZJzm
+DoCjjvbdxZhGFweS
+EPCjjvbdZQmFImFR
+DnbjjvbdsQWOibvG
+DoCjjvbdSBdFMIxk
+EPCkKvbdEObkKvcE
+DoDKjvbdqFcdsvAh
+EOcKjvbdezuyEhsw
+DnbkKvbdVqnXaeMD
+EObjjvbdnGeXlmgZ
+DncLKvbdCIkBkIfK
+EPDLKvbdpecdtWAh
+EPDKjvbdsQVnjCvG
+DoDKjvbdkDMLQfuH
+EObjjvbdAMhZTWzY
+EPCjjvbdiCObdvqR
+DoDKjvbdUWLoisaR
+DncLKvbdSPtHKGDw
+EObjjvbdaNLBrtmH
+EPDKjvbdUyHszKoO
+DoDKjvbdQwNccLhD
+EPDLKvbdnVUzKjRf
+DoCkKvbdRyigrcWA
+EOcLKvbdbiNKLGXY
+DncKjvbdlhctRVSB
+DoCkKvbdNPxRWNfs
+EObjjvbdANHxsXZx
+DnbjjvbdNrsvHEuQ
+EPCjjvbdmbJvxPNu
+EOcKjvbdJvVGEFGi
+EPDKjvbdUWLoitAq
+DoCkKvbdkDMKpfuH
+EOcLKvbdfjfzbfAE
+EOcLKvbdczZQYZRC
+DoDLKvbdQwNcblHc
+EObkKvbdOTTugEtp
+DncKjvbdbUagYLTh
+EPCjjvbdfNGWfmKL
+EObjjvbdiVZdvrUb
+DncLKvbdZyDinDMS
+EPCkKvbdmaiwYOmu
+EOcLKvbdqUUHSRkU
+DncLKvbdDncKjvbd
+DoCkKvbdVqmxCElD
+EPCkKvbdaRfDIUFk
+EOcKjvbdjKGIJlxS
+DncLKvbdkxrrTZHU
+DncKjvbdypnmIjXA
+DoDLKvbdJpyeOfOF
+DoDLKvbdwXMBVaVu
+DoDKjvbdKfFhCAqV
+DoCjjvbdIxTahLqQ
+EOcLKvbdADSYKZiQ
+DoCkKvbdMowpunHT
+EOcKjvbdgKfzbfAE
+EPDKjvbdhkddOVDZ
+EPDLKvbdemFwHMik
+EPCjjvbdUVlQKTaR
+DncLKvbdRWnECkhD
+DnbjjvbdkWXODbYX
+DoCjjvbdZeYGzghb
+DoCkKvbdSKyFtfkT
+DoDLKvbdBhkCLJFj
+DncKjvbdlhdTqVRa
+EPDKjvbdqqtjmjaN
+DoDLKvbdZjTHofbG
+EPDLKvbdJmADzHVB
+DoDLKvbdSBceLhyL
+EObjjvbdqwPlCiYq
+DncLKvbdYORAXtvU
+EPDLKvbdZnnJEdyj
+DoCjjvbduWNxKQsA
+EPDKjvbdWSNxCElD
+DoCkKvbdRjyFtgLT
+DoCkKvbdeOeSkUUS
+EOcKjvbdDihKVxKA
+EObjjvbdffLymgHA
+DoDLKvbdcScKsdKB
+EPDLKvbdlYsSSyGt
+DnbjjvbdGKeTDINV
+DoDLKvbdCTBCtGXS
+EObjjvbdEASIlyvw
+EPDLKvbdfMfWfmKL
+DoCkKvbdpstGqrLU
+DncLKvbdtlXwAsaX
+DoDKjvbdNrsvHEuQ
+EObjjvbdCTBDTfXS
+DoDKjvbdkMalZeHP
+DoDLKvbdQccBPqDr
+DnbkKvbdYqNEiNEq
+DnbkKvbdvBDyTOeI
+DnbjjvbdLAkGmBxR
+EObkKvbdLiBlRYAS
+EPCjjvbdTukpKUBR
+EObkKvbdhuZeWqtb
+DoDLKvbdZyEJmbkr
+DnbjjvbdxrmiNSCH
+EPCjjvbdKWVFdFHJ
+EPCjjvbdRWmcblID
+EPCkKvbdsQVoJcVf
+EPCkKvbdGcjuibJj
+DoCjjvbdJuteceHJ
+DnbjjvbdLLAhWAJy
+DncKjvbdULunaWOi
+EOcLKvbdHlBznXQk
+DoDKjvbdvBDxroEh
+DoDKjvbdzaAPHGbM
+DoDLKvbdUyITyjoO
+DnbkKvbduaDxroFI
+EObkKvbdAMhZSvzY
+EObjjvbdDoDKkWbd
+EObkKvbdGKdrbhNV
+EPCkKvbdmgFXlnGy
+EOcKjvbdzdzOzdzQ
+EPCkKvbdKkBHvAJy
+EOcKjvbdqAiFAWhE
+DoCjjvbdQvmdClID
+DncKjvbdMtsSKmAX
+EObjjvbdziuPpETU
+DoDKjvbddZyQYZQb
+EPDLKvbdauBgXkTh
+DnbkKvbdnCJvwnmu
+DoCjjvbdxUmFQyMO
+DncKjvbdXGYzUAPT
+EPDLKvbdOAJTUKSA
+DncKjvbddZyPwxqC
+EOcKjvbdqlzKYlIJ
+DnbjjvbdkVvnDaww
+DnbjjvbdZdxGzhIb
+DnbkKvbdDwxLtTsl
+EObkKvbdGKdrcHmV
+DncKjvbdTAFJHbOd
+DoDKjvbdEObkKvcE
+DnbkKvbdaNLCSuNH
+DoDLKvbdDxYLtTtM
+EObjjvbdVZIUZjnn
+DoCkKvbdNsUVfduQ
+EOcLKvbdGGKRmhtR
+EPDKjvbdbKlFnmcA
+DncKjvbdvvlAvBWV
+DoCjjvbdliEUQtrB
+DnbjjvbdjgfkfGNk
+EPDKjvbdlYsSTYft
+DoDLKvbdbKlGOnDA
+EPDKjvbdjAPfaPfj
+DnbkKvbdzGyMAMeX
+DoCjjvbdZnmhddzK
+EPCkKvbdIMBzmwQk
+EObkKvbdjEkHVPAO
+EPCkKvbdQccBPpdS
+EPCjjvbdhgKCxvJu
+DncLKvbdVgxVxHYz
+EOcKjvbdxVNFQxkn
+DoDKjvbdbLMGPNcA
+DncLKvbdGckWJajK
+DnbkKvbdrMyiyLgi
+EOcLKvbdKefICApu
+DoCjjvbdqFdEtWBI
+EPCkKvbdYSlBNUPY
+DoCjjvbdIwsbILpp
+EPCjjvbdmgFYMnHZ
+EObjjvbdQvmccMID
+DncLKvbdURQntthN
+EOcLKvbddxZtUSFz
+EPCkKvbdhtzFWqtb
+EOcKjvbdVBCRSpqy
+DncKjvbdtbbtvvOo
+EPCkKvbdczZQYZQb
+DnbjjvbdQwODcLgc
+EPDLKvbdtunXipsA
+DncLKvbdBhjajhej
+DoDKjvbdNrtVfduQ
+EOcLKvbdKWUfDdfi
+EObjjvbdpstHRrLU
+DnbjjvbdznpRFClY
+EPCjjvbdfNFvgMik
+DoCjjvbdUsltGLvK
+DnbjjvbdlqyVZsDi
+DoCkKvbdNPwqWOHT
+EOcLKvbdakLeoNcA
+DoDKjvbdsCGNMGkZ
+EPDKjvbdaRfDHsfL
+DoDKjvbdZtIhyDrn
+EPDLKvbdOStVgFUp
+EPCkKvbdeATplxKG
+DncLKvbdySmhlrBg
+DoDKjvbdnCKWwoOV
+DnbjjvbdDncKjvcE
+EOcLKvbdwzIGGXdr
+EObjjvbdmIdTqVSB
+DnbjjvbdUGznLwVe
+DncLKvbdTkvOaWPJ
+DncKjvbdyOSgwsIc
+DncKjvbdjmCLzFGo
+DoDLKvbdpssfqqkU
+EPDKjvbdmtuZjirG
+EOcKjvbdOFEThhkE
+DoDKjvbdIMBznWqL
+EPCkKvbdJvVFcdfi
+EPDKjvbdnBivxOmu
+EObkKvbdTvLojTaR
+DoCkKvbdMRwNZtpz
+EObjjvbdEARhlzXX
+DnbjjvbdcScLTcjB
+DncKjvbdxmrhXrhc
+DoDKjvbdEvZQQNKF
+DncLKvbdGLErcHmV
+DoDLKvbdFkFTChMu
+DoCkKvbdOFETiIkE
+EPDKjvbdnVUzLKRf
+EPDKjvbdmuUzKjSG
+EPCjjvbdwuNFQxkn
+DncLKvbdeATpmXjG
+EObjjvbdxUmEpxkn
+EPDKjvbdcSbkTcjB
+EPCjjvbdmbKXXoNu
+EPDKjvbdSQUHKFdX
+DoDKjvbdCTAbsewS
+EOcLKvbdVwJYVdFH
+DoDKjvbdZtIiYcsO
+EPDKjvbdhkeENtcZ
+EObkKvbdGBOpyJzm
+EPCkKvbdRMxCYmtz
+DoCjjvbdzjVPocsU
+DoDLKvbdrDdiPnWB
+EPCjjvbdFjdsDIMu
+DoDLKvbdSLZGUgLT
+EPDLKvbdKefHaaQu
+DoDKjvbdKCibpicY
+EOcLKvbdijGIJmYS
+EObjjvbdelfWgNKL
+DnbkKvbdbhmKKfWx
+DoDKjvbdSQUHKGEX
+EPCkKvbdnGdxMmgZ
+DncLKvbdJJdAKPgE
+EPDLKvbdmRyUyrdJ
+EOcLKvbdhzUfLqOG
+DoDKjvbdLAjgMaxR
+DoDKjvbdRosfjGEX
+EObkKvbdpssfqqjt
+DnbkKvbdjAQHAofj
+DncLKvbdidkHUoAO
+DoCkKvbdCIjbLIej
+DncLKvbdelfWfmKL
+DoDLKvbdxUleQxkn
+EPDLKvbdEvZQPljF
+DncLKvbdJbjDQjCx
+DncLKvbdyOTIXriD
+DoDKjvbdTulPjUAq
+DnbjjvbdJSyAsNYM
+EOcLKvbdbBVeGQQX
+EPCjjvbdbKkenmcA
+EPCjjvbdiGjDZWJu
+DncLKvbdcSbjsdJa
+EObkKvbdZtJIyDsO
+DoDLKvbdrafMkgLZ
+DoCjjvbdiMFDmuDZ
+DnbkKvbdnUtyjirG
+EPDKjvbdfNFvflik
+DoDLKvbdrWokcJZR
+DncKjvbdWWhxWDdg
+EPDLKvbdNeDtJJKd
+EOcLKvbdqlzKYkhJ
+DncKjvbdSQUHKGDw
+DoCkKvbdkHflFfOL
+EPCkKvbdRXNdDMID
+DncLKvbdSLZFtfkT
+EOcLKvbdZQldiMeR
+DnbjjvbdSBdElJYk
+DncLKvbdwWlBVaWV
+DoCjjvbdhzUfLqOG
+DoDLKvbdmJEUQuSB
+DnbjjvbdULvPBVoJ
+EPDLKvbdYkrDtOMN
+EPDKjvbdHEKujBij
+EObjjvbdJuuGDdfi
+EObjjvbdzaAOgGbM
+DncLKvbdkClLRHUg
+EObkKvbdYTMAmToY
+EObjjvbdxVMeQyLn
+DoDKjvbdrEFJQNua
+DncKjvbdYSlBNTnx
+DnbjjvbdrSUkOLAm
+EOcLKvbdrylQTBIO
+DnbjjvbdrouoKDVf
+DoDLKvbdwWkaVaVu
+DoCkKvbdZQmFIleR
+EPCjjvbdiLeENtby
+DoCjjvbdrDeJQNua
+EObjjvbdIGfzYxXg
+DoCkKvbdySmiMqag
+EOcKjvbdbVBgYLTh
+DoDKjvbdLFehCApu
+EPCkKvbdCDpAvJmG
+EObkKvbdZLrDtOLm
+EPCkKvbdZnnJEdyj
+EPCjjvbdZjSgpGbG
+EOcKjvbdWSOYBdkc
+EPDKjvbdwtleQyLn
+DnbkKvbdmJDtQuSB
+EObkKvbdkWXODbXw
+DncKjvbdezuyEiTw
+EObjjvbdnBjWwnmu
+EPDKjvbdZxdJmcMS
+EPDKjvbdrbGNMHLZ
+EObkKvbdEYXlTssl
+DnbjjvbdyTOJNRag
+DnbkKvbdGZVVAdYC
+EPCjjvbdTYLMNzkY
+DncLKvbdJcJcRKDY
+EOcLKvbdYpmEhldq
+DoCkKvbdjKFgjNYS
+EPDLKvbdJbibqKCx
+EPCjjvbdyTNiNSCH
+DoDLKvbdGGKRmhsq
+EPDLKvbdLAkGmCYR
+EPDLKvbdCEPaWKMf
+DoCkKvbdZsiIyDsO
+EPCjjvbdjbkkRGuH
+DnbkKvbdqYoHgREY
+DoDLKvbdZMRctNkm
+EObjjvbdDjIJvYKA
+DncKjvbdVqnXbEkc
+EPCkKvbdiHKCyViu
+EOcKjvbdkHflGFmk
+DoDKjvbdOFDsiIjd
+EOcLKvbdVrOYCEkc
+EPCjjvbdhtydvrUb
+DoDLKvbdrNZjYlHi
+EPDKjvbdVwIxWDeH
+EObkKvbdhyuFlRNf
+EPDLKvbdSKyFuHKs
+DoCkKvbdBhjajiFj
+DoDKjvbdhanbeWpq
+DncKjvbdGGJqnJTq
+EPDKjvbdZtJIyETO
+EOcLKvbdANIZSvzY
+DnbkKvbdptUHSSLU
+DoDLKvbdRDcBPpdS
+DoDKjvbdBcpAujNG
+DnbjjvbdaaVdeopX
+DnbjjvbdhtydvrUb
+DoCkKvbdkWXNcaxX
+DncLKvbdrNZjYkgi
+EPCjjvbdBiKajiGK
+EObkKvbdwkWcgzzG
+EPCkKvbdRDcApQcr
+DncLKvbdfekzNgHA
+DoDKjvbdiBoCdwRR
+EOcLKvbdIBlZdzAD
+DnbkKvbdZLqcsnMN
+DoDKjvbdatbGwkUI
+EObjjvbdmgFXlmfy
+EPDLKvbdxUmEqYkn
+EPDLKvbdauBfxKsh
+EObjjvbdsPvOjDVf
+DnbkKvbdkVwNdBww
+EPCkKvbdzaAPGfbM
+EOcLKvbdRotGjGDw
+EPCkKvbdqceJPmua
+EPDLKvbdZyDinCkr
+EObkKvbdCDoaWKMf
+EOcKjvbdjmCLzEgP
+EPDKjvbdHlBznXRL
+DncKjvbdeOeTLTtS
+EPCjjvbdGZUuBEXb
+DnbkKvbdqTtHRqjt
+EOcLKvbdFyUuAdXb
+EPDLKvbdEARiMzWw
+EOcKjvbdFeirNiUR
+DoCkKvbdzjUoocsU
+EOcLKvbdEztQdlCi
+DncLKvbdKCjCpibx
+EPCjjvbdxZhGFxFS
+EObjjvbdwWkaWAvV
+DnbkKvbdaaWFFoow
+EOcKjvbdBsBDUGXS
+EPDLKvbdmIdUQuRa
+DncKjvbdVAbRTRRy
+DoCkKvbdHffyxxYH
+EObjjvbdDGkfHAzc
+DoCkKvbdiCPDFXRR
+EPCkKvbdVrNwbEkc
+EPCkKvbdiGjDYvKV
+DnbkKvbdIMBzmvpk
+EPCkKvbdKxqJrztf
+DncLKvbdmIctQuSB
+EOcKjvbdaSFbhUGL
+DoCjjvbdmbKWwnmu
+DoCkKvbdiUyeWrVC
+DncKjvbdGGKRmhsq
+DoCjjvbdehLVqnQg
+DncLKvbdTkunaVoJ
+DnbjjvbdGZUtaDxC
+EPCjjvbdtSrSyZeD
+DoDLKvbdjbkkQfuH
+EOcLKvbdOFDtJJLE
+DnbjjvbdBdQAvJlf
+DoCkKvbduDDVWvPP
+EOcKjvbdZtJIyDsO
+DncLKvbdQccBPpdS
+DncLKvbdiUzEvquC
+EPCjjvbdvvkaWAuu
+DoDLKvbdZoOIeEzK
+DnbkKvbdkCkkRGuH
+EOcKjvbdRkZGVHLT
+EObkKvbdtcCuXVno
+EPCjjvbdMpYRVnGs
+DoDKjvbdFfJrNiTq
+DnbkKvbdZnmiFFZj
+EPDLKvbdbhmKKfWx
+DoDLKvbdDjHivXjA
+DoDLKvbdiLeDnVDZ
+EOcLKvbdUQqOtthN
+EPDKjvbdZHXEAOri
+EObkKvbdvAdYrndh
+EObkKvbdQlwaxnUz
+DoCjjvbdQwOEDLhD
+EPDLKvbdqrVKnLBN
+EObjjvbdwtmFQxkn
+EPDLKvbdTfznMWvF
+DnbkKvbdaMjasVNH
+EPCjjvbdcyyQXxpb
+DncKjvbdMfcQMpUk
+DnbjjvbdZnmheEzK
+DncLKvbdbrbkUDia
+DncLKvbdiCOcFXRR
+DoCjjvbdZxcimblS
+EPDLKvbdRkYfVHKs
+DncKjvbdDoDKjvbd
+EOcKjvbdGAnpxizm
+EOcKjvbdYpldhldq
+DnbkKvbdQwOEDMID
+DnbjjvbdcyxoxYpb
+DoCjjvbdakMGOnDA
+EPCjjvbdLAkGlawq
+DncKjvbdJJdAKPfd
+EOcLKvbdxrnImSBg
+DoDLKvbdNddUJIjd
+DncLKvbdfIKvRmpg
+DoCjjvbdiZuGLqOG
+EOcLKvbdeAURMwif
+DncLKvbdiCPCeWpq
+DoCjjvbdGcjvKBij
+EPDKjvbdRDcBQQdS
+EPCjjvbdUtMtGLvK
+EPDKjvbdyXhjBoyk
+DoDKjvbdqZOgfpcx
+EObjjvbdYTMAmUPY
+DoDLKvbdiCObeXQq
+DncKjvbdmJDtRUqa
+EObkKvbdSCEElIyL
+EObkKvbdNGbpMouL
+DoCkKvbdEzsqElCi
+EObjjvbdOStWHFVQ
+EPCjjvbdjmBlZdfo
+EPDKjvbdiUyeWqtb
+DnbjjvbdYSkaNUPY
+DoCkKvbdTAEhhCPE
+DoCjjvbdmttyjjSG
+EOcKjvbdrMyjZMIJ
+EPDKjvbdUsmTelVj
+EPCkKvbdNsTugFUp
+DnbkKvbdWRnYBeMD
+DncLKvbdHgGzZXxH
+EPDLKvbdZLrDsmlN
+DncLKvbdcSbkUDjB
+EObkKvbdziuPpDrt
+DoCjjvbdZyEJmblS
+EObkKvbdjggMFenL
+DnbkKvbdmfeXmNfy
+EObkKvbdiBncFXRR
+EPDKjvbdADSXiyiQ
+EObjjvbdLFfHbApu
+EOcLKvbdRMwbZOUz
+EPCkKvbdFVxoomJe
+EOcLKvbdZnmiEdyj
+DncLKvbdULunaVoJ
+DncLKvbddndsKtTr
+EPDKjvbdEztQeMDJ
+EObkKvbdcScKscjB
+EOcKjvbdFkErbglu
+DoCkKvbdsBfMlGkZ
+EPDLKvbdCSaCsfWr
+EPCjjvbdVAapsRSZ
+EOcLKvbdgFkzNfgA
+EPDLKvbdjhHLefNk
+EObjjvbdyNsIXsIc
+DoCjjvbdqcdiPmvB
+EOcKjvbdeXyssrFz
+DnbjjvbdEOcKjwCd
+DoDLKvbdGKdrbgmV
+DncLKvbdKQzEoFnF
+DoCkKvbdqvpMDJZR
+EObkKvbdZyEKODMS
+DncKjvbdBhjbKiFj
+DncKjvbdfHkVrNqH
+DncLKvbdeXyssrFz
+EObjjvbdxmsHwriD
+EPDKjvbdRyigsCvA
+DoCkKvbdZoNiEeZj
+EPCkKvbdhzUfLpnG
+DncKjvbdVUNUFkuj
+EPDKjvbdRXNdDMID
+EObkKvbdlBMnmALA
+EPDKjvbdffMZnHHA
+EPCjjvbdEARhlyvw
+EOcKjvbdVTltGLvK
+EOcKjvbdJqZdoFme
+EObkKvbdyOTHwsIc
+DoDLKvbdCfkegAzc
+DnbkKvbdZMRdTmkm
+DnbkKvbdhkeEOUcZ
+DoDKjvbdZnnIeEyj
+DnbjjvbdrafNMGkZ
+DoDLKvbdZtJIyESn
+EOcLKvbdaRecITek
+EPCjjvbdZoOJEdyj
+DoDLKvbdxsNhlrBg
+EPCjjvbdZxdKNcMS
+DoCjjvbdCWzdJEov
+EObkKvbdTppnttgm
+DnbkKvbdjmCLydfo
+EObkKvbdBsAbsewS
+EObjjvbdjgflFemk
+DnbjjvbdpstGrSKt
+EOcLKvbdOTTvHFUp
+DoCkKvbdczYowyRC
+EObkKvbdTvMPjUAq
+EOcKjvbdezvYeJUX
+EPCkKvbdzHYlANEw
+EPCkKvbdqcdiQOVa
+DoCkKvbdsrrSxyeD
+EObkKvbdOTUWGeUp
+DoDKjvbdbUbHYLTh
+DoCkKvbdHakydzAD
+DoDKjvbddjJrWUzn
+EPDKjvbdmaiwYPOV
+DoCjjvbdtbcUwVno
+EPDLKvbdrMyjYkgi
+DoCjjvbdUQpoUtgm
+DncKjvbdddoSBwDK
+EPCkKvbdatbGwkTh
+DncKjvbdmbJvxPNu
+DnbjjvbdwzHeewdr
+DncLKvbdzitpPcrt
+EOcLKvbdrMyjYkgi
+EOcLKvbdrEFIomvB
+DoDLKvbdiifIJlxS
+EOcLKvbdtvOYKQsA
+DoCkKvbdxsNhlqag
+DnbjjvbdyTOIlqag
+DncLKvbdIGgZyYXg
+EOcKjvbdUsmUGMWK
+EObkKvbdhzUfMQnG
+EPDLKvbdZxdJnCkr
+DncKjvbdKWUeceGi
+EOcLKvbdmbJvwnnV
+DoDLKvbdDncKjvbd
+EPCkKvbdZoNheEyj
+DncLKvbdVqnXadlD
+DncLKvbdtunXipsA
+DncLKvbdjAPgBPfj
+DoCkKvbdyqPNJKXA
+DncKjvbdrpWPJbuf
+EOcKjvbdqvpMDJYq
+DnbjjvbdcTDLUDia
+DnbkKvbdiGjCxvKV
+EPDKjvbdauBfxKtI
+DoCkKvbdLFfHbApu
+DoDLKvbdHffyyXwg
+EOcKjvbdIxUCHkqQ
+DoDKjvbdzQoMiJwA
+DoDKjvbdyYIjBoyk
+EObkKvbdxnSgwriD
+EObkKvbdIMBznWpk
+EPDKjvbdYlSDtOMN
+DoDKjvbdijGHjMxS
+EOcKjvbdYkqcsnMN
+DoCjjvbdmaiwYOmu
+EPDKjvbdHELWKBjK
+DoCjjvbdwtmFRYlO
+EOcLKvbdFeiqnJTq
+EPDKjvbdiBncEvqR
+DoCkKvbdJXsbILpp
+EObjjvbdULunaVni
+DncKjvbdDwxLstUM
+DoDKjvbdrWpMChyR
+EObkKvbdYzcFqivZ
+DncKjvbdEzspdlDJ
+EPDKjvbdfMfXGmKL
+DoCkKvbdCTAbtGWr
+DoDLKvbdRkZGUgKs
+EPCkKvbdFWZQQMie
+DnbjjvbdxVNEqYkn
+DoCjjvbdeFPRbWbj
+EPCkKvbdZshhyESn
+EObjjvbdqrVKnLAm
+EPCjjvbdptUGqqjt
+EOcLKvbdrEEhpOVa
+DncKjvbdzQoNIjXA
+DncLKvbdmgFXlnGy
+DoDKjvbdZjShQHBf
+DnbjjvbdjKGHjNXr
+DoDLKvbdqFcdsvAh
+EPCkKvbdOEdUIiLE
+EPDLKvbdNeEUJJKd
+EPCjjvbdzHZMANEw
+DnbkKvbdqlzJyMIJ
+DnbjjvbdelfXHMjL
+EPCkKvbdANHyTWzY
+DnbjjvbdREDBPpcr
+DncLKvbdQmYCZOUz
+EOcKjvbduoTzpjoU
+DoCjjvbdqrUjmkBN
+DnbjjvbdyfxlANFX
+EOcLKvbdJmADygUa
+EPDLKvbdyNrhYTIc
+DoCjjvbdCTAbtFwS
+DncLKvbdSwkLmzkY
+DnbjjvbdjhHMFfNk
+DoCkKvbdZeXfzhIb
+DnbjjvbdbrbjtEJa
+DoCkKvbdxrmhmRbH
+DoDLKvbdrXQLbhxq
+EObjjvbdTulQKUBR
+EPCkKvbdMpYQumgT
+DncKjvbderBWzlDP
+DoCjjvbdiGjCxvJu
+DoCjjvbdlZSqsZGt
+EOcLKvbdZisIPfaf
+DnbkKvbdHEKvKBij
+DncLKvbdjSziSjiz
+EPDKjvbdCEQBWJmG
+EObkKvbdGGKRmiUR
+EPDKjvbdMuTRkNAX
+DnbjjvbdrXQLbiYq
+EPCjjvbdOTUWGduQ
+EPCjjvbdnBjXXoNu
+DoDLKvbdcarmSAUN
+DoCjjvbdNPwqWOGs
+EObkKvbdUslsekvK
+DnbjjvbdzaAPGfbM
+DoCkKvbdGdLVjCJj
+DoDLKvbdRjyFtfkT
+DoDLKvbdGLFTDHlu
+DnbkKvbdGFirOJUR
+EPDLKvbddoFTLUUS
+EObkKvbdkxrrTZGt
+DncKjvbdxrnJMqag
+EOcLKvbdCDpBWJmG
+DoCjjvbdlqyUysDi
+EPDKjvbdTfzmlXVe
+DncKjvbdEuxpQMie
+EOcKjvbdbLLfPNcA
+DncKjvbdVgxWXgYz
+DoDKjvbdrbFmLgKy
+DoCjjvbdzaAPGfbM
+DncLKvbdYSlAlsoY
+DoDLKvbdZyEJnClS
+EPDLKvbdEvYopMjF
+DncKjvbdmtuZjiqf
+DoCjjvbdCJKbLIfK
+EOcLKvbdcIljLFvx
+EObkKvbdrJAKFNPF
+DoDKjvbdBiKbKhfK
+EPDKjvbdWIYWYGxz
+DoCkKvbdjAQGaQHK
+DnbjjvbdjblLQftg
+DncLKvbdbhlikGXY
+EPDKjvbdZLrDsmkm
+DoDLKvbdVTlsfMWK
+DoCjjvbdliDsptqa
+DnbkKvbdjuvmcbXw
+DoCjjvbdbVCHXjtI
+DoCkKvbdQvmdClID
+DnbjjvbdLAkHNCXq
+EPDKjvbdZtIhyETO
+DnbkKvbdYkqdTmlN
+DoDKjvbdMtrrKmAX
+DncLKvbdJXtCIMQp
+EPCkKvbdlhdTqUqa
+EObjjvbdnHFYNNfy
+EPDKjvbdxrmhlrBg
+DncLKvbdiLeDmtcZ
+DncKjvbdNrsufdtp
+EObkKvbdlhcsptqa
+EObjjvbdNeETiIkE
+DnbkKvbdxsNhmRbH
+DnbkKvbdADRxKZhp
+DnbjjvbdTqROuUgm
+EOcKjvbdpxoIGqDx
+EOcLKvbdqBIeAWhE
+DnbjjvbdCIkBjiFj
+DncLKvbdTlWPBWPJ
+DoCjjvbdEKHjVxKA
+DnbkKvbdZRNFImEq
+EObkKvbdJbicQjCx
+DoDKjvbdNsTufeVQ
+EObjjvbdDxYMUTsl
+DoDLKvbdaSFcITfL
+EPDKjvbdcTDLTcia
+DoCkKvbdlhdTpuRa
+EObjjvbdCJKbKiFj
+DncKjvbdqAiFAWhE
+EPDKjvbdUslsfLuj
+EObjjvbdWWiXuceH
+EPCjjvbdOEcshiLE
+EPDLKvbdEJhJuxKA
+DoCkKvbdKyRKSzuG
+DncKjvbdHffzZXxH
+EOcLKvbdSLZGUfkT
+EObkKvbdHgHZxwxH
+DnbkKvbdcSbjtEJa
+EPDKjvbdZGwEAPTJ
+DoDLKvbdeAURNXif
+EPDLKvbdMpYQunGs
+EObkKvbdNeDshiKd
+DoDLKvbdzoQQdbkx
+EPDKjvbdWHxWXfxz
+EPCjjvbdCEPaVjNG
+DoCjjvbdbhlikFvx
+EOcLKvbdBvzdIdpW
+DoCkKvbdNPwqWNfs
+EPCjjvbdbhlijfWx
+DncKjvbdqwQLbiZR
+EObjjvbdkClLRGuH
+DncKjvbdNHDQNQVL
+DncKjvbdhkdcmuDZ
+EOcKjvbdKWVFdFHJ
+EPDLKvbdYTMBMtOx
+EObkKvbdSKxfVGjs
+DncKjvbdZoOJEdzK
+EObjjvbdMpXqVmgT
+EPDKjvbdhaoDFXRR
+EPCjjvbdrpWPJcVf
+EOcKjvbdczYpYZRC
+DoDLKvbdLLAhWAJy
+DoDKjvbdEObkLXDE
+EPDKjvbdnVUykKRf
+DnbkKvbdBvzdIdov
+EOcKjvbdGFirOJUR
+DoCjjvbdGGJrNiTq
+EPDKjvbdqAheAWgd
+DncKjvbdxmsIXriD
+EObkKvbdVAbQsRRy
+EPDKjvbdRXODbkhD
+EObjjvbdVZHtZjoO
+EOcKjvbdffMZmfgA
+EOcLKvbdbiMjLGXY
+DoDKjvbdUQpoVUhN
+EPCkKvbdhfjCxuiu
+DoCkKvbdziuPocsU
+EObjjvbdBhkBkJFj
+DnbjjvbdeAURNXif
+DncKjvbdQlxByOUz
+EPDLKvbdRbEEkhxk
+EPCjjvbdrbFlkgKy
+DoCjjvbdaSFbhUGL
+EOcKjvbdsCGMkfkZ
+DoCkKvbdJbicRJcY
+DnbkKvbdqlzKYlHi
+DoCjjvbdZyDimblS
+EOcLKvbdsrqsZZdc
+DoDKjvbdjggMGGNk
+DnbkKvbdADSXiyiQ
+DoCkKvbdehKurORH
+EOcLKvbdrylPsAgn
+EPCjjvbdRWmdClID
+EPCjjvbdbsCjsdKB
+EObjjvbdUQpoVVHm
+DnbkKvbdiCObeXQq
+DncLKvbdUQpoVUhN
+DoCkKvbdKCicRKDY
+DncKjvbdjlakzFGo
+DnbkKvbdMgDQMpVL
+DoDLKvbdWSNxBeMD
+DnbkKvbdvBEZTOdh
+EPCjjvbdsQWPKCuf
+EObjjvbdZeYGzghb
+DnbkKvbdxsNhmSCH
+EPDLKvbdkySrTZGt
+EObkKvbdrDdiQNvB
+DncLKvbdHDjuiajK
+DoCjjvbdURROtuIN
+DncKjvbdKyRJrztf
+EObjjvbdIGfyyYXg
+DncLKvbdXsMBMtPY
+EPCkKvbdaaVdfPpX
+DncKjvbdiHJbyWJu
+EOcKjvbdSKxfVGjs
+DoDKjvbdxZgfFwdr
+DnbkKvbdRNYCZNtz
+EPCkKvbdCDoaWKNG
+DoDKjvbdDjHjWYKA
+EPDKjvbdyNsHwsIc
+DoDKjvbdUtNTfLuj
+DoDLKvbdGGKRnJTq
+EPCkKvbdsBemMGjy
+EPDKjvbdSQUHKFcw
+DnbjjvbdkClKpfuH
+EObjjvbdRyjHrcWA
+EOcLKvbdSPsfjGEX
+DoCjjvbdGckWKBij
+EPCkKvbdGdKujBij
+DnbjjvbdcJMijewY
+EPDKjvbdkIGkefOL
+EPCkKvbdrSVLNkBN
+DnbkKvbdrpWPJbvG
+DoDLKvbdZirgpHBf
+EPCkKvbdHDjujBij
+EPCkKvbdvBDySoEh
+DoDLKvbdePEsKssr
+DoDLKvbdZRMdhldq
+EObjjvbdUQqPUtgm
+DoDLKvbdMSXNZtpz
+EObjjvbdVYhTzKnn
+EOcKjvbdrNZixlIJ
+DoDLKvbdTpqPVVIN
+DnbkKvbdkCkjqHVH
+DnbkKvbdkWWmcaxX
+EOcLKvbdJSyBSlwl
+EObkKvbdmRxtzTEJ
+DncKjvbdptTgRqjt
+EOcLKvbdqYoHfqEY
+DoDKjvbdGZUtaDxC
+EOcKjvbdKQydoGNe
+EPDLKvbdssSTZZeD
+EObjjvbdhkddOUcZ
+DoDKjvbdGdKvJbKK
+EOcKjvbdULvPAuoJ
+DoCkKvbdrEFJPnWB
+DnbjjvbdfNGWfmJk
+EPCkKvbdkWXODaww
+EOcKjvbdMtrrKmAX
+DnbjjvbdEuyPpMie
+EObjjvbdrSVKmkAm
+EPDLKvbdhanbdvqR
+DoCkKvbdkWWmdBww
+DnbjjvbdxUleQyLn
+EOcLKvbdpyPHfpdY
+DncKjvbdpfDeTvBI
+DoCkKvbdnVVZjirG
+DnbkKvbdzjVPocsU
+EPDLKvbdmfdwlmfy
+DnbkKvbdSKyFuGjs
+EObkKvbdVAaprpqy
+EPCjjvbdUaBqTRRy
+EObkKvbdZoNhddzK
+DncKjvbdrNZiyLhJ
+DncKjvbdaMkBruNH
+DoDKjvbdZyDjNcMS
+EPCjjvbdZjTIQHCG
+EObkKvbdjJegilwr
+EPDKjvbdHffzYxYH
+EPDKjvbdaSGChTfL
+DoDLKvbdcJMjLGWx
+EOcLKvbdtlXvaTaX
+DoCjjvbdGYuVAcxC
+EOcLKvbdUsltGLvK
+EPDLKvbdRNXayOUz
+DoDLKvbdRadFLiYk
+EOcKjvbdCTAbsfXS
+EPCjjvbdGZVVAdYC
+EPDLKvbdypnliJwA
+EPCjjvbdSBdFLhxk
+EOcLKvbdGLFSbhNV
+DncKjvbdTppnuUhN
+EObkKvbdezvYdiTw
+DoCkKvbdIsZBSlxM
+DncLKvbdRNYBxmtz
+EPCkKvbdeFOqawCj
+DnbjjvbdtSrTYzEc
+DncKjvbdkDLkQgUg
+DnbjjvbdEARhlzXX
+EOcKjvbdWRmxBeMD
+DoDLKvbdzQnliKXA
+EPDKjvbdpfDdtWAh
+DncLKvbdMgCpMpVL
+DnbkKvbdiZtfLpmf
+EPDLKvbdzQoNJJwA
+EPCkKvbdaNKasUmH
+EPDLKvbdRbDeLhyL
+DoDLKvbdKRZeOeme
+EOcKjvbdZxdJmcMS
+DncLKvbdeKKSVtzn
+EPDLKvbdRjxeuHLT
+EObkKvbdNGcPmPtk
+DoCkKvbdtcDVWvPP
+EPCjjvbdcTDKscjB
+DoDLKvbdbrcLTcia
+EObjjvbdvlvAMcdm
+EObjjvbdFxuVBDwb
+EPCjjvbdhkdcmtby
+EOcKjvbdRotHKFcw
+DncLKvbdelfWgNKL
+EObkKvbduCbuXVno
+EPDKjvbdEYXlUUUM
+EOcKjvbdbUbHXjsh
+EOcLKvbdmgEwmOHZ
+DoCjjvbdEXxLsssl
+EPDLKvbdZLqdTmlN
+EOcLKvbdbsCkUEJa
+EOcKjvbdqvpLbhxq
+EOcKjvbdfIKvRmpg
+DncLKvbdGBOpxizm
+DoDLKvbdnBiwXnmu
+DoCjjvbdKWVFceGi
+EOcLKvbdRbEEkiZL
+EObjjvbdffMZmgHA
+DoCjjvbdUMWPBWPJ
+EObkKvbdkClKpftg
+DoDLKvbdBhkBkIej
+DoDKjvbdhgJbyWJu
+DoCjjvbdEASIlzXX
+EPDKjvbdGZUtaDxC
+DnbjjvbdlYsRryHU
+EOcKjvbdhgKCyWJu
+EPCkKvbdsQWOibuf
+DoCjjvbdRMwbYmtz
+DoDKjvbdZxdJnClS
+EPCjjvbdJTZBTNYM
+DnbjjvbdiLeEOUby
+EOcLKvbdjEjgUoAO
+EPCkKvbdzitopDrt
+EPCjjvbdtcCuWvPP
+DncKjvbdZMRdUNlN
+DoDLKvbddZxoxZRC
+DoDKjvbdFVxoomKF
+DoCkKvbdSLYeuGkT
+DncLKvbdYSlBNTnx
+EObkKvbdeuzwoizs
+EPDKjvbdUQpoUuIN
+DoDKjvbdmpZxujyC
+EPCjjvbdDGlFgAzc
+EPCjjvbdkCkkRGuH
+DnbkKvbdvlvAMdFN
+DoDLKvbdatbHXkUI
+EPCjjvbdFWYoolie
+DnbjjvbdrEFJPnWB
+EObkKvbdpyOggQcx
+EOcKjvbdqwQMChxq
+EOcKjvbdqrVLNkAm
+EOcKjvbderBWzlCo
+DoDLKvbdRWmdDMHc
+EOcLKvbdZoNhdeZj
+DnbkKvbdunszpkPU
+EPDKjvbdGAnpxizm
+DoCkKvbdKCjCqKCx
+EOcKjvbdZshhyDrn
+DoDKjvbdddoSBvcK
+DncKjvbdcScKtEJa
+EOcLKvbdZjShQGbG
+DncLKvbdDncKkXDE
+EPDLKvbdrzMQTBHn
+EPDLKvbdIxUBglRQ
+EPDKjvbdcyxpXxpb
+EObkKvbdMSXMytpz
+EObkKvbdijGIKMwr
+EObkKvbdzdzOzdyp
+DnbjjvbdeATplwjG
+DnbkKvbdcIlikFwY
+DoDLKvbdsPunicVf
+EPDKjvbdmozYvLZC
+DoCkKvbdkyTSSxgU
+DncLKvbdRWnDcLhD
+DncKjvbdHELWJaij
+DncKjvbdZQmFIleR
+EOcKjvbdiCOcEvpq
+EOcKjvbdbrbkUEKB
+EOcLKvbdOFEThhjd
+EObkKvbdbBVdepPw
+EObkKvbdUxhTzKnn
+EObkKvbdzoPpdblY
+EOcLKvbdrbFllHLZ
+DoDKjvbdjggMGGOL
+DncLKvbdqceJQNua
+DoDKjvbdiHJbxvJu
+DoDLKvbdySnImSBg
+EPCkKvbdtTRrxzFD
+EOcLKvbdkVvnEBxX
+DnbjjvbdtcCtvvOo
+EPCkKvbdyzdmrHiI
+DoDKjvbdFjdrbhMu
+DoDLKvbdZyEKODLr
+DoDKjvbdURQnuVHm
+EPCkKvbdZyDimcMS
+EOcLKvbdNQXpunHT
+DnbjjvbdQlxCYmtz
+DnbjjvbdCDoaVimG
+EObjjvbdsPvOibvG
+DnbjjvbdgGLynGgA
+DncLKvbdCDoaWJmG
+EObkKvbdnCKXXnnV
+EOcLKvbdUxgtZkPO
+DnbkKvbdiMFDmuDZ
+DncKjvbdiGicZWKV
+DoDKjvbdcScKtEJa
+DoDKjvbdpssgRqkU
+DncKjvbdsBfNLgKy
+DoDLKvbdGYttaDwb
+DncKjvbdjvWnDaxX
+EPCjjvbdhgJcYuiu
+DnbjjvbdxUldpxlO
+DoDKjvbdUaCRSqSZ
+DnbkKvbdNwoVzdNt
+DoCkKvbdZnnIeEzK
+EPDKjvbdNeEUJIkE
+DnbjjvbdJbjDQjDY
+EPDLKvbdKVuFceGi
+EPCkKvbdKkBIWAJy
+EObjjvbdrafMlHLZ
+EOcLKvbdZLqctNkm
+EObjjvbdMgComPtk
+DncKjvbdjhHMGGOL
+DnbkKvbdJYUCIMQp
+DoCjjvbdhlEcnVCy
+DoDLKvbdxsOJNSBg
+EOcLKvbdRMxBxmtz
+EOcLKvbdHDjujCJj
+EObjjvbdZRMdhmFR
+EPDLKvbdUQpoUthN
+EPCkKvbdvlvANEFN
+EObkKvbdSCEEkhxk
+EPCjjvbdLBKfmCXq
+EPDKjvbdOStVfduQ
+EPCjjvbdGcjvJbKK
+DnbjjvbdVBBprpqy
+DoCjjvbdirziTLJz
+DncLKvbdFWYpQNKF
+DoDLKvbdjKGHjNYS
+DncKjvbdZnmiEdzK
+DoDKjvbdySmiMrBg
+DncLKvbdeAURNYKG
+EPDLKvbdemGWflik
+DoDKjvbdaMkBrtmH
+DoDKjvbdIxUBglRQ
+DoDKjvbdOEcshhjd
+EPCjjvbdpxnhGqDx
+DncKjvbdYSlBNToY
+DnbjjvbdGGKSOJUR
+EOcLKvbdZjTHpGbG
+EPCjjvbdIHGzZYXg
+DncKjvbddndsLTsr
+DnbjjvbdqAheAXIE
+EOcKjvbdVhXvXfxz
+DncKjvbdFyVVAdYC
+DnbjjvbdJvVFceGi
+EPCkKvbdoznDjwoA
+EPDKjvbdvPTzqLPU
+EObjjvbdiifIKMwr
+EOcLKvbdlZTSSxgU
+EObjjvbdQvnECkgc
+DncLKvbdjgfkfGNk
+DnbkKvbdCDoaWJmG
+DnbkKvbdxnTHwriD
+DncKjvbdoAKzshDn
+DoDKjvbdvAdZSndh
+DnbjjvbdRpTgKFcw
+EOcLKvbdiiegilwr
+EOcKjvbdGdLVjBjK
+EObkKvbdGFjRmhtR
+EPCjjvbdZsiJYdTO
+EPCjjvbdJJdAKPfd
+EPDLKvbdKfGHbBRV
+DncLKvbdjhHMFenL
+EObkKvbdbLMFnnDA
+DoCjjvbdUWMPisaR
+DnbkKvbdZjTHpHCG
+EObkKvbdbsCkTcjB
+EPCkKvbdSLYfUfkT
+DoDKjvbdZeYGzhIb
+DncKjvbdrovPJcVf
+EPCjjvbdePFSjtTr
+DncKjvbdJbibqJbx
+EPDLKvbdDxYMUUTl
+DnbkKvbdZHXEAPSi
+DncKjvbdVTmUFlVj
+EPDKjvbdzoQREcLx
+EPDKjvbdKfFhCAqV
+DoDKjvbduDDUwVoP
+DoDKjvbdgFlZmfgA
+EObjjvbdTAEiHbOd
+DoCkKvbdMowqVmgT
+DncKjvbduMXwBTaX
+DncKjvbdeYZssrFz
+DncLKvbdmfdxNNgZ
+DncLKvbdxLXDgzzG
+DoCjjvbdNsTvGduQ
+EPDLKvbdTpqOtuHm
+EObkKvbdZMRctOMN
+EPCjjvbdHEKuibJj
+EPCjjvbdBiKbLJGK
+DoCjjvbdUtNUFkvK
+EOcKjvbdVTltFkuj
+DnbjjvbdczYpXxqC
+EPDLKvbduWNxKQsA
+EOcKjvbddZyQYYqC
+DnbkKvbdyfyMAMdw
+DncLKvbdDihKWXjA
+EPCjjvbdoAKztIDn
+DoCjjvbdcTDLUDjB
+EPDKjvbdJcJcRKCx
+DncKjvbdIxTahLqQ
+DoDLKvbdTqROttgm
+DoDKjvbdjblLQgUg
+EOcLKvbdTppnuUhN
+EPCjjvbdrMyjZLgi
+EObjjvbdypnmIjXA
+DoCkKvbdczYoxZRC
+EObkKvbdFjeTDHmV
+EPCjjvbdZxcimbkr
+DoDKjvbdatbHXkUI
+EPDKjvbdvmWAMdEm
+DoCjjvbdqwQMCiYq
+DoDKjvbduWNwjQsA
+DncKjvbdACqwjZiQ
+DoCjjvbdOTTvGduQ
+EObkKvbdirzhsKiz
+EObjjvbdOTTugFUp
+EOcLKvbdKDJbqJcY
+DoCjjvbdiUyeXRtb
+EObjjvbdfMfXHNKL
+EOcKjvbdjhHMFfNk
+DncKjvbdRpUGjFcw
+EPCjjvbdfILVqnRH
+EOcKjvbdiHKCyWJu
+DoDLKvbdnPzYvLYb
+DnbkKvbdnGeYNOHZ
+DoDKjvbdtvOXjQsA
+EPCjjvbdmIctRVRa
+EOcKjvbdpyOhGpcx
+DnbkKvbdKQydoFnF
+DoDKjvbdkVvnDaww
+EObjjvbdbUbHXjsh
+EOcKjvbdCJLCLIfK
+EPDKjvbdZeYGzhJC
+DncKjvbdcScLUDia
+DoCkKvbdQmXbZOUz
+EOcLKvbdRadFMIxk
+DnbkKvbdziuPodSt
+EOcKjvbdEXxMUUTl
+DnbjjvbdegjvSOQg
+EObkKvbdZtJJYdTO
+EPDKjvbdVAbQsQrZ
+DnbkKvbdkHflFfOL
+EObkKvbdtcCuXWOo
+DnbjjvbdcTDLUEJa
+EPCjjvbdZjTIQHBf
+EObjjvbdTAEhhCPE
+EOcLKvbdbhlikFwY
+DoDLKvbdEPDKkWbd
+EOcKjvbdZtJJZESn
+EPDKjvbdZMRdUNlN
+EPCkKvbdhgJcZWJu
+DncKjvbdUaBqSprZ
+EOcLKvbdEJgiuxKA
+EObjjvbdSPtHKFcw
+DoCjjvbdFfKSOJUR
+EObjjvbdVrOXaeMD
+DoCjjvbdrXPkcIxq
+DoDKjvbdZjTHofaf
+EOcLKvbdVYgszLOn
+DncKjvbdIwsagkpp
+DncLKvbdTkvPBVni
+EOcLKvbdUtNUFkuj
+EObjjvbdZnmheEyj
+EPDKjvbdyYIjBoyk
+EPCkKvbdqlyiyMIJ
+EPCjjvbdYzbeqjVy
+EOcLKvbdUQqOuVIN
+EObkKvbdZMSDtOMN
+DncKjvbdVvhxWDdg
+EOcLKvbdiZuFlRNf
+EObjjvbdZtJJYcrn
+EPCjjvbdmuUzKirG
+DoDLKvbdVUMtGMVj
+EPDLKvbdhWyAzzAJ
+DoDLKvbdfIKvRmqH
+DnbjjvbdqdFIpOVa
+DnbkKvbdIwtCHkpp
+EOcKjvbdeEnrBvcK
+DnbkKvbdJuuFdFGi
+DoDKjvbdeOeTKtUS
+EObjjvbdKWUfDeGi
+EPCjjvbdiHJbyViu
+EOcKjvbdBraCsfWr
+DoCjjvbdGYuVBEYC
+DoCkKvbdnHEwmOHZ
+EPDKjvbdZisIQGaf
+EPCkKvbdmpZxvKyC
+DoDLKvbdmSYuZrdJ
+EObkKvbdKDJbqKCx
+EOcLKvbdZsiJZETO
+EPDKjvbdnCJvxOmu
+DoCkKvbdjgflGGOL
+DnbkKvbdRosfjFdX
+EPCjjvbdRECaQQcr
+DnbkKvbdNHComQVL
+EPCjjvbdrJAKEmOe
+DoDLKvbdqBJFAXIE
+DncLKvbdGLFTDINV
+EOcLKvbdhgJbxujV
+DnbkKvbdjSzhsKiz
+EOcKjvbdKWVGDdfi
+DoDKjvbdZnnIeFZj
+DnbjjvbdxxIiaoyk
+EObkKvbdczYpYZQb
+EPCjjvbdZxcjODMS
+EObkKvbdiHJbxvKV
+DoCjjvbdJzoexEAN
+DoCjjvbdaRfChTek
+DoDLKvbdxwhjCPyk
+DoDLKvbdVqnYBeLc
+DnbkKvbdRDcBPpdS
+EObkKvbdYqNFImFR
+EPDKjvbdsrrTYzFD
+EOcKjvbdqcdhpOWB
+EOcKjvbdaNLCTUmH
+DoDKjvbdnPzYukZC
+DncLKvbdKCjDRKCx
+EObjjvbdFkEsDINV
+EPDKjvbdMgDQMouL
+DncLKvbdOXnuzdNt
+EPCjjvbdpstGqrLU
+EPCkKvbdRbDdkhyL
+DnbkKvbdaogGdLzd
+DncKjvbdjlbLydgP
+DnbjjvbdUMVoAvPJ
+EPCjjvbdJqZeOfOF
+DoDLKvbdUsmTekvK
+DoCjjvbdpyOgfpcx
+DnbkKvbdJYUCIMRQ
+DncLKvbdjJfHjMwr
+DoCjjvbdRosgKGDw
+DoCkKvbddZxpYYqC
+DncKjvbdddnrBwCj
+EPDKjvbdijGIJlxS
+DoCjjvbdkWWnECYX
+EObkKvbdqlzJxlIJ
+EOcLKvbdzaAPHHBl
+DoDKjvbdlZTSSyGt
+DnbjjvbdatbHXkUI
+EOcLKvbdNdcshiKd
+DncKjvbdGdKujBjK
+DnbjjvbdRWnDcMID
+DoCjjvbdSxKlNzkY
+EPDKjvbdHDkWJbJj
+EPDLKvbdZxcjNcLr
+EOcKjvbdLYqKSzuG
+EPDLKvbdjuvmcaww
+EPDKjvbdxmrhYTJD
+EOcKjvbdZirhPfaf
+DnbjjvbdfIKurNqH
+EPCkKvbdYTLaNTnx
+DoDLKvbddtAUASlv
+EPCkKvbdZLrDtOLm
+DnbjjvbdnGdxMnHZ
+DoCjjvbdeFPSCXCj
+DncLKvbdYORAYUvU
+EPCjjvbdrXQMDJZR
+EPCkKvbdRpTfjGDw
+DoCjjvbdpssfrSKt
+EPCkKvbdKWUedFHJ
+DnbjjvbdVvhwvDdg
+DncKjvbdLrWlzUpz
+DncKjvbdwtmFQxkn
+EObkKvbdmIdTqUqa
+DnbkKvbdJutedFHJ
+EOcKjvbdVZITykPO
+DoDLKvbdhbPDFXQq
+DnbjjvbdmuVZjirG
+DncLKvbdieKgVPAO
+DncKjvbdEuyPpNJe
+DoDKjvbdiHJcYuiu
+EPDKjvbdmgFYNNfy
+DnbkKvbdOTUWGeUp
+DoCjjvbdZRNFJNFR
+EPDLKvbdYpmFJNEq
+EObkKvbdRMxBxnUz
+DncKjvbdNQYQvOHT
+EOcLKvbdMoxRVnHT
+DoDKjvbdpyOhGpcx
+EObjjvbdRyjITDWA
+EObjjvbdrykosAhO
+EOcLKvbdhaoDFXRR
+DoDLKvbdIryBSmYM
+DnbjjvbdlZSrTYft
+DncLKvbdegjurORH
+EOcKjvbdJYUCHlRQ
+EOcLKvbdREDApRES
+EObjjvbdmgFYMnHZ
+EPCkKvbdZyDimblS
+DoCkKvbdiCPCdwQq
+EObkKvbdbVBgYKtI
+DoDLKvbdNddUJJLE
+DoCjjvbdrpVnibuf
+EPDLKvbdKaLGlbYR
+DnbjjvbdTpqPVUhN
+DoCjjvbdcyxoxYpb
+EPDKjvbdhfibxvJu
+EPCjjvbdJpydnfNe
+DncLKvbduWOXipsA
+DoDKjvbdrRtkNkAm
+EObkKvbdNQXqVmgT
+EObkKvbdCIkBkJFj
+EPDLKvbdqUUHSRjt
+EOcLKvbdeYZtTqez
+EPCjjvbdqUUHRqkU
+DncKjvbdkWXODaxX
+EPCkKvbdaNKbTVNH
+EPCjjvbdvAcxroEh
+EOcKjvbdlZTSTZGt
+EOcLKvbdLAkHNCYR
+DoDLKvbdUtMselWK
+EPCjjvbdnVUzKjRf
+DoDLKvbdypoMiJwA
+EObjjvbdKDKCqKDY
+DoCjjvbdrWolDIxq
+DoDKjvbdwyhFfXeS
+EOcKjvbdnGeYMmgZ
+DoDLKvbdREDAopcr
+EPCjjvbdiUzFXRuC
+DoDLKvbdZQldhmEq
+EPCjjvbdtvNwipsA
+EPDKjvbdbrcLUDia
+DoDLKvbdegkVqnQg
+DoCjjvbdznopdcMY
+DoCjjvbdmfeXlmgZ
+DncLKvbdXrlBMsnx
+DoCjjvbdmgEwmOGy
+DoCkKvbdjmCLydgP
+DncLKvbdmJEUQuSB
+DnbjjvbdRbDeLiYk
+DnbkKvbdQdDBPqDr
+EObkKvbdjKGHjMxS
+DoCkKvbdyOTHxSiD
+EPCjjvbdQwNdCkhD
+EObjjvbdfNFwGljL
+EObjjvbdVqmxCElD
+EOcKjvbdeOeTKtTr
+DoDKjvbdUaBqSpqy
+DnbjjvbdmIdURUqa
+DoCkKvbdUWMQJtBR
+DnbjjvbdxnSgxSiD
+DncKjvbdwXMBVaVu
+DnbjjvbdvvkaVaWV
+EObkKvbdmaiwXnmu
+DoCjjvbdgQBzwEYI
+EOcKjvbdFVxpPmJe
+EObjjvbdKDJcQjCx
+DoCkKvbdYlRdUOMN
+EOcLKvbdZoOIddzK
+DoCjjvbdffMZnHHA
+DncKjvbdnQZxujxb
+EPDLKvbdwXMBWBVu
+DoCjjvbdLFfIBaQu
+DncKjvbdGQASwHFy
+DnbkKvbdauBfxKsh
+EOcLKvbdraelkgKy
+EObkKvbdnVUzLKSG
+DoDKjvbdANHxrwZx
+DncLKvbdqZPHfqEY
+EObjjvbdvPTzpjoU
+EObjjvbdrWpMDIyR
+DnbkKvbdCDpBWKNG
+DnbkKvbdyOSgwrhc
+DnbkKvbdeKKSVtzn
+DncKjvbdMowpumgT
+EOcLKvbdOFDtIhjd
+EPDKjvbdkDMLRGtg
+EPDKjvbdiiehJlwr
+EPDLKvbdBdQAvJlf
+DoDLKvbdZyEKODMS
+EObjjvbdJqZePFme
+DnbkKvbdKxqKSztf
+EObkKvbdmJEUQuSB
+DnbkKvbdREDAopdS
+EPDKjvbdwzHefYEr
+EPDKjvbdnHExMnGy
+EOcKjvbdmozZVjyC
+EPDKjvbdZHWdAPTJ
+DoDKjvbdjgfkfFnL
+DncKjvbdczZPxYqC
+DoDKjvbdEXwlUUTl
+DncKjvbdhuZdvrVC
+DnbkKvbdxKwDgzzG
+EPCkKvbdsZlQSaIO
+EOcKjvbdzRPMiKXA
+DoDKjvbdqvolDIxq
+DoDKjvbdQdCaPpcr
+EPCjjvbdJmADyfuB
+DnbjjvbdsCGNLgLZ
+DoDKjvbdKfGICAqV
+DoCkKvbdbiNJkGXY
+DncKjvbdiGicYvKV
+EPCjjvbdSxLLmzjx
+DncKjvbdLAjflaxR
+EPCkKvbdUyHsyjoO
+DnbjjvbdcyxoxYqC
+EObkKvbdxZgfGYFS
+EPDLKvbdZoNiEeZj
+DncLKvbdZtIhxcrn
+EPDLKvbdIwtCILqQ
+DncLKvbdQmXbYmtz
+EOcLKvbdmuUzKiqf
+EPDKjvbdsQVnibuf
+EObjjvbdOSsugEtp
+EOcLKvbdYlSETnLm
+EObkKvbdUtNUGMWK
+DoDLKvbdzeZnzeZp
+DoDKjvbdqTtHRqkU
+EObjjvbdmbJvxPNu
+DoDLKvbdliDsqUqa
+EPCjjvbdhanbdvpq
+DoDKjvbdiifHilxS
+DoDKjvbdmJDsptqa
+DnbkKvbdDncKkWcE
+EPCkKvbdaofgELzd
+DncKjvbdijGIJmXr
+EPCkKvbdRkYfUgLT
+EObkKvbdHEKuibKK
+DnbjjvbdVhXuwfxz
+DoDLKvbdiMEcmuCy
+DnbkKvbdJcJcQibx
+DnbkKvbdmfeYNOGy
+DoDKjvbdqUTgSSKt
+EPDLKvbdePErjtUS
+EObkKvbdaNKasUmH
+EObkKvbdiifIJmYS
+EOcKjvbdsPunjCvG
+EObkKvbdbrcKtDjB
+EPDKjvbdbhlikFwY
+EPCjjvbdrpVnjDWG
+EPCjjvbdaMkCStlg
+DncKjvbdMpXqVnGs
+EPDLKvbdZjShPfbG
+EPDLKvbdfHkVrOQg
+DoCkKvbdDnbjjvbd
+DoCkKvbdkySqsYft
+DoDLKvbdZRMeImEq
+DoDLKvbdYpleIleR
+DncKjvbdiHJbyViu
+EObkKvbdrMyixkgi
+EPDKjvbdqvokbiYq
+EOcKjvbdzitoodTU
+DnbjjvbdVYhTyjnn
+EPDLKvbdyYJJbPzL
+EObkKvbdeFPSCWcK
+EPDKjvbdIsZArlxM
+DnbjjvbdkIHLfGNk
+DoDLKvbdehLVqmqH
+EOcLKvbdvBEZTPFI
+DncKjvbdnUuZjirG
+EPCjjvbdakLfOnDA
+DnbkKvbdEzsqEkcJ
+DnbjjvbdVhXvXgYz
+DoCjjvbdIryBTNYM
+DncKjvbdZirgpHBf
+DoDKjvbdEYYLsstM
+DnbjjvbdZshhyETO
+DoCjjvbdOTUVgFVQ
+EObjjvbdZisHpGbG
+DoDLKvbdkDLkRGtg
+EObkKvbdegjvSNpg
+DncLKvbdfIKvRnQg
+DncLKvbdJKEAJpGd
+DncKjvbdrRtkNkBN
+EPCkKvbdjvWnDaxX
+DoCjjvbdmfdwmNgZ
+DnbjjvbdbrcLUEJa
+DncLKvbdnQZxujxb
+DoDKjvbdNsTugEuQ
+EOcKjvbdUVlPisaR
+EObkKvbdHDjujBij
+EPDLKvbdSBdFMJYk
+EPCkKvbdVvhxVdFH
+DncKjvbdIsYaTNXl
+EPDLKvbdIrxaSlxM
+EPDKjvbdfoazwDwh
+EPCkKvbddeOqbXDK
+DoCjjvbdJpzEnfNe
+DncKjvbdqiAKFNOe
+EPDLKvbduDCtwWOo
+DnbjjvbdZjShQGbG
+EObjjvbdVAbQsRSZ
+DncLKvbdtcCuWuoP
+DoDKjvbdTvLoitAq
+EOcLKvbdZQleIleR
+DoCkKvbduLxXAtAw
+DnbjjvbdqYoHfqDx
+DoDKjvbdJYTbHkqQ
+DncLKvbdGZUtaDxC
+EObjjvbdqFdEtWAh
+EPCkKvbdILaznWqL
+EObkKvbdQwNdCkhD
+EPCkKvbdmJDsqUqa
+EOcKjvbdvBEYrneI
+DoDKjvbdapGgELzd
+DoCjjvbdwWlAvAvV
+DoDLKvbdJbicQicY
+EPDKjvbdaaVdepPw
+DoCkKvbdsZkosAhO
+DoCkKvbdNeETiJKd
+EObkKvbdEObkLXCd
+EPCjjvbduCbuXVno
+DoCkKvbdrykpTBHn
+DnbkKvbdrEFIpNua
+DoCjjvbdlYrrSxft
+DoDLKvbdqdFIpOVa
+EObjjvbdrbFmMGjy
+DnbkKvbdRpUHKGDw
+EOcLKvbdzoPpdcMY
+DoDLKvbdfILVqnQg
+DoCkKvbdlZSqsZHU
+DncKjvbdrzMQSaIO
+DoCkKvbdhuZeWrUb
+EObjjvbdfSAvzkbo
+DoCkKvbdVZIUZjnn
+EOcLKvbdhlEdOUcZ
+DoDKjvbdbUagXkUI
+DoCjjvbdqUTgRqjt
+DoDLKvbdqTsfrRjt
+DnbkKvbdrouoKCuf
+EPDKjvbdmbKXXoNu
+DoDLKvbdhbPDEwRR
+DncLKvbduVnYKRTA
+DoCjjvbdcJNKKfXY
+EPCjjvbdeFOrCXDK
+EPCkKvbdczYoxYpb
+DnbkKvbdKfGHaaRV
+DoCjjvbdMuTRjmAX
+DoDKjvbdkMalZeGo
+DnbkKvbdbhmKLFvx
+EPDLKvbdjuwODbXw
+DoDLKvbdUMVoBVoJ
+DoCkKvbdRpTgJfDw
+EOcLKvbdajlFoNcA
+EPCjjvbdRMwaxnUz
+EOcLKvbdJcJbpjDY
+DoCjjvbdjhHLefNk
+EOcLKvbdcasNSATm
+DoDKjvbdyOTHwriD
+EObjjvbdKQydnenF
+EObjjvbdZirhPgBf
+EPCjjvbdBiKbLIfK
+EOcKjvbdNeDtIiKd
+EOcKjvbdkDLjqGtg
+DoDKjvbduDDVWuoP
+DncLKvbdePErjtTr
+EOcKjvbdJbicQjDY
+EPDKjvbdrylQTBHn
+DnbjjvbdkMbMZeGo
+DncLKvbdtlYWaUAw
+DoCjjvbdDwxMUTtM
+EObkKvbdjblKqGtg
+DoDKjvbdRMxCZNtz
+EObkKvbdqYoIGqDx
+EPDKjvbdmfeYNNgZ
+EObjjvbdTAFIhCPE
+DoCjjvbdjKGIKMxS
+EOcLKvbdMpYRWOHT
+EOcLKvbdMoxRVnGs
+DncKjvbdhaoDEwQq
+DnbkKvbdEXxMTtTl
+EPCkKvbdMgCpMpVL
+EObjjvbdRzKITDWA
+EOcLKvbdrzLosBHn
+EPCkKvbdBraCsfWr
+DoCkKvbdaaVeGPow
+EOcLKvbdIGgZyXxH
+EPDKjvbdliETptqa
+EOcLKvbdbKlGPODA
+DnbjjvbdRadElJZL
+EPDLKvbdjFLHVPAO
+DnbkKvbdiBnbdwRR
+EObkKvbdvBDyTOeI
+DnbjjvbdUyHtZjnn
+DnbkKvbdmgFYNOGy
+DnbkKvbdGKdsDHlu
+EPDLKvbdZRNEiMeR
+DoCkKvbdbLLeoODA
+EObkKvbdANIZSvzY
+DoCkKvbdziuPpDrt
+DnbjjvbdWHwvXgYz
+EPDKjvbdsBfNLgLZ
+DoCkKvbdWWiXudFH
+EPDLKvbdwzIGGYEr
+EOcLKvbdVTmUGMWK
+EObjjvbdMSXMytpz
+DncKjvbdZirhQGaf
+EObjjvbdCJLBjiGK
+EPCjjvbdZLrETnLm
+EObjjvbdelevfljL
+DncKjvbdGYuVBEYC
+EPCkKvbdkCkjpgUg
+DoCkKvbdbhljLFwY
+DnbjjvbdeEoSBvbj
+DncLKvbdvAcyTPFI
+DnbkKvbdjblLQgVH
+EPCjjvbdeEoSBvbj
+DnbkKvbdaMjbStlg
+EObjjvbdrDdhpOWB
+EOcKjvbdbKlFoODA
+EPDLKvbdZjTIQGaf
+EObjjvbdEzsqEkcJ
+DnbjjvbdZRNEiNEq
+EObjjvbdqlzJxlIJ
+DnbkKvbdkIHLfFmk
+EObkKvbdMtrrKmAX
+EPCkKvbdNQXpvNgT
+EPCkKvbdbrcKtEKB
+EObjjvbdSPtGjGEX
+DoDKjvbdxwiJaoyk
+DnbjjvbdVYhUZkPO
+DoDLKvbdXrlBNUPY
+DoDKjvbdZnmiEdzK
+DoCjjvbdWWiXvDeH
+DoDLKvbdyNsHwsIc
+DoDKjvbdwyhFfYEr
+EPDLKvbdNeDshhkE
+EPDKjvbdBiLBkJFj
+EOcKjvbdJqZdoGNe
+EOcKjvbdbAvEepQX
+DoCjjvbdaNLBsUlg
+EPDLKvbdvBDxsOdh
+DncKjvbdGFirNiTq
+EPDLKvbdZnmiEeZj
+DncLKvbdePFSjtTr
+EOcKjvbdnGdwlnHZ
+EOcLKvbduDDUvuno
+EObjjvbdZQmFIldq
+DoCkKvbdcyxpYYqC
+EOcLKvbdMRvlzVQz
+DoCjjvbdtcDUwVoP
+EPCkKvbdrXQLbhxq
+DoDKjvbdkVwODbXw
+DnbjjvbdnCJwYOmu
+DnbkKvbdqvpLbhxq
+DoDKjvbdKDJcQjDY
+DnbkKvbdvwMAvAuu
+EPDKjvbdtvNxKRTA
+DoDKjvbdYkqctOMN
+DoDKjvbdtcCuWvOo
+DoCjjvbdEObkLXDE
+DoCkKvbdbrbjtDia
+EObkKvbdDncKkXDE
+DnbjjvbdxxJKBozL
+EPCjjvbdbhlikGWx
+DncKjvbdJXtCIMRQ
+EOcLKvbdkVvmcaxX
+DoCjjvbdqwPkbhyR
+EObjjvbdySnImRbH
+EObjjvbdZQleImFR
+EObkKvbdmpZxujyC
+EPCjjvbdhbPDEvpq
+EObkKvbdpyPHgREY
+DoDLKvbdwzIGGXeS
+EObjjvbdaSGChUGL
+DoDKjvbdrbFmMGkZ
+EPCkKvbdxKwEHzyf
+DnbkKvbdJXtBgkpp
+EPCkKvbdlZTRrxft
+EOcKjvbdFVyPpNKF
+DoCkKvbdaRecHsek
+DoDKjvbdFfKRnJUR
+DoCjjvbdyOTIXrhc
+DoDLKvbdyOSgxShc
+DoDKjvbdEOcKjwCd
+DoCjjvbdzoPpeClY
+DoCkKvbdURRPVUhN
+DoDLKvbdVqmxCFMD
+EOcKjvbdNVSrKmAX
+EOcKjvbdTvLpKTaR
+EPDLKvbdCTAbtFwS
+EPDLKvbdZyEKNblS
+EOcLKvbdsCFllHLZ
+EObkKvbdjlbMZeHP
+EPDKjvbdMpXpunGs
+EObjjvbdaNLCSuNH
+DoDLKvbdkCkjqHUg
+EPCjjvbdTYKlNzjx
+DnbjjvbdNxOuzdOU
+DoCkKvbdegjvRmpg
+DoCjjvbdhfjCyWKV
+DncLKvbdjggMFfNk
+EOcKjvbduVmwjRTA
+DnbkKvbdDjHiuxKA
+EOcLKvbddePRavcK
+DnbkKvbdwkWcgzyf
+DnbkKvbdHlBznXQk
+EPCkKvbdatafxKsh
+EPCjjvbdcJMjKfXY
+DoDKjvbdrDdiQOWB
+DoDLKvbdVvhwvEEg
+EObjjvbdwjvdHzzG
+DncLKvbduMYXAtAw
+DoDLKvbdZQmFJNEq
+EPCjjvbdyOTIXriD
+DoCkKvbdbiNKLGWx
+DncKjvbdHEKvKBij
+EPDLKvbdYlSDtNkm
+DoDKjvbdTqROuVIN
+EPCkKvbddeOqbXCj
+EOcLKvbdCTBCsewS
+EPCjjvbdnUtykJrG
+DnbjjvbdlZTSSyGt
+EPCjjvbdjmBkyeGo
+DnbkKvbdVhXuwfxz
+DncLKvbdePFTLTsr
+EOcKjvbdemGWgMik
+EObkKvbdhuZeWquC
+EPCjjvbdEvYpQNKF
+EOcKjvbdpaJFAXHd
+DoDKjvbdJSyBSmYM
+EOcLKvbdSCDdlIxk
+DncKjvbdSLZGVGkT
+DnbkKvbdrbFlkgKy
+EObjjvbdJSyAsMwl
+EOcKjvbdEOcKkXDE
+EPCjjvbdMoxQumfs
+EPDKjvbdUQpnuUgm
+DncKjvbdaaWFFoow
+DnbkKvbdakMGPODA
+EObkKvbdrEEhomua
+EOcKjvbdmozZWLYb
+EObjjvbdVgwuxGxz
+EOcLKvbdCJLCKhej
+EPDLKvbdVUNUGLvK
+EOcLKvbdLGGHbBRV
+DoCkKvbdlqxtysEJ
+EOcLKvbdcScLTdKB
+DncKjvbdhtydwRtb
+DoCjjvbdcTCjscia
+DncLKvbdUslsekuj
+DoDKjvbdwuNFRYkn
+EOcLKvbdijGHjNYS
+DoCjjvbdJSyBSmYM
+DoDKjvbdEYXlUTtM
+EPDKjvbdUyITzKoO
+DnbkKvbdvBDyTPFI
+DoDKjvbdYlRcsmkm
+DoDKjvbddePRbXCj
+EPCkKvbdVZHtZjoO
+EPDLKvbdWXIxVceH
+EPCjjvbduDDUwVoP
+DncKjvbdQlxBxnUz
+DoDLKvbdfpBzvdYI
+DoCjjvbdMJBlRYAS
+EPCkKvbdZisHofaf
+DnbkKvbdkWXNdCXw
+EOcKjvbdEYXkstTl
+EOcKjvbdfekymgHA
+EPDKjvbdelfWflik
+EPCjjvbddCTNSAUN
+EPDKjvbdpfDeUVaI
+DncLKvbdiBnbeWqR
+EObjjvbdEuyPoljF
+EPCkKvbdRDcBQRES
+DncKjvbdhfibxujV
+EObkKvbdVqnYBeMD
+EPDKjvbdJKEAKQGd
+EOcLKvbdsQVoJbuf
+EOcKjvbdqcdhonVa
+EObjjvbdJcKCqJcY
+EOcKjvbdpfEEsuaI
+EPDLKvbdxnTIYShc
+EOcLKvbdxVMdqYlO
+EObjjvbdZyDimcMS
+DncKjvbdiGjCxvKV
+DoCkKvbdRbEEkiYk
+DoCjjvbdWIYVxHYz
+EPDLKvbdYzcFqjVy
+DncLKvbdTYLLmzjx
+DoDLKvbdwXLaVaWV
+DoDLKvbdMRvlyuQz
+DoCjjvbdajkeoNcA
+EPCjjvbdjEkHUoAO
+DoCjjvbdZoNiFFZj
+DncLKvbdlZTRryHU
+DoCjjvbdcTDLTdJa
+EOcLKvbdlhctRVSB
+EObjjvbduaEYroFI
+DncKjvbdzjUpQDsU
+DoDLKvbdyqPNIiwA
+DnbjjvbdhkdcnUby
+EObjjvbdVYgtZjoO
+DnbjjvbdCJLCLJFj
+EPCjjvbdzeZnzdyp
+DnbjjvbdqlyjZMIJ
+EOcLKvbdGAnpyJzm
+DoDLKvbdNGcQMpVL
+DncKjvbdADSXiyiQ
+DoCjjvbdLBLHNCYR
+DoCkKvbduVnXjRTA
+DncKjvbdtSqsZZeD
+EPDKjvbdpyOhGqEY
+EObjjvbdEuyPomKF
+EPDKjvbdyOSgxTIc
+EPDKjvbdGFiqnJTq
+EOcKjvbdyYJJbPzL
+DncLKvbdADRwjZiQ
+DncLKvbdCSaDUFwS
+DoDLKvbdEzsqEkbi
+EOcLKvbdssSTYyeD
+DnbkKvbdSBdEkiZL
+EObjjvbdFWZQPlie
+EObkKvbdbBVeFpPw
+DoDLKvbdBdQBVjMf
+EPDLKvbdptUHRqjt
+EPCkKvbdQwODcMID
+DoDLKvbdelevgMik
+DnbjjvbdVTmUFkuj
+DnbkKvbdLYqJrzuG
+DoCkKvbdCTAbsevr
+DoCjjvbdJpyeOfOF
+EPCkKvbdOStWHEtp
+EOcLKvbdKVtfEEfi
+DoCkKvbdmuUykJqf
+DnbjjvbdQZNAHSrK
+DnbjjvbdMgDPlpUk
+DnbkKvbdCIkBjhfK
+EObjjvbdBsBCsewS
+EOcLKvbdYzbfRivZ
+EOcLKvbdrzMQSaHn
+EOcKjvbdRosfjFcw
+EPDKjvbdANHyTXZx
+EPCkKvbdliDsptqa
+EOcLKvbdACrXizIp
+EPCjjvbdLFfICApu
+DoCjjvbdbAvEepPw
+EOcKjvbdTpqPVVHm
+DoCjjvbdsBemMGjy
+EPCkKvbduaEZTPEh
+DoCkKvbdOStWHEtp
+EPCjjvbdbBVeGQPw
+EObjjvbdOSsufeUp
+DoCkKvbdjAQHBPgK
+EPCjjvbdbBWEfPow
+EPDKjvbdtSqsZZdc
+EPCkKvbdegjuqmpg
+DoDLKvbdRotGifDw
+DoDKjvbdmJEUQtrB
+DoCjjvbdcIljKewY
+EObkKvbdbiMjKewY
+EObjjvbdcScKsdJa
+EPDKjvbdtSqsYyeD
+DnbkKvbdrpWOjCvG
+EPDLKvbdBiKbLIej
+EPCkKvbdBdPaWJmG
+EObjjvbdZRNEhmEq
+EOcLKvbdiUzFWrUb
+EPCkKvbdmIdUQtrB
+EPCkKvbdbUafxLTh
+EOcKjvbdnCKWxOmu
+DoCkKvbdsZkosBIO
+DnbkKvbdHDjujCJj
+DoCjjvbdWSOYCFLc
+EPDKjvbdmJETqVSB
+DnbjjvbdrXPkcJYq
+EObkKvbdMgDPlpVL
+DnbjjvbdZisHpGaf
+DoCjjvbdGGJqmiTq
+EObkKvbdIHGyyYXg
+EObkKvbdqTsgRrKt
+EObjjvbdmJDtRVSB
+DnbjjvbdddoSBvbj
+EPDKjvbddePSBvbj
+DnbjjvbdBcpAvJlf
+DncKjvbdezvYeItX
+DoDKjvbdmgEwmNfy
+EObjjvbdDigivXjA
+EOcLKvbdmJEURUrB
+EOcLKvbdePFTLTtS
+EPDKjvbdVTmUGMVj
+EPDKjvbdnBivwnnV
+EPCjjvbdZnmhddzK
+DncKjvbdZeXfzgiC
+DoDLKvbdEuyPpNJe
+DoDLKvbdqdEhpNua
+DoDKjvbdFWYpQMie
+DoCkKvbdMfcQMpVL
+EOcKjvbdmttykKSG
+DnbjjvbdlhcspuSB
+EPCjjvbdWSNwbFMD
+EPDKjvbdRbEElIyL
+EOcKjvbdyNsHwsIc
+EPCjjvbdrylQTAgn
+DncLKvbdADSYJyiQ
+EOcKjvbdZjTIPgBf
+EObjjvbdKDKDQibx
+EObkKvbdKDJcRJcY
+DoCkKvbdmSZUzSdJ
+EPCjjvbdaNKartlg
+DoDKjvbdIGgZyXwg
+EObjjvbdauCHXjsh
+EObkKvbdxUmEpyLn
+EPCjjvbdNsTugEtp
+EPDLKvbdZyDimblS
+DoDKjvbdbUagYKtI
+DncKjvbdliETpuSB
+EOcKjvbdDihKWXjA
+DncKjvbdZtIiZETO
+EObjjvbdygZMAMeX
+DoDKjvbdfNGWgMik
+DoCjjvbdZMSEUNkm
+EOcKjvbdsrqsZZdc
+EPCkKvbdACqxJzJQ
+EPDLKvbdNdcshiKd
+DoDKjvbdyqOmIiwA
+EOcKjvbdRMwbYmtz
+EOcKjvbdYpmEhleR
+DoDKjvbdjJfHimYS
+DoCjjvbdrbFmMHLZ
+DoCkKvbdBcpBWKNG
+DoDKjvbdIxTbHkqQ
+DoDKjvbdhuZdwSUb
+EPDLKvbdJYUBglQp
+EPCkKvbduCcUwVno
+DnbkKvbdwuNEpyMO
+DncKjvbdssSSxzEc
+DoDLKvbdGdLWJbKK
+EObjjvbdFjdsDIMu
+DncLKvbdfkGzbfAE
+EOcLKvbdrRtkOLBN
+EPDLKvbdajkfOmcA
+EPCjjvbdrMzJxkhJ
+DncLKvbdqZOhHREY
+DoDKjvbdmJEUQuSB
+DnbkKvbdRDbaQRES
+EPCjjvbdpyPHgREY
+DnbjjvbdMIalQxAS
+DncLKvbdiZuGMROG
+DoDKjvbdgFkymfgA
+DncLKvbdsCGMkgLZ
+EObkKvbdRotHJecw
+EPDKjvbdkClKpftg
+EPCkKvbdRjyGUgLT
+EOcKjvbdhuZdvqtb
+EOcLKvbdmttzKjSG
+EObjjvbdhlEdOVDZ
+DoDLKvbdZisHpGaf
+DnbkKvbdTqQntuHm
+EPDLKvbdNdctIiLE
+EObkKvbdWRnXbFLc
+EPDLKvbdKVtfDdgJ
+EPCkKvbdJSyBTMwl
+DnbkKvbduWNxKQsA
+DoCkKvbdqGEFUVaI
+EPDKjvbdhkdcnVDZ
+EPCjjvbdySnIlrBg
+EOcLKvbdYlRctNlN
+EObkKvbdvBDxroFI
+DoDLKvbdxwiJbPzL
+EPCjjvbdyNsHxTJD
+DoCjjvbdhfjDYujV
+DoDLKvbdcImKLFwY
+DnbjjvbdqwQMChxq
+DncLKvbdaaWEfQPw
+DnbkKvbdUQqOuUhN
+EOcLKvbdUaCRSqSZ
+DnbjjvbdRMxByOUz
+EPDKjvbdKCjCpjCx
+DncLKvbdrMzJyMIJ
+EPCjjvbdOEdThhjd
+EPDKjvbdrSUkOKaN
+EObkKvbdMowpunGs
+DoCjjvbdhzVGLpmf
+EOcLKvbdaMkBsVMg
+DoCjjvbdkIGkfFnL
+DnbkKvbdYpldiNFR
+EPDLKvbdZxcjNcMS
+EPDKjvbdGGKRnJUR
+EPCjjvbdbiNKKfWx
+EObjjvbdmRyUyrci
+DncKjvbdLrXNZtpz
+DncKjvbdZjTIPgCG
+DnbkKvbdypoNIiwA
+EPCjjvbdDihKVxKA
+DncKjvbdyfxlANFX
+DoDKjvbdiMFEOVCy
+EPCkKvbdtcDUvvPP
+DoCkKvbdEvYpQMie
+DnbjjvbdZLrDtOLm
+EPCjjvbdKQzFPGNe
+EPDKjvbdGdLVjCJj
+DoDKjvbdqYoHfqDx
+DoDLKvbdFVxoomJe
+DnbkKvbdKRZePFnF
+DoCjjvbdFVyQQMjF
+DnbkKvbdTulQJsaR
+EObkKvbdkHgMFenL
+DoDKjvbdVUMselVj
+EPDLKvbdrDdhonVa
+DncKjvbdkVvmcaxX
+DoDLKvbdrRuKnLAm
+EOcKjvbdJbibpjDY
+EPDKjvbdXrlAmToY
+DnbkKvbdZirhQGbG
+DnbjjvbdjgfkfFnL
+EOcKjvbdGFjSOJTq
+DoDKjvbdSCDeMJYk
+DoCkKvbdpecdtWAh
+EObjjvbdzeZnzdyp
+DoCjjvbdMJBlQxAS
+EPDKjvbdnBivwnmu
+DoDKjvbdRadElIyL
+DoDLKvbdsZlPsBHn
+EObjjvbdznopeDLx
+EOcLKvbdCJKbKiFj
+DncLKvbdmgExNNfy
+DnbkKvbdnPzYvKxb
+DncKjvbdrDdiPnVa
+DoCjjvbdAMgxrwZx
+DncLKvbdTfzmkwWF
+DncKjvbdqiAJdloF
+EPCkKvbdwuMeRZLn
+DoCjjvbdVUNUFkuj
+DoDLKvbdKQyePGNe
+DncKjvbdLqvlzVQz
+DoDKjvbdmgFYNNgZ
+DnbjjvbddxZtTrFz
+EObkKvbdqTsgSSKt
+DnbkKvbdZxcimcMS
+DoCjjvbdANHySvyx
+DoDLKvbdZQmFJMdq
+DoCkKvbdHDjujBij
+EPDLKvbdsPuoJbuf
+EPCjjvbdYpmEhmFR
+DncLKvbdZjTHpGaf
+EPDKjvbdEuyQQNKF
+DoCkKvbdmbKWxPNu
+DoCkKvbdRjyFtfjs
+DoCkKvbdiifHjNYS
+EPDKjvbdpyOhGpdY
+DoDKjvbdUVlPitBR
+DoCjjvbdEKIJuwjA
+EPCjjvbdFkFTDHmV
+EOcLKvbdySnJNSCH
+DncLKvbdRpUHJedX
+EPDKjvbdtvOYJpsA
+DoDKjvbdKDKDQjCx
+DoDLKvbdaMkCTUmH
+EOcKjvbdMpYRVnGs
+EOcKjvbdtSqsYzFD
+DncLKvbdKaKgNCXq
+DoCkKvbdsCFllGkZ
+EObkKvbdNrsvGeUp
+DoDKjvbdmaivxOnV
+EOcLKvbdOEctIhjd
+DoCkKvbdemGXGljL
+DoDLKvbdjvWmdBxX
+EPCkKvbdCIjbLIej
+EPCjjvbdkHfkfFmk
+DoDLKvbdwzIGFwdr
+EOcKjvbddBrlrAUN
+EPCkKvbdJutecdgJ
+DoCjjvbdWRmwaeLc
+DnbkKvbdiVZdwRuC
+DnbjjvbdGLEsDHmV
+EPCkKvbdxsOJNSCH
+EPCjjvbdIwtBgkqQ
+DncKjvbdbrbjtDjB
+EPCkKvbdjhGkeemk
+DncKjvbdWWiXvDeH
+EPCjjvbdnUtzKiqf
+DncKjvbdTukoitAq
+DncLKvbdCIkBjhfK
+DoCkKvbdhgKDZWJu
+EPDKjvbdBhkBjiFj
+DnbjjvbdMfbpNPtk
+DoDKjvbdnBjWxPOV
+DoCjjvbdEJhKWYKA
+EOcKjvbdTpqOtuHm
+DoCjjvbdwzIFfXdr
+EOcKjvbdrpVoKDVf
+EOcLKvbdEYYLtTsl
+DoCkKvbdLFfICBQu
+EOcKjvbdeXzTsrFz
+EOcLKvbdSQUHKFdX
+EOcLKvbdraemMHLZ
+EPDKjvbdkIGlFemk
+DncKjvbdOYOuzcnU
+DoCkKvbdIwtCILpp
+DncLKvbdZoNiEdzK
+DoDKjvbdsrqsZZeD
+EPDLKvbdzGyMANEw
+DncLKvbdBraCsewS
+EObkKvbdpyOgfpcx
+DnbjjvbdxmrgxTIc
+EOcLKvbdZjSgpHCG
+EPCjjvbdrWpMDIxq
+DncKjvbdZtJIyESn
+EPCjjvbdJSxaSmXl
+DoCjjvbdiMFEOVCy
+DoCjjvbdDwwlTstM
+DncLKvbdJYUCHkpp
+EPDLKvbdsrrSxzFD
+EObjjvbdkHgMFfNk
+EPDKjvbdOStVgFUp
+DnbjjvbdjhHMGGOL
+DnbjjvbdZyEJmcLr
+EPDKjvbdDihKWYKA
+DncLKvbdRosfiecw
+DoCjjvbdyTNhmSCH
+DnbkKvbdFeirNhsq
+DoDKjvbdrDeIpNvB
+EObkKvbdVAaqTRSZ
+EPDLKvbdLAkGlbXq
+EOcKjvbdVAaprqRy
+EPDLKvbdfIKvRnQg
+EPCjjvbdUQpoVUgm
+EObjjvbdxVNEpyMO
+EOcKjvbdsCFllGkZ
+DncKjvbdsBelkgLZ
+DoDLKvbdvlvANDeN
+DoCjjvbdnBivwoNu
+EObjjvbdsCGMkgLZ
+EObjjvbdsPvPJbvG
+EPDLKvbdxrnImRbH
+EPDLKvbdNPxRVnHT
+DoDLKvbdMtrqkNAX
+DoDKjvbdiGicZWJu
+EPDKjvbdOFEUJJLE
+EPDLKvbdoAKzshDn
+DoDKjvbdehKvRnQg
+EObjjvbdLLBIWAKZ
+EPDKjvbdeOdsLUUS
+DncKjvbdjvWmdBxX
+DncLKvbdezuyFJTw
+EPCkKvbdNPwpumgT
+EPCjjvbdkxsRrxgU
+EPDLKvbdptUHSSLU
+EPDKjvbdeATqNXif
+EPCkKvbdjlakzEgP
+EObjjvbdyXiKCPzL
+DoCjjvbdhlFDmuDZ
+DncKjvbdauCGxLUI
+EObjjvbdySmiNSBg
+EOcLKvbdfNGWfljL
+DncLKvbdVviYWDdg
+EPCkKvbdkIHLefOL
+EPDLKvbdRNYCZNtz
+DoDLKvbdmfdxNOGy
+DoDLKvbdcScKtDjB
+EOcLKvbdEPDLKvcE
+EPCjjvbdUaBprqSZ
+EObkKvbdddnqbXDK
+EPCkKvbdaaVeGQQX
+DoDLKvbduoTzqKnt
+DnbjjvbdqwPkbhxq
+EObkKvbduaEZTOdh
+EOcLKvbdKfFhBaRV
+EOcKjvbdVYgtZjoO
+EOcLKvbdrSVKnKaN
+DnbkKvbdsCFmMGjy
+DnbkKvbdSLYeuGkT
+DoCkKvbdwWlAvAuu
+EPCjjvbdRXOEClID
+EPCkKvbdCIkCKiFj
+EOcKjvbdGckViajK
+DoCkKvbdznpRFCkx
+DnbjjvbdxKwDgzyf
+DncKjvbdVAaprprZ
+DoDKjvbdOEctIhjd
+EObjjvbdmIdTptqa
+DnbjjvbdvwMAuaWV
+EObkKvbdEYXksssl
+EPCkKvbdiZtelQnG
+EOcKjvbdqdEhpOVa
+DnbjjvbdidjfuPAO
+DnbkKvbdnBivxPNu
+EObkKvbdrSVKmkBN
+DnbkKvbdiCPDFWqR
+DncKjvbdZisHofaf
+DoCjjvbdJvVFcdfi
+DoDLKvbdcyxpYYpb
+DoCjjvbdrykpTBHn
+EPDLKvbdqrUkOKaN
+DoCkKvbdGQATWgFy
+DncKjvbduaDxsPFI
+EPCkKvbdYkqdTnLm
+EObjjvbdQYmAGsRj
+DnbkKvbdZyEKOCkr
+DnbkKvbdOEdThhjd
+EPDKjvbdiCOcFWpq
+EOcKjvbdMfcQNPtk
+EPDLKvbdLGFhBaRV
+EPDLKvbdssSSyZeD
+EPCkKvbdTAFJIBoE
+EObkKvbdeFPRavbj
+DnbkKvbdjKFhKNYS
+DncLKvbdCJLBjiGK
+DncLKvbdqlzJyLhJ
+EOcLKvbdRyigsCvA
+DoDKjvbdYqMdhldq
+DnbjjvbdehKvSOQg
+EObjjvbdMgColouL
+DoCkKvbdehKuqnRH
+DoDKjvbdQvmdCkhD
+DoDKjvbdMSWlzVQz
+EObkKvbdbhlikGXY
+DoCjjvbdeAUQmYJf
+EPCjjvbdZyEJmcMS
+DoDKjvbdIGfzYxYH
+DoDLKvbdHDjvJbJj
+EOcKjvbdQwNdCkgc
+EPCkKvbdRWnDcMHc
+DnbjjvbdrMzJyMIJ
+DncKjvbdlhctQuSB
+DoDKjvbdbPgGdLzd
+EObkKvbdijFhJmXr
+DoCjjvbdbQGgDkzd
+EPDLKvbdDihJvXjA
+EObjjvbdaNKasUmH
+DncKjvbdZyEKOClS
+DnbjjvbdSLYfVHLT
+DoDLKvbdwzHfFweS
+EPCjjvbdfNFwHNJk
+DoDLKvbdelewHNJk
+EPCjjvbduaDxroEh
+DoDKjvbddwytURez
+DncKjvbdwtmEpyLn
+EOcLKvbdCIkBkIej
+EOcLKvbdiLddOUcZ
+EPDKjvbdiUydwSVC
+DncKjvbdrEEiQOVa
+DnbkKvbdYzbeqivZ
+DoCjjvbdkVwOECYX
+DoDLKvbdZLqcsmkm
+EObjjvbdVYgtZkPO
+EOcLKvbdHffyxwwg
+EPDKjvbdcIljLGWx
+DnbkKvbdMpXpvNfs
+EOcLKvbdFeirOJTq
+DncLKvbdWWhxWEFH
+DoCjjvbdZRMdhmEq
+DnbkKvbdULvPBWPJ
+EPDLKvbdZRMdiMdq
+DnbjjvbdTYLMNzkY
+DoCkKvbdZxcjNblS
+DoCkKvbdKCibpicY
+EPDLKvbddoFTKtUS
+DncLKvbdcImKLGXY
+EOcKjvbdKaLGmBwq
+EPCkKvbdnHFYMnGy
+EPDKjvbdUQqPUuIN
+EPDKjvbdeAURNYJf
+DoCkKvbdxwiKCQZk
+DnbkKvbdKVuGDeGi
+EPDKjvbdrovOicVf
+DoDLKvbdrylQSaHn
+EOcLKvbdySmhlrBg
+EOcLKvbdNrsufeVQ
+EOcKjvbdzoQREblY
+EPCkKvbdzaAOgHCM
+DoCjjvbdZLqdTmkm
+EObkKvbdNGbpNQUk
+EOcKjvbdZshiYdSn
+EPDLKvbdDncLKvbd
+EOcKjvbdqlzJyMHi
+DoCkKvbdBhkCKiFj
+EOcLKvbdRaceLhyL
+EPDLKvbdxsNiNRbH
+DoDKjvbdtcCtwWOo
+DnbjjvbdmfdwlnGy
+DncKjvbdREDBQQdS
+DncLKvbdnPzYvKxb
+EPCjjvbdjgfkefNk
+DnbkKvbdnUtykJrG
+EPDKjvbdSCEFLiYk
+EOcLKvbdGcjuiajK
+EPCjjvbdJYUCHlRQ
+EPDLKvbdYpleIldq
+EObkKvbdfMfWflik
+DncLKvbdwuMdpyLn
+DoDLKvbdEPDLLWcE
+DoDLKvbdZLrDtOLm
+DoCkKvbddZxoxYqC
+DncLKvbdTulQKUAq
+DncKjvbdqrUjnKaN
+DoCkKvbdGFjRmiTq
+EPCjjvbdpssfrRkU
+EPDKjvbdrXQLbiYq
+DoCkKvbdNQYQunHT
+DoCkKvbdNrtWHEuQ
+DncLKvbdjgflGGNk
+DncKjvbdBsBCsewS
+DoCkKvbdMpYRVmfs
+DnbkKvbdKfFhBaQu
+EObkKvbdGcjuiaij
+EObkKvbdakMGOnDA
+DnbkKvbdFyUuAcxC
+DnbkKvbdtSrTZZdc
+EPCjjvbdatafxLTh
+EPCkKvbdUGzmlXVe
+EObkKvbdZyDinClS
+DncKjvbdyzdnSIJI
+DnbkKvbdnPyxukZC
+DoDKjvbdkDMLQgVH
+EObjjvbdbVBfwjtI
+EPDLKvbdzRPMhiwA
+EObkKvbdhkeDmuCy
+DnbkKvbdZQleImEq
+EObjjvbdrDeJPnVa
+EPDLKvbdaNLBsVMg
+DnbkKvbdOEctIhjd
+EOcKjvbdatagXkUI
+DncKjvbdMowpunGs
+EObkKvbdtvNwiqTA
+DnbjjvbdyzdnSHiI
+EObkKvbdbhlikFvx
+EOcKjvbdaNKaruNH
+DnbkKvbdiVZdvqtb
+EObkKvbdVYgszKoO
+DoCkKvbdjJfIKMwr
+DncLKvbdezvZFJTw
+EObkKvbdcyxoxYqC
+EPDLKvbdFejSNiTq
+DncKjvbdIwsbIMQp
+DnbjjvbdTukpJsaR
+EPDLKvbdIsZArlxM
+EPDKjvbdTAEhgand
+EOcLKvbdfNGXHMik
+DoDKjvbdjcMLQgUg
+DncKjvbdSLYfVHKs
+DoCjjvbdnBjWwoOV
+EPCjjvbdnBjWwnnV
+EObkKvbdQvmccLgc
+EPDKjvbdwuMeRYlO
+DoDKjvbdNddUJIjd
+DoCkKvbdqUTgSRkU
+DoDLKvbdehLVqmpg
+DoDLKvbdrovOjCvG
+EObjjvbdzoPpdcMY
+EPDLKvbdZRNFIleR
+DnbkKvbdSLZGVGjs
+DoCkKvbdySmiMrBg
+DnbkKvbdwyhFfXeS
+DoDLKvbdWHwvYHYz
+DoCjjvbdIHHZyYYH
+EObjjvbdJSyArmXl
+DncKjvbdACqxJyiQ
+DncLKvbdmpZxujyC
+DoCjjvbdFkFScINV
+EPDLKvbdCDpAujNG
+DnbkKvbdhkeDnUby
+DncLKvbdFWYopNJe
+DoCjjvbdLAjfmCYR
+EPCjjvbdxrmiMrCH
+EObjjvbdcImJkGWx
+DoCjjvbdFejRnJTq
+EObkKvbdYTMAlsnx
+EPCjjvbdsPvOibuf
+EObjjvbdNeDshhjd
+EOcLKvbdBiKbLIej
+EObkKvbdauCGxLTh
+EPDKjvbdbBWEepQX
+EPCkKvbdVrNxBdlD
+EObjjvbdMIalRYAS
+EOcKjvbdJcKCpjCx
+EOcLKvbdLqwNZtpz
+DoCkKvbdZisHogBf
+DnbjjvbdEPDKjvbd
+DoDLKvbdFWZQQNJe
+EObkKvbdHgGzYwxH
+EOcKjvbdjbkkQfuH
+DnbjjvbdtkxXAtBX
+EPDLKvbdLAkHNCXq
+EOcLKvbdWWhxVdFH
+DncLKvbdCWzdIeQW
+DoDLKvbdVvhwvDdg
+EObjjvbdpfDeUWAh
+EOcLKvbdqmZixkhJ
+DncKjvbdyzdmrIJI
+DncLKvbdRpTgJecw
+DoDLKvbdGFjSOIsq
+EOcKjvbdwuNFQyLn
+DnbjjvbdIsZAsMwl
+DncKjvbdptTgRqkU
+DncKjvbdZQmEiNEq
+DnbkKvbdauCHYLTh
+EPDLKvbdyzdmrHhh
+EPCjjvbdZoOJFEyj
+EOcLKvbdUQqOttgm
+DoCjjvbdRNYCZNtz
+EPDKjvbdrRtkOLBN
+DncLKvbdmajWxOmu
+EPDLKvbdLBLHMbXq
+DoDLKvbdCIjajhfK
+EObjjvbdYkrDtOMN
+EOcLKvbdUtNUGMVj
+EObjjvbdaSFcHsek
+DnbkKvbdXrkaMtPY
+DoCkKvbdZQmFImFR
+EOcLKvbdcJMijewY
+EPDLKvbdGLErbhNV
+DnbkKvbdiUydwSVC
+EPDLKvbddndsKssr
+DoDLKvbdxwhjCPzL
+DoCkKvbdxVMeQxkn
+DncKjvbdiBoCdwRR
+EPDLKvbdnPyyVkZC
+EPCjjvbdmuUzLKRf
+DoDLKvbdSQUGiecw
+DoDKjvbdRbDdlJZL
+DncKjvbdqrVKnLAm
+DoDKjvbdVBCQsQrZ
+DoDKjvbdmbKWxPNu
+EObjjvbdFVyQPmKF
+DnbjjvbdiiehJlxS
+EOcKjvbdIrxaSmYM
+EOcKjvbdsZkosAgn
+EOcLKvbdnCKWxPOV
+EPDLKvbdKWUecdfi
+DncLKvbdhgKDZWKV
+EPDLKvbdySnImSCH
+EObkKvbdJKEAKQGd
+EOcLKvbdZMSETmkm
+DoCjjvbdhgJcYujV
+EOcLKvbdehLVqmpg
+DoCkKvbdezuyFItX
+DncLKvbdvBDxsOeI
+EObkKvbdTulPisaR
+DnbkKvbdajkfPODA
+DoDKjvbdYkrEUOLm
+EPCkKvbdfIKvSNpg
+EPCkKvbdiBncEwQq
+EOcKjvbdKWUecdgJ
+EObkKvbdYlRcsmkm
+EPCjjvbddwzUTqez
+DnbjjvbdeYZstRez
+EPDLKvbdxVNEqZLn
+DncLKvbdFjeScINV
+EObjjvbdxUleQxkn
+DncKjvbdKWUfDdfi
+DoDLKvbdssRrxzEc
+EObjjvbdRpUGiedX
+EOcLKvbdZQleJMdq
+DnbkKvbdqdFIpNua
+EPCjjvbdYzberKWZ
+DoDKjvbdxxIjBoyk
+EOcLKvbdEObkKwDE
+DoDLKvbdqquLNjaN
+DncKjvbdwuNFRZLn
+DoCjjvbdqUTgRrKt
+EObkKvbdVwIwvDeH
+DnbkKvbdVwJYWEEg
+DnbjjvbdYlSETnMN
+DnbkKvbdqTsgRqjt
+DoDKjvbdiGicZVjV
+DnbjjvbdxnTHxTJD
+EObkKvbdqUTfrSKt
+DoCkKvbdFyVVBEXb
+EOcKjvbdqGDdsvAh
+EPCkKvbdTkunaVni
+EObkKvbdMRvlzVQz
+EPDKjvbdDncKkWbd
+EObjjvbdqqtkNkBN
+DncLKvbdfHkWRnRH
+DnbjjvbdiLdcnUby
+EOcKjvbdVYgsyjnn
+EPCjjvbdUtNTfMWK
+EPDKjvbdqYoHgREY
+DncKjvbdGZUuAdYC
+DnbjjvbdDnbjjwDE
+EOcKjvbdTqQntthN
+EOcLKvbdUyITzLPO
+EOcLKvbdjblLRHVH
+DoCkKvbdLGFhCBQu
+DncLKvbdliEUQuSB
+EObkKvbdRacdkiZL
+EOcLKvbdaSFcHtFk
+DoDKjvbdJYTahLpp
+EPDLKvbdUQqOuVIN
+EPCjjvbdqmZjYkhJ
+DoCkKvbdRjyGUgKs
+EObjjvbdyNrhYSiD
+EPCkKvbdBhkCKiFj
+EObjjvbdYlSDtOLm
+DoCjjvbdTAFIhBoE
+DncKjvbdNdctJIjd
+DoDLKvbdGdKvJaij
+EObjjvbdJpydnfNe
+EPDLKvbdCDpAvKNG
+DoDLKvbdeEoRavbj
+DoCkKvbddoFSjssr
+EPCjjvbdqYoHfqEY
+EPCkKvbdFkFScHmV
+EObjjvbdcyyQYZRC
+DoDKjvbdyzdmrHhh
+DoDKjvbdUWLojUAq
+EObkKvbdiCPCdwRR
+DoCkKvbdCTBDTevr
+EOcKjvbdLAkGlbXq
+EPDKjvbdcyyQXyRC
+EPDLKvbdyNsHxSiD
+EPDKjvbdqUTgRrKt
+DoDKjvbdJuuFdEfi
+DoDLKvbdEXwktTtM
+EObkKvbdeJirVtzn
+EObjjvbdYTMBMsnx
+DnbkKvbdNQXpumfs
+EPDLKvbdzitopDrt
+DncLKvbdDxXlUUUM
+EOcKjvbdADSXiyhp
+DoCjjvbdqTsgSSKt
+DoCkKvbdZtIhxdTO
+EOcKjvbdUyHtZjnn
+EPDLKvbdcSbkTdKB
+DncLKvbdxZgfGYEr
+DncKjvbdeATplxJf
+DoDLKvbdnCJwXnmu
+DnbkKvbdbKlFnnDA
+DoCkKvbdrDeIpNua
+EPCjjvbdmttzKirG
+DoDKjvbdbrbkUDjB
+DnbkKvbddZxoxZRC
+EObkKvbdhgKDZWKV
+DnbjjvbdGFiqmhtR
+EPDKjvbdULvOaWPJ
+EOcLKvbdygYlANFX
+DnbjjvbdIHGzZYYH
+EOcKjvbdhkeENuCy
+EOcLKvbdNddTiJLE
+EObjjvbdGFiqnJUR
+EOcLKvbdjvWnEBxX
+EPCjjvbdVBCRTRSZ
+DncKjvbdVBCRTRSZ
+EObkKvbdBdQAvJlf
+EObkKvbdJYUCHkpp
+EOcKjvbdGckVjCJj
+EObkKvbdBsAcUGWr
+DoDLKvbdIxUBhMQp
+DoDKjvbdMgDQNPtk
+EOcLKvbdHEKujCKK
+DoCjjvbdLhalQxAS
+EObkKvbdULuoBVoJ
+EPDKjvbdhfjDZVjV
+DoCkKvbdKDJbqJbx
+DoCkKvbdbKlGPNcA
+DncKjvbdrpVnicWG
+EPDKjvbdvAdZSneI
+DnbkKvbdFyVUaEYC
+EOcKjvbdHDjuibJj
+DnbjjvbdbiMjLFvx
+EPCjjvbdUsltGLvK
+DoCjjvbdkNBkzEgP
+DncLKvbdFxtuBEYC
+EOcKjvbdnBjWxPNu
+DnbkKvbdqUTfrRjt
+EPCjjvbdZHXEAPSi
+DoCjjvbdxxJJapZk
+DncKjvbdZyDimcLr
+DnbjjvbdiBnbeWpq
+EObjjvbdjbkkQftg
+EObjjvbdqvokbhyR
+EOcLKvbdeYZtTrFz
+EPCkKvbdLqvmZtpz
+DoDKjvbdNeDsiIjd
+EPCkKvbdeXystRez
+EOcKjvbdAMhZSvzY
+EPCjjvbdSwkMNzkY
+DoDKjvbdtlYXAtBX
+EPCjjvbdBvzdIdov
+DoDLKvbdVBBqSqRy
+EOcLKvbdTvMQKUAq
+EOcLKvbdxVMeQyMO
+EPDLKvbdBsAbtGWr
+DoCkKvbdKefHaaRV
+DncLKvbdCTBDTewS
+EPCjjvbdTIyjRAAl
+DoDKjvbdkxsSSxft
+EObjjvbdjvXOECXw
+EPDKjvbdVTlsfLvK
+EOcKjvbdjJfHjNXr
+EObjjvbdfMfWflik
+DnbkKvbdYqNFImEq
+DoDLKvbdcJMikFvx
+DoCkKvbdrXPlDIyR
+EObjjvbdeOdsLTtS
+DncLKvbdJSyArmXl
+EObjjvbdkNBlZeHP
+EObkKvbdfHkVqnRH
+DncLKvbdKCjCqKDY
+DoDLKvbdUyHsykOn
+DncKjvbdWWiYWEEg
+EPCkKvbdKWVFdEfi
+EObkKvbdFpATWgFy
+EOcKjvbdrzLpTAgn
+EPCjjvbdhuZeWrVC
+EPCkKvbdraellGjy
+DncLKvbdGKeTCgmV
+DoDLKvbdCEQAvJlf
+DoDLKvbdJvUfEFGi
+EOcKjvbdHDkVjCJj
+EPCjjvbdZxdJnClS
+DoCjjvbdcImJjewY
+DoDLKvbdkDMLRHUg
+DoDLKvbdqZOggREY
+DoCkKvbdkMakyeHP
+DoCkKvbdEvYpPmJe
+DncLKvbdJJdAJpHE
+DoDKjvbdEPCjkXCd
+DnbjjvbdlAmOmALA
+DoDLKvbdsBfNLgLZ
+DncLKvbdKyQjSzuG
+EPDLKvbdeAURMxJf
+EPCjjvbdkHflGGOL
+EOcKjvbdEuxpPlie
+DncKjvbdcyyPxYqC
+DoCkKvbdRDbaPqES
+DncLKvbdaaVeFpQX
+EOcLKvbdMuTSLNAX
+EPCkKvbdbiMjKfWx
+EOcKjvbdSCEEkiZL
+DncKjvbdbhmJkGWx
+DncKjvbdWXJYVcdg
+EOcLKvbdvBDxrndh
+DoCkKvbdCEQBVjNG
+EPDLKvbdxUmFQyMO
+DnbkKvbdznpRFCkx
+DoCjjvbdKDJbpjDY
+EOcLKvbdREDBQRDr
+DoDLKvbdZtIhyETO
+EObjjvbdKfGHbBQu
+DnbjjvbdnUtzKirG
+EPDLKvbdyNsHwsIc
+DoCjjvbdIrxaSlxM
+DoCkKvbdRjyFuHLT
+EPCkKvbdJvUfDdgJ
+DnbkKvbdgQBzvcwh
+DnbkKvbdpyOgfqEY
+DnbkKvbdmRxuZsEJ
+EObkKvbdmRyUysDi
+DnbjjvbdrzMPraIO
+EPDLKvbdDxXksssl
+EPDLKvbdqUUGrSKt
+EPCjjvbdZisIPfbG
+EPDLKvbdiGicZVjV
+DnbjjvbdqcdiPnVa
+DoDLKvbdGKdsCglu
+EPCkKvbdYSlBNUOx
+DoCkKvbdjmBkyeHP
+EObjjvbdKDJcRKDY
+EPDKjvbdiLdcmuCy
+DoCjjvbdbAvEfQQX
+EPDKjvbdegjvRmqH
+EOcLKvbdrounibvG
+DoCkKvbdliEUQtrB
+DoCkKvbdrXPlChyR
+DnbkKvbdcyxoxZRC
+DoCkKvbdWIYWYHYz
+DnbkKvbdmJETptrB
+EObjjvbdbBVeGPpX
+DoCkKvbdypnliKXA
+EOcLKvbdatagXkTh
+EPDKjvbdrounjDWG
+EPDKjvbdUyHsyjnn
+EPDKjvbddZxoxZRC
+DnbjjvbdKCjCpjDY
+DoCjjvbdKkBHvAJy
+DnbjjvbdjbkkRGuH
+DoCjjvbdrafNMGjy
+DncKjvbdxnTHwsJD
+DncKjvbdemFvfmJk
+DnbjjvbdIwsbILqQ
+EObjjvbdUMWPAvOi
+EOcLKvbdGKdsChMu
+DoCjjvbdWXIxWEEg
+DoCjjvbdvPTzqKnt
+DoDKjvbdILazmwRL
+EPCkKvbdjlakzFHP
+EPDLKvbdKDJbqKCx
+EOcLKvbdHELWKBjK
+DoCkKvbdOFDshhkE
+EPDKjvbdBhkCKhej
+DoDKjvbdNddTiJKd
+EPCkKvbdVqmwadkc
+EPCkKvbdFfKSOItR
+EPCjjvbdZshiYcrn
+DncLKvbdvAcxsOeI
+EObkKvbdKVtfEFHJ
+DncLKvbdXsMBNUPY
+DoDLKvbdCTAbtGXS
+DoDKjvbdRyjHsDWA
+DoCjjvbdJcKDRJcY
+EOcKjvbdEuxpPljF
+DncLKvbduWNxKQsA
+EOcLKvbdhuZeXSUb
+EObjjvbdjvWnDaxX
+EObjjvbdwWlAvAuu
+EObkKvbdqquKnLBN
+DoDLKvbddCSmSATm
+DoCjjvbdwtmEpxlO
+DnbjjvbdDoCkLWcE
+DncLKvbdwyhGFxEr
+EOcKjvbdrykosAgn
+DnbjjvbdNeEUJJLE
+DoDKjvbdjuwNdCYX
+EPDKjvbdiGibyVjV
+DnbjjvbdYqNEhmEq
+EPDLKvbdxVNEpyLn
+DoCjjvbdZeYGzgiC
+DoCjjvbdZjTIQGbG
+DnbkKvbdSPsfjGEX
+EObjjvbdBsBDUGXS
+DoCkKvbdsBfNMGkZ
+EOcLKvbdLBLGmCXq
+EPDKjvbdJTZBTNYM
+DnbjjvbdJTZBSmYM
+DoDLKvbdjKFgjNYS
+DoDKjvbdqlzKYkhJ
+EPCkKvbdkWXOECYX
+EObkKvbdFkEsDINV
+EObjjvbddndsKstS
+DoCjjvbdauBfwjsh
+DnbjjvbdFjeTCglu
+EOcLKvbdfMfWflik
+EObjjvbdlYsRryGt
+EPCjjvbdtbcVWuoP
+DnbjjvbdMgDPmQVL
+DoDLKvbdjhHLefNk
+EOcLKvbdUsmTfMWK
+DoCkKvbdptTfqqjt
+EObkKvbdrRuKmjaN
+EPCjjvbdzoQQdcMY
+DoDKjvbdrpVoKDVf
+DoCkKvbdlZSrTYft
+DoCjjvbdBhjajiFj
+EOcLKvbdzoQQdbkx
+EObkKvbdOhAYZAYa
+EOcKjvbdjvXNdBww
+DnbjjvbdEXwlTtTl
+DoCkKvbdzjVPocsU
+DoDLKvbdZQldiMeR
+DncKjvbdYNqAYVVt
+DnbjjvbdtvNxKRTA
+EPCjjvbdqceIonWB
+EOcKjvbdyXiKCPzL
+DoCkKvbdfIKurNpg
+DoDKjvbdFxuVAdYC
+EOcLKvbdeOdrjssr
+DncLKvbdxnShYTIc
+EPDLKvbdoznEKwoA
+DoDLKvbdptTfrRkU
+DncLKvbdkWWnDaxX
+EPCjjvbdKWVGDeHJ
+EPCjjvbdtumwipsA
+DoCkKvbdZxcinDMS
+EObjjvbdCWzdIeQW
+EPDKjvbdHgGzYwwg
+EOcKjvbduDCtvvOo
+DnbjjvbdqvokbiZR
+DnbjjvbdmIcsptqa
+DncLKvbdrJAJdmPF
+EPCkKvbdKjaHvAJy
+DoCkKvbdhuZdwSUb
+EOcKjvbdnPzZVjyC
+DoDKjvbdYSlAmUPY
+EOcKjvbdffLzNgHA
+DncLKvbdptUHRqjt
+EPCjjvbdyTNiMqag
+DoCjjvbdauBgXkTh
+EPCjjvbdbiMikGXY
+EOcLKvbdIHGzZXwg
+DncKjvbdrXPkcIxq
+DnbjjvbdOTTugEuQ
+DnbkKvbdjcMKqHUg
+DoDKjvbdffMZnHHA
+DoCjjvbddijSWUzn
+DncKjvbdBhkCKiGK
+DncKjvbdJYTbHkqQ
+DnbkKvbdqwPlCiZR
+DoCkKvbdxUmFRYkn
+DoDKjvbdmSZUzTDi
+EPDLKvbdkyTSSxft
+DoCjjvbdmajXYPOV
+EPCkKvbdMowqVnHT
+DncLKvbdTppoUuHm
+EPDLKvbdgFkymfgA
+EObjjvbdhgJcYujV
+DncKjvbdtAGqIABS
+DoDLKvbdqZOhGpdY
+EObkKvbdjbkkRGuH
+DoCjjvbdGLEsChNV
+DnbjjvbdZoOIeEyj
+DncLKvbdbrbjsdJa
+EPCjjvbdGGJqmiTq
+EPCkKvbdNPxRWNgT
+EPCjjvbdJpydnfOF
+EOcKjvbdcyxoxYpb
+EPDKjvbdmozZWLYb
+EObjjvbdVTmUFlVj
+DoCjjvbdNrtWGduQ
+DncKjvbdqUTfqqkU
+DoDKjvbdTfznMWue
+EOcLKvbdNsTugEuQ
+DoDLKvbdjhHLfGOL
+EObjjvbdZtJJYdSn
+DoDKjvbdZjTHofbG
+DncKjvbduCbtwVno
+EPCkKvbdZtIhxcsO
+EOcLKvbdnUuZkJqf
+EObkKvbdiCPCeXQq
+EOcKjvbdZtJIxcsO
+EOcLKvbdZRNEhmFR
+DnbkKvbdFjdsDINV
+DncKjvbdsZlQSaIO
+EObjjvbduLxXAtAw
+DncKjvbddoFSjtTr
+DoCkKvbdmbKXXoOV
+DoDKjvbdOAIsTirA
+DncLKvbdMfcQMpVL
+EPDKjvbdsrqrxzFD
+EOcLKvbdZRMdiMdq
+EObkKvbdCTAbsfXS
+EPDLKvbdtunYJpsA
+EObkKvbdYSkaNToY
+DoCkKvbdZMRdUOMN
+EPCkKvbdIsYaSmYM
+DncLKvbdVYgtZkPO
+EObjjvbdaNLBsUmH
+EOcLKvbdZyEKOCkr
+DoDLKvbdOSsufdtp
+DoDKjvbdhbPCdvqR
+DnbkKvbdiZuFkpnG
+DoDKjvbdHDjujCJj
+EPDKjvbdCDpBVjMf
+EObkKvbdeFOrBwDK
+DoDLKvbdhgJbxvJu
+EObjjvbdiZuFlQmf
+EPDKjvbdeuzwpJzs
+EPDKjvbdezuyEhsw
+EPCkKvbdJYTbIMQp
+DnbkKvbdkIHLeenL
+DoCkKvbdAMgyTXZx
+DnbkKvbdfIKvRnQg
+EPDLKvbdJqZePFnF
+DoCjjvbdRjxfVGkT
+EOcLKvbdySmhlqbH
+DnbjjvbdEYYMUTtM
+DoDLKvbdhtydvquC
+EObjjvbdZRMdiMdq
+EPCjjvbdVZITzLOn
+DoCkKvbdmuVZjjRf
+DoCjjvbdzoQREbkx
+DnbkKvbdkyTSSxgU
+DoCjjvbdzRPNIjXA
+EPDKjvbdnPyxvLZC
+EOcKjvbdSZjHrbvA
+EPCkKvbdShyjRABM
+EObjjvbdYpmEiMeR
+DoCjjvbdFaOqYizm
+DncLKvbdEvZQQMjF
+DncKjvbdNrtWGeVQ
+DoDKjvbdqdFJPmvB
+DnbjjvbdRXODblID
+DoDLKvbdyzdnRhIh
+EPCkKvbdcTCjsdKB
+DncLKvbdJcKCqKCx
+EObjjvbdmfdwmNgZ
+EPDLKvbdqUTgSSLU
+EObjjvbdZyEKODLr
+EPDKjvbdTppoVVIN
+DnbjjvbdFVyPpNJe
+EPDKjvbdJYUBhLqQ
+EPDLKvbdqceIpOWB
+EPDLKvbdiBnbeXQq
+DnbkKvbdGZVVBEYC
+DncKjvbdGLFTDINV
+EObjjvbdUGzmlXWF
+EOcLKvbdxrmiMqbH
+DoDLKvbdJpzEnenF
+EObjjvbdEvYoomJe
+DoDKjvbdJqZdoFme
+EObjjvbdEuyPpMie
+EOcKjvbdmtuZjjRf
+EPDKjvbdjKGHilwr
+EPCkKvbdpaIeAWgd
+DoDKjvbdGZVUaDxC
+DoCjjvbdFkErcHlu
+EOcKjvbdrbFllGjy
+DnbkKvbdMRwMzUpz
+DoCkKvbdDxYLtTsl
+EOcLKvbdLBKfmBxR
+DoCjjvbdVwJYWDeH
+DoCkKvbdZoOIdeZj
+EPDLKvbdpfEFUWAh
+EOcLKvbdKWVGDdfi
+EObkKvbdtvNwipsA
+DoCjjvbdwuNEqZMO
+EObkKvbdfSBWzkbo
+EPDLKvbdFxuVAdXb
+DnbkKvbdRWnEClHc
+EOcKjvbdkCkjqHUg
+DoCjjvbdbsDKscia
+EPDLKvbdzQoMiKXA
+DnbkKvbdRDcApQcr
+DoDKjvbdZtIiYcrn
+DoDLKvbdqZPHgQdY
+EObjjvbdyfxlAMeX
+EObjjvbddjJrWUzn
+EPDKjvbdjcMLQgVH
+EOcLKvbdozmckXoA
+EPDKjvbdcJMjLGWx
+EPCkKvbdbhlijewY
+EObjjvbdrEFJPnWB
+EOcKjvbdmuVZjirG
+DncKjvbdnBjXYOmu
+DncLKvbdjcLjqHUg
+EPDLKvbdlhdUQuRa
+DoDKjvbdVwIwvEFH
+EObkKvbdZMSDsnLm
+DoDLKvbdzHZMAMdw
+EOcKjvbdZMSDsnLm
+DncKjvbdZshhyDsO
+DncKjvbdCEPaWJlf
+EOcKjvbdxxJKCQZk
+EPCkKvbdezvZEiTw
+EPDLKvbdypoMiKXA
+EPCkKvbdnUuZjjRf
+DnbkKvbdFfJqnJUR
+DoCjjvbdTpqPUthN
+DncKjvbdcyxoxYpb
+EObkKvbdCSaCsfXS
+DnbkKvbdRacdlIyL
+DoCjjvbdTIzKRABM
+EPCkKvbdatbGwjsh
+EObjjvbdUsltGMWK
+DoDLKvbdtvOXjQsA
+DnbjjvbdYSlAmUPY
+EOcKjvbdwuNEpxkn
+EObkKvbdYqMdiMdq
+EOcKjvbdnGeXlmgZ
+DnbkKvbdqwQLcJYq
+EObkKvbduVmxJqTA
+EObjjvbdmoyyVkYb
+DoDKjvbdBdPaWKMf
+DncKjvbdVvhwvEFH
+EObkKvbdauBfxLUI
+EOcLKvbdMgDQNQUk
+EOcKjvbdsQVnjCuf
+EObkKvbdjuvnEBww
+DoCkKvbdkWXODbXw
+EPCkKvbdZyDjNblS
+DoDKjvbdZLqdUNlN
+DoDKjvbdbLMFoNcA
+DoCkKvbdFVyQPmJe
+EOcKjvbdhkdcmuCy
+EPCkKvbdmtuZjiqf
+DnbjjvbdRbEFLiYk
+EPCkKvbdySnJMqag
+EPDLKvbdhlFDnVCy
+DoCjjvbdzoQREblY
+EPCjjvbdvBEYroFI
+EPCjjvbdJbjCqJcY
+DnbkKvbdliEURUrB
+DoDKjvbdOTUWGdtp
+EOcLKvbdZnmhddzK
+EPDKjvbdSBcdkiZL
+DoCjjvbdZMRctOLm
+DoDLKvbduCcUwVno
+DoDLKvbdEzspeMDJ
+EPCjjvbdULunaWOi
+DoDLKvbdIwsaglQp
+EObkKvbdJuuFdFGi
+EPCkKvbdQccBQRDr
+EPDKjvbdNrsugEtp
+EPDLKvbdEXxLtUUM
+DoDKjvbdVBCQsRRy
+DncKjvbdeFPSCWcK
+DoDLKvbdhficYvJu
+DncKjvbdkClLRHVH
+EOcLKvbduWNxKRTA
+EObjjvbdNPwpumgT
+DoCjjvbdjmCLzFGo
+DncKjvbdZtIhxdSn
+EObkKvbdKQyePFme
+EPCjjvbdEuxpPljF
+DoCkKvbdZtIhyDrn
+EPDLKvbdJpzFOfNe
+EPDKjvbduaEZTPFI
+EPDLKvbdSQTgKFcw
+EOcLKvbdBcpAujMf
+EPCjjvbdfHkVrOQg
+EPCjjvbdKaKflaxR
+EObkKvbdZjTIQGaf
+EOcLKvbdijGIKMwr
+EPDLKvbdvBEZTOdh
+DnbkKvbdZRNEhleR
+DnbkKvbdijFgimXr
+EObjjvbdEASIlywX
+DoCjjvbdKaKgNCXq
+EPDLKvbdTppoUuHm
+EPCkKvbdwzHefYEr
+EPCkKvbdhtyeWrUb
+DnbkKvbdPyNAGsRj
+EPDKjvbdmttzKiqf
+DnbjjvbdRacdkhyL
+EOcLKvbdeJjRvUzn
+EObjjvbdNHCpNQVL
+EPCjjvbdgLGzcGAE
+DoCkKvbdidkGtoAO
+DnbkKvbdKDJcRKCx
+DnbjjvbdSQTgKGEX
+EPDLKvbdyqPMiJwA
+DnbkKvbdLrWlytpz
+DnbjjvbdmgExNNgZ
+EPCkKvbdlYsRrxgU
+DnbjjvbdTkuoAvPJ
+EOcKjvbdgFkymgHA
+EPDLKvbdmaivxOnV
+DnbjjvbdEztQeMDJ
+EObjjvbdWfYzUAPT
+DnbkKvbdiMEdNuDZ
+DoDKjvbdgQBzwEXh
+EOcLKvbdSBcdlIyL
+DnbjjvbdrMzJxkhJ
+DnbjjvbdddnrCXDK
+DncLKvbdmbKXXnnV
+DnbjjvbdYzbfSKWZ
+EPCjjvbdUMWPBVoJ
+EPDKjvbdBraDUGWr
+DoCkKvbdFkFTDINV
+DncKjvbdYkqdTmkm
+DncKjvbdmpZyVjyC
+DoCjjvbdZisIQHCG
+DncLKvbdYqMeJMeR
+EPDKjvbdZjTHpHBf
+EOcLKvbdcJMikFwY
+DoCkKvbdFpATXHGZ
+DnbjjvbdVBBqSpqy
+DoCkKvbddZyQXxpb
+EOcLKvbdqlyiyMHi
+EPDLKvbdfMfWgNJk
+DoCjjvbdrNZjZLgi
+EPCkKvbdeOdsKtTr
+EPDKjvbdLrXMytpz
+DncLKvbdQvnDcMHc
+DoDLKvbdyYJJbPyk
+DnbjjvbdrylPsBIO
+DnbkKvbdTqROuUgm
+DoCjjvbdcyyQYZRC
+EObjjvbdbLMFnmcA
+EObjjvbdbVCGxKsh
+EObjjvbdelfWgMjL
+EPDLKvbdnGdwmOGy
+EPCkKvbdcTDLTdKB
+DncLKvbdUxhTyjoO
+EPCjjvbdwzHfFxEr
+EPCjjvbdkxrqryHU
+DncLKvbdDihJvYKA
+EPCkKvbdRzJhScWA
+EObjjvbdZHWdAOri
+DoDLKvbdjbkkRGuH
+DncKjvbdNVSrLNAX
+DncKjvbdVqnYCElD
+DnbjjvbdFWZPpMjF
+DoCjjvbdZMRctNkm
+EPCjjvbdRNXaxmtz
+EOcLKvbdLZQjSztf
+EObjjvbdePFSjssr
+EOcKjvbdjbkkRHUg
+EPDKjvbdcSbjtEJa
+EObkKvbdKQzFPFme
+DoCkKvbdnUtzKjRf
+DncLKvbdeOeTKtUS
+DoCjjvbdpstGqqjt
+EOcKjvbdrpWPJcWG
+EPCkKvbdwkXDgzyf
+DncKjvbdnPyxvLYb
+DoCkKvbdpxoIHRDx
+DnbjjvbdLFegaaRV
+EPCjjvbdrXQLcJYq
+DncKjvbdWXJXvDdg
+DnbjjvbdQdCaQRDr
+EOcLKvbdWWiXuceH
+DoCjjvbdbiNJkGXY
+EPDKjvbdijGHjMxS
+DoDLKvbdTfzmkwVe
+EObkKvbdmSZUzTEJ
+DnbjjvbdKefHaaRV
+DncLKvbddoFSjstS
+DncLKvbdSLYfUgKs
+EPCkKvbdCIjbLJGK
+DncKjvbdKNADzGuB
+DoDKjvbdBcpBVjMf
+DnbjjvbdpxoHfqEY
+DoCjjvbdANHyTWyx
+DoDKjvbdFjeSbgmV
+DnbkKvbdxwiKCPzL
+DncKjvbdqceIpNvB
+DnbjjvbdLFfHbAqV
+EPDLKvbdtTSTYydc
+EPCjjvbdezvYdiTw
+EObjjvbdWWiYVdFH
+EOcLKvbdZyDjNbkr
+EObkKvbdwzIFeweS
+EPCjjvbdjmBkzFGo
+EObjjvbdGAoRYizm
+EObjjvbdjcMLQgVH
+DoCjjvbddePRavbj
+EOcKjvbdlhcspuSB
+EPCjjvbdSCEFMJZL
+EObkKvbdEYYLsssl
+EObkKvbdpstGrSLU
+DoDLKvbdIGgZxwwg
+EObkKvbdWIYWYGxz
+EPCjjvbdfILWSNqH
+DnbkKvbdFWYpPljF
+DoCjjvbdVAbRSqRy
+EOcKjvbdeEoSCWcK
+EOcKjvbdSBceMIxk
+DoCjjvbdgFkzOGgA
+EObkKvbdbPfgELzd
+DnbjjvbdmtuZkJqf
+EPCkKvbdYgWdAPSi
+EObkKvbdmaiwXoOV
+EOcKjvbdjuvnDbXw
+DncLKvbdiBoCdvpq
+DnbkKvbdZxcjNbkr
+EPDKjvbdKfFgaaRV
+DoDKjvbdNGcPlouL
+EOcKjvbdHlBznXQk
+EPCjjvbdKQydoFme
+EPCjjvbdDxYLsssl
+DoCjjvbdHbLydzAD
+DnbkKvbdZisHofbG
+DnbkKvbdvvkaWBWV
+DncLKvbddxZtUSFz
+EPCjjvbdBcpBWJlf
+EObkKvbdVBBprpqy
+DoCkKvbdaSFcITfL
+DoCkKvbdZLqctOMN
+EPDKjvbdFWYpQMie
+DncKjvbdOEctJIjd
+DoCkKvbdEuyQPmJe
+DncLKvbdZGwEAOsJ
+DncKjvbdlqyUzSci
+EOcKjvbdKCibqKCx
+DnbjjvbdEOcLKvbd
+DncKjvbddneTLUUS
+EPCjjvbdhbPDFWpq
+DoCjjvbdeAUQmXjG
+EPDKjvbdVwJYWDeH
+DncKjvbdePFTKstS
+DoCjjvbdjggMFemk
+EPCjjvbdcScLUDjB
+DoDKjvbdZjTIQGbG
+EObjjvbdehKurNpg
+DncLKvbdbsDLUEJa
+EOcLKvbdEJgjWXjA
+EPCkKvbdqquKnKaN
+DnbjjvbdZjShQHCG
+DoCjjvbdCEPaVilf
+EObjjvbdzjUpQDrt
+EOcLKvbdUVlPjUBR
+DnbjjvbdeFPSCWbj
+DoCkKvbdKxpirzuG
+DncLKvbdrykpTAgn
+DoDKjvbdemGXGljL
+DncLKvbdTYKlNzkY
+DncKjvbduaDyTOeI
+EObkKvbdnBjWwoOV
+EPCkKvbdGdLWKCJj
+EPDKjvbdKeegaaQu
+EObkKvbdxnShXrhc
+DoCkKvbdsBemLgKy
+EPCjjvbdrzLoraHn
+EPDLKvbdrRuKmjaN
+DncLKvbdmajWxPOV
+DncKjvbdKVuGDeGi
+EObjjvbdziuQPdTU
+DnbkKvbdZxcinCkr
+EPCkKvbdlqxtzTDi
+EPCkKvbdyzeOSHiI
+DnbkKvbdqmZiyMIJ
+EOcLKvbdIwtBgkqQ
+DncLKvbdfekzOHHA
+EPCkKvbdKNADzGuB
+EOcLKvbdUaBqSqRy
+EPDKjvbdddnrBvbj
+DncLKvbdmuVZjirG
+EOcKjvbdbBWEepPw
+DncLKvbdwjvdHzyf
+EPDKjvbdmgFXlmgZ
+EPCkKvbdtSqryZeD
+EObkKvbdOFEUIhkE
+EOcKjvbdiBncFXRR
+DncLKvbdxZgeeweS
+EPDLKvbdxwiKCPyk
+EPDKjvbdHEKvJajK
+DncKjvbdrafMlGjy
+EOcLKvbdwWlBWBWV
+DncLKvbdegjvRmqH
+EObkKvbdehKvRmqH
+DoDLKvbdUaBpsQrZ
+EPDKjvbdRaceMJYk
+DnbkKvbdZRNEhldq
+DnbjjvbdKCibpjDY
+DoDLKvbdKaLGmCXq
+DncLKvbdKaKflbYR
+DoCjjvbdZQleJNFR
+EPCjjvbdZHWdAOsJ
+EObkKvbdpxnggRDx
+EPDKjvbdiUzFXSVC
+DncKjvbdhfjDZWJu
+DoCjjvbdYkrDtNlN
+EOcLKvbdkVvmdBxX
+DnbjjvbdFkFScHlu
+DoCjjvbdlrYuZrci
+EOcKjvbdrDdiPnWB
+DoCjjvbdfoazvcwh
+EPCkKvbdtkxWaUAw
+EObjjvbdVYgsyjoO
+EPCjjvbdssSTZZeD
+DoCjjvbdbVBfwjsh
+EPCjjvbdVgwuxGxz
+EOcKjvbdZoNhdeZj
+EPCkKvbdGYttaDwb
+DncLKvbdvAcySoEh
+DoDKjvbdIGfzZYYH
+DoDKjvbdtcCtvvPP
+EObjjvbdkxsRryHU
+DnbkKvbdJSyBTMwl
+DoCjjvbdsPuoJbuf
+DnbjjvbdZxcimcMS
+DoDKjvbdNGbpMouL
+DnbjjvbdSZjHrbvA
+DoCkKvbdmRxtysDi
+EOcLKvbdZQmEiMeR
+EPCjjvbdpfEEtVaI
+EPCjjvbdtTRrxzEc
+DoCkKvbdZdxGzghb
+DncKjvbdrykpTBIO
+EPCkKvbdxxIjCPyk
+DncLKvbdCEQAujNG
+EOcLKvbdrWokbhyR
+EPDKjvbdjJehKMwr
+DncLKvbdSxLMNzjx
+DnbjjvbdZyDinDMS
+EObjjvbdZirhQGaf
+DncLKvbdkClKqHVH
+EObkKvbdfIKvRmqH
+DoDLKvbdQvmcblID
+EPDKjvbdNsTufdtp
+EObkKvbdZRMeIleR
+DnbkKvbddwytTrFz
+EObjjvbdZxdKODMS
+EPCkKvbdSLZFtgKs
+EPDKjvbdrovPJbuf
+EPCjjvbdHgHZxxYH
+EPCjjvbdddoSBvbj
+DoDKjvbdegkVqmpg
+DoDKjvbdCfkfHAzc
+EObjjvbdtvNxJqTA
+EPDKjvbdhtyeXSVC
+EPDLKvbdUtMtGLvK
+EPCjjvbdFaPRYizm
+EPCkKvbdVZIUZkOn
+EPDKjvbdFeiqnIsq
+EObkKvbdddoRbWcK
+EOcLKvbdaNLCSuMg
+EObjjvbdFpATXGfZ
+DncLKvbdrXPkcJYq
+EPCjjvbdFjdrcHlu
+EObkKvbdUQqPVUhN
+DoDLKvbdpxoHfqDx
+DncLKvbdypoNIjXA
+EPCjjvbdmRxuZrdJ
+EPDKjvbdqZPHgREY
+EOcLKvbdZGwEAPTJ
+DncLKvbdjuwNcbXw
+DoCkKvbdTlWPBVoJ
+DoCjjvbdRzKIScWA
+EPDLKvbdZnnJFEzK
+EPDLKvbdqvokbhyR
+DnbkKvbdAMhZTWyx
+EPCkKvbdqYoHgRDx
+EPDKjvbdZtJJZETO
+EObkKvbdWRmxBdlD
+DnbkKvbdwWkaWBWV
+DncKjvbdgKfzcGAE
+DncLKvbdtbcUwVno
+EOcLKvbdcImJjfWx
+DncLKvbdSwjlNzjx
+EObkKvbdjblLQftg
+DncLKvbdQmYByNtz
+DnbjjvbdhlFDmtby
+DnbjjvbdcTDKsdJa
+EPCkKvbdqUTgSRkU
+EOcKjvbdZQleImEq
+EOcLKvbdtTRrxzFD
+EPCkKvbdUVkpKUAq
+DncLKvbdmbJvwoNu
+EPDKjvbdrJAKFMne
+DncKjvbdpyOhGqEY
+EOcLKvbdLrWlzVQz
+DnbjjvbdvAdYsPFI
+EPCkKvbdDoDKjvbd
+DoDLKvbdelfWgMjL
+EObkKvbdaMjbTUlg
+EObjjvbduVmwjRTA
+EPCjjvbdHffyxwwg
+DnbkKvbdXrkaNToY
+DoCjjvbdZshhyDrn
+DoDKjvbdunszqKoU
+EPCkKvbdmJDtRVSB
+DnbkKvbdcImKLFwY
+DoCjjvbdpedEtVaI
+DnbjjvbduMXwAtBX
+EPDLKvbdhbPDFWpq
+EPCjjvbdrDdiQNua
+DnbkKvbdKxpirzuG
+EObkKvbdcTCjtEJa
+DncLKvbdZQmFIldq
+DoCkKvbdqUUGrRkU
+DnbkKvbddZyQXyRC
+DncLKvbdIryBTNXl
+EPDKjvbduaDxrneI
+DoCkKvbdZMSDsmlN
+DoDKjvbdrovOjCvG
+EOcLKvbdhyuFkpmf
+DoDLKvbdddnrBwDK
+DncKjvbdDwxLstTl
+EPDLKvbddZxpXxpb
+DoDKjvbdCSaDTewS
+EPCkKvbdVqmxBeLc
+DoCkKvbdZMSEUNkm
+DnbkKvbdznopdcMY
+EPCjjvbdqYoHgQcx
+EPCkKvbdlhdUQuRa
+EObjjvbdauBgYLUI
+EObjjvbdySnJMrCH
+EObjjvbdkIGlGGOL
+DoCkKvbdwXMAvBWV
+DnbjjvbdiCOcFXRR
+EPCkKvbdIHGzZYXg
+EPDKjvbdiMFDmuCy
+EOcKjvbdtlXvaUBX
+DoDLKvbdhfibxuiu
+EPCkKvbdqwQMChxq
+EObkKvbdRkYeuGjs
+DoDKjvbdYkrEUNlN
+EPDKjvbdZshiYcsO
+DnbkKvbdQlxBxnUz
+DncKjvbdSPtGifEX
+DoDLKvbdmajXXoNu
+EObjjvbdHbMZdzAD
+EPCkKvbdZyEKNblS
+EObkKvbdKfFgbBRV
+EOcLKvbdOTUVgFVQ
+DoCkKvbdfMevgMik
+EPDKjvbdptTfrSKt
+DnbkKvbdxZhFexFS
+DncLKvbdUaBqTQrZ
+DoCjjvbduDDUwWPP
+DoDKjvbdNsUVfduQ
+EObkKvbdvOszpjoU
+EObkKvbdNsTvGdtp
+EPDKjvbdxwhiapZk
+DoDKjvbdiGjCxvJu
+DoDLKvbdxxIibPyk
+DncKjvbdvAdYroFI
+EOcLKvbdLAkGmBwq
+DncLKvbdIsYaTMxM
+EPDLKvbdFejRmiUR
+DoCkKvbdbrbjscia
+DoDLKvbdiHJbyWJu
+EOcKjvbdIwtBhMQp
+EObkKvbdpfDdtVaI
+EObjjvbdfMevfmJk
+EObjjvbdptUHRrLU
+EPDLKvbdYgXEAOri
+EObkKvbdZoOJEeZj
+DoDKjvbdqUUGqqjt
+DnbjjvbdxnTHwriD
+EPDKjvbdfHkWRmpg
+EPDLKvbdePEsLUUS
+EPCjjvbdEPCkLXDE
+DoCjjvbdgQBzvdYI
+DoCkKvbdZjSgogBf
+EObkKvbdtunYKQsA
+EPDKjvbdezvYdiTw
+EPDLKvbdLBLGmCYR
+EObkKvbdSLYfVHKs
+EPDKjvbdfILWSNqH
+EObjjvbdqlyixkhJ
+DoCkKvbdjKFgjNXr
+DoDLKvbdyzdmrHhh
+DoDLKvbdYpleImEq
+DoDKjvbdUxgtZkPO
+EPDLKvbdJKEAKPgE
+DoDKjvbdRXODblHc
+DoCkKvbdmozYujxb
+EOcKjvbdMgCpMouL
+DncKjvbdZsiJZESn
+EPCkKvbdzROmIiwA
+DnbkKvbdEOcLKvbd
+EPCjjvbdpxoIHRDx
+DnbkKvbdEJgivXjA
+DoDKjvbdfHjurOQg
+EObjjvbdyYIjCPzL
+DoCjjvbdvlvANEEm
+DncLKvbdOXoVzdOU
+EObkKvbdatagYKtI
+DnbkKvbdGYtuAcwb
+EObkKvbdegjuqnRH
+DnbkKvbdtumxKQsA
+DnbkKvbdIxTbILqQ
+DncKjvbdIsZBTMxM
+EPCjjvbdRjyFuHLT
+EOcKjvbdJXtCIMQp
+DoDKjvbdYkqdUOLm
+EObjjvbdZsiIyESn
+DnbkKvbdhtyeWrUb
+EPCjjvbdEuyQPmKF
+EOcLKvbdeFOrCWcK
+DoDLKvbdEvYpPlie
+DoCjjvbdZtJIyETO
+EPCjjvbdrWokcJYq
+DoDLKvbduaDySneI
+DncLKvbdsPunjCuf
+EObkKvbdpyOhGpcx
+EObkKvbdliDsqUqa
+DoDLKvbdhaoCeXQq
+DncLKvbdaRfChUFk
+EOcKjvbdYTMAlsoY
+EPCkKvbdfkGzbfAE
+EOcKjvbdURQnttgm
+DoDLKvbdDoCjjvcE
+DncLKvbdCJKbLJGK
+EPDKjvbdhlFEOVDZ
+DnbkKvbduCcVWvOo
+EPCjjvbdQdDBPpcr
+EObkKvbdbBVdeopX
+DnbkKvbdWHwuwfxz
+DoDLKvbdsrqrxzFD
+DoDKjvbdCSaCsfXS
+DoCkKvbdNPxQunGs
+EPDLKvbdyzeNrHhh
+EObjjvbdWXIwudFH
+EPCjjvbdKWVFceHJ
+EOcLKvbdqwPlCiZR
+DncLKvbdyOTHwsJD
+DncLKvbdxUleRZMO
+DnbjjvbdZHWdAPTJ
+DoDLKvbdePEsKstS
+EPDKjvbdHDkVjBij
+EObjjvbdSPtHJecw
+EObjjvbdyTOJNRag
+EOcKjvbdhfibxuiu
+EOcKjvbdRDbaPqES
+DnbjjvbdemGWflik
+DoDKjvbdwjwEHzzG
+EObjjvbdsCGNMGjy
+DnbjjvbdssRsYyeD
+DoDKjvbdJvVFceGi
+EPCkKvbdLZQjSzuG
+DoDLKvbdqUUHSSLU
+EPCjjvbdaaWEeoow
+EPCjjvbdDjHiuxKA
+EPDKjvbdZQmFIleR
+DoDKjvbdRDbaPpdS
+EPCjjvbdZoOJFFZj
+EObjjvbdQmYBxnUz
+EPDKjvbdKCibqKDY
+DoDLKvbdsCFmMGjy
+DncKjvbdKaKgMaxR
+DoCjjvbdrMzJxkhJ
+EObkKvbdeKKRutzn
+EPCkKvbdcTCjscjB
+EPCkKvbdZsiIyDrn
+EObjjvbdnBjXXoOV
+DoDKjvbdBiKakIfK
+EOcKjvbdRpTfjGEX
+DoCkKvbdtSqrxydc
+EObkKvbdHDkVjBij
+DncLKvbdqTsgSSLU
+DncLKvbdzdzOzdzQ
+DoDLKvbdVrNwadlD
+DncLKvbdSQUGifEX
+DncLKvbdxxJKBoyk
+EPCjjvbdrzLpSaIO
+DnbkKvbdhtyeXRuC
+DoDKjvbdyTOImSBg
+EPDLKvbddZxpXxqC
+DoCkKvbdZMSDsnLm
+DncLKvbdEARhlzXX
+EPDKjvbdkWXOECYX
+EObkKvbdSLYetgLT
+EPDKjvbdTfznLvvF
+DoCjjvbdSZjHrcWA
+DncKjvbdmJDsptqa
+EOcLKvbdZxdJmblS
+DnbjjvbdKWUfDeHJ
+EPCkKvbdLiBkpxAS
+EObkKvbdePFSkTtS
+DoDKjvbdYzbfSKWZ
+EPCjjvbdvAdYsPFI
+EObkKvbdTAFJIBnd
+DnbkKvbdsZkpSaHn
+DoDLKvbdczZQYZRC
+EPDKjvbdTvMQKTaR
+DnbkKvbdyYJKCQZk
+EPCkKvbdVAaqTQqy
+EOcLKvbdbPfgDkzd
+EObkKvbdePErjssr
+EPDLKvbdyTOJNRag
+EPDLKvbdyTNiNSBg
+DoCjjvbdqvpMCiYq
+DoDKjvbdRpUHKGEX
+DoCjjvbdDoCkLWbd
+DncLKvbddCTNSATm
+DoCkKvbdcSbkUEJa
+EPDLKvbdzjVPocrt
+DnbkKvbdxVNFQyLn
+DnbkKvbdSKyFtfkT
+DoCkKvbdmpZxukZC
+DncLKvbdGFjSOJTq
+EOcKjvbdhkdcmtcZ
+DoCjjvbdyzeORghh
+EPCkKvbdRbDeMJZL
+DoDLKvbdZMRctOMN
+EObjjvbdAMgySvyx
+EOcLKvbdTYLMNzkY
+DnbjjvbdmuVZjjSG
+DnbkKvbdZsiIyDrn
+EPDLKvbdjEjfuPAO
+DoCjjvbdkxrrSxgU
+DncKjvbdSLYfUfkT
+DnbjjvbdBcpAvJmG
+DoDLKvbdSPsgKFcw
+DoCkKvbdrXQMDIyR
+EObkKvbdKVuFdEfi
+DnbkKvbdrSVLOLBN
+DoDKjvbdZnmhdeZj
+DoDKjvbdNHDQNPuL
+DoDKjvbdpyOggREY
+DoCkKvbdQvmcblID
+EPCkKvbdMfbomQVL
+EPCjjvbdNVTRjmAX
+EOcKjvbdbhlijevx
+EObkKvbdWWiXvEFH
+DncKjvbdlqyVZrdJ
+DnbjjvbdrSUkNjaN
+DncLKvbdmSZUzTDi
+EObjjvbdZQmEhmEq
+EOcKjvbdiLdcnVDZ
+EObkKvbdySmhlqag
+DnbjjvbdbUagYLTh
+DncKjvbdBdQAvKNG
+DncLKvbdyzdnRghh
+EObkKvbdLZRKSztf
+DoDLKvbdRXOEDMHc
+DncKjvbdFkFSbgmV
+EPCjjvbdZQldiMeR
+EPDLKvbdFfJqmiTq
+EOcLKvbdpssgRrKt
+DnbjjvbdKRZeOeme
+DnbkKvbdnPzYvLZC
+DoDLKvbdUVlQJsaR
+EPCjjvbdqFceTvAh
+EPDKjvbdEARhlyvw
+EPCjjvbdNGbolotk
+DoCjjvbdVhYWXgYz
+DoCjjvbdUtMtFkvK
+DncKjvbdZQldhleR
+DnbjjvbdCEPaWKMf
+EObjjvbduWOXjQsA
+EOcKjvbdIjEAKPfd
+DoCjjvbdURRPUuIN
+EObkKvbdbhmKKfWx
+DoDKjvbdxrnJMrCH
+EObjjvbdGFirNiTq
+DoDLKvbdtSqsZZeD
+EPDLKvbdKkAhWAJy
+EPCkKvbdbVBgYKsh
+DoCjjvbdKWVFdFGi
+EPDKjvbdwXMAuaWV
+DoCkKvbdRXNdCkhD
+EPCjjvbdZRMdhmEq
+DncLKvbdcJMijfWx
+DnbkKvbdZRNEiNFR
+EObjjvbdAMhYrvyx
+EPDLKvbdijGIJmXr
+DoCkKvbdbhmJjfXY
+EOcLKvbdrzMQTBHn
+DnbkKvbdKVtfEEfi
+EPCkKvbdxVNFRZMO
+EPDLKvbdjcMLQgUg
+EObjjvbdjuwODbXw
+EObkKvbdZeXfzhJC
+EPCkKvbdUyITyjoO
+EPCkKvbdGFjRnIsq
+DnbjjvbdIwsbHlRQ
+DncKjvbdtTSTYzEc
+EPDKjvbdhfjCyWKV
+DoCjjvbdhytelQnG
+DoDKjvbdxnTHxTIc
+EOcKjvbdUQqPUtgm
+EPDLKvbdkNCMZdgP
+DnbkKvbdGKeTDINV
+EOcLKvbdZMRcsmlN
+DnbjjvbdRXNdCkgc
+DoCjjvbdRXNccMHc
+EObkKvbdRjyFuGjs
+EPDLKvbdmJDtRUrB
+DoDLKvbdpyPIGpdY
+EPCjjvbdkNCLzEgP
+DoDLKvbdZoNiFEzK
+DoDKjvbdKVuFcdfi
+DoDKjvbdqZOggQdY
+EPCkKvbdSQTgJecw
+EOcKjvbdrRuKnLAm
+EObkKvbdbUbHYLUI
+EOcLKvbdyNrgwsJD
+DoDKjvbdegkVqnQg
+DnbkKvbdGBOpxizm
+EObkKvbdJbjDQicY
+DncLKvbdSLZFuGjs
+DoCkKvbdGckVibJj
+DoCkKvbdzeZnzdyp
+EObjjvbdxxJKCQZk
+EObjjvbdJpzFPGNe
+EPCkKvbdUsltGLvK
+DoDLKvbdziuQQDsU
+DncLKvbdRzKIScWA
+DoCkKvbdSLYfVGjs
+EPCjjvbdhgKDYujV
+DoDKjvbdtunXjQsA
+EPDKjvbdqceJPnWB
+DncKjvbdUQqOuUhN
+EOcKjvbdJvVFceHJ
+EPCkKvbdMfcPmQVL
+EObkKvbdNrsufdtp
+DncLKvbdUQpnuUhN
+DncKjvbdYkqdUOMN
+EObkKvbdqceJQNvB
+EPDLKvbdCWzdJFPv
+DncKjvbdauBfxLTh
+DncKjvbdZnnJEdyj
+DncLKvbdEvYpPlie
+DoDLKvbdhaoCdvpq
+EObkKvbdCEQBVimG
+EOcKjvbdBiKbKhfK
+DnbkKvbdeuzwpJzs
+DncLKvbdhlEcnVDZ
+EObkKvbdkCkjpftg
+DncKjvbdZQldhmEq
+DoDKjvbdFyVVBEXb
+DncKjvbdZirgogCG
+EPCkKvbdWXJXvEFH
+DnbkKvbdOStVfduQ
+DnbkKvbdNGbpMouL
+EObkKvbdcIljKfXY
+DoDLKvbdXrlBMsnx
+EOcLKvbdfNFwGmJk
+EObjjvbdUQqPUuHm
+DnbjjvbdEXxLtUTl
+EPDKjvbdLGFhCBQu
+DncKjvbdTYLLmzkY
+DoCkKvbdkaNPNALA
+DoCjjvbdFxtuBDwb
+EPDLKvbdGGJrNhsq
+DoCkKvbdZyEJnDLr
+EObkKvbdDxXlTssl
+EPCkKvbdGKdrbglu
+EOcLKvbdmoyyVjxb
+DnbkKvbdRNYByNtz
+EObjjvbdGFirOItR
+DoCjjvbdxUmFRZLn
+EPCkKvbdsQWPJcWG
+EPCjjvbdegkWSORH
+DncLKvbdYzcGRjVy
+DoCkKvbdRXNcblHc
+EObkKvbdwtldqYkn
+DnbkKvbdZisHpGaf
+EPCkKvbdGQASvfey
+DnbjjvbdeFPRavbj
+EOcLKvbdGZVVBEYC
+EPCkKvbdKDKDQicY
+EPCkKvbdUsmUFkuj
+DoCkKvbdatbHXjtI
+EObkKvbdlrYtyrdJ
+DnbjjvbdjKGHilwr
+EOcKjvbdjlakyeGo
+DoDLKvbdnPzZVkZC
+DnbjjvbdCIjbLJFj
+DoCkKvbdegkWSORH
+DoDLKvbdjvXODbYX
+EPDKjvbdaaVeFoow
+DncKjvbdwtmFRZLn
+EObkKvbdkNCLzEfo
+DncLKvbdrbGMlGkZ
+EObjjvbdczZQXxqC
+DoCkKvbduaEZTOdh
+EObjjvbdZxcjNbkr
+EOcKjvbdCJKbKiFj
+DnbjjvbdjEkGuPAO
+DnbjjvbdZshhyDsO
+DoDLKvbdbsCkUDjB
+DoCkKvbdNddUIhkE
+EPDLKvbduVnYJpsA
+DnbjjvbdQvmccMHc
+DoDKjvbdDjIKWXjA
+DoDLKvbdxZhGGYEr
+EObkKvbdqquKmkBN
+EObjjvbdLBLHMawq
+DoDLKvbdrbFmLgLZ
+EPDLKvbdddnrBwCj
+DoCkKvbdbrcLUEKB
+DoDKjvbdqlyjYlHi
+DncKjvbdQwNdDMID
+EObkKvbdBiLCKhej
+EPCkKvbdSZigsDWA
+DnbkKvbdwuNFRYlO
+EPDLKvbduCbtvvOo
+DnbjjvbdaaWFFpPw
+EObkKvbdRECaQQdS
+DncKjvbdyOShXsJD
+EPCkKvbdFVyPomJe
+DoDLKvbdcJMijevx
+EObkKvbdSZigsCvA
+EObjjvbdrNZjYlHi
+DnbkKvbdKfFhBaRV
+EPDLKvbdSLZFtgKs
+EPDLKvbdrbGNMGjy
+EPCjjvbddwzTtSFz
+DoDLKvbdnGdxNNgZ
+DncLKvbdTfzmlWue
+EOcKjvbdbLLfOmcA
+DoDLKvbdNGcQNPuL
+DncLKvbdUaCQsQqy
+EPCjjvbdCfkfHAzc
+EPDKjvbdlrYuZsDi
+EPDLKvbdmajXYPOV
+EObjjvbduCcUvvOo
+DoDLKvbdJXsahLqQ
+EPCkKvbdOSsugEuQ
+DnbkKvbduaDyTOeI
+DncLKvbdYqNEhldq
+EOcLKvbdeOdsKtUS
+EOcKjvbdkHgLefOL
+EPCkKvbdrpVoKCuf
+EObjjvbdShzJqAAl
+DnbjjvbdgPazwDxI
+EPDLKvbdEztQdlDJ
+DoDKjvbdYpmFImFR
+DncLKvbdsBellHLZ
+DoCjjvbdatbHYKsh
+DoCjjvbdptTgRrLU
+EOcLKvbdznpRFCkx
+EPCjjvbdWWiYWEFH
+EPCjjvbdRosgJedX
+DnbjjvbdkIGkefOL
+DnbjjvbdiZuGLqNf
+EPCkKvbdANIZTWyx
+EObjjvbdZQmFJMdq
+EObkKvbdjvWmcbYX
+DncLKvbdRbEFMJYk
+EOcKjvbdpfDdtVaI
+EPDKjvbdJqZePFnF
+DnbjjvbdeFOqavcK
+DoCjjvbdnHFXlnHZ
+EPCjjvbdTvLpKTaR
+EPDLKvbdVgxVxHYz
+EObkKvbdZRNFJMdq
+EPDLKvbdbUafwkUI
+EObjjvbdKCjDQibx
+EPDLKvbdrXPlChyR
+DoCjjvbdxsNhlqbH
+DoDKjvbdNGbomPtk
+EPDLKvbdLBLGmBwq
+DncLKvbdIsZBTNYM
+EPDLKvbdOXnuzcmt
+EPDKjvbdKDJcRJcY
+EObkKvbdiBncFWqR
+DncLKvbdlhcsqUrB
+DncKjvbdrylQTAgn
+DoDLKvbdTlWOaWOi
+EPCkKvbdegjurNpg
+EObjjvbdyTNhmSBg
+EPCjjvbdQccBPpcr
+EPDKjvbdeOeSkTtS
+DoCjjvbdGYuVAdXb
+EObjjvbdrzMPsAhO
+DncLKvbdrEFJQOVa
+EPCjjvbdbhmKKfWx
+EPCkKvbdeYZssqez
+DnbkKvbdURQntuHm
+EPDLKvbdkDLkRHVH
+EOcKjvbdlZSrSxft
+EObkKvbdijGHimXr
+EOcLKvbdpxnggQdY
+DncKjvbdJKEAJpGd
+EPCjjvbdMowpumfs
+DoCkKvbdmSYtysDi
+DoDLKvbdBsBDTfWr
+EPDLKvbdrMzKZMHi
+DnbkKvbdBraDUGWr
+DnbjjvbdDxYMTtTl
+DncKjvbdFyUuBEYC
+EPCkKvbdVZITzKnn
+DnbkKvbdTkvPBWPJ
+EObkKvbdSQTfjFdX
+DoCjjvbdZisIPgBf
+EPCkKvbdLGFhCAqV
+DoCjjvbdNGcQNPuL
+DoCkKvbdqlzJyMIJ
+EObjjvbdZtIiZDrn
+DnbjjvbdeEoRawCj
+DoDKjvbdUaBqSqRy
+EOcLKvbdmfdwmOGy
+DoDKjvbdptTfqrKt
+DoDLKvbdvAcxsPEh
+DoCkKvbdySmhmRbH
+EOcLKvbdhfjDZWKV
+EOcKjvbdHffzZXxH
+DoDKjvbdLFfHaaQu
+EPCjjvbdgFlZmfgA
+EOcKjvbdtcCuXVno
+DoDLKvbdZirgpGbG
+EObjjvbdNsUWHEuQ
+DoDLKvbdsBfNLgKy
+DoDKjvbdGGKRnJUR
+DoDLKvbdKkAhWAKZ
+DnbjjvbdOFDtJJKd
+EPCjjvbdMuSrKmAX
+DnbjjvbdyXiKBpZk
+DncLKvbdOFDtIhjd
+DoDKjvbdNPxQumgT
+DnbjjvbdrSVLOKaN
+EPCjjvbdmJDtRVRa
+EPCkKvbdZeXfzgiC
+DoDKjvbdhaoCdwRR
+DncKjvbdiBncFXRR
+EPDLKvbdvBEYrndh
+DnbjjvbdBiLBkIfK
+EPDLKvbdhgJbyVjV
+DncKjvbdzRPNIiwA
+DnbjjvbdegjvRmpg
+DncLKvbdyYIibQZk
+EPCkKvbdxnTIXrhc
+EPCkKvbdhkeEOUby
+DnbkKvbdjJehKMxS
+DoDKjvbdkVwODbYX
+EPCkKvbdFWYpQNKF
+EPCjjvbdXrkaMsnx
+EPDKjvbdRjxetgLT
+DoDKjvbdEztRFLbi
+DnbkKvbdqdFJQNua
+EPDLKvbdTqQntthN
+DoDLKvbdYORAXtvU
+DnbjjvbdEYXksstM
+EPDKjvbdkMbMZdfo
+DncLKvbdJKEAKQGd
+EOcKjvbdFejSOJUR
+DoCjjvbdYlRdTmkm
+DoDKjvbdlYrqrxgU
+EPDKjvbdKVuFdFGi
+EOcLKvbdJqZeOfNe
+DnbkKvbdzoPpdcLx
+DoDKjvbddePSCXCj
+DoDKjvbdEASIlywX
+DoCjjvbdrEEiPmua
+EPCkKvbdidkGuPAO
+EObjjvbdKRZdnfNe
+DncKjvbdhgJcZWJu
+EPDLKvbdZxcimbkr
+EPDKjvbdNeEUIiKd
+EOcKjvbdvAdZSndh
+DncLKvbdjggMGGNk
+EObkKvbdOStVgFUp
+EPCkKvbdRaceMIxk
+DncKjvbdDwxMUUUM
+DncKjvbdWeyZtAPT
+EPCjjvbdEYXkstTl
+EOcKjvbdxsOJNSBg
+EPCkKvbdKQzFPFnF
+EOcLKvbdJXtCHkpp
+DoCjjvbdtlYXBUBX
+EPCjjvbdwuNFRYkn
+DoDLKvbdkDLjpfuH
+EPDKjvbdxrmhlqbH
+EOcLKvbdjmCLzEgP
+DoCjjvbduaEYsPFI
+EPCkKvbdCEPaWJmG
+DncKjvbdwtmEpxlO
+EPCkKvbdJbjCpjCx
+DnbjjvbdhzVGMRNf
+EPCkKvbdZxcinDMS
+DoCkKvbdrNZiyLgi
+EOcLKvbdIHGyyYYH
+EObkKvbdYNqAXuWU
+EPDKjvbdtvNwjRTA
+EPCkKvbdcJMjLFvx
+EPCjjvbdNrsvHEuQ
+DoCjjvbdnGeYMmgZ
+DoDLKvbdSLZGUfjs
+EPDKjvbdtvOYKRTA
+DoDKjvbdziuPpESt
+DoCkKvbdMgDPlotk
+DoCkKvbdeFOrCXDK
+DnbkKvbdMgColpUk
+EPCkKvbdKVuFdFGi
+DoDLKvbduCcUvuoP
+DoCkKvbdRDcAopdS
+EPDLKvbdehKvSNpg
+EOcKjvbdDoCjjvbd
+DoCjjvbdOSsufdtp
+EObjjvbdGQASwGfZ
+DncLKvbdiHJcYujV
+DncKjvbdRadFMJZL
+EPDLKvbdZxcinDLr
+EPDLKvbdhaoDFXQq
+DoDKjvbdcJNJkGXY
+DoDLKvbduaDySoEh
+EOcKjvbdUxhUZkPO
+DncLKvbdVYhTzKoO
+DnbjjvbdehKvRnQg
+DnbkKvbdOhAXyAYa
+DncLKvbdxsNiNRag
+DoDLKvbdTppoVUgm
+EObkKvbdURROuVIN
+EOcLKvbdNsTugFVQ
+DoCkKvbdrXPlChxq
+EPDKjvbdHDkWJajK
+DoCkKvbdxnTHxTIc
+EPDKjvbdEvZPoljF
+EPDKjvbdrzMQTBIO
+EPCjjvbdqZPHgQcx
+DoCkKvbdVqmxCFMD
+DncLKvbdSPsgKGEX
+DoCkKvbdzjVPodSt
+DoDKjvbdnUtyjiqf
+DnbjjvbdIBkydzAD
+DoDKjvbdcTDKscjB
+EOcKjvbdiHKDYuiu
+DncKjvbdBraDUFvr
+DoCjjvbdQmYCZOUz
+EPCkKvbdySnIlqbH
+DnbkKvbdkDLjqGuH
+DnbjjvbdVqnYCFMD
+DncLKvbdGKeTCglu
+DncKjvbdlZSqrxft
+DncLKvbdrEEhpNvB
+EOcLKvbdrDeJQNvB
+EPCkKvbdQmXbYmtz
+DoCkKvbdQlxCYnUz
+EPCjjvbdEObkLWbd
+EPDLKvbdehKuqmqH
+EPCkKvbdkCkjpfuH
+DncKjvbdRXNcblHc
+EPCjjvbdsrqrxydc
+EPDKjvbdddoSBvcK
+EPCjjvbdADRxJzIp
+EPDLKvbdvAcxsPEh
+EPDKjvbdSLYfUgLT
+DoCkKvbdsrrTYyeD
+DoCkKvbdLFegbApu
+EPCjjvbdyqOliJwA
+EPDKjvbdqTtGrRjt
+EPCkKvbdhbObdvqR
+EPCjjvbdcScLUEJa
+DoDLKvbdRWnDblID
+EObkKvbdZLrETnLm
+DoDKjvbdiBoDEvpq
+DoDKjvbdMpXqVmfs
+EPCjjvbdpxngfpcx
+DncKjvbdsCGNLfjy
+DncKjvbdRjyGVHLT
+EPDKjvbdkHflGFmk
+DoDKjvbdlhdUQuSB
+EPCjjvbdKaLGlbXq
+EPCkKvbdVhXvXgYz
+EOcLKvbdKyQirztf
+EOcLKvbdliDsqVRa
+DncKjvbdJutfDdfi
+DoDKjvbdEXwksssl
+DncLKvbdxxIjCPyk
+EObkKvbdKaKgMaxR
+EPDKjvbdkCkjpgUg
+EOcLKvbdZLqctNlN
+EPDKjvbdNddThhjd
+EOcKjvbdYlSDsmlN
+EPDLKvbdmgExNOGy
+DoDKjvbdePErjstS
+DnbkKvbdZQleIldq
+DncKjvbdpssfrRkU
+EOcKjvbdDxYMTtTl
+EPCjjvbdySmhmSBg
+EPDKjvbdiiehJlxS
+EOcLKvbdFkFTDINV
+EPCjjvbdVqmxCFMD
+DncLKvbdIsZAsMwl
+DncKjvbdBraDTfXS
+EPDKjvbdmuUykJqf
+DnbkKvbdFyVUaEXb
+EObjjvbdzROmJJwA
+DncKjvbdEYXlUUTl
+EPDKjvbdBhjbKhfK
+DoCjjvbdJpzEneme
+DncLKvbdVwIwuceH
+EPDKjvbdhfjDYuiu
+EOcLKvbdFpASwHGZ
+EPDKjvbdZoOJEdyj
+DoDKjvbdqdEiPnWB
+DoDKjvbdnBjXYPNu
+DoCjjvbdiHKCxuiu
+EOcKjvbdGLFTChMu
+EOcKjvbdiMEdNtby
+DnbkKvbdGdKujBij
+DncKjvbdKQydneme
+DnbkKvbdziuPocsU
+DoDKjvbdmfdxNNgZ
+EObjjvbdDxXlUTtM
+EObjjvbddePSBwCj
+EOcKjvbdNPxQvOHT
+DnbkKvbdZHWdAOsJ
+EPDLKvbdyqPNIiwA
+DoCkKvbdpyPHfqDx
+EPDLKvbdUslsekuj
+EPCjjvbdiZtfLpnG
+DoCkKvbdmSZVZsDi
+EPCjjvbdpyOhGpcx
+EPDLKvbdzitoodSt
+DoDKjvbdVYhUZkOn
+EObkKvbdBsAbtGWr
+EPDKjvbdvBEYsOdh
+EObkKvbdGcjuibKK
+DncKjvbdeATqNYKG
+DoCjjvbdKNAEZgVB
+DncLKvbdqUUHSRjt
+EOcLKvbdGcjuibJj
+DoDLKvbdnBivxPOV
+DnbkKvbdKCjDRKCx
+DnbkKvbdrykosAgn
+EOcKjvbdUaBqTRRy
+EPCjjvbdcSbkTcjB
+DoDLKvbdIxTbILpp
+DoCjjvbdHDjuibJj
+DncKjvbduaDxroFI
+DoDKjvbdpedEtWBI
+EOcKjvbdXsLaNTnx
+EPCjjvbdYORAYVWU
+DoCjjvbdYpleIleR
+DoDKjvbdCDpAujMf
+EPCkKvbdpxoHfpcx
+DoCkKvbdUWMPisaR
+EPCjjvbdmuUzKjSG
+EPDKjvbdkxsRsYgU
+EPCkKvbdZxcjNblS
+DnbkKvbdbPffckzd
+EPDKjvbdUVkpJtBR
+DoCkKvbdvlvANEFN
+EObkKvbdShyjRAAl
+EPDKjvbdxrmhmSCH
+DoDKjvbdjvXNcaww
+EPDKjvbdkDLjqGuH
+EObkKvbdhfibxuiu
+EPCjjvbdlqyUyrci
+EPDLKvbdFVxopMjF
+EOcKjvbdqdEiPnWB
+DncKjvbdrXPlChxq
+DoCkKvbdxVMeRYkn
+EPCjjvbdlhdUQtqa
+EObjjvbdRotHKFcw
+EObkKvbdwjvcgzzG
+EPDLKvbdBhkBjiFj
+EObjjvbdlZTSTZGt
+DoCkKvbdkIHMFemk
+EObjjvbddndrkTsr
+DoDLKvbdFVxpQNKF
+EPCjjvbdZsiJZETO
+EObjjvbdiMFEOUby
+DoCkKvbdhlFEOUby
+EPCkKvbdrWolDIyR
+EObjjvbdmajWwoOV
+DoCkKvbdypoMiJwA
+DoDKjvbdCDpAvKMf
+EPDLKvbdzjVQQDrt
+EObjjvbdjlakydfo
+EObkKvbdJpyeOeme
+DoDLKvbdiHJcYvJu
+EOcLKvbdbsDKtEKB
+EOcLKvbdrpWOjDVf
+EObjjvbdelfWfmKL
+EObjjvbdxnSgwriD
+DnbkKvbdqlyjZLhJ
+EPCkKvbdQdDBPqDr
+EPCkKvbdRkYfUfjs
+EObjjvbdhtydwSVC
+DnbjjvbdWWhwvDdg
+DoDLKvbdypnliKXA
+DncLKvbdhfibxvKV
+DncLKvbdxrmiNSCH
+DncKjvbdUaBqSqRy
+DoDKjvbdZMSDsmkm
+DncLKvbdFjeScHmV
+EPDLKvbdQYmAHSrK
+DoCkKvbdUVlQJsaR
+DoDKjvbdGKdsDHmV
+EPCkKvbdkHgLfGNk
+EPDKjvbdCIkCLJFj
+DoCkKvbdrpWOicVf
+DncLKvbdqmZiyMIJ
+EObkKvbdNGcQMpUk
+EOcLKvbdhfibxuiu
+DoCjjvbdjcLjqHVH
+EPDLKvbdZxdJnDMS
+DncLKvbdHDkViajK
+EPDKjvbdhytelRNf
+EPDKjvbdZRNFIleR
+EObjjvbdNQYRWNgT
+EPCjjvbdNdcsiIkE
+DoCkKvbdajkfOnDA
+EPCjjvbdRNYCZOUz
+EPCkKvbdBcpAvKNG
+DncKjvbdqTsfqrLU
+EPCjjvbdsZlQSaHn
+EOcKjvbdqdFIpNvB
+DoCjjvbdtbcUwWPP
+EObjjvbdEYYMTtTl
+EOcLKvbdgGLzNfgA
+DoDLKvbdzdynzeZp
+DnbjjvbdajlGPNcA
+EPCjjvbdEJhJuxKA
+EPCjjvbdLLBIWAJy
+DnbkKvbdwzIFewdr
+DoCkKvbdBvzciEpW
+DoDKjvbdaNKasVNH
+EPDLKvbdVviXudEg
+EPDKjvbdcbSmSAUN
+EPDKjvbdqcdiQNua
+EPCkKvbdbBVdfPpX
+EOcLKvbdrEFIpOVa
+DoDKjvbdDigivXjA
+DoDKjvbdYSlBMtPY
+DoDKjvbdrRtjnLAm
+DoDKjvbdKeegbApu
+DnbkKvbdHgHZyXxH
+EPCkKvbddwzUTrFz
+DnbjjvbduDCtwWPP
+EOcLKvbdaRfDHsfL
+EPCjjvbddeOqbWbj
+DncLKvbdOFDsiJLE
+EObkKvbdSBceMIyL
+EOcLKvbdrylQSaIO
+DncLKvbdJcJcQjCx
+EPCkKvbdaRfCgsek
+EOcKjvbdzitoocsU
+DoDKjvbdyzdnSIJI
+EObkKvbddndsLTsr
+DoDLKvbdcTDKtEKB
+EPCkKvbddZyQYYpb
+EPDLKvbdCIjakJFj
+DncLKvbdLrWlzVQz
+EOcKjvbdxrnIlqag
+DncLKvbddeOrCWcK
+DoCkKvbdRaceLiZL
+EPCkKvbddePSCXCj
+DoDKjvbdJpzFOeme
+DoCkKvbdiMFEOUby
+DncKjvbdUQqPVVHm
+EOcLKvbdcSbjscjB
+DnbjjvbdvPTzpjoU
+EPDKjvbdEPDLKvbd
+DncKjvbdvBEYsPEh
+DnbjjvbdIxTbIMQp
+DoDLKvbdZLrETnMN
+EPCkKvbdZxdJmbkr
+EPCjjvbdIidAKQHE
+DncKjvbdrSUjmjaN
+DnbkKvbdkaNOmALA
+DnbkKvbdiGjCyViu
+EPCjjvbdYkrDsmlN
+EOcKjvbdypoMhjXA
+DoCkKvbdiGjDZViu
+DoDLKvbdZxcinClS
+DoCjjvbdqUUGrSLU
+DnbkKvbdYTLaNUPY
+EObkKvbdehKurNpg
+EOcKjvbdmRyVZrdJ
+EObkKvbdZirhPgBf
+EOcKjvbdpyOggQcx
+DnbkKvbdfoazwEXh
+DnbkKvbdmuUzLJqf
+EPDLKvbdYlRdUOLm
+DncKjvbdRjyFuGjs
+DoDLKvbdQdDAopdS
+DoCkKvbdmSYtysEJ
+EObjjvbdQdDApRDr
+DoDKjvbdyOTHxShc
+EPDKjvbdptUHSRkU
+EOcKjvbdLGGHaaRV
+EOcLKvbdaaWFFopX
+DoCjjvbdlBMnmALA
+DnbjjvbdZnnIdeZj
+DoCjjvbdZMRdUNkm
+DoDLKvbdRMxByNtz
+EPCkKvbdJYTahMRQ
+DncLKvbdpyPIHQdY
+DoCkKvbdVBCRTRRy
+EOcLKvbdZyEKODLr
+EObkKvbdRadEkiYk
+EOcKjvbdcyyQXyRC
+DnbkKvbdVqnXadkc
+EPCkKvbdGKeTDIMu
+DnbkKvbdrRtjnKaN
+EObkKvbdFVxooljF
+DoDKjvbdDoCjjvcE
+DnbkKvbddneTLTsr
+EPDKjvbdGcjvKCKK
+EObjjvbdgPazvdYI
+DoDKjvbdSLYfVHKs
+DoCkKvbdEPCjkWbd
+DnbjjvbdmaivxPOV
+EObjjvbdJJdAJogE
+DoDKjvbdhkddNtby
+DoCkKvbdiCPDEwQq
+EOcKjvbdmajXYOmu
+DnbkKvbdqYngfqEY
+EOcKjvbdTppoUuIN
+EPDKjvbdNddThhkE
+DncKjvbdDnbkKvbd
+DnbjjvbdZRNEiNFR
+EPCjjvbdaaWFFopX
+EPDLKvbdBhjbKhej
+DoCkKvbdfpBzvcwh
+DoDKjvbdmSZVZrdJ
+EObkKvbdbAueGQQX
+EOcKjvbdNQXqWOGs
+EPCjjvbdvAcySndh
+EOcLKvbdySnImRag
+EObkKvbdSxLLmzkY
+DnbjjvbdcJMjLGXY
+EObkKvbdBsBDUFwS
+DoCjjvbdqlyjZLhJ
+EPCjjvbdliEURVRa
+DoDKjvbdptTgRrLU
+DncKjvbdiBoCdwQq
+EOcKjvbdEOcLLXDE
+EObjjvbdEYYLtTsl
+EPDKjvbdVTmTekuj
+DncLKvbdLFegbBQu
+EPCjjvbdmttzLKRf
+EPDLKvbdpfEFTuaI
+DncKjvbdiiegjMwr
+EObkKvbdxVNEqYlO
+DoCjjvbdRWnDblHc
+EPCjjvbdaSFbgtGL
+DnbkKvbdozmcjwoA
+DoDKjvbdPyNAHSrK
+DncLKvbdVqnXbEkc
+EPCkKvbdFWYpQNJe
+EOcLKvbdlYsRsZHU
+EOcLKvbdQvmcblID
+EObjjvbdRkYetfkT
+DoCjjvbdFjdsDINV
+EPCjjvbdrafNMGkZ
+EPDKjvbdczZQXxqC
+EPDLKvbdDwxLtTsl
+DoCjjvbdFpASvffZ
+DoCjjvbdiMEdOVCy
+DoCkKvbdelevfljL
+DnbjjvbdaSFcHtFk
+DncKjvbdBhkBkIfK
+EObjjvbdGKdsDHmV
+DncLKvbdhzUekqOG
+EOcLKvbdZshiZDrn
+DncLKvbdDjIJuwjA
+EPCjjvbdpxoHfqEY
+EPCjjvbdOAIrsjSA
+EPDLKvbdEuyPolie
+EPDKjvbdssRrxydc
+EPDKjvbdjlakzEgP
+DncKjvbdiUydwRuC
+DoCkKvbdZMSDtNkm
+EPDLKvbdbBVeGQPw
+EObkKvbdNHDPlpVL
+DoDLKvbdDjHiuxKA
+EPDKjvbdatbGwkUI
+DnbjjvbdeqaWzkbo
+DoDKjvbdvvlBWAuu
+EObjjvbdZirhQHBf
+EPCkKvbdDncLKvcE
+DnbjjvbdehKvSNpg
+DncKjvbdVwIwudFH
+DoCjjvbdNQYRVmgT
+EOcKjvbdNrtWGeUp
+DncKjvbdvvlAvAuu
+DnbkKvbdjKGHimXr
+EObjjvbdhkddNuDZ
+EPCkKvbdNddThhkE
+EPCjjvbdsPunjDVf
+EPDKjvbdxZgfFwdr
+DncKjvbdZyDjNblS
+EPDKjvbdjcMLQfuH
+DncKjvbdwtmFRZMO
+DncKjvbdVhXuwgYz
+DoCkKvbdVZITyjnn
+EPCkKvbdNrtWHEtp
+EPCjjvbdMfbomQUk
+EObkKvbddwyssqez
+EPCkKvbdhfjCyVjV
+DoDKjvbdtvOYJpsA
+DoDKjvbdiLdcnVCy
+EObkKvbdLrWlzUpz
+DoCkKvbdSPsgKFdX
+EPCjjvbdkNCLyeGo
+DncKjvbdCSaCtGWr
+DnbjjvbdRkZFtgLT
+DoCkKvbdVAaprprZ
+DnbjjvbdyXhibQZk
+DoCkKvbdsQVnibvG
+EPCjjvbduaDyTPFI
+DncLKvbdUaCRSpqy
+DoDLKvbdnPzYukZC
+DoDKjvbdRWnDcMHc
+EOcKjvbdxVNFRZLn
+EOcKjvbdRkZGUfkT
+DnbkKvbdvmWAMdEm
+EOcKjvbdmbKXYOmu
+EPCkKvbdyXiKCPyk
+DnbkKvbdkHgMFfOL
+DncKjvbdVYgtZkPO
+EPCkKvbdDnbkKwCd
+EObkKvbdKfGHaaRV
+EPCkKvbdqZOggQdY
+EOcLKvbdTlVnaVoJ
+DoCkKvbdhanbeWqR
+DnbkKvbdypoMiJwA
+DnbkKvbduMXvaUBX
+DoDKjvbddiirWUzn
+EObkKvbdqYoHgQcx
+DnbjjvbdFyUuBDwb
+DoCkKvbdKCicQjDY
+EPDLKvbdezvYeJTw
+EPCjjvbdSxKlNzkY
+DoDKjvbdQmYByOUz
+DnbjjvbdIGgZxxXg
+EPDKjvbdqmZjZLgi
+DncKjvbdmfeYMmgZ
+DncLKvbdGdLVibKK
+DoCkKvbdZGvdAOsJ
+EObkKvbdjSzhrkJz
+EPDLKvbddePRbWcK
+EObjjvbdDxXkstUM
+DoCjjvbdvlvANDeN
+EOcKjvbdrDdiQOWB
+DoCkKvbdmajXXoOV
+DncKjvbdUtMsekvK
+EOcLKvbdxxJKBoyk
+EPDKjvbdqYnhGpcx
+EObjjvbdatafwkTh
+DncLKvbdajkenmcA
+DnbjjvbdZQleImEq
+EPCjjvbdDncLKwCd
+EObjjvbdHELWKBij
+EPDLKvbdxrmhmRag
+DoCjjvbdwXMBWBVu
+EObjjvbdsPvOjCvG
+EOcLKvbdssSTZZdc
+EPCkKvbddndrkUUS
+EOcLKvbdNGbolotk
+EObjjvbdZMSDtNlN
+EObkKvbdZshiYcsO
+DncKjvbdDwxLsstM
+EOcLKvbdqZPIGqEY
+EOcKjvbdZRNFImFR
+EOcKjvbdrDeIonVa
+DnbjjvbdYzberKWZ
+EObjjvbdegjvRnQg
+DoCkKvbduDDUwWOo
+EPDKjvbdRotGjGEX
+EOcKjvbdKQyeOeme
+EPCjjvbdDwxMTtUM
+EObjjvbdpedFTvAh
+EPDLKvbdFxtuBDxC
+DoCjjvbdlqxtzSdJ
+DncKjvbdZLrDtOMN
+EPCkKvbdGdKujBjK
+DoCkKvbdezvYdiTw
+DnbjjvbdrEEiQOVa
+DncKjvbdOYPVzdOU
+DnbjjvbdxwiKCPzL
+EObkKvbdRpTgJecw
+DoCkKvbdwtmEpxlO
+EPDKjvbdqFceTuaI
+DncKjvbdsPuoJcWG
+DncLKvbdRyjHsCvA
+EPCkKvbdyXiJaoyk
+EPDLKvbdJvVFcdgJ
+DncLKvbdrXPlChxq
+EObjjvbdvBEZTOdh
+DoDKjvbdqvokcJYq
+EOcKjvbdlqxtzSci
+EPDKjvbdFkErbglu
+DoDKjvbdEPDLKvcE
+EObkKvbdijFhJlxS
+DoCjjvbdOFDtJJKd
+DnbkKvbdyXhiapZk
+DncKjvbdEXwlTtTl
+DncLKvbdZyEKOCkr
+DnbkKvbdqlyjYlIJ
+EObkKvbdIGfyxwxH
+DnbjjvbdyNrgxTIc
+DnbkKvbdeOeSkTsr
+EPCjjvbddZyPxZRC
+DncLKvbdkDMKpgUg
+EPDKjvbdfIKuqnQg
+EPCkKvbdhlFENuDZ
+DoDLKvbdiBoCdvqR
+EPCkKvbdySnImRag
+DnbjjvbdIxTahLqQ
+DoDKjvbdZnmhddyj
+EOcKjvbdgQBzwEXh
+EPDLKvbdfILWSNqH
+DncKjvbdjcMKqGtg
+EObkKvbdKQzEnfNe
+EPDKjvbdUQqPVVHm
+EObjjvbdREDBPpcr
+EObjjvbdnHExMnGy
+DnbkKvbdvBDxrndh
+DncKjvbdCEPaVimG
+DnbkKvbdGBPQxizm
+EPDKjvbdLqwMzVQz
+DnbkKvbdEPDLLXDE
+EPDKjvbdwWkaWBVu
+EObkKvbdxrnImSCH
+DncKjvbdsrqrxzEc
+DnbkKvbdpfDeUWAh
+EPDKjvbdjAQHApGj
+DoCkKvbdaSGChTfL
+DoDKjvbdiHJbxvKV
+EPDLKvbdlhdURUqa
+EPCjjvbdIwsahMRQ
+EObjjvbdGYtuBEYC
+DncLKvbdNeEThhkE
+EObkKvbdBvzdIePv
+EPCjjvbdbAueFpQX
+EOcLKvbdjAQGaQGj
+EPCjjvbdNHDQNPuL
+DncLKvbddoFSkUUS
+DncKjvbdACqxJzIp
+DnbkKvbdxLWcgzyf
+EPCkKvbdTlVnaWPJ
+DoCkKvbdCJKbLIfK
+DoCkKvbdDwxMUTtM
+EPCkKvbdEPDLKwDE
+EOcLKvbdTvMQKTaR
+EOcLKvbdeXytTrFz
+EPDKjvbdNUrrLNAX
+DnbkKvbdZjShPgBf
+EObjjvbdjAPfaQGj
+EPCkKvbdYlRdUNlN
+EPDKjvbdzjUoocsU
+DoDLKvbdKDKCqJbx
+EPCjjvbdQvnECkhD
+DnbkKvbdGckVjBij
+EObjjvbdXmqAXuVt
+EPCjjvbdeFPRavcK
+DoDKjvbdEYXlUTsl
+DoCjjvbdXrlBNToY
+DoDLKvbdrRuLNkAm
+DncLKvbdDxXlUTtM
+EOcKjvbdwuNEqZLn
+EPDKjvbdEOcLLWbd
+DoCkKvbdpfDdtVaI
+EOcKjvbdmpZyVjyC
+EOcKjvbdtSrSxzFD
+EObkKvbdsBemLfjy
+DoCjjvbdUGznMWue
+DncLKvbdbAvEfPpX
+DnbjjvbduCcUwVno
+DoDLKvbdTppoUuIN
+DncKjvbdYqMeImEq
+DoCkKvbdrDdhomvB
+EObjjvbdgFkzOGgA
+EPDKjvbdSwjkmzjx
+DoCjjvbdREDBPpcr
+EObjjvbdYkrDtNlN
+EObjjvbdZisHogCG
+DncKjvbdUtMselWK
+DoDKjvbdkHfkeemk
+DncLKvbdSLYeuHLT
+EOcLKvbdeFOrBwCj
+EObjjvbdHDjvKCJj
+DnbkKvbdkIGkeemk
+DoCkKvbdZQmFJMeR
+DoCkKvbdqTtGrSKt
+DncLKvbdcIljKfWx
+DnbjjvbdRjxfUgKs
+DnbkKvbdhyuFlROG
+EObkKvbdpxoHfpdY
+DoDKjvbdhuZdwRtb
+DnbkKvbdBdQAvKMf
+DoCkKvbdVTlsekuj
+EObkKvbdCJLBkIfK
+EOcKjvbdmgFYNNgZ
+EPDLKvbdxrnImRag
+DoCjjvbdbKlGPODA
+DoCjjvbdMoxRVmgT
+EPDLKvbdKfGIBaRV
+DoDKjvbdSCEElJZL
+EPCkKvbdmRxtzSdJ
+EPDKjvbdjKGIKNXr
+DnbkKvbdlhdTptrB
+EPDKjvbdBcoaVilf
+EPDKjvbdRzKIScWA
+EOcKjvbdnHFXmOGy
+EPCjjvbdFfJrNhtR
+DnbkKvbdzaAPHHCM
+DnbkKvbdwXLaWBWV
+DoDKjvbdKeegaaQu
+EPCjjvbdRotHKFcw
+EOcKjvbdnGeXmOGy
+DoCjjvbdmIdTqVRa
+DncLKvbdfNGWgMik
+EPCkKvbdrovPJbuf
+EObkKvbdEvYpPljF
+DncLKvbdOYPVzdOU
+EObjjvbdrzLosAhO
+DnbjjvbdyzdnSIJI
+EOcLKvbdIsZArmYM
+DoDLKvbdvAdZTPEh
+DoCkKvbdQvnDcMHc
+EObjjvbduMYWaUBX
+DncKjvbdUyHszLOn
+EPCkKvbdbrbjscia
+EObjjvbdTkunaVni
+EObkKvbdeATpmYKG
+EOcKjvbdqUTfqrLU
+EPDLKvbdGYttaDxC
+EPDKjvbdRNYByNtz
+DncLKvbdADRwizJQ
+DncLKvbdKfFgaaQu
+EPDKjvbdxZhGGYFS
+DncLKvbdwtmFRYlO
+EOcLKvbdehLVrNqH
+DnbkKvbdKxpirztf
+DoCjjvbdZxdKNcLr
+DoDLKvbdrbFmMGjy
+DoDLKvbdqYnhHQcx
+EPCjjvbdGKeTDIMu
+EPCjjvbdZRNEhleR
+DnbkKvbdfMfXGmJk
+DnbjjvbdRjyGVHKs
+EPDKjvbdZHXEAOri
+EObjjvbdxnTIYTIc
+DnbjjvbdTpqOttgm
+EOcLKvbdWXIwuceH
+EOcLKvbdzROmJKXA
+EPCkKvbduCbtwWOo
+DncLKvbdJTZBTMwl
+EObkKvbdlqyUysDi
+DnbjjvbdrpVoJcWG
+DoCjjvbdHDjvKCKK
+EObkKvbdVwJXvDeH
+EPDKjvbdZsiJZDrn
+DoCkKvbdhfjDYvJu
+DoDLKvbdZyEJmcLr
+DnbjjvbdmajXXoOV
+DoCkKvbdelewGmKL
+DoDLKvbdUtMsfMVj
+EOcKjvbdegjuqmpg
+DnbkKvbdZMRctNkm
+DncKjvbdhlEdOUcZ
+DoDLKvbdqAiFAXIE
+EObjjvbddBsMrAUN
+EPDKjvbdaSGDHtGL
+DnbjjvbdbVCGwjtI
+DncLKvbdzdzOzeZp
+EPDKjvbdKQyePFnF
+EPDLKvbdauBgXjtI
+EPDLKvbdCSaCtGWr
+DnbkKvbdbsCjtEKB
+DoDKjvbdCWzdIeQW
+EPCkKvbdRbDeLhxk
+EObjjvbdOEctJIkE
+DoCkKvbdSPtGiedX
+DncKjvbddZyPxZRC
+DnbjjvbdTukpKUBR
+DoCjjvbdpstHRqkU
+DncKjvbdNdctIhjd
+EOcKjvbdUWMPjTaR
+DoCkKvbdLGGHbApu
+EObjjvbdmozZWLZC
+EObjjvbdULvPAvOi
+EPDLKvbdcJMikFvx
+DncLKvbdjJfHjMxS
+EPCjjvbdqYoIHREY
+DoCjjvbdiifHjNXr
+EObkKvbdZLrETnMN
+DnbkKvbdtSqsYydc
+EPDLKvbdCIkCLJFj
+DoCkKvbdliDsqUrB
+DnbkKvbdNPxQumgT
+EPDKjvbdACrYJyiQ
+EOcLKvbdYTMBMtOx
+DoDLKvbdNGcQNPtk
+DncKjvbdtbbtvuno
+DncKjvbdZLrEUNlN
+DoCkKvbdaogHELzd
+DoCjjvbdgFlZmfgA
+EPCjjvbdvPTzpkOt
+DoCjjvbdjKGHjMxS
+EPDLKvbdauBgXjsh
+EOcLKvbdiBoCeWpq
+EObkKvbdSPsfjGEX
+DnbkKvbdzGxlAMeX
+DoDLKvbdqFcdtWAh
+EPCkKvbdOYOuzcmt
+DoCjjvbdDwxLtUTl
+DnbkKvbdOTUVgFUp
+DnbkKvbdiGibyWJu
+EPCjjvbdUyITzLOn
+DoCkKvbdbLMFnnDA
+DoCjjvbdDwxLsssl
+DncLKvbdBiLBjhfK
+EPDKjvbdNPwpvOGs
+EObkKvbdzQnliKXA
+DoCjjvbdeYZssqez
+DoCjjvbdeATplxKG
+EOcLKvbdRyjIScWA
+EPDKjvbddeOqbWcK
+EPDLKvbdACrXjZhp
+DnbjjvbdmuVZkKSG
+EPDKjvbdVqmwbFLc
+EPCkKvbdCSaCtFwS
+DnbjjvbdVZHszLPO
+DoDKjvbdVrNxCFLc
+EOcKjvbdegjuqnQg
+EPCjjvbdZMSETmlN
+EOcKjvbdHDjvKBjK
+EPCkKvbdyOTIXsJD
+DoDKjvbdnQZyWKxb
+DncLKvbdxwhiaozL
+DncLKvbdNdcshhkE
+EPCjjvbdXnRAYUut
+DoDLKvbdNsUWGeUp
+DncKjvbdWHwuwfxz
+DnbkKvbdRpUGifEX
+DnbjjvbdEOcLKwCd
+EPDKjvbduaEYsOeI
+DnbkKvbdjhHLfFnL
+DncLKvbdZoOJEeZj
+EPCkKvbdEPCjjvcE
+EObjjvbdxUldqYkn
+EObkKvbdOEdThiLE
+DnbkKvbdjcMKpgVH
+EObjjvbdkIGkeenL
+DncKjvbdZsiJZDrn
+EPCkKvbdxnShXsIc
+DoDKjvbdZnmiEdzK
+DoCkKvbdVTmUGLvK
+EOcLKvbduCcVXVno
+EObjjvbdZQleJNFR
+EObjjvbdFejRmhsq
+EPDLKvbdaMkBruNH
+DoCkKvbdNQXqWNgT
+DoDKjvbdjuwNcbXw
+EPCjjvbdSBceLiYk
+DoCjjvbdMgColpVL
+DoDLKvbdVZHtZkPO
+DoDKjvbduMYXBUAw
+EPDKjvbdNeDshiKd
+DoDKjvbdTAFJICPE
+EObjjvbdJvVFceGi
+EObjjvbdNHCpMpUk
+DnbkKvbdijGIKNYS
+DoDLKvbdDncKkXCd
+DncKjvbdkMakyeGo
+EObkKvbdjKFgilwr
+DoCkKvbdOhAXyAZB
+DoCkKvbdUGznMWvF
+EOcKjvbdRosfifEX
+EPDLKvbdfNFvgMjL
+EObkKvbdxxJJbPzL
+EPCjjvbdQlxCYmtz
+EOcLKvbdgPazwEXh
+DoDLKvbdkySrTYft
+DoDLKvbdhgKDYuiu
+DoDKjvbdYkrETmkm
+EObjjvbdNPwpunHT
+EOcLKvbdYlRdUNlN
+DnbkKvbdZLrDtOLm
+EObjjvbdxrnJMrCH
+EObjjvbdZnnIeFZj
+DoCjjvbdzRPMhiwA
+DncKjvbdssSSxyeD
+EOcLKvbdjAPgAofj
+DncKjvbdRosfifEX
+DoDKjvbdEXwktUTl
+DnbjjvbdWRmwadkc
+EPDLKvbdeEoRavbj
+DoDKjvbdXsMBNToY
+DnbkKvbdVqmxCFLc
+EOcKjvbdkVwOEBww
+DoCjjvbdfNGXGmJk
+EOcLKvbdmtuZjiqf
+DoCkKvbdnPyyWKyC
+EObjjvbdJpydoGNe
+DnbkKvbdjJfHimYS
+DoCkKvbdyXhjBozL
+DoCjjvbdkIHLeenL
+EOcLKvbdTAEiIBoE
+DnbkKvbdvBDxsPFI
+DncKjvbdlhdTpuRa
+EObjjvbdFfJqmiUR
+EPCjjvbderAvzkbo
+DncLKvbdwygeexEr
+EObjjvbdSBdElJZL
+EOcKjvbdySmiMrBg
+EPDKjvbdatbGwkTh
+DncKjvbdnBivwnmu
+EPDKjvbdFxuVAdYC
+EPDLKvbdqlzJyMHi
+EPDKjvbdZRMdhldq
+DoCjjvbdNeDtIhkE
+DoCkKvbdfMewGlik
+EOcLKvbdhaoDEwQq
+DnbjjvbdIwsagkqQ
+DncKjvbdkIHMGFnL
+DoDLKvbdGdKuibKK
+DnbjjvbdTAEiICOd
+DncLKvbdNeEThiKd
+EObkKvbdYpmEiNFR
+EPDLKvbdFkFTDHlu
+DoCkKvbdkDLkRHUg
+DnbkKvbdyYIjCPyk
+DncLKvbdFVyQPmKF
+DnbjjvbdZQldhldq
+DoDKjvbdVqnYBdkc
+EPDKjvbdSKxeuGkT
+EPCjjvbdiZuGLqNf
+DnbjjvbdJTZArmXl
+DnbkKvbdyNrgwrhc
+EOcLKvbdrNZiyLgi
+DncKjvbdSBdFMJZL
+EPCkKvbdfMfWfmKL
+EPDLKvbdfMevfljL
+DoCjjvbdmIcsqVRa
+DoDLKvbdrEEhpOVa
+EPDLKvbdZRMeImEq
+DoDLKvbdyTNiMrBg
+EPCjjvbdsQVnibvG
+EOcKjvbdvBDxsPFI
+DoDKjvbdqquKnKaN
+DncLKvbdqGDeTuaI
+EPCkKvbdZdxGzgiC
+DoDKjvbdkDLkQftg
+DoDKjvbdePEsKtUS
+DoDKjvbdUxgtZjoO
+DncLKvbdxUmFRYlO
+DnbjjvbdwuMeRYkn
+DoCkKvbdRWmdClID
+EPDLKvbdCDpBWJlf
+DncKjvbduaEYrneI
+DnbjjvbdfHkVqmpg
+EPDKjvbdKxpirzuG
+DoDLKvbdZLqdUNkm
+DoDLKvbdDwxMTstM
+EOcKjvbdrzLosAhO
+DnbjjvbdqZPHgQdY
+EObkKvbdjggMFfNk
+EPCjjvbdZMRcsmkm
+EObjjvbdEJgiuxKA
+DncLKvbdZtJJZDsO
+EObkKvbdRjxeuGkT
+DncKjvbdqdFJPmua
+DoCkKvbdGYtuAcxC
+DoCjjvbdZnmheEzK
+DoCkKvbdKWUfEFGi
+DoCkKvbdfMfXGmKL
+DnbjjvbdjvWmcbXw
+DnbkKvbdyzeORhJI
+EPDLKvbdpstHRqjt
+DoDKjvbdTukpKUAq
+DoDKjvbdSPtGjFcw
+DncKjvbdWSNxCFMD
+DnbkKvbdjlalZdgP
+EOcLKvbdkxsRsYgU
+EObjjvbdLFfICApu
+DoDKjvbdCEQBWKMf
+DoDKjvbdbAvFFpQX
+DoCkKvbdhgKCxvKV
+DncLKvbdjcMLQgVH
+EPCkKvbdzitpQDrt
+EOcKjvbdNVTRjmAX
+EPDKjvbdkxsRsZHU
+DoDKjvbdKDJcRKCx
+EPDKjvbdFjeScHmV
+EPCkKvbdZjTIQHBf
+DnbkKvbdlqyUyrdJ
+DoDKjvbdehKurORH
+EObjjvbdbKlFoODA
+DoCkKvbdwtmFQyMO
+DoCjjvbdXnRAYUut
+DoDKjvbdxsOIlqbH
+DncLKvbdyNsIXrhc
+DoDLKvbdCEQAvKNG
+DncKjvbdRotHJedX
+EPDLKvbdVZHsyjoO
+DnbjjvbdkCkkRHVH
+DoDKjvbdRWmcblHc
+DncLKvbdqvokbiYq
+DoDLKvbdRkZGVHLT
+EObjjvbduCbuXVno
+DoCkKvbdEJgivYKA
+DoDKjvbdkWWnDbYX
+EPDKjvbdnGdxMmfy
+DoDLKvbdIHGzYxYH
+DoDKjvbduCbtwVno
+EObkKvbdqlyjYkgi
+EObjjvbdVwIwudEg
+DnbjjvbdfRaWzkcP
+EPCkKvbdEARhlzXX
+DnbkKvbdfMevfmJk
+DncLKvbdZyDjNcLr
+EOcKjvbdtAHQhABS
+DncKjvbdkClKqGtg
+DoCkKvbdEObkLXCd
+EObjjvbdFkFTDINV
+EOcKjvbdEztQdkcJ
+DoCkKvbdKaLHNBxR
+EPDLKvbdhaoCdvqR
+EObkKvbdrJAJdmOe
+EObjjvbdrpVnjCuf
+EPCkKvbdFjeTCglu
+DoCjjvbdqdEiPnWB
+EPDKjvbdGFirOJUR
+EPCkKvbdJmADzHUa
+EPCjjvbdWWhwucdg
+DncLKvbdBhkBjiFj
+DoCkKvbdSZihSbvA
+DncKjvbdZtIiZETO
+EPDLKvbdCTAcUGXS
+DoDKjvbdVqmxCFLc
+DncLKvbdmajWwoOV
+EPDKjvbdVhYVxHYz
+DoDLKvbddoFSjtTr
+DoDLKvbdrzMQTAgn
+DoCjjvbdUVlPjUBR
+EPDLKvbdtvOXipsA
+DoCjjvbdrouoKCvG
+EObkKvbdOSsufdtp
+EPDLKvbdIGfzZXxH
+EObkKvbdbQGgDkzd
+DoCkKvbdOFDtJIkE
+EPCjjvbdiHJbyWJu
+DnbjjvbdLAkHMaxR
+EPCkKvbdJTZBTMwl
+DncLKvbdSQTfjGEX
+EOcLKvbdlrZVZrci
+EObjjvbdkyTSTZHU
+EPCjjvbdxUleQxkn
+EPDLKvbdEKIKWYKA
+DoCkKvbdZHWdAPSi
+EPDLKvbdxVNFRZMO
+EPDLKvbdcSbkTcjB
+DoCkKvbdlYsSTZGt
+EPDKjvbduaDxroFI
+EObkKvbdNHDQMouL
+DoDLKvbdxrnJMqbH
+DnbjjvbdmfeXmOGy
+DoDKjvbdidkGtoAO
+DnbjjvbdGYtuBEXb
+DnbjjvbdRECaQQdS
+DoCkKvbdmajXXnnV
+DncKjvbdZMSEUNlN
+EPCkKvbdZtJIxcrn
+DncLKvbdJpydneme
+DncKjvbdVviYWEEg
+DoDLKvbdyXhjBoyk
+DoCjjvbdbhlikGXY
+DnbkKvbdVviXudFH
+EPCkKvbdYTMAlsnx
+EPCjjvbdxZhFeweS
+DoCjjvbdyNsIXriD
+DoDKjvbdznoqEcMY
+DnbjjvbdauCHXjtI
+DncKjvbdIsZAsMwl
+EPCkKvbdZMSDtOLm
+DnbkKvbdJqZePFme
+EPDKjvbdkHfkeenL
+DoDLKvbdaNLCStmH
+DncLKvbdIwsbHkqQ
+EObkKvbdfHjvRnRH
+EPCjjvbdlqyVZsDi
+EObkKvbdEuxoolie
+DoDKjvbdjAPgAofj
+EOcLKvbdjcMLRHVH
+DncKjvbdjKFgjNXr
+EPCkKvbdmIctQuRa
+DncLKvbdJpyePGOF
+DncLKvbdNGbpMouL
+EObkKvbdpfDdsuaI
+EPCjjvbdyzeORhIh
+DoDKjvbdrDdhpNua
+DoCjjvbdFfKRmhtR
+EPDLKvbdpfEEsuaI
+EPDLKvbdqcdhpOVa
+EPCjjvbdVYgsykPO
+DoDLKvbdDncLLXCd
+EObkKvbduaEYroEh
+EOcLKvbdkNBlZeHP
+EObjjvbdGcjvJajK
+DncLKvbdrpVoJbuf
+EObjjvbdEKIJuxKA
+DncKjvbdZxcjODMS
+DncLKvbdmgFXmOGy
+DoCkKvbdUMVoAuoJ
+DoDKjvbdqcdiQNua
+DnbkKvbdbrcKtDia
+DnbkKvbdKfFgbApu
+DncKjvbdezvZEiTw
+DnbkKvbdlqxtzSdJ
+DoCjjvbdOTUWGeUp
+EPCkKvbdJXtBhMQp
+EOcLKvbdOAJTTjSA
+EOcKjvbdfILVrNpg
+EOcLKvbdnQZxvLZC
+EPDKjvbdyYJJaoyk
+DnbjjvbdkMakzFHP
+DnbjjvbdjbkjpfuH
+DoCkKvbdgGLymfgA
+DoDLKvbdJYUBhLpp
+EPCjjvbdJSyBTMxM
+DnbjjvbdyTNiMrBg
+DnbkKvbdqYoHfpdY
+EOcKjvbdZyEKNcLr
+DoCkKvbdZtIiYcsO
+EPCkKvbdZQmFJNFR
+DncKjvbdSPsgKFdX
+DoCjjvbdvwMAuaWV
+EPDKjvbdHfgZxxYH
+EObkKvbdrSUjnKaN
+DnbjjvbdKWVGEFGi
+DncKjvbdsPvOjDWG
+EPDKjvbdhzVFkqOG
+DoDKjvbdssSSyZdc
+DoDKjvbdYkqcsmlN
+EPCjjvbdYpldiNFR
+DncLKvbdemFwGlik
+DoDLKvbdjuvmdBxX
+DoDKjvbdCTBDTewS
+DoCkKvbdKeehBaQu
+EObkKvbdwyhFexEr
+DoDKjvbdQvmccMID
+DoDKjvbdVviYVceH
+EPCkKvbdmRxtyrdJ
+EPDLKvbdYqMeJNFR
+EPCkKvbdRbDeMIxk
+EPCkKvbdcJMjKfXY
+DnbkKvbdVwIwvDdg
+DnbjjvbdIwtCHkpp
+DncLKvbdczYpYYqC
+EPCkKvbdKaLGmBxR
+DncKjvbduLwwAsaX
+DncLKvbdssRrxzEc
+EObjjvbdrXQMCiZR
+DnbkKvbdZRNFImFR
+EOcKjvbdACqwjZhp
+DnbjjvbdbKlGOmcA
+EObjjvbdGFirOJUR
+EPDLKvbdqvokbiYq
+EOcKjvbdJmAEZgUa
+DoCkKvbdbhljKevx
+EPCjjvbdbKlGPNcA
+EOcKjvbdRMxByOUz
+EOcKjvbdbsDLUEJa
+EPCkKvbdRacdlJZL
+EObkKvbdmuUyjjSG
+EObkKvbdjKFgjNXr
+DoDLKvbdlhctQuRa
+DoCkKvbdjKFhKMxS
+EObjjvbdpedEtVaI
+EOcKjvbdIwtBhLpp
+DnbjjvbdZHWdAPSi
+EOcLKvbdiLdcmuCy
+EOcLKvbdjcMLRGuH
+EPCjjvbdRbDdkiZL
+EOcKjvbdiHJbxvKV
+EOcLKvbdaSGDHsfL
+DoCkKvbdjKFhJlwr
+DncKjvbdiBoCeWqR
+EOcLKvbdegjvSNpg
+EOcLKvbdrbGMlHLZ
+DnbjjvbdBraDUGXS
+DncLKvbdFeirOIsq
+EPDLKvbdhytekpmf
+EOcKjvbdIsYaTMwl
+DnbkKvbdrSVLOKaN
+DoCkKvbdTIyjRABM
+EOcLKvbdsBfNMGkZ
+EPDLKvbdUtNTfMWK
+EObkKvbdRjxeuGjs
+EObkKvbdTqQnuVIN
+EObjjvbdhuZdwRuC
+EOcLKvbdqTtHSSKt
+DncKjvbdmpZxvLZC
+DoDLKvbdlAloNALA
+EPDKjvbdiLddOUby
+EPDLKvbdwuMdpxlO
+DncKjvbdNrsvHEuQ
+EPCkKvbdyOSgxTJD
+EOcLKvbdIryArlxM
+EPDLKvbdZHXEAPSi
+EPCjjvbdSCDdlIxk
+EOcKjvbdySnJNSCH
+DnbjjvbdijGIKNXr
+EPDKjvbdVAaqTRSZ
+EObjjvbdkxsSSxft
+EPCkKvbdnUtzKiqf
+EPCkKvbdlqxuZsEJ
+EObjjvbdEXxMUUUM
+EPCkKvbdLFfIBaQu
+DnbjjvbdrRtkNjaN
+DoCjjvbdNHCpMpUk
+EPDKjvbdZjTIQGaf
+EPCkKvbdHELWJbKK
+DoDKjvbdJbibpjCx
+DnbjjvbdJSyArmYM
+EPCjjvbdfNFwGmJk
+EOcLKvbdYTMBMsnx
+DoDLKvbdyTOJMqbH
+EObjjvbdEPDLLXDE
+DncLKvbdkyTSTZGt
+EObjjvbdGBPRYizm
+DoCkKvbdVviXvDeH
+DncKjvbdsQWOicVf
+DoCkKvbdfHjvSNqH
+DncKjvbdlZTSSxft
+DncKjvbdFVyPolie
+EPCjjvbdRXODblID
+DoCjjvbdlhcsqVSB
+DncLKvbdqYnhGqDx
+EObjjvbdFeiqmiUR
+DnbjjvbdKefHaaQu
+DoDKjvbdRNXbYmtz
+EOcKjvbdNwnuzcmt
+DoDLKvbdXFxytAPT
+EPDLKvbdOTUVfdtp
+DoCjjvbdraelkfkZ
+DncKjvbdXsMAltPY
+DoDKjvbdVUMsfLuj
+EPDLKvbdZisIPfbG
+EPDKjvbddZxpYYqC
+DnbkKvbdzjUopESt
+DnbkKvbdVUMtGMVj
+DncLKvbduCbtwWOo
+EObkKvbdaaVeFpPw
+DncKjvbdKNADzGta
+DncKjvbdeEoSCXCj
+EObjjvbdhancEvqR
+EObkKvbdKCicQibx
+DncLKvbdijGHjMwr
+DoCkKvbdziuPpETU
+DoCjjvbdiBnbeXRR
+DoCkKvbdZQmEiMdq
+EObkKvbdrMyjZMHi
+EOcKjvbddoErkTtS
+DoCkKvbdtkwvaUAw
+EPDLKvbdTlVnaVoJ
+DncKjvbdfHjurOQg
+DoDLKvbdWWiXvEEg
+EPCkKvbdqdEhpNua
+EOcLKvbdYSkaMtPY
+EPCkKvbdxmsHxTIc
+DnbjjvbdJqZdnenF
+EPDKjvbdWexzUAOs
+EOcLKvbdrovPKCuf
+DoDKjvbdkxsSSyGt
+Dnbjjvbdzdynzdyp
+EOcLKvbdHEKvJbJj
+EObjjvbdOStWHEuQ
+DnbjjvbdkyTRsZGt
+DoCkKvbdcJNKKevx
+DoDKjvbdSPtGifDw
+EObkKvbdGdLVibKK
+DnbjjvbdbBVdfPow
+DncKjvbdhtyeXSVC
+EPDLKvbdptTfrSLU
+DncKjvbdjvXODaww
+DncKjvbdqZOgfqDx
+DncLKvbdTJZjRABM
+EOcLKvbdTpqPVUhN
+EOcKjvbdRWmdClID
+DoCjjvbdqquLOLAm
+DoCjjvbdFfJqmiUR
+EOcKjvbddBsMrATm
+EOcKjvbdYzcFrKVy
+EPCjjvbdsZlQSaIO
+EPCkKvbdkHfkeenL
+EOcKjvbdiHJcYuiu
+DoDKjvbdCEPaVilf
+DoCjjvbddBrmSAUN
+EPDLKvbdSPtGifDw
+EOcLKvbdAMhYrvyx
+DncLKvbdTIyjRAAl
+EOcLKvbdZtIhyESn
+DnbjjvbdVUNUFlWK
+EOcKjvbdyXiJaoyk
+EPCkKvbdDncLKvbd
+EOcLKvbdKWVFcdgJ
+EPDKjvbdnQZxvKyC
+DncKjvbdjJehJlxS
+DoDKjvbdRkYfVHKs
+EPDLKvbdirzhsLJz
+EObkKvbdVUMtFkuj
+DnbjjvbdqwPkbiYq
+EPCjjvbdIGfzZYXg
+DoCkKvbdlYsRryGt
+EObjjvbdpfDeUWBI
+EOcKjvbdwtldpxkn
+DoCkKvbdzitopETU
+DoDKjvbdJuuGEEfi
+DnbkKvbdnPzZVkZC
+EOcKjvbdmfeYMnGy
+EPDKjvbdkIGlGGNk
+DncKjvbdezvZEhtX
+EPDKjvbdqqtjmkAm
+EPDLKvbdzRPNIiwA
+DoCkKvbdGKeSbgmV
+EPDLKvbdmJETqVSB
+EPDKjvbdbVCGwkTh
+DoCjjvbdBhkBkIej
+EOcLKvbdbBWFFopX
+DncLKvbdjggLfGOL
+EPCkKvbdzQnmIiwA
+EOcLKvbdhbPDFWpq
+EPDLKvbdkClLQgVH
+EObkKvbdrWpMChyR
+DncKjvbdMfbpNPuL
+DnbjjvbdNsUVfeVQ
+EOcKjvbdaRfDHtFk
+DoDKjvbdRbEFLhyL
+EOcKjvbdmIcsqUqa
+DncKjvbdFVyPpNJe
+DoCjjvbdLAjgMaxR
+EOcLKvbdypoNJKXA
+DncLKvbdEztRFMCi
+DoCkKvbduVmwiqTA
+EObkKvbdUyHsykPO
+DoCkKvbdhzUfLqNf
+EPCjjvbdiUzEvqtb
+EPDKjvbdpfDeTuaI
+EPCkKvbdSwjkmzjx
+DncLKvbdjKFgjMwr
+EOcLKvbdRWnECkhD
+EOcKjvbdZoOJFEyj
+DnbkKvbdvvlAvAvV
+DncKjvbdZLqcsmlN
+DncKjvbdyqOliJwA
+EPCkKvbdKWUedEfi
+DoCkKvbdePEsLTtS
+DnbkKvbdtcDVXVoP
+EPCjjvbdKCjCpicY
+EObkKvbdZdwfzhJC
+EPDLKvbdBhjajiGK
+EOcKjvbdJXsahMRQ
+DoCkKvbdZxdKNcLr
+EPDKjvbdnBjWwoOV
+DncLKvbdapGgDkzd
+EPDKjvbdjmCLzEgP
+EPCkKvbdWRmwbFMD
+DnbjjvbdBdQAujMf
+EObkKvbdzjUpPcsU
+DoDLKvbdwtmFQyMO
+DoCkKvbdiMEcmtby
+DncKjvbdSBcdkiYk
+EPCkKvbdfSBWzkbo
+EOcLKvbdxVMeRZLn
+DnbjjvbdCSaDUGXS
+DncKjvbdZtJIyETO
+EPCkKvbdTkvOaVni
+DnbkKvbdkySqsYft
+EPCjjvbdxsOJMrCH
+EPCjjvbdCWzdJEov
+EPCjjvbdEARiMywX
+EObkKvbdxsNiNSCH
+DncLKvbdhbPDFWqR
+EObkKvbdVUNUFlVj
+EObjjvbdXrlBNToY
+EOcLKvbdfHjvSOQg
+EPCjjvbdwWkaWAuu
+DncKjvbdbKlFnnDA
+EPCkKvbdRkZFuGkT
+EPCjjvbdMowpvNfs
+DncLKvbdmtuZjjSG
+DnbkKvbdiCPDEvqR
+DncLKvbdbAudfPow
+DnbjjvbdFjeSbhMu
+DncKjvbdSQTfjGEX
+EPDKjvbdbAueGQQX
+DnbkKvbdjKGIJmXr
+EOcKjvbdIryBTNYM
+EPDLKvbdmgEwlnGy
+EObjjvbdSBdEkhxk
+DoCjjvbdfMfWgMjL
+EPDLKvbdEObjjwCd
+EObjjvbdhzUekqOG
+EObjjvbdWSNwbElD
+DoDKjvbdrNZjYkhJ
+DoCkKvbdRkYfUgKs
+EObjjvbdczYpYZRC
+DoCkKvbdzoQQeDMY
+DncKjvbdFxuVBEXb
+DoDKjvbdSiZjRABM
+DoDLKvbdYzbfRivZ
+EPDLKvbdlqyUyrdJ
+EOcLKvbdtbbuWvOo
+DncKjvbdSKxfVGkT
+DoCjjvbdEXxLtUTl
+EOcLKvbdEPCjkWbd
+EPDLKvbdEObkLXDE
+EPCkKvbdxKvdHzzG
+EPDKjvbdpfDdtVaI
+DoCjjvbdbAueGPpX
+DoCjjvbdZMRdUOLm
+DoDLKvbdwtmFRYkn
+DoCjjvbdNPwpumgT
+DoCkKvbddijSWUzn
+DoDKjvbdJXsbHkqQ
+DnbjjvbdxZhFexEr
+DoCjjvbdSQUHJedX
+EPDLKvbdjmCMZdgP
+DncLKvbdMfbomPtk
+EOcLKvbdqTtHRqjt
+EPCkKvbdqceIpNvB
+DncLKvbdFxtuBDxC
+EPCkKvbdxVNEpyLn
+EOcKjvbdYzbeqivZ
+DoCjjvbdNdcsiJLE
+DoDKjvbdzjVQQDsU
+EObjjvbdvBDySneI
+DoDKjvbdBhjbKhej
+EPDLKvbdWSOYBdlD
+EOcKjvbdOYOuzcnU
+EPCkKvbdkCkkQgVH
+DnbkKvbdtlXwBTaX
+DnbkKvbdTppoVUgm
+DoCjjvbdQmXaxnUz
+DncKjvbdkHfkfFmk
+EPCjjvbdmgEwlnHZ
+EPDLKvbdZdxGzhJC
+EPCkKvbdmIdTqUqa
+DoDKjvbdzGyMAMeX
+DnbkKvbdTppnuUhN
+DoCjjvbdSLYfUgLT
+DnbkKvbdZsiJZETO
+EObkKvbdNUrqjmAX
+EObjjvbdZyDimcLr
+DoCkKvbdRDbaQRDr
+DnbjjvbdbAudfPow
+EPDKjvbdZjTHpGaf
+DoDKjvbdqwQLcIxq
+DnbjjvbdZLqdTmkm
+DoDKjvbdyXiKCPzL
+EObjjvbdssSTYyeD
+DoCjjvbdddoRawCj
+DoCjjvbdkMbLydfo
+DoCjjvbdVTmUFkvK
+DoCjjvbdhyuFkpmf
+EObkKvbdlYsSSyGt
+EPCjjvbdtvNxKQsA
+DoDKjvbdRpTgKFdX
+EObjjvbdjbkkQgVH
+DnbjjvbdaNLCStlg
+EOcKjvbdDxYLsssl
+DoCjjvbdfNFvgMjL
+DncLKvbdrovPJcWG
+DnbkKvbddoFSjssr
+DnbjjvbdSQTgKGDw
+DoCjjvbdQvnEDLhD
+EOcKjvbdUxhUZkOn
+EPCjjvbdEzsqFMDJ
+DoDKjvbdGdKuiaij
+EOcKjvbdxrnJMrCH
+DnbjjvbdUWMQJtBR
+EObkKvbdEKHivYKA
+EPDLKvbdYSlAltOx
+DnbjjvbdbVCHXjtI
+DnbkKvbdtkwwAtBX
+DoCjjvbdZQleJNEq
+EPDKjvbdEPCjjvcE
+EPCjjvbdCSaDUFwS
+EPDKjvbdHELViajK
+DoDLKvbdijFgjNXr
+DncLKvbdjmCLydfo
+EObkKvbddZyQXxqC
+DnbkKvbdySnImSCH
+EPCjjvbdqmZjYkgi
+EPCjjvbdGFirNiTq
+DoDKjvbdRXNdDMID
+DncLKvbdMfcQNQUk
+EOcLKvbdZdwfzghb
+EPDLKvbdULuoBWOi
+EObjjvbdFyVUaDwb
+DoCjjvbdNQXpumfs
+DnbkKvbdrWolDIxq
+EPCkKvbdBvzdIeQW
+DnbkKvbdfIKuqmpg
+EOcKjvbdnBiwXoNu
+EObjjvbdiHKDZWKV
+EPCjjvbdZLqdTnLm
+DoCjjvbdlYsSTYgU
+EPDLKvbdsBfNMHKy
+DnbkKvbdjuvmdCXw
+EPDLKvbdRDcBQQdS
+EOcKjvbdySmhmRbH
+EPDLKvbdbrbjscia
+EPDLKvbdkxrrTZGt
+DoDKjvbdcJMjLGWx
+EPDKjvbdKeegbBQu
+DnbjjvbdvPTzqKoU
+EOcLKvbdIidAKPgE
+DoDLKvbdVrOYBdkc
+EObjjvbdeFOqawDK
+EOcLKvbdZRNEhmFR
+EObjjvbdKfFgbBRV
+DoCjjvbdiLeEOVCy
+EPCkKvbdqmZjYkgi
+EPDKjvbdHffyxxXg
+EPDKjvbdZLrDsmlN
+DnbjjvbdTkuoBVoJ
+EOcKjvbduDDUvvOo
+DoDKjvbdZdwfzhJC
+EPCkKvbdfMfWgNKL
+EPCjjvbdRXOECkgc
+EOcKjvbdMowpvNfs
+DoDLKvbdiBoCeWpq
+EObkKvbdNwoVzdOU
+EPDLKvbdDoDKjvbd
+EObjjvbdLFehCBRV
+EOcLKvbduCcVWuno
+EOcKjvbdXsMBMtOx
+DnbkKvbdcIljKewY
+DoDLKvbdEzspdkcJ
+DncKjvbdqcdhomua
+EPDKjvbdiifHjNXr
+EObkKvbdVqnXbFLc
+EPCkKvbddwyssrFz
+DncKjvbdrSVKmkAm
+EPCjjvbdTlVoBVni
+EObjjvbdOhAYZAYa
+EPCjjvbdRadEkiZL
+DoCkKvbdSCEEkiYk
+EObjjvbdGZVVAcxC
+DnbjjvbdZyEJnDMS
+EOcKjvbdzitoodSt
+EPDKjvbdXFxzUAPT
+DnbjjvbdziuQQESt
+EPCjjvbdEARhmZvw
+DncLKvbdatbHXkTh
+DncKjvbdbsCjtDjB
+EPCjjvbdKWVGDdgJ
+EPDKjvbdrafNLfkZ
+EObkKvbdFkEsChMu
+DnbkKvbdVgxWXfxz
+EObjjvbdJbjDRJbx
+EObkKvbdwyhFfYFS
+EPCjjvbdMfbpNPtk
+EObkKvbdbsDKtDia
+EPCkKvbdkxsRsZHU
+DnbkKvbdvAdZTOdh
+DncKjvbdptUHRrLU
+DncKjvbdvPTzqKnt
+DncLKvbdTppoUthN
+DnbkKvbdrbFlkgLZ
+EPCjjvbdGdKvJajK
+EPDLKvbdACqxKZiQ
+DoCkKvbdbPffckzd
+DoCkKvbdhbOcEvqR
+DnbjjvbduCcVWvOo
+DoCkKvbdmuUzLKRf
+EPCjjvbdbUbHYLUI
+DoDKjvbdbKkeoNcA
+DoCjjvbdcScKtEJa
+DoCjjvbdyzdnRgiI
+EPCjjvbdkIGlFfOL
+EOcLKvbdzjUpPcsU
+DoDLKvbdJuuGEEgJ
+DncLKvbdTqROtthN
+EOcLKvbdpstGqqkU
+EPCkKvbdtSrTYzEc
+EPDKjvbdezvYdiUX
+DoDKjvbdtTRrxzFD
+DoCjjvbdrovOjDWG
+DoDKjvbdUQpoUthN
+EOcKjvbdKDJbpicY
+DnbjjvbdaSGCgtFk
+DoDKjvbdGZVVAcwb
+DnbjjvbdEvYopNJe
+EObjjvbdSQTgKFdX
+EPDLKvbdrXPkbhyR
+DoDLKvbdhyuGMROG
+DoDKjvbdzoQRFClY
+EPCkKvbdKWUeceHJ
+EObkKvbdZnmiFFZj
+DnbjjvbdtcDUwVoP
+DoCkKvbdjlakyeHP
+EPCkKvbdBvzdIdpW
+EPCjjvbddePRawCj
+DoDKjvbdmfeYNNfy
+DnbkKvbdSLYetgKs
+DncKjvbdFejRnJTq
+EPDLKvbdIGfzZXwg
+DncKjvbdJvVFdFHJ
+EOcLKvbdIHHZyYYH
+EPDLKvbdyXhiaoyk
+DoCjjvbdADSYJzIp
+EObjjvbdNPxQunHT
+EPCkKvbdxnTHwrhc
+DncKjvbdTppnuVHm
+EObkKvbdjlbLydfo
+DoDLKvbdVBBpsRRy
+DnbjjvbdACqwiyhp
+DoCkKvbdZRNFJNEq
+EOcLKvbdaRfDHtFk
+DoCkKvbdKfFgbBQu
+DnbjjvbddCTNSAUN
+EPDLKvbdTfznMXVe
+EOcKjvbdeOeSkUTr
+DnbkKvbdqdEiPnVa
+EOcLKvbdsBemMHLZ
+DoCkKvbdNPxQvOGs
+EPDLKvbdOTTufeUp
+DncKjvbdraelkfjy
+DoDLKvbdZoOIeFZj
+DnbkKvbdptTgRrLU
+DncKjvbdACrXiyhp
+EPDLKvbdIGgZxwxH
+DnbjjvbdZnmiEeZj
+DnbkKvbdWRmxCFLc
+DoDLKvbdyYIiaozL
+EPCjjvbdOTTvGeUp
+EPCkKvbdNUsSKmAX
+EPCjjvbdDigiuwjA
+DoDKjvbdIrxaTMxM
+DoDKjvbdZyDimcLr
+EPCjjvbdjbkkRHVH
+DoCjjvbdWXJYVceH
+EOcLKvbdlZTSSyHU
+DncLKvbdwuNEqYlO
+EPCkKvbdrpWPJbuf
+DncKjvbdtbcUwWPP
+EOcKjvbdGKeScINV
+DncKjvbdZeXfzhJC
+DncKjvbdUQqPVVIN
+DoDKjvbdxsNhmSBg
+DoDKjvbdURROuVHm
+DncKjvbdRMwbYmtz
+DoDKjvbdZRMeImEq
+EOcLKvbdWHwvXgYz
+EPDLKvbdIwsahMQp
+EOcKjvbdfHkVrNqH
+EObjjvbddjKSWUzn
+DncKjvbdxwiJbQZk
+EPCkKvbdMSWlzVQz
+DoDLKvbdUQpnuUhN
+DncLKvbdiCPCdvqR
+DoCjjvbdapHHELzd
+DncKjvbdyOSgwrhc
+DoCkKvbdDxYLtUTl
+EObjjvbdyfyMAMdw
+EObjjvbdHffzYxYH
+DoDKjvbdYzcFrKWZ
+EPDLKvbddZyPwyRC
+EPCkKvbdLhalRYAS
+DoCkKvbdGYtuBEXb
+DoCjjvbdrylQTAgn
+DoCjjvbdbBVeGPpX
+EPDLKvbdYpmFImFR
+DnbkKvbdJcKCpjDY
+DncLKvbdYTLaNUPY
+DnbkKvbdeOeSjtTr
+DoCkKvbdEYYLtTtM
+EPCkKvbdrzLoraIO
+DoCjjvbdKWVGDdfi
+DoDKjvbdBhjbLIfK
+EPCkKvbdNQYQvOGs
+EOcLKvbduLxXBTaX
+EPDKjvbdANHySwZx
+DnbkKvbdeOdsLTtS
+DnbkKvbdUsmTfMWK
+DoDLKvbdcImJkGXY
+DncKjvbdsPunibuf
+DnbjjvbdIGfyxxYH
+DoDLKvbdvBDyTOeI
+EPDLKvbdGKeScHmV
+EOcLKvbdqFceUVaI
+DncLKvbdqdEhpOWB
+DoDLKvbdTulPitAq
+DnbjjvbdWXIwudEg
+EPDLKvbdcTDKtDjB
+DoCjjvbdgFlZnHHA
+DnbkKvbdwuNEqZLn
+EObkKvbdmRxtzSci
+EObjjvbdjvXNdCYX
+DnbkKvbdqGDdsvBI
+DncKjvbdqdEhomvB
+DoCjjvbdrpVoKCvG
+EObkKvbdWHwvYHYz
+EOcKjvbdrykoraHn
+EPCkKvbdsPuoKCuf
+DncKjvbdZjSgofaf
+DncKjvbdNeETiIjd
+DoDLKvbddoFSkTsr
+EPCkKvbdkWWnECXw
+DnbkKvbdZRNFIldq
+EObjjvbdzjVQPdTU
+DnbjjvbdhytelRNf
+EOcKjvbdNPxQunHT
+DoCkKvbdmuVZkJrG
+EPCjjvbdUVlQJtBR
+DoDKjvbdzitpQESt
+DoCjjvbdraemLfkZ
+DoDLKvbdkNBlZeHP
+EObkKvbdrbGNMHLZ
+EPDLKvbdkIHLeemk
+DoDKjvbdbAvEeopX
+DoDKjvbdiGjCxujV
+EPCkKvbdqlzJxkgi
+DncLKvbdVZITzLPO
+EOcLKvbdVZITykOn
+EPCjjvbdjuvnDaww
+DoDKjvbdkVwOECYX
+EObjjvbdcyxpXyRC
+DnbjjvbdULvPAuni
+DnbkKvbdOTUWGdtp
+EOcLKvbdKDJcRKCx
+EPCkKvbdBsBDUFwS
+DncLKvbdQdDAopcr
+EObjjvbdcSbjtEKB
+DnbjjvbdlAloNALA
+DoCjjvbdADSXizJQ
+EOcKjvbdrpWOibvG
+EObjjvbdIGfzZXwg
+EPDKjvbdptUHRrKt
+DncLKvbdZdwfzhIb
+DoCkKvbdQZNAGrrK
+DoDKjvbduCbtvuoP
+EPCjjvbdJuuFceGi
+EPCkKvbdgGLymgHA
+DnbjjvbdcyyPxYpb
+EPCkKvbdhuZeWquC
+EObkKvbdyTNiNRbH
+DoCjjvbdVAaqSprZ
+DncLKvbdoznDkYPA
+EPCkKvbdiUydvquC
+DncLKvbdhytfMROG
+DoCkKvbdmbKXYPNu
+DnbkKvbdMpYQunHT
+EOcLKvbdHkaznXQk
+DoDLKvbdTvMPisaR
+DoCkKvbdIryBTNXl
+DoDLKvbdZLrDsmkm
+DncLKvbdlhctRVRa
+EPCjjvbdYkqcsmkm
+EPCjjvbdEXwlUTtM
+EObkKvbdEvZPoljF
+EPDLKvbdZRNEiNFR
+DoCkKvbdANIZTXZx
+DncKjvbdZoOIeFZj
+DoDLKvbdeJirWUzn
+DoCjjvbdRWmdDLgc
+DoDKjvbdACrYKZhp
+EPDKjvbdMowpunHT
+EOcKjvbdYTLaNTnx
+DnbjjvbdQvnEClHc
+DnbkKvbdSBceLhyL
+DoDKjvbdjgflGGOL
+EOcKjvbdYpldiMdq
+DoCjjvbdrovPKDWG
+DoDKjvbdZisHofbG
+DoDKjvbdEOcLKwDE
+EPCjjvbdhfjDZWJu
+DncKjvbdhfjCyWJu
+EOcLKvbdtSqsYzEc
+DoDLKvbdbQHHELzd
+DoDKjvbdySnImRbH
+EOcLKvbdVqmxCElD
+DnbjjvbdNdcsiJKd
+EPCkKvbdkNBkzEfo
+DnbkKvbdJKEAKPfd
+DncLKvbdiifIJlwr
+DnbjjvbdhtzEvqtb
+EObjjvbdwWlAvBWV
+EPDLKvbdlhctQuSB
+EOcLKvbdNddUIiKd
+EPDKjvbdJSxaTMxM
+EPDLKvbdVrOXaeMD
+DoDLKvbdGcjvKBjK
+DncLKvbdqvpLbiZR
+EPCkKvbdjKFgilxS
+DncLKvbdDoCjjvbd
+DoCjjvbdqqtjnKaN
+EOcKjvbdBvzdJEpW
+DoCkKvbdcarlrATm
+DoDLKvbdQdCaQQdS
+DncKjvbdVqnXadkc
+DoCjjvbdJvUecdgJ
+DnbkKvbdVYhUZkPO
+EPDKjvbdxZgfFxEr
+EPCjjvbdsPunicWG
+DnbkKvbdmSYtyrdJ
+DnbjjvbdTulQJsaR
+DncKjvbdsrrSxyeD
+DnbkKvbdzQnmJJwA
+DncKjvbdatafxLTh
+EOcLKvbdmfeYNNgZ
+EObkKvbdNxOuzcnU
+EPDLKvbdDwwksstM
+EPDLKvbdxnTIYTIc
+EPDKjvbdHgGyyXxH
+EOcKjvbdGAnpyJzm
+DoCkKvbdUQqPVUhN
+DncLKvbdYgWdAOri
+DoDLKvbdygZMANFX
+EPCkKvbdrJAJdlne
+EPDLKvbdZnmheEyj
+DnbjjvbdIxUCHkpp
+DnbkKvbdjJehJlwr
+DoDKjvbdhlEdNuDZ
+EOcKjvbdeOeSkTsr
+EOcLKvbdVqnYBdlD
+DoDKjvbdeATqMwif
+EPCjjvbdrXQLbhyR
+DnbjjvbdFkErbhMu
+DoCjjvbdpxnhHQcx
+EOcLKvbdrWpMDIxq
+EPDKjvbdVhYWYGxz
+DoCkKvbdwzIGFxFS
+DoCjjvbdEztQeLbi
+DnbjjvbdlZTRrxgU
+DncLKvbdSZihSbvA
+DnbjjvbdrzLpTAgn
+EPCjjvbdNrsugFVQ
+DnbjjvbdxUleQxlO
+DncKjvbdtkwwBUAw
+DoCjjvbdbBVdeoow
+EPDKjvbdEObjkXDE
+DnbjjvbdhgJbxvKV
+EPCkKvbdIwtCHlQp
+DoCkKvbdxmsIXrhc
+EObkKvbddePSCXDK
+EOcKjvbdVrOXbEkc
+EOcLKvbdFVyPomJe
+DoDLKvbdREDBPqDr
+DncLKvbdaNLCStmH
+DncLKvbdbAudfQPw
+DoDKjvbdRaceLiZL
+DoCkKvbdJYUCIMRQ
+DnbkKvbdYkrDtOMN
+DnbjjvbdFkFTChNV
+EOcLKvbdZRMeImFR
+EObkKvbdUxgszLOn
+EOcKjvbdFjdsChMu
+EObkKvbdrafNLgLZ
+EPDKjvbdelewGmJk
+EOcKjvbdZMRctNlN
+DoDLKvbdliEUQtqa
+DncKjvbdqUUHSRjt
+EPDKjvbduCbtwVno
+DoCkKvbdaaVeFoow
+EPDLKvbdkClKqGuH
+DoDLKvbdCflFgAzc
+DoDLKvbdTAEhgbPE
+EObkKvbdmtuZjjRf
+EObjjvbdKDKCqJbx
+DncKjvbdrovOjDVf
+DoCkKvbdhtzFWqtb
+DncLKvbdEvYpQNKF
+EOcLKvbdeFPRavcK
+DoDLKvbdhlEcnUby
+DoCkKvbdegjvSOQg
+DncKjvbdhbPCeWpq
+DnbjjvbdsrrTYyeD
+DncLKvbdTlWPAvOi
+EPCjjvbdwzHeexEr
+DncLKvbdmJEUQuRa
+DnbkKvbdkIHLeemk
+EObkKvbdhtyeXSUb
+EOcLKvbdHDkWKCJj
+EOcLKvbdRbDdkhyL
+EObkKvbdRosfifDw
+EPCjjvbdOStVfduQ
+DnbkKvbdiHJbxujV
+DoCjjvbdsPuoJcWG
+EPCkKvbdDxXktTtM
+DoCjjvbdHDjujCJj
+EObjjvbdUWLoisaR
+EPDKjvbdqiAKEmOe
+DoDLKvbdxmsIYShc
+EPCkKvbdCJKbKiGK
+DoDLKvbdRECaQRDr
+EPDLKvbdYqNEiNEq
+DnbkKvbdiMEcnVCy
+DoCkKvbduCbtwVno
+DoDKjvbdHbMZdzAD
+DnbkKvbdemGXGmKL
+DoDLKvbdgQBzwDwh
+DoDKjvbdKQzEoGOF
+DoDKjvbdWSNwaeMD
+EPDKjvbdySmhlqbH
+EObkKvbdDxYLtTtM
+DnbjjvbdFxuVBEXb
+EObjjvbdiBoCdwRR
+EPCjjvbdGQATWgGZ
+EPCkKvbdYpleJNEq
+EOcLKvbdvPTzqKoU
+DnbkKvbdZQmEhldq
+DncKjvbdLBKgMawq
+EPCkKvbdqFceTvAh
+EPCjjvbdkIHMFenL
+DoDKjvbdehLVqnRH
+DoDKjvbdxwhibPyk
+DnbkKvbdkMbMZeHP
+EOcKjvbdsrrSyZeD
+EOcLKvbdMowpunHT
+EObjjvbdJqZdnfOF
+DoCkKvbdezuxdhtX
+DnbjjvbdaaWFFopX
+DoCjjvbdqdFJQOVa
+EPCjjvbdWWhwudFH
+EPDKjvbdhtzFWrUb
+EPCkKvbdWSNwaeMD
+EObkKvbdcIlikFvx
+EPCkKvbdauCGwkTh
+EPCkKvbdbhmJkGWx
+EPDKjvbdRosgJfEX
+DnbkKvbdTvMQJtAq
+DnbkKvbdsBfMlGkZ
+DnbkKvbdVrNxCElD
+DoDLKvbdmpZxukZC
+EObkKvbdhlEcnVCy
+EOcLKvbdwzIFfYFS
+DnbkKvbdZtIhxdSn
+DoDLKvbdjgfkfFmk
+DoDLKvbdqTtHSRkU
+EObjjvbdSCDeLiZL
+DoDKjvbdeATplxJf
+DnbkKvbdIBkzEzAD
+EOcKjvbdFWZQPljF
+DoCjjvbdRbDeMJYk
+EPDLKvbdDoCkKvcE
+DoCkKvbdZjShPfbG
+DnbjjvbdNPxQvOGs
+EPDLKvbdKyQirztf
+DoDLKvbdJutecdfi
+DoCjjvbdTppoUuHm
+EPDLKvbdjEkGuPAO
+DnbkKvbdVTmTekuj
+DnbkKvbdZyEJmcMS
+EOcKjvbdNddThhjd
+DncLKvbdrDdhpNua
+EOcKjvbdBiLBkJGK
+DoCkKvbdrXPkbhxq
+DnbjjvbdZQmEiMdq
+DncLKvbdhzUfMROG
+EPDKjvbduaEYroEh
+DoCjjvbdJYUCHkqQ
+DoCjjvbdwzHfFxEr
+EPCjjvbdLiBkqYAS
+DoDLKvbdxZgfFxEr
+DoCkKvbdraemLgLZ
+DoDLKvbdxxJJaozL
+EPDLKvbdKeehBaRV
+DoCkKvbdPIAYZAZB
+EObjjvbdBvzdIdov
+DoDKjvbdjblKqGuH
+DoDKjvbdlhdURVSB
+EPDKjvbdqvpMDJZR
+DncKjvbdajkeoODA
+EOcKjvbdkySqsZHU
+DnbjjvbdJqZdnfOF
+DncKjvbdZHWdAOsJ
+DoCkKvbdaNLCStlg
+DoDLKvbdVZHszKnn
+DoCjjvbdtvOYJpsA
+DoCjjvbdNPxQvNfs
+DoDLKvbdZLqctOMN
+EObjjvbdvwMAvAvV
+DnbkKvbdEuxpPlie
+DnbkKvbdAMhYsWyx
+DoCkKvbdtumwjQsA
+EPCjjvbdVAaprqRy
+EObkKvbdlZSqsYgU
+EObkKvbdBvzdIdov
+DnbjjvbdyOShYTJD
+EOcLKvbdZshhxdSn
+EPDKjvbdUtMselWK
+DoDLKvbdYqNEiMeR
+DncLKvbddePSBwDK
+DncLKvbdqYnggQcx
+DnbkKvbdqceJQOVa
+DoDLKvbdtSrTZZeD
+EPCjjvbdANHyTWzY
+DoDLKvbdcIlikFvx
+DoDKjvbdxmsHwsIc
+EObkKvbdYzbfRiuy
+EPDKjvbdWHwuwfxz
+EOcLKvbddndsLTsr
+EObkKvbdwXMAuaVu
+EPDLKvbdbVBfwjtI
+EObjjvbdfMfXHMik
+DoCkKvbdOXoVzdOU
+DnbkKvbdnGeXlnHZ
+EPCjjvbdGGJrOJTq
+EPCkKvbdhanbeWqR
+EOcLKvbdLhbLpxAS
+EPDLKvbdbBVdepPw
+EOcKjvbdWSNwadlD
+DoCkKvbdaRfChTek
+EPCkKvbdmbJvxOmu
+DoCkKvbdCSaCsfXS
+EObkKvbdbhljKewY
+DncLKvbddZxowxpb
+DnbjjvbdRDcBQQdS
+DnbjjvbdKDJbqKDY
+EObkKvbdWRmxCFLc
+EPDLKvbdYlSETmkm
+EOcLKvbdMIalRYAS
+DoDKjvbdCEQAuimG
+EPDKjvbdCTAcTewS
+EPCjjvbdrRtkOKaN
+DnbkKvbdtTRryZeD
+DnbjjvbdMgColpVL
+EOcKjvbdrDdhomua
+EPDKjvbdRbDeMJZL
+DnbkKvbdxnSgwrhc
+DoDKjvbdVvhxVdFH
+DncKjvbdLYqJrzuG
+DncLKvbdZsiIyETO
+EPDLKvbdieLHUoAO
+EPDLKvbdNsUVgEuQ
+EPDLKvbdoAKztHcn
+DncKjvbdfNFvgNJk
+DoCkKvbdqYoHgQcx
+DncLKvbddwzUUSFz
+DoCkKvbdIHGzZYXg
+DncLKvbddZxpXxpb
+DnbjjvbdhlFDnUcZ
+EPCjjvbdSKxfUfjs
+DoCkKvbdbAvFGPpX
+EOcLKvbdVhXuwfxz
+EPCkKvbddoEsKtTr
+DncKjvbdhkeEOVDZ
+EObjjvbdNUrqjmAX
+EPDLKvbdUWLojTaR
+DoDLKvbdWIYVwfxz
+DnbkKvbdUtMsekvK
+EOcKjvbdRpUHJecw
+DoDKjvbdCJKbKiFj
+EObjjvbdEuxoomJe
+EPCjjvbdLrWlytpz
+EObjjvbdMgDPlotk
+DncLKvbdNrtWHFVQ
+DoCjjvbdZeYGzgiC
+EPCkKvbdKaKfmCYR
+DoCjjvbdjlakzEfo
+EPDKjvbdpeceTvBI
+DnbkKvbdKDKCqJcY
+DoDKjvbdMowqWNgT
+EPDKjvbdRMxCYmtz
+EObjjvbdrXQLbiYq
+DncLKvbdZnmheFZj
+EOcLKvbdiLeENtcZ
+DncKjvbdzaAPGfal
+EPCkKvbdeATqNYKG
+EObjjvbdSCDdlIyL
+DoCkKvbdVZHtZjnn
+EPCjjvbdZtIhxdTO
+EPDKjvbdTlVoAuoJ
+EObjjvbdZRNFIleR
+DoDLKvbdEPDLKwCd
+DnbjjvbdfRaWzkbo
+EPDLKvbddneSjstS
+EObkKvbduCbtwWOo
+EPCkKvbdmoyyWKyC
+EPCjjvbdehLVrORH
+DoDLKvbduCcUvuno
+EObkKvbddZxowxqC
+EObkKvbdKQydoFme
+EPCkKvbdqqtkOKaN
+DoDKjvbduaEYsOeI
+EObkKvbdePEsLUTr
+DoDLKvbdbsDLTcia
+DncLKvbdDwwlTtUM
+EOcKjvbdOEdUIhkE
+DoDLKvbdtvOXjRTA
+EObkKvbdeFPSCXCj
+EPCkKvbdqlzJxlIJ
+EOcKjvbdUMVoBVni
+EPCkKvbdqqtkNkBN
+DoDLKvbdiVZeWquC
+DncKjvbdZLrDsmlN
+EPCkKvbdzitopESt
+EOcKjvbdnBjXYPOV
+EObkKvbdehKurOQg
+DoCjjvbdmJDsptrB
+DnbkKvbdaNKbTVNH
+DncLKvbdGQASvfey
+EOcLKvbdtbcUwVno
+EOcKjvbdqUUHSSLU
+EOcLKvbdvwLaWBWV
+EPCkKvbdRacdlIxk
+DnbkKvbdxZgfGXeS
+EOcLKvbdVAapsQqy
+EOcLKvbdQvnECkhD
+EPDKjvbdCWzchdpW
+DoCjjvbdpedFUWBI
+EPDKjvbdqvpMCiYq
+EPDLKvbdEPDKjwCd
+DncLKvbdGckWJaij
+EObjjvbdgPazwEXh
+DoCkKvbdUVlPitBR
+DoCjjvbdMSXMzVQz
+DnbkKvbdliEUQuRa
+DoCkKvbdOStVgFUp
+EPCjjvbdUtMtGMVj
+DoCkKvbdKWVFdFHJ
+EPCkKvbdUxhUZkOn
+DnbkKvbdLBKflbYR
+EPCkKvbdFkEsCglu
+DnbkKvbdKCibpjCx
+DnbkKvbdGLEsChNV
+DoCjjvbdLGFhCApu
+DncLKvbdeXzTsqez
+DoCkKvbdxrmhlqbH
+EPDLKvbdYlRdTmlN
+EPCjjvbdqYnhHRDx
+EPDKjvbdWfYzUAOs
+EPCkKvbdMJCLpxAS
+EObkKvbduCbtwVoP
+DoCkKvbdmfdwlmfy
+EPCjjvbdVBBprpqy
+DoDLKvbdEKHivXjA
+DoDLKvbdkWWnECYX
+EOcKjvbdqUUHSRkU
+DncKjvbdYlRcsnLm
+EOcKjvbdelfWfmJk
+EPDLKvbdZtIhxcsO
+EOcLKvbdGKdrcINV
+EPDLKvbdOAIsUKSA
+DoCjjvbdXFxytAOs
+EPCjjvbdUQpntuIN
+EPDLKvbdTvLpJtBR
+EPDKjvbdRyihSbvA
+DnbjjvbdhyuFlROG
+EObkKvbdZxcinClS
+EOcKjvbdptTfqrKt
+DoDLKvbdURRPUtgm
+EObkKvbdaNKbTVNH
+EOcLKvbdiZuFlQmf
+EPDKjvbdePEsLUTr
+EPCjjvbdFxuUaEYC
+EPDLKvbdliETpuRa
+EObjjvbdjKFhKNYS
+DoCkKvbdwzHefXeS
+DoDLKvbdFfJqmiUR
+EObjjvbdcJMjKewY
+EObjjvbdqdFIomua
+DnbkKvbdFejRnJTq
+DnbjjvbdEzsqFMCi
+EPDLKvbdhzUelROG
+EPDKjvbdLKaIWAKZ
+DoCkKvbdGGJrOIsq
+EOcKjvbdVUMtGMWK
+EObkKvbdmpZyVkZC
+DoDLKvbdJTYaSmXl
+EObjjvbdmSZUyrci
+EObkKvbdxnSgwsIc
+EOcLKvbdhgJcYujV
+DoDKjvbdUQpoVVHm
+EPDKjvbdKWVFdEgJ
+DoCkKvbdWXJXudEg
+EObkKvbddxZtURez
+DnbkKvbdZRMeJNEq
+EOcKjvbdpxoIHRDx
+EObkKvbdGGKSOJTq
+EOcKjvbdkIHMFenL
+EPDLKvbdTqQoUtgm
+DnbjjvbdtvNxJpsA
+DnbkKvbdFyUtaDxC
+DnbkKvbdSLYeuHKs
+DncLKvbdxrmhlrBg
+DncLKvbdGdLWJajK
+EPCkKvbdSPtHJfEX
+EPCkKvbdeKJrVtzn
+DoCjjvbdWRnXadlD
+DncKjvbdhkdcmtby
+DoDLKvbdVviYWEFH
+EOcKjvbdTAFJICPE
+EPCjjvbdCJKbLIej
+DoDLKvbdyYJJaoyk
+EPDKjvbdNsUVgFUp
+EPCjjvbdrDdhomua
+DoDKjvbdySnJNRag
+EPCjjvbdyNrgxShc
+DnbjjvbdADRxKZhp
+DnbkKvbdaMkCStmH
+EPDKjvbdfIKvRnRH
+DnbkKvbdoAKztIEO
+DnbjjvbdDjHjVwjA
+EObkKvbdjuwODbYX
+DoDLKvbdbhmKKfWx
+EPDLKvbdKaLGlaxR
+DoDLKvbdwzIGFxFS
+EPCkKvbdGBOpxizm
+EPDKjvbdRXODcMHc
+EOcLKvbdYqNFJMdq
+EOcKjvbdxUleQxkn
+EPDKjvbdZirgpHCG
+DncLKvbderAvzkbo
+EPCkKvbdTvMPisaR
+EPCkKvbdZtJIxdTO
+EOcKjvbddePRavcK
+DncLKvbdCDpAuimG
+EPDLKvbdQdCaPqES
+EObjjvbdZyEJmbkr
+DoDLKvbdOEcsiIkE
+EOcKjvbdrbFlkgLZ
+EOcKjvbdRacdlJZL
+EPCkKvbdKDKCqKCx
+EPDKjvbdrDeIonVa
+DncKjvbdOFEThhjd
+DncLKvbdLAkHMbXq
+EObkKvbdhytekpnG
+DncLKvbdrSUkOLAm
+DncLKvbdiCOcFWpq
+DoCjjvbdrylPsAhO
+EOcKjvbdxVNEpyLn
+DnbkKvbdmbJvwnnV
+DnbkKvbdVAbQsQrZ
+EPCkKvbdCTBCtGXS
+DncKjvbdTAEiHbPE
+EObjjvbdFeiqnJTq
+EPDLKvbdDxYMTtTl
+DncLKvbdHDkVibKK
+DnbkKvbddePSBvcK
+DoCjjvbdauCGwkTh
+EPDLKvbdWIYWYGxz
+DoDLKvbdjcLjqHVH
+DoDLKvbdTfznMXWF
+DnbkKvbdkVwNcaww
+EObjjvbdlYrrSxgU
+DncKjvbdaNLCTUmH
+EOcKjvbdznoqEblY
+DncLKvbdjuwOEBww
+DncKjvbdGQATXHGZ
+EOcKjvbdiZuFkpmf
+EPCjjvbdajlGOnDA
+EPDKjvbdJcJbpjCx
+DncKjvbdauBgXjtI
+EPCkKvbdsZkpTAhO
+EPCkKvbdOEdUIhjd
+EOcKjvbdNsUWGduQ
+DnbkKvbdVTltFlVj
+EObjjvbdaNKasVNH
+DnbjjvbdhancEvpq
+EPDLKvbdZtIiZETO
+DoDKjvbdFxuUaEYC
+DoDLKvbdLGGHbAqV
+DoDKjvbdqceIpOWB
+DoDKjvbdvBEZTPEh
+DoDKjvbdKefHbBQu
+EPDLKvbdlZTSSyHU
+DncKjvbdnPyyWKyC
+EObjjvbdsZkpTBHn
+DoCjjvbdaaVdepPw
+EPDKjvbdtkwvaUAw
+EObjjvbdEPCkKvbd
+EPCjjvbdtkwvaUBX
+DncKjvbdRbDeMIyL
+EOcKjvbdxwhjBoyk
+DoDLKvbdFxuVAcxC
+DnbkKvbdxZgfFxFS
+EOcKjvbdjhGkefNk
+EOcKjvbdEPDKkWcE
+EPDLKvbdQvnEDMID
+EOcLKvbdqquKmjaN
+DoCkKvbdZtJJZESn
+EPDLKvbdTkvOaWPJ
+DnbjjvbdcSbkUEJa
+EObjjvbdQlxBxmtz
+EOcLKvbdehKuqmpg
+EObjjvbdpyOggQcx
+DncLKvbdnVVZjjSG
+EPCjjvbdyqOmIiwA
+EPDLKvbddZxpXyRC
+EObkKvbdRXODcMID
+EOcKjvbdnHFXlmfy
+EPDKjvbdznpQdcLx
+EOcLKvbdqGDdtWBI
+EPCjjvbdZoNhddzK
+EOcKjvbdqTsgSSLU
+EOcLKvbdRzJhTCvA
+EOcKjvbdCIjbLIfK
+DncKjvbdKQzEoGNe
+EOcKjvbdACrXizJQ
+EObjjvbdEzspdkcJ
+EObkKvbdsZlQTAhO
+EPDKjvbdfoazwEYI
+DoDLKvbdjAQGaQGj
+DoDLKvbdEzsqFMCi
+EPDKjvbdyYJJapZk
+DnbkKvbdIxUBglRQ
+DoCjjvbdtTRsYyeD
+EPDKjvbdGKdsDIMu
+EOcLKvbdFyVVAcxC
+DnbkKvbdZLrDtNkm
+EPDLKvbdsrqrxydc
+EPDKjvbdrpVnjCvG
+DoDLKvbdmSYtzTEJ
+EPDKjvbdajkfOmcA
+EPDLKvbdssSSxzEc
+EObjjvbdDxYMTssl
+DnbkKvbdiMFEOVDZ
+EOcLKvbdULvOaVni
+EPDLKvbdlqyUzSdJ
+EObjjvbdZoNheFZj
+DncKjvbdcScLTdKB
+EObkKvbdGLFTDINV
+DncKjvbdcyyQYZRC
+EOcKjvbdYqMeIldq
+DoCkKvbdOEcshhkE
+EObkKvbdirzhrjiz
+EOcLKvbdxUmFRYlO
+DoDKjvbdkyTRsZGt
+DncKjvbdIryAsNYM
+EObkKvbduWNxJpsA
+DncKjvbdYkqcsnLm
+DoDLKvbddZxpXyQb
+DncKjvbdRotGiedX
+DnbkKvbdKVtedEgJ
+EOcKjvbdjvWnEBww
+EObkKvbdFyVVAdXb
+DoCkKvbdYlSEUNkm
+EOcKjvbdcTDLTcia
+EPCkKvbdzjUpQESt
+DnbkKvbdqUTfqrLU
+EPDKjvbdSQUHJfEX
+DnbjjvbdiGjDYvKV
+EObkKvbdhkdcnVCy
+EPCjjvbdJuuFdFHJ
+EObjjvbdYkqdTnMN
+DoCkKvbdpssgSRkU
+EObkKvbdUWLpKUBR
+DoDKjvbdZsiJZESn
+DnbkKvbdYqMdhmEq
+DoCkKvbdjcLkRHVH
+DnbkKvbdSPsgKGDw
+DoDLKvbdKVtfEEfi
+EPCjjvbdiGibyWKV
+EPCjjvbdEYYLtUTl
+EPCjjvbdFejSOIsq
+DncLKvbdRECaQRES
+EPCkKvbdEuyQQNKF
+EObkKvbdxwhjCPzL
+DncLKvbdiLeDnUby
+EOcKjvbdEuxpQMie
+EOcKjvbdIidAJogE
+DoDKjvbdxsNhlqag
+EOcKjvbdEzsqFLcJ
+EObjjvbdYTMAmToY
+DoDLKvbdwuNFQyLn
+DoCkKvbdzitpQDrt
+EOcLKvbdZtJIxdSn
+DncLKvbdqZPHgRDx
+EPDLKvbdMoxQvNfs
+DncKjvbdmIctQuSB
+DoCkKvbdFfKSNiUR
+EPDLKvbdhtydvqtb
+EObjjvbdxrnJNRag
+DnbjjvbddoFTKssr
+EPDKjvbdqlyjZLgi
+DnbkKvbdyNsHwsJD
+EOcLKvbdxnTHwsJD
+EObjjvbdUQqOtuIN
+DnbkKvbdwtleQyMO
+DoDLKvbdrovPKDVf
+EOcLKvbdFaPQxizm
+EObjjvbdVAapsQqy
+EOcKjvbdJvVFdFGi
+DnbkKvbduDDVXVno
+EObkKvbdZjTHpGbG
+EObjjvbdZirgofaf
+DncKjvbdAMgySvzY
+DoDKjvbdGdLVibKK
+DoDKjvbdWRmwbEkc
+DncKjvbdXsMAlsnx
+DoDLKvbdtcCuXVoP
+DoDLKvbdqlyjYlIJ
+EPCjjvbdHELVjCKK
+DncLKvbdBdQAuilf
+DoCjjvbdeFOrCXDK
+DoCjjvbdRpTgJfDw
+DoCkKvbdLAkHMbXq
+EOcLKvbdaRebhUGL
+DncLKvbdnQZyWLYb
+EObjjvbdXsMBNUOx
+DncKjvbdrSVKnKaN
+EPCjjvbdAMhZSwZx
+EOcLKvbdcScKtEKB
+DncKjvbdKaLGlaxR
+EOcKjvbdZRMeJNFR
+EPCkKvbdwygeewdr
+DnbkKvbdhancFXRR
+EOcKjvbdOTUVfdtp
+EPDLKvbdmbKXYOnV
+DoDKjvbdGLFSbhNV
+EPDLKvbdMfbomPtk
+DnbkKvbdmIcsqVRa
+DoDKjvbdwtmFRZLn
+DoCkKvbddtAUATMv
+DncKjvbdiBoDEvqR
+EObkKvbdiHJcYujV
+DnbjjvbdiCPDFWqR
+EOcKjvbdyTNhlrCH
+DoDKjvbdNQYRVmfs
+EOcLKvbdFjdrbhMu
+DoCjjvbdsrrSyZeD
+EPCkKvbdXsMBMsoY
+DoDKjvbdjhHLfFmk
+EPCkKvbdyOTIYTIc
+EOcLKvbdbhmKLGWx
+DnbjjvbdxnTHwsIc
+EOcLKvbdZoOJEeZj
+EOcKjvbdjmBkzEfo
+EPDKjvbdYORAXuWU
+EPDKjvbdtkxXAsaX
+DoDLKvbduaEYsPFI
+EPCjjvbdypoNIiwA
+DoDKjvbdVBCRTQrZ
+DnbjjvbdlrYtyrdJ
+DoCjjvbdhzUekpnG
+EOcKjvbdcTCjsdJa
+EObkKvbdbhlijfWx
+EOcLKvbdYTLaMsoY
+DnbjjvbdKVtedFGi
+EOcLKvbdsPvPJbuf
+DncLKvbdNrsvHEuQ
+EObkKvbdmfeYMmfy
+EPCjjvbdZjTHpHCG
+DoDLKvbdpyOhGqDx
+DoDKjvbdRkZGVGjs
+DnbjjvbdRWnEDMHc
+EPCkKvbdjlbMZdfo
+DoCkKvbdyqOmIiwA
+DoCkKvbddxZstSFz
+DnbjjvbdKCibqJbx
+DoCjjvbdqqtjnLBN
+DnbjjvbdBhjbLJGK
+DoDLKvbdrWokbhxq
+EOcLKvbdJzpGXdAN
+EPDKjvbdRMxCZNtz
+DncKjvbdkClLRGuH
+DncLKvbdIHHZxxXg
+EPDKjvbdZshiYdSn
+EPCkKvbdqcdhomvB
+DoDKjvbdVTmUFkvK
+EObkKvbdZisHogBf
+DoCjjvbdRbDdkiYk
+DnbkKvbdGGJrOJTq
+DncLKvbdeFPRavcK
+DnbjjvbdSPtHKGDw
+DoDLKvbdJmADyfuB
+EPCjjvbdKCibpicY
+DoDLKvbdiGicZVjV
+DoCkKvbdZLqdUNkm
+EPDKjvbdVUNUFkvK
+EPCjjvbdemFvflik
+EPCkKvbdkxrqrxft
+DnbkKvbdRbEElIxk
+EPCjjvbdaaVdfQQX
+DoDLKvbdySmhlqag
+EPCjjvbdrRuKnKaN
+DncLKvbdezuyEhtX
+DnbkKvbdtbbuWuoP
+DnbkKvbdZtIhxcrn
+EObkKvbdcyxoxZQb
+EOcKjvbdDxYLtTtM
+EObjjvbdjggMFfOL
+EPCkKvbdGckWJbKK
+DnbjjvbdddnqavcK
+EPDKjvbdYgWdAPTJ
+DnbjjvbdbhlikGXY
+DncKjvbdNPxRVmgT
+EObkKvbdRpUHKGDw
+EObkKvbdmfdwlmgZ
+DoDLKvbdBvzdJFPv
+DnbjjvbdZHXEAPSi
+EPDKjvbdbQHGdLzd
+EOcKjvbdCIjbLIej
+DnbjjvbdOXnuzdNt
+EObkKvbdrSUkNkBN
+DoDLKvbdNeDsiJLE
+EPCkKvbdiUyeXRtb
+EObkKvbdbsDKsdJa
+DncLKvbdbrcLTdJa
+DncLKvbdSPsgJecw
+EObjjvbdKNADzGta
+EPDLKvbdFWZPomKF
+EPCjjvbdRzKISbvA
+EOcKjvbdvmWAMcdm
+DncKjvbdwyhGGYEr
+EPDLKvbdfHjuqnRH
+EPCjjvbdRXOEDLhD
+EPCkKvbdyOSgwsJD
+DoDLKvbdnCKXYOmu
+DnbjjvbdjmCLyeGo
+DnbjjvbdTYKlNzjx
+DoCjjvbdZisHpGbG
+EObjjvbdUWMPisaR
+EObjjvbdqFcdtWAh
+EOcLKvbdYqNEhleR
+DnbjjvbdlZSrSyGt
+EPDLKvbdePEsLTsr
+DncKjvbdSBcdlJYk
+EPDKjvbdePEsLTsr
+EPDKjvbdypnmIjXA
+DnbjjvbdsQWPKCuf
+EOcKjvbdZRNEhldq
+EPCjjvbdYpmFImEq
+EPCkKvbdKfFhBaRV
+DncLKvbdezvZEhtX
+DncKjvbdiCObdvpq
+DnbjjvbdmJETqUrB
+EOcLKvbdfpBzvcxI
+DncKjvbdRbDdkhxk
+EPCkKvbdmpZyVkZC
+EPDLKvbdyNsIXrhc
+DnbkKvbdyYJJaoyk
+DncKjvbdwWlBVaWV
+DoDKjvbdqwPlCiYq
+DncLKvbdvvkaVaWV
+DncKjvbdcJMjKewY
+EObkKvbdbBWFFpPw
+EPCjjvbdpyOhGqEY
+EPDKjvbdCDpAujNG
+EPDLKvbdCSaCtFvr
+DoCjjvbdwygfFxEr
+EOcLKvbdLFehBaQu
+EPCjjvbdssSSxydc
+EPCjjvbdHfgZyYYH
+DnbkKvbdnBjWxOmu
+DnbkKvbdcJNJjewY
+EObjjvbdrzLoraIO
+EOcKjvbdADRwjZiQ
+EPCkKvbdOAJStJrA
+DncLKvbdajkennDA
+DoCjjvbdmbKWxPNu
+EObkKvbdmbKXYPOV
+DoCkKvbdKCjCpjDY
+EPCkKvbdIjEAJogE
+DoCkKvbdkHgLfGOL
+DoCkKvbdJcJbqKCx
+EPCkKvbdVUMtGMWK
+DoDKjvbdNxOuzcmt
+EPDLKvbdNQYRVnGs
+DnbkKvbdzjUoocrt
+DoDKjvbdDnbjjvcE
+DoCkKvbdGBPRZJzm
+DoCjjvbdtvNwjRTA
+EPDLKvbdZQldhleR
+DoDLKvbdUtMsfMWK
+DnbkKvbdDxYLtTsl
+DoCjjvbdmbJwYPOV
+DoCjjvbdaNLCTVMg
+DoCjjvbdWXIwvEFH
+DoDKjvbddZxoxYpb
+DncLKvbdijGHimXr
+EPDKjvbdZQmEiMdq
+DncKjvbdTulPisaR
+DncLKvbdnGdxMnGy
+EPCkKvbdlYsSSyHU
+DoDKjvbdKRZePFme
+DoCkKvbdZRNFJNEq
+DncLKvbdkMbMZeGo
+DoCkKvbdBiLBkIej
+EObjjvbdWXIwvEFH
+EOcLKvbdGGJqnJTq
+DoDLKvbdRWmcblID
+EObjjvbdxUleQxlO
+DnbkKvbdREDBPpdS
+DnbjjvbdiifHjMwr
+EObjjvbdZLqctOMN
+EPCjjvbdmRxtyrci
+DoDLKvbdDxXlTtUM
+DoDKjvbdxrmiNSBg
+DoDKjvbdTppntthN
+EObjjvbdnUtykKRf
+DoCkKvbdRNYBxmtz
+EOcLKvbdQYmAHTSK
+EPCjjvbdZtIhxcsO
+DoCjjvbdbsCjsdJa
+EPDKjvbdsZkoraIO
+DoDKjvbdEJhJvYKA
+EOcLKvbdJSxaTMwl
+DoDLKvbdANHxrvzY
+EObkKvbdcTDKtDia
+EPDKjvbdrWolDJZR
+DoDKjvbdsQVnicVf
+EPCjjvbdYSlAlsoY
+EPCkKvbdJYUBhMRQ
+DncLKvbdtlXwBUBX
+EObjjvbdVrOYBeMD
+EPCjjvbdcJNJkGWx
+DncLKvbdjKGHjNXr
+DncKjvbdRMwayOUz
+EObjjvbdzdzOzdyp
+DnbjjvbdNHColpVL
+DoDLKvbdNddThiLE
+EPDKjvbdFjdsCgmV
+DnbjjvbdTJZjRABM
+DncKjvbdOTTugFVQ
+DncLKvbdVYgszLPO
+DncKjvbdEARhlzWw
+EPDLKvbdUGzmkvvF
+DoDLKvbdmRyVZsEJ
+EObjjvbdptUHRqjt
+EOcKjvbdJpzFOeme
+DnbkKvbdMgDPmPtk
+EOcKjvbdhzUfMRNf
+DoDLKvbdpyPHgQdY
+DoCjjvbdZjShQHCG
+EOcKjvbdOTTvGeVQ
+EPCjjvbdRacdkiZL
+DnbjjvbdzitoodTU
+EOcKjvbdxxIjCPyk
+EObjjvbdunszqLPU
+EObjjvbdwjwDgzzG
+DnbkKvbdUyHtZkOn
+DnbjjvbdqvpMChyR
+DnbjjvbdmIctRUrB
+EObkKvbdNHCpMpUk
+DoDKjvbdeFPSCXCj
+EOcKjvbdtvOXjRTA
+DncLKvbdZGvdAPSi
+DoCjjvbdQcbaPpcr
+DoDLKvbdVUMselVj
+DnbjjvbdVgxWXgYz
+DoDLKvbdjAQHBQHK
+EOcKjvbdxxJKCPyk
+DnbkKvbdQdDApQcr
+DnbjjvbdqrUjmjaN
+EOcKjvbdJzofYEAN
+DoDLKvbdJvVGEFHJ
+EObkKvbdJcJbpjDY
+EPDLKvbdhanbdwRR
+EObkKvbdiZtfLqOG
+DoCjjvbdeOdsLTsr
+DoCjjvbdSLZFuGjs
+DoCjjvbdqTsfrRjt
+EObjjvbdACqxKZhp
+EPCjjvbdxZhFexEr
+EPDKjvbdiBoCeXRR
+DoDKjvbdqFcdtVaI
+DnbkKvbdkClLQgVH
+DnbkKvbdZQmEhldq
+DnbjjvbdQYmAGrqj
+DnbjjvbdiLddNuDZ
+DoDLKvbdsQWOjDWG
+EPDKjvbdVqnXaeLc
+DnbjjvbdwNWANEFN
+EPCkKvbdsBfNMHKy
+EOcLKvbdKQzFOfOF
+DoDKjvbdHELVibJj
+EPDKjvbdcImJkFwY
+DncKjvbdIwtBgkqQ
+EObkKvbdANHySvyx
+DoDLKvbdpxnhGqEY
+EPCjjvbdrafNMHKy
+DoDLKvbdSQTfiecw
+DnbkKvbdiMEdOUcZ
+EObjjvbdQmYCYnUz
+EPDLKvbdWIYWXfxz
+EPCjjvbdNeEThiLE
+EObjjvbdHDkWJaij
+DncKjvbdMgDQNPuL
+DncKjvbdKWUedFGi
+EPDLKvbdJYUCIMRQ
+EOcLKvbdRacdkhyL
+EPCkKvbdSBdEkhyL
+EPCkKvbdMRwMzUpz
+EPDLKvbdkxrqsYft
+EObkKvbdRkYetgLT
+EPCkKvbdNrsvHFVQ
+DoCjjvbdqiAKFNOe
+DoDKjvbddwystRez
+EOcKjvbdrylQTBHn
+EPDKjvbdDjHjWXjA
+EObjjvbdCIkCLJGK
+DnbjjvbdqwPlDJYq
+EPCjjvbdnVUzLKRf
+EOcLKvbdUxhUZjnn
+DnbjjvbdRpUHJecw
+DnbjjvbdjhGlFfNk
+EObkKvbdJKEAKPgE
+DoDLKvbdIidAKPgE
+DncKjvbdCSaCtGXS
+DoCjjvbdIidAKQHE
+DnbkKvbdFjdsCgmV
+DoCkKvbdGKeTCglu
+EOcKjvbdEzspeMDJ
+EOcLKvbdqUTgSSKt
+DoCkKvbdnBivwnmu
+DncLKvbdJcJcRKCx
+EPCjjvbdVwJXucdg
+DnbjjvbdKVuGEFHJ
+DncLKvbdnVUzKjSG
+DoCkKvbdqGDeTuaI
+DnbkKvbdLFfICBQu
+DnbkKvbdZjTIQGbG
+DoDLKvbddBrlrATm
+DncKjvbdYNqAXtut
+DnbjjvbdURROtuHm
+EObjjvbdxmrgxSiD
+DoCkKvbdjJfHjMwr
+DncLKvbdNwoVzdOU
+EPDLKvbdyTNhlqbH
+EObkKvbdiMEcnUby
+DoDKjvbdJcKCqJbx
+EPDLKvbdNrtVgEtp
+DncKjvbdjEkGtoAO
+DoDKjvbdNVSrKmAX
+EOcLKvbdxmsIYTIc
+EObkKvbdcTDKtDjB
+EPDLKvbdxsOIlrCH
+DnbkKvbdbrbjsdKB
+DoCjjvbdpfEEtWAh
+DoCkKvbdMowqVmfs
+EPCkKvbdeATqMxJf
+EObkKvbdjJehJmYS
+EPDKjvbdxmrhYSiD
+EObjjvbdjbkkQgUg
+DoCjjvbdYlRdUNlN
+DoDLKvbdiHKDZWJu
+DoDKjvbdpedEsvAh
+DoCkKvbdEuyPomJe
+EPCkKvbdhtyeWrVC
+DncLKvbdbAvEfQQX
+DnbjjvbdTkvPBWPJ
+DncKjvbdYlRdUOLm
+DncLKvbdCIjajiGK
+EPDKjvbdUtNTfLuj
+DnbkKvbdKVuFdEgJ
+DoDKjvbdfVzwoizs
+EPCjjvbdySmiMrBg
+EPCkKvbdrpWPJcVf
+DoDKjvbdcImJjewY
+DoCkKvbdkVvnECYX
+DncKjvbdWRnYCEkc
+DoDKjvbdCIkBjhfK
+EObkKvbdmIdURVSB
+DoCkKvbdTppoUuHm
+EPDLKvbdUQqOtuHm
+DnbkKvbdhgKDYvJu
+DnbkKvbdkHgLfFmk
+EPDLKvbdCDoaVjMf
+EPCkKvbdehKvSNqH
+DncKjvbdNeEUJJLE
+DncKjvbdlhdTqVSB
+EOcKjvbdEuxpPmJe
+DncLKvbdqceIpNua
+DnbjjvbdnVVZjjRf
+DnbkKvbdKDJcRJbx
+EObkKvbdnHEwlmgZ
+EOcLKvbdFWZQQMjF
+DoDKjvbdKWUedEgJ
+DoDLKvbdmozZVkZC
+DoCkKvbdZdxGzhJC
+EObkKvbdGQATWffZ
+EPCkKvbdJuuGDeHJ
+DoCkKvbdiGibxvJu
+DnbkKvbdBraDUGXS
+EPDLKvbdiHKDYvKV
+DnbjjvbdZxcjODMS
+DnbkKvbdnGdwlmgZ
+DoDKjvbdkxsRrxgU
+EOcKjvbdrzMQTAgn
+DncLKvbdjhHLfGOL
+DnbjjvbdQvnEClID
+DoDKjvbdqdEhomvB
+DoDLKvbdGdKvKCJj
+DnbjjvbdqvpLbiYq
+EObjjvbdsPvOjCuf
+DoDLKvbdVqnXbElD
+EPDLKvbdeEoRbXCj
+DoCkKvbdyYJKBoyk
+DoDLKvbdlhdURUqa
+EPDLKvbdYkqdTnMN
+DoCkKvbdnGdwmNgZ
+EObkKvbdGGKSOIsq
+EObjjvbdLLAgvAJy
+DnbjjvbdajlFnmcA
+DoDLKvbdiifHimYS
+EPCjjvbdnPzYukYb
+EPDLKvbdVYhTyjnn
+EOcLKvbdfNFwHNJk
+DoCjjvbdbrbkTcia
+DncLKvbdRkZGVHLT
+EObkKvbdSQUHKFdX
+EOcKjvbdSKxeuHKs
+DncKjvbdFxuUaDwb
+DoCkKvbdaSGDHtFk
+EPDKjvbdZyDimcLr
+EObjjvbdiGibxvJu
+EPCkKvbdDwwktTsl
+EPDKjvbdRadEkiZL
+EPDKjvbdmgEwlmfy
+DncLKvbdaogHDkzd
+EOcLKvbdjuvmdCXw
+EPDKjvbdqwPlCiYq
+DoDKjvbdLBLHNBxR
+EObjjvbdeFOrBvbj
+EPDKjvbdFyVVAdYC
+EPDLKvbdKNADygUa
+DncKjvbdbVCGxLUI
+DoCkKvbdJSyArmXl
+EObkKvbdQvnDbkgc
+EObjjvbdrEEiQOWB
+EOcKjvbdZMSDtOLm
+DoDKjvbdQvmccLhD
+EPCkKvbdrzMQTBHn
+EPDKjvbdMgCpNQUk
+DoDKjvbdmbJwYPOV
+EOcKjvbdgGLymgHA
+EObjjvbdsrqsYzFD
+EPDLKvbdrNZiyLgi
+DnbkKvbdiiegimYS
+DoDKjvbdqwQLcJYq
+EObkKvbdaNLCSuNH
+EPCkKvbdnUuZkJqf
+EPCjjvbdSCEEkiZL
+DncLKvbdVZHszKnn
+DnbjjvbdUtMsfLuj
+DoDKjvbdxmrgwriD
+DoCkKvbdxxJKBpZk
+EObkKvbdZMRdUNlN
+EObkKvbdbPgHDkzd
+EObkKvbdqqtjnLAm
+EPDKjvbdURROuUhN
+DoDKjvbdCWzdJFPv
+DoDLKvbdMSXMytpz
+DnbjjvbdqlyjZMHi
+DoDKjvbdbsDLUDia
+EOcLKvbduVnXiqTA
+DoCjjvbdDxYLsssl
+DoDLKvbdyqPMiJwA
+EObkKvbdeOdsLUUS
+EOcKjvbdEuyQQMjF
+DoDKjvbdEztQeMDJ
+EPCkKvbdGZVVBDxC
+DnbkKvbdnGdxNNgZ
+DoCkKvbdcIljLFvx
+DoCjjvbdYqMdhmEq
+EPDLKvbdgKfzbfAE
+EPCjjvbdJcKDRJcY
+EOcKjvbdOFDtJJLE
+DncKjvbdiLdcmuDZ
+EObkKvbdrWpLcJZR
+DnbkKvbdVAaqTQrZ
+DnbjjvbdFkFTChMu
+DncKjvbdaaWEepQX
+EPCkKvbdpedEsvAh
+DncKjvbdjAQGaPfj
+DoDKjvbdbUbHXkTh
+DoDKjvbdRjyFtfkT
+EOcLKvbdOTTvHEtp
+DoCjjvbdRkYfVGjs
+DncLKvbdzoQRFCkx
+DncKjvbdrMzJyMHi
+EOcKjvbdULvPBWOi
+EOcLKvbdzdynzdzQ
+EPCjjvbdtumxJpsA
+DoDLKvbdwMvAMcdm
+EOcLKvbdqceIonVa
+EObjjvbdOEdUIiKd
+EObjjvbdHELVjBij
+EObjjvbdqcdiPmvB
+DoCjjvbdJvVFdFGi
+EPDKjvbdWRmwaeLc
+EPDKjvbdZxdJnDMS
+DoDKjvbdZxdJnDMS
+EObjjvbdxUldpxkn
+DnbkKvbdSLYetfjs
+EPDLKvbdYqMeIldq
+DoCjjvbdrMyjYlIJ
+EObkKvbddxZtTqez
+EPCkKvbdWSNxCElD
+DoDKjvbdWWiYVcdg
+DoDLKvbdqGDdsvAh
+EOcLKvbdhzVFlRNf
+EOcKjvbdaNLCSuNH
+DnbkKvbdkHgMFfNk
+DnbkKvbddePRbXDK
+DncKjvbdNVTSKmAX
+EObkKvbdhzUfLpmf
+EOcKjvbdZMSDtNkm
+EPDKjvbdTqROtuHm
+DoCkKvbdddnqbXCj
+DoDKjvbdliEURVSB
+DncKjvbdtvNxKQsA
+DnbjjvbdqceJQOVa
+EPDKjvbdpyOggQcx
+EOcKjvbdtcDUvuoP
+EObjjvbdrWpMChxq
+EPDKjvbdGYttaEYC
+EObjjvbdiifIKNYS
+DoCjjvbdZyEJmcMS
+EPDLKvbdKQzFOfNe
+DoCkKvbdqYoIGpdY
+EPDLKvbdxwhibPzL
+EPDKjvbdRadElJYk
+DoDLKvbdtkwwAtAw
+EPCjjvbdDjHjVxKA
+EPDKjvbdrzLosBIO
+EPCkKvbdBdPaVimG
+DoCjjvbdrafMkfjy
+EPDKjvbdNGcPmQVL
+DoDLKvbdVviYVdFH
+EPCjjvbdkVwODaxX
+DncKjvbdkMbMZeGo
+EOcLKvbdfkGzbfAE
+DnbkKvbdpyOhHQdY
+DoDKjvbdQdCaPqES
+EObjjvbdEKHiuxKA
+DnbjjvbdpxnhGpcx
+DnbkKvbdkxsSSxgU
+DnbjjvbdURQnuUgm
+DoDLKvbdTukpJtBR
+EPCkKvbdqAiFAWgd
+DnbjjvbdgGLymfgA
+EOcLKvbdyYIibQZk
+DoDLKvbdWHxVxGxz
+EPDLKvbdFyVVAdXb
+DnbkKvbdrRuKnKaN
+DoDLKvbdTpqOttgm
+EPDKjvbdLhbLqYAS
+DoCjjvbdHELVjCKK
+DncLKvbdfSBWzlDP
+DoCkKvbdRDcBPpdS
+DoDLKvbdsQWPJcVf
+EPCkKvbdySmiMrCH
+EPCkKvbdbUbHXjtI
+DoDLKvbdUtMsfLuj
+EPCjjvbdEvZQPmKF
+EObjjvbddeOqbXDK
+EPDKjvbdkClKqGtg
+DncKjvbdqiAJdmPF
+EOcLKvbdlrZUyrci
+EOcKjvbdbBVeFpPw
+EOcLKvbdULvPBWOi
+EPCkKvbdcJMjLFwY
+DnbjjvbdZtIhxcsO
+EPDLKvbdSPtHJfDw
+EObkKvbdaNLBsUlg
+DoDLKvbdqvpLcIxq
+DoCkKvbdpxoIHQcx
+EPCkKvbdlZTRsZGt
+DoCjjvbderBWzkcP
+EPDLKvbdZtJIxdSn
+EOcLKvbdmoyyWKxb
+DoDLKvbduaDxroEh
+EPDLKvbddoErkTtS
+DncKjvbdnPzYvKxb
+EObjjvbdsZlPsAhO
+EPDLKvbdjJfHjMxS
+EOcLKvbdbsDLUDia
+DncLKvbdMuTSLNAX
+EPDLKvbdemGWfmKL
+EObkKvbdKefHbBQu
+EOcLKvbduVnXjRTA
+DnbjjvbdGZVUaEYC
+EOcKjvbdkNCMZeGo
+EPCkKvbdGKeSbgmV
+DoDKjvbdqrVLNjaN
+DnbjjvbdEASIlzWw
+DnbjjvbdeOdrkUUS
+DncKjvbdDjIJvXjA
+DoCjjvbdqGEFUWAh
+EPCjjvbdQcbaQRES
+DnbkKvbdhtydwSUb
+DoCkKvbdMuTRjmAX
+DnbjjvbdJutfEEfi
+EPCjjvbdzGxlAMeX
+DncLKvbdIHGyyYYH
+DoDLKvbdxUmEqZLn
+DnbkKvbdNHCpMotk
+DnbjjvbdFyVVAcwb
+EPCjjvbdShzJqABM
+DnbjjvbdcyxoxZRC
+EPCjjvbdqquKnLBN
+DncLKvbdcIlikFwY
+DoCkKvbdeOeSkTsr
+EOcLKvbdYpldhldq
+EPDLKvbdQYmAGsRj
+DoCkKvbdzGyMAMeX
+EPCkKvbdqrVKnLBN
+EObkKvbdxUldpxlO
+EPCjjvbdfIKuqnRH
+EPDKjvbdFWYpQMjF
+EPDLKvbdOFEUJJKd
+EOcLKvbdHEKvKBij
+DoDKjvbdjcMLRHUg
+EPCkKvbdWXIwudEg
+DncLKvbdgPazvcwh
+DnbjjvbdnVUykJrG
+EPCjjvbdxxJJbPyk
+DncLKvbdjJehKMxS
+DncKjvbdEzspdkbi
+EPDKjvbdrpVnjDWG
+DnbjjvbdVrOYCFLc
+DoDLKvbdMfbpMotk
+DncKjvbdbhljLGWx
+DncKjvbdxrmhlrBg
+EOcKjvbdbKlGPODA
+DoDKjvbdJvUfEFHJ
+EPCkKvbdySnIlqag
+EPDKjvbdVAbQrpqy
+DnbjjvbdrykosAhO
+DnbkKvbdKfFhCBQu
+DnbjjvbdEXwktTsl
+DoDKjvbdDoDLLXCd
+EObkKvbdvwMAvAvV
+EObkKvbdXsLaNUOx
+DnbkKvbdRDcBQRES
+EOcLKvbdZisIPgCG
+DoDKjvbdpfEEtWBI
+DoDKjvbdfoazwDwh
+EPCkKvbdFpASvffZ
+EObjjvbdRWnDblHc
+DoCkKvbdNxOuzdOU
+DncLKvbdYlSDtOLm
+EPCjjvbdjbkjqHVH
+EPCkKvbdrMzJxkgi
+EPDKjvbdCIkBjhfK
+EPCkKvbdUslsekvK
+EOcKjvbdFejRnJUR
+EPDLKvbdNHColotk
+EPCjjvbdUxgtZjnn
+DoDKjvbdEOcLLXCd
+EPCkKvbdkHflGFnL
+EPCjjvbdwygfFxEr
+DncKjvbdeOdrjtTr
+DoDLKvbdqTtHRqjt
+EPDLKvbdQwNdCkgc
+EPCkKvbdhzVGLpnG
+DoDKjvbdxwiKCPzL
+EPCkKvbdZirhQGbG
+DoCjjvbdqrUkOKaN
+DoDLKvbdlrZUysEJ
+DoCjjvbdqFdFUWAh
+DnbjjvbdyYJKCPzL
+DncKjvbdxUldpyMO
+EPCjjvbdvAcyTOeI
+EObjjvbdLFegaaRV
+DncKjvbdemFvgNKL
+EOcLKvbdjcLjqHVH
+DoDKjvbdRMxCYnUz
+EPDLKvbdRjxfUfkT
+DoDLKvbdiMEdNuDZ
+DoDLKvbdZRMdhmEq
+DoDLKvbdqlyiyLgi
+EObjjvbdiiehJmYS
+DoCjjvbdwuMeRYlO
+EPDKjvbdqquKmkAm
+EOcKjvbdlrYtysDi
+EPDLKvbdliETqUrB
+EObjjvbdePErkTsr
+DoDLKvbdfHjvRnQg
+EObjjvbdRXOECkgc
+EObkKvbdMpXqWOGs
+DncKjvbdEJhJvYKA
+DoCkKvbdVrOYBeMD
+EPDKjvbdTkvPBWOi
+EOcLKvbdjuvmcbYX
+DncKjvbdMfcQMouL
+EOcLKvbdMpXpvOHT
+DoCjjvbdiLdcmtcZ
+DnbkKvbdiHJcZWJu
+EPDLKvbdTqQnuUgm
+DncKjvbdLGFgbBQu
+EPDKjvbdNdctIiLE
+EPDKjvbdZxdKODLr
+DoDKjvbdSZjITCvA
+EPCjjvbdDwxMUTsl
+EPCkKvbdySmhmRag
+EOcLKvbdSPtHKGDw
+DoDKjvbdmIctRUqa
+DoDKjvbdaRfChTek
+DncLKvbdyNrhXsIc
+DncLKvbdJTZBSlxM
+DoDKjvbdFeirOIsq
+DnbjjvbdJutedFHJ
+DnbkKvbdUsltGMWK
+DnbkKvbdbhljLGWx
+EPCjjvbdirziTLJz
+EOcKjvbdnPzYvKyC
+DoDKjvbdkDMLRGtg
+DncLKvbdyzeNqhIh
+EPCjjvbdYTMAmUPY
+DoCkKvbdgGMZnHHA
+DncLKvbdlZSqsYft
+EOcLKvbdZjShQHCG
+DnbjjvbdjhGlGGNk
+DoDLKvbdkxsRryGt
+DoCjjvbdZyDjNbkr
+DnbkKvbdNeEUJIjd
+EOcKjvbdxxJJbPyk
+DoDLKvbdRbDeMIxk
+EObjjvbdrDeJPnWB
+EPCkKvbdrXPkbiYq
+EPCjjvbdeFPRbWbj
+DncLKvbdHffyxxYH
+EPDKjvbdcyyQYZQb
+DoCkKvbdNsTvGeUp
+EPCkKvbdfpBzwDxI
+EPCjjvbdqTtHRrLU
+EPCkKvbdhgJbxvJu
+EOcKjvbdkxsRryGt
+EPCkKvbdZshhyETO
+DnbkKvbdrWpLbiZR
+EObkKvbdnHExMmfy
+DnbkKvbdbUbGwkTh
+DnbkKvbdnHExMnHZ
+EObjjvbdZnmiFEyj
+EObkKvbdSQUGjGDw
+EPCkKvbdqTtGrRkU
+EObjjvbdcImKLGXY
+EObkKvbdShzJqAAl
+DncLKvbdGGJqnIsq
+DnbkKvbdehKuqmpg
+DncLKvbddeOrCXDK
+EOcLKvbdRMwbYmtz
+DnbjjvbdgFlZmgHA
+DnbkKvbdyOSgxTJD
+EOcLKvbdQZNAGsSK
+DoCkKvbdRMwayNtz
+DncLKvbdezvYeItX
+EOcLKvbdVAapsQrZ
+DoCjjvbdcImKLFwY
+DoDKjvbdTqQnttgm
+DnbjjvbdOEdUJIkE
+DoDKjvbdeYZssqez
+DnbjjvbdZjSgpHCG
+DoCkKvbdTvMPisaR
+EOcKjvbdZjSgofaf
+EPDLKvbdfVzwoizs
+DnbjjvbdCSaCsewS
+EPDLKvbdFVyPpMjF
+EObkKvbddjJrVtzn
+DnbjjvbdyOSgxTIc
+EOcLKvbdrovPKDVf
+DnbjjvbdxZhGGXeS
+DncLKvbdbLLeoNcA
+EOcKjvbdMfbomQUk
+EPDLKvbdaRebhTfL
+DoDLKvbdoAKztHcn
+EOcLKvbdGckWJbJj
+DncLKvbdqmZjYlHi
+DncKjvbdZyDinDLr
+DoCkKvbdxwhibPzL
+DnbkKvbdZoOJFFZj
+EPDLKvbdYpmEiMdq
+DoCkKvbdiUzFWquC
+DnbjjvbdsPvPJcVf
+DncKjvbdDwxMTssl
+EObkKvbdZQleJNEq
+DoDLKvbdWSNxBdkc
+DoCjjvbdcSbkTcia
+EOcKjvbdqvolChyR
+DnbjjvbdqlzJxlHi
+DoCjjvbdlrZUzTEJ
+EPCkKvbdGdLWJbJj
+EObkKvbdzoPqFDLx
+DncLKvbdANIYrwZx
+EObjjvbdSPsgJfEX
+DoCjjvbdbiNJjfWx
+DnbkKvbdMfbpNQVL
+EObkKvbddePRbXCj
+EPDKjvbdShzKRAAl
+DoDKjvbdnPyxukYb
+EObjjvbdVZITzKoO
+EPDLKvbdZyDinDMS
+EPCjjvbdYpldhmFR
+DoCkKvbdZjTIPfaf
+EObjjvbdqdEiPmua
+DnbkKvbdRadEkhxk
+EPDLKvbdzjVPpDrt
+DnbkKvbdaMkBsUlg
+DncLKvbdMpXpunGs
+DoDKjvbdUxgszLPO
+EPCkKvbdiiegilxS
+DoCjjvbdEOcKkWbd
+EOcLKvbdcTDLUEJa
+EPDLKvbdZtIiYcrn
+DoDLKvbdmttyjirG
+EPDLKvbdGdLVjBjK
+DncLKvbdDigjVxKA
+EPCkKvbdelfWflik
+DoDKjvbdOTUVfdtp
+DncKjvbdTlWOaVni
+EPDKjvbdrpWOibvG
+EPDKjvbdfRaWzlCo
+DncKjvbdlrYuZrdJ
+DoDKjvbdIsZBSlwl
+EPDLKvbdqquLOKaN
+DnbjjvbdJmAEZgUa
+EPCkKvbdcImJkFvx
+DncLKvbdkxrqsYft
+EPCkKvbdUWLojTaR
+DoDKjvbdnGeXlmfy
+DoCkKvbdiMFDmuCy
+EPDKjvbdauCHXjtI
+DoCjjvbdBsAcUGXS
+DoDKjvbdACrYJyhp
+DoDKjvbdsZlPsBHn
+DoDLKvbdjJegimXr
+DoDKjvbdWXIwvDdg
+DncKjvbdelewHNJk
+EObkKvbdyTOJMrCH
+DoCkKvbdNddUIiKd
+DoCkKvbdRyjHrbvA
+DoCjjvbdiGjCyWKV
+DoDLKvbdhlFEOVDZ
+EPCkKvbdQdDAoqDr
+DoDKjvbdBiLBjhej
+EOcKjvbdqlyjZLgi
+DncLKvbdtSrTYzFD
+DoCkKvbdrMyjYlHi
+EObjjvbdhficYuiu
+DoDKjvbdfekymgHA
+EOcLKvbdiifHjNXr
+EObjjvbdIwsaglQp
+DoCjjvbdCIkBkIfK
+EPDKjvbdaSFcHsfL
+DoDLKvbdMgDPlpUk
+EPDKjvbdqYnggQdY
+DoDKjvbdaSFbgsek
+DoCjjvbdiZtekqNf
+EPDLKvbdkClKpftg
+DoCkKvbduMYWaUAw
+EObkKvbdtTSTYydc
+DnbjjvbdptUGqrKt
+EObjjvbdYlRctNlN
+DncKjvbdMgDQNPtk
+DncLKvbdILaznXQk
+DoDLKvbdiCPDFWpq
+DoCkKvbdiGicZWKV
+DncKjvbdFjdrbglu
+DncLKvbdKWUfDeGi
+DoCjjvbdVhXuwgYz
+DoDKjvbdhtzFWquC
+EPCjjvbdRpTfiedX
+DoCkKvbdKVuFdEfi
+DoDLKvbdbBWEfPow
+DoCkKvbdZyDjODLr
+DncLKvbdeAUQmXif
+DoCkKvbdIidAKQHE
+EPCkKvbdTqROuVIN
+DncKjvbdRXODcMID
+DoDKjvbdkyTRsZHU
+EPCjjvbdxnTIXrhc
+EObjjvbdJzofXdAN
+EOcKjvbdiBncFWpq
+EObkKvbdYORAXuVt
+DnbjjvbdiMEdNtby
+EPDKjvbdVrOXbFMD
+EPCkKvbdAMgxrwZx
+DoCkKvbdtbbuXVoP
+EPCjjvbdDoCkKwCd
+DncLKvbdVBBpsRRy
+DoDKjvbdemGWgMik
+EObkKvbdeEnqbXDK
+EPCjjvbdhanbdvqR
+DnbkKvbdmaiwYOnV
+DoCjjvbdcJMjLGXY
+DnbkKvbdIryArlxM
+EPCjjvbdtkwvaUAw
+DnbkKvbdxZgefYFS
+EPCkKvbderBWzlDP
+EPCjjvbdNxPVzdOU
+EPDKjvbdaSGDHsek
+EOcKjvbdqcdhpOVa
+EPCkKvbdxmsHxShc
+DoDKjvbdDncKjwDE
+DoCjjvbdYpmEhmFR
+DncKjvbdaRfCgsfL
+EObjjvbdegjurNpg
+DnbkKvbdjhHMFenL
+EPCjjvbdMfcPmQUk
+EOcLKvbdACrYKZhp
+DoDKjvbdffMZmgHA
+DoCjjvbdaaVeGQQX
+EOcKjvbdSCDdkiZL
+EOcKjvbdqwPlCiYq
+DoDKjvbdajlGPODA
+DncLKvbdJYTbHkpp
+DncLKvbdtcDVXWOo
+EPCjjvbdEXxLtTsl
+EPCjjvbdJuteceGi
+DnbjjvbdDoCkLWbd
+DoCkKvbduCbtwWOo
+EPDLKvbdauBgYLTh
+EPCjjvbdOXoVzcmt
+DoCkKvbdRMxByOUz
+DoCjjvbdqYoIGqDx
+EPCjjvbdNGbpMpVL
+DoCjjvbdJpzFOfNe
+EOcKjvbdVAapsQrZ
+DncKjvbdpxoIHQcx
+EOcKjvbdRaceLiZL
+DncLKvbdtcCuWvOo
+EObjjvbdbBVeGPow
+DnbjjvbdKyRKSzuG
+EOcLKvbdFyVUaEYC
+EPDKjvbdkCkkRHUg
+EObkKvbdKaKfmBxR
+DoDLKvbdbUbGwjsh
+DnbjjvbdrovOjDVf
+EPCjjvbdZsiIyDsO
+EObjjvbdRDbaPqDr
+EOcKjvbdnBivwnmu
+EPCjjvbdYTMBMsoY
+DoDLKvbdxKwEHzzG
+EPCkKvbdqTsgRqkU
+EPDKjvbdfMfWgNKL
+DnbkKvbdznpREbkx
+DncKjvbdJXtCHlRQ
+EPDLKvbdGYuVBEXb
+EPDKjvbdZLrEUOMN
+EPDKjvbdtcCtvuoP
+EObjjvbdXsLaNUPY
+EPDLKvbdyOTIYSiD
+EObjjvbdsrrTYyeD
+EObjjvbdZisHpGaf
+DoDLKvbdvOszqLOt
+DncLKvbdaMjbSuNH
+DncLKvbdYTMBMsoY
+EPDKjvbdwzIGFxFS
+EPDLKvbdmRyUyrci
+DncLKvbdTkvPBWOi
+EPCjjvbdNdcsiIjd
+EPCkKvbdEzspdkbi
+EObkKvbdrovOicVf
+DoDKjvbdhbObeXQq
+DncKjvbdZnnIeFZj
+EObkKvbdRECaPpdS
+EOcKjvbdnGeXlnHZ
+EPCjjvbdauCGwjsh
+EPCjjvbdczYpXyRC
+EOcLKvbdDihJuxKA
+EOcKjvbdkVwNcbXw
+EObjjvbdbsCkTcia
+DoCkKvbdfMewHNKL
+DoCjjvbdxZgeexEr
+EOcLKvbdiBoDEwQq
+DnbkKvbdpstHSSKt
+EOcKjvbdQvmdClHc
+EPDKjvbdIxUBhLqQ
+EObkKvbdZtJIyESn
+EPCjjvbdtumwjQsA
+DoCjjvbdNPxQunHT
+EOcLKvbddndrkUTr
+EObjjvbdCTBCsevr
+EOcKjvbdiUzEwRuC
+EPDKjvbdRyigrbvA
+DoCjjvbdezvYeJTw
+EOcLKvbdVgxVxGxz
+DnbjjvbdZeXfzhIb
+DncKjvbdxZgfFweS
+DoCkKvbdKxqKSztf
+DncLKvbdpyOggREY
+EPDLKvbdXrlBNUOx
+EPCkKvbdqwPkbiZR
+EPDLKvbdbsCjscia
+DoDKjvbdnGeYMmgZ
+EOcLKvbdUsmTfLvK
+DnbkKvbdjuwOEBxX
+DnbjjvbdTAFJICPE
+DncKjvbdEuxoomKF
+EPDKjvbdeOdsLTsr
+EObkKvbdZshiYdSn
+DncKjvbdcTDKscjB
+DncLKvbdvwMBWAvV
+EOcKjvbdVwIwudFH
+EPDLKvbdlZTSSxgU
+EOcKjvbdMgColotk
+EOcLKvbdZdxGzgiC
+DnbjjvbdULuoBWOi
+EObjjvbdiCObeXQq
+EPDKjvbdNUsRkNAX
+DoCjjvbdZxcjOClS
+DncLKvbdiUzEwSVC
+DoDLKvbdvlvAMceN
+DoDLKvbdqcdhpOWB
+EObkKvbdCSaDUGWr
+DoCkKvbdssSTYydc
+DoCkKvbdnGdxMmgZ
+DoCkKvbdHELWJbKK
+DoDKjvbdKefHbApu
+EObkKvbdVqmwbFLc
+DoCkKvbdUtNTekuj
+EPDLKvbdTlWOaVni
+DoCjjvbdDxXkstUM
+EPCkKvbdpxoHfqEY
+EPDKjvbdmSYtzTEJ
+DoCjjvbdddnrCXDK
+EPCkKvbdZjTHpGbG
+DncLKvbdhzVGLqOG
+EPCjjvbdZjSgogBf
+EPDLKvbdkDLjqGuH
+DncLKvbdxUmFRZLn
+EPDLKvbdjhHMFfNk
+EPCkKvbdZjTHpHBf
+EObkKvbdegkVqnQg
+EPDLKvbdGYttaEXb
+EObjjvbdZdwfzhJC
+DoCkKvbdGQASwHFy
+EPDKjvbdkVvnDbXw
+EObkKvbdJYTagkqQ
+DoCjjvbdMSWlzVQz
+DoCjjvbdnGeYMmfy
+DoDLKvbdADRxKZiQ
+EObkKvbdZLqdTmkm
+EPCkKvbdFeirOItR
+EPCkKvbdRjyGVGjs
+DncLKvbdiMFDnUcZ
+EObkKvbdVAaqSpqy
+EPCkKvbdULunaVni
+DnbkKvbdcImKKevx
+DoCjjvbduaDyTPFI
+EPDKjvbdKQydoFnF
+EPCjjvbdozmcjwoA
+DoDLKvbdZLqdUNlN
+DoDKjvbdJXsbHkpp
+DoCkKvbdelfXHNJk
+EObjjvbdeFOqavcK
+EPDLKvbdqlyjZMIJ
+DoCjjvbdUtMsekvK
+DoCkKvbdIxUBhMQp
+EOcKjvbdemGWgMjL
+DoCkKvbdwuMeQyLn
+DncKjvbdkClKpgVH
+DoDKjvbdfNFvflik
+DncKjvbdhkdcmuCy
+DoDLKvbdCJKakIfK
+DnbkKvbdSQTgJfEX
+DnbkKvbdkIGlGFmk
+DoDKjvbdySmhlqbH
+DoCjjvbdGdLVibJj
+EPCjjvbdSLZGUfkT
+EPDLKvbdSKxfVHKs
+DoDKjvbdGLFSbhMu
+DoCkKvbdqFcdtWAh
+EOcLKvbdbVBfxLUI
+DoDKjvbdcScKsdKB
+DnbkKvbdVwJYWEFH
+EPCjjvbdGQASwHFy
+DnbjjvbdqUTfrRjt
+EPDLKvbdEYYMTtUM
+DoDLKvbdfNFwHNKL
+EObkKvbdsQWPJbvG
+EOcKjvbdIsYaSmYM
+EPDKjvbdBdQAuilf
+DnbkKvbdrounibvG
+EObkKvbdiCPCdvqR
+EOcLKvbdBsAbsfXS
+DoCjjvbduDDVWuoP
+EPCkKvbdbsCjtEJa
+EOcKjvbdcTDLTdKB
+DoCjjvbdXGYytAPT
+DnbjjvbdePFTLTsr
+EObkKvbddoErjssr
+EPCkKvbdcTDKsdJa
+EPDKjvbdjgflGFnL
+EObjjvbddeOqbWcK
+EObkKvbdACqwizJQ
+EObjjvbdHgGyyXxH
+DoCjjvbdqlzKZMHi
+DnbjjvbdhfibxvJu
+DoDKjvbdSCEFLiZL
+EPCjjvbdSCEFLiYk
+EObkKvbdiLdcmuDZ
+EObkKvbdzGyMAMeX
+EPDKjvbdVYhTzKoO
+EPCkKvbdxrmiNRag
+DoDLKvbdjKGHilxS
+EOcKjvbdhWyAzzAJ
+EPDLKvbdMfcQNQVL
+DncKjvbdYkqdTmlN
+DoDLKvbdjJfIJlwr
+EOcLKvbdZeYGzghb
+DncLKvbdJuuFceGi
+EPCkKvbdhzUelRNf
+DnbkKvbdBhkCKhej
+DoDLKvbdhbObeXRR
+DnbkKvbdzHZMAMdw
+DoDKjvbdZxcjNblS
+DoCjjvbdDwwksstM
+DoCkKvbdUVkpJtAq
+DoDLKvbdaaWEepPw
+DncLKvbdGdKvJbKK
+DoDLKvbdTulQJtBR
+DoDKjvbdqceJPnVa
+DnbkKvbdvAdZTOeI
+EOcKjvbdVAbRSqRy
+EPCkKvbdTqQnuVHm
+DoCjjvbdwNWANDeN
+DnbkKvbdZtIiYdSn
+EPCjjvbdPIAXyAZB
+EPCjjvbdZoOIeEzK
+DoDLKvbdmJETqUrB
+DoCjjvbdOFDtIiKd
+DnbkKvbdqvolDIxq
+DnbjjvbdmgFYNNfy
+DncLKvbdieLHUoAO
+EPCkKvbdDnbkLWcE
+DoCjjvbdmJETpuSB
+DncLKvbdiiegjNXr
+EPDKjvbdZQldiMeR
+EOcKjvbdZHXEAPTJ
+EObkKvbdWHwvXfxz
+DnbkKvbdxUleRZLn
+DnbkKvbdtvNxKQsA
+DoDKjvbdOStWHEuQ
+DnbkKvbdsBellHLZ
+DoDKjvbdsCFllGkZ
+EPDKjvbdjhGlGGOL
+DncKjvbdxxJKBoyk
+DncKjvbdrXPkcJYq
+DoCkKvbduVnXipsA
+DoDKjvbdjKGHjMwr
+DoDKjvbdbBWEfPpX
+EOcKjvbdznoqEcMY
+DoCkKvbdySnJMqbH
+DoCjjvbdlrZVZsDi
+EPDLKvbdKfFgbApu
+DoDLKvbdZRMdiNFR
+EObjjvbdpeceUWAh
+EObkKvbdRotHKFcw
+DncKjvbdiZuFkpmf
+DoDKjvbdnGdwmNgZ
+DoDKjvbdMoxRVnGs
+DoDLKvbdiVZeXRtb
+EOcKjvbdGAoRYizm
+DoDKjvbdJJdAJpGd
+DoDKjvbdwMvANEFN
+DnbjjvbdaaWFFpQX
+DnbjjvbdqlzKZMIJ
+EPDLKvbdxnShXsJD
+DncLKvbdMfcPlotk
+DncLKvbdURRPVUhN
+DnbkKvbdHgGzZXxH
+EOcLKvbdYlRctOMN
+DncKjvbdnHEwlnGy
+DoDKjvbdlYsSTZGt
+EOcKjvbdZxcjNcLr
+EObjjvbdmttyjjSG
+EObkKvbdffLynHHA
+DnbkKvbdmpZxvLZC
+DncLKvbdBhjakJGK
+DoCkKvbdpstHSRkU
+EPDLKvbdiLddOVCy
+EOcKjvbdxUleQyLn
+EPCkKvbdTukpKTaR
+EOcLKvbdjvXOECYX
+EObjjvbdRWnEDLgc
+EObkKvbdbhljLGWx
+EPCkKvbdZoOJEdyj
+DnbkKvbdqrVKnLAm
+DoDKjvbdVAbRTRRy
+DnbkKvbdhfjDZWKV
+EOcLKvbdkWXOECYX
+DnbkKvbdYTLaMsnx
+EObjjvbdZRNFImFR
+DncLKvbdCWzdIdpW
+EOcLKvbdpyPIGqDx
+DoDLKvbdiCOcFWpq
+EPCjjvbdhtzFXSUb
+Dnbjjvbdlqxtyrci
+DoCkKvbdiZtelROG
+EPCkKvbdVUNUFkvK
+DnbkKvbdNddUJJLE
+DoCkKvbdNdctIhjd
+DnbkKvbdcyyQYZQb
+EObkKvbdQmYByNtz
+DoDLKvbdVrNxBeMD
+EPCjjvbdCTBCsevr
+DncLKvbdtSrTYyeD
+DnbjjvbdRyigsDWA
+DncLKvbdJYUBglQp
+DoDKjvbdSPsfiedX
+DoCkKvbdADRxKZiQ
+EPDLKvbdrEFJPmvB
+DnbjjvbdvAcyTOdh
+EOcKjvbdaMjasUmH
+DoDKjvbdZjSgogBf
+DnbkKvbdnGeXmOGy
+DnbjjvbdMgComPuL
+EPCkKvbdxKvcgzzG
+DncKjvbdwtldpyMO
+DoDKjvbdbhlikGXY
+EPCkKvbdpyPIHREY
+DoDLKvbdkClLRHUg
+EPDKjvbdqFdFUWBI
+EOcLKvbdkxrqrxgU
+DoDLKvbdTvLoitAq
+DoCjjvbdJuuFcdfi
+EPCjjvbdrykpTAhO
+EPCjjvbdiZuFkqNf
+EObjjvbdEuxpQNKF
+EPCjjvbdGGKSOJUR
+EPCkKvbdcyxowxqC
+DnbjjvbdjhGkeemk
+EPDKjvbdijGIJmYS
+DnbkKvbdypnliKXA
+EOcKjvbdRadFLhyL
+EPCjjvbdxwiKCPyk
+DoCkKvbdfILVqnQg
+DoDLKvbdkNCLzEgP
+DoCkKvbdGKdrbglu
+DnbkKvbdJcJcRJcY
+DoDLKvbdIwsahMRQ
+DnbkKvbdNddUIhjd
+EPCkKvbdJuuGDdgJ
+EPDLKvbdjKGHjMwr
+EObkKvbdGdKvKCJj
+DncKjvbdNUrqkNAX
+DoDLKvbdTqQoVVHm
+DoDKjvbdNddTiIkE
+EPCkKvbduaEZTPFI
+DnbjjvbdFWYopMie
+EObjjvbdyXhiaozL
+EPCjjvbdhaoDFWpq
+DncKjvbdJJdAKQHE
+DoDKjvbdegkVrOQg
+DnbjjvbdwuMdqYlO
+EPCkKvbdLKaHvAJy
+DoDKjvbdRbEFLiYk
+DoDKjvbdSxLMNzjx
+DnbkKvbdGKdsChMu
+DncKjvbdACrYJzJQ
+DoCjjvbdbUafwkUI
+DncKjvbdzjVPpDrt
+DnbjjvbdFfKSOJTq
+EPDKjvbdHffyyXxH
+EOcLKvbdRkZFtgLT
+EOcKjvbdXsMAmToY
+EOcLKvbdNPwqWNfs
+DoCjjvbdEuxpPljF
+DncLKvbdjJfIJlxS
+DoCjjvbdhgJbxuiu
+EPCkKvbdrDdhpOWB
+DnbkKvbdwWlBWAuu
+EObjjvbdySmiMrCH
+EPCjjvbduWOXjRTA
+DncLKvbdRDbaPqES
+EPCkKvbdjEkHVPAO
+EPDLKvbddiiqvUzn
+EPDKjvbdyYJKCPyk
+DncKjvbdNeEThiKd
+DncKjvbdrbGMlGkZ
+EOcKjvbdOTTvHEuQ
+EObjjvbdFyVUaEYC
+EPCkKvbdbiMikFwY
+EPDKjvbduaDxsPFI
+DncLKvbdozmckYPA
+DoDLKvbdVYgsykPO
+DoCjjvbdQvnDbkgc
+DncKjvbdZLrDtNkm
+DoDKjvbdHfgZyYXg
+DoDKjvbdauCGwkUI
+DoDKjvbdmJDsqVSB
+EOcKjvbdhgJbyWKV
+EPCjjvbdrouoKDWG
+DoDKjvbdQmYCYnUz
+DoDLKvbdfHkVqmpg
+DoCjjvbdZjShPfaf
+DoCkKvbdIGfzYxYH
+EPDKjvbdZRMeJNFR
+EPCjjvbdRpTgKFdX
+EPCkKvbdEYYMUUUM
+DncLKvbdwuMdqZLn
+EOcKjvbdmuVZkJqf
+DncKjvbdhgJbyWJu
+DnbjjvbdKVuFcdfi
+EPCkKvbdRadElIxk
+EPCkKvbdYlSDsmkm
+DoDKjvbdhlFEOVDZ
+DoCjjvbdIsZBSlwl
+DoDKjvbdLAkGmCXq
+DoDLKvbdqwQMCiYq
+EPDKjvbdURROtuIN
+DoCjjvbdpxoHgREY
+DncKjvbdwXLaWAuu
+EObjjvbdrpWPJcWG
+EPDLKvbdmozYvLYb
+EPCkKvbdMowpunGs
+DnbkKvbdANHySvzY
+DncLKvbdZyDinDLr
+DoCjjvbdziuPpESt
+EPDKjvbdiVZeXRuC
+EPDLKvbdDncKkWbd
+EOcLKvbdFVxopNJe
+DncLKvbdACqxJzIp
+DncKjvbdaMkCTUlg
+DoCkKvbdhyuGMQnG
+EObjjvbdbBWFFpPw
+EObkKvbdTAEiICPE
+DoDKjvbdbUagXjtI
+DoDLKvbdGZUuAcwb
+DoDKjvbdnGdwlmgZ
+DoDLKvbdVBCRSpqy
+DnbjjvbdfIKvRnRH
+EObkKvbdaRebgsek
+DnbjjvbdNVSrLNAX
+EPDKjvbdrJAKEmPF
+DnbkKvbdBdQBWKNG
+DoCjjvbdePFTLUUS
+EPCkKvbdRDcAoqDr
+DncLKvbdrNZiyLhJ
+DoCkKvbdLqwNZtpz
+EPDLKvbdlqxtzTEJ
+DnbkKvbdrRtjmkBN
+EPCkKvbdZRMeJNEq
+DnbkKvbdZsiJYdTO
+EObjjvbdUtMtGLvK
+EOcLKvbdnCJwYOnV
+DncLKvbdUMWPAuni
+EOcKjvbdJcJbpjDY
+DoCkKvbdcImKLGXY
+EObkKvbdYSlAmTnx
+DncLKvbdCTBCtFvr
+EObjjvbdqlyjYlIJ
+DoCkKvbdmSZUzSci
+DoDKjvbdjEjfuPAO
+EPCjjvbdWfYzUAPT
+DnbjjvbdzROmJJwA
+EObjjvbdnQZyVjyC
+DncKjvbdjAQGaPgK
+EObkKvbdtTSTZZeD
+DoDLKvbdZLrETnLm
+DncKjvbdCDpAujNG
+DncKjvbdUyHsykOn
+EPDLKvbdeXystRez
+EPCjjvbdlrZUyrci
+EPDKjvbdwjvcgzzG
+EPDKjvbdnHExNOGy
+EOcKjvbdZLqdTmlN
+EPCkKvbdEuxopMjF
+EObjjvbdJYTaglRQ
+EPCjjvbdrWpLbiZR
+EPCjjvbdNxOuzcnU
+DoDLKvbdijFhKNXr
+DnbkKvbdKWVGEFHJ
+DnbkKvbdKCicQjCx
+DoCkKvbdcScLTdKB
+EOcKjvbdKWUecdfi
+DoCjjvbdiLeDmuDZ
+DncKjvbdySnJNSCH
+EPDLKvbdZshhyDrn
+DnbkKvbdssSSxydc
+EOcLKvbdqrUjnLBN
+EPDKjvbdGdLWKCKK
+EObjjvbdsQWPJbuf
+DoDLKvbdJcKDRJcY
+DoCjjvbdZoNiEeZj
+DnbkKvbdGFjSOJTq
+EPDLKvbdxxJKBozL
+DoDKjvbdBraDUGXS
+EPDKjvbdJbjCpicY
+DoCjjvbdVqmwbEkc
+EPDKjvbdijFhKMwr
+EPDLKvbdrSVLNkBN
+DoCkKvbdiUzEvquC
+EPCjjvbdWIYVxGxz
+DnbkKvbdZoOIdeZj
+DncLKvbdZRMeJNEq
+EObjjvbdZMSDtOMN
+DnbjjvbdRWnDcLgc
+DoDLKvbdmRxtzTDi
+EOcKjvbdJmADygUa
+EOcKjvbdxUmFQyMO
+EOcLKvbdOTUWHEtp
+DoDLKvbdZRNFJMeR
+EOcLKvbdxmsHxShc
+EPCkKvbdUxhTykPO
+DoCkKvbdelfWfljL
+EPDLKvbdFejSOJTq
+EPCkKvbdKefIBaRV
+DncKjvbddeOqbXDK
+EOcKjvbdhlEcnUcZ
+DoCkKvbdZtJJZETO
+DnbjjvbdSPtHJfDw
+DncLKvbdOFDtIhkE
+EPDLKvbdFyVVAcwb
+DoCjjvbdqTtGqqjt
+EOcLKvbdyTOIlrCH
+DnbjjvbdACrYKZiQ
+DoDLKvbdvmWAMceN
+DoDKjvbdLBLHNCYR
+EPCkKvbdIxUCHlQp
+EPDLKvbdQmXayNtz
+DoCjjvbdKRZdoFme
+DncLKvbdZoNiEdyj
+DoDKjvbdqqtkOLBN
+EPCkKvbdiZuFkpmf
+DncKjvbdEPCjkXCd
+DoDKjvbdbVBgXjsh
+DoCjjvbdmRyUzSdJ
+EObjjvbdMJCLpxAS
+DoCjjvbdwWlBWAvV
+EPDKjvbdNHCpMouL
+DncKjvbdEOcLKwDE
+DoCjjvbdwjvcgzzG
+DnbkKvbdNGbpNPtk
+DoDLKvbdZGwEAOri
+EObjjvbdaRfDITfL
+DoDKjvbdVvhwudEg
+EPCjjvbdHgGyxwwg
+DncKjvbdcJMikFwY
+EObjjvbdwMvAMdEm
+EOcKjvbduMYXBUAw
+EPDLKvbdpfDeTuaI
+DoDKjvbdssSSxzEc
+DnbjjvbdjblLRHUg
+EOcLKvbdVwIxWDeH
+EPCkKvbdLGFgaaQu
+EPDKjvbdBiKakIfK
+DoDLKvbdEOcKjwDE
+EOcKjvbddijRvUzn
+DoCjjvbdmaivxPOV
+DnbkKvbdMfcQNPuL
+DncLKvbdZtIiZDsO
+DoDLKvbdhlEcmuDZ
+EOcKjvbdIGfzYxYH
+DncLKvbdICLydzAD
+EPDLKvbdMfcPmPuL
+DnbjjvbdrRuKmjaN
+DnbkKvbdbsDKscjB
+DoCkKvbdhkddNtcZ
+EOcLKvbdNQXqVnGs
+DoDLKvbdrEFIonVa
+DoCjjvbdQvnDcMID
+EPCjjvbdjlalZeGo
+EPCkKvbdjJfIKNYS
+EObjjvbdREDBPqES
+EPCjjvbdiZtfMRNf
+DoDKjvbdADRxJyiQ
+DncLKvbdYkqcsnMN
+DncLKvbdZshiZDsO
+DoDLKvbdRNXayNtz
+DncLKvbdqcdiPmvB
+EPCkKvbdrNZixlHi
+EPCjjvbdwtmFRYlO
+EObkKvbdJTZBTNXl
+EOcLKvbdWRnXadkc
+DoDLKvbdvwMBVaVu
+DoDKjvbdlZSrTYgU
+EPDLKvbdQcbaQRDr
+DoCjjvbdhuZdvrUb
+DnbkKvbdZxdKOClS
+DncKjvbdJzoexEAN
+EOcLKvbdQvmdDLhD
+DncLKvbdunszpkPU
+EOcKjvbdiZuGMQnG
+DncKjvbdVZIUZkOn
+DoDLKvbdkxsRsYgU
+EPCjjvbdGQASwGey
+DncKjvbdnBivwoNu
+EPDLKvbdsBelkfjy
+DoDLKvbdddoRbWbj
+EPCjjvbdhancFXQq
+EObkKvbdJvUfEEfi
+EPDLKvbdIidAKPfd
+DoDLKvbdxVMdpxkn
+DoCjjvbdaNLCTVNH
+DnbkKvbdZyDinDMS
+DoDLKvbdrMzJyLhJ
+EPDLKvbdyXhiaozL
+DoCjjvbdGKeTDHlu
+DncKjvbdwzIGFxFS
+EObjjvbdJvUedEfi
+DncLKvbdIjEAJpGd
+DncKjvbdyTNiNRbH
+EOcKjvbdidkGuPAO
+DoDLKvbdkVvmcbXw
+DoCjjvbdJYTbHkpp
+DoDLKvbdFyVVBEYC
+EPDLKvbdmoyyVjyC
+EOcKjvbdcTDKtDjB
+EPCjjvbdEvYpPmJe
+DoCjjvbdCJLCKhej
+DoCjjvbdSKxfUgLT
+DoDLKvbdFjeTDINV
+DncLKvbdEXxMUTtM
+EOcKjvbdWRnXaeMD
+DoCjjvbdrMzJyLgi
+DoCkKvbdcSbkUEKB
+DnbkKvbdyzeOSIIh
+DncLKvbdpstGqrKt
+EPDKjvbdCJLBkJGK
+EOcLKvbdJcJcQjDY
+EPDLKvbdbLLfPNcA
+DnbjjvbdEASImZwX
+DnbjjvbdtumwiqTA
+DnbkKvbdxKvdHzyf
+DoCjjvbdVwIxWDeH
+DncLKvbdYzcFqjVy
+EPDKjvbdqiAJeMoF
+DoDLKvbdNQXqVmfs
+EPDLKvbdFjdsChNV
+DoCkKvbdOTUWGdtp
+EOcKjvbdOEdUIiKd
+EOcLKvbduaEZSoFI
+EOcLKvbdxsNhlrBg
+EObkKvbdcIlijfXY
+DoDLKvbdLqvlytpz
+DoDKjvbdIryBTNXl
+EObjjvbdQwOECkhD
+DoCjjvbdLFegaaQu
+EObkKvbdFkFTChNV
+DnbjjvbdyzeOSHiI
+EObjjvbdLAkHNCYR
+DnbkKvbdZyDimcMS
+DncKjvbdkMbLzEgP
+DnbjjvbdRbEEkhyL
+EOcKjvbdLrXMzVQz
+EOcKjvbdVBBqTRRy
+EObjjvbdyNsHxTIc
+EPCjjvbdMuTRkNAX
+DoCkKvbdUaCQrprZ
+EPCjjvbdjmCLydfo
+DoCjjvbdFyVVAcxC
+EPCjjvbdQvnDblID
+DnbjjvbdLhbLqYAS
+DncLKvbdFxuVBEYC
+DncKjvbdGLFScIMu
+DncKjvbdBvzcheQW
+EPDLKvbdSPsfjFcw
+DnbkKvbdsQWOibvG
+DnbkKvbdaSGChTfL
+EPDLKvbdjmBkzFGo
+DoDLKvbdqAiFAWhE
+EPDLKvbdkVwNcaww
+DoCkKvbdKRZePGOF
+EOcLKvbdJXtCIMRQ
+EPCkKvbdaNLCTUmH
+EPDLKvbdliDtRUrB
+EOcLKvbdKfGHbApu
+EObkKvbdDwwlTstM
+DoDLKvbdmgExMmfy
+EOcLKvbdKWUfEFHJ
+EPCjjvbdkxrqrxft
+DncLKvbdkClKqHUg
+DoDKjvbdVqnXadlD
+DoDLKvbdULvPBWPJ
+DoDKjvbdUslsfMWK
+EOcLKvbdJvVFdFGi
+DncKjvbdiifHilxS
+EPCkKvbdRaceMJYk
+DoCkKvbddwytTrFz
+EPDLKvbdYkrETnLm
+DoCjjvbdiMEdOUby
+DoCkKvbdxVMeQyLn
+EPCkKvbdwuMdpxlO
+EPDLKvbdNPxQumfs
+DncKjvbdYpleJNEq
+DncKjvbdTAEhhCPE
+EOcLKvbdUGznLwVe
+EOcKjvbdNPwpunHT
+EPDLKvbdKaLHNBwq
+EOcLKvbdFfKRmhtR
+EObkKvbdYlRcsmlN
+DoDLKvbdWSOXadlD
+EOcLKvbdWWiXucdg
+DoCkKvbdZsiIxcsO
+DoDLKvbdbhlikFvx
+EOcKjvbdtlYXAsaX
+EOcLKvbdUtNTelVj
+DoDKjvbdhaoDFXRR
+DoDLKvbdEuxoomJe
+DoDLKvbdEYYLtTsl
+DncLKvbdbhmJkGWx
+EPDLKvbdqwPkbhxq
+DnbjjvbdlrYuZsEJ
+DncLKvbdeKKSWUzn
+DnbkKvbdyTNiNSCH
+DncKjvbddwzTsqez
+DncLKvbdTXkMNzjx
+DoDKjvbdJmAEZgUa
+DncKjvbdeEnqavbj
+EPDLKvbdcJNJjfWx
+DncLKvbdPyNAGsRj
+DoCjjvbdLGGHbAqV
+DncKjvbdddoRbWcK
+DoDLKvbdZjTHogBf
+EPDLKvbdRkZFuHKs
+EOcLKvbdEuyPoljF
+EPDKjvbdEYYMTtUM
+DncKjvbdDxXlTssl
+DnbkKvbdQvmcblID
+EObkKvbdjmBkydgP
+DoCkKvbdOAJTUKSA
+DncKjvbdhgJbxvJu
+DoDKjvbdVvhxVceH
+DoCkKvbdjvXODaww
+EPDKjvbdemFvflik
+DoDKjvbdkCkkRGtg
+DoCjjvbdDigjVxKA
+DncLKvbdLAjgNCYR
+EPDKjvbdbUbGwkTh
+EObjjvbdmuUzLJrG
+DnbjjvbdmgFXlnGy
+DoCkKvbdFxttaDwb
+EPCjjvbdJcKDRKCx
+DoCkKvbdpfDeUWAh
+EPDLKvbdADSYJyhp
+DoCjjvbdHkazmvqL
+DnbkKvbduLxWaUBX
+EPCkKvbdQdCaPpdS
+EOcLKvbdZdwfzhIb
+EPDKjvbdKWUeceGi
+EPDKjvbdSCDeMJZL
+DoDKjvbdyOShYShc
+EObjjvbdliEURVSB
+DncLKvbdmgEwlnGy
+DnbkKvbdsBemMHKy
+DoDKjvbdYzcGSJvZ
+EObkKvbdGcjvKBjK
+EOcLKvbdJuuGDdgJ
+EPCjjvbdOStWGeUp
+EOcLKvbdGLEsChMu
+EOcLKvbdeATqNYJf
+DncLKvbdxxIjCQZk
+EObkKvbddZyQXyQb
+DoDKjvbdVBCRTRRy
+EPCjjvbduDDVWuoP
+EOcKjvbdVZHtZkOn
+EPCjjvbdZQmEhmFR
+DnbkKvbdZyDimcLr
+EPDLKvbdjblKqHVH
+EOcLKvbdZtIiZDsO
+DnbkKvbdRWmcbkhD
+EPCjjvbddneSjtTr
+DoCkKvbdZQmFJMdq
+DoDLKvbdLFegbBRV
+EOcKjvbdSwkMNzjx
+DoCjjvbdFjeTDHlu
+EPCjjvbdtSqrxydc
+DncLKvbdSPtHKFcw
+DncLKvbdyYJJapZk
+EOcKjvbddxZssrFz
+EObjjvbdfekzOGgA
+EPDKjvbdrylQSaHn
+DnbjjvbdZisHofbG
+EObjjvbdrbGNMHKy
+DnbkKvbdLBKfmBxR
+DncKjvbdACqxJyhp
+DncLKvbddijRutzn
+EPDLKvbdMpYRVmfs
+DncLKvbdmttzKiqf
+DnbkKvbdZnmhdeZj
+EPCkKvbdjKFgjNYS
+DnbjjvbdxnTHxShc
+EPCjjvbdlZTSTYgU
+DoCjjvbdqlyjYkgi
+EObkKvbdxVMeQyMO
+EPDLKvbdSPtHJecw
+EPDLKvbdrpWOibvG
+EObkKvbdRbEFLhyL
+DoCkKvbdYNqAYUvU
+DoCkKvbdnCKXXnnV
+EObkKvbdddoSBvbj
+DncKjvbdNGcPlpUk
+DnbkKvbdmajXXnmu
+DoCjjvbdJXsbHlQp
+DncLKvbdNGcPlouL
+DoCkKvbdTAFJHaoE
+EPCjjvbdnPyxvKyC
+EPCkKvbdRyihTDWA
+DncLKvbdQlxCZNtz
+EObkKvbdJSyAsMwl
+DoCjjvbdmttykJrG
+EPCkKvbdfpBzwEXh
+DoCjjvbdrzMQTBIO
+EPDKjvbddZxowyRC
+DncKjvbdaNKaruNH
+DnbjjvbdaNKasVMg
+DncKjvbdcbTNSATm
+EPCkKvbdiLdcnVDZ
+EObjjvbdYTLaMtOx
+EOcKjvbdEASIlzWw
+DnbjjvbdziuPodTU
+EOcLKvbdqUUHRqkU
+DnbkKvbdyNsHxSiD
+EObjjvbdhkeDnUcZ
+EOcKjvbdNHCpNQUk
+EPDLKvbdIryBSmYM
+DnbkKvbdfekynGgA
+EOcLKvbdiHKCyWJu
+EObkKvbdrMzKYlIJ
+DoCjjvbdsZkoraIO
+EOcKjvbdQccAoqES
+DoCjjvbdtTRrxzFD
+EPCjjvbdJXtBhMRQ
+DnbjjvbdsBfNMHKy
+DnbkKvbdeEnrBwCj
+DoDLKvbdTfzmkvvF
+DoCjjvbdCJLCLIej
+DnbjjvbdNUrrLNAX
+DoCkKvbdxsNiNRag
+EPCjjvbdtbcUwVoP
+DoDKjvbdaogHDkzd
+DncKjvbdpedFTuaI
+DnbjjvbdqYngfpdY
+DncKjvbdbiNJkGWx
+DoCjjvbdGckVjBij
+EObkKvbdqceIomvB
+EPDLKvbdFWZQQNJe
+EObkKvbdrRtkOLAm
+DncKjvbdDwwktUTl
+EObkKvbdwNWAMceN
+DncKjvbdZMSDtOLm
+EObjjvbdTkvPAuni
+DoDLKvbdUxhTykPO
+EOcLKvbdVBCQsQqy
+EPDKjvbdZshhxcrn
+DnbjjvbdqdEiQOWB
+DoDKjvbdkWWmdBww
+DoDLKvbdzQoMhiwA
+DnbjjvbdUGzmlXWF
+DncKjvbdJTYaTMwl
+DoDKjvbdGLFScHmV
+DoDKjvbdrWpLcJZR
+EOcKjvbdwNWAMcdm
+EObkKvbdmfeYNOGy
+EObkKvbdtcDUwVoP
+DnbjjvbdiZuGMQmf
+EObjjvbdfMewGmJk
+DnbjjvbdANIZTWyx
+DncKjvbdtTSSxydc
+DnbkKvbdsBfMkfjy
+DoDKjvbdSLYfUgKs
+DoDLKvbdZisHogCG
+EObkKvbdVTlsfMVj
+DncKjvbddZyPwxpb
+DncLKvbdAMhYsXZx
+DncLKvbdxwhjCPzL
+EOcKjvbdKRZeOeme
+DoCkKvbdunszqLOt
+EPDKjvbdZRMdiMdq
+DnbjjvbdEuxpPljF
+EPDLKvbdGGJrOJUR
+EPDKjvbdVviXudEg
+DnbjjvbdpfDeTvBI
+DncLKvbdRadElJYk
+EPDKjvbdaMjbSuMg
+EPDLKvbdTAEhhCOd
+DncLKvbdTIyiqABM
+EPCkKvbdBsBDUFvr
+DoCjjvbdcSbkUEJa
+EObjjvbdCIjbKhfK
+DoDKjvbdauCHXjsh
+DoCkKvbdpyPHfqEY
+EOcLKvbdDwxMUUUM
+DnbjjvbdGFjRmiUR
+DoDLKvbdbQGgELzd
+EOcKjvbdGGJqnItR
+EPCjjvbdxrnJNRag
+DoDLKvbdbhmJkFwY
+EPDKjvbddoFSkTtS
+DncKjvbdNUsSKmAX
+EPCjjvbdfelZmfgA
+DoCkKvbdjKGIJlwr
+EPDLKvbdJYTaglQp
+EPCkKvbdVrOXbFMD
+EPDKjvbdTpqPUuIN
+EPCjjvbdGckViaij
+DnbjjvbdczZQYYqC
+DoDKjvbdMtrqkNAX
+EObkKvbdaNKartmH
+EPDKjvbdmSZUysDi
+EOcLKvbdlhdURVSB
+DncKjvbdWRnXbEkc
+DncLKvbdLBKfmBwq
+EPDKjvbdZdwfzhIb
+EPCkKvbdhancFXRR
+EObkKvbdaSFbgtGL
+DncLKvbdJXsaglQp
+DncLKvbdUsltFlVj
+DoDKjvbdLBKfmBwq
+EPCkKvbdnVVZjirG
+EObjjvbdiZuFlROG
+EObkKvbdwygeeweS
+EPCkKvbdwjvcgzyf
+DnbkKvbdssRsYzFD
+DnbjjvbdxwiJaoyk
+EPCjjvbdVhYWYHYz
+DncKjvbdhzVFkpnG
+DncLKvbdeJjSVtzn
+DncLKvbdyYIjCPyk
+EPDLKvbdJpzEoGNe
+DncKjvbdnBiwXoNu
+EOcKjvbdVrOYCElD
+EObkKvbdLBKgNCXq
+EPDKjvbdTlWPBVni
+EPDKjvbdFxuVBDxC
+DncKjvbdnHFXlnGy
+EPCjjvbdYkrDtOMN
+DoCkKvbdUWMPjTaR
+DoCjjvbdjSziSjiz
+DnbjjvbdeOdsKtUS
+EPCkKvbdmfdwmOHZ
+EObjjvbdtSrTYydc
+DnbkKvbdRjxeuGkT
+EObkKvbdKeehCApu
+EOcLKvbdpxoIGqEY
+DncKjvbdbLMGOnDA
+EPCkKvbdEXwktUUM
+EObkKvbdiUzFWqtb
+DoCjjvbdiHKCyViu
+EObkKvbdvwLaWAuu
+DoDLKvbdiCPDEvqR
+EOcKjvbdWXJXvEEg
+DoCkKvbdqTtGrSLU
+DnbkKvbdtbbuXWOo
+EObjjvbdgGLzOGgA
+DncKjvbdTlVoBWPJ
+DoCkKvbdeEoRbWcK
+DoCkKvbdkWWmdCXw
+DncKjvbdehLWRmpg
+EPCkKvbdjFLGtoAO
+DoDKjvbdGLFScIMu
+EObjjvbdrRtkOKaN
+EPCkKvbdczZQYYqC
+DnbjjvbdfHkVqnRH
+EOcLKvbdtvNxKRTA
+EPCkKvbdADSYJyiQ
+EOcKjvbdmJETptrB
+EOcLKvbdURQoUtgm
+DoDLKvbdZMSDtOMN
+EPCjjvbdFfJqnIsq
+EOcKjvbdcJNKKfWx
+DnbjjvbdkySqrxft
+DncLKvbdJpyePFme
+DncKjvbduCcVXWPP
+EOcLKvbdxKvcgzzG
+DoDLKvbdpfEEsvAh
+EObkKvbdZyDjNblS
+EPCjjvbdhbPDEwRR
+EPDLKvbdTqQoUthN
+DoDKjvbdxnSgxShc
+DoCkKvbdcTCjscjB
+DoCkKvbdOTUVfeVQ
+DncKjvbdkMbMZeHP
+DncLKvbdEvYpPmKF
+DncLKvbdJTZBTNYM
+EObjjvbdIHGyxxYH
+EOcKjvbdraemLfkZ
+EOcKjvbdMpYRVmgT
+DncKjvbdxZgfFxEr
+DnbkKvbdpxoIGpcx
+EPCkKvbdkIGlGFnL
+DoDKjvbdUslselVj
+DnbjjvbdZnnJEdzK
+DncLKvbdehLVrORH
+DoCjjvbdySmhlqbH
+DoDLKvbdADSXiyhp
+DoDKjvbdZtJJZDrn
+DoCjjvbdezvZEiUX
+EOcLKvbdqTtHSRkU
+EPDKjvbdVgxWXgYz
+DoCjjvbdGZUuBDwb
+DncLKvbdhzUekpnG
+EPCjjvbdZxcinDMS
+EPCkKvbdOFEThiLE
+DoDLKvbdhzVGLqOG
+EObjjvbdkySqryGt
+DoDKjvbdmpZyVkYb
+DoCjjvbdnHFYMnGy
+EObkKvbdRotGjFcw
+EPDKjvbdjblKpgUg
+EOcLKvbdWWiYVdFH
+DoDLKvbdtbcVXVoP
+EPDLKvbdqqtkOLAm
+EPDLKvbdmRyUysEJ
+DnbkKvbdxnShYTJD
+DoDLKvbdGKeSbhMu
+DoCkKvbdjuwODbXw
+DncLKvbdaMkCSuMg
+DncKjvbdtbcUvuno
+DnbjjvbdiVZeWqtb
+DoCjjvbdLBKgNBxR
+EObkKvbdlZSqrxgU
+EPCkKvbdULunaWOi
+DoCkKvbdwzIGGYEr
+EPCkKvbdnHExNOHZ
+EObjjvbdpyOgfqEY
+DnbjjvbdpedFUWAh
+DoCkKvbdhaoDFXQq
+DnbkKvbdYqMdhleR
+DnbjjvbdsZkpSaIO
+EPDKjvbdJcJbqJbx
+EObjjvbdehKvRmqH
+EOcLKvbdmIdURVSB
+EPDLKvbdvOszqKoU
+EOcLKvbdZisIQGbG
+DnbjjvbdFyVUaDwb
+EPCjjvbdTAEiIBoE
+DncLKvbdRkZFtgKs
+EOcLKvbdzdynzdyp
+EOcLKvbdnUtykKSG
+DoDKjvbdZQmEhldq
+EOcKjvbdnBjWxOnV
+EPCkKvbdqvpLbiZR
+DoDKjvbdrykosBIO
+EOcLKvbdBiKbLJGK
+EPDLKvbdBvzciFPv
+DoCjjvbdemFwGlik
+EPDLKvbdqTsfqqjt
+DncLKvbdptUHRrLU
+EObkKvbdbUbGwjsh
+DoCkKvbdHffyyXwg
+EPCjjvbdgGMZnHHA
+EPDKjvbdFejRmhsq
+DoCkKvbdQvmdCkgc
+DncLKvbdyNsHxShc
+DoCkKvbdrDeIpOWB
+EObkKvbdYzcGRiuy
+DncKjvbdMowqWNfs
+DoDLKvbdbsDLTcjB
+EPCkKvbdZQmEiNEq
+EObjjvbdNPwqWNfs
+DoDLKvbddeOrBwDK
+EObkKvbdrNZixkgi
+DoDKjvbdtlXvaUBX
+DncKjvbdtunYKRTA
+EOcLKvbdfSBWzkcP
+EObjjvbdVAbRTQrZ
+DnbjjvbdcJNKLFvx
+DncKjvbdssRsYyeD
+DoDLKvbdqTsgSSLU
+EPCkKvbdMowqVmgT
+DoCjjvbdDnbjjvbd
+EPCkKvbdlhdURUqa
+DncKjvbdqrVLOLAm
+DoDKjvbdNHDQNQUk
+EPCkKvbdXsLaMtOx
+EPCkKvbdRosgJfDw
+DncLKvbdKVuFcdgJ
+DoCjjvbdGGKRnItR
+DnbkKvbdeEnrCWcK
+EPDLKvbdlZSrTYgU
+EPCjjvbdtSrTYyeD
+DoCkKvbdZisHpHCG
+DnbjjvbdbrbkUDia
+DnbkKvbdhficYvKV
+EOcKjvbdsBfMlHLZ
+DoDKjvbdBdQBVjNG
+DnbkKvbdTvLpKUAq
+DoCjjvbdzaAPGgCM
+EObjjvbdiVZeWrVC
+EPCjjvbdZshiYcrn
+EObjjvbdRNXbYnUz
+EObkKvbdBcpBWJlf
+DncKjvbdtbcUvuoP
+DoCkKvbdmfeXmNgZ
+DncLKvbdbPfgELzd
+DncKjvbdZshiYdSn
+EObkKvbdDjHiuwjA
+DoDLKvbdfIKvRnRH
+DnbjjvbdiLeDmtcZ
+DoDLKvbdQwNcblID
+EObkKvbdmRyUzSdJ
+DnbkKvbdnHFYMnHZ
+EOcLKvbdfHjvSORH
+DncLKvbdlZSrSyHU
+EObkKvbdtSrSxzFD
+EObjjvbdZyEKNcLr
+EObkKvbdRkYeuHLT
+EOcKjvbdTkuoAuoJ
+DnbjjvbdEPDKkXCd
+EPCkKvbdnCJwXoOV
+EObjjvbdxrmiMqbH
+DoDLKvbdRaceMIyL
+EPDKjvbdRosgKFdX
+DoCjjvbdzoQQeDMY
+DncKjvbdZyEJmcMS
+DoDLKvbdOFDshiLE
+EPDKjvbdSQUGiedX
+EPCkKvbdTIyjRAAl
+EObjjvbdxUmFRYkn
+DncKjvbdmpZyWLYb
+DoCkKvbdygZMANEw
+DoDLKvbdhuZeWquC
+EObkKvbdFyUuAcxC
+DoCkKvbdiCPCeXQq
+DncKjvbdsCFlkfkZ
+EPCjjvbdNPwpvOHT
+DoCjjvbdSPtGjGDw
+DncLKvbdAMhZSvyx
+EPCkKvbdWXJYWDdg
+EPDKjvbdaogHDkzd
+DoDLKvbdRosgKFcw
+EPDLKvbdrRtjnKaN
+DncKjvbdvBEZSoEh
+DoDLKvbdmajXYOmu
+DnbjjvbdfNFwHMjL
+EPCkKvbdezuyEhtX
+DoCkKvbdHffzZYYH
+EPCkKvbdvAdYsOdh
+EPCjjvbdhlFDnVDZ
+DncKjvbdbiNKLFvx
+DoDLKvbdMIalQxAS
+EPDLKvbdGckWKBjK
+EOcKjvbdvOszqKnt
+DoCkKvbdraelkgKy
+EOcKjvbdMgComPtk
+DoDKjvbdOSsugFVQ
+DoCkKvbdyNrhYTJD
+EPCjjvbduDDVXWOo
+DncLKvbdiCPDFXRR
+DncLKvbdiGibyWKV
+EOcLKvbdfNGXHNJk
+EObkKvbdBhjakIej
+EPCjjvbdxmrhXriD
+DnbkKvbdJbibqKDY
+DnbkKvbdSCDdkhyL
+EPCjjvbdGFirOIsq
+DnbkKvbdKVtfDeHJ
+DoDKjvbdGKdrbhMu
+DncLKvbdZLrETmlN
+EObjjvbdjuvmcbXw
+DncKjvbdQdDApRDr
+EObkKvbdeATplwjG
+DoCjjvbdZMRdUNkm
+DoDKjvbdTqQoVVIN
+EPCkKvbdOTTufeVQ
+EPDKjvbdWRnXadlD
+DncKjvbdZsiJYdSn
+DoCkKvbdZLrDsnMN
+DoDKjvbdEKHiuwjA
+EPDLKvbdnBivxPOV
+EPCjjvbdddnrCWbj
+EOcLKvbdpssgSRkU
+EPCjjvbdzdzOzdyp
+EPCjjvbdZxcinClS
+DoDKjvbdvAcySoEh
+DnbjjvbdWHxWXfxz
+DoDLKvbdCWzdJEpW
+DoCjjvbdehLVqnRH
+EObjjvbdEXxLstTl
+EObjjvbdkMakzEfo
+EPCkKvbdKaKflbXq
+EPDLKvbdijFgjNYS
+DoCjjvbdZsiIxdSn
+DncKjvbdeATqNXif
+DncLKvbdzoPqEblY
+EObkKvbdLAjgNBwq
+DncKjvbdUxgsykPO
+DoDKjvbdaogGckzd
+DncKjvbdFVxpPmJe
+EOcLKvbdZLrDtNlN
+EObjjvbdYNqAXuWU
+DoCkKvbdEYYLstUM
+EObjjvbdeFPSBwDK
+DncKjvbdePEsKssr
+DncKjvbdZjTHogCG
+EPCkKvbdjKGHjNXr
+DoCkKvbdNrtVgFVQ
+DncLKvbdaMjaruNH
+DoDLKvbdwjwEHzzG
+EOcLKvbdTIzJqABM
+DoDLKvbdliETqVSB
+DoDLKvbdNrtVfdtp
+DnbjjvbdZxdKNcMS
+EPDLKvbdbUafxKsh
+DoCkKvbdVrNxCFMD
+DoCkKvbdxZgefYEr
+DoDKjvbdYTLaMsoY
+DncKjvbdeAURMwif
+EOcLKvbdNGcPmQVL
+EPDKjvbdqceJQOVa
+DncKjvbdRotHKGEX
+DoCjjvbdwNWAMdFN
+EPCkKvbdFyVVAcwb
+DoDKjvbdmozYvKyC
+DncKjvbdSPsgJecw
+EPDKjvbdZtJJYcrn
+EOcLKvbdGckWKCJj
+DoDKjvbdkxrrSxft
+DnbjjvbdRbDdlIxk
+DncKjvbdyYJJbPyk
+DnbjjvbdhgJcYvKV
+EObkKvbdjcLjqHUg
+EObkKvbdhgJbyWKV
+EObjjvbdrovPKCvG
+DoCkKvbdbBVdepQX
+DnbjjvbdUVkojTaR
+EPCkKvbdbUagYLUI
+DoDLKvbdptUGqqkU
+DoCjjvbdyTNhlqag
+DncKjvbdEYXlTssl
+EPCkKvbdXFxytAOs
+EOcLKvbdNdctIhkE
+EPDLKvbdkDMLRGuH
+EPDLKvbdDihJuxKA
+EOcLKvbdrafNMHLZ
+EPDLKvbdbKlFoODA
+DncLKvbdZLqcsnMN
+DnbjjvbdznpRFDLx
+DncLKvbdziuQPdSt
+EPCkKvbdbrcKsdKB
+DncLKvbdaMkCTUmH
+EPDLKvbdYkqdUOLm
+DoDKjvbdjhHLfGNk
+DoDLKvbdZMSDtNlN
+DnbjjvbdZjTHpHCG
+DoCkKvbdemFvgNKL
+DncKjvbdrRtkOLAm
+EPCjjvbdyNrhXsIc
+EObjjvbdgPazwDwh
+DoDKjvbdRDcAoqDr
+DoDKjvbdvvkaWBWV
+EOcKjvbdZRMdiNFR
+EPCkKvbddePRawCj
+DoCkKvbdHDjvKBij
+DnbkKvbdZirgpGbG
+EOcKjvbdhbPCeWqR
+DnbkKvbdNPwpvNfs
+EPCjjvbdZirhPfbG
+EOcLKvbdIGgZxwxH
+EPCkKvbdrykosBHn
+DoDKjvbdxnTIYShc
+DnbjjvbdNsTvGduQ
+DncLKvbdBcpAvJlf
+DnbjjvbdlqxtysDi
+DoCkKvbdOEdTiIjd
+DncKjvbdfHkVrOQg
+DoCkKvbdiHKDYvKV
+DoDKjvbdOTUVgFUp
+EObkKvbdaaVdfPow
+DncLKvbdZHXEAPTJ
+DnbkKvbdkIHLefNk
+DnbkKvbdjEjfuPAO
+EObjjvbdhtzFWqtb
+DoDLKvbdSQTfjFdX
+DncLKvbdHEKvKBjK
+DncLKvbdHDkVjBij
+EPDKjvbdRpTfiecw
+DnbkKvbdiBncEwQq
+EObkKvbdRadEkhyL
+EPCkKvbdezvYdiTw
+EOcKjvbdaMjasUlg
+EObkKvbdczZPwyQb
+EPCjjvbdTvMQJtAq
+EPCjjvbdJXtCIMRQ
+DoDLKvbdkDMKpftg
+EPCjjvbdiVZdvqtb
+DnbkKvbdtunXipsA
+DoCjjvbdjJehKNYS
+DnbjjvbdJvUeceHJ
+DoDKjvbdKRZdoFme
+DncLKvbdJcKCpjCx
+EPDKjvbdmbKXYPNu
+DnbjjvbdkIHLeenL
+EPDLKvbdNPxQunHT
+DnbjjvbdUtMtFkvK
+EPDLKvbdsPvPJcWG
+EObjjvbdMRvlzVQz
+DoCkKvbdsQWOjDWG
+DnbjjvbdXGZZtAPT
+DnbjjvbdunszpkOt
+DncKjvbdxZhFfXdr
+DnbjjvbdRzJgsCvA
+EPCkKvbdSCDdlIxk
+EPDKjvbdREDBPqES
+DnbjjvbdBvzdIdov
+DoDLKvbdSLYetfkT
+EObjjvbdKWVGDeHJ
+DoCjjvbduDDUvuoP
+EOcLKvbdWIYWXgYz
+DoCjjvbdbhmJjfWx
+EPDKjvbdIxUCILpp
+EOcLKvbdeXzTsrFz
+EPDLKvbdsBemLgKy
+EPCkKvbdzjVPpDrt
+DncLKvbdZyDimbkr
+DnbjjvbdRNYBxmtz
+EPCkKvbdvOszpkPU
+EObkKvbdSQTfiedX
+DncKjvbdZRNFIldq
+DoDKjvbdbhlijfXY
+EObkKvbdEzspeLcJ
+EPCjjvbdKCicRJbx
+EOcLKvbdOYOuzcnU
+DoCkKvbdhkddOVDZ
+DncKjvbdIxTahMQp
+EOcLKvbdwygeexFS
+EPCjjvbdKRZeOeme
+EPDLKvbdgPazvcxI
+DncKjvbdfNFwHMik
+EOcLKvbdtkwvaTaX
+EObjjvbdURQnuVIN
+DnbkKvbdiBncFWqR
+DncLKvbdaMkCStmH
+EPCjjvbdZjSgogBf
+DoDKjvbdMowpvOGs
+EPCkKvbdsrqsZZdc
+DnbkKvbdRpTfjFdX
+EOcKjvbdaMjbTVMg
+EOcLKvbdmgExMmfy
+DncKjvbdCJLCLJGK
+DoCkKvbdNeDshiKd
+DnbkKvbdGLFSbgmV
+EObjjvbdMtrrLNAX
+EOcKjvbdpedEsvAh
+DoDKjvbdcyxpXyQb
+EObkKvbdxZhGGXdr
+DoCkKvbdEztQdlCi
+EObkKvbdijFgilxS
+EPDLKvbdkHgMFenL
+EOcLKvbdlrYtysDi
+DncLKvbdjcLjpgVH
+DoCjjvbdnVVZkKRf
+EPDKjvbdFeirNhsq
+DnbkKvbdjblLRGuH
+EPDLKvbdtTSTZZeD
+DoDKjvbdVBCRTRSZ
+DncKjvbdTYLMNzjx
+DoCkKvbdEztQdkcJ
+EObjjvbdpfEFTuaI
+DncLKvbdYSlAmUPY
+DncKjvbdYpldiNFR
+DncLKvbdWXIwvDdg
+DoDLKvbdeXyssrFz
+DncLKvbdqdEhonVa
+EOcLKvbdNQYRVnGs
+EObjjvbdRpTgKGDw
+DoDKjvbdauCHXkUI
+DoDLKvbdhficZViu
+DnbjjvbdzoPpeCkx
+DoCkKvbdJYTaglQp
+DoDKjvbdnBiwYPNu
+EOcLKvbdMJCLqYAS
+EPCjjvbdYkrDsnMN
+EPCkKvbdehKvRmqH
+EObkKvbdVqmxCFMD
+DncKjvbdrDeJPmvB
+EPDLKvbdzaAOgHCM
+EOcLKvbdNPxQvNfs
+DncLKvbdFVxopMie
+EPDKjvbdgQBzwDwh
+EObjjvbdTfzmkvvF
+EPDLKvbdUaBprpqy
+DoCkKvbdnGdxNOGy
+DncLKvbdfIKurOQg
+EPCkKvbdKDJcRKCx
+EPCjjvbdmJEUQuSB
+DncLKvbdrafNMGjy
+EOcKjvbdZxdKNbkr
+DnbkKvbdJmADzGuB
+EPCjjvbdQvmdDMID
+DnbkKvbdemGWgNJk
+DncKjvbdyfxlAMdw
+EPCkKvbddtAUATNW
+DncKjvbdcasMrATm
+DoDKjvbdVhYVxHYz
+EPCjjvbdhyuFkpmf
+DoDLKvbdcbTMrATm
+EPCkKvbdILaznXRL
+DoDKjvbdRDbaQQcr
+DncKjvbdijFgjNYS
+EObkKvbdIMBznXRL
+EPCjjvbdxVNEpyLn
+DncLKvbdYkqctOMN
+EOcKjvbdxrmiNSBg
+EPDLKvbdtTRsYzFD
+EOcKjvbdzjVQQDsU
+EPCjjvbdZMRctNlN
+DncKjvbdXrlAmTnx
+EOcLKvbdbPgGdLzd
+EPDLKvbdFfJqmhsq
+EOcLKvbdyzdmqgiI
+DoCjjvbduCbtvuoP
+DncLKvbdNGcPlpVL
+EPCjjvbdGBOpyJzm
+EPCkKvbdRDcBPpcr
+EOcLKvbdRbEFLhyL
+EOcLKvbdePFTLTsr
+EObkKvbdcTCkUDjB
+DnbkKvbdrWokbhxq
+DncLKvbdqUTfrRjt
+EOcLKvbdRyihTDWA
+EObkKvbdpxnhHQdY
+DnbkKvbdrSUkOKaN
+DoCjjvbdIGgZyYXg
+DoDLKvbdMowqWNfs
+DoDKjvbdUxgtZkOn
+EObjjvbdUtNTelVj
+EObjjvbdlqxtyrdJ
+DncKjvbdkVvnDbYX
+EObjjvbdePFTKssr
+DoCkKvbdMuSrLNAX
+EOcLKvbdnQZyWLZC
+DoDKjvbdhgJcYujV
+DoDLKvbdaMjasVMg
+EPCjjvbdcScLUDia
+DnbjjvbdbKkeoNcA
+DnbkKvbdfpBzwEYI
+DoCkKvbdBhkBjhej
+DnbjjvbdkDMLRGtg
+EObkKvbdeATqNXjG
+EOcKjvbdFkFSbglu
+DnbjjvbdznpQdcMY
+DncLKvbdIidAJpHE
+DoCjjvbdLZQirzuG
+DnbjjvbdzjUopDrt
+EOcLKvbdnUuZjiqf
+DoDLKvbdwyhFeweS
+DoCkKvbdaoffckzd
+EObkKvbdzaAPGgCM
+EObkKvbdEzspdkcJ
+DnbjjvbdDjHiuxKA
+DnbkKvbdVqmxBdlD
+EOcLKvbdrJAKFMne
+EOcKjvbdZjSgofbG
+EPCjjvbdfMfWgNJk
+DoCkKvbdTukpJsaR
+DoCjjvbdySmiNSBg
+DnbkKvbdzGyMANFX
+EObkKvbduWNxKQsA
+DoDKjvbdRkZFuHLT
+DncLKvbdbKlGOmcA
+DncLKvbdyNsIXsJD
+DnbkKvbdMpXqWNfs
+DoCkKvbdHEKujBjK
+DncLKvbdDxXktTsl
+EPCkKvbdACrYJyiQ
+EOcKjvbdqUUHSRjt
+DoDLKvbdOFDsiJLE
+EObkKvbdrbGMlGjy
+DoCjjvbdjblKpgUg
+EPCkKvbdiHJcYujV
+EPDKjvbdrDeJQNvB
+EPDLKvbdbrbkTdJa
+DnbkKvbdNeDtIhkE
+DnbkKvbdcJNKKevx
+EPCjjvbdxVNFQxkn
+EObjjvbdhyuGLqOG
+EOcKjvbdrafMkfkZ
+EObkKvbdRkYetgKs
+DnbjjvbdUWLoitBR
+DoCjjvbdQvmcblID
+EOcLKvbdDoDLLXCd
+DncLKvbdzRPMiJwA
+DoCkKvbdsZkoraHn
+DoDKjvbdkHgMGFnL
+EObkKvbdrbFmMGjy
+DnbkKvbdRWnDbkhD
+EPDKjvbdJbicRJbx
+DncKjvbdGZUuAcwb
+DoCjjvbdmfdwmNfy
+DoDKjvbdBdQAujNG
+EPDLKvbdwWlAuaVu
+DncLKvbdxmrgxSiD
+DoCkKvbdUsmUFkuj
+EOcKjvbdcTDKsdKB
+DnbjjvbdjcLkRHVH
+DoDKjvbdbiMijewY
+EPCjjvbdPyNAHSrK
+DnbjjvbdFkErcINV
+EPDKjvbdZQldhmFR
+EPDKjvbdTJZjRABM
+EOcKjvbdKaKgMaxR
+DoCjjvbdwzHefYEr
+DoDLKvbdDwxLtUUM
+DoCkKvbdfILWRmpg
+DoCkKvbdRyihTCvA
+DoDKjvbdSQUGjFcw
+DoCjjvbdEYXktUTl
+EPCjjvbdoznEKxPA
+EPDLKvbdSiZiqABM
+EObkKvbdVUNUFkuj
+DncKjvbdMfbpNQUk
+DncLKvbdEvYopMie
+DnbjjvbdMowpvNgT
+DncLKvbdKjaHvAKZ
+DoDKjvbdqmZjZMIJ
+EObjjvbdGcjuibJj
+DoDLKvbduLwvaTaX
+DoCkKvbdHgHZyYYH
+EObjjvbdEOcKjwCd
+EPCjjvbdGckWKCKK
+EObkKvbdEuyQQMie
+DnbjjvbdHgGzZYYH
+EObjjvbdVUMsekuj
+EObkKvbdWWiXucdg
+EPDKjvbdRWnECkgc
+EPDKjvbdxZgefYFS
+DnbkKvbdEuyPomKF
+EPCjjvbddePSCXCj
+DoDKjvbdUsltFlWK
+DnbkKvbdbsDKtEJa
+EObkKvbdmoyyWLZC
+DoDKjvbdSCDeMJZL
+DnbkKvbdwtleRYkn
+EPDLKvbdJpzEnfNe
+DncKjvbdZisIQGbG
+DoCjjvbdiUzEwRtb
+DncKjvbdrounicVf
+DncLKvbdmIdURVRa
+DoDKjvbdYSlBNUPY
+DnbjjvbdKDKDQibx
+DoDLKvbdnCJvwoOV
+EPDKjvbdgFlZmfgA
+DoDKjvbdTukojTaR
+DnbjjvbdVAbQsQqy
+EOcLKvbdtAHRIABS
+DnbjjvbdmbJvwnnV
+EOcKjvbdvBDxrneI
+DnbjjvbdeJirWUzn
+DnbjjvbdKeegaaQu
+DnbjjvbdzQoMiKXA
+DnbjjvbdxwiJbPyk
+EPDLKvbdKNADzHUa
+DoCkKvbdANHyTXZx
+EObkKvbdxLXDgzyf
+EOcKjvbdpxoHgQcx
+DncKjvbdLBKflawq
+EPDKjvbdhanbdwQq
+DnbkKvbdEASIlyvw
+EPCkKvbdwzHfGYEr
+EOcLKvbdqZPHgQdY
+EPDKjvbdqTtGqqjt
+DoCjjvbdDxXksssl
+DoDKjvbdQlwayNtz
+EOcKjvbdTvLoitAq
+DnbkKvbdirzhsKiz
+EPDKjvbdyzeORghh
+DncLKvbdmJDsqVRa
+DncLKvbdKefICAqV
+EOcLKvbdZnmheFZj
+DoDKjvbdIxUCILpp
+DncLKvbdxsOIlrBg
+DoCkKvbdiVZdvqtb
+EPDLKvbdbBWEfQPw
+EObkKvbdsCFllGkZ
+EObkKvbdNdctIiKd
+EObjjvbdozmcjwoA
+EPDLKvbdlhdTqUqa
+EOcKjvbdbUagYKsh
+DnbkKvbdJpydoGOF
+DnbkKvbdnGeYMmfy
+DncKjvbdtlXwBUAw
+DncKjvbdqiAJdlne
+EPCkKvbdMIakqYAS
+DnbkKvbdCWzchdov
+EObkKvbdelewHNJk
+EPCjjvbdFpASvgFy
+DoDLKvbdVrNxCFMD
+DnbkKvbdMpYQvNfs
+EPCkKvbdEObkKwDE
+EPDLKvbdHDjuibJj
+EPCjjvbdKaLHMaxR
+DoDKjvbdakLfOmcA
+EPDLKvbdMgDQNQVL
+DoCjjvbdEvYpQNKF
+EPDKjvbdrEEhpOVa
+EOcLKvbdOFDsiIjd
+DncKjvbdtTSTYyeD
+EObjjvbdQvnDblHc
+DoDKjvbdVrNwbElD
+EPCjjvbdZMRdUNkm
+DoCjjvbdhfibxujV
+DnbjjvbdYpmFJMeR
+DncLKvbdDihKVxKA
+DoCjjvbdrNZjYkgi
+EOcLKvbdYqNFImEq
+DoDLKvbdJbjDQjCx
+DoDKjvbdwygefXeS
+DncLKvbdUyHsykPO
+DncLKvbdJSyBTMxM
+EPDKjvbdcImKKfXY
+EPCjjvbddndsLTtS
+DoDLKvbdEASIlzWw
+EObjjvbdrylQTAgn
+DoDKjvbdFkFTChMu
+DncLKvbdUaCQrprZ
+DnbjjvbdOFEThhjd
+EObjjvbdlYsRrxgU
+EPCkKvbdnGeYNOGy
+DoDKjvbdwygefYEr
+DoCjjvbdGckViajK
+DoDKjvbdSZjITDWA
+EObjjvbdkWXNdCXw
+EPCkKvbdKjaIWAJy
+EObkKvbdKkBIWAKZ
+DoDLKvbdptTfqrLU
+DoDKjvbdPxmAGsRj
+EObkKvbdTvMPitBR
+EPCkKvbdegjvSOQg
+DoDKjvbdwNWANEEm
+EOcLKvbdRNXbYmtz
+DoDKjvbdEOcKjwDE
+EPDLKvbdfMfXHMik
+DoCkKvbdWHwvXfxz
+EPCjjvbdelfWgNKL
+EPCjjvbdqcdiQOVa
+DncKjvbdkyTSTZGt
+DoCkKvbdbAueFpPw
+EOcKjvbdQwNdClHc
+DnbjjvbdxmsIYSiD
+EPDKjvbdCTAbtFwS
+DncLKvbdJpzFOeme
+EOcKjvbdiZuGLqOG
+DncKjvbdKaLHMaxR
+EPDLKvbdbiMjLFvx
+EPCkKvbdjvXODaxX
+EOcLKvbdOAJSsirA
+EPDKjvbdqYnhHQdY
+DoCkKvbdDwwlTtUM
+DnbkKvbdRjxfVHKs
+EObjjvbdzjUpPcrt
+EOcLKvbdeUAUATNW
+EObkKvbdQlwaxmtz
+EObkKvbdEXxLtUUM
+EObkKvbdYkrETmkm
+DoCkKvbdxmsHwsIc
+DoDKjvbdzjUoocrt
+EPDKjvbdqGEFTuaI
+EPCjjvbdbiMjLGXY
+EPDKjvbdfpBzwEXh
+DncKjvbdZeYGzhJC
+DoCjjvbdFkEsCglu
+DncKjvbdOFDshhjd
+DncKjvbdZMRcsnMN
+EPCkKvbdrEFJPnVa
+DoCkKvbdcyyPxYpb
+EPDLKvbdijGIKMwr
+DoCjjvbdbAudepQX
+DncLKvbdFejSOItR
+EOcKjvbdSLZGVHLT
+EPDKjvbdMJBkpxAS
+DncKjvbdJXsaglQp
+DnbkKvbdjcMLRHVH
+DoCkKvbdFjeTCgmV
+DnbjjvbdqUTfrRkU
+DnbjjvbdznoqFCkx
+EObkKvbdVqnYBeLc
+DoDLKvbdaMjbTVMg
+DoCkKvbdSQUHKFdX
+DoCjjvbdrDdhomua
+DncLKvbdcTCjsdJa
+DoCkKvbdsCFlkgKy
+EPCkKvbdmbKWwnmu
+DoCjjvbdZQmFImEq
+EPCkKvbdyXiKCPzL
+EOcLKvbdKQzEnenF
+EPCjjvbdrbGNMGjy
+EPDKjvbdgGMZnHHA
+EOcLKvbdfHjuqnRH
+EOcLKvbdFeirNiUR
+DoCjjvbduaEZSoFI
+DncKjvbdbAudfPow
+DoCkKvbdbiMikFwY
+DoDLKvbdcyxpYYqC
+DnbjjvbdpxoHfpdY
+DncKjvbdqUTgRqjt
+DoDKjvbdcImKKfWx
+DnbjjvbdmfeYNNfy
+EPCjjvbdIjEAJofd
+EObjjvbdLBKgNCXq
+EObjjvbduLxWaUAw
+DnbjjvbdJTZBTNXl
+DoCkKvbduaDyTOeI
+EOcLKvbdUyIUZkPO
+EOcLKvbddePRawCj
+EPDKjvbdhbObeWqR
+EOcKjvbdBdQAvJmG
+EOcKjvbdkVwODaww
+DnbkKvbdUVkoisaR
+DnbkKvbdMoxQvNfs
+EObjjvbdCJKbLIfK
+DncKjvbdYpmFJNEq
+DoCjjvbdjKFhKMxS
+DnbjjvbdZLrEUNlN
+EPDKjvbdwuNFRZMO
+EObjjvbdjuvnECXw
+EPCkKvbdlZTSTZGt
+DoCjjvbdsQVoJcWG
+DncLKvbdmJETqVSB
+DnbjjvbdjggLfGOL
+EObjjvbdxwiKBpZk
+DoDLKvbdKDKCpjDY
+EPCjjvbdzRPNIjXA
+DoCkKvbdkaMoNALA
+EPCkKvbdjvWnDaww
+EPCkKvbdSBcdkiZL
+DnbkKvbdbUbHXkUI
+EOcKjvbdURROtuHm
+DncLKvbdJmAEZgVB
+DoDLKvbdDxYLsssl
+DncKjvbdWRnXadlD
+EPCjjvbdADSXiyhp
+DnbkKvbdNGcPlouL
+DnbjjvbdBsAcTevr
+EObjjvbdWWhwvDeH
+EOcLKvbdbUafxKsh
+DoCkKvbdtcCuXWOo
+EOcKjvbdbKkennDA
+EPDLKvbdGcjujBjK
+DoDKjvbdRWmdDMHc
+EPCkKvbdmSZUyrdJ
+DoCkKvbdLZRKSztf
+DncKjvbdZQmFJNFR
+EPDLKvbdjhGkefNk
+DncKjvbdeATpmYJf
+EPCkKvbdDjHivXjA
+EObjjvbdFyVVBEXb
+DncKjvbdIHHZxxXg
+DnbjjvbdMoxQvNfs
+EObjjvbdlYsRsZGt
+EOcLKvbdZHWdAPTJ
+DoCkKvbdoznDjwoA
+EOcLKvbdYpmEiNEq
+EOcLKvbdfMfWgNJk
+DnbjjvbdjlalZeGo
+EPDLKvbdVgxVxGxz
+DoDKjvbdZRMdiMeR
+DnbkKvbdNsUVgFUp
+EObjjvbdNGcPmPuL
+EPDLKvbdrSUjnKaN
+DncKjvbdMgDPmQUk
+DoDLKvbdRkZGUfkT
+EOcLKvbdpxoIGqDx
+DoCkKvbdVwIxVcdg
+DoDKjvbdZQmFIleR
+EPDKjvbdZshiZDrn
+EPCkKvbdFWZPpNJe
+DnbkKvbdcImKKfXY
+DoCkKvbdiVZeWqtb
+EPCkKvbdkxsSSyHU
+EObkKvbdcSbkTdKB
+EOcKjvbdFxttaEYC
+EPCkKvbdhtzEwSVC
+EOcKjvbdLAjgNBwq
+DoCkKvbdZisHofbG
+DoDLKvbdIsYaTNYM
+EPDLKvbdADRxJzIp
+DoDKjvbdTkuoAvOi
+EOcLKvbdZRMeJMdq
+EPDLKvbdWWiXvDdg
+DnbjjvbdbsDKscjB
+DnbkKvbdtlXwBUBX
+EPCjjvbdmgFXlmgZ
+EObkKvbdjmBlZeGo
+EObkKvbdmgEwmOGy
+DoCjjvbdtlXwBTaX
+EPDKjvbdSiZiqABM
+EPDLKvbdEXxMTssl
+EPCkKvbdRWmccLhD
+DncLKvbdrWpMDJZR
+EPDLKvbdelfXGlik
+EOcLKvbdFjdsChNV
+EPCkKvbdVUMtFkuj
+DoDLKvbdtkxXBUBX
+DncLKvbdMgDQNPtk
+DnbkKvbdMJCMQxAS
+EOcLKvbduWOYJpsA
+EPCjjvbdZxcimcMS
+DoDKjvbdqrUjmkAm
+EObjjvbdRzJgsCvA
+EOcLKvbdiBoDFXRR
+EPCjjvbdSPtHKFcw
+DncKjvbdbBVeGPpX
+DnbjjvbdRotGiedX
+DoDKjvbdIHGzZYXg
+DnbjjvbdiGjCyViu
+EPCjjvbdSxKkmzjx
+EPCjjvbdmajWwoOV
+DnbjjvbdmbKWxPNu
+EObkKvbdCTBCsfXS
+DoCjjvbdKQzEnfOF
+EPCkKvbddijRutzn
+EObkKvbdFjeTCgmV
+DnbjjvbdURQnuUhN
+DnbkKvbdiCOcFXRR
+EObkKvbdJutfEEfi
+DncLKvbdhtydwRuC
+DoCjjvbdcTCjsdJa
+DnbjjvbdzoPqEcMY
+DoDLKvbdSCDdlJZL
+EOcKjvbdlhctQuSB
+EPDKjvbdOFETiJKd
+EObkKvbddZyQYZQb
+EOcLKvbdrMyjYlHi
+DoDLKvbdqrVLOLBN
+DncKjvbdyNsHwriD
+EObkKvbdQvnECkgc
+DnbkKvbdznopeClY
+DoCkKvbdCJLBjiGK
+EOcLKvbdauCGxKtI
+EPCjjvbdeFOrCWcK
+DncLKvbdcSbjtDia
+DnbkKvbdKWVGDdgJ
+EPDKjvbdrDdiQNua
+DncLKvbdqTtGqrKt
+DoDKjvbdjJfIKMwr
+DoCkKvbdkxsSTZHU
+EObkKvbdFejSNhtR
+DoDKjvbdnCKWxOmu
+DoDLKvbdvBDySneI
+DncKjvbddZxpXyRC
+EPDKjvbddwzTsqez
+DoDLKvbdLFfIBaQu
+DncLKvbdwzHeewdr
+DncLKvbdOFEUJJKd
+DoDLKvbdEvZQQMie
+EPDLKvbdWHxVwgYz
+DoCjjvbdiGjCxujV
+EPDKjvbdrovPJcWG
+DoDLKvbdZxcjOCkr
+DnbjjvbdRzJgsDWA
+DoDLKvbdiZuGLpnG
+DncLKvbdTukoitBR
+DnbkKvbdnBiwXnnV
+DoDKjvbdBvzdIdov
+EObkKvbdRWnECkhD
+DoCkKvbdRbDeMJZL
+DncKjvbdiGjDYujV
+EPCkKvbdNdctIiLE
+EPCjjvbdKWUfDdfi
+EOcKjvbdkIGlGGNk
+EPDKjvbdGZVVBDxC
+EObkKvbdXsMBNUOx
+EObjjvbdANHxrvyx
+EPDKjvbdZtIhyDrn
+DoCkKvbdRWmdCkgc
+EObkKvbdffLynGgA
+DoDKjvbdIxTahMQp
+DncKjvbdKQzFPGOF
+DoDKjvbduDCtwWOo
+EOcKjvbdnCJvxOmu
+DoCjjvbdEJgivXjA
+DncKjvbdemGWgMjL
+DncKjvbdCDpBVjMf
+DncLKvbdmoyxukZC
+EOcLKvbdtkwwBTaX
+DoCkKvbdLqwMzUpz
+DncLKvbdqFdFUWBI
+EPDLKvbdZyEJmblS
+EOcKjvbdEzsqFMCi
+DoCkKvbdcarmSATm
+DncLKvbdFfJqmiTq
+DncLKvbdKQzEoGNe
+DoCjjvbdUaCRTRSZ
+EOcLKvbdqZOhGqEY
+DoCkKvbdZisIQGaf
+DoCkKvbdeFOrBwCj
+DoDLKvbdmIctQtqa
+EObkKvbdxVMdqYkn
+DncKjvbdwygfFxFS
+DoCkKvbdRWnEDLhD
+EOcKjvbdmRyUyrci
+DoCkKvbdWXIwvDeH
+EPDLKvbdRXODcLgc
+DoDLKvbdBsBDUGWr
+EOcKjvbdEvYopNJe
+DoCjjvbdBvzdIdov
+DoCkKvbdyzeNrIJI
+EObkKvbdCJKbKhej
+EObjjvbdQccBQQcr
+DnbkKvbdxZgeewdr
+DoDKjvbdqcdhpNua
+DoCjjvbdeJjSVtzn
+DncKjvbddneTKssr
+DnbjjvbdZxcjNbkr
+EPCjjvbdZisIPfaf
+EPCkKvbdkyTRrxft
+DncKjvbdVwIxVcdg
+DncLKvbdIxTagkpp
+EPCjjvbdbrbjtEJa
+DncKjvbdkCkjqHUg
+DoCkKvbdUxgsyjnn
+EObjjvbdUaCRSprZ
+DnbjjvbdMJCLpxAS
+DncLKvbdliEUQuRa
+EPCkKvbdANHxrvzY
+EPCjjvbdeAURMwjG
+EPDKjvbdZoOIeEzK
+DoDKjvbdmuVZkJqf
+DncLKvbdaNLCTUlg
+DoCkKvbdnQZxvLYb
+DncLKvbdhficZWJu
+DncKjvbdatbHYLUI
+DoCjjvbddndrjtUS
+EOcLKvbdsBfMkgKy
+DnbjjvbdBiKakIfK
+DnbjjvbdSQTfjFcw
+DoCjjvbdmoyxvKyC
+DoCkKvbdGcjuibKK
+DnbkKvbdZQldiMeR
+EObkKvbdqquKnKaN
+DoCjjvbdZRNEhldq
+EPCjjvbdBiKbLJFj
+EPCjjvbdyXhjCPyk
+DncLKvbdtTSSxzEc
+EPCjjvbdnCJwXnmu
+DoDLKvbdbBWEfQPw
+EOcLKvbdemGXHNKL
+DoDLKvbdmfdxMnGy
+EOcLKvbdTqQntthN
+EOcLKvbdrMyixlIJ
+EOcLKvbdVUMselWK
+EOcLKvbdBvzchePv
+DoCjjvbdbVCHXjsh
+EPCjjvbdZRMdhleR
+EOcLKvbdhbObeXRR
+EPCkKvbdFWZPpMie
+DncLKvbdXFyZtAOs
+DnbkKvbdTqQoUuHm
+EPCjjvbdCSaDUFvr
+DoDKjvbdQZNAHTSK
+EOcLKvbdmoyyVkZC
+DoCkKvbdGLErbhMu
+EOcLKvbdtvNwjRTA
+EObkKvbdFjdsDINV
+EOcKjvbdeOdsLUUS
+DncKjvbdMtrrKmAX
+EObkKvbdBsBCtGWr
+EOcLKvbdVBCRTRSZ
+DoDKjvbdKQydoFme
+DncLKvbdnHFXmOGy
+DnbkKvbdGAnqYizm
+EOcLKvbdjlakzEfo
+EOcKjvbdegkWSOQg
+DoCjjvbdtkwwAsaX
+EPCkKvbdeKKSWUzn
+EObjjvbdrRtjnLBN
+EPCkKvbdeATqMxKG
+DnbkKvbdZMRdTmlN
+DoDKjvbdNsUWGeVQ
+EObjjvbdyXiKBpZk
+EOcLKvbdJKEAJpHE
+DoDKjvbdzQoNJJwA
+DoCkKvbdwygeewdr
+EObkKvbdsCGNMHKy
+EOcLKvbdlhdUQuRa
+EObjjvbdyNsHwsIc
+DoDLKvbdWRnXbFLc
+EObjjvbduCcUvvPP
+EOcLKvbdrEEhonWB
+EPCjjvbdRjyFtgKs
+EPCjjvbdkNCLzFGo
+DoCkKvbdRDbaPpcr
+DoDKjvbdQdCaQQdS
+DncKjvbdwyhFexFS
+EPDLKvbdBhjakJGK
+EPDKjvbdaNKaruMg
+EObkKvbdzQnliJwA
+DnbjjvbdptTfrSLU
+DoDKjvbdFWZPpNJe
+EObkKvbdZxcjOCkr
+DoDKjvbdehLWRnQg
+EOcLKvbdcSbkUEKB
+EObjjvbdbUafxLTh
+EObkKvbdBcpAvKNG
+DoDLKvbdySmiNSBg
+DncLKvbdmIdUQuRa
+EPCkKvbduDDUvuoP
+DoDLKvbdMtrqjmAX
+DoDLKvbdVZHtZkOn
+EOcLKvbdiZuGLpnG
+EOcKjvbdxmrgxShc
+DoCjjvbdMpYQvNfs
+EOcKjvbdCIkCKiFj
+EPDLKvbdaaVdepPw
+EObkKvbdXFyZtAOs
+EPDLKvbdbKlFnnDA
+DncLKvbdqGEFTuaI
+EOcKjvbdqFcdsvAh
+EPCkKvbdcSbkUDjB
+DncKjvbdrJAJeMoF
+EObjjvbdZMRdUNkm
+DncKjvbdCEPaVjNG
+DnbjjvbdptUHSSLU
+EPCkKvbdUtNTekuj
+DoCkKvbdVqmwadlD
+EObjjvbdCIkBjiFj
+EOcLKvbdbVCGwkUI
+EObjjvbdFfKSNiTq
+EPDKjvbdJXtCHlRQ
+EPDKjvbdTvMQJtBR
+EPCjjvbdZMRdTnLm
+EPCjjvbdemGXGljL
+EPDKjvbdxmsHxTJD
+EOcKjvbdiVZdvrVC
+DnbkKvbdmSZUzSdJ
+EPCkKvbdUaCRTRSZ
+DncLKvbdoAKztIDn
+EObjjvbdHffyyXxH
+EPCkKvbdaMjbStmH
+EObjjvbdZyDinDMS
+DoDKjvbdjlbMZdgP
+DncKjvbdQwOEDMHc
+DncLKvbdGLFSbgmV
+EPCkKvbdjvXOECXw
+DoCkKvbdSBceLhyL
+DoDLKvbdEvYpPmKF
+EOcKjvbdrbFlkfkZ
+EPDKjvbdTvMQJsaR
+DncLKvbdjvXNcaxX
+DnbkKvbdijGIKNXr
+EOcLKvbdiHJcZViu
+DoCjjvbdlqxuZsDi
+DnbkKvbdhuZeXRtb
+DncLKvbdACqxJzJQ
+EObjjvbdjlbLydgP
+EPDKjvbdxZgefXdr
+EOcKjvbdSCEFLiYk
+EObjjvbdKefICApu
+EPDKjvbdjlbLyeGo
+DncLKvbdbAvEepQX
+EPCkKvbdrSVKnLAm
+DncLKvbdZjTHpHBf
+DnbkKvbdCWzdIdov
+DoDLKvbdxUmFQyLn
+DnbkKvbdxVNFRYkn
+DoCkKvbdZisHpHCG
+DoDKjvbdwkXEHzzG
+DoCjjvbdSPtHJedX
+EOcLKvbdBiLBkIej
+DoCkKvbdiLdcnVCy
+DnbkKvbdlhcsqUqa
+EPCjjvbdwzIGFxEr
+EPCkKvbdySmiNRag
+DncLKvbdHEKujCKK
+EPDLKvbddeOrCXDK
+DoDLKvbdNGbolpUk
+EOcLKvbdtlYXBTaX
+EOcLKvbdqwQLcIyR
+EObjjvbdIrxaSlxM
+EObjjvbdbrcKtEKB
+EOcKjvbdpxngfqDx
+DoDLKvbdKfFhCApu
+DoDLKvbdJvUfEEfi
+DncKjvbdsQWOibuf
+DoCjjvbdHgGyxxXg
+DoCkKvbdZHWdAPTJ
+DncKjvbdauBgYLTh
+DoDLKvbdJYUCIMRQ
+DncKjvbdbrbjtEJa
+DnbjjvbdemFwHNJk
+DnbkKvbdBvzcheQW
+EPCkKvbdJqZePGNe
+EPCkKvbdSKxeuGkT
+EPDLKvbdIryBTMxM
+EPCjjvbdwWlAuaVu
+EOcLKvbdyTOJNRbH
+EPCjjvbdQvmdClID
+DnbjjvbdyTOJMqag
+DncKjvbdrXQMDJYq
+EPCkKvbdGdLVjBij
+EOcLKvbdjJehJmXr
+DnbkKvbdCJKakJGK
+DoCjjvbdLrWlzUpz
+EPCkKvbdhzVFlRNf
+DoCjjvbdRDcApRES
+EObkKvbdzROmJKXA
+DncKjvbdxUmFRYlO
+EPCkKvbdURQoVVIN
+EPDLKvbdVZHtZkPO
+DnbkKvbdatafwjsh
+EObjjvbdNrtWGdtp
+DoDLKvbdBiLCLJFj
+EOcKjvbdmgFXmOHZ
+EObjjvbdZRMeImEq
+DoCjjvbdiMEdNtcZ
+DnbjjvbdgFkzNfgA
+DnbjjvbdGKdsDHmV
+DncLKvbdIxUBhMRQ
+DoDLKvbdjSzhrjiz
+DoDLKvbdpyPHgRDx
+DoDLKvbdqYoIGpdY
+DoCkKvbdUQqPUuHm
+EPCkKvbdBraDTfXS
+DncKjvbdNrtWGeUp
+DncKjvbdJqZdnenF
+EPCjjvbdCWzdIePv
+DoDKjvbdrXPlDIxq
+EPDKjvbdauBgYLUI
+EPCjjvbdQmXbYnUz
+DoCjjvbdGGJqnJUR
+EPDLKvbdkVvnEBww
+EPCjjvbdTukoitBR
+DoCjjvbdRkZFtgLT
+DoDKjvbdEuyPpMie
+EPCkKvbdSLYfUgLT
+DnbjjvbdIwtBglQp
+DnbkKvbdznpQeDMY
+EOcKjvbdznpRFCkx
+EPDLKvbdtumwjQsA
+DoDLKvbdBhjajiGK
+DoDKjvbdhlFDmuDZ
+DnbkKvbdqquKnKaN
+DncLKvbdMowqVmfs
+EOcKjvbdqrUjnLAm
+EObjjvbdqwQMDIyR
+EPDKjvbdnCKXYPOV
+DnbkKvbdHffyyXxH
+DoCjjvbdlZSrTZGt
+DoDLKvbdznpRFDMY
+EPDKjvbdWWiXvDdg
+DoDKjvbdRWnEClID
+DnbjjvbdJcKCqKDY
+EPDKjvbdJbjDQicY
+DncLKvbdhaoDEwRR
+DncLKvbdvAdZSoEh
+DncLKvbdeEnrCWbj
+DoDKjvbdVvhwvDeH
+EOcKjvbdVAapsQqy
+EPCkKvbdxnTIYSiD
+EPCkKvbdrouoJbuf
+EObjjvbdePEsKtUS
+EPDLKvbdirziSkJz
+DnbjjvbdhaoCdvqR
+EPCkKvbdGZVVAdYC
+DncKjvbdtbbuWuoP
+DoCkKvbdLFehCBRV
+DoDKjvbdLZRJrztf
+EObkKvbdkHflGFmk
+EOcKjvbdJYUCIMQp
+EPDLKvbduCcVXWOo
+EPCkKvbdptTfqqkU
+DoDKjvbdGQATWgGZ
+DncKjvbdEztQeMCi
+EObkKvbdZtJJZETO
+DoCjjvbdZsiIyETO
+EObkKvbddndrjstS
+EOcLKvbddeOqbXDK
+DnbkKvbdCTBDUGXS
+EPDKjvbdQlwayOUz
+EPCjjvbdlqyUzTEJ
+DoDLKvbdhtydvrUb
+EOcKjvbdlZTSSyGt
+EOcKjvbdmJDtQuSB
+DnbjjvbdtSqsZZeD
+DoDLKvbdUaBpsRSZ
+EPDKjvbdLGFhBaRV
+DnbkKvbdSBcdkhxk
+DoCjjvbdDoDKkXDE
+DoDKjvbdwyhFfYFS
+EPDKjvbdOEctJIjd
+EPCjjvbdEObjkWcE
+EPDLKvbdhtzEvquC
+EObkKvbdZjShQHCG
+EPCjjvbdmIctQuRa
+EPCkKvbdVwIwucdg
+EOcLKvbdADRxJzJQ
+EOcLKvbdWWiXvEEg
+EPCjjvbdTAFIhBoE
+EPDLKvbdZLqdTnMN
+EPDLKvbdZQldhmEq
+EOcKjvbdLLBIWAJy
+DncLKvbdrMzKYlIJ
+EPCjjvbdzitoodSt
+EPDLKvbdLFehCAqV
+DoCkKvbdrMyiyMHi
+EPDKjvbdkVvmcaxX
+EOcKjvbdmpZxvKxb
+EPCkKvbdliDtRUrB
+DncLKvbdkxsRsYft
+EPDKjvbdTqROuVHm
+EPCjjvbdSQTgJedX
+EPDLKvbdHlBznXRL
+DncKjvbdQdDBQRDr
+EPDLKvbdliDsqVRa
+DoDKjvbdjgflFfOL
+EPDKjvbdeEoSCWbj
+DnbkKvbdfSBWzkcP
+EObkKvbdmIcspuSB
+EPCjjvbdvAdZTPEh
+DoCkKvbdIGfyxwxH
+DnbjjvbdWWiYWDeH
+EObkKvbdZQleImFR
+DncLKvbdQwNdCkgc
+EOcLKvbdQdDBPqES
+DnbjjvbdrpWPJbuf
+DoCkKvbdTulQKTaR
+DoDLKvbdeUAUASlv
+EPCjjvbdZQmFJNEq
+DncLKvbdVBBqSqSZ
+EOcKjvbdqceJPmvB
+DncLKvbdZtIiYcrn
+EOcLKvbdJSxaSmYM
+DoCkKvbdqqtkOLBN
+EObkKvbdgFkymfgA
+DnbjjvbdVqmwadlD
+DncLKvbdsBfNMGkZ
+EPDKjvbdEPDKjwCd
+EObjjvbdHDjvKBjK
+DncLKvbdCTAbsevr
+EObkKvbdFxuUaEXb
+DoCjjvbdcyyQYZQb
+EObjjvbdZsiIxdSn
+EPDLKvbdZQmEhmEq
+DnbkKvbdxnTIXriD
+DncKjvbdfHkVrORH
+EOcKjvbdddoSCXDK
+EPCkKvbdhanbdvpq
+EOcKjvbdRyihTDWA
+DnbjjvbdajkeoODA
+EOcLKvbdlhdTpuSB
+EPDLKvbdhgJbxuiu
+EPCjjvbdnHFXmNgZ
+EPCkKvbdpecdsvAh
+DnbkKvbdVZIUZjnn
+DncKjvbdbAvFGPpX
+DnbjjvbdkMalZeHP
+EOcLKvbdYSlAmUOx
+DoCjjvbdHDkWKCKK
+EPDLKvbdaRecHsek
+EPCjjvbdJXsagkqQ
+EObjjvbdRMwbZNtz
+EPCkKvbdrbGMlHKy
+DncLKvbdKfGICApu
+EPDLKvbdUtNTfLvK
+EPCkKvbdMJCMRYAS
+EOcLKvbdCJKbLJFj
+DoDKjvbdfpBzvcxI
+EObkKvbdYpldhmFR
+EOcLKvbdSPsfiecw
+DoCjjvbdHEKvKCKK
+DnbjjvbdUGzmkwVe
+DnbjjvbdfMfXGmJk
+DnbkKvbdZoOIeEyj
+EObkKvbdZnmhdeZj
+EOcKjvbdTkuoBVoJ
+EPCjjvbdGKdsChMu
+DoDLKvbdJYTahLpp
+EPCjjvbdbhmJkFwY
+DoDLKvbdkIHMGGOL
+EPDKjvbdZsiIxdSn
+EPCjjvbdMgCpNQUk
+DncLKvbdjblKqGtg
+DncLKvbdOYOuzdNt
+DncKjvbdTvMPjTaR
+EPDLKvbdiiehKNXr
+DoCjjvbdZdxGzghb
+DoDLKvbdeOdsKssr
+DoDLKvbddBsMrAUN
+DoCkKvbdxxIjBozL
+DoDKjvbddoErkUTr
+EOcLKvbdwzIFeweS
+DoDLKvbdREDBQRES
+EObkKvbdhlEdOUby
+DoCjjvbdNPxRWNgT
+DoDLKvbdZLqctNlN
+EObjjvbdbUbHXkUI
+DnbkKvbdhtydwSVC
+EPDKjvbdeUAUASmW
+EObjjvbdhgKDYvJu
+EOcLKvbdZnmhddyj
+DoDLKvbdUVlQKUAq
+DoDKjvbdDihJvXjA
+DnbkKvbdZLrETmlN
+EPCjjvbdxxJJbQZk
+EPCkKvbdrounjDVf
+DoCjjvbddiirVtzn
+DoDLKvbdmttyjiqf
+DncKjvbdfHjvSNpg
+DoCjjvbdmRxuZsEJ
+DoCkKvbdjAQGaQGj
+DncLKvbdnVUzLJrG
+EPCjjvbdLAjgNCXq
+DoDLKvbdqmZixlHi
+EPDLKvbdVUMsekvK
+EPDKjvbdrMzKZMIJ
+EPCkKvbdKDKCpicY
+EOcLKvbdwtmEqZMO
+EPDLKvbdmgFXlnGy
+DncKjvbdyTNhlqbH
+DncKjvbdnHFXlnHZ
+DoDLKvbdTqROuUgm
+DoDKjvbdRMwbZOUz
+EPDKjvbdRMwbYmtz
+DoDKjvbdZnmheEyj
+EPCkKvbdbBWEfPow
+DoDKjvbdQwNccLgc
+DoCjjvbdhtzFWqtb
+DoDKjvbdRotHKGEX
+DncKjvbdZsiJZETO
+EObjjvbdaNKbStlg
+DoCkKvbdsZlQTAhO
+EObjjvbdjhGlGGNk
+EObkKvbdQdDBQQcr
+DoDKjvbdMtrrLNAX
+EPCjjvbdRotHKGDw
+EPCjjvbdqZPIGqDx
+EOcLKvbdiGicZViu
+DnbjjvbdJvVGEFGi
+DoCkKvbdKNAEZfuB
+EPDLKvbdLZRJrzuG
+DnbkKvbdhytfLpnG
+EPDKjvbdRbEEkiYk
+EOcLKvbdcJMjLFvx
+DncKjvbdFfKRnItR
+DoDLKvbdegjurORH
+DnbjjvbdEPDKjvcE
+EPCjjvbdkHgLeenL
+DncLKvbdZnmheEzK
+DncKjvbdZjSgpHCG
+DoCkKvbdbBVdeoow
+DoDLKvbdZQmEhleR
+EPDLKvbdpxoHfpcx
+EPCkKvbdSPtGjGEX
+DncKjvbdRbDeLhxk
+EObkKvbdrpWOibvG
+DnbjjvbdfIKurNpg
+EPDLKvbdZyEKNbkr
+DoDLKvbdwXMAvBWV
+EOcLKvbdWWiXvDdg
+EOcKjvbdelfWfljL
+DncLKvbdjuvnEBxX
+DncLKvbdliDspuRa
+EObjjvbdVTlsekuj
+DoCjjvbderAvzlDP
+EPDKjvbdNeDtIhkE
+Dnbjjvbddwyssqez
+EObkKvbdGGKRnItR
+DoCkKvbdHbLzEzAD
+EPCkKvbdTvMPjUBR
+EObjjvbdTAEiIBoE
+DoCjjvbdRjxfUgLT
+DnbkKvbdnUuZkKRf
+EPDLKvbdjmBkydgP
+EObkKvbdNeDsiIjd
+DncKjvbdrounjDWG
+DnbjjvbdrWokbhxq
+DoDLKvbdsPvPKDWG
+DncKjvbdZdwfzgiC
+EOcLKvbdZLqdUNlN
+DoCjjvbdkDMLRHVH
+EPDKjvbdirziSjiz
+EObkKvbduDDUvuno
+DoDLKvbdkHgMGGOL
+DncLKvbdhkdcmuCy
+EObkKvbdCJLCLIej
+DnbkKvbdeFPRawCj
+DncKjvbdsQVoKDVf
+EPDLKvbdRXNccLhD
+EObkKvbdFxttaDxC
+EObkKvbdqrVKnKaN
+EPCjjvbddoEsKtUS
+EObjjvbdzaAOffbM
+DoCjjvbdWSNxBdlD
+EPCjjvbdqlzKYlIJ
+EOcLKvbdQdDApRDr
+DncKjvbdczZPwyRC
+EOcLKvbdtlXwBUBX
+EOcKjvbdmgFYNOGy
+DoCjjvbdKVtfEFGi
+EObkKvbdrNZjZLgi
+EOcKjvbdliETqVSB
+EOcKjvbdbVBgXkUI
+DncLKvbdNHDPmPtk
+DnbjjvbdjlakzEfo
+EOcKjvbdVUNTfLvK
+EPDKjvbdTXjkmzjx
+DncLKvbdrylQTBIO
+EPCkKvbdJpzEoGOF
+DncKjvbdFeiqmhtR
+DncLKvbdZnnJFFZj
+EPDLKvbdlrZUzTEJ
+EPDKjvbdLFfICBRV
+EPCjjvbdcyxpXyRC
+DoDLKvbdQdCaQQcr
+DncLKvbdZsiJZDsO
+EObjjvbdzQoNIjXA
+DncLKvbdVqmxBdlD
+DoDKjvbdRjxfUgLT
+EObjjvbdWIYVxHYz
+DoCkKvbdIGfzZXxH
+DncKjvbdxsNhlqag
+DoDKjvbdFWYopNJe
+EPDKjvbdVBCRTRSZ
+EPDKjvbdwyhFfXeS
+DoCjjvbdziuPocsU
+EPDKjvbdYSkaNUPY
+EObjjvbdznopdcLx
+EOcLKvbduMYWaUBX
+EPDKjvbdnPzZWKyC
+EObkKvbdZxcimbkr
+EObkKvbdBhjbKiFj
+EOcLKvbdjuwNdBww
+EPDKjvbdmbKWxOnV
+DoCkKvbdnHFYNNgZ
+DoDLKvbdrMzKYkhJ
+EOcLKvbdqdFIpNvB
+EPDKjvbdcScKtDjB
+EOcLKvbdygZMAMdw
+EOcLKvbdsCGNLgLZ
+DoDLKvbdaMkBsUlg
+DncKjvbdlZSqsYft
+DnbkKvbdnVUzLKRf
+DoCkKvbdnHFXlmgZ
+EPDKjvbdxZgfGYFS
+DoCkKvbdxwiKCPzL
+DnbkKvbdBcpAvKMf
+DoCjjvbddZyQXxpb
+DncLKvbdzQnmIjXA
+EPDKjvbdFWZQQMjF
+DnbjjvbdMgDQMpUk
+DncLKvbdOFDtIiKd
+DoDKjvbdKNAEZfta
+EOcKjvbdhyuGMQmf
+DnbjjvbdZnmhdeZj
+DncLKvbdhbOcFXRR
+EOcLKvbdvBEZSoEh
+EOcKjvbdYkrEUOLm
+EPCkKvbdNrtWGduQ
+EPDKjvbdZjSgpHCG
+EObkKvbdyzdmrHhh
+DoDLKvbdznpQdblY
+DncLKvbdZshhyDrn
+DnbkKvbdjvWmdCYX
+EOcLKvbdAMgxsWzY
+DnbjjvbdwzIGGXdr
+EPDKjvbdrNZixlIJ
+DoDKjvbdsQWOicVf
+DoDKjvbdjuvmdBxX
+EObkKvbdzHZMANFX
+DoDLKvbddjJqutzn
+EOcKjvbdwNWAMdFN
+DnbkKvbdTqRPUtgm
+EOcKjvbdVYgtZkOn
+EPDKjvbdNGcPlotk
+DnbjjvbdJbjDRJcY
+EPDLKvbdZtJIyESn
+DoDKjvbdtcCuXVoP
+DoCjjvbdZMSETmlN
+DoCjjvbdgGLzNfgA
+EPDKjvbdxKvcgzyf
+EObjjvbdrMzKZMIJ
+DncLKvbdMoxQumfs
+EPCjjvbdbhlikFvx
+DoDLKvbdRadFMJYk
+DnbjjvbdHgGzYxYH
+EObjjvbdVZHtZkOn
+DnbkKvbdakLfPNcA
+DoCjjvbdmfeXmOGy
+DoDLKvbdrRtjmjaN
+DnbjjvbdUxgsyjoO
+DnbjjvbdbhlikFvx
+EPDLKvbdRbEFMJYk
+EOcKjvbdRXNcblHc
+DnbkKvbdqmZixlHi
+DoCjjvbdrzLpTBIO
+DoCjjvbdILaznXRL
+EPDLKvbdRjyGVGkT
+EOcLKvbdehKurOQg
+DncLKvbdYkrDsnLm
+DoDKjvbdZisHpGaf
+DncLKvbdpyPIGpcx
+EOcLKvbdijFhKNYS
+EOcKjvbdMuSqkNAX
+EObjjvbdajlFnnDA
+EOcKjvbduLxXAsaX
+DnbjjvbdiiegjMwr
+EPCkKvbdiMEdNuCy
+EPCkKvbdqTtHSRkU
+EPCkKvbdIryBTNXl
+DncLKvbdFjdrcHlu
+EPDKjvbdZoOIeFZj
+DncLKvbdcbTNSATm
+DoDKjvbddePSCWcK
+DoDKjvbdZsiJYcsO
+DoDKjvbdpeceTuaI
+EOcKjvbdjhHMGFnL
+EOcLKvbdjcLkRGtg
+DnbjjvbdCJLCKiFj
+EPDLKvbdZsiIxdSn
+EObkKvbdVTlsekvK
+EObkKvbdCTAcTewS
+DoDLKvbdOYOuzcnU
+EPCkKvbdiUydwRuC
+DncLKvbdGQATXGey
+EPDLKvbdDjIJvXjA
+DncKjvbdpxoIHQdY
+EObkKvbdZMSDsmkm
+EOcLKvbdBvzchdov
+EOcLKvbdKRZeOenF
+DnbkKvbdwzIFfYEr
+DnbkKvbdSKyFuHKs
+EPDKjvbddCSlrATm
+EObkKvbdSCDeMIyL
+EPCjjvbdsCFllGjy
+DnbjjvbdHgGyyYYH
+DncKjvbdjKFgilwr
+DncLKvbdEvYoomJe
+EObkKvbdlhdTpuSB
+DoDKjvbdWWiYVceH
+DnbjjvbdLGGHbBQu
+EObkKvbdOXoVzcnU
+DnbjjvbdbsCjtDjB
+DnbjjvbdQwOECkhD
+DnbjjvbdMgComQVL
+DoCjjvbdRotGjFcw
+DnbjjvbdmajWxOmu
+EPCkKvbdbPfgDkzd
+Dnbjjvbdpxngfpcx
+DoCkKvbdBraCtGWr
+DncKjvbduDCtwWPP
+EPDLKvbdYzcFrKVy
+EObjjvbdbVBgXkTh
+DnbkKvbdyYIibPyk
+DncLKvbdUVlPitAq
+EObkKvbdbKlGOnDA
+DnbjjvbdrJAKFNPF
+EPDLKvbdLAjgMbYR
+DoCjjvbdSxLLmzjx
+DncKjvbdeEnqawCj
+EObkKvbdFWZQPmKF
+EOcKjvbdGdKvJbJj
+DnbkKvbdjcLjqHUg
+EPCjjvbdQvnDcLgc
+EPCkKvbddoFTLTtS
+DnbkKvbdZtIhyDrn
+EPDKjvbdBvzdIdpW
+EObjjvbdEYYLstUM
+EPCkKvbdyzdnSHiI
+EObjjvbdZLqdTmlN
+EPDLKvbdIHHZyXwg
+DoCkKvbdbVBfxKtI
+DnbkKvbdMpYRWOGs
+EOcKjvbdczYoxYqC
+EPCjjvbddwytTqez
+EPCjjvbduaDySoEh
+EObkKvbdTJZiqAAl
+EObjjvbdmoyyWLYb
+EPDKjvbdnPyxukZC
+EObjjvbdrWolDJZR
+DoCkKvbduCbtvvPP
+EPDLKvbdJbicQibx
+DncLKvbdHELVibJj
+DnbjjvbdKefHbAqV
+DncLKvbdsZkpTBHn
+DoDKjvbduCcVXWOo
+DnbkKvbdidkGtoAO
+DnbjjvbdrEFIonWB
+EPCkKvbdfpBzwEYI
+DncLKvbdwuNFRZMO
+EPDLKvbdrounjCvG
+DncLKvbdxxJJaoyk
+EPCjjvbdJmADzHUa
+EPDLKvbdqGEFTvBI
+EPDLKvbdyOShYTJD
+EPCjjvbdJutecdfi
+EPDLKvbdIMBznXQk
+DncKjvbdmoyxvKyC
+EPDLKvbdrXQMChyR
+DoCkKvbddwytUSFz
+DncKjvbdZjTHofbG
+EPDKjvbdGcjujCJj
+EPCkKvbdvBEYsOeI
+DncKjvbdCTAcUGWr
+EPCkKvbdmbKWwnnV
+DnbjjvbdpxnhHREY
+EObjjvbdlZTRsYft
+DoCjjvbdhkdcmtcZ
+EObjjvbdMfcPmPtk
+EPCkKvbdJXtCHkpp
+DnbjjvbdrSUjmkBN
+EOcLKvbdYSlBMtOx
+EObjjvbdznopdbkx
+DncLKvbdddoSCXDK
+DoCjjvbdOXnuzcnU
+EPCkKvbdZGwEAOsJ
+EOcKjvbdauCGwjtI
+EPDLKvbdNHDPmPuL
+EOcLKvbdNHCpMpUk
+DoCjjvbdmSYtysDi
+DncKjvbdFjeTDINV
+DncKjvbdNrtWHFUp
+EPCjjvbdmJETqUqa
+DncKjvbdEzsqEkcJ
+EOcLKvbdmoyyVjyC
+EOcLKvbdZMSETnMN
+EOcLKvbdBsAbtFvr
+EPCjjvbdJutfEFHJ
+DoCkKvbdiBoDEwRR
+EPDLKvbdZQmFImFR
+EPDLKvbdpfDdsuaI
+DnbkKvbdmbKXYPNu
+EObjjvbdjKGHjNXr
+EOcLKvbdpssgSRjt
+DoDLKvbdKRZePGOF
+DnbkKvbdfekymgHA
+DoDLKvbdiCOcFWqR
+DnbjjvbdiHJbyWKV
+DoDKjvbdsCGNMHKy
+DoCjjvbdGKeSbgmV
+DoDLKvbdkIGkfFnL
+DncKjvbdfILWRnRH
+DoDKjvbdGLEsChNV
+EPCjjvbdVrNxBeMD
+EPDKjvbdSLZGVHKs
+EPDLKvbdQlxByOUz
+EOcLKvbdMgDQNQVL
+DoDLKvbdrRtjnLAm
+EObjjvbdCIkBjhfK
+DncKjvbdDwwlTssl
+DoDLKvbdANIYsWzY
+DnbjjvbdxVMdqYkn
+DoCkKvbdzdynzdzQ
+DnbjjvbdxsNhmRag
+EObjjvbdzjVQPcrt
+DoCkKvbdbBWFFopX
+EPDKjvbdhfibxvKV
+DnbkKvbdegjvRmqH
+EPCjjvbdkNCMZdgP
+EOcLKvbdmtuZkJqf
+EObjjvbdemFvfljL
+DncLKvbdyYIibPyk
+EObjjvbdieKftoAO
+DncKjvbdvOszqKoU
+DncLKvbdVUNTelWK
+EOcKjvbdCDoaWKMf
+EPCkKvbdbsDKtDjB
+EPDLKvbdmSYuZsDi
+DncLKvbdwWlBWBWV
+EObjjvbdkVwOEBww
+EObkKvbdWSNwbFLc
+DnbjjvbdZRNFImEq
+DoDKjvbdrounjDVf
+EPDKjvbdCJKbKhej
+DncKjvbdsrrTYyeD
+DoCjjvbdQvnEDMHc
+DoCkKvbdGQASwGfZ
+EOcLKvbdfSBWzkbo
+DoDLKvbdRkZGVGkT
+EOcKjvbdyXhjCPzL
+EPCkKvbdbrbkTdJa
+EPDLKvbdsQVnibvG
+DnbjjvbdpyOgfpdY
+DoDLKvbdtunXiqTA
+EPDKjvbdqGDdsvAh
+DncKjvbdjEkHUoAO
+EPCjjvbdGQATXGfZ
+EOcKjvbdKDJcRKCx
+DncKjvbdhyuGMQnG
+DoCkKvbdYkrDsnMN
+DoCjjvbdaNKbSuMg
+EOcLKvbdrykpTAhO
+DnbkKvbdrSUkNkAm
+EPCjjvbdwzHeeweS
+DoDLKvbdSBdFMJYk
+DnbjjvbdqUUGrRjt
+DoDKjvbdzitoocrt
+EPDKjvbdxnShXriD
+DoCkKvbdVviXvEEg
+EObkKvbdFxuUaDxC
+EObkKvbdygZMAMeX
+DnbjjvbdiifHilxS
+EPDKjvbdZxcjODMS
+DoDLKvbdWWhxWEFH
+EPCjjvbdzoQQeClY
+EOcLKvbdptUHRqjt
+DoDKjvbdVviXudEg
+EPDLKvbdUQpnuVHm
+EPCjjvbdwzHfFweS
+EOcLKvbdZxcjNbkr
+EObkKvbdZnmhddyj
+DoDLKvbdvlvANDdm
+EOcKjvbdMfbolpVL
+EObjjvbdbAvFFpQX
+EOcKjvbdBdPaWJlf
+DncKjvbdqceIonWB
+DoCkKvbdtcDVWvOo
+DoCkKvbddoFTKssr
+DoDKjvbdaMkBruMg
+EPCjjvbdEuyPolie
+DnbkKvbdOEcsiJLE
+DncKjvbdHlBznWqL
+EPDKjvbdbhlijewY
+EObjjvbdfoazwDwh
+EOcLKvbdaNKbStlg
+DoCkKvbdqdEiQOWB
+DoCkKvbdTvLpKUBR
+DncKjvbdkNBkzFHP
+EObkKvbdFkErcHlu
+DoCkKvbdZshiYcrn
+EObjjvbdEJhJvYKA
+DnbkKvbdOTUWHFUp
+DoDLKvbdVhXvXfxz
+EPDLKvbdBdPaWKMf
+EObjjvbdFejRnJTq
+EPDLKvbdULvPBVoJ
+EPDKjvbdJzpFwdAN
+EPDKjvbdqwPkbiZR
+EPDLKvbdrEFIomua
+EOcLKvbdijFhJlxS
+DnbkKvbdYkrEUOLm
+DnbkKvbdIMBznXQk
+DncKjvbdZisHpHCG
+EPDLKvbdzjUopESt
+DnbjjvbdzjUpPcrt
+EPDKjvbdqZOgfpdY
+DoDKjvbduLxXAsaX
+EObkKvbdrMyiyMHi
+EPCkKvbdqTsfqrKt
+DoDKjvbdTfznMXVe
+EObkKvbddoErkUTr
+EOcLKvbdHELWKCJj
+DncLKvbdUVkpJtAq
+EPCjjvbdRMxBxmtz
+EPDKjvbdjEjftoAO
+EOcLKvbdYkrDsmkm
+DoDLKvbdajlFoNcA
+DoCjjvbdmJDtRUqa
+EPDKjvbdTqQoUuIN
+DnbkKvbdtcDUvvPP
+DncLKvbdrbGMlHLZ
+DnbkKvbdKfGHbApu
+DncLKvbdGFjRnIsq
+EPDLKvbdJzpGYEAN
+DoCjjvbdkySrSyHU
+EObjjvbdKVtfDdfi
+EPDKjvbdNrsugFUp
+DoCkKvbdNxOuzcmt
+DoDLKvbdDihJuxKA
+DnbkKvbdzdzOzdzQ
+DncKjvbdmSYuZrci
+EOcLKvbdptTfqqkU
+EPCkKvbdVUNTfLvK
+DoCkKvbdGdKujBjK
+DoCjjvbdzitopETU
+DoDKjvbdqvokbiYq
+EPDLKvbdGFjSOJTq
+DoDKjvbdliETqUrB
+DoDKjvbdZisIQGbG
+DoCjjvbdnQZyWLZC
+EOcLKvbdGdKujCJj
+EPCkKvbdaRfDIUGL
+EOcKjvbdauCHXjtI
+DnbkKvbdbQHHDkzd
+DoCjjvbddZxpYYpb
+EObkKvbdbBWEepPw
+DncKjvbdSLYfVGkT
+EObkKvbdVgxVxHYz
+DoCjjvbdfpBzwEYI
+DoDKjvbdmfdxMmfy
+DncKjvbdhancEwRR
+DnbkKvbdEASJMzXX
+EObjjvbdmfdwmNfy
+DnbjjvbdhbOcFXQq
+DoCjjvbdVgxVxGxz
+EPCkKvbdQcbaQQdS
+EPCjjvbdhbObeXRR
+EPDKjvbdePFSkUTr
+EPDLKvbdMoxQumgT
+DoCkKvbdIBkydzAD
+EOcLKvbdcasMrAUN
+DoCkKvbdUQqOttgm
+DnbkKvbdelevfljL
+EObjjvbdZeXfzgiC
+EPCjjvbdQYmAGrrK
+EObjjvbdxZhGFxFS
+EObjjvbdJuuGEEgJ
+DoDLKvbdEARhlyvw
+EPDKjvbdZdxGzhJC
+DoCkKvbdzRPMhiwA
+DoCkKvbdZxcinClS
+EOcKjvbdFyVVBEYC
+EOcLKvbdtbcUwVoP
+DncLKvbdlZSrTYft
+EObkKvbdaaVeGPow
+DncLKvbdEKIJvXjA
+DncLKvbdbhljKfWx
+EObkKvbdVhYVxGxz
+EPDKjvbdmpZxukZC
+DoDLKvbdnBivxOnV
+EObjjvbdRbEEkiZL
+EPCkKvbdZRNFIleR
+DoDLKvbdZyEJmblS
+DncKjvbdkIGkefNk
+EPDKjvbdRkZGVGjs
+DnbkKvbdiHJbyVjV
+EPDLKvbdFjeSbglu
+DncLKvbdqFcdtVaI
+EOcKjvbdGYuVAdYC
+DoCjjvbduaEZSneI
+DnbjjvbdKWVFdFHJ
+EObjjvbdGdLVjCJj
+DnbkKvbdpssgSSKt
+DoCjjvbdssRryZdc
+EPDKjvbdZisIQHCG
+EOcKjvbdCIjajhfK
+DoDKjvbdrafNMGjy
+EObkKvbdgQBzwEXh
+DnbjjvbdgQBzwDwh
+DncKjvbdCEQAvKMf
+EPCkKvbdiCOcFWpq
+EPDLKvbdLFfHbBQu
+EPCjjvbdJTYaSmXl
+EPCjjvbdRjyFuGkT
+DoCkKvbdjFKftoAO
+DncKjvbdmaiwXoNu
+DoCjjvbdVZITyjnn
+DoDLKvbdDxYLtUTl
+DnbjjvbdqvpLcJYq
+EOcLKvbdlqxuZsDi
+DoDKjvbdZshhyDsO
+DoCjjvbdGFjSOIsq
+DnbkKvbdcScKtEKB
+EPCjjvbdMpXqVmfs
+EPCjjvbduoTzpjoU
+DoDLKvbdYkqctNkm
+EObkKvbddoErjstS
+DnbjjvbduLxWaUAw
+DoCkKvbdRXODbkgc
+DoCjjvbdwzIGFweS
+DoCkKvbdZyEKOClS
+EObjjvbdiGjCxvJu
+EObkKvbdbiMijewY
+DoDKjvbdqrVKmkBN
+DoCkKvbdFyUuBEYC
+DoDLKvbdNsTufduQ
+DoDLKvbdEPCkKvcE
+DoDLKvbdNQYRWNgT
+DnbjjvbdNrtWGeUp
+DoCjjvbdPxmAGrqj
+EPDKjvbdKNAEZgVB
+EPDKjvbdmttzKjSG
+EPDKjvbdssSSxydc
+DoCjjvbdTlWPAuni
+EObjjvbdDHLegAzc
+EObjjvbdXnRAXtvU
+EObkKvbdKfFgaaQu
+EOcKjvbdhtzFXSUb
+EPCkKvbdJTZAsMwl
+EOcKjvbdQYmAGsSK
+DoCkKvbdjhHLeemk
+EOcLKvbdiifIJmYS
+EPDKjvbdLrWlzVQz
+DoCjjvbdxsOIlrBg
+EPDLKvbdNPxQvNfs
+DnbkKvbdIGfyxwxH
+DoCjjvbdjKFhKMwr
+DnbjjvbddjKSVtzn
+DoCjjvbdZoNiFEzK
+EPCjjvbdeFOqavcK
+DoDLKvbdEuxpQMie
+EObjjvbdZjShQHCG
+DoDLKvbdZMSDsmkm
+DoDLKvbdGYtuBEYC
+EPCjjvbdUaBprqRy
+EOcLKvbdmozZWLZC
+DncLKvbdUWLpKUBR
+EPCjjvbdqYnhHQcx
+DoDLKvbdUaBprpqy
+EPDKjvbdrzMQSaHn
+DnbjjvbdGdLWKCJj
+EObkKvbdfILVrNqH
+EPCjjvbdehKvRmqH
+EPDKjvbdOSsvGeVQ
+DncLKvbdxxJJaozL
+EPCjjvbdZLqctNkm
+EOcLKvbdZxcinCkr
+DncLKvbdkWWmcbXw
+DoDLKvbduCcVXWPP
+DncLKvbdyTNhlqbH
+DncKjvbdYTMAlsoY
+DoCkKvbdRosfjFcw
+EPDLKvbdDwxLsstM
+EOcKjvbdlZTRryHU
+DoCjjvbdNGbpMpVL
+EOcLKvbdYgWdAOri
+DoCjjvbdDxYLstTl
+EObjjvbdIwtBglRQ
+EOcKjvbdvPTzpkPU
+DoCjjvbduLxXAtBX
+DoCjjvbdiLeENuCy
+DnbjjvbdUaCRSqRy
+DnbjjvbdYpmEhleR
+EObjjvbdsPvOjDWG
+DoCkKvbdLFfICApu
+DncKjvbddxZstRez
+EPCkKvbdFyVVAdXb
+DoCjjvbdFyVVBDxC
+DoDLKvbdFeirNiTq
+EPCjjvbdxnSgxTIc
+EOcKjvbdAMgySwZx
+EObkKvbdkyTRryHU
+DoCkKvbdMRwMzUpz
+DnbjjvbdCWzdJEov
+DoCkKvbdUyITzLPO
+EPCkKvbdcSbjsdKB
+DoCkKvbdqceIonVa
+DoCkKvbdjmCMZeGo
+DncKjvbdfMewGljL
+EObkKvbdpfEEtVaI
+DoDLKvbdczZQYYqC
+DoDLKvbdRNXbYmtz
+EObjjvbdTvLojUBR
+EPCkKvbdtbcVXWPP
+DncLKvbdmSYuZrdJ
+DoDLKvbdTukpKUBR
+EPDLKvbdsQVoKCvG
+EPDLKvbdBraCtFvr
+EPDLKvbdZQmEiNEq
+EPCjjvbdrzLosAgn
+EPCjjvbdssRsZZdc
+DncKjvbdbAudepQX
+DncKjvbdcTDKscia
+DncLKvbdlqyVZsEJ
+EOcLKvbdbVCHXkTh
+EObkKvbdYTMBMsnx
+DnbjjvbdULvPAuoJ
+DoCjjvbddtAUASlv
+DoDKjvbdxUmEpxkn
+DncKjvbdQwOEDLgc
+DoCkKvbdSPsgKGDw
+DncKjvbdiCOcFXQq
+EPDKjvbdRkYfUfkT
+EObkKvbdKCjDRJcY
+DoCjjvbdZLqctOMN
+EPCjjvbdUWLpKTaR
+EPCjjvbdLqwMzVQz
+DnbjjvbdnBivxPNu
+EObkKvbdRpUHKFdX
+EPCjjvbdeATqNXif
+DoCjjvbdfILVrOQg
+DoDKjvbdNrtVfeUp
+EOcLKvbdNUrrKmAX
+EPCjjvbdrbFllHLZ
+DncKjvbdkDMLQgUg
+DoCkKvbdVvhwvDeH
+DnbjjvbdKeegaaRV
+DoDKjvbdcJMjKfXY
+DnbjjvbdZtJJYcrn
+DoDLKvbdyqOliJwA
+DoDLKvbdMgDPmPuL
+DoCkKvbdHffzZXxH
+DoCjjvbdZxdKNblS
+EPDKjvbdkDLjqGtg
+EPDKjvbdYzbeqjVy
+DncLKvbdTppnttgm
+EObkKvbdVYgtZjnn
+EPCjjvbdzaAOgHCM
+EOcKjvbdcyxoxZRC
+EPDLKvbdxnSgxTJD
+EObkKvbdfMfXHNJk
+EPDKjvbdunszpjoU
+EObkKvbdFfKRmhsq
+EOcLKvbdhtydwRtb
+DoDLKvbdYkrDsnLm
+EPDLKvbdGGKSOItR
+EPCkKvbduDCuXVno
+EPDLKvbdrEFJQOVa
+EPDLKvbdIjEAKQGd
+EObjjvbdIryArmYM
+DoDLKvbdYkqctOMN
+EPCkKvbdiZtekqOG
+DncKjvbdzdzOzeZp
+DoDLKvbdbiNKLFwY
+DnbkKvbdlhcsqUrB
+DnbkKvbdKyRJrzuG
+DoDKjvbdOFDtIiKd
+DnbjjvbdvvlBWBVu
+DnbkKvbdlrZUyrdJ
+EObkKvbdxZgeewdr
+DncKjvbdegkVrNpg
+DoCjjvbdrJAJeNPF
+EObjjvbdmfeXmOHZ
+DoCjjvbdNPwqVmfs
+DnbjjvbdnPzYvLZC
+EPDKjvbdZshiYcrn
+EOcLKvbdhgJcYvJu
+DoDLKvbdXrlAmToY
+DnbkKvbdwWlAvBVu
+DnbkKvbdjvWnEBww
+DoDLKvbdTYLLmzjx
+EOcKjvbdDihJuxKA
+DncLKvbdTfznLvue
+DoCjjvbdVgwvXgYz
+EObjjvbdsBfMkgKy
+EPCjjvbdUaBqTQrZ
+DnbjjvbdbhmJkGWx
+EPCjjvbdLBLGmCYR
+DoDKjvbdwjwEHzyf
+EPDLKvbdegkVrNpg
+DoCkKvbdJpzEnfOF
+EPCkKvbdFejSOItR
+DnbjjvbdTqQnuUhN
+EOcLKvbdUMVoAvOi
+EPCkKvbdSCEFLiZL
+EPCkKvbdnCKXYPNu
+EPDLKvbdZyEKNbkr
+DncLKvbdZisIQGaf
+EObjjvbdGLEsDHmV
+DoCjjvbdBcpAujNG
+EObjjvbdZRNFIleR
+DnbjjvbdVrOXaeLc
+EPCjjvbdHELViaij
+EOcLKvbdqcdhpNvB
+EPCkKvbdiZuFkqOG
+DoCkKvbdOSsufeVQ
+DoDLKvbduoTzpjnt
+EOcLKvbdTqRPUuHm
+DoDLKvbdCDpAuilf
+EOcKjvbdZMSDsnMN
+DoDLKvbdYqNFJMeR
+DnbkKvbdbAvFFpPw
+EOcKjvbdVqmwaeMD
+EPCkKvbdUyHsyjnn
+EPCjjvbdKeehBaQu
+DoCjjvbdZshiYdTO
+EObkKvbdTvMQJsaR
+EPCjjvbdjblKqHUg
+DnbkKvbdYlSDtOMN
+EObkKvbdrWpMCiZR
+EOcKjvbdUGzmlWue
+DncKjvbdFyUuAcwb
+EPCkKvbdLZQjSztf
+EPCjjvbdfjfzbfAE
+DncKjvbdFWZQQMie
+DoCjjvbdVgxVxHYz
+EOcKjvbdWWhxWEFH
+DoDLKvbdUWLoitAq
+DoDLKvbdzaAOffbM
+EOcLKvbdrXPkbiYq
+DoCkKvbdYzberKVy
+DncLKvbdIMBznWpk
+EPCkKvbdEPCkKwDE
+DnbkKvbdWWiYVcdg
+DoCkKvbdCWzchdpW
+EOcLKvbdjvXNcbYX
+EPDLKvbdSxLMNzjx
+DnbjjvbdhficYuiu
+DncLKvbdvmWAMdEm
+EObjjvbduaDyTOdh
+DncKjvbdwWlAvBWV
+DoDKjvbdVviYWDeH
+EOcKjvbdNsUWGdtp
+DoCjjvbdzjVPodTU
+EPCkKvbdmIcsptqa
+EPDLKvbdIHHZxxYH
+EPDLKvbdUyIUZkPO
+EObkKvbdCDpBWJlf
+EPDKjvbdWSNwaeMD
+DoCjjvbdACrXjZhp
+EPDLKvbdwuMdqYlO
+DnbjjvbdHlBznWpk
+DnbjjvbduaDyTPEh
+DnbjjvbdwuNFRZLn
+EObjjvbdajkfOnDA
+DnbkKvbdWWiYWEEg
+EPDLKvbdffLymgHA
+EOcLKvbdkDMKpfuH
+EPDLKvbdMoxQvOHT
+DnbkKvbdbKkenmcA
+DoCjjvbdhytfMRNf
+DoCjjvbdIsZAsNXl
+DoDKjvbdLiBkqYAS
+DncLKvbdyzdmrHiI
+DnbjjvbdemFvfmJk
+EOcLKvbdSCEEkiYk
+DoDKjvbdbiNKKevx
+DoDLKvbdaaVdeoow
+DnbjjvbdNGcQNPuL
+DncLKvbdQYmAGrrK
+EPDKjvbdrbGMkfjy
+EPCjjvbdZjShPfbG
+DnbjjvbdJmADyfuB
+DnbjjvbdhtzFWquC
+DnbjjvbdQvmdDMID
+DncLKvbdjvWnEBww
+EPCjjvbdxZgfGXdr
+EObkKvbdDihKWXjA
+EPCkKvbdZMSETnLm
+EPDKjvbdZLqcsnMN
+EObkKvbdqwPlDJZR
+DoDKjvbdZisIQGaf
+EObjjvbdjlalZeGo
+DncKjvbdxsOJMqag
+DoDKjvbdOFEUIhkE
+DoCkKvbdzitoodSt
+DncLKvbdVrNwaeMD
+DoCjjvbdezuyEiTw
+EPDKjvbdiCOcEvpq
+DoCjjvbdvvlAvAvV
+DnbjjvbdJuuFceHJ
+DoCjjvbdlYrrSyGt
+EPCkKvbdfILVrNqH
+DoDLKvbdxsOJNRbH
+DncKjvbdIwtBgkpp
+DnbkKvbdOTUWHEtp
+EPDKjvbdFejRnIsq
+DnbjjvbdVBCRTQrZ
+EPCjjvbdiMEcnUcZ
+EObkKvbdiZuGMRNf
+EOcKjvbdatbHYLTh
+DoCkKvbdmSZVZrdJ
+DoDKjvbdqTsgRqjt
+DoDLKvbdCEQBWKNG
+DnbjjvbdZtJJZESn
+DncLKvbdIHGzZXwg
+EPDLKvbdwtmFRZMO
+DoCjjvbdKDJbqJcY
+EObkKvbdatbHXkUI
+DnbkKvbdYqNEhleR
+EObjjvbdNHColotk
+EPDKjvbdegkWSNpg
+DoDLKvbdRjyFtfjs
+DoCjjvbddoEsKtUS
+EOcLKvbdsQWOjCvG
+DoCkKvbdvAcxsOeI
+EObjjvbdbAueGQQX
+EOcLKvbdxKwEHzzG
+DoDKjvbdqTtHSRkU
+EOcKjvbdOAIsUKSA
+EPCjjvbdWSNxCElD
+EPDLKvbdnCKWwoNu
+DncLKvbdEARiMzXX
+DoCkKvbdbAvEeoow
+EOcKjvbdhgJcYvJu
+DnbjjvbdTulPisaR
+DnbjjvbdIidAKQGd
+EPDKjvbdyOTIXrhc
+EPCkKvbdrbFmLgLZ
+EPCjjvbddeOqbXDK
+DncKjvbdRacdlJZL
+EOcLKvbdbsDKtDjB
+EPCjjvbdUyHtZkOn
+EObkKvbdyTOImSBg
+DncKjvbdtbbtwWPP
+EPDKjvbdKDKDRJcY
+EObjjvbdhanbeXQq
+EOcLKvbdvvlAuaWV
+EPDLKvbdVYgsyjoO
+EPDLKvbdKaKflawq
+EOcLKvbdCIjajiFj
+EObkKvbdUsmUGMWK
+EPDLKvbdIjEAJofd
+EOcLKvbdqBJFAWhE
+EPCkKvbdEJgivXjA
+DnbkKvbdYkqdTmkm
+EPCkKvbdliDsqUrB
+EObjjvbdKVtfEEfi
+EObkKvbdmgFYMmgZ
+EObjjvbdEARhlyvw
+DncKjvbdaRecHtGL
+DnbjjvbdNQYRVmfs
+EOcLKvbdFfKRnJTq
+DncLKvbdMgDQNQUk
+EObkKvbdHgGyyXwg
+EPCkKvbdCJKbKiFj
+EPCkKvbdBraDUGXS
+EPDLKvbdiMEcnVCy
+DoDLKvbdkCkkQfuH
+EOcLKvbdwtmFRZLn
+EPDKjvbdKefHbApu
+DnbkKvbdkxrqsZGt
+EPCkKvbdfIKvRmqH
+EOcKjvbdDnbkLWbd
+EPDLKvbdaRebhTek
+DoDLKvbdjuwODaxX
+DnbjjvbdREDBPpdS
+DncLKvbdjuwNcaww
+EOcKjvbdbiMjKevx
+EPDKjvbdqvpLcIyR
+EPCjjvbdijGIKMxS
+EPDLKvbdQmYCZNtz
+EObjjvbdCDpAvKMf
+EOcLKvbdJJdAKPgE
+DoDKjvbdUxgszLOn
+DnbjjvbdOEcshhjd
+DoCjjvbdUaCRSprZ
+EPCkKvbdxmrhYTJD
+EPDKjvbdICLydzAD
+EPCjjvbdKRZdoFme
+EObkKvbdNdctJIjd
+EPCjjvbdKVuFdEgJ
+EObjjvbdrXPlDIyR
+DoCkKvbdfMewGmKL
+DnbkKvbdIwsahMQp
+EOcLKvbdRaceMIxk
+EPCkKvbdcyxoxZQb
+EObjjvbdRkYeuGkT
+DncLKvbdbVBfwkTh
+EObjjvbdTppoVUhN
+EPCjjvbdhytfMROG
+EOcKjvbdUxgszKoO
+DoCjjvbdGLEsDHlu
+EObkKvbdegkVqmqH
+DncKjvbdkMbLyeGo
+DncKjvbdyzdmqghh
+EPCkKvbdGFiqnIsq
+EPDKjvbdpstGqqjt
+EPDKjvbdYkrDsmkm
+EPCkKvbdKaLGlbXq
+DoCkKvbdxwiJbPyk
+EPCkKvbdJcKDQibx
+EPCkKvbduDCuXWPP
+DnbjjvbdiGicZWKV
+DoCkKvbdsPunicWG
+DnbjjvbdKNAEZgVB
+EPDLKvbdnPyxujyC
+EObkKvbdJXsagkpp
+EObkKvbdNddUIiKd
+DnbjjvbdQwOEClID
+DnbkKvbdFVxpQMie
+EPCkKvbdVrNxBeLc
+EPCjjvbdUsmUGLuj
+EPDLKvbdGZVVBDwb
+DoCjjvbdmRyUyrdJ
+DncKjvbddZxoxZQb
+DnbjjvbdGKdsDINV
+EObjjvbdrafNLgKy
+DoCjjvbdJbjCqJbx
+DnbjjvbdlYsSTYgU
+DoCkKvbdQvnDblID
+DoDKjvbdssSTYzFD
+DncKjvbdmozZVkZC
+EPDKjvbdjbkkRGuH
+DoDLKvbdxmrgwriD
+DoDKjvbdfHkVrORH
+EPCkKvbdJuuFceHJ
+DoDKjvbdcbSlrATm
+EPCkKvbdeATpmXif
+DncLKvbdBiKajhej
+EPCkKvbdrNZixlIJ
+EPDLKvbdKVteceGi
+EObkKvbdzjVPodTU
+DoDLKvbdWSNxCEkc
+EOcKjvbdZxcimcLr
+EOcKjvbdZnnIeEyj
+DnbkKvbdmbKWxPOV
+EPCkKvbdZLrETmkm
+EPDKjvbdnUtyjiqf
+DoCkKvbdrWpLcJZR
+DoCkKvbdaMkCStmH
+DncLKvbdFVxpQMie
+EPCjjvbdrpWOicWG
+EOcKjvbdyOTIYShc
+EObkKvbdqrVLNkBN
+EOcLKvbdQvnDbkhD
+EOcLKvbdDigiuxKA
+DncLKvbddoErkTtS
+DoDKjvbdRWmdDLgc
+EPCjjvbdiHKDZVjV
+DnbkKvbdADSYKZiQ
+DnbkKvbdsPunibuf
+DoCjjvbdSPsfiedX
+EPDKjvbdJmAEZfta
+EOcKjvbdZMRcsnLm
+DoCkKvbdiLddOUcZ
+EObkKvbdqqtkOLAm
+DoDLKvbdYpmFImFR
+EObjjvbdVhYWXfxz
+DnbjjvbdMowqWNfs
+EObkKvbdVgwuwgYz
+DoDKjvbdDxYLsssl
+DnbjjvbdZtIiYcsO
+DnbkKvbdxwiKBpZk
+DoDKjvbdEuxpPmKF
+EOcKjvbdJcKDRKCx
+EObkKvbdUtNUFlWK
+EOcKjvbdjhHLfFnL
+DoCkKvbdSQTgKGDw
+DncLKvbdQccBQRDr
+DncLKvbdILazmwRL
+DoDKjvbdYTMBNUPY
+DoDLKvbdKaKfmCXq
+EPCjjvbdkIHMGGOL
+DnbjjvbdCIjbKhfK
+DnbkKvbdVgwuwfxz
+EPCjjvbdwtmFQxkn
+EPDLKvbdcyyQYZRC
+DoDKjvbdPyNAGsRj
+EObjjvbdSLYetgLT
+DoDLKvbdMRwNZuQz
+DncKjvbdFjdrcHlu
+DoCjjvbdZyDimbkr
+DnbkKvbdRXNdClID
+EObjjvbdEYYLtUTl
+EObkKvbdVqmxBdlD
+DoDLKvbdptTgRqkU
+EOcLKvbdBdPaWKMf
+EPCjjvbdiBncEvpq
+DoDLKvbdzQoNJKXA
+DoDKjvbdUQpoUtgm
+DnbkKvbdrzLpTBHn
+DoCjjvbdunszpkPU
+EPDLKvbdSZjHsCvA
+DncKjvbdRotHJfDw
+DnbkKvbdFejSOItR
+EOcKjvbdeFOrBwCj
+DoDLKvbdkVwNdCXw
+EPCkKvbdeOdrjtTr
+EPCjjvbdhuZdwRuC
+DnbkKvbdfILVqmqH
+DncKjvbdnPzYvLYb
+DncKjvbdHgGzZYXg
+DncKjvbdkVwNcaxX
+DoDLKvbdOAJSsjSA
+DncKjvbdOFDtJIjd
+EOcLKvbdVgwvYGxz
+EObkKvbdsQVnjDWG
+DoCjjvbdZjShQHCG
+DncKjvbdzoPpeCkx
+DoDLKvbdSLZFtfjs
+DnbkKvbdBsBCtFvr
+EOcLKvbdFyUuAcwb
+DnbjjvbdqUTfqrKt
+DoCjjvbdZxdJmcLr
+DncLKvbdmbJwYPOV
+EObjjvbdEObjkXDE
+EOcKjvbdaSFcIUGL
+EPCkKvbdqYoIHQcx
+EOcKjvbdfNGWgMjL
+DoCjjvbdbrcKtEKB
+EPCkKvbdvBDxsOdh
+DnbjjvbdtcCuXVoP
+DnbjjvbdrpWPKDVf
+EOcKjvbdwyhFfYFS
+EPCjjvbdnPyyWLZC
+EPDLKvbduMYXBUAw
+DoDKjvbduaDySoFI
+DoCjjvbdyXiKCPzL
+DncLKvbdGFjSOIsq
+DoDLKvbdeEoRbXDK
+DncLKvbdcTCjtDia
+DnbjjvbdnUuZjiqf
+DnbjjvbdjlakzFHP
+EOcLKvbdwWlBWAvV
+DnbkKvbdWWiXuceH
+EObkKvbdemGWfmKL
+EObkKvbdmuUykJrG
+DoCkKvbdmozYvKxb
+DncKjvbdQZNAGsSK
+EObjjvbdjblKpgUg
+DncKjvbdSZigsDWA
+EOcLKvbdZyEJmblS
+DoCjjvbdnCJwYOmu
+EPDKjvbdtkxWaTaX
+EPDKjvbdGZUuAcwb
+DoCkKvbdyfxlANEw
+EPCkKvbdTAFJIBnd
+DncKjvbdZLqctOMN
+DncKjvbdUMWPBWPJ
+EPCkKvbdDwwksstM
+EPDKjvbdEObjjvbd
+EObjjvbdWXJYWEEg
+DnbjjvbdpaIeAXIE
+DoCjjvbdqYoIHREY
+DnbjjvbdvmWAMceN
+EObkKvbdLFfHaaQu
+EOcLKvbdpaIeAWgd
+EPDLKvbdkCkkQgUg
+DnbjjvbdePErkTtS
+DnbkKvbdNGbomQVL
+DoDLKvbdEPCjkWcE
+DoCkKvbdehLWRnRH
+EOcKjvbdyXhibQZk
+EOcLKvbdZyEKOCkr
+DoCjjvbdkDLkRGtg
+DoDLKvbdkaNPNALA
+EObkKvbdrWpLbiYq
+DoDLKvbdfHkVqmqH
+DoDLKvbdEOcLKwCd
+DoDKjvbdrykpTBHn
+DncKjvbdxZgefYFS
+DnbkKvbdJpzFPFnF
+DoCkKvbdNGcPmPtk
+EPCjjvbdhzUelRNf
+EObkKvbdVTltFlWK
+DoCkKvbduaDxrneI
+EObkKvbdSQTgJfEX
+EOcKjvbdVhYVxHYz
+EOcKjvbdkCkkQgUg
+EObkKvbdqUUHSSLU
+EOcLKvbduLwwAtAw
+EPDKjvbdZLrETnMN
+EObkKvbdmttyjjRf
+DoDKjvbdYqMdiMdq
+DoCkKvbdkNBkzEfo
+DncKjvbdiLeDnUcZ
+DoDKjvbdZLrDsnLm
+EPCkKvbduVnYKRTA
+EPCjjvbdCIkCLJFj
+EPDKjvbdssRrxyeD
+DncKjvbdQwOEClHc
+EPCkKvbdwXLaWAuu
+EPCkKvbdUyHszKoO
+EPCkKvbdJYTagkqQ
+DoCkKvbdwuNFRYlO
+EPCjjvbdfHkWRmqH
+EOcKjvbddeOqbXCj
+EObkKvbdhficYujV
+EPCkKvbdmSYtzTEJ
+EPCjjvbdtkxWaTaX
+EPDLKvbdwygfGYEr
+EPDKjvbdmpZxvKyC
+DoCjjvbdpstGrSLU
+EPDKjvbdUtMtGLuj
+EOcKjvbdjlbLzFGo
+EObkKvbdkyTSTZGt
+EOcLKvbdLYpjSzuG
+EPDLKvbdyXhibQZk
+DncKjvbdptUHSRkU
+DnbjjvbdFfKRmhtR
+DoCjjvbdtbcUwVoP
+EPDKjvbdhyuFkpnG
+EPDLKvbdFpASwHFy
+EPCjjvbdRbDeLiYk
+DncLKvbdXmqAYUut
+EObjjvbdqlyjZLgi
+DoCjjvbdssSTYydc
+DnbkKvbdTIzJqABM
+EPCkKvbdxsOJNRag
+EPCjjvbdlhcspuSB
+EObkKvbdqUTgSRjt
+EOcKjvbdOEcshhkE
+EObjjvbdzjUpPdTU
+DnbkKvbdvwLaVaWV
+EPCjjvbdmoyyVkYb
+DoCkKvbdOFETiJKd
+EPCjjvbdeEnqawCj
+EObjjvbdmuUzKjRf
+EPDLKvbdVvhxVdFH
+EPCkKvbdaSGDHsek
+EPCjjvbdkySrTZHU
+EObjjvbdtAGqIABS
+EObkKvbdZyEJmblS
+DncKjvbdyTOJMrCH
+DncLKvbdFWYoolie
+DoDLKvbdTvMPjUAq
+EObjjvbdZLqctOLm
+DnbkKvbdmIctQuSB
+DoCkKvbdZGvdAPTJ
+DoCjjvbdkDMLRGuH
+DoDLKvbdnVUykKSG
+DoDKjvbdLGFhBaRV
+DncLKvbdxwiKBozL
+DncLKvbdWIYWXgYz
+DncLKvbdFkFSbglu
+DoDKjvbdIGgZxxXg
+DnbjjvbdEztRFMDJ
+DoDLKvbdZQldiNEq
+EOcLKvbdwWkaWAvV
+DoDKjvbdLBLHMawq
+DoDLKvbdkMbLzFGo
+EPDKjvbdREDAopcr
+DoCkKvbdZoNiEdyj
+EPDLKvbddneSkUUS
+DnbkKvbdSQUHJecw
+DoCjjvbdZshhxcrn
+DnbjjvbdRkZFuHLT
+EPDKjvbdwuNEqYkn
+DoDLKvbdemGXGmJk
+EOcLKvbdKWVGDeGi
+DoCkKvbdWSOXadkc
+EObjjvbdVTmTelWK
+DncKjvbdhkeDmuDZ
+EPCkKvbdRWnEDMID
+DnbjjvbdNQYRVnGs
+DnbkKvbdTfzmlWvF
+DoCkKvbdFpASvgGZ
+DoCjjvbdqTsfqqkU
+EObkKvbdUVkpKUAq
+DoDLKvbdrRtkNjaN
+EPCkKvbdrJAKEmOe
+DncKjvbdIGfyyYXg
+DnbjjvbdZLrDtNkm
+EObjjvbdiMEcmuCy
+DncKjvbdkyTSTZHU
+DncLKvbdBsAbtFvr
+DnbkKvbdrpWPKDWG
+DncKjvbdbBWFFoow
+DoDLKvbdxmsIXsJD
+DnbkKvbdehLWRnRH
+EObkKvbdiVZeXRuC
+DnbkKvbdOTUVfduQ
+DncLKvbdZjTIQHCG
+DoDLKvbdOSsugFVQ
+DoCjjvbdrafNLgKy
+EPDLKvbdNPxRVmgT
+EPDKjvbdHlBznXQk
+EPCkKvbdCEQBWKMf
+EObjjvbdtcDUwWOo
+DoCjjvbdZMSDtNlN
+DoDLKvbdvAcxrneI
+EObjjvbdIxUCILpp
+EOcKjvbdfSBWzkbo
+EObkKvbdShzKRAAl
+DnbjjvbdGZUuBDxC
+EObkKvbdqlzKYkhJ
+EPDKjvbdZyEKNbkr
+DoDLKvbdsrrTYzFD
+DoCkKvbdfSAvzkcP
+DnbjjvbdqlzKYlHi
+EPDKjvbdYTLaNToY
+EPCjjvbdjEjgUoAO
+EOcKjvbdTJZjRABM
+EObkKvbdYORAXtvU
+DoDLKvbdGKdrcHmV
+DoDLKvbdbrcLUEJa
+DncLKvbdqvpLcJZR
+DnbkKvbdFeiqnIsq
+EPDKjvbdZnnIeEzK
+EPCjjvbdnUtzLKRf
+DoDLKvbdDxXlUUTl
+DoDKjvbdiMEcnUby
+EObkKvbdYzbeqjWZ
+DncKjvbdTvLojUAq
+EOcLKvbdjuvmdBxX
+DnbjjvbdzoPpdcMY
+DoDKjvbdrovOibuf
+DoDKjvbdFWZPomJe
+DoDKjvbdqGDeUWBI
+DoCkKvbdWWiYVdEg
+EObkKvbdtvOXiqTA
+DnbjjvbdqZPIGpdY
+EObkKvbdLBKgNCYR
+DoCjjvbdLBKgNCYR
+EObjjvbdZsiJZESn
+DoCkKvbdTqROtuIN
+EPCjjvbdyfyMAMdw
+EOcLKvbdptTgSSLU
+DncLKvbdPxmAHTSK
+DnbjjvbdRkZFtfkT
+EPDLKvbdtlXvaUAw
+EPCkKvbdqBJFAWhE
+EPCkKvbdIidAJogE
+EPDLKvbdKQydoGOF
+EObkKvbdauCGwkTh
+EPCjjvbdNddUIiKd
+DoDLKvbdFfKRmhsq
+EPCkKvbdeEnqbXCj
+EObkKvbdJvVGDdfi
+DoDKjvbdWRmwaeLc
+EObkKvbdSCDeLiZL
+EPDKjvbdDoDLLWcE
+EPDLKvbdiMEcnUby
+DnbjjvbdLBLGmBxR
+EPCjjvbdZnmiEdyj
+EObjjvbdVhXuwgYz
+DncLKvbdUtNTfMVj
+EPDLKvbdKaKgMaxR
+DncKjvbdJcJbpicY
+DnbkKvbdSKyGVHLT
+DoDKjvbdzROlhjXA
+DnbkKvbdlrZUysEJ
+DoCkKvbdnQZyWLYb
+DoCjjvbdeFOqbWbj
+EOcLKvbdjgfkfGOL
+EObkKvbdiHJbyWKV
+DnbkKvbdGdLVibJj
+DoDKjvbdGLErcINV
+EPCjjvbdNGcPlpUk
+EOcKjvbdjFLGtoAO
+EOcKjvbdsBfMlGkZ
+EObjjvbdhtydvquC
+DoCjjvbdznpRFCkx
+DncLKvbdYSkaNUOx
+DoCjjvbdVvhxVdFH
+EPDLKvbdNeETiJLE
+DoDKjvbdcScLTdJa
+EOcLKvbdQwNdDLgc
+DoDLKvbdUMWPBWPJ
+DncKjvbdqFdEtVaI
+EObjjvbdhbPCeXRR
+DoCjjvbdKeehCApu
+DncKjvbdYNqAXuVt
+DoDLKvbdjmCLzFGo
+DoCkKvbdtlXwBUAw
+EObkKvbdwtmEqYlO
+EObjjvbdrovOjCvG
+EObkKvbdqrVLOLBN
+DoCjjvbdSBcdkhxk
+DncLKvbdrEEhomua
+EObkKvbdtbbtvuno
+EPDLKvbdZjShQGaf
+EPCjjvbdTAFJHbPE
+DnbjjvbdcScLTcia
+EObkKvbdbsDLUDia
+DnbkKvbdkyTSTYgU
+DncKjvbdySmhmSCH
+DoCjjvbdnBivxPNu
+DncKjvbdEXxLtTtM
+EObjjvbdZshhyESn
+DoDKjvbdkMbLzEfo
+EObjjvbdssRrxyeD
+DoDKjvbdcSbkTdKB
+EPDLKvbdHDjvJbKK
+DncLKvbdsQVnjCvG
+DnbjjvbdJSyBTMwl
+EOcLKvbddZxpYYqC
+EPCjjvbdrXQLcJZR
+DoCkKvbdnHEwlmfy
+EOcKjvbdGZUuBDwb
+EObjjvbdvOszqKnt
+EOcLKvbdRosgKFdX
+EPCjjvbdMpXqWNfs
+EPCkKvbdJbibqJcY
+DncKjvbdJvVFdEgJ
+EObkKvbdqwPkcIyR
+DnbkKvbdDwxMUTtM
+DncKjvbdtcDVXVno
+EPDLKvbdlZSrSxft
+DoCkKvbdKeehCApu
+EPDLKvbdQlxCYmtz
+EOcLKvbdYqNFJNFR
+DoCkKvbdnCKWwoOV
+EObjjvbdwzIFfYEr
+EOcKjvbdkDMLQfuH
+EPCjjvbdrSUjnLBN
+EPCkKvbdTfznMXVe
+EPCkKvbdZxdKNcMS
+DoCjjvbdJXsaglRQ
+DoCjjvbdNPwqWNgT
+DoCjjvbdLqwMzUpz
+EOcKjvbdCDoaWJlf
+DnbjjvbdlYsRsZGt
+DncKjvbdeOdsLUUS
+EOcKjvbdEvZQPmJe
+DoCkKvbdqBJFAXHd
+DnbjjvbdtkwwBUBX
+EObjjvbdLFfHaaQu
+DoDLKvbdbLMFoNcA
+EPDLKvbdiLdcnUby
+DnbkKvbdUQqPVUgm
+EOcLKvbdEOcLLXDE
+DoDKjvbdrEEhpOWB
+DncKjvbdkCkkQftg
+DncLKvbdMfbpNQUk
+DnbjjvbdTulQKUAq
+DoDLKvbdUtNUFkvK
+DncKjvbddndsKtTr
+EPDKjvbdliDsqVSB
+EPCkKvbdhbOcEvqR
+DoCkKvbdqceJQNua
+DoCkKvbdrWpLcIyR
+DncKjvbdrSVLNkAm
+DoDLKvbdyOShYTJD
+DncKjvbdyYJKBoyk
+DnbjjvbdZQldiNFR
+EPDLKvbdePEsKstS
+EPCjjvbdcScKtDia
+DncLKvbdxsOJNRbH
+EObjjvbdEYXlUUTl
+DoCkKvbdxUldqZMO
+EOcKjvbdRjxeuGkT
+EOcLKvbdqrVLNjaN
+DoCkKvbdDwwktUUM
+EOcLKvbdZQmEiNFR
+EPCkKvbdMSXMytpz
+DnbkKvbdnUtzKiqf
+DoCjjvbdREDAoqDr
+EPCjjvbdZyDinDMS
+EPCjjvbdiCPDEwRR
+EPCkKvbdmSZUzSci
+DoDKjvbdkWWmdCXw
+DnbkKvbdmJDsqVRa
+EPDKjvbdhzVGLpnG
+DoCkKvbdsPuoKDWG
+DoDLKvbdrylPsAgn
+EPCjjvbdsPuoJbuf
+EOcKjvbdrEFJQOVa
+EPCjjvbdEPDLLXCd
+DncKjvbdkVwOEBxX
+EPCkKvbdqGEFUWAh
+DncLKvbdtbcUvuno
+EOcKjvbdWIYWYGxz
+EPDLKvbdZLqcsmkm
+DoDKjvbdmaivwnnV
+DoCkKvbdOYPVzcmt
+DoCjjvbdVwIwvDeH
+DoCjjvbdYkrETmkm
+DoDKjvbdLFfHbAqV
+EObjjvbdkIHLefOL
+EPDKjvbdZjShPfaf
+DoCjjvbdehLWSORH
+DncLKvbdKfFgbBQu
+EObkKvbdsPunjDVf
+DncKjvbdiMEdNuCy
+DncKjvbdFfKSNhtR
+EOcKjvbdFVxpQNKF
+DncLKvbdfHkVrORH
+EObjjvbdKefIBaQu
+EPDKjvbduCbtvuoP
+EPCkKvbdGdLWKCKK
+DncLKvbdLAkGmBwq
+DncLKvbdZshiZESn
+DnbjjvbdySmhmSCH
+DoDKjvbdACqxJyiQ
+DncLKvbdmajXYOmu
+DnbjjvbdxVNFRZMO
+DnbjjvbdVqmxBdlD
+DnbkKvbdIGgZyYXg
+DncKjvbdddnrBvcK
+EPCjjvbdUGzmkwVe
+DncLKvbdaNLCTVNH
+DoCkKvbdWWhwucdg
+DncKjvbdkWWmcaxX
+DoDKjvbdaRfChUGL
+EPDLKvbdOEcsiJKd
+DoDLKvbdGLFTChMu
+EObjjvbdjmBkzFHP
+DncLKvbdrWokcJYq
+EObjjvbdDHMGHAzc
+EObkKvbdRyjITCvA
+DnbjjvbdWRnXbElD
+DoCjjvbdEARiNZvw
+DnbkKvbdRjyFtfjs
+DoCkKvbdMgDQNQVL
+DoDKjvbdCEPaWJmG
+DoCkKvbdUtNTfLuj
+DoDKjvbdNGcQMpVL
+DoDKjvbdZQmFImEq
+EObjjvbdyYIibPyk
+DoDLKvbdcSbjtDjB
+EPCjjvbdPxmAGsSK
+EPCjjvbdnUuZjirG
+EPCkKvbddijSVtzn
+EOcKjvbdxUmEqYlO
+EOcKjvbdxrmiNRag
+EPCkKvbdjmBlZeHP
+EOcKjvbdvBDySndh
+EObjjvbdliDsqVSB
+EOcKjvbdTvMQKUBR
+DncLKvbdRNXbYnUz
+DnbjjvbdyYIiaozL
+DoCkKvbdhbPDEwRR
+EPDKjvbdptUGrSLU
+DoDKjvbdFjeTChMu
+DnbkKvbdFVxoomJe
+EObkKvbdlYrrSyGt
+EPDLKvbdVZHszKnn
+DncLKvbdDwwktUUM
+DncLKvbdDnbkKvcE
+EPCkKvbdjJfHjMwr
+EPDKjvbdUtNTfMWK
+EObjjvbdbhlikGWx
+DncLKvbdKfFhCBQu
+DoDKjvbdVgwvXgYz
+EPDLKvbdiBoCdwRR
+EPDLKvbdzdzOzeZp
+EObkKvbdMoxRWNgT
+EPDKjvbdjvXNdBww
+EObkKvbdUtMsfLuj
+EOcLKvbdnUuZjjRf
+DnbkKvbduCbtwVoP
+EPDLKvbdGGKRmhsq
+EObkKvbdePEsLTtS
+DoCjjvbdSKyGUgLT
+EOcLKvbdRbDdlIyL
+DoDLKvbdNxPVzcnU
+EObjjvbdkCkkRGtg
+DncKjvbdVTmUFkvK
+DncKjvbdUsltFkuj
+EPDKjvbdSCEElJZL
+EOcKjvbdZxcjNcMS
+DoCjjvbdEJgjWYKA
+DncLKvbdREDBQRDr
+DncKjvbddoErjtUS
+EPDLKvbdADSYJyiQ
+EPDKjvbdatafxKsh
+EPDLKvbdkIGkeemk
+DoDLKvbdmRxtzSci
+DnbkKvbdTlWPAvPJ
+DncKjvbdjJegjMwr
+DoCkKvbdqTtHSSKt
+EOcKjvbdkMakzFHP
+DncLKvbddZyPwxpb
+DnbkKvbdTppnuUgm
+EObkKvbdnPyxukZC
+DoDKjvbdbiNJjewY
+EPDKjvbdJSyArlwl
+EPDLKvbdvvlBVaVu
+EOcLKvbdjJfIKMxS
+EPDLKvbdliETqVRa
+DoCkKvbdWXJXvEFH
+DncLKvbdiHKDZWKV
+EObkKvbdEXwktUUM
+EOcKjvbdRWnDcMID
+EPDLKvbdbhljKfWx
+DnbkKvbdVTlsfMVj
+DnbjjvbdZoOIdeZj
+DoDKjvbdDxYLtUTl
+EObjjvbdmIdTqUqa
+EPCjjvbdiZtekqNf
+DoDLKvbdMfcPmPtk
+EPDLKvbdKxpirztf
+DnbkKvbdEARhlzWw
+EOcKjvbdqiAJeMne
+DnbjjvbdUsltGMWK
+DnbkKvbdMoxRWNfs
+EPCjjvbdTqQntuIN
+EPDKjvbdLFfHbApu
+EOcLKvbdANIZSwZx
+DoCjjvbdSLZGUfjs
+DoDLKvbdJSyArlxM
+EOcLKvbddZxoxZRC
+DoDLKvbdRpTfjFcw
+EObjjvbdKefHbBRV
+EPCkKvbdjlakyeGo
+DoDLKvbdiBncFXRR
+EObkKvbdkHfkefOL
+DnbjjvbdfILVrORH
+DnbjjvbdbsDKtDia
+DoCjjvbdqiAKElne
+EObkKvbdEXxMTtUM
+DncKjvbdHfgZxxXg
+EPDKjvbdQvnDcMID
+DoDKjvbdCSaCsewS
+DncLKvbdSZigsDWA
+DnbkKvbdiUyeXSUb
+DnbkKvbdZRNFJMeR
+EPDKjvbdDxXlTstM
+EPCjjvbdkNBlZdfo
+DnbkKvbdhuZdvqtb
+DncLKvbdHDkWJajK
+EOcKjvbdhficZWKV
+DoDLKvbdxwiKCPyk
+EPDLKvbdZQleJMeR
+DoDLKvbdLrXMytpz
+DncKjvbdcTCjtEJa
+DnbkKvbdUMVnaWPJ
+DoCjjvbdnBjXYPOV
+EObjjvbduWNwjQsA
+DoCjjvbdRpUHJecw
+DnbkKvbdJYUBglQp
+EOcLKvbduoTzqKoU
+EObjjvbdZMRctNlN
+EObkKvbdziuPpESt
+DoDLKvbduLxWaTaX
+EOcLKvbdhgKDZWKV
+DnbkKvbdZQldhmFR
+EOcLKvbdcyyPxZQb
+EOcKjvbdRWnDcLgc
+DncLKvbdxZgfFweS
+EPCkKvbdyqOliJwA
+DnbjjvbdsPvPKCuf
+DoCjjvbdMgCpNQVL
+DncLKvbdOEdTiJKd
+EPDKjvbdEARiMyvw
+EOcLKvbdJbibqKDY
+DoCkKvbdeEnrCWbj
+DoCkKvbdGKdrcIMu
+DnbkKvbdUMWOaVoJ
+DoCkKvbdKaKgNCXq
+DnbkKvbdoAKztHdO
+EPDKjvbdDxXlUUTl
+EOcLKvbdFVxoomJe
+EOcKjvbdpyPHfpdY
+EPCjjvbdxwiJaoyk
+DoCkKvbdlqxtyrci
+EOcKjvbdfHkWRmpg
+DoCjjvbdkMalZdfo
+EPCjjvbdJpyePGOF
+DncLKvbdqUUHRqjt
+DoDLKvbdziuQPdSt
+DoDKjvbdBhjajiGK
+EPDKjvbdjcLjpftg
+EPDKjvbdVwJYWEFH
+DnbjjvbdNdcsiJLE
+DoCjjvbdQwODcLgc
+EOcLKvbdtkxXAtAw
+EPDKjvbdwMvANEEm
+DoCjjvbdqFdEsuaI
+EObjjvbdrSUjmjaN
+DoDLKvbdnGeYMnGy
+EOcLKvbdPyNAHTSK
+DnbkKvbdMowpvNgT
+DoCjjvbdGdLVibKK
+DoDLKvbdtcDVXVno
+EObkKvbdtlXwBUAw
+DoCjjvbdSPsgKGEX
+EPCjjvbdURQntuHm
+DncLKvbdrMyjZLgi
+EPDKjvbdwXMAvBVu
+EOcLKvbdRjxfUfkT
+DnbkKvbdGFjRnJTq
+DoCkKvbdbUbHYLTh
+EPDKjvbdoznEKxPA
+EPCjjvbdLiBlQxAS
+DncKjvbdfVzxPizs
+DnbjjvbdSKyFtgLT
+EPDKjvbdrXPlCiZR
+DncLKvbdhzVGLpnG
+EObjjvbdVwJYVdFH
+EPDKjvbdwXLaWBVu
+EPCjjvbdjhHMGFmk
+EObkKvbdKyQjSzuG
+DoCjjvbdmfeYNOHZ
+DoDLKvbdZirgofaf
+EOcLKvbdZoOIdeZj
+EPCkKvbdLFfHbApu
+EPCkKvbdjvWnEBww
+DoDKjvbdcScLUEKB
+DoCkKvbdkCkjqHUg
+DoDKjvbdyTNhmSBg
+DoCkKvbdkHgLfFnL
+EPCjjvbdzoQQdcLx
+DoCjjvbdOTTvHEtp
+EPCkKvbdznopeDLx
+EPCkKvbdGFjRmhtR
+EPCkKvbdUaCQrpqy
+EOcKjvbdnGeXmOHZ
+DoDKjvbdiCPDEwRR
+DoCjjvbdRbEFLiYk
+DncKjvbdRXOECkgc
+EPCjjvbdKWUedEgJ
+DncKjvbdDjIJvYKA
+DoDKjvbdyTOJNRbH
+DoCjjvbdePFTKtTr
+DoDKjvbdhtyeWrVC
+EPCkKvbdqvolCiZR
+DoDLKvbdapHHELzd
+EObjjvbdlhdUQtrB
+EOcKjvbdptUGrRkU
+EPCjjvbdqUTfqrLU
+EPCkKvbdcJMikGWx
+DoDKjvbdlhctRVRa
+EOcLKvbdANHyTXZx
+EPDKjvbdpssfqrKt
+EPCkKvbdFeiqnJTq
+DoCkKvbdxZgfGXdr
+EOcLKvbdRWmcblHc
+DncLKvbdjggMFemk
+DoDKjvbdKeegbBQu
--- a/jdk/.hgtags Thu Jun 28 09:32:28 2012 -0700
+++ b/jdk/.hgtags Wed Jul 05 18:15:17 2017 +0200
@@ -166,3 +166,4 @@
cf5c1f6fbc5ba14163fe0ef8eb8601b33f951372 jdk8-b42
b3246687c3695dff6f461bb407f9db88f7d072e7 jdk8-b43
db471a7af03168e4441c245b1d9976f720a7cb77 jdk8-b44
+b92353a01aa049bc508fc56f0347d5934b7c4390 jdk8-b45