diff --git a/config.properties b/config.properties index 244c4fb..2b2c397 100644 --- a/config.properties +++ b/config.properties @@ -3,4 +3,4 @@ debug=true # 地址列表 (格式: addX=ip:port) -addr1=baishe.fullstack.club:18889 +addr1=192.168.110.240:8889 diff --git a/pom.xml b/pom.xml index d39e475..162b92c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.sunyard.sge.database sydapi-database - 1.20 + 1.24 sydapi-database @@ -63,7 +63,7 @@ net.java.dev.jna jna - 5.13.0 + 4.5.0 diff --git a/qodana.yaml b/qodana.yaml new file mode 100644 index 0000000..9e9be8d --- /dev/null +++ b/qodana.yaml @@ -0,0 +1,31 @@ +#-------------------------------------------------------------------------------# +# Qodana analysis is configured by qodana.yaml file # +# https://www.jetbrains.com/help/qodana/qodana-yaml.html # +#-------------------------------------------------------------------------------# +version: "1.0" + +#Specify inspection profile for code analysis +profile: + name: qodana.starter + +#Enable inspections +#include: +# - name: + +#Disable inspections +#exclude: +# - name: +# paths: +# - + +projectJDK: "8" #(Applied in CI/CD pipeline) + +#Execute shell command before Qodana execution (Applied in CI/CD pipeline) +#bootstrap: sh ./prepare-qodana.sh + +#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline) +#plugins: +# - id: #(plugin id can be found at https://plugins.jetbrains.com) + +#Specify Qodana linter for analysis (Applied in CI/CD pipeline) +linter: jetbrains/qodana-jvm-community:2025.1 diff --git a/src/main/java/com/sunyard/sge/database/Env.java b/src/main/java/com/sunyard/sge/database/Env.java new file mode 100644 index 0000000..fd0f635 --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/Env.java @@ -0,0 +1,19 @@ +package com.sunyard.sge.database; + +public class Env { + + private static boolean isLinux = false; + + static { + String os = System.getProperty("os.name").toLowerCase(); + if (os.contains("nix") || os.contains("nux") || os.contains("aix")) { + isLinux = true; + } else { + isLinux = false; + } + } + + public static boolean isLinux(){ + return isLinux; + } +} diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java index a9e5146..5e9cb24 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi.java +++ b/src/main/java/com/sunyard/sge/database/SydApi.java @@ -28,8 +28,10 @@ public interface SydApi { } // logback 版本的日志直接由外部配置文件控制 - // 初始化 C 部分日志 - SydLibrary.INSTANCE.SYD_SetLogConfig(pcLogPath, pcLogPath.getBytes().length, iLogLevel); + if ( Env.isLinux() ){ + // 初始化 C 部分日志 + SydLibrary.INSTANCE.SYD_SetLogConfig(pcLogPath, pcLogPath.getBytes().length, iLogLevel); + } } /** @@ -274,10 +276,10 @@ public interface SydApi { * * @param iEncKeyIndex:输入。加密所需要的密钥索引值 * @param iMacKeyIndex:输入。计算mac所需要的密钥索引值 - * @param pcData: 输入。计算mac所需要的数据。 + * @param pcData: 输入。计算mac所需要的数据。 * @return DataAndMac - * - data 密文 - * - mac值 (固定长度16字节)转HEX 字符串格式 + * - data 密文 + * - mac值 (固定长度16字节)转HEX 字符串格式 */ DataAndMac SYD_SM4_EncryptAndMac_ShortData( int iEncKeyIndex, @@ -287,11 +289,10 @@ public interface SydApi { /** * 短数据校验 MAC 并解密 - * * @param iEncKeyIndex:输入。加密所需要的密钥索引值 * @param iMacKeyIndex:输入。计算mac所需要的密钥索引值 - * @param pcData 输入。密文。 - * @param mac 输入。密文的 MAC。 + * @param pcData 输入。密文。 + * @param mac 输入。密文的 MAC。 * @return 明文 */ DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData( @@ -307,7 +308,6 @@ public interface SydApi { int[] iMacKeyIndex, List pcData ); - List SYD_SM4_CheckMacAndDecrypt_BatchData( int[] iEncKeyIndex, int[] iMacKeyIndex, diff --git a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java index 563bddf..f273e63 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java @@ -99,12 +99,12 @@ public class SydApiBaseFunction implements SydApi { try { api.disconnect(); } catch (Exception e) { - + // free } } } } catch (Exception e) { - + // free } hsms = null; } @@ -683,7 +683,7 @@ public class SydApiBaseFunction implements SydApi { // 仅一包 和 第一包 忽略 pcProcData 参数 if (Consts.PkgNumAll != iPkgNum && Consts.PkgNumHead != iPkgNum) { - iv = pcProcData; + iv = Util.bytes2HexString(pcProcData).getBytes(); } SydApiException le = new SydApiException(-1); updateLastUseTime(); @@ -768,7 +768,7 @@ public class SydApiBaseFunction implements SydApi { // 仅一包 和 尾包 返回最终结果 if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) { - return new LongDataReturn<>(null, pcMac.equals(ret.getData())); + return new LongDataReturn<>(null, Arrays.equals(pcMac, ret.getData())); } else { // 返回中间值 return new LongDataReturn<>(ret.getProcData(), false); @@ -866,7 +866,7 @@ public class SydApiBaseFunction implements SydApi { updateLastUseTime(); byte[] mac = this.SYD_SM4Mac_ShortData(iKeyIndex, pcData, limitDataLen); log.debug(this + ".SYD_SM4Mac_ShortData方法返回值:{}", mac); - return pcMac.equals(mac); + return Arrays.equals(pcMac, mac); } @@ -886,7 +886,7 @@ public class SydApiBaseFunction implements SydApi { } // 参数检查在函数内部 byte[] enData = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_ENC); - // mac 长度放宽到 1024,因为密文填充 + // mac 长度放宽到 1040,因为密文填充 byte[] mac = SYD_SM4Mac_ShortData(iMacKeyIndex, enData, 1040); return new DataAndMac(enData, mac); } @@ -909,6 +909,7 @@ public class SydApiBaseFunction implements SydApi { return new DataAndMacCheck(data, ret); } + @Override public List SYD_SM4_EncryptAndMac_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { @@ -947,11 +948,6 @@ public class SydApiBaseFunction implements SydApi { log.debug("SYD_SM4_CheckMacAndDecrypt_BatchData"); } - if (pcData.isEmpty()) { - log.info("SYD_SM4_CheckMacAndDecrypt_BatchData pcData isEmpty"); - return new ArrayList<>(); - } - if (null == this.hsms || null == iMacKeyIndex) { throw new SydApiException("输入内容为空", 0x01000001); } @@ -959,11 +955,17 @@ public class SydApiBaseFunction implements SydApi { throw new SydApiException("密钥长度和数据长度不对应", 0x01000001); } + if (pcData.isEmpty()) { + log.info("SYD_SM4_CheckMacAndDecrypt_BatchData pcData isEmpty"); + return new ArrayList<>(); + } + + List macs = new ArrayList<>(pcData.size()); List datas = new ArrayList<>(pcData.size()); - for (int i = 0; i < macs.size(); i++) { - macs.add(pcData.get(i).getMac()); - datas.add(pcData.get(i).getData()); + for (DataAndMac pcDatum : pcData) { + macs.add(pcDatum.getMac()); + datas.add(pcDatum.getData()); } boolean[] macCheck = SYD_SM4Mac_BatchData(iMacKeyIndex, datas, macs); diff --git a/src/main/java/com/sunyard/sge/database/SydApiBuilder.java b/src/main/java/com/sunyard/sge/database/SydApiBuilder.java index e11a966..1cbe475 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiBuilder.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBuilder.java @@ -21,10 +21,9 @@ public class SydApiBuilder { int[] iPortList, int iConnectTimeOut, int iDealTimeOut - ) { - this(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut, new PoolConfig()); + ) { + this( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut, new PoolConfig() ); } - public SydApiBuilder( String[] pcIpList, int[] iPortList, @@ -36,22 +35,23 @@ public class SydApiBuilder { if (log.isDebugEnabled()) { log.debug("创建链接"); - log.debug("SydApiBuilder构造方法接收参数:pcIpList:{},iPortList:{},iConnectTimeOut:{},iDealTimeOut:{}", Arrays.toString(pcIpList), Arrays.toString(iPortList), iConnectTimeOut, iDealTimeOut); + log.debug("SydApiBuilder构造方法接收参数:pcIpList:{},iPortList:{},iConnectTimeOut:{},iDealTimeOut:{}", Arrays.toString(pcIpList),Arrays.toString(iPortList),iConnectTimeOut,iDealTimeOut); log.debug("pool config {}", config); } - // 同时初始化 jna 下 c 的链接 - int ret = ConnectHandlerManager.init(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut); + if ( Env.isLinux() ) { + // 同时初始化 jna 下 c 的链接 + int ret = ConnectHandlerManager.init(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut); - if (0 != ret) { - throw new SydApiException(-1); + if ( 0 != ret ) { + throw new SydApiException(-1); + } } - HsmLinkInfo[] linkInfo = HsmLinkInfo.mutiHsmLinkInfo(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut); this.pool = new SydApiPool(config, linkInfo); longLinkWorks = new CommWorker(); - warmUp(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut); + warmUp( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut ); } public CommWorker getLongLinkWorks() { @@ -60,54 +60,52 @@ public class SydApiBuilder { /** * 获取池内对象 - * * @return 池内对象 */ - public SydApi get() { + public SydApi get(){ return pool.get(); } /** * 升级 * 修改了原实现 - * * @return 包装对象 */ public SydApi build() { - return new SydApiLongLinkWrap(this); + return new SydApiLongLinkWrap( this ); } private void warmUp(String[] pcIpList, int[] iPortList, int iConnectTimeOut, - int iDealTimeOut) { + int iDealTimeOut){ SydApi api = null; try { api = new SydApi4Database(); - api.SYD_Short_Connect_Ex(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut); + api.SYD_Short_Connect_Ex( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut ); try { - api.SYD_SM3_Hash_ShortData(new byte[8]); + api.SYD_SM3_Hash_ShortData( new byte[8] ); - } catch (Exception e) { + }catch ( Exception e) { // 忽略 } try { - api.SYD_SM4_ShortData(0, new byte[16], Consts.ECB_ENC); + api.SYD_SM4_ShortData( 0 , new byte[16], Consts.ECB_ENC ); - } catch (Exception e) { + }catch ( Exception e) { // 忽略 } - } catch (Exception e) { + } catch ( Exception e ){ // 忽略预热失败 } finally { - if (null != api) { + if ( null != api ) { api.SYD_Disconnect_Ex(); } } diff --git a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java index d359c4b..214bedc 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java +++ b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java @@ -28,7 +28,7 @@ public class SydApiLongLinkWrap implements SydApi { org.slf4j.Logger log = LoggerFactory.getLogger(ThreadBasedConnectPool.class); - private SydApiBuilder builder; + private final SydApiBuilder builder; public SydApiLongLinkWrap(SydApiBuilder builder) { this.builder = builder; @@ -46,12 +46,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public byte[] SYD_SM3_Hash_ShortData(byte[] pcData) { - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public byte[] call() throws Exception { - return builder.get().SYD_SM3_Hash_ShortData(pcData); - } - }); + FutureTask task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM3_Hash_ShortData(pcData)); try { return task.get(); } catch (Exception e) { @@ -64,12 +59,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public LongDataReturn SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, byte[] pcProcData) { - FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { - @Override - public LongDataReturn call() throws Exception { - return builder.get().SYD_SM3_Hash_LongData(pcData, iPkgNum, pcProcData); - } - }); + FutureTask> task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM3_Hash_LongData(pcData, iPkgNum, pcProcData)); try { return task.get(); } catch (Exception e) { @@ -82,12 +72,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) { - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public byte[] call() throws Exception { - return builder.get().SYD_SM4_ShortData(iKeyIndex, pcData, iFlag); - } - }); + FutureTask task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4_ShortData(iKeyIndex, pcData, iFlag)); try { return task.get(); } catch (Exception e) { @@ -100,12 +85,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public byte[] SYD_SM4_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) { - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public byte[] call() throws Exception { - return builder.get().SYD_SM4_LongData(iKeyIndex, pcData, iPkgNum, iFlag); - } - }); + FutureTask task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4_LongData(iKeyIndex, pcData, iPkgNum, iFlag)); try { return task.get(); } catch (Exception e) { @@ -119,12 +99,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, byte[] pcProcData) { - FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { - @Override - public LongDataReturn call() throws Exception { - return builder.get().SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData); - } - }); + FutureTask> task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData)); try { return task.get(); } catch (Exception e) { @@ -137,12 +112,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, byte[] pcProcData, byte[] pcMac) { - FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { - @Override - public LongDataReturn call() throws Exception { - return builder.get().SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData, pcMac); - } - }); + FutureTask> task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData, pcMac)); try { return task.get(); } catch (Exception e) { @@ -155,12 +125,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public byte[] SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public byte[] call() throws Exception { - return builder.get().SYD_SM4Mac_ShortData(iKeyIndex, pcData); - } - }); + FutureTask task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4Mac_ShortData(iKeyIndex, pcData)); try { return task.get(); } catch (Exception e) { @@ -173,12 +138,7 @@ public class SydApiLongLinkWrap implements SydApi { @Override public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, byte[] pcMac) { - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public Boolean call() throws Exception { - return builder.get().SYD_SM4Mac_ShortData(iKeyIndex, pcData, pcMac); - } - }); + FutureTask task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4Mac_ShortData(iKeyIndex, pcData, pcMac)); try { return task.get(); } catch (Exception e) { @@ -189,26 +149,11 @@ public class SydApiLongLinkWrap implements SydApi { } } - private DataAndMac SYD_SM4_AllInOne(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { + DataAndMac SYD_SM4_EncryptAndMac_ShortData_java(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { try { - FutureTask taskEnc = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public byte[] call() throws Exception { - return builder.get().SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_ENC); - } - }); + FutureTask taskEnc = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4_EncryptAndMac_ShortData(iEncKeyIndex, iMacKeyIndex, pcData)); - byte[] enData = taskEnc.get(); - - FutureTask taskMac = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public byte[] call() throws Exception { - return builder.get().SYD_SM4Mac_ShortData(iMacKeyIndex, enData); - } - }); - - byte[] mac = taskMac.get(); - return new DataAndMac(enData, mac); + return taskEnc.get(); } catch (SydApiException e) { throw e; } catch (Exception e) { @@ -221,7 +166,15 @@ public class SydApiLongLinkWrap implements SydApi { @Override public DataAndMac SYD_SM4_EncryptAndMac_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { - log.info("SYD_SM4_EncryptAndMac_ShortData {} {}", iEncKeyIndex, iMacKeyIndex); + if (Env.isLinux()) { + return SYD_SM4_EncryptAndMac_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData); + } else { + return SYD_SM4_EncryptAndMac_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData); + } + } + + DataAndMac SYD_SM4_EncryptAndMac_ShortData_c(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { + log.info("SYD_SM4_EncryptAndMac_ShortData_c {} {}", iEncKeyIndex, iMacKeyIndex); try { if (!ConnectHandlerManager.isInited()) { throw new SydApiException(-1); @@ -255,67 +208,6 @@ public class SydApiLongLinkWrap implements SydApi { } else { throw new SydApiException(i); } - -// return SYD_SM4_AllInOne(iEncKeyIndex, iMacKeyIndex, pcData); - -// // 线程池忙, 使用单线程计算 -// if( builder.getLongLinkWorks().threadPoolIsBusy() ) { -// return SYD_SM4_AllInOne(iEncKeyIndex, iMacKeyIndex, pcData); -// } -// -// // 线程池不忙,使用并发计算 -// -// // 将pcData拆分为两半,第一半16字节对齐 -// int halfLength = pcData.length / 2; -// int alignedLength = (halfLength + 15) & ~15; // 向上取整到16的倍数 -// alignedLength = Math.min(alignedLength, pcData.length); // 不超过原始数据长度 -// if (alignedLength < 16) { -// throw new IllegalArgumentException("数据长度不足16字节,无法对齐"); -// } -// -// -// byte[] firstHalf = Arrays.copyOfRange(pcData, 0, alignedLength); -// byte[] secondHalf = Arrays.copyOfRange(pcData, alignedLength, pcData.length); -// -// -// FutureTask taskEnc1 = builder.getLongLinkWorks().fTask(new Callable() { -// @Override -// public byte[] call() throws Exception { -// return builder.get().SYD_SM4_LongData( iEncKeyIndex, firstHalf, 1, Consts.ECB_ENC); -// } -// }); -// FutureTask taskEnc2 = builder.getLongLinkWorks().fTask(new Callable() { -// @Override -// public byte[] call() throws Exception { -// return builder.get().SYD_SM4_LongData( iEncKeyIndex, secondHalf, 3, Consts.ECB_ENC); -// } -// }); -// -// byte[] enData1 = taskEnc1.get(); -// FutureTask> taskMac = builder.getLongLinkWorks().fTask(new Callable< LongDataReturn>() { -// @Override -// public LongDataReturn call() throws Exception { -// return builder.get().SYD_SM4Mac_LongData(iMacKeyIndex, enData1, 1, null); -// } -// }); -// -// byte[] enData2 = taskEnc2.get(); -// LongDataReturn macProc = taskMac.get(); -// FutureTask> taskMac2 = builder.getLongLinkWorks().fTask(new Callable>() { -// @Override -// public LongDataReturn call() throws Exception { -// return builder.get().SYD_SM4Mac_LongData(iMacKeyIndex, enData2, 3, macProc.getProcData()); -// } -// }); -// LongDataReturn mac = taskMac.get(); -// -// // 合并密文 -// byte[] enData = new byte[enData1.length + enData2.length]; -// System.arraycopy(enData1, 0, enData, 0, enData1.length); -// System.arraycopy(enData2, 0, enData, enData1.length, enData2.length); -// -// -// return new DataAndMac(enData, mac.getData()); } catch (SydApiException e) { throw e; } catch (Exception e) { @@ -326,9 +218,19 @@ public class SydApiLongLinkWrap implements SydApi { } } + @Override public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, byte[] macs) { - log.info("SYD_SM4_CheckMacAndDecrypt_ShortData {} {}", iEncKeyIndex, iMacKeyIndex); + if (Env.isLinux()) { + return SYD_SM4_CheckMacAndDecrypt_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData, macs); + } else { + return SYD_SM4_CheckMacAndDecrypt_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData, macs); + } + } + + + public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData_c(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, byte[] macs) { + log.info("SYD_SM4_CheckMacAndDecrypt_ShortData_c {} {}", iEncKeyIndex, iMacKeyIndex); try { if (!ConnectHandlerManager.isInited()) { throw new SydApiException(-1); @@ -351,7 +253,6 @@ public class SydApiLongLinkWrap implements SydApi { byte[] data = new byte[decryptedDataLen.getValue()]; System.arraycopy(decryptedData, 0, data, 0, data.length); - System.out.println("outlen=" + data.length); if (0 == i) { return new DataAndMacCheck(data, true); @@ -369,24 +270,36 @@ public class SydApiLongLinkWrap implements SydApi { } throw new SydApiException("并行任务执行失败", 0xC101, e); } + } - // FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { -// @Override -// public DataAndMacCheck call() throws Exception { -// return builder.get().SYD_SM4_CheckMacAndDecrypt_ShortData(iEncKeyIndex, iMacKeyIndex, pcData, mac); -// } -// }); -// try { -// return task.get(); -// } catch (Exception e) { -// throw new SydApiException("并行任务执行失败", 0xC101, e); -// } + public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData_java(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, byte[] macs) { + log.info("SYD_SM4_CheckMacAndDecrypt_ShortData_java {} {}", iEncKeyIndex, iMacKeyIndex); + FutureTask task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4_CheckMacAndDecrypt_ShortData(iEncKeyIndex, iMacKeyIndex, pcData, macs)); + try { + return task.get(); + } catch (SydApiException e) { + throw e; + } catch (Exception e) { + if (e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } @Override public List SYD_SM4_EncryptAndMac_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { - log.info("SYD_SM4_EncryptAndMac_BatchData {} {}", iEncKeyIndex, iMacKeyIndex); + if (Env.isLinux()) { + return SYD_SM4_EncryptAndMac_BatchData_c(iEncKeyIndex, iMacKeyIndex, pcData); + } else { + return SYD_SM4_EncryptAndMac_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); + } + } + + + public List SYD_SM4_EncryptAndMac_BatchData_c(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { + log.info("SYD_SM4_EncryptAndMac_BatchData_c {} {}", iEncKeyIndex, iMacKeyIndex); if (!ConnectHandlerManager.isInited()) { throw new SydApiException(-1); @@ -406,42 +319,64 @@ public class SydApiLongLinkWrap implements SydApi { // 3. 准备 MAC 输出缓冲 Pointer[] pcMacArray = new Pointer[pcData.size()]; + try { - for (int i = 0; i < pcData.size(); i++) { - byte[] bytes = pcData.get(i); - // 为每个 byte[] 分配本地内存并复制数据 - Memory memory = new Memory(bytes.length); - memory.write(0, bytes, 0, bytes.length); - pcDataArray[i] = memory; - iDataLen[i] = bytes.length; - iEncDataLen[i] = BytesUtil.calculatePaddedLength(bytes.length); - pcEncArray[i] = new Memory(iEncDataLen[i]); - pcMacArray[i] = new Memory(16); - } - - // 调用加密函数 - int result = SydLibrary.INSTANCE.SYD_SM4_Encrypt_Mac_BatchData( - ConnectHandlerManager.getHandler(), - iEncKeyIndex, - iMacKeyIndex, - pcDataArray, - iDataLen, - size, - pcEncArray, - iEncDataLen, - pcMacArray); - - if (0 == result) { - // 转换结果为Java风格的对象列表 - List results = new ArrayList<>(); - for (int i = 0; i < size; i++) { - results.add(new DataAndMac(pcEncArray[i].getByteArray(0, iEncDataLen[i]), pcMacArray[i].getByteArray(0, 16))); + for (int i = 0; i < pcData.size(); i++) { + byte[] bytes = pcData.get(i); + // 为每个 byte[] 分配本地内存并复制数据 + Memory memory = new Memory(bytes.length); + memory.write(0, bytes, 0, bytes.length); + pcDataArray[i] = memory; + iDataLen[i] = bytes.length; + iEncDataLen[i] = BytesUtil.calculatePaddedLength(bytes.length); + pcEncArray[i] = new Memory(iEncDataLen[i]); + pcMacArray[i] = new Memory(16); } - return results; - } else { - throw new SydApiException(result); + // 调用加密函数 + int result = SydLibrary.INSTANCE.SYD_SM4_Encrypt_Mac_BatchData( + ConnectHandlerManager.getHandler(), + iEncKeyIndex, + iMacKeyIndex, + pcDataArray, + iDataLen, + size, + pcEncArray, + iEncDataLen, + pcMacArray); + + + if (0 == result) { + // 转换结果为Java风格的对象列表 + List results = new ArrayList<>(); + for (int i = 0; i < size; i++) { + results.add(new DataAndMac(pcEncArray[i].getByteArray(0, iEncDataLen[i]), pcMacArray[i].getByteArray(0, 16))); + } + + return results; + } else { + throw new SydApiException(result); + } + } finally { +// for ( Pointer d : pcDataArray ) { +// if ( d instanceof Memory ) { +// ((Memory)d).close(); +// } +// } +// +// for ( Pointer d : pcEncArray ) { +// if ( d instanceof Memory ) { +// ((Memory)d).close(); +// } +// } +// +// for ( Pointer d : pcMacArray ) { +// if ( d instanceof Memory ) { +// ((Memory)d).close(); +// } +// } } + } catch (SydApiException e) { throw e; } catch (Exception e) { @@ -451,32 +386,42 @@ public class SydApiLongLinkWrap implements SydApi { throw new SydApiException("并行任务执行失败", 0xC101, e); } -// FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { -// @Override -// public List call() throws Exception { -// return builder.get().SYD_SM4_EncryptAndMac_BatchData(iEncKeyIndex, iMacKeyIndex, pcData); -// } -// }); -// try { -// return task.get(); -// } catch (Exception e) { -// throw new SydApiException("并行任务执行失败", 0xC101, e); -// } + } + + public List SYD_SM4_EncryptAndMac_BatchData_java(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { + log.info("SYD_SM4_EncryptAndMac_BatchData {} {}", iEncKeyIndex, iMacKeyIndex); + + FutureTask> task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4_EncryptAndMac_BatchData(iEncKeyIndex, iMacKeyIndex, pcData)); + try { + return task.get(); + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } @Override public List SYD_SM4_CheckMacAndDecrypt_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { + if (Env.isLinux()) { + return SYD_SM4_CheckMacAndDecrypt_BatchData_c(iEncKeyIndex, iMacKeyIndex, pcData); + } else { + return SYD_SM4_CheckMacAndDecrypt_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); + } + } - log.info("SYD_SM4_CheckMacAndDecrypt_BatchData {} {}", iEncKeyIndex, iMacKeyIndex); + + List SYD_SM4_CheckMacAndDecrypt_BatchData_c(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { + + log.info("SYD_SM4_CheckMacAndDecrypt_BatchData_c {} {}", iEncKeyIndex, iMacKeyIndex); int size = pcData.size(); - log.debug("size {}", size); + log.debug("SYD_SM4_CheckMacAndDecrypt_BatchData_c size {}", size); // 1. 准备明文参数 Pointer[] pcDataArray = new Pointer[pcData.size()]; int[] iDataLen = new int[size]; + // 2. 准备密文缓冲区 Pointer[] pcEncArray = new Pointer[pcData.size()]; int[] iEncDataLen = new int[size]; @@ -486,72 +431,97 @@ public class SydApiLongLinkWrap implements SydApi { int[] iCheckRet = new int[size]; + try { - for (int i = 0; i < pcData.size(); i++) { - DataAndMac dm = pcData.get(i); + for (int i = 0; i < pcData.size(); i++) { + DataAndMac dm = pcData.get(i); - // 为每个 byte[] 分配本地内存并复制数据 - Memory memory = new Memory(dm.getData().length); - memory.write(0, dm.getData(), 0, dm.getData().length); - pcEncArray[i] = memory; - iEncDataLen[i] = dm.getData().length; - log.debug("pcEncArray={}", dm.getData().length); + // 为每个 byte[] 分配本地内存并复制数据 + Memory memory = new Memory(dm.getData().length); + memory.write(0, dm.getData(), 0, dm.getData().length); + pcEncArray[i] = memory; + iEncDataLen[i] = dm.getData().length; + log.debug("pcEncArray={}", dm.getData().length); - pcDataArray[i] = new Memory(dm.getData().length); - iDataLen[i] = dm.getData().length; - log.debug("iDataLen= {}", dm.getData().length); + pcDataArray[i] = new Memory(dm.getData().length); + iDataLen[i] = dm.getData().length; + log.debug("iDataLen= {}", dm.getData().length); - Memory mem_mac = new Memory(16); - mem_mac.write(0, dm.getMac(), 0, 16); - pcMacArray[i] = mem_mac; + Memory mem_mac = new Memory(16); + mem_mac.write(0, dm.getMac(), 0, 16); + pcMacArray[i] = mem_mac; - if (log.isDebugEnabled()) { - log.debug("mem_mac=" + Util.bytes2HexString(dm.getMac())); - } - } - - - // 调用解密函数 - int result = SydLibrary.INSTANCE.SYD_SM4_Decrypt_Mac_BatchData( - ConnectHandlerManager.getHandler(), - iEncKeyIndex, - iMacKeyIndex, - pcEncArray, - iEncDataLen, - pcMacArray, - size, - pcDataArray, - iDataLen, - iCheckRet); - - if (0 == result) { - // 转换结果为Java风格的对象列表 - List results = new ArrayList<>(); - for (int i = 0; i < size; i++) { - results.add(new DataAndMacCheck(pcDataArray[i].getByteArray(0, iDataLen[i]), iCheckRet[i] == 0)); + if (log.isDebugEnabled()) { + log.debug("mem_mac={}" , Util.bytes2HexString(dm.getMac())); + } } - return results; - } else { - throw new SydApiException(result); - } -// FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { -// @Override -// public List call() throws Exception { -// return builder.get().SYD_SM4_CheckMacAndDecrypt_BatchData(iEncKeyIndex, iMacKeyIndex, pcData); + // 调用解密函数 + int result = SydLibrary.INSTANCE.SYD_SM4_Decrypt_Mac_BatchData( + ConnectHandlerManager.getHandler(), + iEncKeyIndex, + iMacKeyIndex, + pcEncArray, + iEncDataLen, + pcMacArray, + size, + pcDataArray, + iDataLen, + iCheckRet); + + if (0 == result) { + // 转换结果为 Java 风格的对象列表 + List results = new ArrayList<>(); + for (int i = 0; i < size; i++) { + results.add(new DataAndMacCheck(pcDataArray[i].getByteArray(0, iDataLen[i]), iCheckRet[i] == 0)); + } + + return results; + } else { + throw new SydApiException(result); + } + } finally { +// for ( Pointer d : pcDataArray ) { +// if ( d instanceof Memory ) { +// ((Memory)d).close(); +// } // } -// }); -// try { -// return task.get(); -// } catch (Exception e) { -// throw new SydApiException("并行任务执行失败", 0xC101, e); -// } +// +// for ( Pointer d : pcEncArray ) { +// if ( d instanceof Memory ) { +// ((Memory)d).close(); +// } +// } +// +// for ( Pointer d : pcMacArray ) { +// if ( d instanceof Memory ) { +// ((Memory)d).close(); +// } +// } + } } + List SYD_SM4_CheckMacAndDecrypt_BatchData_java(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { + + log.info("SYD_SM4_CheckMacAndDecrypt_BatchData_java {} {}", iEncKeyIndex, iMacKeyIndex); + + int size = pcData.size(); + log.debug("size {}", size); + + + FutureTask> task = builder.getLongLinkWorks().fTask(() -> builder.get().SYD_SM4_CheckMacAndDecrypt_BatchData(iEncKeyIndex, iMacKeyIndex, pcData)); + try { + return task.get(); + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } + } + + @Override public ISM4 initSM4(int iKeyIndex, int ende) { return new SydSM4(this, iKeyIndex, ende); @@ -622,12 +592,9 @@ public class SydApiLongLinkWrap implements SydApi { for (int i = 0; i < dataGroups.size(); i++) { int finalI = i; - FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { - @Override - public List call() throws Exception { - SydApi api = builder.get(); - return api.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag); - } + FutureTask> task = builder.getLongLinkWorks().fTask(() -> { + SydApi api = builder.get(); + return api.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag); }); tasks.add(task); } @@ -702,12 +669,9 @@ public class SydApiLongLinkWrap implements SydApi { for (int i = 0; i < dataGroups.size(); i++) { int finalI = i; - FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { - @Override - public List call() throws Exception { - SydApi api = builder.get(); - return api.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); - } + FutureTask> task = builder.getLongLinkWorks().fTask(() -> { + SydApi api = builder.get(); + return api.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); }); tasks.add(task); } @@ -788,16 +752,13 @@ public class SydApiLongLinkWrap implements SydApi { for (int i = 0; i < dataGroups.size(); i++) { int finalI = i; - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public boolean[] call() throws Exception { - SydApi api = builder.get(); - return api.SYD_SM4Mac_BatchData( - toIntArray(keyGroups.get(finalI)), - dataGroups.get(finalI), - macGroups.get(finalI) - ); - } + FutureTask task = builder.getLongLinkWorks().fTask(() -> { + SydApi api = builder.get(); + return api.SYD_SM4Mac_BatchData( + toIntArray(keyGroups.get(finalI)), + dataGroups.get(finalI), + macGroups.get(finalI) + ); }); tasks.add(task); } diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java index d78b23b..9cd9ec7 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java @@ -40,10 +40,9 @@ public class SydSM4Mac implements ISM4Mac { } if (length % 16 != 0) { queue.push(pcData); - byte[] pop = queue.pop(16, 0); - pcdataResult =pop; + pcdataResult = queue.pop(16, 0); } - if (null == this.pcMac || "".equals(this.pcMac)) { + if (null == this.pcMac || this.pcMac.length == 0) { LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData); pcProcData = stringStringLongDataReturn.getProcData(); iPkgNum = 2; @@ -59,7 +58,7 @@ public class SydSM4Mac implements ISM4Mac { queue.push(pcData); byte[] pop = queue.pop(16, 0); - if (null == this.pcMac || "".equals(this.pcMac)) { + if (null == this.pcMac || this.pcMac.length == 0 ) { LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData); pcProcData = stringStringLongDataReturn.getProcData(); iPkgNum = 2; diff --git a/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java b/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java index c85850a..65b8bbf 100644 --- a/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java +++ b/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java @@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory; import racal.sunyard.main.SydApi4j; public class SydApiPool extends ThreadBasedConnectPool { - private HsmLinkInfo[] linkInfos; + private final HsmLinkInfo[] linkInfos; public SydApiPool(HsmLinkInfo[] linkInfos) { super(); this.linkInfos = linkInfos; @@ -83,7 +83,7 @@ public class SydApiPool extends ThreadBasedConnectPool { hsms[i] = (SydApi4j) new SydApi4j().connect(info.getPcIp(), info.getiPort(), null, info.getiConnectTimeOut(), info.getiDealTimeOut()); canUse = true; } catch (Exception e) { - + // free } } } diff --git a/src/main/java/com/sunyard/sge/plus/SydLibrary.java b/src/main/java/com/sunyard/sge/plus/SydLibrary.java index 19d05d3..1e2bfee 100644 --- a/src/main/java/com/sunyard/sge/plus/SydLibrary.java +++ b/src/main/java/com/sunyard/sge/plus/SydLibrary.java @@ -8,7 +8,7 @@ import com.sun.jna.ptr.PointerByReference; public interface SydLibrary extends Library { // 加载动态库 - SydLibrary INSTANCE = Native.load("sunyard", SydLibrary.class); + SydLibrary INSTANCE = Native.loadLibrary("sunyard", SydLibrary.class); // 1.1 设置日志配置 int SYD_SetLogConfig(String pcLogPath, int iLogPathLen, int iLogLevel); diff --git a/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java b/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java index 3044e38..e6b18e5 100644 --- a/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java +++ b/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java @@ -49,6 +49,7 @@ public class ThreadBasedConnectPool { try { free(oip.getObject()); } catch (Exception e) { + // free } continue; } @@ -67,6 +68,7 @@ public class ThreadBasedConnectPool { try { free(oip.getObject()); } catch (Exception e) { + // free } continue; } @@ -76,7 +78,6 @@ public class ThreadBasedConnectPool { checkPass = check(entry.getValue().getObjectForCheck()); } catch (Exception e) { checkPass = false; - } finally { } if (!checkPass) { @@ -87,6 +88,7 @@ public class ThreadBasedConnectPool { try { free(oip.getObject()); } catch (Exception e) { + // free } continue; } diff --git a/src/test/java/com/sunyard/sge/database/EncryptAndMac.java b/src/test/java/com/sunyard/sge/database/EncryptAndMac.java new file mode 100644 index 0000000..044c1b0 --- /dev/null +++ b/src/test/java/com/sunyard/sge/database/EncryptAndMac.java @@ -0,0 +1,169 @@ +package com.sunyard.sge.database; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class EncryptAndMac { + + + public static void conformance_testcase1_SYD_SM4_EncryptAndMac_ShortData(SydApiLongLinkWrap api){ + int keyEnc = 0; + int keyMac = 0; + byte[] data1 = new byte[1024]; + System.out.println("step1"); + DataAndMac en_data1 = api.SYD_SM4_EncryptAndMac_ShortData_c(keyEnc, keyMac, data1); + System.out.println("step2"); + DataAndMacCheck de_data1 = api.SYD_SM4_CheckMacAndDecrypt_ShortData_java(keyEnc, keyMac, en_data1.getData(), en_data1.getMac()); + System.out.println("step3 "); + if ( de_data1.getMacCheck() ) { + System.out.println("conformance_testcase1 测试通过"); + } + } + + public static void conformance_testcase2_SYD_SM4_EncryptAndMac_ShortData(SydApiLongLinkWrap api){ + int keyEnc = 0; + int keyMac = 0; + byte[] data1 = new byte[1024]; + System.out.println("step1"); + DataAndMac en_data1 = api.SYD_SM4_EncryptAndMac_ShortData_java(keyEnc, keyMac, data1); + System.out.println("step2"); + DataAndMacCheck de_data1 = api.SYD_SM4_CheckMacAndDecrypt_ShortData_c(keyEnc, keyMac, en_data1.getData(), en_data1.getMac()); + System.out.println("step3 " + de_data1.getMacCheck()); + if ( de_data1.getMacCheck() ) { + System.out.println("conformance_testcase2 测试通过"); + } + } + + public static void conformance_testcase1_sm4BatchMacFunc(SydApiLongLinkWrap api){ + List data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + int[] keyEnc = new int[]{0, 0, 0, 0, 0, 0, 0}; + int[] keyMac = new int[]{0, 0, 0, 0, 0, 0, 0}; + + List en_data = api.SYD_SM4_EncryptAndMac_BatchData_c(keyEnc, keyMac, data); + List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData_java(keyEnc, keyMac, en_data); + + boolean flag = true; + for (int i = 0; i < de_data.size(); i++) { + flag = flag & de_data.get(i).getMacCheck(); + } + + if (flag) { + System.out.println("批量数据加密计算MAC,校验MAC解密测试成功"); + } else { + System.out.println("批量数据加密计算MAC,校验MAC解密测试失败"); + } + + } + + + public static void conformance_testcase2_sm4BatchMacFunc(SydApiLongLinkWrap api){ + List data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + int[] keyEnc = new int[]{0, 0, 0, 0, 0, 0, 0}; + int[] keyMac = new int[]{0, 0, 0, 0, 0, 0, 0}; + + List en_data = api.SYD_SM4_EncryptAndMac_BatchData_java(keyEnc, keyMac, data); + List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData_c(keyEnc, keyMac, en_data); + + boolean flag = true; + for (int i = 0; i < de_data.size(); i++) { + flag = flag & de_data.get(i).getMacCheck(); + } + + if (flag) { + System.out.println("批量数据加密计算MAC,校验MAC解密测试成功"); + } else { + System.out.println("批量数据加密计算MAC,校验MAC解密测试失败"); + } + + } + + + public static void main(String[] args) { + + // 路径要以 / 或 \\ 结尾表示目录 + + String[] pcipList = {"172.1.41.216", "172.1.41.129"}; + int[] iportList = {8880, 8889}; + SydApi api = new SydApi4Database(); + try { + + api.SYD_Short_Connect_Ex(pcipList, iportList, 1000, 1000); + + // 密钥索引 + int keyEncIdx = 0; + + int keyMacIdx = 0; + + // 测试数据 + byte[] data = new byte[16]; + + + // 短数据 + DataAndMac ret = api.SYD_SM4_EncryptAndMac_ShortData(keyEncIdx, keyMacIdx, data); + DataAndMacCheck deData = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEncIdx, keyMacIdx, ret.getData(), ret.getMac()); + + if (Arrays.equals( data, deData.getData() ) ) { + System.out.println("短数据加密并计算 MAC - 测试通过"); + } else { + System.out.println("短数据加密并计算 MAC - 测试失败"); + } + + + // 批量短数据 + Listdata2 = Arrays.asList( + new byte[8], + new byte[500], + new byte[512] + ); + + + List ret2 = api.SYD_SM4_EncryptAndMac_BatchData( + new int[] {keyEncIdx, keyEncIdx, keyEncIdx}, + new int[] {keyMacIdx, keyMacIdx, keyMacIdx}, + data2 + ); + + ListdeDatas = api.SYD_SM4_CheckMacAndDecrypt_BatchData( + new int[] {keyEncIdx, keyEncIdx, keyEncIdx}, + new int[] {keyMacIdx, keyMacIdx, keyMacIdx}, + ret2 + ); + + for (int i=0; i< deDatas.size(); i++){ + byte[] d1 = data2.get(i); + DataAndMacCheck d2 = deDatas.get(i); + + if (! d2.getMacCheck() ) { + System.out.println("批量短数据加密并计算 MAC 验证失败 - 测试失败"); + return; + } + if (! Arrays.equals( d1, d2.getData() ) ) { + System.out.println("批量短数据加密并计算 MAC - 测试失败"); + return; + } + } + + System.out.println("批量短数据加密并计算 MAC - 测试通过"); + + } finally { + if (null != api) { + api.SYD_Disconnect_Ex(); + } + } + } +} diff --git a/src/test/java/test/CalcRes.java b/src/test/java/test/CalcRes.java index 50139b1..b0b5ebc 100644 --- a/src/test/java/test/CalcRes.java +++ b/src/test/java/test/CalcRes.java @@ -1,8 +1,5 @@ package test; -import com.sunyard.proto.Util; -import com.sunyard.sge.database.DataAndMac; - import java.util.ArrayList; import java.util.List; @@ -13,14 +10,14 @@ public class CalcRes { public static final String SM3_LONG_RESULT2 = "1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B"; public static final String SM4_SHORT_RESULT1 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"; public static final String SM4_SHORT_RESULT2 = "4C72CDD5012CA05BC095A4A4F5B66F64"; -// public static final String SM4_LONG_RESULT1 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"; - public static final String SM4_LONG_RESULT2 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"; + // public static final String SM4_LONG_RESULT1 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"; + public static final String SM4_LONG_RESULT2 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"; public static final String SM4MAC_SHORT_RESULT1 = "CD9A5C8CD83FE0D750CF853D17281D52"; - public static final String SM4MAC_SHORT_RESULT2 = "2A268D5A440F8E9E50AA6FDC453E8593"; + public static final String SM4MAC_SHORT_RESULT2 = "E04F0975D47219AE9B949CB185C303E9"; public static final String SM4MAC_LONG_RESULT1 = "96CE0C05DB2DB6496E78EEE49B4C82AE"; public static final String SM4MAC_LONG_RESULT2 = "C699B51638B56C3E5D490B9026ED2DD7"; - public static final List SM4_BATCH_RESULT = new ArrayList(){ + public static final List SM4_BATCH_RESULT = new ArrayList() { { this.add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"); add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"); diff --git a/src/test/java/test/EncryptAndMac.java b/src/test/java/test/EncryptAndMac.java deleted file mode 100644 index 02d7121..0000000 --- a/src/test/java/test/EncryptAndMac.java +++ /dev/null @@ -1,83 +0,0 @@ -package test; - -import com.sunyard.sge.database.*; - -import java.util.Arrays; -import java.util.List; - -public class EncryptAndMac { - - public static void main(String[] args) { - - // 路径要以 / 或 \\ 结尾表示目录 - - String[] pcipList = {"172.1.41.216", "172.1.41.129"}; - int[] iportList = {8880, 8889}; - SydApi api = new SydApi4Database(); - try { - - api.SYD_Short_Connect_Ex(pcipList, iportList, 1000, 1000); - - // 密钥索引 - int keyEncIdx = 0; - - int keyMacIdx = 0; - - // 测试数据 - byte[] data = new byte[16]; - - - // 短数据 - DataAndMac ret = api.SYD_SM4_EncryptAndMac_ShortData(keyEncIdx, keyMacIdx, data); - DataAndMacCheck deData = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEncIdx, keyMacIdx, ret.getData(), ret.getMac()); - - if (Arrays.equals( data, deData.getData() ) ) { - System.out.println("短数据加密并计算 MAC - 测试通过"); - } else { - System.out.println("短数据加密并计算 MAC - 测试失败"); - } - - - // 批量短数据 - Listdata2 = Arrays.asList( - new byte[8], - new byte[500], - new byte[512] - ); - - - List ret2 = api.SYD_SM4_EncryptAndMac_BatchData( - new int[] {keyEncIdx, keyEncIdx, keyEncIdx}, - new int[] {keyMacIdx, keyMacIdx, keyMacIdx}, - data2 - ); - - ListdeDatas = api.SYD_SM4_CheckMacAndDecrypt_BatchData( - new int[] {keyEncIdx, keyEncIdx, keyEncIdx}, - new int[] {keyMacIdx, keyMacIdx, keyMacIdx}, - ret2 - ); - - for (int i=0; i< deDatas.size(); i++){ - byte[] d1 = data2.get(i); - DataAndMacCheck d2 = deDatas.get(i); - - if (! d2.getMacCheck() ) { - System.out.println("批量短数据加密并计算 MAC 验证失败 - 测试失败"); - return; - } - if (! Arrays.equals( d1, d2.getData() ) ) { - System.out.println("批量短数据加密并计算 MAC - 测试失败"); - return; - } - } - - System.out.println("批量短数据加密并计算 MAC - 测试通过"); - - } finally { - if (null != api) { - api.SYD_Disconnect_Ex(); - } - } - } -} diff --git a/src/test/java/test/FuncTest.java b/src/test/java/test/FuncTest.java index e6db9d5..f27608c 100644 --- a/src/test/java/test/FuncTest.java +++ b/src/test/java/test/FuncTest.java @@ -21,22 +21,18 @@ public class FuncTest { private int connectTimeout = 1000; private int dealTimeout = 2000; - public FuncTest(Config config){ + public FuncTest(Config config) { this.config = config; } - - - public SydApi connect(){ - if ( isShortLink ) { + public SydApi connect() { + if (isShortLink) { SydApi api = new SydApi4Database(); api.SYD_Short_Connect_Ex(config.getIps(), config.getPorts(), connectTimeout, dealTimeout); return api; - } - - else { + } else { SydApiBuilder builder = new SydApiBuilder( config.getIps(), config.getPorts(), @@ -111,7 +107,6 @@ public class FuncTest { } - data = new byte[0]; sm3 = api.initSM3(); for (int i = 0; i < 10; i++) { @@ -176,7 +171,7 @@ public class FuncTest { System.out.println("-------- SM4长数据加解密功能测试开始 --------"); SydApi api = connect(); boolean ret = LongDataTest.case1(api); - if ( ! ret ){ + if (!ret) { System.out.println("-------- SM4长数据加解密功能测试失败 --------\n"); } else { System.out.println("-------- SM4长数据加解密功能测试结束 --------\n"); @@ -224,7 +219,7 @@ public class FuncTest { System.out.println("-------- SM4MAC长数据功能测试开始 --------"); SydApi api = connect(); - byte[] data1 = new byte[4064]; + byte[] data1 = new byte[2048]; int key = 0; ISM4Mac sm4mac = api.initSM4Mac(key); for (int i = 0; i < 10; i++) { @@ -232,27 +227,23 @@ public class FuncTest { } byte[] res1 = sm4mac.digest(); + // 64 x 16 = 1024 byte[] data2 = new byte[16]; sm4mac = api.initSM4Mac(key); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 64; i++) { sm4mac.update(data2); } byte[] res2 = sm4mac.digest(); -// c = opt.check(hexStringTobytes(SM4MAC_LONG_RESULT1)) -// s = opt.hexcheck(SM4MAC_LONG_RESULT1) -// -// c2 = opt2.check(hexStringTobytes(SM4MAC_LONG_RESULT2)) -// s2 = opt2.hexcheck(SM4MAC_LONG_RESULT2) + byte[] r = api.SYD_SM4Mac_ShortData(0, new byte[1024]); - if (res1.equals(CalcRes.SM4MAC_LONG_RESULT1) && res2.equals(CalcRes.SM4MAC_LONG_RESULT2)) { + System.out.println( Util.bytes2HexString(r) ); + if ( Arrays.equals(res2, r ) + && Arrays.equals(r, Util.hexString2Bytes("E04F0975D47219AE9B949CB185C303E9")) + ) { System.out.println("SM4MAC长数据测试成功"); } else { System.out.println("SM4MAC长数据测试失败"); - System.out.println("计算结果:" + res1); - System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT1); - System.out.println("计算结果:" + res2); - System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT2); } @@ -327,7 +318,7 @@ public class FuncTest { boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx, data, s); boolean flag = true; - if ( null != s) { + if (null != s) { for (int i = 0; i < check.length; i++) { if (!check[i]) { flag = false; @@ -362,14 +353,14 @@ public class FuncTest { DataAndMac en_data1 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data1); System.out.println("step2"); DataAndMacCheck de_data1 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data1.getData(), en_data1.getMac()); - System.out.println("step3"); + System.out.println("step3 " + de_data1.getMacCheck()); try { DataAndMac en_data2 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data2); System.out.println("step4"); - }catch ( SydApiException e) { - if ( e.getRetCode() == 0x1000001 ) { + } catch (SydApiException e) { + if (e.getRetCode() == 0x1000001) { System.out.println("SYD_SM4_EncryptAndMac_ShortData 不支持数据长度为 0, 测试通过"); } else { System.out.println("SYD_SM4_EncryptAndMac_ShortData 不支持数据长度为 0, 测试失败"); @@ -380,8 +371,8 @@ public class FuncTest { try { DataAndMacCheck de_data2 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, new byte[15], new byte[0]); System.out.println("step5"); - }catch ( SydApiException e) { - if ( e.getRetCode() == 0x1000001 ) { + } catch (SydApiException e) { + if (e.getRetCode() == 0x1000001) { System.out.println("SYD_SM4_CheckMacAndDecrypt_ShortData 不支持数据长度为非 16 字节, 测试通过"); } else { System.out.println("SYD_SM4_CheckMacAndDecrypt_ShortData 不支持数据长度为非 16 字节, 测试失败"); @@ -397,6 +388,14 @@ public class FuncTest { System.out.println("短数据加密计算MAC,校验MAC解密长度超出测试成功"); } + if ( ! isShortLink ){ + System.out.println("long link"); + EncryptAndMac.conformance_testcase1_SYD_SM4_EncryptAndMac_ShortData((SydApiLongLinkWrap) api); + EncryptAndMac.conformance_testcase2_SYD_SM4_EncryptAndMac_ShortData((SydApiLongLinkWrap) api); + } else { + System.out.println("short link"); + } + System.out.println("-------- 短数据加密计算MAC,校验MAC解密功能测试结束 --------\n"); } @@ -419,8 +418,8 @@ public class FuncTest { List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data); boolean flag = true; - for (int i = 0; i < de_data.size(); i++) { - flag = flag & de_data.get(i).getMacCheck(); + for (DataAndMacCheck deDatum : de_data) { + flag = flag & deDatum.getMacCheck(); } if (flag) { @@ -429,6 +428,14 @@ public class FuncTest { System.out.println("批量数据加密计算MAC,校验MAC解密测试失败"); } + if ( ! isShortLink ){ + System.out.println("long link"); + EncryptAndMac.conformance_testcase1_sm4BatchMacFunc((SydApiLongLinkWrap) api); + EncryptAndMac.conformance_testcase2_sm4BatchMacFunc((SydApiLongLinkWrap) api); + } else { + System.out.println("short link"); + } + System.out.println("-------- 批量数据加密计算MAC,校验MAC解密功能测试结束 --------\n"); } @@ -467,7 +474,7 @@ public class FuncTest { } - public void funcMenu(Config config, Choise choise, FuncTest test) throws Exception{ + public void funcMenu(Config config, Choise choise, FuncTest test) throws Exception { boolean flag = true; SydApi.SYD_SetLogConfig("./logs", 3); @@ -488,9 +495,9 @@ public class FuncTest { System.out.println("9. SM4短数据加密后生成MAC,解密验证MAC"); System.out.println("10. SM4批量数据加密后生成MAC,验证MAC解密"); + System.out.println("11. SM4长数据MAC"); + System.out.println("12. SM4长数据加解密"); - System.out.println("11. SM4长数据加解密"); - System.out.println("12. SM4长数据MAC"); System.out.println("13. SM3长数据"); @@ -549,8 +556,6 @@ public class FuncTest { } - - public static void main(String[] args) throws Exception { Config config = config = Config.loadConfig(); if (config == null || config.isDebug()) { diff --git a/src/test/java/test/LongDataTest.java b/src/test/java/test/LongDataTest.java index 0999b34..a8f9060 100644 --- a/src/test/java/test/LongDataTest.java +++ b/src/test/java/test/LongDataTest.java @@ -127,7 +127,7 @@ public class LongDataTest { public static boolean case1(SydApi api) { int max = 1000; - int size = 4065; + int size = 4064; ISM4 en = api.initSM4(0, 1); ISM4 de = api.initSM4(0, 0); diff --git a/src/test/java/test/TestAll.java b/src/test/java/test/TestAll.java index 0c6c3db..0af5a21 100644 --- a/src/test/java/test/TestAll.java +++ b/src/test/java/test/TestAll.java @@ -27,13 +27,11 @@ public class TestAll { public static final int ECB_ENC = 1; - - public static void setLog(){ + public static void setLog() { System.setProperty("com.sunyard.sydapi4j.debug", "false"); } - private static void startPerformanceFile() { try (FileWriter fw = new FileWriter(PERF_RESULT_FILE, true); BufferedWriter bw = new BufferedWriter(fw)) { @@ -102,7 +100,7 @@ public class TestAll { FuncTest funcTest = new FuncTest(config); - while ( true ) { + while (true) { System.out.println("请选择测试项:"); System.out.println("1. 功能单项测试"); System.out.println("2. 功能全量测试"); @@ -146,7 +144,6 @@ public class TestAll { private static final String PERF_RESULT_FILE = "performance_results.txt"; - public void sm4ShortEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { byte[] data = new byte[plainLen]; SydApiBuilder builder = new SydApiBuilder( @@ -183,7 +180,7 @@ public class TestAll { System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatencyEnc = duration * 1.0 / totalRequest; + double avgLatencyEnc = numberOfThreads * duration * 1.0 / totalRequest; System.out.println("平均延时(加密): " + String.format("%.2f", avgLatencyEnc) + " ms"); writeToPerformanceFile("SM4短数据加密", 1024, 1, numberOfThreads, totalRequest, tps, avgLatencyEnc); @@ -211,7 +208,7 @@ public class TestAll { System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatencyDec = duration * 1.0 / totalRequest; + double avgLatencyDec = numberOfThreads * duration * 1.0 / totalRequest; System.out.println("平均延时(解密): " + String.format("%.2f", avgLatencyDec) + " ms"); writeToPerformanceFile("SM4短数据解密", 1024, 1, numberOfThreads, totalRequest, tps, avgLatencyDec); @@ -266,7 +263,7 @@ public class TestAll { System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatency = duration * 1.0 / totalRequest; + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4批量数据加密", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); SydApi apiTest = Api.get(); @@ -292,7 +289,7 @@ public class TestAll { System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - avgLatency = duration * 1.0 / totalRequest; + avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4批量数据解密", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); } @@ -341,7 +338,7 @@ public class TestAll { System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatency = duration * 1.0 / totalRequest; + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4MAC 短数据", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); } @@ -393,7 +390,7 @@ public class TestAll { System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatency = duration * 1.0 / totalRequest; + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4MAC 批量数据", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); } @@ -440,7 +437,7 @@ public class TestAll { System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatency = duration * 1.0 / totalRequest; + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM3 短数据", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); } @@ -497,11 +494,10 @@ public class TestAll { System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatency = duration * 1.0 / totalRequest; + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4短数据加密并生成MAC", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); - ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads); start = System.currentTimeMillis(); for (int i = 0; i < totalRequest; i++) { @@ -522,7 +518,7 @@ public class TestAll { System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - avgLatency = duration * 1.0 / totalRequest; + avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4短数据解密并校验MAC", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); } @@ -582,7 +578,7 @@ public class TestAll { System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - double avgLatency = duration * 1.0 / totalRequest; + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4批量数据加密并生成MAC", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads); @@ -605,12 +601,11 @@ public class TestAll { System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("TPS: " + String.format("%.2f", tps)); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - avgLatency = duration * 1.0 / totalRequest; + avgLatency = numberOfThreads * duration * 1.0 / totalRequest; writeToPerformanceFile("SM4批量数据解密并校验MAC", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); } - public void sm4LongEnde() { System.out.println("-------- SM4长数据加解密性能测试开始 --------"); @@ -721,14 +716,12 @@ public class TestAll { System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); - writeToPerformanceFile2("SM3长数据", "100MB", 1, 1, throughput); + writeToPerformanceFile2("SM3长数据", "100MB", 1, 1, throughput); System.out.println("-------- SM3长数据性能测试结束 --------"); } - - public void perfAll() throws InterruptedException { this.sm4ShortEndes(); this.sm4BatchEndes(); @@ -744,7 +737,6 @@ public class TestAll { } - public static void showmenu() { System.out.println("请选择测试项:"); System.out.println("1.SM4 短数据加解密"); @@ -761,8 +753,9 @@ public class TestAll { System.out.println("12. 批量数据 SM4+MAC性能测试"); System.out.println("-1.退出"); } - public static void perfMenu(Config config, Choise choise, TestAll test) throws Exception{ - + + public static void perfMenu(Config config, Choise choise, TestAll test) throws Exception { + boolean flag = true; while (flag) {