Commit 60131df6 authored by gao's avatar gao

法人身份认证服务

parent c4b9e2e8
<component name="ArtifactManager">
<artifact name="LegalPersonChapter:jar">
<output-path>$PROJECT_DIR$/out/artifacts/LegalPersonChapter_jar</output-path>
<root id="root">
<element id="archive" name="LegalPersonChapter.jar">
<element id="directory" name="META-INF">
<element id="file-copy" path="$PROJECT_DIR$/META-INF/MANIFEST.MF" />
</element>
<element id="module-output" name="LegalPersonChapter" />
</element>
<element id="library" level="project" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" />
<element id="file-copy" path="$PROJECT_DIR$/lib/jit-pkivstk-jdk15-1.0.jar" />
<element id="library" level="project" name="Maven: org.glassfish.jersey.core:jersey-server:2.10" />
<element id="library" level="project" name="Maven: commons-logging:commons-logging:1.2" />
<element id="library" level="project" name="Maven: org.glassfish.hk2:osgi-resource-locator:1.0.1" />
<element id="library" level="project" name="Maven: org.glassfish.jersey.containers:jersey-container-jetty-http:2.10" />
<element id="library" level="project" name="Maven: redis.clients:jedis:2.9.0" />
<element id="library" level="project" name="Maven: org.eclipse.jetty:jetty-util:9.3.18.v20170406" />
<element id="library" level="project" name="Maven: org.glassfish.jersey.core:jersey-client:2.10" />
<element id="file-copy" path="$PROJECT_DIR$/lib/commons-logging-1.1.1.jar" />
<element id="library" level="project" name="Maven: org.eclipse.jetty:jetty-security:9.3.18.v20170406" />
<element id="library" level="project" name="Maven: org.apache.httpcomponents:httpcore:4.4.6" />
<element id="library" level="project" name="Maven: javax.ws.rs:javax.ws.rs-api:2.0" />
<element id="library" level="project" name="Maven: org.eclipse.jetty:jetty-servlet:9.3.18.v20170406" />
<element id="library" level="project" name="Maven: org.eclipse.jetty:jetty-continuation:9.1.1.v20140108" />
<element id="library" level="project" name="Maven: org.glassfish.jersey.containers:jersey-container-servlet-core:2.10" />
<element id="library" level="project" name="Maven: org.apache.httpcomponents:httpclient:4.5.3" />
<element id="library" level="project" name="Maven: net.sf.json-lib:json-lib:jdk15:2.4" />
<element id="library" level="project" name="Maven: commons-beanutils:commons-beanutils:1.8.0" />
<element id="library" level="project" name="Maven: org.glassfish.hk2.external:javax.inject:2.3.0-b05" />
<element id="library" level="project" name="Maven: commons-lang:commons-lang:2.5" />
<element id="library" level="project" name="Maven: javax.servlet:javax.servlet-api:3.1.0" />
<element id="library" level="project" name="Maven: org.javassist:javassist:3.18.1-GA" />
<element id="library" level="project" name="Maven: org.eclipse.jetty:jetty-io:9.3.18.v20170406" />
<element id="file-copy" path="$PROJECT_DIR$/lib/jitpkisctk1.0.jar" />
<element id="library" level="project" name="Maven: commons-codec:commons-codec:1.9" />
<element id="library" level="project" name="Maven: javax.validation:validation-api:1.1.0.Final" />
<element id="library" level="project" name="Maven: org.glassfish.jersey.bundles.repackaged:jersey-guava:2.10" />
<element id="library" level="project" name="Maven: org.glassfish.hk2:hk2-utils:2.3.0-b05" />
<element id="library" level="project" name="Maven: org.apache.commons:commons-pool2:2.4.2" />
<element id="library" level="project" name="Maven: org.eclipse.jetty:jetty-server:9.3.18.v20170406" />
<element id="file-copy" path="$PROJECT_DIR$/lib/jit-pkitool-2.3.0.25-beta2.jar" />
<element id="library" level="project" name="Maven: org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b05" />
<element id="library" level="project" name="Maven: org.glassfish.jersey.core:jersey-common:2.10" />
<element id="library" level="project" name="Maven: org.glassfish.hk2:hk2-locator:2.3.0-b05" />
<element id="library" level="project" name="Maven: org.glassfish.hk2:hk2-api:2.3.0-b05" />
<element id="library" level="project" name="Maven: commons-collections:commons-collections:3.2.1" />
<element id="library" level="project" name="Maven: javax.annotation:javax.annotation-api:1.2" />
<element id="library" level="project" name="Maven: org.eclipse.jetty:jetty-http:9.3.18.v20170406" />
<element id="library" level="project" name="commons-httpclient-3.1" />
</root>
</artifact>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager"> <component name="InspectionProjectProfileManager">
<profile version="1.0"> <profile version="1.0">
<option name="myName" value="Project Default" /> <option name="myName" value="Project Default" />
<inspection_tool class="AliAccessStaticViaInstance" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliAccessToNonThreadSafeStaticFieldFromInstance" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AliArrayNamingShouldHaveBracket" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AliControlFlowStatementWithoutBraces" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliDeprecation" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AliEqualsAvoidNull" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AliLongLiteralsEndingWithLowercaseL" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliMissingOverrideAnnotation" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliWrapperTypeEquality" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAbstractClassShouldStartWithAbstractNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAbstractMethodOrInterfaceMethodMustUseJavadoc" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidCommentBehindStatement" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidComplexCondition" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidConcurrentCompetitionRandom" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidManuallyCreateThread" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidMissUseOfMathRandom" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidNewDateGetTime" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidPatternCompileInMethod" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidReturnInFinally" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidStartWithDollarAndUnderLineNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidUseTimer" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaBooleanPropertyShouldNotStartWithIs" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaClassCastExceptionWithSubListToArrayList" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaClassCastExceptionWithToArray" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaClassMustHaveAuthor" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaClassNamingShouldBeCamel" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaCollectionInitShouldAssignCapacity" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaCommentsMustBeJavadocFormat" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaConcurrentExceptionWithModifyOriginSubList" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaConstantFieldShouldBeUpperCase" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaCountDownShouldInFinally" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaDontModifyInForeachCircle" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaEnumConstantsMustHaveComment" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaExceptionClassShouldEndWithException" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaIbatisMethodQueryForList" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaLowerCamelCaseVariableNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaMethodReturnWrapperType" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPackageNaming" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPojoMustOverrideToString" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPojoMustUsePrimitiveField" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPojoNoDefaultValue" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaRemoveCommentedCode" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaServiceOrDaoClassShouldEndWithImpl" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaStringConcat" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaSwitchStatement" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaTestClassShouldEndWithTestNaming" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaThreadLocalShouldRemove" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaThreadPoolCreation" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaThreadShouldSetName" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaTransactionMustHaveRollback" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaUndefineMagicConstant" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaUnsupportedExceptionWithModifyAsList" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaUseQuietReferenceNotation" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true"> <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS"> <option name="TOP_LEVEL_CLASS_OPTIONS">
<value> <value>
...@@ -32,5 +86,6 @@ ...@@ -32,5 +86,6 @@
<option name="IGNORE_POINT_TO_ITSELF" value="false" /> <option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="date" /> <option name="myAdditionalJavadocTags" value="date" />
</inspection_tool> </inspection_tool>
<inspection_tool class="MapOrSetKeyShouldOverrideHashCodeEquals" enabled="false" level="CRITICAL" enabled_by_default="false" />
</profile> </profile>
</component> </component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="JUnitGeneratorProjectSettings"> <component name="JUnitGeneratorProjectSettings">
<option name="selectedTemplateKey" value="JUnit 4" /> <option name="outputFilePattern" value="${SOURCEPATH}/JunitTest/${PACKAGE}/${FILENAME}" />
<option name="vmTemplates">
<map>
<entry key="JUnit 3" value="######################################################################################## &#10;## &#10;## Available variables: &#10;## $entryList.methodList - List of method composites &#10;## $entryList.privateMethodList - List of private method composites &#10;## $entryList.fieldList - ArrayList of class scope field names &#10;## $entryList.className - class name &#10;## $entryList.packageName - package name &#10;## $today - Todays date in MM/dd/yyyy format &#10;## &#10;## MethodComposite variables: &#10;## $method.name - Method Name &#10;## $method.signature - Full method signature in String form &#10;## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) &#10;## $method.paramNames - List of Strings representing the method's parameters' names &#10;## $method.paramClasses - List of Strings representing the method's parameters' classes &#10;## &#10;## You can configure the output class name using &quot;testClass&quot; variable below. &#10;## Here are some examples: &#10;## Test${entry.ClassName} - will produce TestSomeClass &#10;## ${entry.className}Test - will produce SomeClassTest &#10;## &#10;######################################################################################## &#10;## &#10;#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end &#10;## Iterate through the list and generate testcase for every entry. &#10;#foreach ($entry in $entryList) &#10;#set( $testClass=&quot;${entry.className}Test&quot;) &#10;## &#10;package test.$entry.packageName; &#10;&#10;import junit.framework.Test; &#10;import junit.framework.TestSuite; &#10;import junit.framework.TestCase; &#10;&#10;/** &#10;* ${entry.className} Tester. &#10;* &#10;* @author &lt;Authors name&gt; &#10;* @since &lt;pre&gt;$today&lt;/pre&gt; &#10;* @version 1.0 &#10;*/ &#10;public class $testClass extends TestCase { &#10;public $testClass(String name) { &#10;super(name); &#10;} &#10;&#10;public void setUp() throws Exception { &#10;super.setUp(); &#10;} &#10;&#10;public void tearDown() throws Exception { &#10;super.tearDown(); &#10;} &#10;&#10;#foreach($method in $entry.methodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;} &#10;&#10;#end &#10;&#10;#foreach($method in $entry.privateMethodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;#foreach($string in $method.reflectionCode) &#10;$string &#10;#end &#10;} &#10;&#10;#end &#10;&#10;public static Test suite() { &#10;return new TestSuite(${testClass}.class); &#10;} &#10;} &#10;#end" />
<entry key="JUnit 4" value="######################################################################################## &#10;## &#10;## Available variables: &#10;## $entryList.methodList - List of method composites &#10;## $entryList.privateMethodList - List of private method composites &#10;## $entryList.fieldList - ArrayList of class scope field names &#10;## $entryList.className - class name &#10;## $entryList.packageName - package name &#10;## $today - Todays date in MM/dd/yyyy format &#10;## &#10;## MethodComposite variables: &#10;## $method.name - Method Name &#10;## $method.signature - Full method signature in String form &#10;## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) &#10;## $method.paramNames - List of Strings representing the method's parameters' names &#10;## $method.paramClasses - List of Strings representing the method's parameters' classes &#10;## &#10;## You can configure the output class name using &quot;testClass&quot; variable below. &#10;## Here are some examples: &#10;## Test${entry.ClassName} - will produce TestSomeClass &#10;## ${entry.className}Test - will produce SomeClassTest &#10;## &#10;######################################################################################## &#10;## &#10;#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end &#10;## Iterate through the list and generate testcase for every entry. &#10;#foreach ($entry in $entryList) &#10;#set( $testClass=&quot;${entry.className}Test&quot;) &#10;## &#10;package JunitTest.$entry.packageName; &#10;&#10;import org.junit.Test; &#10;import org.junit.Before; &#10;import org.junit.After; &#10;&#10;/** &#10;* ${entry.className} Tester. &#10;* &#10;* @author Gaoxiang &#10;* @since &lt;pre&gt;$date&lt;/pre&gt; &#10;* @version 1.0 &#10;*/ &#10;public class $testClass { &#10;&#10;@Before&#10;public void before() throws Exception { &#10;} &#10;&#10;@After&#10;public void after() throws Exception { &#10;} &#10;&#10;#foreach($method in $entry.methodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;@Test&#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;} &#10;&#10;#end &#10;&#10;#foreach($method in $entry.privateMethodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;@Test&#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;#foreach($string in $method.reflectionCode) &#10;$string &#10;#end &#10;} &#10;&#10;#end &#10;} &#10;#end" />
</map>
</option>
</component> </component>
</project> </project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinCommonCompilerArguments">
<option name="languageVersion" value="1.1" />
<option name="apiVersion" value="1.1" />
</component>
</project>
\ No newline at end of file
<component name="libraryTable">
<library name="commons-httpclient-3.1">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/commons-httpclient-3.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SmartFoxProjectConfig">
<option name="projectInspectionClosed" value="true" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
...@@ -82,5 +82,6 @@ ...@@ -82,5 +82,6 @@
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" /> <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.5" level="project" /> <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.5" level="project" />
<orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" /> <orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" />
<orderEntry type="library" name="commons-httpclient-3.1" level="project" />
</component> </component>
</module> </module>
\ No newline at end of file
Manifest-Version: 1.0
Class-Path: ezmorph-1.0.6.jar jit-pkivstk-jdk15-1.0.jar jersey-server-
2.10.jar commons-logging-1.2.jar osgi-resource-locator-1.0.1.jar jers
ey-container-jetty-http-2.10.jar jedis-2.9.0.jar jetty-util-9.3.18.v2
0170406.jar jersey-client-2.10.jar commons-logging-1.1.1.jar jetty-se
curity-9.3.18.v20170406.jar httpcore-4.4.6.jar javax.ws.rs-api-2.0.ja
r jetty-servlet-9.3.18.v20170406.jar jetty-continuation-9.1.1.v201401
08.jar jersey-container-servlet-core-2.10.jar httpclient-4.5.3.jar js
on-lib-2.4-jdk15.jar commons-beanutils-1.8.0.jar javax.inject-2.3.0-b
05.jar commons-lang-2.5.jar javax.servlet-api-3.1.0.jar javassist-3.1
8.1-GA.jar jetty-io-9.3.18.v20170406.jar jitpkisctk1.0.jar commons-co
dec-1.9.jar validation-api-1.1.0.Final.jar jersey-guava-2.10.jar hk2-
utils-2.3.0-b05.jar commons-pool2-2.4.2.jar jetty-server-9.3.18.v2017
0406.jar jit-pkitool-2.3.0.25-beta2.jar aopalliance-repackaged-2.3.0-
b05.jar jersey-common-2.10.jar hk2-locator-2.3.0-b05.jar hk2-api-2.3.
0-b05.jar commons-collections-3.2.1.jar javax.annotation-api-1.2.jar
jetty-http-9.3.18.v20170406.jar commons-httpclient-3.1.jar
Main-Class: com.fri.http.framework.server.YXHttpRestServer
ServerURL=http\://172.16.17.1\:8000/signserver/service/xml ServerURL=http://192.168.0.110:8000/signserver/service/xml
#ServerURL=http\://192.168.1.13\:8000/signserver/service/xml #ServerURL=http\://192.168.1.13\:8000/signserver/service/xml
#ServerURL=http://192.168.253.126:8000/signserver/service/xml #ServerURL=http://192.168.253.126:8000/signserver/service/xml
#ServerURL=http://172.16.40.123:8000/signserver/service/xml #ServerURL=http://172.16.40.123:8000/signserver/service/xml
......
...@@ -14,7 +14,7 @@ public class YXDefaultServerConfig { ...@@ -14,7 +14,7 @@ public class YXDefaultServerConfig {
//Http IP 与 port //Http IP 与 port
public static String SERVER_HOST = "0.0.0.0"; public static String SERVER_HOST = "0.0.0.0";
public static int SERVER_PORT = 8283; public static int SERVER_PORT = 8283;
public static int SERVER_MONITOR_PORT = 9999; public static int SERVER_MONITOR_PORT = 9998 ;
//Servlet 路径 //Servlet 路径
...@@ -33,7 +33,7 @@ public class YXDefaultServerConfig { ...@@ -33,7 +33,7 @@ public class YXDefaultServerConfig {
//logging Spec //logging Spec
//日志记录 //日志记录
public static String LOGGING_OUTPUT_FOLDER = "/Users/killsmile/IDEA_JAVA/CTIDHTTPRestService/logs"; // 默认日志路径 public static String LOGGING_OUTPUT_FOLDER = "./log"; // 默认日志路径
public static int LOGGING_ENTRY_BUFFER = 100; // 日志内存缓冲区 public static int LOGGING_ENTRY_BUFFER = 100; // 日志内存缓冲区
public static String LOGGING_NAME_HTTP_SERVER = "HttpServerLog"; //日志名称 public static String LOGGING_NAME_HTTP_SERVER = "HttpServerLog"; //日志名称
public static String LOGGING_NAME_REQUEST_SERVER = "RequestLog"; //日志名称 public static String LOGGING_NAME_REQUEST_SERVER = "RequestLog"; //日志名称
......
...@@ -5,7 +5,10 @@ import com.fri.http.framework.logging.YXLogging; ...@@ -5,7 +5,10 @@ import com.fri.http.framework.logging.YXLogging;
import com.fri.http.legalchapter.rzfw.auth.AuthApply; import com.fri.http.legalchapter.rzfw.auth.AuthApply;
import com.fri.http.legalchapter.rzfw.auth.AuthRequest; import com.fri.http.legalchapter.rzfw.auth.AuthRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*; import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import java.util.logging.Logger; import java.util.logging.Logger;
...@@ -30,11 +33,10 @@ public class CTIDRestResources { ...@@ -30,11 +33,10 @@ public class CTIDRestResources {
* 认证申请 * 认证申请
* 接收带有 JSON Body 的POST请求,非Form模式 * 接收带有 JSON Body 的POST请求,非Form模式
*/ */
public String authAppForward(String jsonStr) throws Exception { public String authAppForward(String jsonStr, @Context HttpServletRequest req, @Context HttpServletResponse resp) throws Exception {
logger.info(jsonStr); resp.setCharacterEncoding("UTF-8");
//执行认证申请 获取响应结果
String response=new AuthApply().authApplyExecute(jsonStr); String response=new AuthApply().authApplyExecute(jsonStr);
System.out.println("一包响应给客户端结果"+response);
return response; return response;
} }
...@@ -46,14 +48,10 @@ public class CTIDRestResources { ...@@ -46,14 +48,10 @@ public class CTIDRestResources {
* 认证请求 * 认证请求
* 接收带有 JSON Body 的POST请求,非Form模式 * 接收带有 JSON Body 的POST请求,非Form模式
*/ */
public String authReqForward(String jsonStr) throws Exception { public String authReqForward(String jsonStr, @Context HttpServletRequest req, @Context HttpServletResponse resp) throws Exception {
logger.info(jsonStr); resp.setCharacterEncoding("UTF-8");
// YXJSONResponse sta = new YXJSONResponse();
// JSONObject randomResponseObj = new CTIDServer().passRandomData(jsonStr);
// logger2.info(randomResponseObj.toString());
// return sta.outPutSuccess(randomResponseObj).toJSONString();
//认证请求结果
String response= new AuthRequest().authRequestExecute(jsonStr); String response= new AuthRequest().authRequestExecute(jsonStr);
System.out.println("二包响应给客户端结果"+response);
return response; return response;
} }
......
...@@ -2,9 +2,7 @@ package com.fri.http.legalchapter.rzfw.auth; ...@@ -2,9 +2,7 @@ package com.fri.http.legalchapter.rzfw.auth;
import com.fri.http.framework.config.YXDefaultServerConfig; import com.fri.http.framework.config.YXDefaultServerConfig;
import com.fri.http.framework.logging.YXLogging; import com.fri.http.framework.logging.YXLogging;
import com.fri.http.legalchapter.rzfw.data.AuthApplyResponse; import com.fri.http.legalchapter.rzfw.data.*;
import com.fri.http.legalchapter.rzfw.data.AuthenticationApplicationData;
import com.fri.http.legalchapter.rzfw.data.SocketPackage;
import com.fri.http.legalchapter.rzfw.net.SocketSender; import com.fri.http.legalchapter.rzfw.net.SocketSender;
import com.fri.http.legalchapter.rzfw.utils.Constans; import com.fri.http.legalchapter.rzfw.utils.Constans;
import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil; import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil;
...@@ -21,83 +19,110 @@ import java.util.logging.Logger; ...@@ -21,83 +19,110 @@ import java.util.logging.Logger;
public class AuthApply { public class AuthApply {
private Logger logger = YXLogging.getLogger(YXDefaultServerConfig.LOGGING_NAME_REQUEST_SERVER); private Logger logger = YXLogging.getLogger(YXDefaultServerConfig.LOGGING_NAME_REQUEST_SERVER);
/**
* customerId 客户号 8字节 共用
* terminalId 终端号 2字节 共用 1.0写死 2.0用应用名称 FormatBytesUtil.hexStringToBytes(preAuthBean.getAppName());
* timeStamp 4字节时间戳
* readCardControlsVersion 读卡控件版本 4字节
* pictureControlsVersion 人像控件版本 4字节
* certificateNumber 证书标识 or 业务站点
* auAppData 身份认证申请数据区
* version 协议版本 2字节 0x0001 共用
* commandType 命令类型 1字节 0x00(请求)0x01(应答) 共用
* command 命令 1字节 0x00(身份认证申请)0x01(身份认证) 共用但值不同
* commandContent 命令内容 1字节 保留 0x00 共用
* operation 操作 1字节 保留 0x00 共用
* auAppSPData 身份认证 一包 Socket数据报文
* applicationReturn 身份认证请求1.0 平台 响应结果
* checkSignResult 身份认证请求1.0 平台 响应验签是否正确
* date 返回时间戳
* businessSerialNumberByte 流水号
* randomBytesLength 随机数长度
* randomData 随机数数据
* errorDesc 错误描述
*/
private byte[] customerId;
private byte[] terminalId;
private byte[] timeStamp;
private byte[] readCardControlsVersion;
private byte[] pictureControlsVersion;
private byte[] certificateNumber;
private byte[] auAppData;
private byte[] version = new byte[]{0, 1};
private byte[] commandType = new byte[]{0};
private byte[] command = new byte[]{0};
private byte[] commandContent = new byte[]{0};
private byte[] operation = new byte[]{0};
private byte[] auAppSPData;
private byte[] applicationReturn;
private boolean checkSignResult=false;
private String date;
private byte[] businessSerialNumberByte = null;
private short randomBytesLength;
private String randomData;
private String errorDesc="未知错误";
private byte[] customerId_Length=new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
private byte[] timeStamp_Length=new byte[] { 1, 2,3,4};
private byte[] readCardControlsVersion_Length=new byte[] { 1, 2, 3, 4 };
private byte[] pictureControlsVersion_Length=new byte[] { 1, 2, 3, 4 };
PreAuthResponse preAuthResponse= new PreAuthResponse();
public String authApplyExecute(String authapplyJson){ public String authApplyExecute(String authapplyJson){
/* JSONObject preAuthApply=JSONObject.fromObject(authapplyJson);
PreAuthBean preAuthBean= (PreAuthBean) JSONObject.toBean(preAuthApply, PreAuthBean.class);
/**
* 组装认证申请数据区 第一个包的数据区 * 组装认证申请数据区 第一个包的数据区
*/ */
// 客户号 8字节 共用 customerId= FormatBytesUtil.getBytesFromString(customerId_Length ,preAuthBean.getCustomerNumber());
byte[] customerId = Constans.customerId; //TODO 终端号 2字节 共用 1.0写死 2.0用应用名称 FormatBytesUtil.hexStringToBytes(preAuthBean.getAppName());
// 终端号 2字节 共用 terminalId = Constans.terminalId;
byte[] terminalId = Constans.terminalId; timeStamp = FormatBytesUtil.getBytesFromString(timeStamp_Length, preAuthBean.getTimeStamp());
// 读卡控件版本 4字节 readCardControlsVersion = FormatBytesUtil.getBytesFromString(readCardControlsVersion_Length,preAuthBean.getCardReaderVersion());
byte[] readCardControlsVersion = new byte[] { 1, 2, 3, 4 }; pictureControlsVersion =FormatBytesUtil.getBytesFromString(pictureControlsVersion_Length,preAuthBean.getLiveDetectionControlVersion());
// 人像控件版本 4字节 certificateNumber=Constans.certificateNumber;
byte[] pictureControlsVersion = new byte[] { 1, 2, 3, 4 };
//证书标识 PreAuthData auApp = new PreAuthData(customerId, terminalId,timeStamp,
byte[] certificateNumber=Constans.certificateNumber;
//业务站点
logger.info("证书序列号:" + Arrays.toString(certificateNumber));
// System.out.println("证书序列号:" + Arrays.toString(certificateNumber));
AuthenticationApplicationData auApp = new AuthenticationApplicationData(customerId, terminalId,
readCardControlsVersion, pictureControlsVersion, certificateNumber); readCardControlsVersion, pictureControlsVersion, certificateNumber);
byte[] auAppData = auApp.getAuthenticationApplicationData(); auAppData = auApp.getPreAuthData();
/* /**
* 组装认证申请Socket数据包 第一次UDP数据包 * 组装认证申请Socket数据包 第一次UDP数据包
*/ */
// 协议版本 2字节 0x0001 共用
byte[] version = { 0, 1 };
// 命令类型 1字节 0x00(请求)0x01(应答) 共用
byte[] commandType = { 0 };
// 命令 1字节 0x00(身份认证申请)0x01(身份认证) 共用但值不同
byte[] command = { 0 };
// 命令内容 1字节 保留 0x00 共用
byte[] commandContent = { 0 };
// 操作 1字节 保留 0x00 共用
byte[] operation = { 0 };
SocketPackage auAppSP = new SocketPackage(version, commandType, command, commandContent, operation, auAppData); SocketPackage auAppSP = new SocketPackage(version, commandType, command, commandContent, operation, auAppData);
byte[] auAppSPData = auAppSP.getSocketPackage(); auAppSPData = auAppSP.getSocketPackage();
byte[] applicationReturn = SocketSender.sendSocketPackage(auAppSPData); applicationReturn = SocketSender.sendSocketPackage(auAppSPData);
if(applicationReturn!=null){
checkSignResult=DataSignature.signCheck(applicationReturn);
System.out.println("验签结果"+checkSignResult);
if (!checkSignResult){
errorDesc="身份认证请求1.0 平台 响应验签出错";
}
}
AuthApplyResponse response= new AuthApplyResponse(); /**
/* * 组装认证申请返回包
* 组装认证数据区 第二个包的数据区
*/ */
byte[] streamNumber = null;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date=df.format(new Date());
if (applicationReturn != null) { if (applicationReturn != null) {
streamNumber = Arrays.copyOfRange(applicationReturn, 24, 33);// 获取到业务流水号要组装进第二个数据包中 businessSerialNumberByte = Arrays.copyOfRange(applicationReturn, 24, 33);
//业务流水号 preAuthResponse.setBusinessSerialNumber(FormatBytesUtil.bytesToHexString(businessSerialNumberByte));
response.setBusinessSerialNumber(FormatBytesUtil.bytesToHexString(streamNumber)); randomBytesLength = FormatBytesUtil.getShortFromBytes(Arrays.copyOfRange(applicationReturn, 33, 35)); // 获取随机数长度
System.out.println("流水号:"+FormatBytesUtil.bytesToHexString(streamNumber)); randomData = FormatBytesUtil
short randomBytesLength = FormatBytesUtil.getShortFromBytes(Arrays.copyOfRange(applicationReturn, 33, 35)); // 获取随机数长度
String randomData = FormatBytesUtil
.bytesToHexString(Arrays.copyOfRange(applicationReturn, 35, 35 + randomBytesLength)); // 获取随机数数据 .bytesToHexString(Arrays.copyOfRange(applicationReturn, 35, 35 + randomBytesLength)); // 获取随机数数据
System.out.println("随机数长度:" + randomBytesLength); preAuthResponse.setRandomNumber(randomData);
System.out.println("随机数数据:" + randomData); preAuthResponse.setSuccess(true);
//随机数 errorDesc="";
response.setRandomNumber(randomData);
//申请结果
response.setSuccess(true);
} }
if (applicationReturn == null) { if (applicationReturn == null) {
//申请结果 preAuthResponse.setSuccess(false);
response.setSuccess(false); errorDesc="业务流水号获取失败,请重新获取";
//错误结果
response.setErrorDesc("业务流水号获取失败,请重新获取");
System.out.println("获取流水号失败,认证失败。");
} }
//响应时间 preAuthResponse.setTimeStamp(preAuthBean.getTimeStamp());
response.setTimeStamp(date); preAuthResponse.setErrorDesc(errorDesc);
preAuthResponse.setCustomerNumber(preAuthBean.getCustomerNumber());
String responseStr=JSONObject.fromObject(response).toString(); preAuthResponse.setAppName(preAuthBean.getAppName());
String responseStr=JSONObject.fromObject(preAuthResponse).toString();
return responseStr; return responseStr;
} }
} }
package com.fri.http.legalchapter.rzfw.auth; package com.fri.http.legalchapter.rzfw.auth;
import com.fri.http.legalchapter.rzfw.data.*; import com.fri.http.legalchapter.rzfw.data.*;
import com.fri.http.legalchapter.rzfw.exception.EncryptionException;
import com.fri.http.legalchapter.rzfw.net.SocketSender; import com.fri.http.legalchapter.rzfw.net.SocketSender;
import com.fri.http.legalchapter.rzfw.utils.Constans; import com.fri.http.legalchapter.rzfw.utils.Constans;
import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil; import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil;
...@@ -9,225 +10,204 @@ import sun.misc.BASE64Decoder; ...@@ -9,225 +10,204 @@ import sun.misc.BASE64Decoder;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/** /**
* Created by GavinLi 李晓阳 on 2017/12/24. * Created by GavinLi 李晓阳 on 2017/12/24.
*/ */
public class AuthRequest { public class AuthRequest {
/**
private byte[] reservationTwo=null; * businessSerialNumberByte 流水号 byte[] 类型
private byte[] reservationFour=null; * customerId 客户号 8字节 共用
private byte[] picture=null; * terminalId 终端号 2字节 共用 1.0写死 2.0用应用名称 FormatBytesUtil.hexStringToBytes(preAuthBean.getAppName());
private byte[] authCode=null; * certificateNumber 证书标识 or 业务站点
private byte[] idcardAuthData=null; * authApplyRetainData 客户端传入认证保留数据String
private byte[] auData=null; * authRetainTwoDataDesign 传入1.0 认证平台认证保留 2项数据 ( 已加密)
* authRetainFourDataDesign 传入1.0 认证平台认证保留 4项数据 ( 已加密)
* idcardAuthDataBase64DecodeAfter 传入1.0 认证平台认证ID验证数据( 已加密)
* pictureAuthDataBase64DecodeAfter 传入1.0 认证平台认证人像 ( 已加密)
* authCodeDataBase64DecodeAfter 传入1.0 认证平台认证认证码数据 ( 已加密)
* mode 认证模式
* authDate 根据模式组合成的数据
* version 协议版本 2字节 0x0001 共用
* commandType 命令类型 1字节 0x00(请求)0x01(应答) 共用
* command 命令 1字节 0x00(身份认证申请)0x01(身份认证) 修改值的内容为1
* commandContent 命令内容 1字节 保留 0x00 共用
* operation 操作 1字节 保留 0x00 共用
* auSPData 身份认证 二包 Socket数据报文
* authReturn 身份认证 1.0 平台二包 响应结果
* checkSignResult 验签是否正确
*/
private byte[] businessSerialNumberByte;
private byte[] customerId;
private byte[] terminalId;
private byte[] timeStamp;
private byte[] certificateNumber;
private AuthApplyRetainDataBean authApplyRetainData ;
private byte[] authRetainTwoDataDesign=null;
private byte[] authRetainFourDataDesign=null;
private byte[] idcardAuthDataBase64DecodeAfter=null;
private byte[] pictureAuthDataBase64DecodeAfter=null;
private byte[] authCodeDataBase64DecodeAfter=null;
private byte[] authDataBase64Decode=null;
private String mode;
private byte[] authDate=null;
private byte[] version=new byte[]{0, 1};
private byte[] commandType = new byte[]{0};
private byte[] command = new byte[]{1};
private byte[] commandContent = new byte[]{0};
private byte[] operation = new byte[]{0};
private byte[] auSPData;
private byte[] authReturn;
private boolean checkSignResult=false;
private Boolean success=false; private Boolean success=false;
private String errorDesc="UnKnow Error"; private String errorDesc="UnKnow Error";
private byte[] customerId_Length=new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
private byte[] timeStamp_Length=new byte[] { 1, 2,3,4};
AuthResponse authResponse=new AuthResponse();
public String authRequestExecute(String authRequestJson){ public String authRequestExecute(String authRequestJson){
JSONObject jsonObject = JSONObject.fromObject(authRequestJson);
Map config = new HashMap();
config.put("authApplyRetainData", AuthApplyRetainDataBean.class);
JSONObject authRequest= JSONObject.fromObject(authRequestJson); AuthRequestBean authRequestBean= (AuthRequestBean) JSONObject.toBean(jsonObject, AuthRequestBean.class, config);
AuthRequestBean authRequestBean= (AuthRequestBean) JSONObject.toBean(authRequest, AuthRequestBean.class); customerId=FormatBytesUtil.getBytesFromString(customerId_Length,authRequestBean.getCustomNumber());
terminalId=Constans.terminalId;
//获取业务流水号 HexString类型 timeStamp=FormatBytesUtil.getBytesFromString(timeStamp_Length,authRequestBean.getTimeStamp());
String businessSerialNumber= authRequestBean.getBusinessSerialNumber(); businessSerialNumberByte=FormatBytesUtil.hexStringToBytes(authRequestBean.getBusinessSerialNumber());
certificateNumber=Constans.certificateNumber;
//业务流水号 authApplyRetainData = authRequestBean.getAuthApplyRetainData();
byte[] streamNumber= FormatBytesUtil.hexStringToBytes(businessSerialNumber); mode=authRequestBean.getAuthMode();
//客户号
byte[] customerId=Constans.customerId;
//终端号
byte[] terminalId=Constans.terminalId;
//证书标识
byte[] certificateNumber=Constans.certificateNumber;
//认证保留数据
String authApplyRetainData = authRequestBean.getAuthApplyRetainData();
//获取ID验证数据
try {
idcardAuthData= excuteBase64Decode(authRequestBean.getIdcardAuthData());
} catch (IOException e) {
System.out.println("ID验证数据编码解析出错");
success=false;
errorDesc="ID验证数据编码解析出错,检查ID验证数据";
e.printStackTrace();
}
//获取人像
try {
picture = excuteBase64Decode(authRequestBean.getPhotoData());
} catch (IOException e) {
System.out.println("人像编码解析出错");
success=false;
errorDesc="人像编码解析出错,检查人像数据";
e.printStackTrace();
}
//获取认证码
try {
authCode = excuteBase64Decode(authRequestBean.getAuthCode());
} catch (IOException e) {
System.out.println("认证码解析出错");
success=false;
errorDesc="认证码解析出错,检查认证码数据";
e.printStackTrace();
}
//认证模式
String mode=authRequestBean.getAuthMode();
switch (mode){ switch (mode){
case "0x42": case "0x42":
getauthRetainTwoDataDesign(authApplyRetainData);
/**
* 0x42
*/
//获取两项信息
getReservationTwo(authApplyRetainData);
byte[] identityModel_0X42 = new byte[] { 0x42 }; byte[] identityModel_0X42 = new byte[] { 0x42 };
AuthenticationData au_0X42 = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X42, pictureAuthDataBase64DecodeAfter=dataProcessingBase64Decode("人像",authRequestBean.getPhotoData());
null, null, picture, reservationTwo, certificateNumber); AuthenticationData au_0X42 = new AuthenticationData(customerId, terminalId,timeStamp, businessSerialNumberByte, identityModel_0X42,
auData = au_0X42.getAuthenticationData(); null, null, pictureAuthDataBase64DecodeAfter, authRetainTwoDataDesign, certificateNumber);
authDate = au_0X42.getAuthenticationData();
break; break;
case "0x40": case "0x40":
getauthRetainTwoDataDesign(authApplyRetainData);
/**
* 0x40
*/
//获取两项信息
getReservationTwo(authApplyRetainData);
byte[] identityModel_0X40 = new byte[] { 0x40 }; byte[] identityModel_0X40 = new byte[] { 0x40 };
AuthenticationData au_0X40 = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X40, AuthenticationData au_0X40 = new AuthenticationData(customerId, terminalId, timeStamp,businessSerialNumberByte, identityModel_0X40,
null, null, null, reservationTwo, certificateNumber); null, null, null, authRetainTwoDataDesign, certificateNumber);
auData = au_0X40.getAuthenticationData(); authDate = au_0X40.getAuthenticationData();
break; break;
case "0x0f": case "0x0f":
/**
* 0X0F
*/
byte[] identityModel_0X0F = new byte[] { 0x0f }; byte[] identityModel_0X0F = new byte[] { 0x0f };
AuthenticationData au_0X0F = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X0F, idcardAuthDataBase64DecodeAfter=dataProcessingBase64Decode("ID",authRequestBean.getIdcardAuthData());
idcardAuthData, authCode, picture, null, certificateNumber); authCodeDataBase64DecodeAfter=dataProcessingBase64Decode("认证码",authRequestBean.getAuthCode());
auData = au_0X0F.getAuthenticationData(); pictureAuthDataBase64DecodeAfter=dataProcessingBase64Decode("人像",authRequestBean.getPhotoData());
AuthenticationData au_0X0F = new AuthenticationData(customerId, terminalId,timeStamp, businessSerialNumberByte, identityModel_0X0F,
idcardAuthDataBase64DecodeAfter, authCodeDataBase64DecodeAfter, pictureAuthDataBase64DecodeAfter, null, certificateNumber);
authDate = au_0X0F.getAuthenticationData();
break; break;
case "0x4f": case "0x4f":
/** getauthRetainTwoDataDesign(authApplyRetainData);
* 0X4F
*/
//获取两项信息
getReservationTwo(authApplyRetainData);
byte[] identityModel_0X4F = new byte[] { 0x4f }; byte[] identityModel_0X4F = new byte[] { 0x4f };
AuthenticationData au_0X4F = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X4F, idcardAuthDataBase64DecodeAfter=dataProcessingBase64Decode("ID",authRequestBean.getIdcardAuthData());
idcardAuthData, authCode, picture, reservationTwo, certificateNumber); authCodeDataBase64DecodeAfter=dataProcessingBase64Decode("认证码",authRequestBean.getAuthCode());
auData = au_0X4F.getAuthenticationData(); pictureAuthDataBase64DecodeAfter=dataProcessingBase64Decode("人像",authRequestBean.getPhotoData());
AuthenticationData au_0X4F = new AuthenticationData(customerId, terminalId, timeStamp,businessSerialNumberByte, identityModel_0X4F,
idcardAuthDataBase64DecodeAfter, authCodeDataBase64DecodeAfter, pictureAuthDataBase64DecodeAfter, authRetainTwoDataDesign, certificateNumber);
authDate = au_0X4F.getAuthenticationData();
break; break;
case "0x13": case "0x13":
/** getauthRetainFourDataDesign(authApplyRetainData);
* 0X13
*/
//获取四项信息
getReservationFour(authApplyRetainData);
byte[] identityModel_0X13 = new byte[] { 0x13 }; byte[] identityModel_0X13 = new byte[] { 0x13 };
AuthenticationData au_0X13 = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X13, idcardAuthDataBase64DecodeAfter=dataProcessingBase64Decode("ID",authRequestBean.getIdcardAuthData());
idcardAuthData,null, picture, reservationFour, certificateNumber); pictureAuthDataBase64DecodeAfter=dataProcessingBase64Decode("人像",authRequestBean.getPhotoData());
auData = au_0X13.getAuthenticationData(); AuthenticationData au_0X13 = new AuthenticationData(customerId, terminalId,timeStamp, businessSerialNumberByte, identityModel_0X13,
idcardAuthDataBase64DecodeAfter,null, pictureAuthDataBase64DecodeAfter, authRetainFourDataDesign, certificateNumber);
authDate = au_0X13.getAuthenticationData();
break;
case "0x1F": case "0x1F":
/** getauthRetainFourDataDesign(authApplyRetainData);
* 0X1F
*/
//获取四项信息
getReservationFour(authApplyRetainData);
byte[] identityModel_0X1F = new byte[] { 0x1f }; byte[] identityModel_0X1F = new byte[] { 0x1f };
AuthenticationData au_0X1F = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X1F, idcardAuthDataBase64DecodeAfter=dataProcessingBase64Decode("ID",authRequestBean.getIdcardAuthData());
idcardAuthData, authCode, picture, reservationFour, certificateNumber); authCodeDataBase64DecodeAfter=dataProcessingBase64Decode("认证码",authRequestBean.getAuthCode());
auData = au_0X1F.getAuthenticationData(); pictureAuthDataBase64DecodeAfter=dataProcessingBase64Decode("人像",authRequestBean.getPhotoData());
AuthenticationData au_0X1F = new AuthenticationData(customerId, terminalId,timeStamp, businessSerialNumberByte, identityModel_0X1F,
idcardAuthDataBase64DecodeAfter, authCodeDataBase64DecodeAfter, pictureAuthDataBase64DecodeAfter, authRetainFourDataDesign, certificateNumber);
authDate = au_0X1F.getAuthenticationData();
break; break;
} }
SocketPackage auSP = new SocketPackage(version, commandType, command, commandContent, operation, authDate);
/* auSPData = auSP.getSocketPackage();
* 组装认证Socket数据包 第二次UDP数据包 authReturn = SocketSender.sendSocketPackage(auSPData);
*/ checkSignResult=DataSignature.signCheck(authReturn);
if (!checkSignResult){
// 协议版本 2字节 0x0001 共用 errorDesc="身份认证1.0 平台二包 响应验签出错";
byte[] version = { 0, 1 }; }else
// 命令类型 1字节 0x00(请求)0x01(应答) 共用 if(authReturn != null) {
byte[] commandType = { 0 }; String authResult = new String(Arrays.copyOfRange(authReturn, 33, 37));
authResponse.setAuthResult(authResult);
// 命令内容 1字节 保留 0x00 共用
byte[] commandContent = { 0 };
// 操作 1字节 保留 0x00 共用
byte[] operation = { 0 };
// 命令 1字节 0x00(身份认证申请)0x01(身份认证) 共用但值不同
byte[] command = { 1 };// 命令 1字节 0x00(身份认证申请)0x01(身份认证) 修改值的内容为1
SocketPackage auSP = new SocketPackage(version, commandType, command, commandContent, operation, auData);
byte[] auSPData = auSP.getSocketPackage();
byte[] auReturn = SocketSender.sendSocketPackage(auSPData);
AuthResponse authRes=new AuthResponse();
//设置业务流水号
authRes.setBusinessSerialNumber(businessSerialNumber);
if (auReturn != null) {
System.out.println("响应结果:"+ Arrays.toString(auReturn));
System.out.println("验签结果:" + DataSignature.signCheck(auReturn)); // 验签
String authResult = new String(Arrays.copyOfRange(auReturn, 33, 37));
System.out.print("认证结果:" + authResult);
authRes.setAuthResult(authResult);
success=true; success=true;
errorDesc=""; errorDesc="";
} }
authResponse.setAppName(authRequestBean.getAppName());
authRes.setSuccess(success); authResponse.setCustomerNumber(authRequestBean.getCustomNumber());
authRes.setErrorDesc(errorDesc); authResponse.setTimeStamp(authRequestBean.getTimeStamp());
authResponse.setBusinessSerialNumber(authRequestBean.getBusinessSerialNumber());
String authResStr=JSONObject.fromObject(authRes).toString(); authResponse.setSuccess(success);
authResponse.setErrorDesc(errorDesc);
String authResStr=JSONObject.fromObject(authResponse).toString();
return authResStr; return authResStr;
} }
public void getReservationTwo(String retainDate){ public void getauthRetainTwoDataDesign(AuthApplyRetainDataBean retainDate){
try {
JSONObject retainData= JSONObject.fromObject(retainDate); String name=retainDate.getName();
String name=retainData.getString(Constans.name); String idNumber=retainDate.getIdNumber();
String idNumber=retainData.getString(Constans.idNumber); authRetainTwoDataDesign = new ReservationData(name, idNumber, null, null).getReservasionBytes();
}catch (EncryptionException e){
reservationTwo = new ReservationData(name, idNumber, null, null).getReservasionBytes(); // 生成两项保留数据 success=false;
errorDesc="2项保留数据加密失败,检查保留数据";
e.printStackTrace();
}
} }
public void getReservationFour(String retainDate){ public void getauthRetainFourDataDesign(AuthApplyRetainDataBean retainDate){
try{
JSONObject retainData= JSONObject.fromObject(retainDate); String name=retainDate.getName();
String name=retainData.getString(Constans.name); String idNumber=retainDate.getIdNumber();
String idNumber=retainData.getString(Constans.idNumber); String enableDate=retainDate.getEnableDate();
String enableDate=retainData.getString(Constans.enableDate); String expireDate=retainDate.getExpireDate();
String expireDate=retainData.getString(Constans.expireDate); authRetainFourDataDesign = new ReservationData(name, idNumber, enableDate, expireDate)
.getReservasionBytes();
reservationFour = new ReservationData(name, idNumber, enableDate, expireDate) }catch (EncryptionException e){
.getReservasionBytes(); // 生成四项保留数据 success=false;
errorDesc="4项保留数据加密失败,检查保留数据";
e.printStackTrace();
}
} }
public byte[] excuteBase64Decode(String encodeData) throws IOException { private byte[] excuteBase64Decode(String encodeData) throws IOException {
byte[] originalData= new BASE64Decoder().decodeBuffer(encodeData); byte[] originalData= new BASE64Decoder().decodeBuffer(encodeData);
return originalData; return originalData;
} }
private byte[] dataProcessingBase64Decode(String dataName,String data ){
switch (dataName){
case "ID":
authDataBase64Decode=FormatBytesUtil.hexStringToBytes(data);
break;
case "认证码":
authDataBase64Decode=FormatBytesUtil.hexStringToBytes(data);
break;
case "人像":
try {
authDataBase64Decode = excuteBase64Decode(data);
} catch (IOException e) {
errorDesc="人像编码解析出错";
success=false;
e.printStackTrace();
}
break;
}
return authDataBase64Decode;
}
} }
package com.fri.http.legalchapter.rzfw.data;
/**
* Created by gaoxiang on 2017/12/29.
*/
public class AuthApplyRetainDataBean {
private String name;
private String idNumber;
private String enableDate;
private String expireDate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getEnableDate() {
return enableDate;
}
public void setEnableDate(String enableDate) {
this.enableDate = enableDate;
}
public String getExpireDate() {
return expireDate;
}
public void setExpireDate(String expireDate) {
this.expireDate = expireDate;
}
}
...@@ -25,7 +25,15 @@ public class AuthRequestBean { ...@@ -25,7 +25,15 @@ public class AuthRequestBean {
private String photoData; private String photoData;
private String authCode; private String authCode;
private String idcardAuthData; private String idcardAuthData;
private String authApplyRetainData; private AuthApplyRetainDataBean authApplyRetainData=new AuthApplyRetainDataBean();
public AuthApplyRetainDataBean getAuthApplyRetainData() {
return authApplyRetainData;
}
public void setAuthApplyRetainData(AuthApplyRetainDataBean authApplyRetainData) {
this.authApplyRetainData = authApplyRetainData;
}
public String getCustomNumber() { public String getCustomNumber() {
return customNumber; return customNumber;
...@@ -91,11 +99,4 @@ public class AuthRequestBean { ...@@ -91,11 +99,4 @@ public class AuthRequestBean {
this.idcardAuthData = idcardAuthData; this.idcardAuthData = idcardAuthData;
} }
public String getAuthApplyRetainData() {
return authApplyRetainData;
}
public void setAuthApplyRetainData(String authApplyRetainData) {
this.authApplyRetainData = authApplyRetainData;
}
} }
...@@ -6,78 +6,84 @@ import java.util.Arrays; ...@@ -6,78 +6,84 @@ import java.util.Arrays;
public class AuthenticationData { public class AuthenticationData {
// 客户号 8字节 /**
* lengthOfTwo ID验证数据字段及认证吗数据字段总长 2字节
* lengthOfIdCheck ID验证数据长度 2字节
* lengthOfAuthCodeData 认证码数据长度 2字节
* lengthOfPicture 照片长度 4字节
* lengthOfReservasion 认证申请保留数据长度 2字节
*/
private byte[] lengthOfTwo;
private byte[] lengthOfIdCheck;
private byte[] lengthOfAuthCodeData;
private byte[] lengthOfPicture;
private byte[] lengthOfReservasion;
private byte[] customerId; private byte[] customerId;
// 终端号 2字节
private byte[] terminalId; private byte[] terminalId;
// 时间戳 4字节
private byte[] timestamp; private byte[] timestamp;
// 业务流水号 9字节
private byte[] streamNumber; private byte[] streamNumber;
// 认证模式 1字节
private byte[] identityModel; private byte[] identityModel;
// ID验证数据字段及认证吗数据字段总长 2字节 private byte[] idCheckData;
private byte[] lengthOfTwo; private byte[] authCodeData;
// ID验证数据长度 2字节 private byte[] pictureData;
private byte[] lengthOfIdCheck; private byte[] reservationData;
// ID验证数据 变长 可为空
private byte[] idCheck;
// 认证码数据长度 2字节
private byte[] lengthOfVerification;
// 认证码数据 变长 可为空
private byte[] verification;
// 照片长度 4字节
private byte[] lengthOfPicture;
// 照片数据 变长 可为空
private byte[] picture;
// 认证申请保留数据长度 2字节
private byte[] lengthOfReservasion;
// 认证申请保留数据 变长 可为空
private byte[] reservation;
// 证书序列号 32字节
private byte[] certificateNumber; private byte[] certificateNumber;
public AuthenticationData(byte[] customerId, byte[] terminalId, byte[] streamNumber, byte[] identityModel, /**
byte[] idCheck, byte[] verification, byte[] picture, byte[] reservation, byte[] certificateNumber) { *
* @param customerId 客户号 8字节
* @param terminalId 终端号 2字节
* @param timestamp 时间戳 4字节
* @param streamNumber 业务流水号 9字节
* @param identityModel 认证模式 1字节
* @param idCheckData ID验证数据 变长 可为空
* @param authCodeData 认证码数据 变长 可为空
* @param pictureData 照片数据 变长 可为空
* @param reservationData 认证申请保留数据 变长 可为空
* @param certificateNumber 证书序列号 32字节
*/
public AuthenticationData(byte[] customerId, byte[] terminalId, byte[] timestamp, byte[] streamNumber, byte[] identityModel,
byte[] idCheckData, byte[] authCodeData, byte[] pictureData, byte[] reservationData, byte[] certificateNumber) {
super(); super();
this.customerId = customerId; this.customerId = customerId;
this.terminalId = terminalId; this.terminalId = terminalId;
this.timestamp = FormatBytesUtil.getTimestamp(); this.timestamp = timestamp;
this.streamNumber = streamNumber; this.streamNumber = streamNumber;
this.identityModel = identityModel; this.identityModel = identityModel;
int idCheckLengthTemp = 0; int idCheckLengthTemp = 0;
int verificationLengthTemp = 0; int verificationLengthTemp = 0;
this.lengthOfIdCheck = new byte[] { 0, 0 }; this.lengthOfIdCheck = new byte[] { 0, 0 };
if (idCheck != null) { if (idCheckData != null) {
idCheckLengthTemp = idCheck.length; idCheckLengthTemp = idCheckData.length;
this.lengthOfIdCheck = FormatBytesUtil.getByteOfShort((short) idCheck.length); this.lengthOfIdCheck = FormatBytesUtil.getByteOfShort((short) idCheckData.length);
} }
this.idCheck = idCheck; this.idCheckData = idCheckData;
this.lengthOfVerification = new byte[] { 0, 0 }; this.lengthOfAuthCodeData = new byte[] { 0, 0 };
if (verification != null) { if (authCodeData != null) {
verificationLengthTemp = verification.length; verificationLengthTemp = authCodeData.length;
this.lengthOfVerification = FormatBytesUtil.getByteOfShort((short) verification.length); this.lengthOfAuthCodeData = FormatBytesUtil.getByteOfShort((short) authCodeData.length);
} }
this.verification = verification; this.authCodeData = authCodeData;
this.lengthOfTwo = FormatBytesUtil.getByteOfShort((short) (idCheckLengthTemp + verificationLengthTemp + 4)); this.lengthOfTwo = FormatBytesUtil.getByteOfShort((short) (idCheckLengthTemp + verificationLengthTemp + 4));
this.lengthOfPicture = new byte[] { 0, 0, 0, 0 }; this.lengthOfPicture = new byte[] { 0, 0, 0, 0 };
if (picture != null) { if (pictureData != null) {
this.lengthOfPicture = FormatBytesUtil.getBytesOfInt(picture.length); this.lengthOfPicture = FormatBytesUtil.getBytesOfInt(pictureData.length);
} }
this.picture = picture; this.pictureData = pictureData;
this.lengthOfReservasion = new byte[] { 0, 0 }; this.lengthOfReservasion = new byte[] { 0, 0 };
if (reservation != null) { if (reservationData != null) {
this.lengthOfReservasion = FormatBytesUtil.getByteOfShort((short) reservation.length); this.lengthOfReservasion = FormatBytesUtil.getByteOfShort((short) reservationData.length);
} }
this.reservation = reservation; this.reservationData = reservationData;
this.certificateNumber = certificateNumber; this.certificateNumber = certificateNumber;
} }
public byte[] getAuthenticationData() { public byte[] getAuthenticationData() {
byte[] data = FormatBytesUtil.concatAll(customerId, terminalId, timestamp, streamNumber, identityModel, byte[] data = FormatBytesUtil.concatAll(customerId, terminalId, timestamp, streamNumber, identityModel,
lengthOfTwo, lengthOfIdCheck, idCheck, lengthOfVerification, verification, lengthOfPicture, picture, lengthOfTwo, lengthOfIdCheck, idCheckData, lengthOfAuthCodeData, authCodeData, lengthOfPicture, pictureData,
lengthOfReservasion, reservation, certificateNumber); lengthOfReservasion, reservationData, certificateNumber);
System.out.println("身份认证数据区:" + Arrays.toString(data));
return data; return data;
} }
} }
package com.fri.http.legalchapter.rzfw.data; package com.fri.http.legalchapter.rzfw.data;
import java.util.Arrays; import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cn.com.jit.assp.css.client.util.Base64; import cn.com.jit.assp.css.client.util.Base64;
...@@ -18,7 +20,6 @@ public class DataSignature { ...@@ -18,7 +20,6 @@ public class DataSignature {
} }
public static boolean signCheck(byte[] dataPackage) { public static boolean signCheck(byte[] dataPackage) {
byte[] dataLengthByte = Arrays.copyOfRange(dataPackage, 6, 10); byte[] dataLengthByte = Arrays.copyOfRange(dataPackage, 6, 10);
// 数据区长度 // 数据区长度
int dataLength = FormatBytesUtil.getIntFromBytes(dataLengthByte); int dataLength = FormatBytesUtil.getIntFromBytes(dataLengthByte);
...@@ -37,13 +38,10 @@ public class DataSignature { ...@@ -37,13 +38,10 @@ public class DataSignature {
String certID = new String(zhengshu).trim(); String certID = new String(zhengshu).trim();
System.out.println("证书序列号:" + certID); System.out.println("证书序列号:" + certID);
String strDigetsAlg = "sm3"; String strDigetsAlg = "sm3";
long a = ds.p1Verify(certID, strDigetsAlg, Base64.encode(signatureByte), data); long a = ds.p1Verify(certID, strDigetsAlg, Base64.encode(signatureByte), data);
if (a == 0) { if (a == 0) {
return true; return true;
} }
System.out.println("错误号为:" + ds.getErrorCode());
System.out.println("错误描述:" + ds.getErrorMessage());
return false; return false;
} }
} }
package com.fri.http.legalchapter.rzfw.data;
/**
* Created by gaoxiang on 2017/12/26.
*/
public class PreAuthBean {
private String customerNumber = "";
private String appName = "";
private String timeStamp = "";
private String cardReaderVersion = "";
private String liveDetectionControlVersion = "";
private String authCodeControlVersion = "" ;
private String authMode = "";
public String getCustomerNumber() {
return customerNumber;
}
public void setCustomerNumber(String customerNumber) {
this.customerNumber = customerNumber;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(String timeStamp) {
this.timeStamp = timeStamp;
}
public String getCardReaderVersion() {
return cardReaderVersion;
}
public void setCardReaderVersion(String cardReaderVersion) {
this.cardReaderVersion = cardReaderVersion;
}
public String getLiveDetectionControlVersion() {
return liveDetectionControlVersion;
}
public void setLiveDetectionControlVersion(String liveDetectionControlVersion) {
this.liveDetectionControlVersion = liveDetectionControlVersion;
}
public String getAuthCodeControlVersion() {
return authCodeControlVersion;
}
public void setAuthCodeControlVersion(String authCodeControlVersion) {
this.authCodeControlVersion = authCodeControlVersion;
}
public String getAuthMode() {
return authMode;
}
public void setAuthMode(String authMode) {
this.authMode = authMode;
}
}
...@@ -5,7 +5,7 @@ import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil; ...@@ -5,7 +5,7 @@ import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil;
import java.util.Arrays; import java.util.Arrays;
public class AuthenticationApplicationData { public class PreAuthData {
// 客户号 8字节 // 客户号 8字节
private byte[] customerId; private byte[] customerId;
// 终端号 2字节 // 终端号 2字节
...@@ -19,21 +19,20 @@ public class AuthenticationApplicationData { ...@@ -19,21 +19,20 @@ public class AuthenticationApplicationData {
// 证书序列号 32字节 // 证书序列号 32字节
private byte[] certificateNumber; private byte[] certificateNumber;
public AuthenticationApplicationData(byte[] customerId, byte[] terminalId, byte[] readCardControlsVersion, public PreAuthData(byte[] customerId, byte[] terminalId, byte[] timestamp, byte[] readCardControlsVersion,
byte[] pictureControlsVersion, byte[] certificateNumber) { byte[] pictureControlsVersion, byte[] certificateNumber) {
super(); super();
this.customerId = customerId; this.customerId = customerId;
this.terminalId = terminalId; this.terminalId = terminalId;
this.timestamp = FormatBytesUtil.getTimestamp(); this.timestamp = timestamp;
this.readCardControlsVersion = readCardControlsVersion; this.readCardControlsVersion = readCardControlsVersion;
this.pictureControlsVersion = pictureControlsVersion; this.pictureControlsVersion = pictureControlsVersion;
this.certificateNumber = certificateNumber; this.certificateNumber = certificateNumber;
} }
public byte[] getAuthenticationApplicationData() { public byte[] getPreAuthData() {
byte[] data = FormatBytesUtil.concatAll(customerId, terminalId, timestamp, readCardControlsVersion, byte[] data = FormatBytesUtil.concatAll(customerId, terminalId, timestamp, readCardControlsVersion,
pictureControlsVersion, certificateNumber); pictureControlsVersion, certificateNumber);
System.out.println("身份认证申请数据区:" + Arrays.toString(data));
return data; return data;
} }
} }
...@@ -3,7 +3,7 @@ package com.fri.http.legalchapter.rzfw.data; ...@@ -3,7 +3,7 @@ package com.fri.http.legalchapter.rzfw.data;
/** /**
* Created by GavinLi 李晓阳 on 2017/12/24. * Created by GavinLi 李晓阳 on 2017/12/24.
*/ */
public class AuthApplyResponse { public class PreAuthResponse {
/** /**
* customerNumber : LegalPersonChapter001 * customerNumber : LegalPersonChapter001
......
package com.fri.http.legalchapter.rzfw.data; package com.fri.http.legalchapter.rzfw.data;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import cn.com.jit.assp.dsign.DSign; import cn.com.jit.assp.dsign.DSign;
import com.fri.http.legalchapter.rzfw.exception.EncryptionException;
import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil; import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil;
public class ReservationData { public class ReservationData {
...@@ -35,17 +37,16 @@ String json=""; ...@@ -35,17 +37,16 @@ String json="";
this.validEnd = validEnd; this.validEnd = validEnd;
} }
public byte[] getReservasionBytes() { public byte[] getReservasionBytes() throws EncryptionException{
// 各项信息长度固定 // 各项信息长度固定
byte[] nameByte = new byte[45]; byte[] nameByte = new byte[45];
byte[] idNumberByte = new byte[18]; byte[] idNumberByte = new byte[18];
byte[] validFromByte = new byte[8]; byte[] validFromByte = new byte[8];
byte[] validEndByte = new byte[8]; byte[] validEndByte = new byte[8];
try { try {
// 姓名以UTF-8格式转换为byte[] // 姓名以UTF-8格式转换为byte[]
nameByte = FormatBytesUtil.copyByteToAnother(nameByte, name.getBytes("UTF-8")); nameByte = FormatBytesUtil.copyByteToAnother(nameByte, name.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
...@@ -64,21 +65,18 @@ String json=""; ...@@ -64,21 +65,18 @@ String json="";
} }
/** /**
* 通过签名服务器对保留数据单独进行加密 * 通过签名服务器对数据单独进行加密
* *
* @param bytes * @param bytes
* @return * @return
*/ */
private byte[] getDesign(byte[] bytes) { public static byte[] getDesign(byte[] bytes){
DSign dSign = new DSign(); DSign dSign = new DSign();
String signReturn = null; String signReturn = null;
DSign.init("./config/cssconfig.properties"); DSign.init("./config/cssconfig.properties");
// 正式线alias改成{ "rzfw01" }
String[] alias = { "rzfw01" }; String[] alias = { "rzfw01" };
signReturn = dSign.encryptEnvelop(alias, bytes); signReturn = dSign.encryptEnvelop(alias, bytes);
if (signReturn != null) { return signReturn.getBytes();
return signReturn.getBytes();
}
return null;
} }
} }
...@@ -6,25 +6,28 @@ import java.util.Arrays; ...@@ -6,25 +6,28 @@ import java.util.Arrays;
public class SocketPackage { public class SocketPackage {
// 协议版本 2字节 0x0001
private byte[] version; private byte[] version;
// 命令类型 1字节 0x00(请求)0x01(应答)
private byte[] commandType; private byte[] commandType;
// 命令 1字节 0x00(身份认证申请)0x01(身份认证)
private byte[] command; private byte[] command;
// 命令内容 1字节 保留 0x00
private byte[] commandContent; private byte[] commandContent;
// 操作 1字节 保留 0x00
private byte[] operation; private byte[] operation;
// 数据区长度 4字节 // 数据区长度 4字节
private byte[] dataLength; private byte[] dataLength;
// 数据区 变长
private byte[] data; private byte[] data;
// 签名长度 1字节 // 签名长度 1字节
private byte[] signatureLength; private byte[] signatureLength;
// 签名 变长 // 签名 变长
private byte[] signature; private byte[] signature;
/**
*
* @param version 协议版本 2字节 0x0001
* @param commandType 命令类型 1字节 0x00(请求)0x01(应答)
* @param command 命令 1字节 0x00(身份认证申请)0x01(身份认证)
* @param commandContent 命令内容 1字节 保留 0x00
* @param operation 操作 1字节 保留 0x00
* @param data 数据区 变长
*/
public SocketPackage(byte[] version, byte[] commandType, byte[] command, byte[] commandContent, byte[] operation, public SocketPackage(byte[] version, byte[] commandType, byte[] command, byte[] commandContent, byte[] operation,
byte[] data) { byte[] data) {
super(); super();
...@@ -40,13 +43,11 @@ public class SocketPackage { ...@@ -40,13 +43,11 @@ public class SocketPackage {
public byte[] getSocketPackage() { public byte[] getSocketPackage() {
byte[] clearText = FormatBytesUtil.concatAll(version, commandType, command, commandContent, operation, byte[] clearText = FormatBytesUtil.concatAll(version, commandType, command, commandContent, operation,
dataLength, data); dataLength, data);
System.out.println("身份认证请求Socket数据原文:" + Arrays.toString(clearText));
byte[] cipherText = DataSignature.signature(clearText); byte[] cipherText = DataSignature.signature(clearText);
System.out.println("身份认证请求Socket数据签名:" + Arrays.toString(cipherText));
this.signatureLength = new byte[] { (byte) cipherText.length }; this.signatureLength = new byte[] { (byte) cipherText.length };
this.signature = cipherText; this.signature = cipherText;
byte[] socketPackage = FormatBytesUtil.concatAll(clearText, signatureLength, signature); byte[] socketPackage = FormatBytesUtil.concatAll(clearText, signatureLength, signature);
System.out.println("身份认证请求Socket数据报文:" + Arrays.toString(socketPackage));
return socketPackage; return socketPackage;
} }
......
package com.fri.http.legalchapter.rzfw.exception;
/**
* Created by gao on 2017/9/1.
*/
public class BasicException extends Exception {
private String msg;
public BasicException(){}
public BasicException( String msg){
this.msg=msg;
}
@Override
public String getMessage() {
return "ERROR: -> " + this.msg;
}
}
package com.fri.http.legalchapter.rzfw.exception;
/**
* Created by gaoxiang on 2017/12/27.
*/
public class EncryptionException extends BasicException{
public EncryptionException(String msg){super(msg);}
}
package com.fri.http.legalchapter.rzfw.test;
import com.fri.http.legalchapter.rzfw.data.*;
import com.fri.http.legalchapter.rzfw.net.SocketSender;
import com.fri.http.legalchapter.rzfw.utils.Constans;
import com.fri.http.legalchapter.rzfw.utils.FormatBytesUtil;
import java.util.Arrays;
/**
* 身份认证测试Demo
*
* @author 夏晨棋
* @email xia794404765@gmail.com
* @qq 794404765
* @version 创建时间 2017年3月8日 下午3:25:38
*/
public class RunDemo {
public static void main(String[] args) {
/*
* 组装认证申请数据区 第一个包的数据区
*/
// 客户号 8字节 共用
byte[] customerId = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
// 终端号 2字节 共用
byte[] terminalId = new byte[] { 1, 2 };
// 读卡控件版本 4字节
byte[] readCardControlsVersion = new byte[] { 1, 2, 3, 4 };
// 人像控件版本 4字节
byte[] pictureControlsVersion = new byte[] { 1, 2, 3, 4 };
// 证书序列号 32字节 "csywzd1" 共用
// byte[] certificateNumber = new byte[] { 99, 115, 121, 119, 122, 100, 49 };
byte[] certificateNumber = new byte[] {114, 122, 102, 119, 48, 49 };
certificateNumber = FormatBytesUtil.copyByteToAnother(new byte[32], certificateNumber);
System.out.println("证书序列号:" + Arrays.toString(certificateNumber));
AuthenticationApplicationData auApp = new AuthenticationApplicationData(customerId, terminalId,
readCardControlsVersion, pictureControlsVersion, certificateNumber);
byte[] auAppData = auApp.getAuthenticationApplicationData();
/*
* 组装认证申请Socket数据包 第一次UDP数据包
*/
// 协议版本 2字节 0x0001 共用
byte[] version = { 0, 1 };
// 命令类型 1字节 0x00(请求)0x01(应答) 共用
byte[] commandType = { 0 };
// 命令 1字节 0x00(身份认证申请)0x01(身份认证) 共用但值不同
byte[] command = { 0 };
// 命令内容 1字节 保留 0x00 共用
byte[] commandContent = { 0 };
// 操作 1字节 保留 0x00 共用
byte[] operation = { 0 };
SocketPackage auAppSP = new SocketPackage(version, commandType, command, commandContent, operation, auAppData);
byte[] auAppSPData = auAppSP.getSocketPackage();
byte[] applicationReturn = SocketSender.sendSocketPackage(auAppSPData);
/*
* 组装认证数据区 第二个包的数据区
*/
byte[] streamNumber = null;
if (applicationReturn != null) {
streamNumber = Arrays.copyOfRange(applicationReturn, 24, 33);// 获取到业务流水号要组装进第二个数据包中
System.out.println("流水号:" + Arrays.toString(streamNumber));
System.out.println(FormatBytesUtil.bytesToHexString(streamNumber));
short randomBytesLength = FormatBytesUtil.getShortFromBytes(Arrays.copyOfRange(applicationReturn, 33, 35)); // 获取随机数长度
String randomData = FormatBytesUtil
.bytesToHexString(Arrays.copyOfRange(applicationReturn, 35, 35 + randomBytesLength)); // 获取随机数数据
System.out.println("随机数长度:" + randomBytesLength);
System.out.println("随机数数据:" + randomData);
}
if (applicationReturn == null) {
System.out.println("获取流水号失败,认证失败。");
return;
}
byte[] picture = Constans.picture; // 生成人像数据
byte[] reservationFour = new ReservationData("毛家亮", "342224198901241273", "20071114", "20171114")
.getReservasionBytes(); // 生成四项保留数据
byte[] reservationTwo = new ReservationData("李晓阳", "410185199211044510", null, null).getReservasionBytes(); // 生成两项保留数据
/*
* 0X0F
*/
byte[] identityModel_0X0F = new byte[] { 0x0f };
AuthenticationData au_0X0F = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X0F,
Constans.idCheck, Constans.verification, picture, null, certificateNumber);
byte[] auData_0X0F = au_0X0F.getAuthenticationData();
/*
* 0X4F
*/
byte[] identityModel_0X4F = new byte[] { 0x4f };
AuthenticationData au_0X4F = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X4F,
Constans.idCheck, Constans.verification, picture, reservationTwo, certificateNumber);
@SuppressWarnings("unused")
byte[] auData_0X4F = au_0X4F.getAuthenticationData();
/*
* 0X1F
*/
byte[] identityModel_0X1F = new byte[] { 0x1f };
AuthenticationData au_0X1F = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X1F,
Constans.idCheck, Constans.verification, picture, reservationFour, certificateNumber);
byte[] identityModel_0X62 = new byte[] { 0x62 };
AuthenticationData au_0X62 = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X62,
null, null, picture, reservationFour, certificateNumber);
@SuppressWarnings("unused")
byte[] auData_0X62 = au_0X62.getAuthenticationData();
/**
* 0x40
*/
byte[] identityModel_0X40 = new byte[] { 0x40 };
AuthenticationData au_0X40 = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X40,
null, null, null, reservationTwo, certificateNumber);
@SuppressWarnings("unused")
byte[] auData_0X40 = au_0X40.getAuthenticationData();
/**
* 0x42
*/
byte[] identityModel_0X42 = new byte[] { 0x42 };
AuthenticationData au_0X42 = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X42,
null, null, picture, reservationTwo, certificateNumber);
@SuppressWarnings("unused")
byte[] auData_0X42 = au_0X42.getAuthenticationData();
/*
* 0X13
*/
byte[] identityModel_0X13 = new byte[] { 0x13 };
AuthenticationData au_0X13 = new AuthenticationData(customerId, terminalId, streamNumber, identityModel_0X13,
Constans.idCheck, null, picture, reservationFour, certificateNumber);
@SuppressWarnings("unused")
byte[] auData_0X13 = au_0X13.getAuthenticationData();
/*
* 组装认证Socket数据包 第二次UDP数据包
*/
command[0] = 1; // 命令 1字节 0x00(身份认证申请)0x01(身份认证) 修改值的内容为1
SocketPackage auSP = new SocketPackage(version, commandType, command, commandContent, operation, auData_0X40);
byte[] auSPData = auSP.getSocketPackage();
byte[] auReturn = SocketSender.sendSocketPackage(auSPData);
if (auReturn != null) {
System.out.println("响应结果:"+Arrays.toString(auReturn));
System.out.println("验签结果:" + DataSignature.signCheck(auReturn)); // 验签
String string = new String(Arrays.copyOfRange(auReturn, 33, 37));
System.out.print("认证结果:" + string);
return;
}
System.out.println("认证失败。");
}
}
package com.fri.http.legalchapter.rzfw.utils; package com.fri.http.legalchapter.rzfw.utils;
import sun.misc.BASE64Decoder;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
...@@ -10,16 +12,14 @@ import java.net.UnknownHostException; ...@@ -10,16 +12,14 @@ import java.net.UnknownHostException;
public class Constans { public class Constans {
// 签名方法参数 // 签名方法参数
public static String strDN = "rzfw01"; // public static String strDN = "rzfw01";
public static String strDN = "ywzd49";
public static String strDigestAlg = "sm3"; public static String strDigestAlg = "sm3";
// 客户号 8字节 共用
public static byte[] customerId = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
// 终端号 2字节 共用 // 终端号 2字节 共用
public static byte[] terminalId = new byte[] { 1, 2 }; public static byte[] terminalId = new byte[] { 1, 2 };
public static byte[] certificateNumber = FormatBytesUtil.copyByteToAnother(new byte[32], new byte[] {114, 122, 102, 119, 48, 49 }); public static byte[] certificateNumber = FormatBytesUtil.copyByteToAnother(new byte[32], new byte[] {121, 119, 122, 100, 52, 57 });
public static String business ="businessSerialNumber"; public static String business ="businessSerialNumber";
//申请保留数据 //申请保留数据
...@@ -28,15 +28,15 @@ public class Constans { ...@@ -28,15 +28,15 @@ public class Constans {
public static String authMode="authMode"; public static String authMode="authMode";
public static String name="Name"; public static String name="刘主雪";
public static String idNumber="IDNumber"; public static String idNumber="142625199212162428";
public static String enableDate="EnableDate"; public static String enableDate="20090716";
public static String expireDate ="ExpireDate"; public static String expireDate ="20190716";
// UDP Socket参数 // UDP Socket参数
// public static String ip = "111.200.45.122"; public static String ip = "111.200.45.2";
public static String ip = "172.16.16.253"; // public static String ip = "172.16.16.253";
public static int port = 8283; public static int port = 8283;
public static InetAddress ia = null; public static InetAddress ia = null;
static { static {
...@@ -47,76 +47,24 @@ public class Constans { ...@@ -47,76 +47,24 @@ public class Constans {
e.printStackTrace(); e.printStackTrace();
} }
} }
public static byte[] idCheck = new byte[] { 3, 0, -51, -13, -36, 14, 123, 109, 106, 88, 2, 82, -46, -28, -84, -37, // public static String LZX_idCheck = "0300F6A5BFC3ADCA157217E103C86BE0174B1CFBCBFA782CBF0DC0C8C249E2BB4BD5323031363034313831303434343039393301016C51895BE8902C7B004E1478767A40620020002000200020002000200020320030003100360030003400310038003200300031003900300037003100360090819995EE809BD6E9649F1BAC033AE23856DD281EA70670038A6740203500E2F6A5BFC3ADCA157217E103C86BE0174B1CFBCBFA782CBF0DC0C8C249E2BB4BD51FBED509A60453B82C41607299E0B5141E3BC7733CBDD5C9CB656A67D4EF66B8000130460221008F47E438B75E537763BA0F04533213C6BA4CBC411C182605481DDCE4A0C24A36022100B28185507A7D745A91DFAA5DB9D4316C06EB445D60E7241C533C7EAFF4BC2EBB4D4949423241594B4B6F45637A31554741515143413643434163677767674845416745414D5948524D49484F416745414D4430774D54454C4D416B474131554542684D43513034784554415042674E5642416F544345644D5131524A524441784D513877445159445651514445775A4854454E424D444543434839367753726955436E504D41304743537142484D395641594974417755414248737765514968414F56446453376E566A46466D4F676F4C626F2B32696C38596E3073424D4E38532B48634D347652707968784169425833326C385554782F693079565A4E3161672B432F675835342F345974464E7669734D344358526E6C4B515167724E5945486F37527A7869493032707A6C67725A6F613854754966426353736F2B476A487A76574A5863304545436A4D3043563465767951656F4171366A32724952517767656F4743697142484D39564267454541674577435159484B6F45637A3155426149434230497470753546596D4A6B7556544B516863413237584B58624A59474F3176582B48334869676942414838376542536C676E70577A6D5738455969613064725658514F362B3463587A6869614C6269446B687A4A6D36785559495A3978455757444A6E493757565539416B527A49365172436A347A396A54772F534232725446594B6A492F694A7058397138615561584C48444237586D65412B793534652B357764746974796D72556679577945773331315448383530517673793849496478346A78364367563956326B6858796938463077536F777A652B3053744F4C7739736A6C6C70356F6450316567376E37526871365A6B396C36414A61664E4A31714D626B6C7979654E682B494434364775417361456D75673D";
-82, 113, 111, -118, 34, 107, -40, -59, 69, -68, -10, 97, 110, -52, 70, -114, -34, -15, 50, 48, 49, 53, 49, // public static String LZX_verification = "B8014D4949425267594B4B6F45637A31554741515143413643434154597767674579416745414D5948524D49484F416745414D4430774D54454C4D416B474131554542684D43513034784554415042674E5642416F544345644D5131524A524441784D513877445159445651514445775A4854454E424D444543434839367753726955436E504D41304743537142484D395641594974417755414248737765514967655A476B705077427839706F6754666B464C554F322B444B6F52676E49566F3466676678646A574B716C634349514362756573732F6C702F54516E4C56366B5A55374B796C33764E6A7255585550325463457A345777552F32515167684E704F41426E4354436E49516A5A6E57747032654245574F434435327550514F6A56314E7462543541514545454F42355045356F797673616A58752B78315050386B775751594B4B6F45637A315547415151434154414A4267637167527A505651466F674544636D386732346D326936556E4B41316342536D456A6F4E587846336567715435432F476F436E674B2B4A6A506C566B634147535034654F6E70554C46696749697664785369563544575862787A516C4B58466278340000";
49, 49, 56, 48, 49, 53, 51, 50, 52, 55, 57, 56, 1, 1, 108, 81, -119, 91, -24, -112, 44, 123, 0, 78, 20, 120, // public static String LZX_pic = "/9j/4AAQSkZJRgABAQEAYABgAAD//gOZSEIwMUMAAAAAAAAAQAAAAAAAAADwAgAAAAAAAPACAAAAAAAAAwEZbrW32jVAruubntJ5+Lvvvd47mzlXDDwQEw67p8QXV3TdynemLNFAd+Qa4u743rKlgx1lPbtaVGjrSdvVeJCLs1Ht8IAi5f1dsFn23lJnPm4rICe8y4ICVwazbhkWOZHzF+Y1RCmyyXz2EFOLv4LpjaY94y2vXp6O7RLzPkQ7byFjJg+I87YBLPV7XR/U1fqFsmPCBMP+IQg6MeORb2W+yxXdvZNWOQkkyVWriXJkKV2QJlJZFyqFH4PewYS5s6JpDuFVXGMDQEFJphmQDcajdCeuGuvNbWupA88Fe3/bqHeoADvps2slpOL5OAlrvHKCjx4hKuRZcbsYAP7z36cZqNX1fcK93k1gS3Bzfi1YSfXrQWpVLsNdVAW4oSRjBXoDiL5EMHbwX6lMs/EsON6i5w19ts8It4HWj521abhrdaziSln3YT2QxD0hygrSzR3QvmCb1f+gzDUhEW3NJEYrrA1AZwowqA7+y7BDc4YI6Q7i0kT/zdJg9DJ2sWO3UNZFtRdM5DJ2Qv+g1ZBUJsvI+2SIX7QSzbyqrsdAQb8Tbhb2K7C19vw7qCRQ6RYKbwX+S+seSxJHuI4aPj1ViMqivwn0Rb2LV6ziprJwtpCcfDqcdPtq4N/s0dEjN9oN/fDKK8/07TqYSM8JIdfdhxUh/9OZ/+bgb8oqvkJ0PviAqyERA//NhIt8fi55YLMfHbP+7QdIyQ2nIWf6tqcC9pbSXtzw7nL5MiDBU0nCyKcwhI/zfQpLNlq1a3F8sWcPoPm7aVsB9+Kv2shCc8M7O8JTtIWSznYl51qVnQxENAfklpAQcMkCmcXHSO7w049yZdGadg2lh2NY2j4w0DpoCiWebaeAFIH/vBU2Q7B9lIJGqBB+3osdHZTbX9zpICnjTc8xDiifx3hLLkzRTkST20XFoYKNOPb/xaruLSZi+1pUVQH26+OlrqgtG07Ex/SUKuxqyekiSU9rUnJsWk2epb+mM8jXMvrq57KutC+koJuQPVpatX2WQkDXE5eBOdX9QHCaSROdJ2CuE3s5s+R14QIwC0DzBfNjXHhNKRX0RnNAho2ZPKMsLVr1PHnA40hzMO2qhSMTvZVLX2974PSkZbDQaOh1nJZmP+9AQLQP8mKryAZ0hlKaN4AXZHqEdU2/4ofqt5IJ40Ps0o2tWD7yABSUcf/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8RERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIAU4A+QMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AOiWOOMhNpwvYDt2p8ryGEKmccDY2eueT/n0prhhwJArhR8pHBAPrT1jJLRKXJjOST2/xrJNX1KnJrRDgJASYmyjkh2bgcHj9c05t4kZSuQXAHzcYyeaRGTeCZSQfmwEPY9OKkG7zG2hQmSpAXGQO3505TsEVdEbRnaFKZDEkEflmpZOFLqVKxk5LdTgdqjG1WRYyd7fMqnp7/QZqQpiU4KZZdzYfj061XNoCjYIzmISghTIuTleQCOxz1psJJlMYUqoGRnr0xzStGECgnCFzkgYzUiSJv8ALJIOAAcHkVOr1sK1txSDGww8cabQoUdx1P8AIH8Kny4CbkUOSVdScBce/eojKomb5Y3Cjj86X5JyVbCEnuOmeM1d2kHMk9GTFmnMZwoKjcB7D+vNdlp0fh+ewgUuu4Iqkq+Tux1Oa4wIxdScbScKWXOCahTSpYUmCsDvOVC87ue4ohsTJa3O7fw1aTQytZXCgqCMK20EkGsceHtQViklq0uDtypyy4Gcj8qzrYXllahzeTCRG+WLOQoPerVv4k1WyuEVblpFK/OyqNue+TWnMluDjKWqLUWnXsBXMEq4PXgFhjvk8U+GCUBiGJ5556D0oh8byQ3IW5t0mjf5gWGeg6fStG08Z+H5GUTafHFIwyWVcEf596Nw55WsyG3t5EUCcMADnaOvPPFaMCZVNwYjoFb6g/nU9pq/hy7k/eTSxgeoBx75HatuztNKu5lngvEcbdoV1wCM89+a1hUSepzzUlstDMtApQSHIizuIzgg1u6cZNiHZncQGZuMA44xU2sjTtI003RhQbcCNM8Mc+nfGc/hWhpwAhy0QjwAOuQeOorSVZOOhCg29SxbHdGrAkg9OMVPSLjHFLXI3c3jHlVgooopFBRRRQAUUUUAFFFFABRRRQB8tbZGY7SWBPAA5AxmnM0oi3nY3QY6Z9v601twePcMsRn5emcc0oQbMlTgjozHgZ9KwVkzZeYIThXwI8HO8E8j1xU20kAnJbadvHUHP61E3znBYjaeSDjI9PyzUkUjfvUC4XgFt/4/lVJxFdis6sScFJSv3Scf5FCbQ/OV7YHAz609ShY5ZV2DA+vqPr0pVL7ciMjJxyMYNU79CrMjYMTuQg4PUnv/APqqYeW3JIC/1xUagE72x8hwx349801imHIAUkkp/tEgc0XsS1fUmgiKqXdQFABfbyQO1PJAZ9quBwSBwKq+Y8jmFHKLkFgBjPFVprlNj7zISx2mP7gI+nejmFyIuvejzVWP5Ruy5zgZ7c9+KS41IWYimkdXYjOwHsQR296w74MIQyskO4gBFbsP8msq9mZVebeJpGBG7dzz2ppMb0OuudXWJGZWwMr93GW9jWfdX8c8S7fllQll5GMmuUe5zDEgQsqrsVeuDnnNPiS4knHlbx1C7v73bjvxWvKiU3Y6Jbu5QAGVtwAyQSDj+lLHdZnEzsN4Y8AdFx7+9ZFlY3gznjPzMpY/j+tXrfTnMwkBf5lPJGSoHp6VrGxF2bVhqCyjD7lCgE44LDvj3robDUkEhMOyI4+UEYYr+Pr61zEFlcFMBlxs3HLcMMdPzrRsbTY5LsAxJGCMnJJ7/wCelHulanXwyy6tHFdNM5SJwNjyA4APIGK9it5IngR0ZdmBgA9K8EtIpISXjYggdCBgdu/1rrtB8Q3lo6EuskDKMjgNnGT17UOHNomQ3boepjmlrA0bX4LtZGkKxY5ALDpW1DNFKoaN1YHuKxlTlEIzjIlopKWpKugooooC4UUUUBcKKKKAuFFFFAXPl9W2k5wRt2kZ6ZpojUOI0KFthwD2ApVY7sSYYuuPYD3pxwj/AChshsBs9sVjKS6G240KPLIEa5zg5PGPShi3ksbcASLwFByvXP8AKpYzlSAxDrlgPoB/Q0xSqSbIyWIPAFOMbkvQc65B2jJIHbgZ7mlK5ZvLZ/uknB5/KnqisUKLw3ysWP50wlArOA0mckYOSFPb+tVyAnoJNErDG1QVOcEdabvIbaUZnI2l842+9K7MN5dQ4jPAAwCOm78s1Dc3ENvDvnbaDyXAxkf41OqJ5lcivJUgVSrKWA5LdVOev0rn59Ukd/kVsGQ5JP3sZ5/OszWtVSaaQ+biINny9+GPWs2K68y62wIgLNjKjn8/XmnzItdzUvby4luImim3MuJAOw45P1qSKwmu8yXDH5ud3uTT9NsjEytKymQMV3Fv8+lbcLIZPN3IxJIwKmVRRNadNS1Yyx02GGQ8ZfGOegPTP5VoQ2Kx/KFTfu4IUYxjuaWOPMcflhhj7yhc++atRjcEzhi3zAjt261DqORtyxQ6OCEuG5IA7jgn0q1FHGJgPmKgZC46CoB8uU2ZIB2ZPfvVlWYykh4yp/P8+1UpsUoRsWY40cLtXaDnkYHv+dXIFKqPlX5/m6YqvCwEbFAN3VMjg+1WnkO1MAyvxuAxn8KvmYowVi4iIfLaNFaIEMSe5Jx/kVesrc7VI2AqnOBn5OQfpxWfbALjOQHOSpPA/wAKvwHaEmjLgISQCOc5xxW1NsznCLJ7C3zGyYwcDzMdeo5rf0u6ltSNjoPLXK45AB7n1/8ArVhxBY4yspYEZXJXrz61cDAzhclosALg42nArqjN7PY5ZUY9Dt7DVYZikTgrIR6ccVpI6sAQeDzXCWkmz/V5R1745PFa1nqUsO3cyuZeBknhgOnoBSlQUtYmDk4HT0CqOn36XIxkBx94elXhyK5ZRcXZmkZqWwtFFFIoKKKKACiiigD5gkZVQBwx2nAVfr3oYOAysQxPIAYnHNLFjLF2PyjI44zTuY5mRjuUEKG7/wD6qxcUbWYDawK7ipPHXFKAwdBhdiAZ568nqe/GaQ4iO/cHAz8uOuaeirhQCAoXvzzQmF2CSnfG4JY78J2GSP8AChf3UWG/gQtj2AzSSI2Qzbc8hcnqMDPFOUqVztCEHgCm32Js9iKY4LDbtAIwQOo9M1wvirVElvJIUcKIxhQOmc8810/izVFsNJkdSvmHnaRwvuR9RXl15OzsvmDeysOScBvXFSrtmqjG2o9pZZHdnQsm4hcN96tnRbWNYw0wLbgSA7cJ6fWs/SoVmuRIITs39Pz/AFxiuns18wLExHBwzMfzFXOaRcYX1LEMLdcqCSTkd6vxMSiiMfOV5ZR0x0/XNVISgfqCAduAOU7A/h1q1AoSNETY3GCSduz2rnckzbksX4Qm07g77sEg89qliUJEiLIoCk4xySpOTn8TVeAlHwOjDouOamVMF12MAcAYwP5Ut2aaFgF49oUHBOQBz+P8qtW6bJP3aBVP3ST1HNUhHkhSSNpzycjoKuYPntvCryM4HXvWnMkiGi3CzKrIDnCjov3e/X14q1Gdybg+4g4AXr+NUMb2OHKqzZwD1NWEkxnbF2+978/4VSfUaXyLkLsjK5jAcHJ2nt6Zq9C8rk7pWZX6LncRyOp7VmxS71TCgFkxjPr/APXqxFIFkAUKVVdzjJGGNaJ2RlOKvuacEm5hsQSYG0qR0PY471oR4MaKpOUOTz1PXP6VjRNgqHILA5D/AN3/ADirqzeYxDLzjpnqOn9a1U7nO49bmsjAKWkdiemQ+DT45JjMzBjkrgY4G36d6p28it5cjSlYwPujqc8YFTCSVGHKjOQmTyBXdTqaHHWi2jSsZjHu3OqZO4YPUgV1mk3q3MO3PzpjPvxXntvdFHYuUAPTJC/jya0rC9hgufMjk2hsEhcjJ/rV1YxqrzMoXgro76lqnp90LmMsRgg4IPB/Kp3faeeB65rznFp2Z1c+hLRUXmLkDIyeQKVX980rC9oiSkzSZzR+FIpNnzCCQWKq/BwcHoPWnO2QGYmQD+I+vaoQrKyu+CM705z04/xqdnAkCoVdAcLzjFYXOhyuKrDzIjnOX+bJ46VLISzNgMu3oO1VmaQv90Adu9SQTScuxXGDxj5vy+lNNE31JWXGMj5mHP0ps8myMtCflA3YbGeKQtC+CJMYG4qflwO1ZmqTeVG0ZdVLDJ54/wA5p36Eu97nLeObxbi7hJUjzI2wo5GBwf0xXFGQvtj2AgHgEdCe9XPE1+82ou2AWU7SV78dBVXSIWkuk3HClecjp6U4rlL0aOm0OBltYgW3AcY/CtqMMfmJO4ED3IqlYJ5UAV1KkL8uO5zV+FyMDaccbjjke/tXPUWp002rFgIjSpKW2EZX5MZJ7cd+tWrbBTLkqVPIPXFUIbkMGwYyFGBgYGfX61Zgukkym4FwPvA9frQkapruaMCgtvygHv2qwowfnUsvXg9OOKq27hxIAy7VTkdcdM498YqVLgceaxIzyAcE8UWLTVtCdAQiyh2VgpDMzghasRyKWYHaUK8HuT61DE4LAp5igD7zDjHsfWniX96CyqVU8DuxNU0rC16EquykRFeo3Djr2qZJAilQhDcgnHygfhUPnMhZYiADww649vamrKNo2dRwQG7daqK00MpTXU14ygcDDZJ4OTz+dWUZMIVYkEncobBA9qw1vDGc5KKBuZiemelO/tKJOW+Zl6gjPvnHetVFvQXPFI3VZ1kYoBt7D+tWoZCz42MBySVHpyTXMrqqE7ky5Ybsjp9KtpqEcqqr7VI5Geuce3P51fs5LY5pSizpxMkkXmKz7M5Tb1Pp/wDrqSOYGVJZNowCv/AsVhWd7HNGi5246lsjB9K0WMylWkUFVBy3Ue3HempOJnKmmr3JJZ2CjmM5HIOc9O1XdOuCy7gcgAZ7celZVztdmIALZzjr7cDtUml3LeYYZIwwVhj+9muhVWYSgjrtE1h7SRI5D+6OSRjoCBjJrrhKjxhzwpOPmx1rz395Jcxsmxzg4QYzj0J7V1Ok6kZ4vs+SzKmNoHQ4PTFS/e1M5KxqyEEB9gdh8u5Tkj6VIrbQFIO7HpVRJysZYYK5xxnPX3qYTb3/AIlHTJ7UuWxle70J1diAVYde1OyfWoZGVM/N0HOD1qP8H/OpsU+ZHzWAV2jA4+YBTw3rn+dKECvvV2UHkejD3prM4RfL4I+8AfmwfSnOpjhR8loz8m7POa4nudt2OVS04bLAAcNgAge3+FErKsh4yAe54NICwJHLEgAHr+VEiMznHPAxg4z7YqrPoMiupFAXYFLAdj82Pp3rm/El6be1LTKr7vlzjgZ4Gf8ACt2VWluGMbIFUHBxjsc8157451DzJvKLh+cFV574zQlZjjqcrI8k120jfNufcBj7ueM4rqdAtAIw8oIJbAB/nWBp1s0tz5eHU5wAowOK7K0CW9sFkAUfeXB65HSqq1Vy2RtGmupbEsdsTLwQg5Xu3sKxrjVZJpFSMGNZG4jLFQD71FM0l9OqscR9Sq9vTvVyOxZoxMArOCBuJGB2+vSopxbV5Glnsis19OJsZ+TaS208ZJ9atW9xKXbe5OzIIzyB71bXSVQMTMpUZIDNhRn9ae2mMkh+dZCVyCP4qtWtsLlfVj7K7OwMFBwcFsEhfT+lbNrcbpl2c4ww+Uc8jHWsOO2+XOCB0bHYdOauwxMhSKOV9idOaHaxcUdFFdbzh490ucseg/zmrJOZlbdkkfMMdD9ayLaUjYEXLZ3ZHoOOv41cidtwwzhccLuzk1m49ilJ7FtpCrY2thh8z+gHFV5pMIF3ZVTnIHNLM6lwCuFPBB7HNU5zgsGkIGeSR2//AF1VncmWgkkmFLxgqD3zUEEpZnOd3A6kHcfT+VSRAlSFVFB6kDipVt1CsrAMTjOOw4wa3joc8ot7FaFrg+WhHzkjzFxwuc8ir0FrKoIRd3OMsOoAq1brbxMquMgZABOMHufzq4siSNkKqhW27tuO2a29rboYuC6lVYpI0VslycN1wAfU1uadqBG6F4mkmALKSc7u+P0zVNo3Ulw2Mgdgc8enrQIn3ZIGzHyfNyD70nO+oKNtLm/HKJU4k/eYx06Z6fqDUKOlvcpKAW+bPJ657VmWbtBLgkDcSMAVoZWZWKLscHnceuOKI2YSR1fhuYy3qwooDPgc8kZ4AP5mui0dxZ+JGtkjCxSqQCOnGT0/CuD8M3kltfbQjvnn5Tz9K9AnV5UsLmYI8pO1I05AVuCfqKuyOeV73NOYhZ2ZzvGSDxxjHp3pyu5KIuz5l+UDtVbU/LhmDSgsx+79PWoI5wJHOxyQpTIGTz1x+dNRutCGjRWSToWLNnGT9360m2X/AJ7iq/mbxlXVRn5ize3HPbvSeev/AD1T/vqkosHbufO6EeaHLkSY3Meucf49KWXG3hW2Ifu/3c+1OJHB3ZzwSowR83b9aYQYxviIUjht3OT61wSpu523YisxnXaQQBnAGcj+lEzHygVAVgWwQ3X059etOWQxsdxLEnBAJ+YkioGKYBPLNz+P+GKfIyEyjd3As7OWZUKQLDkkN07nnsTxzXl+rkSTSy3MX7sjFsScFeOAfUV3+t+ZeO1jan94T0B7Hr+Q5ri/EVugCOIlkgtyYgx/jfuf0q4+ZrDew3QYjDtlkPmExHcEXG0nn/61aMlxd30giiRYcE/K7fNgcVV8Lzyy2F00ce1lwQSegx/9f9KvaFbmSaaUs+EwhJONvIOc9/SiUYpam7jyuxJZ6fJIwZpWU8Esep9quLp2JQguZFyPmWlkuPLycqFKnAIyAfWoBekb1DhWA++7ZznqBUxn2K5bFv7AInMSTTSggEhv8O9D2E3lYF84wOFbt+IqrHe223aLw5xt6Z+lOW+lUH5xKMjJU5GO3WiUm9xrlJ2S8h2ZnR1cEEHLNjAHf60qXcyNiaHarcIVAwakhlaZYyh35VcnPQ1KyqGCSMwyOmeD7fnQpdxLR6FrT7qJlAU5w3I9K1+BFFJkDHzMDwQDwP5V53qUk8GoSrDIw243ANwMgdfxrW02xur3TzcG8l3thiC3VsnHXrVqFwjNo65TGVMpDE55AGc//XrOvdQtYZvJRmln6lVU/wCRXL3s2p27bLm4kBABGfmYt7H2OD+NaekP5emI4BR5fnJYc5z1/Kk4JbsHUfYv+dqDGNof3QLjdxyR6CphFdhsreeUxzv2jJxjj6UxHO7dyFwWBHtTJZXWTbG8q5yd2ePyq1K2xldtllYZCmHv7ncxwfmPJ/OrMcc25lN9cLtGAfMJB96wxexwggknoSQM5JqxFq00lyIQW2L1O3HH+eKPeZElE3YY7uNleO6yQuVIOav+ZqqRB2Mc+FyWHBHNY0V+kyK20JzgqevsK07ecso+YqwOFpptL3kTZLYn/tBkfzZrZ1ccF+oU45rcsY5fsEd5HHK1tL91mTapPT71UIJBM6LIQzDAIPTOccjvxT9Y169sYl0qMmTT4GLlP7vfj8zW1NKUbonkbVzTsnlgnaVnZSpyF6HGOorsLPVw1taCSPalucEevPGTXMWkUNzpFtepcLLLMOYUP3BngkU77esEeG++M5JA25rOMrvUznHmW56dqb7zE8qoUkQrxz1H8qz4pIm4QfMp+8T19hWbourSahpiRyMRJGMpjAU9qnG7I+VJXyfuN0x2/OtIzS0MHFmg0yJHG+3J3chjz9ak82P/AJ6J+VZ0W1x5rbFzyMt0PcfnS75P+mf/AH1W6cV1Fytnh7/LGFcjcqnoeAKSdvlOwB+MkZwMf/qppZQFGOWHfkY9Kkc70YsysoA4CYzXk6napEQEZR40yoOCoI6jHT26ZqC8n6SFwTJheB1/CrRaPg8kjOc+mOn6Gq10pIgSRumNvfnH+Gau+hMYrcyQFF3d3xUgiMBOMYzwSP0rhboW9xYTrfSEA3bhSASw6c13d88kekvIMj5jtGMEkDJ/DANefrtfT7JMn95cNJtJ4PY8d/SiLszWKTZe0ZrexsbhFBZ08xtxGCy8Y/WrVhIyaXHvIEkxaTOenOKjlwL9rZvLCXMXkqAo2iT+EZ/Cpo4HaCNCgJRAu3H3jjn9ac5KaOjk1vchll2xSlgR83Qd/wD69Gn2BvH89wxVQSVPU/54NW7HT0MrSSLkn+DOMAYGPfmtixsUUqVmMRPXHAHsfasfgMq/MvhZyiaRM8pYmCLgktsPzfh2+tTaTp9w7yIs5YeVvzsyE2ntzXXRafA6NIxZvmIJPQ/SmyWFvDG7RBlRkxgnqf8ACq9szgTqX1MCz3RXEZeQEMMbWb7xyOcVpor+UDLvBAJyPTvQtvGblZGRDJjG4j09KpeJNQS0tGgjdEuJRtAx1B4IJ7U2uZ6HfGT6mfZ+ddapM5GInboT12/dArrLSKNYkwCSM5UcYFYHh+18uIKQBhR0j5znpnNdPAhSM7QuSSSM5xwOKc520N4pLQztUj8xPMhZUljA6oD25/nUOlFF01Yy24ocAk/c/wD1jNX74HzNuCCDhuOCCKyrRjZXiLKrBGGFVenXvzSi1JaiqQtqbDEi1c+UXZVwAqj7xPr2qjaxXNzIWkTYN4OT0xjvW9LEreUImLluSM4/KmCFWZ1nKhiMnHTAPp3oU7HNJtnM6hZyRXUjEAQg5yrAbh7fiRUNiXe8QxqpXcGI3clf8K6qe3hctvVSexz2/wAKhtoUYq/y5QkDdwv4HvW8apiozZDdsWdDDHliflwOnHNT6c8jv5b7lB+6x6GrUcYG0FkHHQdSDVmMRPIiuQzIwAYjgAcc0pVuljdU5Fi3lKxLhCdq5bAwCBWHNcT6lLO7TCMLhQwJPOeMetaupTJaaZLOcu7ptjHY5HA/nVXw/brDpe9wGm6oCv3fStKc1GNwkm9Dd0LV3tVS2DF4JNqsc+1TXs+7egbMIHIHT8asadYWWr6TcxxQpFfxtvjkH8S+lYsc4MhhfCyg7WVjxnIHP4mny83vGThbRHf/AA5hA0u4uluFMMfyhQe/3jx9MVsx3AVy2BFuZsj1rlfB+o/Zkb9yglYfNubCgj/62KuRXEjmZm4aV/mAP8R6kVnzPmMXFrQ6IToV8vaFDjAzjsM1D9tT/np/KstZQcq0jegZqN0X/PRKpscadjzcFyhCqMDqWXofrUluVyNsYY9ORnn/ADiotqhVZW5A6jr+FOBIiZTkqWBOBWN3Y1uMUAKoAIx14zx/X/69QTp++jaNzszzu6GrZZdqhlAAPUDnFRXBOYmVym0kpkA5HTPtUjjIwdcx/Z1xFks5DlCvXpz/ADrz2CeOG00lHZdoLDI7nIIH616Zeq8jsgYriJhhTkMxrzLSYPP1C3tSpHlXLPjpwoJB/TFN2aKgbD2T3doskkjwzo3nK/BG8fdwO35VILnVIrYfarSK4OcF4n+b647c961RAu5GIC5GWx/DntSxwqjEICST/Djn1rPmtojtUHYzbO/aKcTSWs4TaVdEQk+/b6Vdh16yB8uS3vEY9zFkZq8lsxJUO3X5MHtmrSW22bp8xB5I6H61SkraoJYfmVyiviPTBtR7a8PXC7ev6Un9uwlcR6dOU77ZMn2HSrzROvRCznqxOeOmKYtssSlt+zZ0A/KpVSHYlYcyb291CRU8q1WEsCvJ4A6is61sG+0faZj50hbLhxkDtn61vTRqEZ2YnJwu44GQKrwYDEk7QABR7Zx2RfsUaWmW2zGwHB4weM1tRWy4KBV3emeo/wAKxoLlC2wYI71qGWEphWDngD34qJvmdzWEVYjurZpVyDhVbOAB1xWFc2izsBJLhkPDHsT9K3BdffDjIIwOBwf8Kq3MYykzLuC8/wBP60o7kziUYLjWdNVWTN1EuQOASBn881MNc3S5uLGZQeFYA8DqeKtReWU3Es3zZ2jnirkaBQGZgq7d3JwAPpWjlFbmLpN7GS+uaftEbi4XnP3OTz25qUa3pf8AE8nB/dgr3rVWFS+f4Cc7QMZHanLaKI0Hlpl+egJJHpQqi6IapNGXHrdirhnSR89grce9T/21CZCttZ3Lr/1zJ/WtFI1VR5YXcwyQBtGPc96Vlbyx8vznkgj1561fPHqiPZz7mRdxalqdzG81sLWAMOpzkDnP6VtLlYiirtKnhwPvH/8AVTsKWVpMsVPNLsJVXZCuSx2gc/X3p+0urJB7Ow+x1ibS1EsWSUfrvx/wHHer/iiewvIIdatJVT7VgTxd1fsf6VL4atLO6nkWdQQ3T5ecYIwP61zPiixfSLq5tkwbeSQYAP3efT2/rW9OtyqzMaj5TV0C6UZjjlKlRvc56Hv+gFdLZTt5Oxn8w5yPl9K4rQ3BDElQrEg46r7V0Wmsy3MiQhGUdM/lUTtuYJ3NtX4JdtxJ/i4qbK/3P1qAIAAzscqMELgk8d6i/d/3W/74FSp3E0cfGA0bYGBjgnjH+NN/eRRtIhPGCcDgdv5UkTZYsrn5woyRjgd6eU2hQRhs4O4nGMg5rO/QuyY5mRlXYvzA4B+tQzfPhd5zkk8dB1/nSzK0rLhmIZuQRk9Mgg/lSRgEOGLSHGTtOcD1z6UcvKS3rYqCN3YTIg2IOc8EkGuLh0xLXxO0xTy/3LHOeDkdfrXeNGJWLbAkZHzHHH3eDjvXPasgW9I4com0MPQ81LbNIy1IolKho8gkjpjt65qRPlXZuKtjJI/i7de1JbhWVApKcdB0OPWp2wZCc4BGQSO/pWOiZ6sE2gQkDGCQOD69PWpkkA2guwUrwvB59/akt0IPdj6dhxUsaMG4A+7nG2rbRpysRWkESeWFUMTkbei+oqOVudqhux5XA6d6sltrGRV4wQcL7Hiq8soRG3sFAHTbgr061FxNdzMvCqSxKzZEhIK45HfOararqFppdhJNJuyFyOMgnI4+tLeyEXAlOPLyQdoyc9QTWbq1h/ayCSYgIFJAxtDN0B/Wk0mRZpaDNC8QpeXbwrH5LABzj5sgkD5vzrfiu0TMgKgqCc56DrXO6FoI0+3OdkkjkPvAwfwrUkgLxbVwGYE9eetaS0+EUL21Rk6p4pvftRaOFUt9o+91brXW6BqsWo26EFTIM5XHI+lc/e6PBfQKhbY68D5iO3+fzqzpWnx6eE2uDt444z7mmnHl03Js+xuo0cFwUyAr5Kgno2Bxir8WWZW+cMpzgHH5+1YUNwZLoJuZyP4s8Cti3Zdqk8OOpx2zWd39otLyLsJY5HAJ5G3n9aVsq/O3n7y/14pqNiLyiwZd2ST3OTinZEi7iS21cqCOQRVKxRNE4DAFSEBwCTnin4R2cIctkEEHgD6etRoi/ISmJOxz1GORij5GQhPkAOM9KfMiCRfuozKpAJPC9aVJIwEywG48HHSozNt8tEG2MbiykcH7o496jeRCdkgKqGJBIyAcGko6XRnN2ZtaLdQx3ihyc5xkH3x6e9RePkSUI6spLMCzZHABA/rWfazKsxxIQuQc/wAX4VY8UymawRt53xsOW7Zx0/KrhLozCcboZoWlGKyM4IKu/DdK0LNwt4sRVQc7SQ/IzisPwtfSrM1rFyhzuVzxkDrV/wAwLdwvn/WsFJIGck9j26VrdnLsdHFLhVKjBA7e/epfJf8A56Gqtq7OgZkHzfLtJ29qXYf+eT1cb2IaOaRV2AH5SM5yBmmASNG2eChAyTwR0GPfrTIVMA/eEAhsFsg5HpTnG1shsqSOhrLqO46VcIvzKq52r/e9qV0jIIiVlVQMjPX0od18vb90liAf1pZZCGkOThuB9OtNvULjGJyAi4c5BycVi+JgPMhKxnaVKbuBz1+p5xWzuBZFxJsYcMEz36VleJlb7ArbgVjnHA64b5efxxUTuzSk1zIyY5SI1wxdcYOen5VLE4JIUFcgkE1UifYhCjn+EAdqnEmxQBhWHqP1rFs9KLsXYUfBU98lT+NTo23YJBlsjJJwO/FU7ZvlLcde1SIygHftCk4O7tSTN03Ync7VDMcgcnAwBUE7rJMWGBlcE9SBio7p1z5bEAZXGD1qGWTZ8qIQuMNk/jTbRLZUvokfYhU43EblHOCKowWMifu/NcxqMKDzj/CtZCjeW54BySSMEZpVX7sK4OD/ABHn/wDVQjN9iOCBYoDuGCvOepNTlNwwFcbR1I6g88U52bALKMdDz2HpQRLuEg3gEZznpxQ7lrbcWW0eSMRo7LnkAHp74qtFpiByTK6huhxnP4VoIxlRVViGAHKjlqk2fKx6MD0z2P8A+qldCsQWdjEm/GJG/wBsbm/D0q0wAbesG8Y52OM49MVHxjcVVS/I5qVNucfMPlI3Ajr/AIUXaCxYhckoNv3eityamDbU+VsFuc7feqJZd5CO6c4Y59M8VbVy8SlpFAwNvFHMCV2TEKxLEYJ7setPPnMgKtgqOOPzqtHOFBBVm+b1pJJWyWZSqqchfUelFylypWZMGVlZRFtOPlB6HkUx22AltxUn7u48/hUbMJVO5sjOef5UnmqoIzg49OMdKpzZnJJkhZzLGEY/eHapdfkzaMJEdpC3UDsAeKhtGVboB2KgE4w2fp+tReIZ5I4bcbyGdsMzDoKuLurnNON9itobPHqOwNIxUdc8jJA/rXRXEKyWxl3ZGR19c4zWRoUBlu3kztHlkAgnAI9vxz+FbK4msVljVVkPykY5A9ataO5Fe2iNZFULHhtxGFxg4A7n3qz5cX/PVvzNZ9tIvlxoH6ADDH+lXtyev6V0XucktzllIkDOx+c5IwvQeufWo2J2KwWQZXueD360LH5Jj3Fl6sAp/h7UF3ZSGXG0Z2FyN30rC3KOS1JSSY1fYw39DnNRuxWTEj9OAVHWgfMo8oIxB5ycY/xqYMyY3Dkn5c+tLmvqFr6MaFITyivBGc1R1yHdos+S5KAMd3BJyPzFW2kAZVQ/O/JIPHvVa78qW1dJJt6vuVlVh6Z/wp3uhpJM5NeIwyqAzKCARjP+FTq4JDccAAqO3vVWPcIkJ3sxJB3djVmIBl2iMDGM5HBrBo9GGsSxET8wZsuTx6Y96fIQiMzsQ+PlBHDe1RbEbdhlIUEuAf5Ul+G3xjcRkdzUPTY0UnsEkrMo2lTn72e1Qj94/wA0xVeh47+tQO4hUuQxHTP93nris+81PyjtjXzFJ+8ex+lFrvQjmNOe9iDOECSFcLgd8euagln3AcMpOSRxkfTFYq3EjFjFiVt2SwPerMdtdySDzZVRTyCpyT7VqoonVstG6dVz5jKRyT1yP6U5bh2cZl3biPvNQumQyHcZXckY44qNtORHGXYDoCSc4+h61TaOmKdi3HeSR8xsxIbGN/ANaEGqBRsmQEYyWzjBrH/suGOQiOdlZgGy3PA9+3NNmhniGYyHZM/LStFsVmjpUvImiwrbtw5/PrT9ygFkck7uMN1zwa5PzJ0AeWNhnndngVPHrCElC5BQA7fXjFKVNX0M5TZ00brsVfLUIABwKkR125wcDp7VjQXTTW4CIS3Azj5RWpEzeZ85OMdDxWbVgUy3n5MlwrHsAQR70isgjOXZTyevU880wIduWYEM2Cc5xxmldt2G4xtxgdTzU3KaHPLuZPn+UHkjv603fK67vMUpuwM9lGai6F8425z8vJNJ5zHdjoeMHuPSjmsTJl6xJMiPFtUsmEIGW5/+sKqeKpD9rtofm4iz7exI7HrVvRo2a4jGeSwAwABxzWZr6SXWpzzNKAolAHsO9axkmZK/Mb/hiFn0eadHAQhiB3+pq2HH2UQ+ZguQBtJBPfn0HvVXw5NFFpZgRyJN2TtY5I68enSrbBVYIVb13Y5/CmnuYV/iNC3i+ZgxYcAheP8AParfnn/Z/SsmIFW4CruOW4+9jpVz7Zdf3V/Kto81jBtHOFycsykjOVHp25p+GIy+x029jxwe9QxsqxhBIJMDJ+XHFJESSx7d8+npS5SbosRSDJAA68/LyKjlkaQjO7Yr8ihnDE8OPl7DoKJ1kRHLYRMEkdyO1Fg3IvMCO4dVUE4Jx071CrhnZo0XkH2yf8mhZUkYGRQhPA56n1NVpbqOOTfdbxt/iAyz88ClYJKzMCUeXO8IHKPtJA4/CrCswAUgsByKjuZ1NzIyq8Yd+UPYY7CkhmPT92VXoAvJrCzud1Npou2eMl2VFxwq55PFLdCL7OjAHfux8ozjP/6qgQq0mcMuV3ZxxVqCdGRlkIAORuQZ/rUts3srFC8i3RZUMqt82Bzk/wD6qzW0OFZBJnezjPDZGPQ1s7kRijtnPRun4UgKHCbsseoPQVnFa3FYymtWVl2rwowAO1PhgbcXVtrKMVbI5JCsTnqD+lP8sYJC45G0E9+tbptjTcdiKNzGuM/MeN39KST5pADuJC8HrinrH5jNvGONwIXGDmn7JGYZ4wce5602+5SqPsRJCQybj97OCRj3qWO3TKuD5gJycdBxUi7zDuwd3Awe/IqeJQwA44GduKiTQ+dvoNt7B5gxJBKr8ob7vsPp1oi0ixEwYQR7wuWLLnn2ParIK7FCogZn4IPtzUqEIoCsJMZ69hUOT6ESv1Kwt/4+QAfu5/lVu1TzWwFDewOP1qPzAybCoYbsjPXv0pbdtrAt0ZcLjt15pK/UlJLUnlEYUYyCnI4xg9KjkkwgeUbs8EZ7dKYszrbEK7HYATjqT0qFmATb8u3ODjpmqVjRtExJiUFUKgMGRh1ANRoz71OUxnHB61E0qgpgkDk/KeDjtUEkn3cqCoPQU7IzlNHQ6CyG5MsiARhGfPpjj+tUVVpHZfmUSHOQe3PGe1M0yRVtJ5gQPlKNycnv+VLaENlrf5mzlQT/ABdsfrQlZ2FGVlc3bHT/ALHYhncOTtOR/CAM1cncTRLlggzuBpJnQxqHAD7QBkDPSpSoaIbWK+7r0PrXVGK2Zw1W5O4+2f5uMYxyWNWMt/eg/wC+azoF5KozBi3JA4J96u+XP/eWrjPl0MrM5lpMhuNoJwQe3tSBmG/BTapK9OcYHIqRRIoJkQAAZO3vSI0qoCqEN6kc4PT9KztcoUbWX94FJBG0479qbMSCQx8xiTyB0H+NDpEpLNH8pPyjHLKfbvUbyxquz51VTt2sc45xnFLW+g3JJEPlswzI+wZ+UJ/I5qJIBFJI2UeUtkc/dyMVdSGLLMMRqpw3y7QR71HJGis0jpgc8n+dNppE3TMLX7VYgJBJv6LJxx9azonGFAXDAgE8c1u615cWjzzTOBEVG5sgY6Y571zYC+axZmJYA89KycnI6aGisXo3baoYc+g6mpN5DKV2nJweccVRjdSqn+ILg+gHapQyhQoBXBySeOayTtodKLbEyyDHyqep28U9RtZiCM4wMHNRQEuNxbGOMbs5FOdsDg4CjvxVOKQRkSoTJICWGAOQeOKeIo2mPJ2cEbu1IJI3QfMScZHy8ZqwoCRh9m8twR04qb6mt+cQxl24bOPUetPMZ3pCdpK5GenvUwVZGUIx7bjxjjmhth8yUkHBJUjrnBFVYfLbqRqi/KNuTkEgjinMoCllbcu44U1IrhDtC5KgAk8ilk2lBhgOcZYbc89KiaZSIT8q5+UkAY78+lRn5nVguG/i2jAxUkkYjkYg55+YAijjdvdDhDyQeoqV5kSXcZ8jkqMH/eHBFRSysCwUr0C5Hp1xUsrbWOY2AI4z/jVSWRkRgTgHqM9RVprYiW2g5pSyPud0U9CvXNOjHEbOSQvOD/eqsHBXG7Ck5BHJPHUUvnBpFOBs4zuyPp+tJ6MiMmTSSxfaMBeDkhiOM45/WqxAzu3nd1IPpTJGIjAdiCDu+WhC0kmA4DOPl45zQ3qDaaNoWbXOjgCYwENkbBnIz+lbGg6TaWCli8jyuQd54/SjTYoRZLby4UbDlsc5x0q+jRC2y7OAoxuPOB2raNkjmlOTJJFQSx7gZOOmeh9afIWMDbcSIQQRnnp6envUSyF41aTMoA+9nJ/Cl3ZYurBugHbPHSrTdiGkuo0NseNioVSOVGDVrzrf+8v5iqkjIUbIAAPA9PWl3J7U7XJM1/MjJaJmI6AkdCaa7oOJEDMgAA29+lI+0xcRkKuVP50jwqRjBC467uB+FVLUV0LIW+Y+Wp2jA56c0/epWTaCrFeNx70iqfLYq6nHHAqGJiWZVRSF43YwRmpV0S4krp5gIdSTwB9OtRmBWiZFZmD/ADDn7tPlWVF8skbApxg5OO9Vnnjt4HuZQCiLyT0xzgUNlRSOL+KN/mSDRYnJ53yAdfUA/X+lYnh/UVurd4WCieDqv94Z+9WZrF6bu5nvpHUtcZCfJnArBgvzbXQukkLOPuleSfUH2qPiR0cyp6HoqTESecOWHBz1xVhLhJJEyhUsDt3DjP4Vzmi6il7H5sZ2c42nqvvWpHOr4XLbf96s27Fqblsa0Mhj24ZWI4znHNWy24qRtDE9u1Y8cwgVFYZXGQcjINW47nAXe+M888nP/wCqplJNmsfM0gwQKB3znmpI5jyDgdunaqEcq4MhLBSf3Y28Ef0pUm2d+vIGapQ6srnSNJJivy4AXrThc8nYQAeM46VlyT7jgZVu3saRZyQScbT1yO4p2Y/aGq0y7ioOcbfx/wAmpJGZoyN3cbsnH/66yVuCPlyx3YYMe9SPKzFiCD2XHUc5zSaFzmmCQgLYK/3SeT+FRhljwWbcx6gLkH0zVFblQnzRjccndvxjn9aV5943EqBnGfwqeUHK5NLKEY7xkkdB39qgeQmPopJPT0qtcTgLkkDsB71GZvuEscDJPNGnQhy5SVtoVsPgnjhexpRKCMOcKVO3tmqUl0y42tj3qJpk3YPOTxgfpS5SXJFlpQVBckjIAxyBWloFu80v2oxhY0bCFjnpzn6c1mabZXOo3DiCJhCn3pOn1HvXZW0MEcSw2qLHtXb8xxnPv3ptWZLk+hdhcxx7mdVZm4OchgBnj86dG2YnUshXB/jyRkdaqLDHFHiGEKV64/lViF9iBT5JSQZI24I9RW0bmEkaUcYhXy9uFGcg9CPWo0VsEgkBuFw3GPekjcgRgkMAMp2wO31qQy/OGYAA8YHGaq7IsQSALEyoCzKGPADVX8+b0k/SrFzE5QeVKm5hxzyKq/Zrn+/F+dNsXKxr/MoQEjLA5U/rT16AlEZdu3Hr7nNIVVwF+ZcNkt/e9qaY1WRVYhQxHpx+FNtIjYFdyzZG3jBAI6dulOBUqVAdWAyxJ6moXEUQZnbC4zkrjJ4GBUckwdtqvtwcfLzj/wCvSTTC7Q9fmEny5JXlwe3XFch8R9V8uyttKtCWubgjIHXGeP51v3N8IUuDho44lyrO3Dn3rh2j+13E+vCVrm5VGESDkowGMgd6ynXjSfvFQd3qcl4iZbe4+wozbYxsL4xWLtVnKLhMDlmbBI9B61b1F3mLHkTRlt3Gc88/rmqzxKJNy8rnJbGNue9awlBq/c3lF23Ehklt5g0DMGI4x6elb2n6uXkENwrRngKMcsOvFc8zsJfLx90/e/8Ard6mt9yzwtjBL5PPWrcFJXMYyaeh2iXqqRMy5B6Lxke9Wre5G7hiQ3PI645rFaDMRlhQRtj5hnjPrSCd4s53KAOhHBNc+3Q61tc6FbxZH+XO4jAbHHrUhuVZtyjkcHAz1/lWDFcloQS4VgctzU8d5vKgyNgn5m74HNJtlb6m2JlPyhuQMAA9TTGuSu5SrAZOeKzFut1wuXdQc/MOuOxojuJMsCpyDjeTwaFU5dBSj2NaG6DKQSq5Xox5IFPW7Qg+VtYMM4J57c1j/aiGIbBwcZB60jz4ZiNy8YxnjGapPm1Ero1jcrtV9yqv6mkM+5sMeCPl461jtMGJUKGCnIyeKBcDZk8OcjFS0h3NJ50XJZhwOO1RNdbwG49QMdKzXlKlchVjwM0jPI0uwIOepTg+2fwqPREt23LktzzhmxnuD0ohMk0jjdtQDKnPU8VEISH3N8xBB65rSsY8SBnwi5zn9cY709QdrHaaU4jto0EZjWMbsju3U1pxPDPIFQkD72HHNcpod/Nbat5d1KGt5UOxi3CE9z7dq2jthmaZLuFWIG3fLhV5qtbmLdjWJRowhyuGzlUBP59qdDAk7xmUtCckAk4B98dKrQSEbWCI0qkMCWJD5HWrsaiaxLShnZODuwQB+PatVe4m9CWC7aM+VGdzIR8y9c1DIWZd0oIkzuyMAdKqzIYY1aNS8efmYDAH1FR63dGCx2GdQ7L8vGcfjVSlFRM1ci1PU7K2iV2SdpGOM5GOh/Opf7Utv7z/AJCvP9Xu7iS6gsgyt5jBnG7cF9M/zrV+y2P/ADxX8q441b7jZ1mpXKWsAmc54x5e3nJOAPxxWB9tkMwzIC7Z25xnn0/xrP1fU2ursy5ZYSflYdenbNUJLw4Rkdiw4RiOh71xYjFS6D5epoSvcNHshvcKpwxDYx7N60kH2uBhJHdyKOSFUkDPr6VlrcKSx6knG0LjIqwt4pgxvRSowq42j8a4416snoJImnu2uZnWZyVBIOG5J9f1Ncdpd/caDqjafIWWESkK5O0cnK/hjFdCGSTDFRuGeSOlZ3ijTDqVmJ4BtvIkABUkb1zyPyrXDz9/949BSa3KXivTkEn9rW6RgSnEixjoeu/NcrMpmCArkqxfg9PrXV+DdVW5sZNOvnZdgK7iuWK9AoPtWNq9ilpey2/7xTGxdSwxuGOue9epSfK3F7dC1NNWMdsljhtxJ608rIGRSrNkjAA5z/kU8RhB8/LHv6U5LlRMUUblCbiSpGMcYrthJ2smLk1OvtGR7dHcHG1cjPU+tPmtllkYlAFPAOOfX86g0WVJbOGLYNy5UAN2HNagEzsFIDgjPBCge9YVFK51R0RlCyyG2AsWXgH86hFqwkLh8kqMjHAraFvhRgZOc9O1NeCMowXnJJOfoP04oWhSasZiRlGwNzKxxyverDwMfkDnjqCcVfWFijOrfLwdrdz6ipFjPJK44xwMs3f8aT94LmZ9mnz5iud+cKcdB0NH2Ty9wdw3GAa10CbgzBVGASAOadJEjNlQQCecnt2qZeQ7GI1s5RRkA9scc0PBtX94CwGeM85PpWybcls4OO596atswGV2jL9c1PN3E4mYtvudkdOQeM+1XIbWSTgIm7jAHA9zVyGAJKWkKnuTjr2q3FCGDBQMjjAHXFQmxWKqW6iPcgAbcVIJznvVmBFXbvjJ43Y29fb9akAAAIyd3LH+7QhKSmV+MDAxQ2y7I47UJ3W9uYXDLGZThY+cUWIhMUiSlY5OcHdzVPWHKajcfvVH75jwenNRLJJPbPDKyZJ+8B6c9a7FzJIwcUmex+HFJ0WFULMSgwSd3P8A+quhtgDo88SBVUscODzkdv1rltEv/K0e1eGJXQxBflbOW+nbitvSb5HSS1aK5Fu3IZRvXd1wfTBArOVeMdzKUWhY4nMqhVJHIfJrA8V3JZhGzQyIAQUJyQB9f51W8TXdxLczWttcMUjJG7PJ56fSub166e2tiGj/AHuSA27JbPH5DNYuvGehm07FGwl+2a+pTcI1ALZ64zXabbX++9c54QtTHaNNN8zyEZJOSfcV0W1/+ep/75rDESSkkEb2MO9jkU8MeuD6fjVKKZo2ZSSMHg49q3W3NhJNgUgZUHrWVqNopUyr1DHjOMD1rypttml0im5bBQEMvrjpUDDLqpySD8uB3pskcyxAswwR/CKry/aUjf5Thk4IOfw/KruS31NG3ndnCt+Yx1yKv27vFGki7yc4B965+MDYqIxyUznb0rR0+7+dI8npj5uADVSiyFK5k+IoBpuqQatE7KjsQ6AnAf3rS1O2TVrBblWeS6ABzjgrjJH4dasarZLqFjNbEsBIM5bkbh0x9elYXhDUDb3Emn3YaMAM28E/e4ATH5110JOpC3VD0Wpj3dj5hMSyr83OSO5q9eaH9ltrgW8bGWMg525DDHIFWvEVrHZzfa7WJorYgAE9VJ71safcSiKJ925gDhifb0r0cNOTQOTk7oy9C3tZx7zslB5QrjaPWtpAyqw37s4IYVNE1uMmePa7H55FXnH5VcitLB5AqTv5JH326fjVzg5O5uqumpVx8wJYkHPJFKkZfG/avy4XHU96vrp0iMRLdRBgOw4PY5NNaxuIYgZYXCK+AzDg8djUODLjNFQRSGIsFBIGduakRGIUgcgflmnhTjP4e5+lSoEbGWVe3B6n0oatuaPyIoo8bk2qCTgnHJp207sBO1WUgCpliSQDn1PsKFTEagKFAI5P6/jS0DlZVCuPkIwOppqqVYhyCGPy57GrTAht7ArHk7WBydue47U2QICCOjD5QcfNjn+tRZXGkyJYhu27OPRqm+VslCxEYxj1PWgpuiT5SxJweegp4U4dQ2AOAR9KYcuoM74ywK7hkg89abCF82MswUZ5wv8ATvUrlGVQQT04J9qWOJpm2xK+V/urkVFnuXbQ868SQhdbkbOVLABYhkjJ6kVf0XwxqV1GJXK20IPAOdzD1x0713d74aAvftc0aRSSnG8H5un90e1blsNLsbcLue5KLkZOO2cc9+K6Y1HY5J6PcPCmnadbSHTZbOW4i27TckFGQ9OD3FLLN/ZmoXVstwgBfbtRjuYDpx9D1qtPrU080drahbaBSrEJ1J9CfTvWHqNwYPEMl04SZxnGT8rZBGc1z4lx5b2I5rs1tfmtoLSQxW8RJYFzjLYwenrXm0kh1XXTBGzCKKTJPYj3/l+NbfjDWJbqKS9lX7NJswo3cFT1PvxmqnhGyKwXFwwBMjcZGOOCP5GuKgrRc2TKT6HRQwpFEYkGSQDuHQCpdg/vVFHuBeKQtkYB55BHpUP2N/SvPnWk5XQkyWZ4mxsVmRT8pz16c0l4PKjbIEqk5YHt9azYrhQyyFd2Tkc/rV1Zi/LMMZzn0/zmpkrDXchljSReVyCCOvUEcDn0+lZ66eykFJmyxHzHBPPfjtWzJjBBzkEDI7//AFqhPllgMKFHXaO2etRBuKE73MFrN4W3LtBIwp6hu39aiiBVyCCGP4A98V0DoXLfKxVWyMnk1SnsYZH8wjc2c4/SuiNSXUgW2mWaPgHJ6f7P4VzPiy1ksb2PVIlGWwrDnk9QT6ZHH410kMZiIQoFGMKMd6TUrYXenXFvkHdGdpP98cj9a0pVeWaaHZsrS+XqOk8SNLLLCC33tqsR64xx0psTH7QyyOVK4V8emOuaq+DLuSbTJrZ5ooVgkK7ByzA85/Imr1zCV/0hAuOjgDGR/wDrr1IyVKWj3NJJR0RahiJTjf8Af+RsjjHf8avww+egJJzuzjGfrVCDIVFJAbIPzd+K0oXYyQbVK9NwHcV6MbMwk30L7W+YfmcmMe2Tiltbia2X59zxA/KpUNn61ZiMZRAxIIJyM8Y7VaEJk28glV3Zzjnp/KqaVx3luUUsbGd/MguPspfqGI2hs9+/5UjaTeI7JHHFIm4EtvC7voKty2EMycAI6c5HNNkju4gvlzZbH9z8f6VDpKeprGq0VXtr9FGLO4K9QCnBqGa3uyR5ls+SNwXB/wAg1sW9/qNopjeHzk64z1Hfml/ta53hhHtBOcY3D8azdE19u7GIqNnb5LJxyhQgio0jkcYjG7GccHP0rpW1ISD5x5h65IzzzUI1CMQ4SBNpXIDDoc9fal7FC+sGNDZ3TECO1uCSOcp0qay06ea4jEsJjQHBZgOmRWl/bNy1uYigQnPRs5Geue1Ztzd3FxIsStgEYIx1HGBTlTSQ/ass+RZ2xcTI0zAEDB6Cr0Fz5sTGH5I0GAgTbistLZVyJcow7qN2DWhEQtkUQZ3AnPrRyWRnKbkRIPMaVjI5CrnrnBqlasPMlkkTIUk4JJOf8KuQwsLOUjcDuLfKfyx+X5VnfLF9pfBLsMnsRn09s0ntoRdlG4u/LfIA+Y84GcVmyzI84DOQAM5PPJPHSodUmkLLtlw464bv60kLSSuHIBdgMJ2YjvXnYubTQXM7xNvnuoLEyCQF1JbBXbzjv9a6izV4I1eM7MR7Tjv71zMMP9oeJDI6xoYRkrtJXdg9fw5/CuuzG0YjC7STgHPCj2rCvJRgox6jFDpgGR8Yx908EY71Luj/ALo/OqqKBldh278D1PHU+3FO32vrDXJBJLUG2cpHcNFsXvjBIPWtKK8DbA5IGNi46ZJ71wtvrwEYR03n+90YVq6Zq8U6F/tETYcALuyTXZPBzWrFdnYpdGSIorrjJOWbpzilZgFwoJYcdaxbO9DPIHdgxY8MuRWksrSHIIbBO456VwuFnewXbJTIoJiY5J4z6HrT3kHLkZLjgd+nY9qqlTKp4OB0+tCzFRsK5OORjtS5bu4McpZY2RdqkFSTjqvemwOFZWxwPuhulIPlxj7xXgetOZSqq+7HGccYP1rKzvdAmYGnt9i8XGGK3Ewuchd5wuSTk57Y5rctZFhWVZCitz+7Xke9c74lSS0uIr6J3zuyoHPHG4/StlWgvYVntVcQuuVdlxmvRg/aQu9bEyqNbFi2fbcKEO9WPyjP3RWtbFZJdhXdtbOCOD+Nc/bn7NswGCZyB6nvW9pBWWNZATtAJ3Z+6M8134Stpy3FuaUZXO0AngHdmr4UYLLlXIAwG4NVoIi2QyFmypJ9vWr0KqAABkZyM969VSuDTFhleN2D7CW4Abt7/lUxkCoSwBw3Hy9R0/rRDGZpCzH5gflC1MICAVRuc4x9eapWFa40xobf92SOcYHUk+lEsSu6oEByuWJqVrYlvl3FiMECkETpG7A7wABheucipaKUWVm06ESeaNoYp0UnPWoZrWN0wVzhs4PGatSbhMCp52dqUwscY3NuycdalyQNGckUDfu9uMEglu9OkhUGNYyAxXGTkgH3rQghX733d3y47k06SEiQbeSw6Y70rXEUArGMg4IXjBbv60sMf7rY+ANvTqD7CrUlujqAFAkHfb39Kb9nHzBy4J6hegNU2rBYrQSKEePBGRgKe/t+HWqDQs6SQkgu42hj9eP1xWkIWVh+6IY5AOc5FZ2sxvY2T3J4G3buJy2OtZNpDkcZdB/7RlVl5PLEHof/ANVNVY4o2mlEmIwcMvPBBwPqelAd2uHdl3hwWzjrnp0qG5kdoUgtbgP5hAYPnOB16+leRUSqSbLTurlnw9bCJ5JfMeTLMZHB+Zv88cVtK6qxAI29vpVWygW1HllNuxfmUDGCenHenFlUbSQ3c7h1FcldxutQLBKAkjhSv3jzxn06/lS+baf30/79VBcXACo7Ko2jAPqOw/WqOZv+eT/981MUpK4jyp4RjeCQwfGWTGRUW2aEskasF3Egr/nrVoeW+5SCQqBjx1wKgeQhHKF1VwHILZGRX1DVyVKxbttUvYJFVjuA4GeMD1rqtL1aWVt0kOy33Ebwep/yK4dN5kdVC4Uc7q14teisdMhsVsy7Dc28ycEknqPTmuPEUY2ukJs76y1OG5kZg6+YBnIPQGpJow0bOuBs5BBy2R/+uvMIbqezniYSthudq8AH2rptN16ZsIwLuDt3N2zz2NedPAu3MVFNnWRnzAPmC4xkAU9CCSigqT0LDBBrJS5xcRSLu2BQCp/izx/OtZUcyuzbSUHB9cVwTp8rHaxV1S0SWJuGkbZgL3JPWsbSbo2Eot72XbZRRkQqxyN+ehxXShVUrkBsDuM1geILWAMQ6ZEpDNtOB83X8a0o1LaCsb4RZDyqgOeOc8mp7NpbNy20FSdu0d/euP0bUZre6lt7w+fKkSGJx0C5wM+/I/Kr/i7UrjTtKht1I8yYbvMA5C4ziuhr2ck4jSPQLC5UON6lWH3iRwR2rUhkj+XPscZyPw9K8N8PeKL3T2SU7prd8BkZ8sO5wa9U8OalDqcUV5FC8aF9gVjyuefxr3KbaSbE7HVR4+bcC0vmAhSeQvHNWFjAi3OcFjwe45x/WsyNzFeOVZ95BGc9cGtLZv8AM808jkFTW6s9TN3JI4SzcscE/MT6d/6U37NlmO9XIOAf5iniNjCzhyBtzj2GOKYZsSNuXK7cgZ6U2rjc2hYraPIVVGOQAR096RIQQMkErngHrUqyO8vmZ+ULytIBsheQHHsB1zUuyFe4jQxLENgPB3DgNyetK/kRlU+TB+6T1GKaDI6EkrtwSwx17/nVS6BkdOFyuGB9iKLoq7LDygHy+MMNysB0qFnQfOuQeck/zptwrh9pfh9vQdhxiogFcOjKPlUqcd+M0cthNj3mjkaNcfNtyMNXIeLbqW6uI7JWPQ/J/eIOf5Vf1vWTYOAqMQx2D2zXDeI9SECzQ4cPIrOsg5ZSfx4rkxElsgi7uwXl5FaRMsEhF2pyoPcen61Y0m0Zd11LHtlkGzvgDrisfQYGnnOo3BWXACqDwQcda3pLloCDywwS2e/FeVWlyGzstC0TgeVg47baqzuiysjLhio5A6VmXOqmPb8rZYDBBxgen/16qLrazW7GKJ02/LgnOT61yKm5hoi7qeofZ4VMbrvZyE3jn61lf2k3/PdvyrCv7+9vbhoWkVEj+b5Rgg+x7VU8yf8A57yf99V6FDBrl2Enc//Z";
118, 122, 64, 98, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 50, 0, 48, 0, 49, 0, 53, 0, 49, 0, 49, 0, // public static byte[] idCheck = FormatBytesUtil.hexStringToBytes(LZX_idCheck);
49, 0, 56, 0, 50, 0, 48, 0, 49, 0, 55, 0, 49, 0, 49, 0, 49, 0, 52, 0, -89, 46, -122, 112, 37, 110, -52, 34, // public static byte[] verification = FormatBytesUtil.hexStringToBytes(LZX_verification);
26, 21, -1, 49, 44, -47, -64, -21, -25, 45, 32, 33, 110, -73, -93, -5, -8, -9, 105, 92, -18, 109, -87, 7,
-51, -13, -36, 14, 123, 109, 106, 88, 2, 82, -46, -28, -84, -37, -82, 113, 111, -118, 34, 107, -40, -59, 69, // static {
-68, -10, 97, 110, -52, 70, -114, -34, -15, 21, -18, 19, -18, -69, 14, -63, 13, 73, 125, 50, 51, 93, 84, 27, // File f = new File("./config/123.jpg");
63, -42, -66, 95, -90, -94, -20, 47, -120, -100, -98, -68, 85, 73, 24, 97, 19, 0, 1, 48, 70, 2, 33, 0, -47, // try (InputStream in = new FileInputStream(f)) {
62, -43, 102, -99, 98, 37, 96, -97, 106, -80, -120, -28, 89, 96, -102, 124, 104, -15, 108, -34, 63, -61, 39, // picture = new byte[(int) f.length()];
4, 20, -75, 21, -125, 88, 98, -37, 2, 33, 0, -25, -61, 57, -39, 33, -2, 51, -90, -38, -79, 111, 69, -91, // in.read(picture);
-124, -27, 58, -93, -3, 37, 67, -9, -50, -12, 106, 1, 71, -103, 75, 67, -73, -29, -58, 77, 73, 73, 66, 49, // } catch (FileNotFoundException e) {
81, 89, 75, 75, 111, 69, 99, 122, 49, 85, 71, 65, 81, 81, 67, 65, 54, 67, 67, 65, 99, 85, 119, 103, 103, 72, // System.out.println("文件未找到。");
66, 65, 103, 69, 65, 77, 89, 72, 79, 77, 73, 72, 76, 65, 103, 69, 65, 77, 68, 119, 119, 77, 68, 69, 76, 77, // e.printStackTrace();
65, 107, 71, 65, 49, 85, 69, 13, 10, 66, 104, 77, 67, 81, 48, 52, 120, 68, 84, 65, 76, 66, 103, 78, 86, 66, // } catch (IOException e) {
65, 111, 84, 66, 69, 100, 66, 87, 86, 77, 120, 69, 106, 65, 81, 66, 103, 78, 86, 66, 65, 77, 84, 67, 85, // System.out.println("IOException.");
100, 66, 87, 86, 78, 84, 86, 85, 74, 68, 81, 81, 73, 73, 86, 110, 121, 67, 47, 50, 83, 122, 13, 10, 83, 57, // e.printStackTrace();
89, 119, 67, 119, 89, 74, 75, 111, 69, 99, 122, 49, 85, 66, 103, 105, 48, 68, 66, 72, 115, 119, 101, 81, 73, // }
103, 72, 118, 115, 109, 113, 75, 73, 122, 90, 104, 57, 55, 111, 70, 52, 110, 75, 65, 51, 78, 47, 87, 79, 77,
65, 97, 80, 56, 66, 51, 57, 68, 103, 97, 112, 105, 13, 10, 122, 57, 66, 78, 103, 80, 89, 67, 73, 81, 67, 90,
89, 51, 89, 122, 122, 50, 84, 70, 113, 81, 49, 72, 72, 86, 106, 98, 106, 54, 57, 80, 99, 103, 79, 90, 79,
57, 69, 101, 67, 105, 69, 71, 119, 107, 72, 101, 98, 117, 107, 52, 85, 103, 81, 103, 111, 66, 111, 48, 86,
72, 49, 67, 13, 10, 97, 75, 109, 88, 107, 111, 72, 90, 79, 102, 112, 87, 79, 98, 102, 102, 69, 78, 106, 70,
116, 105, 116, 74, 116, 104, 54, 43, 101, 51, 106, 103, 102, 113, 48, 69, 69, 66, 82, 71, 121, 55, 56, 97,
82, 72, 57, 122, 69, 66, 112, 77, 55, 68, 116, 82, 89, 122, 107, 119, 103, 101, 111, 71, 13, 10, 67, 105,
113, 66, 72, 77, 57, 86, 66, 103, 69, 69, 65, 103, 69, 119, 67, 81, 89, 72, 75, 111, 69, 99, 122, 49, 85,
66, 97, 73, 67, 66, 48, 79, 50, 72, 51, 89, 79, 87, 114, 109, 72, 98, 108, 72, 119, 87, 98, 102, 112, 107,
56, 48, 74, 90, 57, 82, 50, 69, 104, 67, 115, 86, 13, 10, 68, 83, 104, 66, 116, 55, 118, 72, 78, 48, 102,
109, 68, 49, 69, 75, 68, 73, 79, 116, 88, 104, 109, 48, 65, 71, 47, 99, 122, 111, 105, 100, 77, 87, 81, 101,
101, 84, 106, 90, 84, 69, 55, 113, 85, 105, 65, 52, 105, 98, 55, 81, 76, 72, 78, 77, 99, 75, 97, 68, 53,
108, 115, 65, 13, 10, 104, 97, 70, 89, 111, 50, 100, 43, 87, 86, 65, 116, 111, 83, 67, 66, 65, 83, 66, 75,
86, 98, 88, 66, 83, 78, 107, 90, 101, 49, 52, 118, 90, 68, 83, 107, 43, 74, 109, 113, 43, 102, 72, 98, 122,
52, 89, 65, 118, 74, 72, 90, 54, 117, 57, 68, 111, 82, 116, 111, 115, 67, 51, 104, 13, 10, 118, 76, 65, 113,
98, 72, 109, 56, 65, 68, 55, 74, 70, 79, 112, 48, 102, 121, 120, 118, 98, 114, 99, 88, 74, 53, 118, 65, 118,
53, 55, 102, 82, 57, 104, 57, 72, 86, 86, 77, 113, 109, 71, 109, 50, 113, 120, 113, 52, 51, 111, 78, 76,
104, 80, 113, 49, 108, 73, 52, 77, 77, 57, 57, 13, 10, 98, 67, 114, 99, 111, 105, 113, 56, 106, 47, 122,
108, 85, 116, 68, 90, 99, 65, 122, 88, 112, 105, 80, 47, 103, 113, 69, 57, 57, 77, 75, 103, 77, 97, 49, 81,
69, 73, 116, 89, 77, 98, 111, 53, 68, 55, 73, 80, 101, 104, 48, 114, 84, 79, 103, 61 };
public static byte[] verification = new byte[] { -64, 1, 77, 73, 73, 66, 81, 119, 89, 75, 75, 111, 69, 99, 122, 49,
85, 71, 65, 81, 81, 67, 65, 54, 67, 67, 65, 84, 77, 119, 103, 103, 69, 118, 65, 103, 69, 65, 77, 89, 72, 79,
77, 73, 72, 76, 65, 103, 69, 65, 77, 68, 119, 119, 77, 68, 69, 76, 77, 65, 107, 71, 65, 49, 85, 69, 13, 10,
66, 104, 77, 67, 81, 48, 52, 120, 68, 84, 65, 76, 66, 103, 78, 86, 66, 65, 111, 84, 66, 69, 100, 66, 87, 86,
77, 120, 69, 106, 65, 81, 66, 103, 78, 86, 66, 65, 77, 84, 67, 85, 100, 66, 87, 86, 78, 84, 86, 85, 74, 68,
81, 81, 73, 73, 86, 110, 121, 67, 47, 50, 83, 122, 13, 10, 83, 57, 89, 119, 67, 119, 89, 74, 75, 111, 69,
99, 122, 49, 85, 66, 103, 105, 48, 68, 66, 72, 115, 119, 101, 81, 73, 104, 65, 73, 71, 53, 106, 121, 80, 90,
80, 86, 48, 83, 119, 108, 87, 65, 85, 82, 120, 111, 108, 104, 87, 81, 53, 69, 79, 106, 71, 101, 70, 80, 77,
76, 81, 50, 13, 10, 53, 118, 119, 47, 111, 49, 52, 78, 65, 105, 65, 77, 109, 69, 54, 57, 70, 57, 106, 87,
116, 50, 103, 75, 82, 108, 80, 105, 49, 107, 66, 51, 99, 110, 86, 71, 56, 56, 105, 49, 100, 108, 78, 53, 55,
75, 75, 114, 73, 105, 102, 85, 74, 119, 81, 103, 102, 113, 48, 54, 54, 110, 108, 72, 13, 10, 76, 117, 86,
66, 118, 76, 119, 65, 100, 57, 99, 68, 86, 97, 122, 86, 55, 48, 119, 102, 87, 116, 72, 84, 52, 101, 114,
114, 49, 67, 110, 105, 75, 73, 99, 69, 69, 75, 104, 116, 75, 70, 119, 81, 87, 119, 84, 48, 54, 104, 120, 83,
80, 54, 119, 52, 106, 116, 69, 119, 87, 81, 89, 75, 13, 10, 75, 111, 69, 99, 122, 49, 85, 71, 65, 81, 81,
67, 65, 84, 65, 74, 66, 103, 99, 113, 103, 82, 122, 80, 86, 81, 70, 111, 103, 69, 66, 53, 116, 54, 117, 83,
67, 49, 98, 118, 47, 85, 108, 110, 84, 107, 85, 54, 48, 68, 87, 120, 120, 77, 113, 43, 108, 49, 101, 102,
113, 53, 43, 79, 13, 10, 51, 53, 66, 97, 114, 100, 56, 48, 117, 76, 47, 56, 88, 101, 71, 74, 118, 112, 89,
113, 100, 102, 67, 80, 120, 54, 78, 101, 111, 118, 84, 115, 71, 47, 122, 111, 66, 103, 70, 87, 67, 116, 97,
80, 51, 57, 117, 79, 56, 117, 106, 71, 0, 0 };
public static byte[] picture = null;
static {
File f = new File("./config/123.jpg");
try (InputStream in = new FileInputStream(f)) {
picture = new byte[(int) f.length()];
in.read(picture);
} catch (FileNotFoundException e) {
System.out.println("文件未找到。");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException.");
e.printStackTrace();
}
// OCX版人像控件输出结果需进行Base64.decode(image)转换,获得的字节数据进行组包 // OCX版人像控件输出结果需进行Base64.decode(image)转换,获得的字节数据进行组包
} // }
} }
...@@ -82,7 +82,11 @@ public class FormatBytesUtil { ...@@ -82,7 +82,11 @@ public class FormatBytesUtil {
* @return * @return
*/ */
public static byte[] getBytesFromString(byte[] bytes, String string) { public static byte[] getBytesFromString(byte[] bytes, String string) {
for (int i = 0; i < string.length(); i++) { int j=string.length();
if(bytes.length<string.length()){
j=bytes.length;
}
for (int i = 0; i < j; i++) {
bytes[i] = (byte) string.charAt(i); bytes[i] = (byte) string.charAt(i);
} }
return bytes; return bytes;
...@@ -91,8 +95,8 @@ public class FormatBytesUtil { ...@@ -91,8 +95,8 @@ public class FormatBytesUtil {
/** /**
* 将两个byte数组合并为一个 * 将两个byte数组合并为一个
* *
* @param byte_1 * @param byte1
* @param byte_2 * @param byte2
* @return byte_3 * @return byte_3
*/ */
public static byte[] byteMerger(byte[] byte1, byte[] byte2) { public static byte[] byteMerger(byte[] byte1, byte[] byte2) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment