From 20ea10380fd04731ceb024bbdadb3f98d0c9b160 Mon Sep 17 00:00:00 2001 From: 0xstride <73103011+fengjy73@users.noreply.github.com> Date: Wed, 19 Aug 2026 02:42:45 +0800 Subject: [PATCH 01/23] Support upgrading legacy Mychain monitor contracts --- .../mychain020/Mychain020BBCService.java | 11 +++ .../mychain020/contract/PtcContractEvm.java | 76 ++++++++++++++++ .../contract/SDPContractClientEVM.java | 81 +++++++++++++++++ .../Mychain020MonitorBBCServiceTest.java | 32 +++++++ .../contract/PtcContractEvmTest.java | 77 ++++++++++++++++ .../contract/SDPContractClientEVMTest.java | 88 +++++++++++++++++++ .../mychain0.20/onchain-plugin/README.md | 7 +- .../onchain-plugin/solidity/v1/SDPMsg.sol | 6 +- .../solidity/v1/compile_evm_all.sh | 24 +++-- 9 files changed, 391 insertions(+), 11 deletions(-) create mode 100644 acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVMTest.java diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java index 3dc4b8be..bdb5ae4f 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java @@ -1105,6 +1105,17 @@ public void setupMonitorContract() { context.getMonitorContractClientEVM().resetDeployment(); } + if (ObjectUtil.isNotNull(context.getPtcContractEvm()) + && StrUtil.isNotEmpty(context.getPtcContractEvm().getContractAddress()) + && !context.getPtcContractEvm().ensureMonitorVerifierSupport()) { + throw new RuntimeException("upgrade legacy ptc hub for monitor support failed"); + } + if (ObjectUtil.isNotNull(context.getSdpContractClientEVM()) + && StrUtil.isNotEmpty(context.getSdpContractClientEVM().getContractAddress()) + && !context.getSdpContractClientEVM().ensureMonitorSupport()) { + throw new RuntimeException("upgrade legacy sdp for monitor support failed"); + } + if (!context.getMonitorVerifierContractEVM().deployContract()) { throw new RuntimeException("deploy monitor verifier with evm contract failed"); } diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java index f3948727..297475ea 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java @@ -41,6 +41,7 @@ import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; import com.alipay.mychain.sdk.message.transaction.TransactionReceiptResponse; import com.alipay.mychain.sdk.vm.EVMOutput; import com.alipay.mychain.sdk.vm.EVMParameter; @@ -52,6 +53,12 @@ public class PtcContractEvm extends PTCContract implements AbstractPtcContract { private static final String PTC_HUB_EVM_CONTRACT_PREFIX = "PTC_HUB_EVM_CONTRACT_"; + private static final String PTC_HUB_EVM_RUNTIME_PATH = "/contract/v1/solidity/PtcHub.bin-runtime"; + + private static final String GET_MONITOR_VERIFIER_SIGN = "getMonitorVerifier()"; + + private static final long LEGACY_METHOD_NOT_FOUND_RESULT = 10201L; + private Mychain020Client mychain020Client; private final Logger logger; @@ -149,6 +156,75 @@ public void setMonitorVerifier(String monitorVerifierName) { logger.info("Set monitor verifier {} with tx {} successfully!", monitorVerifierName, result.getTxId()); } + /** + * Upgrade a PTC Hub deployed before monitor support was introduced while + * preserving the contract identity and its existing trust data. + * + *
The regulatory PTC Hub appends only {@code monitorVerifierAddr} to the + * legacy storage layout. Mychain's update-contract operation replaces the + * runtime code at the existing identity, so the BCDNS certificate, PTC + * trust roots, verify anchors and TpBTAs remain available.
+ */ + public boolean ensureMonitorVerifierSupport() { + if (isMonitorVerifierSupported()) { + return true; + } + if (StrUtil.isEmpty(this.getContractAddress())) { + logger.error("cannot upgrade an empty ptc hub contract"); + return false; + } + + logger.info( + "Upgrade legacy PTC hub {} with monitor-enabled runtime {}", + this.getContractAddress(), + PTC_HUB_EVM_RUNTIME_PATH); + if (!mychain020Client.upgradeContract( + PTC_HUB_EVM_RUNTIME_PATH, + this.getContractAddress(), + VMTypeEnum.EVM)) { + logger.error("failed to upgrade legacy ptc hub {}", this.getContractAddress()); + return false; + } + + boolean supported = isMonitorVerifierSupported(); + if (!supported) { + logger.error("ptc hub {} still lacks monitor support after upgrade", this.getContractAddress()); + } + return supported; + } + + public boolean isMonitorVerifierSupported() { + if (StrUtil.isEmpty(this.getContractAddress())) { + return false; + } + + try { + TransactionReceipt receipt = mychain020Client.localCallContract( + this.getContractAddress(), + new EVMParameter(GET_MONITOR_VERIFIER_SIGN)); + if (ObjectUtil.isEmpty(receipt)) { + throw new IllegalStateException("empty ptc hub capability probe receipt"); + } + if (receipt.getResult() == LEGACY_METHOD_NOT_FOUND_RESULT) { + return false; + } + if (receipt.getResult() != ErrorCode.SUCCESS.getErrorCode() + || ObjectUtil.isEmpty(receipt.getOutput())) { + throw new IllegalStateException( + StrUtil.format( + "unexpected ptc hub capability probe result: {}", + receipt.getResult())); + } + return true; + } catch (Exception e) { + throw new IllegalStateException( + StrUtil.format( + "failed to probe monitor support on ptc hub {}", + this.getContractAddress()), + e); + } + } + public String getCommitteeVerifier() { EVMParameter parameters = new EVMParameter("verifierMap(uint8)"); parameters.addUint(BigInteger.valueOf(PTCTypeEnum.COMMITTEE.ordinal())); diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java index da83941f..8e9e215a 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java @@ -5,6 +5,7 @@ import java.util.UUID; import cn.hutool.core.util.HexUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; import com.alipay.antchain.bridge.commons.bbc.syscontract.SDPContract; @@ -16,6 +17,7 @@ import com.alipay.mychain.sdk.common.VMTypeEnum; import com.alipay.mychain.sdk.crypto.hash.Hash; import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; import com.alipay.mychain.sdk.vm.EVMOutput; import com.alipay.mychain.sdk.vm.EVMParameter; import lombok.Getter; @@ -29,8 +31,11 @@ public class SDPContractClientEVM extends SDPContract implements AbstractSDPCont private static final String SDP_EVM_CONTRACT_PREFIX = "SDP_EVM_CONTRACT_"; + private static final String SDP_EVM_RUNTIME_PATH = "/contract/v1/solidity/SDPMsg.bin-runtime"; + private static final String SET_AM_CONTRACT_AND_DOMAIN_SIGN = "SetAmContractAndDomain(identity,string)"; private static final String SET_MONITOR_CONTRACT_SIGN = "setMonitorContract(identity)"; + private static final String GET_MONITOR_CONTRACT_SIGN = "monitorAddress()"; private static final String RECV_OFF_CHAIN_EXCEPTION_SIGN = "recvOffChainException(bytes32,bytes)"; private static final String UPDATE_VERIFIED_INFO_SIGN = "updateVerifiedInfo(string,bytes32,uint64,uint64)"; private static final String QUERY_VALIDATED_BLOCK_STATE_BY_DOMAIN_SIGN = "queryValidatedBlockStateByDomain(string)"; @@ -38,6 +43,8 @@ public class SDPContractClientEVM extends SDPContract implements AbstractSDPCont private static final String BLOCK_STATE_CLS = "(uint16,string,bytes32,uint256,uint64)"; + private static final long LEGACY_METHOD_NOT_FOUND_RESULT = 10201L; + private Mychain020Client mychain020Client; private String localDomain; @@ -49,6 +56,14 @@ public SDPContractClientEVM(Mychain020Client mychain020Client, Logger logger) { this.logger = logger; } + public String getLocalDomain() { + return localDomain; + } + + public void setLocalDomain(String localDomain) { + this.localDomain = localDomain; + } + public void setMonitorContract(String monitorContractName) { EVMParameter parameters = new EVMParameter(SET_MONITOR_CONTRACT_SIGN); parameters.addIdentity(Utils.getIdentityByName( @@ -63,6 +78,72 @@ public void setMonitorContract(String monitorContractName) { } } + /** + * Upgrade an SDP contract deployed before regulatory monitor support was + * added. The monitor address is appended after every legacy storage field + * in the regulatory contract, so the existing domain, sequence and block + * state data remain at their original slots. + */ + public boolean ensureMonitorSupport() { + if (isMonitorSupported()) { + return true; + } + if (StrUtil.isEmpty(this.getContractAddress())) { + logger.error("cannot upgrade an empty sdp contract"); + return false; + } + + logger.info( + "Upgrade legacy SDP {} with monitor-enabled runtime {}", + this.getContractAddress(), + SDP_EVM_RUNTIME_PATH); + if (!mychain020Client.upgradeContract( + SDP_EVM_RUNTIME_PATH, + this.getContractAddress(), + VMTypeEnum.EVM)) { + logger.error("failed to upgrade legacy sdp {}", this.getContractAddress()); + return false; + } + + boolean supported = isMonitorSupported(); + if (!supported) { + logger.error("sdp {} still lacks monitor support after upgrade", this.getContractAddress()); + } + return supported; + } + + public boolean isMonitorSupported() { + if (StrUtil.isEmpty(this.getContractAddress())) { + return false; + } + + try { + TransactionReceipt receipt = mychain020Client.localCallContract( + this.getContractAddress(), + new EVMParameter(GET_MONITOR_CONTRACT_SIGN)); + if (ObjectUtil.isEmpty(receipt)) { + throw new IllegalStateException("empty sdp capability probe receipt"); + } + if (receipt.getResult() == LEGACY_METHOD_NOT_FOUND_RESULT) { + return false; + } + if (receipt.getResult() != ErrorCode.SUCCESS.getErrorCode() + || ObjectUtil.isEmpty(receipt.getOutput())) { + throw new IllegalStateException( + StrUtil.format( + "unexpected sdp capability probe result: {}", + receipt.getResult())); + } + return true; + } catch (Exception e) { + throw new IllegalStateException( + StrUtil.format( + "failed to probe monitor support on sdp {}", + this.getContractAddress()), + e); + } + } + @Override public boolean setAmContractAndDomain(String amContractName) { EVMParameter parameters = new EVMParameter(SET_AM_CONTRACT_AND_DOMAIN_SIGN); diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java index 55aef3eb..d5688db0 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java @@ -55,6 +55,8 @@ public void setUp() { when(mychain020Client.getPrimary()).thenReturn("mychain-monitor-test"); when(mychain020Client.isTeeChain()).thenReturn(false); + when(ptcContractEvm.ensureMonitorVerifierSupport()).thenReturn(true); + when(sdpContractClientEVM.ensureMonitorSupport()).thenReturn(true); context.setMonitorContractClientEVM(monitorContractClientEVM); context.setMonitorVerifierContractEVM(monitorVerifierContractEVM); @@ -85,6 +87,7 @@ public void setupMonitorContractShouldDeployAndWireContracts() { verify(monitorVerifierContractEVM).deployContract(); verify(monitorContractClientEVM).deployContract(); verify(monitorContractClientEVM).setMonitorVerifier(MONITOR_VERIFIER_CONTRACT); + verify(sdpContractClientEVM).ensureMonitorSupport(); verify(monitorContractClientEVM).setProtocol(SDP_CONTRACT); verify(sdpContractClientEVM).setMonitorContract(MONITOR_CONTRACT); Assert.assertNotNull(context.getMonitorContract()); @@ -108,6 +111,7 @@ public void setupMonitorContractShouldUpgradeLegacyMonitorContracts() { verify(monitorContractClientEVM).isImplementationVersionSupported(); verify(monitorContractClientEVM).resetDeployment(); + verify(ptcContractEvm).ensureMonitorVerifierSupport(); verify(monitorVerifierContractEVM).deployContract(); verify(monitorContractClientEVM).deployContract(); verify(monitorContractClientEVM).setMonitorVerifier(MONITOR_VERIFIER_CONTRACT); @@ -133,6 +137,34 @@ public void setupMonitorContractShouldReuseSupportedMonitorContracts() { verify(monitorContractClientEVM, times(1)).deployContract(); } + @Test(expected = RuntimeException.class) + public void setupMonitorContractShouldStopBeforeDeployWhenPtcUpgradeFails() { + when(ptcContractEvm.getContractAddress()).thenReturn(PTC_HUB_CONTRACT); + when(ptcContractEvm.ensureMonitorVerifierSupport()).thenReturn(false); + + try { + service.setupMonitorContract(); + } finally { + verify(ptcContractEvm).ensureMonitorVerifierSupport(); + verify(monitorVerifierContractEVM, never()).deployContract(); + verify(monitorContractClientEVM, never()).deployContract(); + } + } + + @Test(expected = RuntimeException.class) + public void setupMonitorContractShouldStopBeforeDeployWhenSdpUpgradeFails() { + when(sdpContractClientEVM.getContractAddress()).thenReturn(SDP_CONTRACT); + when(sdpContractClientEVM.ensureMonitorSupport()).thenReturn(false); + + try { + service.setupMonitorContract(); + } finally { + verify(sdpContractClientEVM).ensureMonitorSupport(); + verify(monitorVerifierContractEVM, never()).deployContract(); + verify(monitorContractClientEVM, never()).deployContract(); + } + } + @Test public void setProtocolShouldAutomaticallyUpgradeLegacyMonitor() { when(monitorContractClientEVM.getContractAddress()).thenReturn("legacy_monitor_contract"); diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java index c9d0d27a..a3a69431 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java @@ -1,9 +1,15 @@ package com.alipay.antchain.bridge.plugins.mychain020.contract; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; @@ -21,4 +27,75 @@ public void shouldRestoreReadyStatusForPredeployedContract() { Assert.assertTrue(contract.deployContract("unused-for-predeployed-contract")); Assert.assertEquals(ContractStatusEnum.CONTRACT_READY, contract.getStatus()); } + + @Test + public void shouldUpgradeLegacyPtcHubAndVerifyMonitorSupport() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt legacyReceipt = mock(TransactionReceipt.class); + TransactionReceipt upgradedReceipt = mock(TransactionReceipt.class); + when(legacyReceipt.getResult()).thenReturn(10201L); + when(upgradedReceipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(upgradedReceipt.getOutput()).thenReturn(new byte[32]); + when(client.localCallContract(eq("legacy_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(legacyReceipt, upgradedReceipt); + when(client.upgradeContract( + "/contract/v1/solidity/PtcHub.bin-runtime", + "legacy_ptc_hub", + VMTypeEnum.EVM)).thenReturn(true); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("legacy_ptc_hub"); + + Assert.assertTrue(contract.ensureMonitorVerifierSupport()); + verify(client).upgradeContract( + "/contract/v1/solidity/PtcHub.bin-runtime", + "legacy_ptc_hub", + VMTypeEnum.EVM); + } + + @Test + public void shouldNotUpgradePtcHubThatAlreadySupportsMonitor() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(receipt.getOutput()).thenReturn(new byte[32]); + when(client.localCallContract(eq("current_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("current_ptc_hub"); + + Assert.assertTrue(contract.ensureMonitorVerifierSupport()); + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + + @Test(expected = IllegalStateException.class) + public void shouldNotUpgradeWhenCapabilityProbeFailsUnexpectedly() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn(99L); + when(client.localCallContract(eq("unreachable_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("unreachable_ptc_hub"); + + try { + contract.ensureMonitorVerifierSupport(); + } finally { + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + } + + @Test + public void shouldPackageMonitorEnabledPtcRuntime() { + Assert.assertNotNull(PtcContractEvm.class.getResourceAsStream( + "/contract/v1/solidity/PtcHub.bin-runtime")); + } } diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVMTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVMTest.java new file mode 100644 index 00000000..2c1da770 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVMTest.java @@ -0,0 +1,88 @@ +package com.alipay.antchain.bridge.plugins.mychain020.contract; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; + +public class SDPContractClientEVMTest { + + @Test + public void shouldUpgradeLegacySdpAndVerifyMonitorSupport() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt legacyReceipt = mock(TransactionReceipt.class); + TransactionReceipt upgradedReceipt = mock(TransactionReceipt.class); + when(legacyReceipt.getResult()).thenReturn(10201L); + when(upgradedReceipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(upgradedReceipt.getOutput()).thenReturn(new byte[32]); + when(client.localCallContract(eq("legacy_sdp"), org.mockito.ArgumentMatchers.any())) + .thenReturn(legacyReceipt, upgradedReceipt); + when(client.upgradeContract( + "/contract/v1/solidity/SDPMsg.bin-runtime", + "legacy_sdp", + VMTypeEnum.EVM)).thenReturn(true); + + SDPContractClientEVM contract = new SDPContractClientEVM(client, mock(Logger.class)); + contract.setContractAddress("legacy_sdp"); + + Assert.assertTrue(contract.ensureMonitorSupport()); + verify(client).upgradeContract( + "/contract/v1/solidity/SDPMsg.bin-runtime", + "legacy_sdp", + VMTypeEnum.EVM); + } + + @Test + public void shouldNotUpgradeSdpThatAlreadySupportsMonitor() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(receipt.getOutput()).thenReturn(new byte[32]); + when(client.localCallContract(eq("current_sdp"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + SDPContractClientEVM contract = new SDPContractClientEVM(client, mock(Logger.class)); + contract.setContractAddress("current_sdp"); + + Assert.assertTrue(contract.ensureMonitorSupport()); + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + + @Test(expected = IllegalStateException.class) + public void shouldNotUpgradeWhenCapabilityProbeFailsUnexpectedly() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn(99L); + when(client.localCallContract(eq("unreachable_sdp"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + SDPContractClientEVM contract = new SDPContractClientEVM(client, mock(Logger.class)); + contract.setContractAddress("unreachable_sdp"); + + try { + contract.ensureMonitorSupport(); + } finally { + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + } + + @Test + public void shouldPackageMonitorEnabledSdpRuntime() { + Assert.assertNotNull(SDPContractClientEVM.class.getResourceAsStream( + "/contract/v1/solidity/SDPMsg.bin-runtime")); + } +} diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md b/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md index fa4feb4f..28d114e6 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md @@ -11,13 +11,18 @@ ## Mychain020 BBC监管系统合约(solidity) 本目录是在`mychain0.10`基础系统合约之上增加 Monitor 和 MonitorVerifier 的监管版合约库,适配同一 Mychain 0.10 链环境。 -合约编译依赖`0.4.24`版本的[`solc`编译器](https://antdigital.com/docs/11/101793#h2--solc-5:~:text=%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E3%80%82-,%E4%BA%8C%E8%BF%9B%E5%88%B6%C2%A0solc%C2%A0%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7,-solc%2Djs%C2%A0%E7%BC%96%E8%AF%91) +合约编译依赖`0.8.14`版本的 Mychain [`solc`编译器](https://antdigital.com/docs/11/101793#h2--solc-5:~:text=%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E3%80%82-,%E4%BA%8C%E8%BF%9B%E5%88%B6%C2%A0solc%C2%A0%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7,-solc%2Djs%C2%A0%E7%BC%96%E8%AF%91) 和[`solc-js`编译器](https://antdigital.com/docs/11/101793#h2--solc-js1:~:text=%E8%BF%9B%E8%A1%8C%E7%AE%80%E8%A6%81%E8%AF%B4%E6%98%8E%E3%80%82-,%E4%B8%8B%E8%BD%BD%C2%A0solc%2Djs,-%E5%8D%95%E5%87%BB%E6%AD%A4%E5%A4%84) 执行`onchain-plugin/solidity/v1`目录下的`compile_evm_all.sh`脚本可以编译 v1 EVM 合约, 并将编译生成的`*.bin`(用于合约部署)和`*_runtime.bin`(用于合约升级) 自动更新到`offchain-plugin/src/main/resources/contract/v1/solidity`目录。监管合约新增后, 该脚本也会生成并拷贝`Monitor_sol_Monitor.bin`和`MonitorVerifier_sol_MonitorVerifier.bin`。 +脚本会校验两个编译器都是 Mychain 0.8.14 版本;社区 Solidity 编译器或缺少运行时代码 +编译器时会直接失败,避免生成 +无法升级历史系统合约的插件包。监管版 PTC Hub 和 SDP 都只在旧版存储布局末尾追加监管 +字段,因此插件会在初始化监管合约前原位升级旧合约,并保留其合约身份、信任数据、域名、 +消息序号及已验证区块状态。 ## Mychain BBC系统合约(c++) diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol index 4f7c756a..c3e74eeb 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol @@ -18,8 +18,6 @@ contract SDPMsg is ISDPMessage, Ownable { identity public amAddress; - identity public monitorAddress; - bytes32 public localDomainHash; mapping(bytes32 => uint32) sendSeq; @@ -40,6 +38,10 @@ contract SDPMsg is ISDPMessage, Ownable { // only relayer can call `recvOffChainException` mapping(identity => bool) public relayerAuthMap; + // Keep new regulatory state after every legacy SDP storage field so an + // update-contract migration does not shift existing sequences or state. + identity public monitorAddress; + modifier onlyAM() { require( amAddress == msg.sender, diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh index e3e36408..41c9fd77 100755 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh @@ -37,6 +37,18 @@ SOL_FILES=( cleanup +SOLCJS_VERSION="$("${SOLCJS}" --version 2>&1)" +if [[ "${SOLCJS_VERSION}" != *"0.8.14"* || "${SOLCJS_VERSION}" != *".mod."* ]]; then + echo "solcjs must be the Mychain 0.8.14 compiler, got: ${SOLCJS_VERSION}" >&2 + exit 1 +fi + +SOLC_VERSION="$("${SOLC}" --version 2>&1)" +if [[ "${SOLC_VERSION}" != *"0.8.14"* || "${SOLC_VERSION}" != *"for antfin"* ]]; then + echo "solc must be the Mychain 0.8.14 binary compiler, got: ${SOLC_VERSION}" >&2 + exit 1 +fi + "${SOLCJS}" --bin "${SOL_FILES[@]}" copy_bin() { @@ -55,13 +67,9 @@ copy_bin CommitteePtcVerifier_sol_CommitteePtcVerifier.bin copy_bin Monitor_sol_Monitor.bin copy_bin MonitorVerifier_sol_MonitorVerifier.bin -if command -v "${SOLC}" >/dev/null 2>&1; then - "${SOLC}" --bin-runtime --overwrite "${SOL_FILES[@]}" -o . - for runtime_file in AuthMsg.bin-runtime SDPMsg.bin-runtime PtcHub.bin-runtime CommitteePtcVerifier.bin-runtime Monitor.bin-runtime MonitorVerifier.bin-runtime; do - if [[ -f "${runtime_file}" ]]; then - cp "${runtime_file}" "${CONTRACT_PATH}/${runtime_file}" - fi - done -fi +"${SOLC}" --bin-runtime --overwrite "${SOL_FILES[@]}" -o . +for runtime_file in AuthMsg.bin-runtime SDPMsg.bin-runtime PtcHub.bin-runtime CommitteePtcVerifier.bin-runtime Monitor.bin-runtime MonitorVerifier.bin-runtime; do + copy_bin "${runtime_file}" +done echo "MyChain EVM contract binaries generated under ${CONTRACT_PATH}" From 27d1dc266faec24484a7ee081ea74ebecfe4c4dd Mon Sep 17 00:00:00 2001 From: 0xstride <73103011+fengjy73@users.noreply.github.com> Date: Wed, 19 Aug 2026 02:45:33 +0800 Subject: [PATCH 02/23] Package Mychain monitor upgrade bytecode --- .../src/main/resources/contract/v1/solidity/PtcHub.bin-runtime | 1 + .../src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime | 1 + .../main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub.bin-runtime create mode 100644 acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub.bin-runtime b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub.bin-runtime new file mode 100644 index 00000000..b6257bbf --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub.bin-runtime @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50600436106101735760003560e01c806395e8fcee116100de578063ae14961d11610097578063d919581711610071578063d91958171461046e578063dde185461461049e578063e1ceb030146104ce578063fe8cc1e3146104fe57610173565b8063ae14961d14610402578063c2450b5014610420578063c3292b6d1461043e57610173565b806395e8fcee146103305780639646a30b1461034c578063a1d6c96414610368578063ad86bc0314610384578063adc64a18146103b4578063adf22b3f146103e457610173565b806355c265fe1161013057806355c265fe1461025c578063715018a61461027857806373d6c7bd146102825780637adcff0c146102b25780638da5cb5b146102e257806390157ffb1461030057610173565b806304802a34146101785780630604420e1461019457806309158b21146101c457806312dabd3a146101f45780631f56086f146102245780632534ddcc14610240575b600080fd5b610192600480360381019061018d91906164e1565b61052e565b005b6101ae60048036038101906101a991906164e1565b61090b565b6040516101bb91906165c7565b60405180910390f35b6101de60048036038101906101d9919061661f565b6109cb565b6040516101eb91906166c3565b60405180910390f35b61020e6004803603810190610209919061671a565b6109ff565b60405161021b9190616795565b60405180910390f35b61023e600480360381019061023991906167ee565b610a5d565b005b61025a600480360381019061025591906167ee565b610ab4565b005b610276600480360381019061027191906164e1565b610b09565b005b610280610e58565b005b61029c600480360381019061029791906164e1565b610e6c565b6040516102a99190616795565b60405180910390f35b6102cc60048036038101906102c79190616840565b610eb2565b6040516102d9919061687c565b60405180910390f35b6102ea610eca565b6040516102f7919061687c565b60405180910390f35b61031a600480360381019061031591906168cd565b610ed3565b604051610327919061694f565b60405180910390f35b61034a600480360381019061034591906164e1565b610f73565b005b610366600480360381019061036191906167ee565b6111ed565b005b610382600480360381019061037d9190616840565b61139b565b005b61039e600480360381019061039991906168cd565b6115eb565b6040516103ab9190616980565b60405180910390f35b6103ce60048036038101906103c991906168cd565b611609565b6040516103db91906165c7565b60405180910390f35b6103ec6116af565b6040516103f99190616a59565b60405180910390f35b61040a61173c565b604051610417919061687c565b60405180910390f35b610428611742565b604051610435919061687c565b60405180910390f35b61045860048036038101906104539190616a7b565b61174c565b6040516104659190616795565b60405180910390f35b6104886004803603810190610483919061671a565b6117a4565b60405161049591906165c7565b60405180910390f35b6104b860048036038101906104b39190616a7b565b61187c565b6040516104c591906165c7565b60405180910390f35b6104e860048036038101906104e39190616c0b565b61194e565b6040516104f591906165c7565b60405180910390f35b610518600480360381019061051391906164e1565b611a04565b60405161052591906165c7565b60405180910390f35b610536612d21565b600061058583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d73565b9050610598816060015160600151612f9e565b6105d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90616ca0565b60405180910390fd5b60006105ea826060015160600151612fdb565b905060006105fb83604001516130a0565b905061060f8360600151606001518261315c565b61064e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064590616d0c565b60405180910390fd5b600060056000610665856020015160c001516131ab565b60400151600281111561067b5761067a61664c565b5b600281111561068d5761068c61664c565b5b8152602001908152602001600020549050600081036106e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d890616d78565b60405180910390fd5b8063bff3093b6106f986606001516060015185613330565b866040518363ffffffff1660e01b815260040161071792919061711a565b6020604051808303816000875af1158015610736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a919061717d565b610799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610790906171f6565b60405180910390fd5b60006107a88560800151613407565b8051906020012090506000600460008381526020019081526020016000209050856020015163ffffffff168160000154101561082f57856020015163ffffffff1681600001819055507f14f6dcf24001d9e8910255539bf10f0a01ba6fcb712bdcd812fe528b9ad798d1828760200151604051610826929190617260565b60405180910390a15b8787826001016000896020015163ffffffff168152602001908152602001600020919061085d929190615fcd565b507f8796377aabd0d7feac50b0be12f810cac9a467a6ccd01c3bb79e50e2da8fd1f2828760200151604051610893929190617260565b60405180910390a160006007541461090157600754631a383f188760e001516040518263ffffffff1660e01b81526004016108ce91906165c7565b600060405180830381600087803b1580156108e857600080fd5b505af11580156108fc573d6000803e3d6000fd5b505050505b5050505050505050565b60606003600084846040516109219291906172b9565b60405180910390208152602001908152602001600020600001805461094590617301565b80601f016020809104026020016040519081016040528092919081815260200182805461097190617301565b80156109be5780601f10610993576101008083540402835291602001916109be565b820191906000526020600020905b8154815290600101906020018083116109a157829003601f168201915b5050505050905092915050565b600681815481106109db57600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b600080600460008686604051610a169291906172b9565b6040518091039020815260200190815260200160002060010160008463ffffffff1681526020019081526020016000208054610a5190617301565b90501190509392505050565b610a65612d21565b60008103610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f906173a4565b60405180910390fd5b610ab1816136eb565b50565b610abc612d21565b60008103610aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690617410565b60405180910390fd5b8060078190555050565b6000610b5883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061372a565b90506000610b698260200151613407565b9050600060046000838051906020012081526020019081526020016000206001016000846040015163ffffffff1681526020019081526020016000208054610bb090617301565b905011610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be99061747c565b60405180910390fd5b6000610c0882846040015163ffffffff16613862565b9050610c1b816060015160600151612f9e565b610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5190616ca0565b60405180910390fd5b6000610c6d826060015160600151612fdb565b90506000610c7e83604001516130a0565b9050610c928360600151606001518261315c565b610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890616d0c565b60405180910390fd5b600060056000610ce8856020015160c001516131ab565b604001516002811115610cfe57610cfd61664c565b5b6002811115610d1057610d0f61664c565b5b815260200190815260200160002054905060008103610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90616d78565b60405180910390fd5b6000816348a3c57086896040518363ffffffff1660e01b8152600401610d8b929190617537565b6020604051808303816000875af1158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce919061717d565b90507f4d2d7be42668dce2927650393613e408fc71274deac16f825eb0a869a5667e8c856080015182604051610e059291906175be565b60405180910390a180610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061763a565b60405180910390fd5b505050505050505050565b610e60612d21565b610e6a60006136eb565b565b600080600360008585604051610e839291906172b9565b604051809103902081526020019081526020016000206000018054610ea790617301565b905011905092915050565b60056020528060005260406000206000915090505481565b60008054905090565b60026020528060005260406000206000915090508054610ef290617301565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1e90617301565b8015610f6b5780601f10610f4057610100808354040283529160200191610f6b565b820191906000526020600020905b815481529060010190602001808311610f4e57829003601f168201915b505050505081565b610f7b612d21565b6000610fca83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613931565b9050610fd581613aa5565b6000610fe082613cef565b90506000600360008381526020019081526020016000209050600081600001805461100a90617301565b90501115611101578484826000019190611025929190615fcd565b505b6110348360600151613d14565b156110fc5760006110488460600151613d29565b90506000826001016000838152602001908152602001600020805461106c90617301565b9050036110e7576110808460600151613d43565b82600101600083815260200190815260200160002090805190602001906110a8929190616053565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce83826040516110da92919061765a565b60405180910390a16110f6565b6110f48460600151613d43565b505b50611027565b6111e6565b8484826000019190611114929190615fcd565b505b6111238360600151613d14565b156111ae5760006111378460600151613d29565b90506111468460600151613d43565b826001016000838152602001908152602001600020908051906020019061116e929190616053565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce83826040516111a092919061765a565b60405180910390a150611116565b7fc115cf6e41eccaaf9dbe48f3cbf3e82c176644e35bf1cae0839627723d980a0d826040516111dd9190617683565b60405180910390a15b5050505050565b6111f5612d21565b60008163b93ba39c6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561122e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125291906176b3565b905060006005600083600281111561126d5761126c61664c565b5b600281111561127f5761127e61664c565b5b815260200190815260200160002054146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c59061772c565b60405180910390fd5b60068190806001815401808255809150506001900390600052602060002090602091828204019190069091909190916101000a81548160ff0219169083600281111561131d5761131c61664c565b5b0217905550816005600083600281111561133a5761133961664c565b5b600281111561134c5761134b61664c565b5b8152602001908152602001600020819055507f30469544067c713d17864302c985ca87e4822f68e28079cbf956f9deab7c8fff818360405161138f92919061774c565b60405180910390a15050565b6113a3612d21565b6000600560008360028111156113bc576113bb61664c565b5b60028111156113ce576113cd61664c565b5b8152602001908152602001600020540361141d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611414906177c1565b60405180910390fd5b6000600190505b600680549050811015611575578160028111156114445761144361664c565b5b60068281548110611458576114576177e1565b5b90600052602060002090602091828204019190069054906101000a900460ff16600281111561148a5761148961664c565b5b0361156257600660016006805490506114a3919061783f565b815481106114b4576114b36177e1565b5b90600052602060002090602091828204019190069054906101000a900460ff16600682815481106114e8576114e76177e1565b5b90600052602060002090602091828204019190066101000a81548160ff0219169083600281111561151c5761151b61664c565b5b0217905550600680548061153357611532617873565b5b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611575565b808061156d906178a2565b915050611424565b506005600082600281111561158d5761158c61664c565b5b600281111561159f5761159e61664c565b5b8152602001908152602001600020600090557f4ae9b990c01f3cf6322d2f72f0c0a7eefdcdb12b782e47f420dbc75314d7f508816040516115e091906166c3565b60405180910390a150565b60046020528060005260406000206000915090508060000154905081565b600360205280600052604060002060009150905080600001805461162c90617301565b80601f016020809104026020016040519081016040528092919081815260200182805461165890617301565b80156116a55780601f1061167a576101008083540402835291602001916116a5565b820191906000526020600020905b81548152906001019060200180831161168857829003601f168201915b5050505050905081565b6060600680548060200260200160405190810160405280929190818152602001828054801561173257602002820191906000526020600020906000905b82829054906101000a900460ff16600281111561170c5761170b61664c565b5b815260200190600101906020826000010492830192600103820291508084116116ec5790505b5050505050905090565b60075481565b6000600754905090565b6000806003600086866040516117639291906172b9565b604051809103902081526020019081526020016000206001016000848152602001908152602001600020805461179890617301565b90501190509392505050565b60606004600085856040516117ba9291906172b9565b6040518091039020815260200190815260200160002060010160008363ffffffff16815260200190815260200160002080546117f590617301565b80601f016020809104026020016040519081016040528092919081815260200182805461182190617301565b801561186e5780601f106118435761010080835404028352916020019161186e565b820191906000526020600020905b81548152906001019060200180831161185157829003601f168201915b505050505090509392505050565b60606003600085856040516118929291906172b9565b60405180910390208152602001908152602001600020600101600083815260200190815260200160002080546118c790617301565b80601f01602080910402602001604051908101604052809291908181526020018280546118f390617301565b80156119405780601f1061191557610100808354040283529160200191611940565b820191906000526020600020905b81548152906001019060200180831161192357829003601f168201915b505050505090509392505050565b600181805160208101820180518482526020830160208501208183528095505050505050600091509050805461198390617301565b80601f01602080910402602001604051908101604052809291908181526020018280546119af90617301565b80156119fc5780601f106119d1576101008083540402835291602001916119fc565b820191906000526020600020905b8154815290600101906020018083116119df57829003601f168201915b505050505081565b60606000600460008585604051611a1c9291906172b9565b604051809103902081526020019081526020016000209050806001016000826000015481526020019081526020016000208054611a5890617301565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8490617301565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b505050505091505092915050565b611ae76160d9565b611aef6160d9565b6000611afa84611f76565b905060005b816020015151811015611d1057600082602001518281518110611b2557611b246177e1565b5b60200260200101519050600061ffff16816000015161ffff1603611b5957611b4c81612128565b8460000181905250611cfc565b600161ffff16816000015161ffff1603611b8357611b7681612128565b8460200181905250611cfb565b600261ffff16816000015161ffff1603611be957611ba081612136565b60ff166003811115611bb557611bb461664c565b5b84604001906003811115611bcc57611bcb61664c565b5b90816003811115611be057611bdf61664c565b5b81525050611cfa565b600361ffff16816000015161ffff1603611c1b57611c0e611c098261214e565b613dd5565b8460600181905250611cf9565b600461ffff16816000015161ffff1603611c5c57611c388161215c565b846080019067ffffffffffffffff16908167ffffffffffffffff1681525050611cf8565b600561ffff16816000015161ffff1603611c9d57611c798161215c565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050611cf7565b600661ffff16816000015161ffff1603611cc757611cba8161214e565b8460c00181905250611cf6565b600761ffff16816000015161ffff1603611cf557611cec611ce78261214e565b613ed1565b8460e001819052505b5b5b5b5b5b5b5b508080611d08906178a2565b915050611aff565b508192505050919050565b611d23616150565b60006003811115611d3757611d3661664c565b5b82604001516003811115611d4e57611d4d61664c565b5b03611d6b57611d608260c00151613fe7565b602001519050611e7d565b60016003811115611d7f57611d7e61664c565b5b82604001516003811115611d9657611d9561664c565b5b03611db357611da88260c001516140da565b608001519050611e7d565b60026003811115611dc757611dc661664c565b5b82604001516003811115611dde57611ddd61664c565b5b03611dfb57611df08260c001516131ab565b606001519050611e7d565b600380811115611e0e57611e0d61664c565b5b82604001516003811115611e2557611e2461664c565b5b03611e4257611e378260c0015161428a565b604001519050611e7d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e749061795c565b60405180910390fd5b919050565b60606000600267ffffffffffffffff811115611ea157611ea0616ae0565b5b604051908082528060200260200182016040528015611eda57816020015b611ec761617c565b815260200190600190039081611ebf5790505b509050611f066000611f0185600001516001811115611efc57611efb61664c565b5b61217c565b612198565b81600081518110611f1a57611f196177e1565b5b6020026020010181905250611f346001846020015161222d565b81600181518110611f4857611f476177e1565b5b6020026020010181905250611f5b6161a7565b818160200181905250611f6d81612263565b92505050919050565b611f7e6161a7565b600682511015611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba906179c8565b60405180910390fd5b6000611fcd6161a7565b611fdf611fda858461237f565b6123ae565b816000019061ffff16908161ffff1681525050600682611fff91906179e8565b91506000808390505b85518110156120615761202f61202a8760028461202591906179e8565b6124d9565b61250a565b600661203b9190617a3e565b63ffffffff168161204c91906179e8565b90508180612059906178a2565b925050612008565b60008267ffffffffffffffff81111561207d5761207c616ae0565b5b6040519080825280602002602001820160405280156120b657816020015b6120a361617c565b81526020019060019003908161209b5790505b509050600092505b8651851015612112576120cf61617c565b6120d988876143a8565b8097508192505050808285806120ee906178a2565b965081518110612101576121006177e1565b5b6020026020010181905250506120be565b8084602001819052508395505050505050919050565b606081604001519050919050565b6000612147600183604001516126eb565b9050919050565b606081604001519050919050565b6000612175612170600884604001516126f9565b612707565b9050919050565b60008160018111156121915761219061664c565b5b9050919050565b6121a061617c565b6000600167ffffffffffffffff8111156121bd576121bc616ae0565b5b6040519080825280601f01601f1916602001820160405280156121ef5781602001600182028036833780820191505090505b5090506121fe60018483612a54565b60405180606001604052808561ffff168152602001600163ffffffff1681526020018281525091505092915050565b61223561617c565b60405180606001604052808461ffff168152602001835163ffffffff16815260200183815250905092915050565b6060600061227083612a6b565b905060006006826122819190617a3e565b63ffffffff1667ffffffffffffffff8111156122a05761229f616ae0565b5b6040519080825280601f01601f1916602001820160405280156122d25781602001600182028036833780820191505090505b5090506122ed60026122e786600001516123ae565b83612aeb565b61230160066122fb8461250a565b83612b02565b60006006905060005b61231386612b19565b81101561237357600061234387602001518381518110612336576123356177e1565b5b6020026020010151612b28565b9050612350838286612bda565b80518361235d91906179e8565b925050808061236b906178a2565b91505061230a565b50819350505050919050565b6000825160028361239091906179e8565b111561239b57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff8111156123d4576123d3616ae0565b5b6040519080825280601f01601f1916602001820160405280156124065781602001600182028036833780820191505090505b5090508160016002811061241d5761241c6177e1565b5b1a60f81b81600081518110612435576124346177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060028110612478576124776177e1565b5b1a60f81b816001815181106124905761248f6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006124cc82600061237f565b9050809350505050919050565b600082516004836124ea91906179e8565b11156124f557600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff8111156125305761252f616ae0565b5b6040519080825280601f01601f1916602001820160405280156125625781602001600182028036833780820191505090505b50905081600360048110612579576125786177e1565b5b1a60f81b81600081518110612591576125906177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106125d4576125d36177e1565b5b1a60f81b816001815181106125ec576125eb6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016004811061262f5761262e6177e1565b5b1a60f81b81600281518110612647576126466177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006004811061268a576126896177e1565b5b1a60f81b816003815181106126a2576126a16177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006126de8260006124d9565b9050809350505050919050565b600082820151905092915050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff81111561272d5761272c616ae0565b5b6040519080825280601f01601f19166020018201604052801561275f5781602001600182028036833780820191505090505b50905081600760088110612776576127756177e1565b5b1a60f81b8160008151811061278e5761278d6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816006600881106127d1576127d06177e1565b5b1a60f81b816001815181106127e9576127e86177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160056008811061282c5761282b6177e1565b5b1a60f81b81600281518110612844576128436177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600460088110612887576128866177e1565b5b1a60f81b8160038151811061289f5761289e6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816003600881106128e2576128e16177e1565b5b1a60f81b816004815181106128fa576128f96177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026008811061293d5761293c6177e1565b5b1a60f81b81600581518110612955576129546177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160088110612998576129976177e1565b5b1a60f81b816006815181106129b0576129af6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600881106129f3576129f26177e1565b5b1a60f81b81600781518110612a0b57612a0a6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612a478260006144f0565b9050809350505050919050565b828101600181038051848352808252505050505050565b6000806000905060005b612a7e84612b19565b811015612ae157600084602001518281518110612a9e57612a9d6177e1565b5b60200260200101519050806040015151600684612abb9190617a3e565b63ffffffff16612acb91906179e8565b9250508080612ad9906178a2565b915050612a75565b5080915050919050565b828101600281038051848352808252505050505050565b828101600481038051848352808252505050505050565b60008160200151519050919050565b6060600060068360200151612b3d9190617a3e565b63ffffffff1667ffffffffffffffff811115612b5c57612b5b616ae0565b5b6040519080825280601f01601f191660200182016040528015612b8e5781602001600182028036833780820191505090505b509050612ba96002612ba385600001516123ae565b83612aeb565b612bc16006612bbb856020015161250a565b83612b02565b612bd16006846040015183612bda565b80915050919050565b60008251905081518163ffffffff1685612bf491906179e8565b1115612c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2c90617b10565b60405180910390fd5b801560008103612c85578483018051601f84168015602002818801018581018215602002838601015b81831015612c7b5782518152602083019250602081019050612c5e565b5083855250505050505b5050505050565b606083518284612c9c91906179e8565b1115612ca757600080fd5b60008267ffffffffffffffff811115612cc357612cc2616ae0565b5b6040519080825280601f01601f191660200182016040528015612cf55781602001600182028036833780820191505090505b5090506000806020830191508560208801019050612d14828287614525565b8293505050509392505050565b612d296145ae565b612d31610eca565b14612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6890617b7c565b60405180910390fd5b565b612d7b6161c5565b612d836161c5565b6000612d8e84611f76565b905060005b816020015151811015612f9357600082602001518281518110612db957612db86177e1565b5b60200260200101519050600061ffff16816000015161ffff1603612dfc57612de0816145b6565b846000019063ffffffff16908163ffffffff1681525050612f7f565b600161ffff16816000015161ffff1603612e3557612e19816145b6565b846020019063ffffffff16908163ffffffff1681525050612f7e565b600261ffff16816000015161ffff1603612e5f57612e52816145d6565b8460400181905250612f7d565b600361ffff16816000015161ffff1603612e9157612e84612e7f8261214e565b6131ab565b8460600181905250612f7c565b600461ffff16816000015161ffff1603612ec357612eb6612eb18261214e565b6145e4565b8460800181905250612f7b565b600561ffff16816000015161ffff1603612efc57612ee0816145b6565b8460a0019063ffffffff16908163ffffffff1681525050612f7a565b600661ffff16816000015161ffff1603612f2657612f1981612128565b8460c00181905250612f79565b600761ffff16816000015161ffff1603612f5057612f438161214e565b8460e00181905250612f78565b60ff61ffff16816000015161ffff1603612f7757612f6d8161214e565b8461010001819052505b5b5b5b5b5b5b5b5b508080612f8b906178a2565b915050612d93565b508192505050919050565b60008060036000612fae85611e82565b8051906020012081526020019081526020016000206000018054612fd190617301565b9050119050919050565b612fe361622f565b61309960036000612ff385611e82565b805190602001208152602001908152602001600020600001805461301690617301565b80601f016020809104026020016040519081016040528092919081815260200182805461304290617301565b801561308f5780601f106130645761010080835404028352916020019161308f565b820191906000526020600020905b81548152906001019060200180831161307257829003601f168201915b5050505050613931565b9050919050565b6000808251905060208111156130eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e290617c0e565b60405180910390fd5b60008167ffffffffffffffff81111561310757613106616ae0565b5b6040519080825280601f01601f1916602001820160405280156131395781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b6000806003600061316c86611e82565b805190602001208152602001908152602001600020600101600084815260200190815260200160002080546131a090617301565b905011905092915050565b6131b3616271565b6131bb616271565b60006131c684611f76565b905060005b816020015151811015613325576000826020015182815181106131f1576131f06177e1565b5b60200260200101519050600061ffff16816000015161ffff16036132255761321881612128565b8460000181905250613311565b600161ffff16816000015161ffff160361324f5761324281612128565b8460200181905250613310565b600261ffff16816000015161ffff16036132b55761326c81612136565b60ff1660028111156132815761328061664c565b5b846040019060028111156132985761329761664c565b5b908160028111156132ac576132ab61664c565b5b8152505061330f565b600361ffff16816000015161ffff16036132e7576132da6132d58261214e565b613dd5565b846060018190525061330e565b600461ffff16816000015161ffff160361330d576133048161214e565b84608001819052505b5b5b5b5b50808061331d906178a2565b9150506131cb565b508192505050919050565b6133386162b8565b6133ff6003600061334886611e82565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461337c90617301565b80601f01602080910402602001604051908101604052809291908181526020018280546133a890617301565b80156133f55780601f106133ca576101008083540402835291602001916133f5565b820191906000526020600020905b8154815290600101906020018083116133d857829003601f168201915b50505050506146f9565b905092915050565b6060806000801b836020015114801561342657506000801b8360400151145b156134bd57600167ffffffffffffffff81111561344657613445616ae0565b5b60405190808252806020026020018201604052801561347f57816020015b61346c61617c565b8152602001906001900390816134645790505b509050613499600061349485600001516147b9565b61222d565b816000815181106134ad576134ac6177e1565b5b60200260200101819052506136c8565b6000801b8360200151141580156134db57506000801b836040015114155b1561368c57600367ffffffffffffffff8111156134fb576134fa616ae0565b5b60405190808252806020026020018201604052801561353457816020015b61352161617c565b8152602001906001900390816135195790505b50905061354e600061354985600001516147b9565b61222d565b81600081518110613562576135616177e1565b5b60200260200101819052506000602067ffffffffffffffff81111561358a57613589616ae0565b5b6040519080825280601f01601f1916602001820160405280156135bc5781602001600182028036833780820191505090505b5090506135cf602085602001518361492b565b6135da60018261222d565b826001815181106135ee576135ed6177e1565b5b60200260200101819052506000602067ffffffffffffffff81111561361657613615616ae0565b5b6040519080825280601f01601f1916602001820160405280156136485781602001600182028036833780820191505090505b50905061365b602086604001518361492b565b61366660028261222d565b8360028151811061367a576136796177e1565b5b602002602001018190525050506136c7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136be90617c7a565b60405180910390fd5b5b6136d06161a7565b8181602001819052506136e281612263565b92505050919050565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b6137326162d2565b61373a6162d2565b600061374584611f76565b905060005b816020015151811015613857576000826020015182815181106137705761376f6177e1565b5b60200260200101519050600561ffff16816000015161ffff16036137ac5761379f61379a8261214e565b614935565b8460000181905250613843565b61010161ffff16816000015161ffff16036137df576137d26137cd8261214e565b6145e4565b8460200181905250613842565b61010061ffff16816000015161ffff1603613819576137fd816145b6565b846040019063ffffffff16908163ffffffff1681525050613841565b6101ff61ffff16816000015161ffff1603613840576138378161214e565b84606001819052505b5b5b5b50808061384f906178a2565b91505061374a565b508192505050919050565b61386a6161c5565b6139296004600085805190602001208152602001908152602001600020600101600084815260200190815260200160002080546138a690617301565b80601f01602080910402602001604051908101604052809291908181526020018280546138d290617301565b801561391f5780601f106138f45761010080835404028352916020019161391f565b820191906000526020600020905b81548152906001019060200180831161390257829003601f168201915b5050505050612d73565b905092915050565b61393961622f565b61394161622f565b600061394c84611f76565b905060005b816020015151811015613a9a57600082602001518281518110613977576139766177e1565b5b60200260200101519050600061ffff16816000015161ffff16036139ab5761399e81612128565b8460000181905250613a86565b600161ffff16816000015161ffff16036139dd576139d06139cb8261214e565b611adf565b8460200181905250613a85565b600261ffff16816000015161ffff1603613a07576139fa8161214e565b8460400181905250613a84565b600361ffff16816000015161ffff1603613a3157613a24816149ca565b8460600181905250613a83565b600461ffff16816000015161ffff1603613a5b57613a4e81612128565b8460800181905250613a82565b600561ffff16816000015161ffff1603613a8157613a788161214e565b8460a001819052505b5b5b5b5b5b508080613a92906178a2565b915050613951565b508192505050919050565b6000613ab8826020015160600151611e82565b8051906020012090506000600260008381526020019081526020016000208054613ae190617301565b905011613b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1a90617ce6565b60405180910390fd5b6000613be6600160026000858152602001908152602001600020604051613b4a9190617da5565b90815260200160405180910390208054613b6390617301565b80601f0160208091040260200160405190810160405280929190818152602001828054613b8f90617301565b8015613bdc5780601f10613bb157610100808354040283529160200191613bdc565b820191906000526020600020905b815481529060010190602001808311613bbf57829003601f168201915b5050505050611adf565b9050613c386040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b31000000000000000000008152508260e00151604001516149f390919063ffffffff16565b15613ca257600080613c57838660200151614a0e90919063ffffffff16565b91509150818190613c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c95919061694f565b60405180910390fd5b5050505b613cab83614c14565b613cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ce190617e08565b60405180910390fd5b505050565b6000613d06613d018360200151611d1b565b611e82565b805190602001209050919050565b60008160200151518260000151109050919050565b6000613d3c613d3783613d43565b6130a0565b9050919050565b6060816020015151826000015110613d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8790617e9a565b60405180910390fd5b6000613da483600001518460200151614c45565b9050805160048460000151613db991906179e8565b613dc391906179e8565b83600001818152505080915050919050565b613ddd616150565b613de5616150565b6000613df084611f76565b905060005b816020015151811015613ec657600082602001518281518110613e1b57613e1a6177e1565b5b60200260200101519050600061ffff16816000015161ffff1603613e8b57613e4281612136565b60ff166001811115613e5757613e5661664c565b5b84600001906001811115613e6e57613e6d61664c565b5b90816001811115613e8257613e8161664c565b5b81525050613eb2565b600161ffff16816000015161ffff1603613eb157613ea88161214e565b84602001819052505b5b508080613ebe906178a2565b915050613df5565b508192505050919050565b613ed961630c565b613ee161630c565b6000613eec84611f76565b905060005b816020015151811015613fdc57600082602001518281518110613f1757613f166177e1565b5b60200260200101519050600061ffff16816000015161ffff1603613f4b57613f3e81612128565b8460000181905250613fc8565b600161ffff16816000015161ffff1603613f7557613f688161214e565b8460200181905250613fc7565b600261ffff16816000015161ffff1603613f9f57613f9281612128565b8460400181905250613fc6565b600361ffff16816000015161ffff1603613fc557613fbc8161214e565b84606001819052505b5b5b5b508080613fd4906178a2565b915050613ef1565b508192505050919050565b613fef616334565b613ff7616334565b600061400284611f76565b905060005b8160200151518110156140cf5760008260200151828151811061402d5761402c6177e1565b5b60200260200101519050600061ffff16816000015161ffff16036140615761405481612128565b84600001819052506140bb565b600161ffff16816000015161ffff1603614093576140866140818261214e565b613dd5565b84602001819052506140ba565b600261ffff16816000015161ffff16036140b9576140b08161214e565b84604001819052505b5b5b5080806140c7906178a2565b915050614007565b508192505050919050565b6140e261635b565b6140ea61635b565b60006140f584611f76565b905060005b81602001515181101561427f576000826020015182815181106141205761411f6177e1565b5b60200260200101519050600061ffff16816000015161ffff16036141545761414781612128565b846000018190525061426b565b600161ffff16816000015161ffff16036141ba5761417181612136565b60ff1660018111156141865761418561664c565b5b8460200190600181111561419d5761419c61664c565b5b908160018111156141b1576141b061664c565b5b8152505061426a565b600261ffff16816000015161ffff16036141e4576141d781612128565b8460400181905250614269565b600361ffff16816000015161ffff160361420e5761420181612128565b8460600181905250614268565b600461ffff16816000015161ffff16036142405761423361422e8261214e565b613dd5565b8460800181905250614267565b600561ffff16816000015161ffff16036142665761425d8161214e565b8460a001819052505b5b5b5b5b5b508080614277906178a2565b9150506140fa565b508192505050919050565b6142926163a9565b61429a6163a9565b60006142a584611f76565b905060005b81602001515181101561439d576000826020015182815181106142d0576142cf6177e1565b5b60200260200101519050600061ffff16816000015161ffff1603614304576142f781612128565b8460000181905250614389565b600161ffff16816000015161ffff160361432e5761432181612128565b8460200181905250614388565b600361ffff16816000015161ffff16036143605761435361434e8261214e565b613dd5565b8460400181905250614387565b600461ffff16816000015161ffff16036143865761437d8161214e565b84606001819052505b5b5b5b508080614395906178a2565b9150506142aa565b508192505050919050565b6143b061617c565b6000828451116143f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143ec90617f2c565b60405180910390fd5b6006831015614439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161443090617f98565b60405180910390fd5b61444161617c565b61445361444e868661237f565b6123ae565b816000019061ffff16908161ffff168152505060028461447391906179e8565b935061448761448286866124d9565b61250a565b816020019063ffffffff16908163ffffffff16815250506004846144ab91906179e8565b93506144c28585836020015163ffffffff16612c8c565b8160400181905250806020015163ffffffff16846144e091906179e8565b9350808492509250509250929050565b6000825160088361450191906179e8565b111561450c57600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b60208110614564578151835260208361453f91906179e8565b925060208261454e91906179e8565b915060208161455d919061783f565b9050614526565b60008103156145a9576000600182602061457e919061783f565b61010061458b91906180eb565b614595919061783f565b905080198351168185511681811786525050505b505050565b600033905090565b60006145cf6145ca60048460400151614cec565b61250a565b9050919050565b606081604001519050919050565b6145ec6163d7565b6145f46163d7565b60006145ff84611f76565b905060005b8160200151518110156146ee5760008260200151828151811061462a576146296177e1565b5b60200260200101519050600061ffff16816000015161ffff1603614666576146596146548261214e565b614cfa565b84600001819052506146da565b600161ffff16816000015161ffff16036146a15760006146858261214e565b9050614692815182614dba565b856020018181525050506146d9565b600261ffff16816000015161ffff16036146d85760006146c08261214e565b90506146cd815182614dba565b856040018181525050505b5b5b5080806146e6906178a2565b915050614604565b508192505050919050565b6147016162b8565b6147096162b8565b600061471484611f76565b905060005b8160200151518110156147ae5760008260200151828151811061473f5761473e6177e1565b5b60200260200101519050600061ffff16816000015161ffff160361477357614766816145d6565b846000018190525061479a565b600161ffff16816000015161ffff1603614799576147908161214e565b84602001819052505b5b5080806147a6906178a2565b915050614719565b508192505050919050565b6060806000836020015151111561488257600267ffffffffffffffff8111156147e5576147e4616ae0565b5b60405190808252806020026020018201604052801561481e57816020015b61480b61617c565b8152602001906001900390816148035790505b50905061483060008460000151614dc8565b81600081518110614844576148436177e1565b5b602002602001018190525061485e60018460200151614dc8565b81600181518110614872576148716177e1565b5b6020026020010181905250614908565b600167ffffffffffffffff81111561489d5761489c616ae0565b5b6040519080825280602002602001820160405280156148d657816020015b6148c361617c565b8152602001906001900390816148bb5790505b5090506148e860008460000151614dc8565b816000815181106148fc576148fb6177e1565b5b60200260200101819052505b6149106161a7565b81816020018190525061492281612263565b92505050919050565b8183820152505050565b61493d616404565b614945616404565b600061495084611f76565b905060005b8160200151518110156149bf5760008260200151828151811061497b5761497a6177e1565b5b60200260200101519050600061ffff16816000015161ffff16036149ab576149a28161214e565b84600001819052505b5080806149b7906178a2565b915050614955565b508192505050919050565b6149d2616417565b60405180604001604052806000815260200183604001518152509050919050565b60008180519060200120838051906020012014905092915050565b6000606060006003811115614a2657614a2561664c565b5b83604001516003811115614a3d57614a3c61664c565b5b03614a9d576000614a518460c00151613fe7565b9050614a6e81602001518660600151614e0490919063ffffffff16565b614a97576000604051806060016040528060288152602001618602602891399250925050614c0d565b50614ba1565b60016003811115614ab157614ab061664c565b5b83604001516003811115614ac857614ac761664c565b5b03614b7c576000614adc8460c001516140da565b9050600180811115614af157614af061664c565b5b81602001516001811115614b0857614b0761664c565b5b14614b325760006040518060800160405280605381526020016185af605391399250925050614c0d565b614b4d81608001518660600151614e0490919063ffffffff16565b614b76576000604051806060016040528060288152602001618602602891399250925050614c0d565b50614ba0565b60006040518060600160405280603d815260200161854b603d913991509150614c0d565b5b614bcd8460e0015160400151614bb685614e2f565b614bbf87614fa0565b8760e0015160600151615182565b15614bed5760016040518060200160405280600081525091509150614c0d565b600060405180606001604052806027815260200161858860279139915091505b9250929050565b6000614c3e8260800151614c2b8460200151614e2f565b614c3485615362565b8560a00151615182565b9050919050565b6060600483614c5491906179e8565b92506000614c6a614c658585614cec565b6154d2565b63ffffffff1690506060811560008114614c8f57604051915060208201604052614ce0565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015614ccd5780518352602083019250602081019050614cb0565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b614d02616431565b614d0a616431565b6000614d1584611f76565b905060005b816020015151811015614daf57600082602001518281518110614d4057614d3f6177e1565b5b60200260200101519050600061ffff16816000015161ffff1603614d7457614d6781612128565b8460000181905250614d9b565b600161ffff16816000015161ffff1603614d9a57614d9181612128565b84602001819052505b5b508080614da7906178a2565b915050614d1a565b508192505050919050565b600082820151905092915050565b614dd061617c565b600082905060405180606001604052808561ffff168152602001825163ffffffff1681526020018281525091505092915050565b6000614e0f82611e82565b80519060200120614e1f84611e82565b8051906020012014905092915050565b606060006003811115614e4557614e4461664c565b5b82604001516003811115614e5c57614e5b61664c565b5b03614e7d57614e76614e718360c00151613fe7565b6156b3565b9050614f9b565b60016003811115614e9157614e9061664c565b5b82604001516003811115614ea857614ea761664c565b5b03614ec957614ec2614ebd8360c001516140da565b6156d7565b9050614f9b565b60026003811115614edd57614edc61664c565b5b82604001516003811115614ef457614ef361664c565b5b03614f1557614f0e614f098360c001516131ab565b6156fb565b9050614f9b565b600380811115614f2857614f2761664c565b5b82604001516003811115614f3f57614f3e61664c565b5b03614f6057614f59614f548360c0015161428a565b61571f565b9050614f9b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614f92906181a8565b60405180910390fd5b919050565b60606000600767ffffffffffffffff811115614fbf57614fbe616ae0565b5b604051908082528060200260200182016040528015614ff857816020015b614fe561617c565b815260200190600190039081614fdd5790505b50905061500a60008460000151614dc8565b8160008151811061501e5761501d6177e1565b5b602002602001018190525061503860018460200151614dc8565b8160018151811061504c5761504b6177e1565b5b6020026020010181905250615080600261507b856040015160038111156150765761507561664c565b5b615743565b612198565b81600281518110615094576150936177e1565b5b60200260200101819052506150b660036150b18560600151611e82565b61222d565b816003815181106150ca576150c96177e1565b5b60200260200101819052506150e46004846080015161575f565b816004815181106150f8576150f76177e1565b5b602002602001018190525061511260058460a0015161575f565b81600581518110615126576151256177e1565b5b602002602001018190525061514060068460c0015161222d565b81600681518110615154576151536177e1565b5b60200260200101819052506151676161a7565b81816020018190525061517981612263565b92505050919050565b60006151cc6040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b3100000000000000000000815250866149f390919063ffffffff16565b61520b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016152029061823a565b60405180910390fd5b604182511015615250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615247906182a6565b60405180910390fd5b601b82604081518110615266576152656177e1565b5b602001015160f81c60f81b60f81c61527e91906182d3565b60f81b82604081518110615295576152946177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006152e06152d2866157fc565b858051906020012085615858565b9050601b836040815181106152f8576152f76177e1565b5b602001015160f81c60f81b60f81c615310919061830a565b60f81b83604081518110615327576153266177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080915050949350505050565b60606000600567ffffffffffffffff81111561538157615380616ae0565b5b6040519080825280602002602001820160405280156153ba57816020015b6153a761617c565b81526020019060019003908161539f5790505b5090506153cc60008460000151614dc8565b816000815181106153e0576153df6177e1565b5b602002602001018190525061540260016153fd85602001516158bb565b61222d565b81600181518110615416576154156177e1565b5b60200260200101819052506154306002846040015161222d565b81600281518110615444576154436177e1565b5b6020026020010181905250615462600384606001516020015161222d565b81600381518110615476576154756177e1565b5b602002602001018190525061549060048460800151614dc8565b816004815181106154a4576154a36177e1565b5b60200260200101819052506154b76161a7565b8181602001819052506154c981612263565b92505050919050565b6000808260e01b90506000600467ffffffffffffffff8111156154f8576154f7616ae0565b5b6040519080825280601f01601f19166020018201604052801561552a5781602001600182028036833780820191505090505b50905081600360048110615541576155406177e1565b5b1a60f81b81600081518110615559576155586177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026004811061559c5761559b6177e1565b5b1a60f81b816001815181106155b4576155b36177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600481106155f7576155f66177e1565b5b1a60f81b8160028151811061560f5761560e6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110615652576156516177e1565b5b1a60f81b8160038151811061566a576156696177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006156a6826000615ad3565b9050809350505050919050565b60606156d082604001518360200151615b0490919063ffffffff16565b9050919050565b60606156f48260a001518360800151615b0490919063ffffffff16565b9050919050565b606061571882608001518360600151615b0490919063ffffffff16565b9050919050565b606061573c82606001518360400151615b0490919063ffffffff16565b9050919050565b60008160038111156157585761575761664c565b5b9050919050565b61576761617c565b6000600867ffffffffffffffff81111561578457615783616ae0565b5b6040519080825280601f01601f1916602001820160405280156157b65781602001600182028036833780820191505090505b5090506157cd60086157c785612707565b83615c4b565b60405180606001604052808561ffff168152602001600863ffffffff1681526020018281525091505092915050565b600060028260405161580e919061836f565b602060405180830381855afa15801561582b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061584e919061839b565b60001c9050919050565b60008060006158678585615c62565b915091506000600481111561587f5761587e61664c565b5b8160048111156158925761589161664c565b5b14801561589e57508582145b806158b057506158af868686615cb3565b5b925050509392505050565b60606000600867ffffffffffffffff8111156158da576158d9616ae0565b5b60405190808252806020026020018201604052801561591357816020015b61590061617c565b8152602001906001900390816158f85790505b50905061592560008460000151614dc8565b81600081518110615939576159386177e1565b5b602002602001018190525061595360018460200151614dc8565b81600181518110615967576159666177e1565b5b602002602001018190525061599b6002615996856040015160038111156159915761599061664c565b5b615743565b612198565b816002815181106159af576159ae6177e1565b5b60200260200101819052506159d160036159cc8560600151611e82565b61222d565b816003815181106159e5576159e46177e1565b5b60200260200101819052506159ff6004846080015161575f565b81600481518110615a1357615a126177e1565b5b6020026020010181905250615a2d60058460a0015161575f565b81600581518110615a4157615a406177e1565b5b6020026020010181905250615a5b60068460c0015161222d565b81600681518110615a6f57615a6e6177e1565b5b6020026020010181905250615a916007615a8c8560e00151615de1565b61222d565b81600781518110615aa557615aa46177e1565b5b6020026020010181905250615ab86161a7565b818160200181905250615aca81612263565b92505050919050565b60008251600483615ae491906179e8565b1115615aef57600080fd5b63ffffffff8260048501015116905092915050565b606060006001811115615b1a57615b1961664c565b5b83600001516001811115615b3157615b3061664c565b5b14615b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b689061843a565b60405180910390fd5b60408360200151511015615bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615bb1906184a6565b60405180910390fd5b600083602001519050600060408251615bd3919061783f565b90506000604067ffffffffffffffff811115615bf257615bf1616ae0565b5b6040519080825280601f01601f191660200182016040528015615c245781602001600182028036833780820191505090505b50905081602084010151602082015281604084010151604082015280935050505092915050565b828101600881038051848352808252505050505050565b6000806041835103615ca35760008060006020860151925060408601519150606086015160001a9050615c9787828585615f17565b94509450505050615cac565b60006002915091505b9250929050565b600080600085631626ba7e60e01b8686604051602401615cd49291906184c6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051615d3e919061836f565b600060405180830381855afa9150503d8060008114615d79576040519150601f19603f3d011682016040523d82523d6000602084013e615d7e565b606091505b5091509150818015615d9257506020815110155b8015615dd65750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190615dd4919061839b565b145b925050509392505050565b60606000600467ffffffffffffffff811115615e0057615dff616ae0565b5b604051908082528060200260200182016040528015615e3957816020015b615e2661617c565b815260200190600190039081615e1e5790505b509050615e4b60008460000151614dc8565b81600081518110615e5f57615e5e6177e1565b5b6020026020010181905250615e796001846020015161222d565b81600181518110615e8d57615e8c6177e1565b5b6020026020010181905250615ea760028460400151614dc8565b81600281518110615ebb57615eba6177e1565b5b6020026020010181905250615ed56003846060015161222d565b81600381518110615ee957615ee86177e1565b5b6020026020010181905250615efc6161a7565b818160200181905250615f0e81612263565b92505050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115615f52576000600391509150615fc4565b600060018787878760405160008152602001604052604051615f779493929190618505565b6020604051602081039080840390855afa158015615f99573d6000803e3d6000fd5b50505060206040510351905060008103615fbb57600060019250925050615fc4565b80600092509250505b94509492505050565b828054615fd990617301565b90600052602060002090601f016020900481019282615ffb5760008555616042565b82601f1061601457803560ff1916838001178555616042565b82800160010185558215616042579182015b82811115616041578235825591602001919060010190616026565b5b50905061604f919061644b565b5090565b82805461605f90617301565b90600052602060002090601f01602090048101928261608157600085556160c8565b82601f1061609a57805160ff19168380011785556160c8565b828001600101855582156160c8579182015b828111156160c75782518255916020019190600101906160ac565b5b5090506160d5919061644b565b5090565b6040518061010001604052806060815260200160608152602001600060038111156161075761610661664c565b5b8152602001616114616150565b8152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016060815260200161614a61630c565b81525090565b60405180604001604052806000600181111561616f5761616e61664c565b5b8152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b604051806101200160405280600063ffffffff168152602001600063ffffffff168152602001606081526020016161fa616271565b81526020016162076163d7565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040518060c00160405280606081526020016162496160d9565b81526020016060815260200161625d616417565b815260200160608152602001606081525090565b6040518060a0016040528060608152602001606081526020016000600281111561629e5761629d61664c565b5b81526020016162ab616150565b8152602001606081525090565b604051806040016040528060608152602001606081525090565b60405180608001604052806162e5616404565b81526020016162f26163d7565b8152602001600063ffffffff168152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b60405180606001604052806060815260200161634e616150565b8152602001606081525090565b6040518060c0016040528060608152602001600060018111156163815761638061664c565b5b8152602001606081526020016060815260200161639c616150565b8152602001606081525090565b604051806080016040528060608152602001606081526020016163ca616150565b8152602001606081525090565b60405180606001604052806163ea616431565b815260200160008019168152602001600080191681525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001606081525090565b5b8082111561646457600081600090555060010161644c565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126164a1576164a061647c565b5b8235905067ffffffffffffffff8111156164be576164bd616481565b5b6020830191508360018202830111156164da576164d9616486565b5b9250929050565b600080602083850312156164f8576164f7616472565b5b600083013567ffffffffffffffff81111561651657616515616477565b5b6165228582860161648b565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561656857808201518184015260208101905061654d565b83811115616577576000848401525b50505050565b6000601f19601f8301169050919050565b60006165998261652e565b6165a38185616539565b93506165b381856020860161654a565b6165bc8161657d565b840191505092915050565b600060208201905081810360008301526165e1818461658e565b905092915050565b6000819050919050565b6165fc816165e9565b811461660757600080fd5b50565b600081359050616619816165f3565b92915050565b60006020828403121561663557616634616472565b5b60006166438482850161660a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061668c5761668b61664c565b5b50565b600081905061669d8261667b565b919050565b60006166ad8261668f565b9050919050565b6166bd816166a2565b82525050565b60006020820190506166d860008301846166b4565b92915050565b600063ffffffff82169050919050565b6166f7816166de565b811461670257600080fd5b50565b600081359050616714816166ee565b92915050565b60008060006040848603121561673357616732616472565b5b600084013567ffffffffffffffff81111561675157616750616477565b5b61675d8682870161648b565b9350935050602061677086828701616705565b9150509250925092565b60008115159050919050565b61678f8161677a565b82525050565b60006020820190506167aa6000830184616786565b92915050565b60006167bb826165e9565b9050919050565b6167cb816167b0565b81146167d657600080fd5b50565b6000813590506167e8816167c2565b92915050565b60006020828403121561680457616803616472565b5b6000616812848285016167d9565b91505092915050565b6003811061682857600080fd5b50565b60008135905061683a8161681b565b92915050565b60006020828403121561685657616855616472565b5b60006168648482850161682b565b91505092915050565b616876816167b0565b82525050565b6000602082019050616891600083018461686d565b92915050565b6000819050919050565b6168aa81616897565b81146168b557600080fd5b50565b6000813590506168c7816168a1565b92915050565b6000602082840312156168e3576168e2616472565b5b60006168f1848285016168b8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616921826168fa565b61692b8185616905565b935061693b81856020860161654a565b6169448161657d565b840191505092915050565b600060208201905081810360008301526169698184616916565b905092915050565b61697a816165e9565b82525050565b60006020820190506169956000830184616971565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6169d0816166a2565b82525050565b60006169e283836169c7565b60208301905092915050565b6000602082019050919050565b6000616a068261699b565b616a1081856169a6565b9350616a1b836169b7565b8060005b83811015616a4c578151616a3388826169d6565b9750616a3e836169ee565b925050600181019050616a1f565b5085935050505092915050565b60006020820190508181036000830152616a7381846169fb565b905092915050565b600080600060408486031215616a9457616a93616472565b5b600084013567ffffffffffffffff811115616ab257616ab1616477565b5b616abe8682870161648b565b93509350506020616ad18682870161660a565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616b188261657d565b810181811067ffffffffffffffff82111715616b3757616b36616ae0565b5b80604052505050565b6000616b4a616468565b9050616b568282616b0f565b919050565b600067ffffffffffffffff821115616b7657616b75616ae0565b5b616b7f8261657d565b9050602081019050919050565b82818337600083830152505050565b6000616bae616ba984616b5b565b616b40565b905082815260208101848484011115616bca57616bc9616adb565b5b616bd5848285616b8c565b509392505050565b600082601f830112616bf257616bf161647c565b5b8135616c02848260208601616b9b565b91505092915050565b600060208284031215616c2157616c20616472565b5b600082013567ffffffffffffffff811115616c3f57616c3e616477565b5b616c4b84828501616bdd565b91505092915050565b7f6e6f2070746320747275737420726f6f7420666f756e64000000000000000000600082015250565b6000616c8a601783616905565b9150616c9582616c54565b602082019050919050565b60006020820190508181036000830152616cb981616c7d565b9050919050565b7f6e6f207074632076657269667920616e63686f7220666f756e64000000000000600082015250565b6000616cf6601a83616905565b9150616d0182616cc0565b602082019050919050565b60006020820190508181036000830152616d2581616ce9565b9050919050565b7f6e6f207074632076656966696572207365740000000000000000000000000000600082015250565b6000616d62601283616905565b9150616d6d82616d2c565b602082019050919050565b60006020820190508181036000830152616d9181616d55565b9050919050565b600082825260208201905092915050565b6000616db48261652e565b616dbe8185616d98565b9350616dce81856020860161654a565b616dd78161657d565b840191505092915050565b60006040830160008301518482036000860152616dff8282616da9565b91505060208301518482036020860152616e198282616da9565b9150508091505092915050565b616e2f816166de565b82525050565b600082825260208201905092915050565b6000616e51826168fa565b616e5b8185616e35565b9350616e6b81856020860161654a565b616e748161657d565b840191505092915050565b60028110616e9057616e8f61664c565b5b50565b6000819050616ea182616e7f565b919050565b6000616eb182616e93565b9050919050565b616ec181616ea6565b82525050565b6000604083016000830151616edf6000860182616eb8565b5060208301518482036020860152616ef78282616da9565b9150508091505092915050565b600060a0830160008301518482036000860152616f218282616e46565b91505060208301518482036020860152616f3b8282616e46565b9150506040830151616f5060408601826169c7565b5060608301518482036060860152616f688282616ec7565b91505060808301518482036080860152616f828282616da9565b9150508091505092915050565b60006040830160008301518482036000860152616fac8282616e46565b91505060208301518482036020860152616fc68282616e46565b9150508091505092915050565b616fdc81616897565b82525050565b60006060830160008301518482036000860152616fff8282616f8f565b91505060208301516170146020860182616fd3565b5060408301516170276040860182616fd3565b508091505092915050565b60006101208301600083015161704b6000860182616e26565b50602083015161705e6020860182616e26565b50604083015184820360408601526170768282616da9565b915050606083015184820360608601526170908282616f04565b915050608083015184820360808601526170aa8282616fe2565b91505060a08301516170bf60a0860182616e26565b5060c083015184820360c08601526170d78282616e46565b91505060e083015184820360e08601526170f18282616da9565b91505061010083015184820361010086015261710d8282616da9565b9150508091505092915050565b600060408201905081810360008301526171348185616de2565b905081810360208301526171488184617032565b90509392505050565b61715a8161677a565b811461716557600080fd5b50565b60008151905061717781617151565b92915050565b60006020828403121561719357617192616472565b5b60006171a184828501617168565b91505092915050565b7f6661696c656420746f2076657269667920747062746100000000000000000000600082015250565b60006171e0601683616905565b91506171eb826171aa565b602082019050919050565b6000602082019050818103600083015261720f816171d3565b9050919050565b61721f81616897565b82525050565b6000819050919050565b600061724a617245617240846166de565b617225565b6165e9565b9050919050565b61725a8161722f565b82525050565b60006040820190506172756000830185617216565b6172826020830184617251565b9392505050565b600081905092915050565b60006172a08385617289565b93506172ad838584616b8c565b82840190509392505050565b60006172c6828486617294565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061731957607f821691505b60208210810361732c5761732b6172d2565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b600061738e602783616905565b915061739982617332565b604082019050919050565b600060208201905081810360008301526173bd81617381565b9050919050565b7f5074634875623a20696e76616c6964206d6f6e69746f72207665726966696572600082015250565b60006173fa602083616905565b9150617405826173c4565b602082019050919050565b60006020820190508181036000830152617429816173ed565b9050919050565b7f27747062746127206e6f7420666f756e64000000000000000000000000000000600082015250565b6000617466601183616905565b915061747182617430565b602082019050919050565b6000602082019050818103600083015261749581617459565b9050919050565b600060208301600083015184820360008601526174b98282616da9565b9150508091505092915050565b600060808301600083015184820360008601526174e3828261749c565b915050602083015184820360208601526174fd8282616fe2565b91505060408301516175126040860182616e26565b506060830151848203606086015261752a8282616da9565b9150508091505092915050565b600060408201905081810360008301526175518185617032565b9050818103602083015261756581846174c6565b90509392505050565b6000606083016000830151848203600086015261758b8282616f8f565b91505060208301516175a06020860182616fd3565b5060408301516175b36040860182616fd3565b508091505092915050565b600060408201905081810360008301526175d8818561756e565b90506175e76020830184616786565b9392505050565b7f766572696679206e6f7420706173730000000000000000000000000000000000600082015250565b6000617624600f83616905565b915061762f826175ee565b602082019050919050565b6000602082019050818103600083015261765381617617565b9050919050565b600060408201905061766f6000830185617216565b61767c6020830184616971565b9392505050565b60006020820190506176986000830184617216565b92915050565b6000815190506176ad8161681b565b92915050565b6000602082840312156176c9576176c8616472565b5b60006176d78482850161769e565b91505092915050565b7f70746320766572696669657220616c7265616479206578697374730000000000600082015250565b6000617716601b83616905565b9150617721826176e0565b602082019050919050565b6000602082019050818103600083015261774581617709565b9050919050565b600060408201905061776160008301856166b4565b61776e602083018461686d565b9392505050565b7f707463207665726966696572206e6f7420657869737473000000000000000000600082015250565b60006177ab601783616905565b91506177b682617775565b602082019050919050565b600060208201905081810360008301526177da8161779e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061784a826165e9565b9150617855836165e9565b92508282101561786857617867617810565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006178ad826165e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036178df576178de617810565b5b600182019050919050565b7f676574436572744f776e65724f69643a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b6000617946602683616905565b9150617951826178ea565b604082019050919050565b6000602082019050818103600083015261797581617939565b9050919050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b60006179b2601783616905565b91506179bd8261797c565b602082019050919050565b600060208201905081810360008301526179e1816179a5565b9050919050565b60006179f3826165e9565b91506179fe836165e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617a3357617a32617810565b5b828201905092915050565b6000617a49826166de565b9150617a54836166de565b92508263ffffffff03821115617a6d57617a6c617810565b5b828201905092915050565b7f7661724279746573546f4279746573426967456e6469616e3a206f666673657460008201527f2069732067726561746572207468616e20746865206f7574707574206c656e6760208201527f7468000000000000000000000000000000000000000000000000000000000000604082015250565b6000617afa604283616905565b9150617b0582617a78565b606082019050919050565b60006020820190508181036000830152617b2981617aed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617b66602083616905565b9150617b7182617b30565b602082019050919050565b60006020820190508181036000830152617b9581617b59565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b6000617bf8602383616905565b9150617c0382617b9c565b604082019050919050565b60006020820190508181036000830152617c2781617beb565b9050919050565b7f696e76616c69642063726f7373636861696e206c616e65000000000000000000600082015250565b6000617c64601783616905565b9150617c6f82617c2e565b602082019050919050565b60006020820190508181036000830152617c9381617c57565b9050919050565b7f697373756572206e6f7420666f756e6400000000000000000000000000000000600082015250565b6000617cd0601083616905565b9150617cdb82617c9a565b602082019050919050565b60006020820190508181036000830152617cff81617cc3565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154617d3381617301565b617d3d8186617d06565b94506001821660008114617d585760018114617d6957617d9c565b60ff19831686528186019350617d9c565b617d7285617d11565b60005b83811015617d9457815481890152600182019150602081019050617d75565b838801955050505b50505092915050565b6000617db18284617d26565b915081905092915050565b7f70746320747275737420726f6f742073696720696e76616c6964000000000000600082015250565b6000617df2601a83616905565b9150617dfd82617dbc565b602082019050919050565b60006020820190508181036000830152617e2181617de5565b9050919050565b7f544c564974656d4d617056616c756553747265616d3a206f6666657374206f7560008201527f74206f6620627566666572000000000000000000000000000000000000000000602082015250565b6000617e84602b83616905565b9150617e8f82617e28565b604082019050919050565b60006020820190508181036000830152617eb381617e77565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000617f16602383616905565b9150617f2182617eba565b604082019050919050565b60006020820190508181036000830152617f4581617f09565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000617f82600e83616905565b9150617f8d82617f4c565b602082019050919050565b60006020820190508181036000830152617fb181617f75565b9050919050565b60008160011c9050919050565b6000808291508390505b600185111561800f57808604811115617feb57617fea617810565b5b6001851615617ffa5780820291505b808102905061800885617fb8565b9450617fcf565b94509492505050565b60008261802857600190506180e4565b8161803657600090506180e4565b816001811461804c576002811461805657618085565b60019150506180e4565b60ff84111561806857618067617810565b5b8360020a91508482111561807f5761807e617810565b5b506180e4565b5060208310610133831016604e8410600b84101617156180ba5782820a9050838111156180b5576180b4617810565b5b6180e4565b6180c78484846001617fc5565b925090508184048111156180de576180dd617810565b5b81810290505b9392505050565b60006180f6826165e9565b9150618101836165e9565b925061812e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484618018565b905092915050565b7f6765745261775075626c69634b65793a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b6000618192602683616905565b915061819d82618136565b604082019050919050565b600060208201905081810360008301526181c181618185565b9050919050565b7f6f6e6c7920737570706f7274204b454343414b3235365f574954485f5345435060008201527f3235364b31207369676e6174757265206e6f7700000000000000000000000000602082015250565b6000618224603383616905565b915061822f826181c8565b604082019050919050565b6000602082019050818103600083015261825381618217565b9050919050565b7f77726f6e6720736563703235366b3120736967206c656e677468000000000000600082015250565b6000618290601a83616905565b915061829b8261825a565b602082019050919050565b600060208201905081810360008301526182bf81618283565b9050919050565b600060ff82169050919050565b60006182de826182c6565b91506182e9836182c6565b92508260ff038211156182ff576182fe617810565b5b828201905092915050565b6000618315826182c6565b9150618320836182c6565b92508282101561833357618332617810565b5b828203905092915050565b60006183498261652e565b6183538185617289565b935061836381856020860161654a565b80840191505092915050565b600061837b828461833e565b915081905092915050565b600081519050618395816168a1565b92915050565b6000602082840312156183b1576183b0616472565b5b60006183bf84828501618386565b91505092915050565b7f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e4660008201527f4f206e6f77000000000000000000000000000000000000000000000000000000602082015250565b6000618424602583616905565b915061842f826183c8565b604082019050919050565b6000602082019050818103600083015261845381618417565b9050919050565b7f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000600082015250565b6000618490601c83616905565b915061849b8261845a565b602082019050919050565b600060208201905081810360008301526184bf81618483565b9050919050565b60006040820190506184db6000830185617216565b81810360208301526184ed818461658e565b90509392505050565b6184ff816182c6565b82525050565b600060808201905061851a6000830187617216565b61852760208301866184f6565b6185346040830185617216565b6185416060830184617216565b9594505050505056fe63726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e7363726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e6572a467616e74696e666f7935f07b22636f6d6d656e7473223a22222c22636f6d70696c6572223a7b2276657273696f6e223a22302e382e31342b636f6d6d69742e6533383065373766227d2c22636f6e74726163745f6769745f6964223a2232306561313033383066643034373331636562303234626264616462336639386430633962313630222c22636f6e74726163745f76657273696f6e223a302c226c616e6775616765223a22536f6c6964697479222c226f7574707574223a7b22616269223a5b7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22726177526f6f744263646e7343657274222c2274797065223a226279746573227d5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a22636f6e7374727563746f72227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22656e756d2050544354797065456e756d222c226e616d65223a2270746354797065222c2274797065223a2275696e7438227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22766572696669657241646472657373222c2274797065223a226964656e74697479227d5d2c226e616d65223a224164645074635665726966696572222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a226c616e6548617368222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a2276657273696f6e222c2274797065223a2275696e74323536227d5d2c226e616d65223a224c61746573745470427461222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a226f776e65724f6964222c2274797065223a2262797465733332227d5d2c226e616d65223a224e65774263646e7343657274222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a227074634f776e65724f6964222c2274797065223a2262797465733332227d5d2c226e616d65223a224e65775074725472757374526f6f74222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a227074634f776e65724f6964222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a226e657756657273696f6e4e756d222c2274797065223a2275696e74323536227d5d2c226e616d65223a224e6577566572696679416e63686f72222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a747275652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2270726576696f75734f776e6572222c2274797065223a226964656e74697479227d2c7b22696e6465786564223a747275652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a226e65774f776e6572222c2274797065223a226964656e74697479227d5d2c226e616d65223a224f776e6572736869705472616e73666572726564222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22656e756d2050544354797065456e756d222c226e616d65223a2270746354797065222c2274797065223a2275696e7438227d5d2c226e616d65223a2252656d6f76655074635665726966696572222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a226c616e6548617368222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a2276657273696f6e222c2274797065223a2275696e74323536227d5d2c226e616d65223a22536176655470427461222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22636f6d706f6e656e7473223a5b7b22636f6d706f6e656e7473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2273656e646572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d5d2c22696e7465726e616c54797065223a227374727563742043726f7373436861696e4368616e6e656c222c226e616d65223a226368616e6e656c222c2274797065223a227475706c65227d2c7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2273656e6465724964222c2274797065223a2262797465733332227d2c7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2272656365697665724964222c2274797065223a2262797465733332227d5d2c22696e6465786564223a66616c73652c22696e7465726e616c54797065223a227374727563742043726f7373436861696e4c616e65222c226e616d65223a2274706274614c616e65222c2274797065223a227475706c65227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22726573756c74222c2274797065223a22626f6f6c227d5d2c226e616d65223a2256657269667950726f6f66222c2274797065223a226576656e74227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a227665726966696572436f6e7472616374222c2274797065223a226964656e74697479227d5d2c226e616d65223a226164645074635665726966696572222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a227261775470427461222c2274797065223a226279746573227d5d2c226e616d65223a226164645470427461222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a22222c2274797065223a22737472696e67227d5d2c226e616d65223a226263646e73436572744d6170222c226f757470757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22222c2274797065223a226279746573227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a2274706274614c616e65222c2274797065223a226279746573227d5d2c226e616d65223a226765744c61746573745470427461222c226f757470757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22222c2274797065223a226279746573227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a226765744d6f6e69746f725665726966696572222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a227074634f776e65724f6964222c2274797065223a226279746573227d5d2c226e616d65223a226765745054435472757374526f6f74222c226f757470757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22222c2274797065223a226279746573227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a227074634f776e65724f6964222c2274797065223a226279746573227d2c7b22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a2276657273696f6e4e756d222c2274797065223a2275696e74323536227d5d2c226e616d65223a22676574505443566572696679416e63686f72222c226f757470757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22222c2274797065223a226279746573227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a22676574537570706f7274656450544354797065222c226f757470757473223a5b7b22696e7465726e616c54797065223a22656e756d2050544354797065456e756d5b5d222c226e616d65223a22222c2274797065223a2275696e74385b5d227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a2274706274614c616e65222c2274797065223a226279746573227d2c7b22696e7465726e616c54797065223a2275696e743332222c226e616d65223a22747042746156657273696f6e222c2274797065223a2275696e743332227d5d2c226e616d65223a226765745470427461222c226f757470757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22222c2274797065223a226279746573227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a227074634f776e65724f6964222c2274797065223a226279746573227d5d2c226e616d65223a226861735054435472757374526f6f74222c226f757470757473223a5b7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22222c2274797065223a22626f6f6c227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a227074634f776e65724f6964222c2274797065223a226279746573227d2c7b22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a2276657273696f6e4e756d222c2274797065223a2275696e74323536227d5d2c226e616d65223a22686173505443566572696679416e63686f72222c226f757470757473223a5b7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22222c2274797065223a22626f6f6c227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a2274706274614c616e65222c2274797065223a226279746573227d2c7b22696e7465726e616c54797065223a2275696e743332222c226e616d65223a22747042746156657273696f6e222c2274797065223a2275696e743332227d5d2c226e616d65223a226861735470427461222c226f757470757473223a5b7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22222c2274797065223a22626f6f6c227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a226d6f6e69746f72566572696669657241646472222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a226f776e6572222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c226e616d65223a226f776e65724f6964546f4263646e73446f6d61696e53706163654d6170222c226f757470757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a22222c2274797065223a22737472696e67227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c226e616d65223a227074635472757374526f6f744d6170222c226f757470757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a227261775074635472757374526f6f74222c2274797065223a226279746573227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a22222c2274797065223a2275696e74323536227d5d2c226e616d65223a2270746354797065537570706f72746564222c226f757470757473223a5b7b22696e7465726e616c54797065223a22656e756d2050544354797065456e756d222c226e616d65223a22222c2274797065223a2275696e7438227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22656e756d2050544354797065456e756d222c226e616d65223a2270746354797065222c2274797065223a2275696e7438227d5d2c226e616d65223a2272656d6f76655074635665726966696572222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a2272656e6f756e63654f776e657273686970222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a226e65774d6f6e69746f72566572696669657241646472222c2274797065223a226964656e74697479227d5d2c226e616d65223a227365744d6f6e69746f725665726966696572222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c226e616d65223a2274704274614d6170222c226f757470757473223a5b7b22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a226c617465737456657273696f6e222c2274797065223a2275696e74323536227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a226e65774f776e6572222c2274797065223a226964656e74697479227d5d2c226e616d65223a227472616e736665724f776e657273686970222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a227261775074635472757374526f6f74222c2274797065223a226279746573227d5d2c226e616d65223a227570646174655054435472757374526f6f74222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22656e756d2050544354797065456e756d222c226e616d65223a22222c2274797065223a2275696e7438227d5d2c226e616d65223a2276657269666965724d6170222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22726177547050726f6f66222c2274797065223a226279746573227d5d2c226e616d65223a2276657269667950726f6f66222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d5d2c22646576646f63223a7b226b696e64223a22646576222c226d6574686f6473223a7b226f776e65722829223a7b2264657461696c73223a2252657475726e7320746865206964656e74697479206f66207468652063757272656e74206f776e65722e227d2c2272656e6f756e63654f776e6572736869702829223a7b2264657461696c73223a224c65617665732074686520636f6e747261637420776974686f7574206f776e65722e2049742077696c6c206e6f7420626520706f737369626c6520746f2063616c6c20606f6e6c794f776e6572602066756e6374696f6e732e2043616e206f6e6c792062652063616c6c6564206279207468652063757272656e74206f776e65722e204e4f54453a2052656e6f756e63696e67206f776e6572736869702077696c6c206c656176652074686520636f6e747261637420776974686f757420616e206f776e65722c20746865726562792064697361626c696e6720616e792066756e6374696f6e616c6974792074686174206973206f6e6c7920617661696c61626c6520746f20746865206f776e65722e227d2c227472616e736665724f776e657273686970286964656e7469747929223a7b2264657461696c73223a225472616e7366657273206f776e657273686970206f662074686520636f6e747261637420746f2061206e6577206163636f756e742028606e65774f776e657260292e2043616e206f6e6c792062652063616c6c6564206279207468652063757272656e74206f776e65722e227d7d2c2273746174655661726961626c6573223a7b225f5f676170223a7b2264657461696c73223a225468697320656d7074792072657365727665642073706163652069732070757420696e20706c61636520746f20616c6c6f77206675747572652076657273696f6e7320746f20616464206e6577207661726961626c657320776974686f7574207368696674696e6720646f776e2073746f7261676520696e2074686520696e6865726974616e636520636861696e2e205365652068747470733a2f2f646f63732e6f70656e7a657070656c696e2e636f6d2f636f6e7472616374732f342e782f7570677261646561626c652373746f726167655f67617073227d7d2c2276657273696f6e223a317d2c2275736572646f63223a7b226b696e64223a2275736572222c226d6574686f6473223a7b7d2c2276657273696f6e223a317d7d2c2273657474696e6773223a7b22636f6d70696c6174696f6e546172676574223a7b225074634875622e736f6c223a22507463487562227d2c2265766d56657273696f6e223a226c6f6e646f6e222c226c6962726172696573223a7b7d2c226d65746164617461223a7b2262797465636f646548617368223a2269706673227d2c226f7074696d697a6572223a7b22656e61626c6564223a66616c73652c2272756e73223a3230307d2c2272656d617070696e6773223a5b5d7d2c22736f7572636573223a7b22406f70656e7a657070656c696e2f636f6e7472616374732f6163636573732f4f776e61626c652e736f6c223a7b226b656363616b323536223a22307833626163376237656232633335633534626561666634373764323034313766633538333963356132623466656636326665393734653039666235393437636163222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f31626539636434643962633530373961313961346234306337363663313936633562313138663634643361353938323065383239303361373662303437353564222c22647765623a2f697066732f516d555a325935545158566b6971685766634b59365a477638597251517747483762416d474d686f424a38785538225d7d2c22406f70656e7a657070656c696e2f636f6e7472616374732f696e74657266616365732f49455243313237312e736f6c223a7b226b656363616b323536223a22307830373035613462316238366437623062643834333231313866323236626131333963343462396463616261306136656166626132646437643036333963353434222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f63343562383231656639653838326535376332353636393761313532653130386630663261643639393736303961663839303463616539396339626434323265222c22647765623a2f697066732f516d524b434a57366a6a7a523555595a634c70476e68454a3735555662483645486b4561343973577832534b6e67225d7d2c22406f70656e7a657070656c696e2f636f6e7472616374732f7574696c732f436f6e746578742e736f6c223a7b226b656363616b323536223a22307839633963353664663338376636396630373931313438616665353739346337313933396363306263656364663539303136646362323930386431323864666139222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f34663437646364346665353163366137643964613137653235323962323063393730373237616334353965626362346339386530643262653635356530376432222c22647765623a2f697066732f516d5333553441797167476756364c67597942486969726b5251705444354637356334623242563234386d624a35225d7d2c22406f70656e7a657070656c696e2f636f6e7472616374732f7574696c732f537472696e67732e736f6c223a7b226b656363616b323536223a22307862303733326137336362633062313561633732396261393136393732636131343766623330333133663661653530633065313332353937646566383738386362222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f63626664643736366539663262333761303935383764303630323436383434393965633232333661623331636362656162356236653238366166323166323265222c22647765623a2f697066732f516d524d5750796957547071584e714179756e704556364e64514a37676b434d50443654627151356a6348555847225d7d2c22406f70656e7a657070656c696e2f636f6e7472616374732f7574696c732f63727970746f6772617068792f45434453412e736f6c223a7b226b656363616b323536223a22307864633636353864653730323733393736356237343632363131316666393462663166363839366134333431653335376331353038636563623331356266646662222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f37346565363032323235326132393066663866653638633434616565663530646137346634363566386631356532623431356539343065356464306530366665222c22647765623a2f697066732f516d516d516454766b4754646b4d3744627550625552704e774374784a37317946597843326b704567774b456246225d7d2c22406f70656e7a657070656c696e2f636f6e7472616374732f7574696c732f63727970746f6772617068792f5369676e6174757265436865636b65722e736f6c223a7b226b656363616b323536223a22307864376366633336623934396463353266356432353130373436616633656561386531343136333731373265373530663162613061633730343033666533666637222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f34306664373638666633353363303464306663386666666231323539343861393732396238326262333462396437333434336264653966646163386330393466222c22647765623a2f697066732f516d50706b764e67657639764d5438523531617a4d766f4d67545a664c3137324b54693756717a4476585638586f225d7d2c22406f70656e7a657070656c696e2f636f6e7472616374732f7574696c732f6d6174682f4d6174682e736f6c223a7b226b656363616b323536223a22307837383666666165343734386364643838396339333939373861343237336465613930613739646538326137336465653437616137343462383431373635383634222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f39336530346338303463336138326637383234356430633363653632323761383162333763363963633335336535666561643265346530306339316134633862222c22647765623a2f697066732f516d53636b68597a46674e6d714e7378726178786f3753416252344777574c345a746a343463687a394d6d744762225d7d2c22406f70656e7a657070656c696e2f636f6e7472616374732f7574696c732f6d6174682f5369676e65644d6174682e736f6c223a7b226b656363616b323536223a22307863666138353436306235656334343963363036343434626664383466663935353830643136623536303262616333623932343431376332373561626563373765222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f32626333346366643730343530613031353933326334656165383138363661613065633765653036386239386231363762386131396364373234353665396136222c22647765623a2f697066732f516d54355864466b47714b716f65386e666e423557445a766f32347a566659586d42664c586d3637556465395174225d7d2c225074634875622e736f6c223a7b226b656363616b323536223a22307865613465313030336636343336653437323239353235653865323366656663326531663438656236343930663766323064363635613866396431653934393561222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f64313137666566336365613136306139633736336463616137643432623638346361313933306364643363343735393164353363373434663766336664363432222c22647765623a2f697066732f516d4e7a3350657353394c64643653336f465768563369353976335566566a657378594d46387743474b35413273225d7d2c22696e74657266616365732f494d6f6e69746f7256657269666965722e736f6c223a7b226b656363616b323536223a22307862323638626631323437383835356537626364356330306163316330373132303461366636353930383363313630663639363236313839336363396132353534222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f30313461626563343962363564383165323730353339353831646338383537386264383334663663613532646334393165386634663264353564613038663532222c22647765623a2f697066732f516d526f526772466b45577455324e393145374431384672637053437252543539446436483742724b6a646f6654225d7d2c22696e74657266616365732f495074634875622e736f6c223a7b226b656363616b323536223a22307833313662666463353431373036623065376332356637363933646538363437393335396164333334396563373434623139636536633137663336386236323966222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f61383138623966313965386666653236383364363131306661643836353266373465393135636235313132393533376537383731383834303861313437653133222c22647765623a2f697066732f516d66315a696d386a69377a37556753726a7559414e52505a665564526f59447a535850584a535065536d766766225d7d2c22696e74657266616365732f4950746356657269666965722e736f6c223a7b226b656363616b323536223a22307839623035623435386535366532336335656438353931306362336665613038353362656139393334643162663034343732333764363066636565333633363362222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f35313236316262666534313139626461353534396164373934663936663234303234636136643862393662616533376638373164643662363239643661353530222c22647765623a2f697066732f516d62556b7165696873356e4c5a61514e6d55334172467a5a4e5651716f764b32623259524a6f4d39376d384150225d7d2c226c69622f636f6d6d6f6e732f416362436f6d6d6f6e732e736f6c223a7b226b656363616b323536223a22307831653565323166313531323133346363626161666437353665343866663538306264343366393666646236366666366563346132646236363032376433666361222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f63366632386163663530643133623932366130353330626439646634386637616564383536333831316564306633353966646633336464333233346633313038222c22647765623a2f697066732f516d5077625865347054675a426d6b50713652646a724b4169503564486a65596370384567566b754c6b4b463266225d7d2c226c69622f7074632f5074634c69622e736f6c223a7b226b656363616b323536223a22307832656639333265333432386262636137336563333063376662336331366535646438366663666533336237643539343963626566303833303865343032623131222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f64666634303732666166396561343632386235313865616138346162393736323866303734663838643738393634646430346635303633633263383437386266222c22647765623a2f697066732f516d57447a6f6d686d736852686e4c357a53417071325041745271315952725a774768376f53655043726d726b41225d7d2c226c69622f7574696c732f4279746573546f54797065732e736f6c223a7b226b656363616b323536223a22307865646463643437313062346565303632346366326131366438343865316566353832643938616231666665386637323634396137656130313433373462663466222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f62383338623463386636653136366162376361616138633665376631366662353664373362303865653031326235636565313234623061623532666365346132222c22647765623a2f697066732f516d527167385a31464c416969316a557a4273737165704d4578596b32654d79556e614266714b355362377a5a69225d7d2c226c69622f7574696c732f536166654d6174682e736f6c223a7b226b656363616b323536223a22307836643837666532326566313339323734656665343962313961633137383532313163383031656234326533386465336137623964376639363735616539383231222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f61623962353030353463633037373262653536393832653033386636333966643330343734353737393866653664343561643439396534353665306432366635222c22647765623a2f697066732f516d4e7731525875786652693635417576634452797978364d7659485277347455726f477873646f6b7439364136225d7d2c226c69622f7574696c732f544c565574696c732e736f6c223a7b226b656363616b323536223a22307864616133336339356632396665383033326663303866393232633733373231333630646232346234346133616435636431363939366139386437613166326238222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f61656662643466663137636131373136383163366439666361633063313433626133373264643166376537386234383331323633303236343836643465653937222c22647765623a2f697066732f516d61324a745a4757564654453167634c6f6a505773796e6b72566d4c6a696e6b39574151687852594d55687543225d7d2c226c69622f7574696c732f5479706573546f42797465732e736f6c223a7b226b656363616b323536223a22307834666238636433393836313336333631323463343065616661653031626466303936383434663739653765626534653732346435646534373363623638643532222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f33306366323731666330393466643735383362646466373437633138313134323031356163666630633461303666326230326430363566383833353336633538222c22647765623a2f697066732f516d654b694c67697754706879644e4c776271414132755372774b39794256673135714e45797a61706454597352225d7d2c226c69622f7574696c732f5574696c732e736f6c223a7b226b656363616b323536223a22307865383534333339646365393462313632366163313966613736346563313933636136653732656138353866396434633265356333366162323337303835303963222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f66303064323934393265663132626535356637373830386332356538396539343965343832393630636464656137383533383866386534323934666662653139222c22647765623a2f697066732f516d5036356b73697a69426768574456714e356577537154677a69796531667735426d3335566d4869584b544b73225d7d7d2c2276657273696f6e223a317d646970667358221220be1df2d8b1214867743d12f2d83569e7fae30a8fecf26c5b5c524edbdaf5d6c164736f6c634300080e6b636f6d70696c655f6d6f646131363c \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime new file mode 100644 index 00000000..1a8f365d --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50600436106101a95760003560e01c8063715018a6116100f9578063c09b261b11610097578063e552109211610071578063e5521092146104b6578063e5e55300146104d4578063eaa71e90146104f0578063ed46aafa1461050c576101a9565b8063c09b261b1461044e578063d513f34a1461046a578063db37c08b14610486576101a9565b806389223f80116100d357806389223f80146103c65780638da5cb5b146103e2578063a9d662af14610400578063b5db295a1461041e576101a9565b8063715018a6146103825780638037d45e1461038c578063838a102c146103aa576101a9565b8063343e77921161016657806342f116bd1161014057806342f116bd146102fc57806356cb2d0214610318578063627523a4146103365780636bba080814610366576101a9565b8063343e77921461029257806334d4725a146102c25780633ac6dfb1146102de576101a9565b806304f25f96146101ae5780630a6e15db146101ca5780630d9ae9e5146101fa5780631f56086f1461022a578063203c2c851461024657806325601cdd14610262575b600080fd5b6101c860048036038101906101c3919061679a565b61053c565b005b6101e460048036038101906101df919061682f565b6105a2565b6040516101f19190616877565b60405180910390f35b610214600480360381019061020f91906168c8565b6105c2565b604051610221919061698e565b60405180910390f35b610244600480360381019061023f919061682f565b6106ba565b005b610260600480360381019061025b91906169a9565b610759565b005b61027c60048036038101906102779190616a09565b610a32565b604051610289919061698e565b60405180910390f35b6102ac60048036038101906102a79190616adc565b610b30565b6040516102b99190616b92565b60405180910390f35b6102dc60048036038101906102d7919061679a565b610d32565b005b6102e6610d98565b6040516102f39190616b92565b60405180910390f35b61031660048036038101906103119190616cee565b610da2565b005b610320610e6d565b60405161032d9190616b92565b60405180910390f35b610350600480360381019061034b9190616adc565b610e73565b60405161035d9190616b92565b60405180910390f35b610380600480360381019061037b9190616d4a565b61106f565b005b61038a6110d6565b005b610394611132565b6040516103a19190616e00565b60405180910390f35b6103c460048036038101906103bf9190616e1b565b61113c565b005b6103e060048036038101906103db9190616d4a565b6111bc565b005b6103ea611223565b6040516103f79190616e00565b60405180910390f35b61040861122c565b6040516104159190616e00565b60405180910390f35b61043860048036038101906104339190616e64565b611232565b604051610445919061700d565b60405180910390f35b6104686004803603810190610463919061702f565b611380565b005b610484600480360381019061047f919061682f565b611598565b005b6104a0600480360381019061049b9190617129565b611635565b6040516104ad9190616b92565b60405180910390f35b6104be6118d4565b6040516104cb9190616e00565b60405180910390f35b6104ee60048036038101906104e99190617224565b6118da565b005b61050a6004803603810190610505919061682f565b611978565b005b61052660048036038101906105219190617129565b611a15565b6040516105339190616b92565b60405180910390f35b6000600954148061054e575033600954145b61058d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105849061732a565b60405180910390fd5b61059b858585338686611cae565b5050505050565b60086020528060005260406000206000915054906101000a900460ff1681565b600060025484846040516020016105da92919061737a565b6040516020818303038152906040528051906020012014610630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610627906173df565b60405180910390fd5b600061068188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508785611de3565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6106c2611e3f565b6106ca611223565b1461070a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107019061744b565b60405180910390fd5b6000810361074d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610744906174dd565b60405180910390fd5b61075681611e47565b50565b6008600033815260200190815260200160002060009054906101000a900460ff166107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b090617549565b60405180910390fd5b6107c16164e2565b61081883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505082611e8690919063ffffffff16565b8060e0015160ff16600003610862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610859906175db565b60405180910390fd5b8060e0015160ff166002036109f157806101000151600660008360400151604051602001610890919061762c565b6040516020818303038152906040528051906020012081526020019081526020016000206003015411156109b157600760008260200151815260200190815260200160002060009054906101000a900460ff16610922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610919906176b5565b60405180910390fd5b61092b846120c4565b6383c6d5a282602001518360400151846060015160001c8560c001518660a001518761012001518861014001516040518863ffffffff1660e01b815260040161097a9796959493929190617772565b600060405180830381600087803b15801561099457600080fd5b505af11580156109a8573d6000803e3d6000fd5b505050506109ec565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390617868565b60405180910390fd5b610a2c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a23906178fa565b60405180910390fd5b50505050565b60006002548484604051602001610a4a92919061737a565b6040516020818303038152906040528051906020012014610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906173df565b60405180910390fd5b6000610af788888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760001b8560001b611de3565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6000610b3f8787878686612136565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610bc7576000610bca565b60015b60ff168152602001610c218b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff8016815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610cb6600254826121d390919063ffffffff16565b600154639d24799833610cc884612470565b6040518363ffffffff1660e01b8152600401610ce592919061791a565b600060405180830381600087803b158015610cff57600080fd5b505af1158015610d13573d6000803e3d6000fd5b50505050610d1f6127a2565b8060200151925050509695505050505050565b60006009541480610d44575033600954145b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a9061732a565b60405180910390fd5b610d918585853386866127a4565b5050505050565b6000600254905090565b610daa611e3f565b610db2611223565b14610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de99061744b565b60405180910390fd5b60008203610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c90617996565b60405180910390fd5b8160018190555080604051602001610e4d919061762c565b604051602081830303815290604052805190602001206002819055505050565b60025481565b6000610e828787878686612933565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610f0a576000610f0d565b60015b60ff16815260200167ffffffffffffffff80168152602001610f748b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610ff3600254826121d390919063ffffffff16565b600154639d2479983361100584612470565b6040518363ffffffff1660e01b815260040161102292919061791a565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b5050505061105c6129d0565b8060200151925050509695505050505050565b60006009541480611081575033600954145b6110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b79061732a565b60405180910390fd5b6110ce8686868686866127a4565b505050505050565b6110de611e3f565b6110e6611223565b14611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d9061744b565b60405180910390fd5b6111306000611e47565b565b6000600154905090565b611144611e3f565b61114c611223565b1461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061744b565b60405180910390fd5b8060405160200161119d919061762c565b6040516020818303038152906040528051906020012060028190555050565b600060095414806111ce575033600954145b61120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061732a565b60405180910390fd5b61121b868686868686611cae565b505050505050565b60008054905090565b60015481565b61123a61655e565b60066000848460405160200161125192919061737a565b6040516020818303038152906040528051906020012081526020019081526020016000206040518060a00160405290816000820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820180546112b0906179e5565b80601f01602080910402602001604051908101604052809291908181526020018280546112dc906179e5565b80156113295780601f106112fe57610100808354040283529160200191611329565b820191906000526020600020905b81548152906001019060200180831161130c57829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905092915050565b33600154146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90617a62565b60405180910390fd5b6113d185858585856129d2565b600061142083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506129d9565b905060018163ffffffff16036114855761148086868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a9c565b611588565b60028163ffffffff16036114e8576114e386868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b61565b611587565b60038163ffffffff160361154b5761154686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612cad565b611586565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90617ace565b60405180910390fd5b5b5b611590612e1d565b505050505050565b6115a0611e3f565b6115a8611223565b146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061744b565b60405180910390fd5b6000810361162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290617996565b60405180910390fd5b8060018190555050565b60008060ff168360ff16101580156116545750600460ff168360ff1611155b611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90617b3a565b60405180910390fd5b6116a08989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018381526020018961172857600061172b565b60015b60ff1681526020016117828d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200160405180602001604052806000815250815250905061182660025482612e1f90919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d247998336118688461311d565b6040518363ffffffff1660e01b815260040161188592919061791a565b600060405180830381600087803b15801561189f57600080fd5b505af11580156118b3573d6000803e3d6000fd5b505050506118bf6129d0565b80602001519250505098975050505050505050565b60095481565b6118e2611e3f565b6118ea611223565b1461192a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119219061744b565b60405180910390fd5b600061193d858560001b8560001b611de3565b9050816004600083815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050505050565b611980611e3f565b611988611223565b146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061744b565b60405180910390fd5b60008103611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290617ba6565b60405180910390fd5b8060098190555050565b60008060ff168360ff1610158015611a345750600460ff168360ff1611155b611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90617b3a565b60405180910390fd5b611a808989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189611b08576000611b0b565b60015b60ff16815260200167ffffffffffffffff80168152602001611b728d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050611c0060025482612e1f90919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d24799833611c428461311d565b6040518363ffffffff1660e01b8152600401611c5f92919061791a565b600060405180830381600087803b158015611c7957600080fd5b505af1158015611c8d573d6000803e3d6000fd5b50505050611c996129d0565b80602001519250505098975050505050505050565b611cbb8686868585612136565b6000604051806080016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018660001b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200163ffffffff80168152509050600154639d24799885611d83846134dd565b6040518363ffffffff1660e01b8152600401611da092919061791a565b600060405180830381600087803b158015611dba57600080fd5b505af1158015611dce573d6000803e3d6000fd5b50505050611dda6127a2565b50505050505050565b600083604051602001611df6919061762c565b604051602081830303815290604052805190602001208383604051602001611e2093929190617be7565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600081519050611e95826129d9565b836000019063ffffffff16908163ffffffff1681525050611eb6602061361f565b81611ec19190617c53565b9050611ecd8183613631565b836020018181525050611ede61363f565b60ff1681611eec9190617c53565b90506000611efa8284613648565b905080846040018190525080516004611f139190617c87565b82611f1e9190617c53565b9150611f2a8284613631565b846060018181525050611f3b61363f565b60ff1682611f499190617c53565b9150611f558284613738565b846080019060ff16908160ff1681525050600182611f739190617c53565b9150611f7f8284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050600882611fab9190617c53565b9150611fb78284613754565b8460c0019063ffffffff16908163ffffffff1681525050600482611fdb9190617c53565b9150611fe78284613738565b8460e0019060ff16908160ff16815250506001826120059190617c53565b915060006120138385613648565b905061201e81613762565b85610100018181525050805160046120369190617c87565b836120419190617c53565b925061204d8385613648565b8561012001819052508461012001515160046120699190617c87565b836120749190617c53565b9250600260ff16856080015160ff1611156120bd576120938385613648565b8561014001819052508461014001515160046120af9190617c87565b836120ba9190617c53565b92505b5050505050565b600080602067ffffffffffffffff8111156120e2576120e1616bc3565b5b6040519080825280601f01601f1916602001820160405280156121145781602001600182028036833780820191505090505b5090506121236020848361381e565b61212e602082613828565b915050919050565b5050505050565b60008061214b858585613836565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905060056000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906121a890617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6002826000015163ffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790617d55565b60405180910390fd5b63ffffffff8260e0015151111561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390617de7565b60405180910390fd5b60008260e001515183604001515160796122869190617c87565b6122909190617c87565b905060008167ffffffffffffffff8111156122ae576122ad616bc3565b5b6040519080825280601f01601f1916602001820160405280156122e05781602001600182028036833780820191505090505b509050600082905061230c8163ff00000087600001516123009190617e07565b63ffffffff168461389f565b61231660206138a9565b816123219190617c53565b9050600085604001519050612337828285613ad8565b805160046123459190617c87565b826123509190617c53565b91506123618287606001518561381e565b61236961363f565b60ff16826123779190617c53565b915061238882876080015185613bac565b6001826123959190617c53565b91506123a6828760a0015185613bc3565b6123b060406138a9565b826123bb9190617c53565b91506123cc828760c0015185613bda565b6123d660206138a9565b826123e19190617c53565b91506123f2828760e0015185613ad8565b8560e001515160046124049190617c87565b8261240f9190617c53565b915061241c823385613bf1565b61242461363f565b60ff16826124329190617c53565b915061243f82868561381e565b61244761363f565b60ff16826124559190617c53565b91508280519060200120866020018181525050505050505050565b60606002826000015163ffffffff16146124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690617d55565b60405180910390fd5b63ffffffff8260e0015151111561250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250290617de7565b60405180910390fd5b6000801b826020015103612554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254b90617eb3565b60405180910390fd5b600080600260ff16846080015160ff1611905080156125b3578361010001515160048560e0015151866040015151605961258e9190617c87565b6125989190617c87565b6125a29190617c87565b6125ac9190617c87565b91506125d8565b8360e001515184604001515160596125cb9190617c87565b6125d59190617c87565b91505b60008267ffffffffffffffff8111156125f4576125f3616bc3565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b50905060008390506126528163ff00000088600001516126469190617e07565b63ffffffff168461389f565b61265c60206138a9565b816126679190617c53565b90506126788187602001518461381e565b61268061363f565b60ff168161268e9190617c53565b90506000866040015190506126a4828285613ad8565b805160046126b29190617c87565b826126bd9190617c53565b91506126ce8288606001518561381e565b6126d661363f565b60ff16826126e49190617c53565b91506126f582886080015185613bac565b6001826127029190617c53565b9150612713828860a0015185613bc3565b61271d60406138a9565b826127289190617c53565b9150612739828860c0015185613bda565b61274360206138a9565b8261274e9190617c53565b915061275f828860e0015185613ad8565b8660e001515160046127719190617c87565b8261277c9190617c53565b91508315612795576127948288610100015185613ad8565b5b8295505050505050919050565b565b6127b18686868585612933565b60008460001b90506000604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016128af8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888661293a565b63ffffffff16815250905060006128c5826134dd565b9050600154639d24799887836040518363ffffffff1660e01b81526004016128ee92919061791a565b600060405180830381600087803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b505050506129286129d0565b505050505050505050565b5050505050565b600080612948858585613836565b905060006003600083815260200190815260200160002060009054906101000a900463ffffffff16905060036000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906129a590617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b565b5050505050565b60008060008351905060048103602085010151915060ff60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612a9057600080600467ffffffffffffffff811115612a3957612a38616bc3565b5b6040519080825280601f01601f191660200182016040528015612a6b5781602001600182028036833780820191505090505b5090506003830360200186015160218201526004810151915081945050505050612a97565b6001925050505b919050565b612aa461659e565b612ab78282613bfb90919063ffffffff16565b6002548160000151604051602001612acf919061762c565b6040516020818303038152906040528051906020012014612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c906173df565b60405180910390fd5b63ffffffff8016816060015163ffffffff1603612b4d57612b4885858584613daf565b612b5a565b612b5985858584613e1f565b5b5050505050565b612b696165cf565b612b7c828261404090919063ffffffff16565b6002548160400151604051602001612b94919061762c565b6040516020818303038152906040528051906020012014612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be1906173df565b60405180910390fd5b600060ff16816080015160ff161480612c0d5750600160ff16816080015160ff16145b15612c2357612c1e858585846141f5565b612ca6565b600260ff16816080015160ff1603612c4657612c4185858584614325565b612ca5565b600360ff16816080015160ff1603612c6957612c648585858461440d565b612ca4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b90617f1f565b60405180910390fd5b5b5b5050505050565b612cb56164e2565b612cc88282611e8690919063ffffffff16565b6002548160400151604051602001612ce0919061762c565b6040516020818303038152906040528051906020012014612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90617f8b565b60405180910390fd5b600060ff16816080015160ff161480612d595750600160ff16816080015160ff16145b15612d6f57612d6a85858584614503565b612e16565b600260ff16816080015160ff1603612d9257612d8d8585858461479c565b612e15565b600360ff16816080015160ff1603612db557612db0858585846148cd565b612e14565b600460ff16816080015160ff1603612dd857612dd385858584614a0c565b612e13565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a9061801d565b60405180910390fd5b5b5b5b5050505050565b565b6003826000015163ffffffff1614612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6390617d55565b60405180910390fd5b63ffffffff826101200151511115612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb090617de7565b60405180910390fd5b6000612ec9836101000151614bd1565b90506000815184610120015151856040015151607e612ee89190617c87565b612ef29190617c87565b612efc9190617c87565b905060008167ffffffffffffffff811115612f1a57612f19616bc3565b5b6040519080825280601f01601f191660200182016040528015612f4c5781602001600182028036833780820191505090505b5090506000829050612f728163ff0000008860000151612f6c9190617e07565b84613bda565b612f7c60206138a9565b81612f879190617c53565b9050600086604001519050612f9d828285613ad8565b80516004612fab9190617c87565b82612fb69190617c53565b9150612fc78288606001518561381e565b612fcf61363f565b60ff1682612fdd9190617c53565b9150612fee82886080015185613bac565b600182612ffb9190617c53565b915061300c828860a0015185613bc3565b61301660406138a9565b826130219190617c53565b9150613032828860c0015185613bda565b61303c60206138a9565b826130479190617c53565b9150613058828860e0015185613bac565b6001826130659190617c53565b9150613072828685613ad8565b845160046130809190617c87565b8261308b9190617c53565b915061309d8288610120015185613ad8565b8661012001515160046130b09190617c87565b826130bb9190617c53565b91506130c8823385613bf1565b6130d061363f565b60ff16826130de9190617c53565b91506130eb82878561381e565b6130f361363f565b60ff16826131019190617c53565b9150828051906020012087602001818152505050505050505050565b60606003826000015163ffffffff161461316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390617d55565b60405180910390fd5b63ffffffff8261012001515111156131b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b090617de7565b60405180910390fd5b6000801b826020015103613202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f990617eb3565b60405180910390fd5b600080600260ff16846080015160ff161190506000613225856101000151614bd1565b9050811561328057846101400151516004825187610120015151886040015151605e6132519190617c87565b61325b9190617c87565b6132659190617c87565b61326f9190617c87565b6132799190617c87565b92506132b2565b805185610120015151866040015151605e61329b9190617c87565b6132a59190617c87565b6132af9190617c87565b92505b60008367ffffffffffffffff8111156132ce576132cd616bc3565b5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b50905060008490506133268163ff00000089600001516133209190617e07565b84613bda565b61333060206138a9565b8161333b9190617c53565b905061334c8188602001518461381e565b61335461363f565b60ff16816133629190617c53565b9050600087604001519050613378828285613ad8565b805160046133869190617c87565b826133919190617c53565b91506133a28289606001518561381e565b6133aa61363f565b60ff16826133b89190617c53565b91506133c982896080015185613bac565b6001826133d69190617c53565b91506133e7828960a0015185613bc3565b6133f160406138a9565b826133fc9190617c53565b915061340d828960c0015185613bda565b61341760206138a9565b826134229190617c53565b9150613433828960e0015185613bac565b6001826134409190617c53565b915061344d828585613ad8565b8351600461345b9190617c87565b826134669190617c53565b91506134788289610120015185613ad8565b87610120015151600461348b9190617c87565b826134969190617c53565b915084156134cf576134ae8289610140015185613ad8565b8761014001515160046134c19190617c87565b826134cc9190617c53565b91505b829650505050505050919050565b606060006134ee8360000151614cda565b602060046134ff8660400151614d32565b6135099190617c87565b6135139190617c87565b61351d9190617c87565b905060008167ffffffffffffffff81111561353b5761353a616bc3565b5b6040519080825280601f01601f19166020018201604052801561356d5781602001600182028036833780820191505090505b509050600082905061358481866000015184614d8a565b6135918560000151614cda565b8161359c9190617c53565b90506135ad8186602001518461381e565b6135b561363f565b60ff16816135c39190617c53565b90506135d481866060015184613bda565b6135de602061361f565b816135e99190617c53565b90506135fa81866040015184614d8a565b6136078560400151614d32565b816136129190617c53565b9050819350505050919050565b600061362a826138a9565b9050919050565b600082820151905092915050565b60006020905090565b606060006136568484613754565b63ffffffff16905060048461366b9190617c53565b9350838111156136b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a7906180af565b60405180910390fd5b80846136bc9190617c53565b935060608115600081146136db5760405191506020820160405261372c565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561371957805183526020830192506020810190506136fc565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b600082820151905092915050565b600082820151905092915050565b6000808251905060208111156137ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a490618141565b60405180910390fd5b60008167ffffffffffffffff8111156137c9576137c8616bc3565b5b6040519080825280601f01601f1916602001820160405280156137fb5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b8183820152505050565b600082820151905092915050565b60008061384284614df5565b90508085604051602001613856919061762c565b604051602081830303815290604052805190602001208460405160200161387f93929190617be7565b604051602081830303815290604052805190602001209150509392505050565b8183820152505050565b600081600881146139b657601081146139bf57601881146139c857602081146139d157602881146139da57603081146139e357603881146139ec57604081146139f557604881146139fe5760508114613a075760588114613a105760608114613a195760688114613a225760708114613a2b5760788114613a345760808114613a3d5760888114613a465760908114613a4f5760988114613a585760a08114613a615760a88114613a6a5760b08114613a735760b88114613a7c5760c08114613a855760c88114613a8e5760d08114613a975760d88114613aa05760e08114613aa95760e88114613ab25760f08114613abb5760f88114613ac4576101008114613acd5760209150613ad2565b60019150613ad2565b60029150613ad2565b60039150613ad2565b60049150613ad2565b60059150613ad2565b60069150613ad2565b60079150613ad2565b60089150613ad2565b60099150613ad2565b600a9150613ad2565b600b9150613ad2565b600c9150613ad2565b600d9150613ad2565b600e9150613ad2565b600f9150613ad2565b60109150613ad2565b60119150613ad2565b60129150613ad2565b60139150613ad2565b60149150613ad2565b60159150613ad2565b60169150613ad2565b60179150613ad2565b60189150613ad2565b60199150613ad2565b601a9150613ad2565b601b9150613ad2565b601c9150613ad2565b601d9150613ad2565b601e9150613ad2565b601f9150613ad2565b602091505b50919050565b600082519050613ae9848284613bda565b600484613af69190617c53565b93508063ffffffff16841015613b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b38906181d3565b60405180910390fd5b8063ffffffff1684613b539190617c53565b9350801560008103613ba5578483018051601f84168015602002818801018581018215602002838601015b81831015613b9b5782518152602083019250602081019050613b7e565b5083855250505050505b5050505050565b828101600181038051848352808252505050505050565b828101600881038051848352808252505050505050565b828101600481038051848352808252505050505050565b8183820152505050565b60008151905060006020613c0f8385613754565b613c199190617e07565b905060008163ffffffff1667ffffffffffffffff811115613c3d57613c3c616bc3565b5b6040519080825280601f01601f191660200182016040528015613c6f5781602001600182028036833780820191505090505b509050613c7d838583614e5b565b613c8681614d32565b83613c919190617c53565b92506000613c9f8486613631565b9050613ca961363f565b60ff1684613cb79190617c53565b93506000613cc58587613754565b9050613cd160206138a9565b85613cdc9190617c53565b945060006020613cec8789613754565b613cf69190617e07565b905060008163ffffffff1667ffffffffffffffff811115613d1a57613d19616bc3565b5b6040519080825280601f01601f191660200182016040528015613d4c5781602001600182028036833780820191505090505b509050613d5a878983614e5b565b613d6381614d32565b87613d6e9190617c53565b96508489600001819052508389602001818152505082896060019063ffffffff16908163ffffffff1681525050808960400181905250505050505050505050565b613db881614eb3565b632e00b39585858560001c85604001516040518563ffffffff1660e01b8152600401613de79493929190618220565b600060405180830381600087803b158015613e0157600080fd5b505af1158015613e15573d6000803e3d6000fd5b5050505050505050565b6000613e7485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050848460200151614ec9565b90508063ffffffff16826060015163ffffffff1614613ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ebf906182b3565b60405180910390fd5b600060606000613ed785614eb3565b90506000813b03613f2357600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509150613ff3565b80639e41773189898960001c89604001516040518563ffffffff1660e01b8152600401613f539493929190618220565b600060405180830381600087803b158015613f6d57600080fd5b505af1925050508015613f7e575060015b613fed57613f8a6182e0565b806308c379a003613fb25750613f9e618302565b80613fa95750613fb4565b80925050613fe8565b505b3d8060008114613fe0576040519150601f19603f3d011682016040523d82523d6000602084013e613fe5565b606091505b50505b613ff2565b600192505b5b7fc5c107ebb3f0bb97a017b6d166d57ad3349b9114ef620914f2178b3559310abf8888888488888860405161402e9796959493929190618392565b60405180910390a15050505050505050565b60008151905061404f826129d9565b836000019063ffffffff16908163ffffffff1681525050614070602061361f565b8161407b9190617c53565b90506140878183613631565b83602001818152505061409861363f565b60ff16816140a69190617c53565b905060006140b48284613648565b9050808460400181905250805160046140cd9190617c87565b826140d89190617c53565b91506140e48284613631565b8460600181815250506140f561363f565b60ff16826141039190617c53565b915061410f8284613738565b846080019060ff16908160ff168152505060018261412d9190617c53565b91506141398284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff16815250506008826141659190617c53565b91506141718284613754565b8460c0019063ffffffff16908163ffffffff16815250506004826141959190617c53565b91506141a18284613648565b8460e001819052508360e001515160046141bb9190617c87565b826141c69190617c53565b9150600260ff16846080015160ff1611156141ef576141e58284613648565b8461010001819052505b50505050565b6000606063ffffffff80168360c0015163ffffffff16036142805761421c86868686614f5f565b8092508193505050600060ff16836080015160ff160361427b57818190614279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142709190618403565b60405180910390fd5b505b614295565b61428c868686866150a2565b80925081935050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239836020015187878787604001516142cc8961528d565b8960c001518a60a001518b608001518b8b6040516142f49b9a99989796959493929190618434565b60405180910390a1600160ff16836080015160ff160361431d5761431c8387878786866152a3565b5b505050505050565b61432e8161528d565b6315390358826020015186868660001c8660c001518760a001518860e001516040518863ffffffff1660e01b815260040161436f97969594939291906184e7565b600060405180830381600087803b15801561438957600080fd5b505af115801561439d573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516143d88761528d565b8760c001518860a00151896080015160016040516143ff9a999897969594939291906185a4565b60405180910390a150505050565b6144168161528d565b6383c6d5a2826020015186868660001c8660c001518760a001518860e001518961010001516040518963ffffffff1660e01b815260040161445e989796959493929190618655565b600060405180830381600087803b15801561447857600080fd5b505af115801561448c573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516144c78761528d565b8760c001518860a00151896080015160018b61010001516040516144f59b9a99989796959493929190618434565b60405180910390a150505050565b6000606060008360e0015160ff161480614524575060028360e0015160ff16145b80614536575060048360e0015160ff16145b614575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161456c9061874d565b60405180910390fd5b60028360e0015160ff16036145d05743836101000151116145cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145c2906187b9565b60405180910390fd5b614628565b60048360e0015160ff1603614627574283610100015111614626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161461d906187b9565b60405180910390fd5b5b5b63ffffffff80168360c0015163ffffffff16036146af5761464b868686866153b6565b8092508193505050600060ff16836080015160ff16036146aa578181906146a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161469f9190618403565b60405180910390fd5b505b6146c4565b6146bb868686866154fa565b80925081935050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c9836020015187878787604001516146fb896156e6565b8960c001518a60a001518b608001518b8b6040516147239b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e0015185610100015160405161476b939291906187e8565b60405180910390a1600160ff16836080015160ff1603614794576147938387878786866156fc565b5b505050505050565b6147a5816156e6565b6315390358826020015186868660001c8660c001518760a001518861012001516040518863ffffffff1660e01b81526004016147e797969594939291906184e7565b600060405180830381600087803b15801561480157600080fd5b505af1158015614815573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614850876156e6565b8760c001518860a00151896080015160016040516148779a999897969594939291906185a4565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516148bf939291906187e8565b60405180910390a150505050565b6148d6816156e6565b6383c6d5a2826020015186868660001c8660c001518760a001518861012001518961014001516040518963ffffffff1660e01b815260040161491f989796959493929190618655565b600060405180830381600087803b15801561493957600080fd5b505af115801561494d573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614988876156e6565b8760c001518860a00151896080015160018b61014001516040516149b69b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516149fe939291906187e8565b60405180910390a150505050565b6000614a1c82610120015161580f565b90508060400151600660008787604051602001614a3a92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600201819055508060800151600660008787604051602001614a8192919061737a565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060600151600660008787604051602001614aea92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600301819055507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c982602001518686868660400151614b4c886156e6565b8860c001518960a001518a6080015160018c6101400151604051614b7a9b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e00151846101000151604051614bc2939291906187e8565b60405180910390a15050505050565b60606000602067ffffffffffffffff811115614bf057614bef616bc3565b5b6040519080825280601f01601f191660200182016040528015614c225781602001600182028036833780820191505090505b5090506000602067ffffffffffffffff811115614c4257614c41616bc3565b5b6040519080825280601f01601f191660200182016040528015614c745781602001600182028036833780820191505090505b509050606084602084015260015b6020811015614cce578060208501035181602085010351808203614cc15760405193506020860151838501528284528260208501016040525050614cce565b5050600181019050614c82565b50809350505050919050565b600060208251614cea919061884e565b9050600060208351614cfc919061887f565b14614d10578080614d0c906188b0565b9150505b8080614d1b906188b0565b915050602081614d2b91906188f8565b9050919050565b600060208251614d42919061884e565b9050600060208351614d54919061887f565b14614d68578080614d64906188b0565b9150505b8080614d73906188b0565b915050602081614d8391906188f8565b9050919050565b600060208351614d9a919061884e565b9050600060208451614dac919061887f565b1115614dc1578080614dbd906188b0565b9150505b60006001820191505b81811015614dee576020810284015185840152602085039450600181019050614dca565b5050505050565b600080602067ffffffffffffffff811115614e1357614e12616bc3565b5b6040519080825280601f01601f191660200182016040528015614e455781602001600182028036833780820191505090505b5090508260208201526020810151915050919050565b6000602090506000808585015192506001602084040190506000602084061115614e86576001810190505b5b80821015614eab578585015160208302850152602086039550600182019150614e87565b505050505050565b6000614ec282602001516120c4565b9050919050565b600080614ed7858585611de3565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905060046000838152602001908152602001600020600081819054906101000a900463ffffffff1680929190614f3490617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b60006060600060606000614f728661528d565b3b03614fb957600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509050615091565b614fc28561528d565b632e00b39589898960001c8960e001516040518563ffffffff1660e01b8152600401614ff19493929190618220565b600060405180830381600087803b15801561500b57600080fd5b505af192505050801561501c575060015b61508b576150286182e0565b806308c379a003615050575061503c618302565b806150475750615052565b80915050615086565b505b3d806000811461507e576040519150601f19603f3d011682016040523d82523d6000602084013e615083565b606091505b50505b615090565b600191505b5b818193509350505094509492505050565b6000606060006150fb87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff161461514f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615146906182b3565b60405180910390fd5b60006060600061515e8761528d565b90506000813b036151aa57600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f6465000000000000000000000000815250915061527a565b80639e4177318b8b8b60001c8b60e001516040518563ffffffff1660e01b81526004016151da9493929190618220565b600060405180830381600087803b1580156151f457600080fd5b505af1925050508015615205575060015b615274576152116182e0565b806308c379a0036152395750615225618302565b80615230575061523b565b8092505061526f565b505b3d8060008114615267576040519150601f19603f3d011682016040523d82523d6000602084013e61526c565b606091505b50505b615279565b600192505b5b8282955095505050505094509492505050565b600061529c82606001516120c4565b9050919050565b60006152ae8761528d565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082615313576003615316565b60025b876080019060ff16908160ff1681525050826153325781615343565b604051806020016040528060008152505b876101000181905250600154639d2479988261535e8a612470565b6040518363ffffffff1660e01b815260040161537b92919061791a565b600060405180830381600087803b15801561539557600080fd5b505af11580156153a9573d6000803e3d6000fd5b5050505050505050505050565b600060606000606060006153c9866156e6565b3b0361541057600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525090506154e9565b615419856156e6565b632e00b39589898960001c8961012001516040518563ffffffff1660e01b81526004016154499493929190618220565b600060405180830381600087803b15801561546357600080fd5b505af1925050508015615474575060015b6154e3576154806182e0565b806308c379a0036154a85750615494618302565b8061549f57506154aa565b809150506154de565b505b3d80600081146154d6576040519150601f19603f3d011682016040523d82523d6000602084013e6154db565b606091505b50505b6154e8565b600191505b5b818193509350505094509492505050565b60006060600061555387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff16146155a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161559e906189c4565b60405180910390fd5b6000606060006155b6876156e6565b90506000813b0361560257600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506156d3565b80639e4177318b8b8b60001c8b61012001516040518563ffffffff1660e01b81526004016156339493929190618220565b600060405180830381600087803b15801561564d57600080fd5b505af192505050801561565e575060015b6156cd5761566a6182e0565b806308c379a003615692575061567e618302565b806156895750615694565b809250506156c8565b505b3d80600081146156c0576040519150601f19603f3d011682016040523d82523d6000602084013e6156c5565b606091505b50505b6156d2565b600192505b5b8282955095505050505094509492505050565b60006156f582606001516120c4565b9050919050565b6000615707876156e6565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760400181905250838760600181815250508261576c57600361576f565b60025b876080019060ff16908160ff16815250508261578b578161579c565b604051806020016040528060008152505b876101400181905250600154639d247998826157b78a61311d565b6040518363ffffffff1660e01b81526004016157d492919061791a565b600060405180830381600087803b1580156157ee57600080fd5b505af1158015615802573d6000803e3d6000fd5b5050505050505050505050565b61581761655e565b61581f61655e565b600061582a84615972565b905060005b81602001515181101561596757600082602001518281518110615855576158546189e4565b5b602002602001015190506000816000015161ffff16036158905761587881615b24565b846000019061ffff16908161ffff1681525050615953565b6001816000015161ffff16036158b6576158a981615b44565b8460200181905250615952565b6002816000015161ffff16036158e7576158d960206158d483615b52565b613631565b846040018181525050615951565b6003816000015161ffff16036159165761590861590382615b52565b613762565b846060018181525050615950565b6004816000015161ffff160361594f5761592f81615b60565b846080019067ffffffffffffffff16908167ffffffffffffffff16815250505b5b5b5b5b50808061595f906188b0565b91505061582f565b508192505050919050565b61597a61663a565b6006825110156159bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159b690618a5f565b60405180910390fd5b60006159c961663a565b6159db6159d68584615b80565b615baf565b816000019061ffff16908161ffff16815250506006826159fb9190617c87565b91506000808390505b8551811015615a5d57615a2b615a2687600284615a219190617c87565b615cda565b615d0b565b6006615a379190617e07565b63ffffffff1681615a489190617c87565b90508180615a55906188b0565b925050615a04565b60008267ffffffffffffffff811115615a7957615a78616bc3565b5b604051908082528060200260200182016040528015615ab257816020015b615a9f616658565b815260200190600190039081615a975790505b509050600092505b8651851015615b0e57615acb616658565b615ad58887615eec565b809750819250505080828580615aea906188b0565b965081518110615afd57615afc6189e4565b5b602002602001018190525050615aba565b8084602001819052508395505050505050919050565b6000615b3d615b3860028460400151616034565b615baf565b9050919050565b606081604001519050919050565b606081604001519050919050565b6000615b79615b7460088460400151613746565b616042565b9050919050565b60008251600283615b919190617c87565b1115615b9c57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff811115615bd557615bd4616bc3565b5b6040519080825280601f01601f191660200182016040528015615c075781602001600182028036833780820191505090505b50905081600160028110615c1e57615c1d6189e4565b5b1a60f81b81600081518110615c3657615c356189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060028110615c7957615c786189e4565b5b1a60f81b81600181518110615c9157615c906189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615ccd826000615b80565b9050809350505050919050565b60008251600483615ceb9190617c87565b1115615cf657600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff811115615d3157615d30616bc3565b5b6040519080825280601f01601f191660200182016040528015615d635781602001600182028036833780820191505090505b50905081600360048110615d7a57615d796189e4565b5b1a60f81b81600081518110615d9257615d916189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110615dd557615dd46189e4565b5b1a60f81b81600181518110615ded57615dec6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110615e3057615e2f6189e4565b5b1a60f81b81600281518110615e4857615e476189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110615e8b57615e8a6189e4565b5b1a60f81b81600381518110615ea357615ea26189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615edf826000615cda565b9050809350505050919050565b615ef4616658565b600082845111615f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f3090618af1565b60405180910390fd5b6006831015615f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f7490618b5d565b60405180910390fd5b615f85616658565b615f97615f928686615b80565b615baf565b816000019061ffff16908161ffff1681525050600284615fb79190617c87565b9350615fcb615fc68686615cda565b615d0b565b816020019063ffffffff16908163ffffffff1681525050600484615fef9190617c87565b93506160068585836020015163ffffffff1661638f565b8160400181905250806020015163ffffffff16846160249190617c87565b9350808492509250509250929050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff81111561606857616067616bc3565b5b6040519080825280601f01601f19166020018201604052801561609a5781602001600182028036833780820191505090505b509050816007600881106160b1576160b06189e4565b5b1a60f81b816000815181106160c9576160c86189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160066008811061610c5761610b6189e4565b5b1a60f81b81600181518110616124576161236189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600560088110616167576161666189e4565b5b1a60f81b8160028151811061617f5761617e6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816004600881106161c2576161c16189e4565b5b1a60f81b816003815181106161da576161d96189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160036008811061621d5761621c6189e4565b5b1a60f81b81600481518110616235576162346189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110616278576162776189e4565b5b1a60f81b816005815181106162905761628f6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600881106162d3576162d26189e4565b5b1a60f81b816006815181106162eb576162ea6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811061632e5761632d6189e4565b5b1a60f81b81600781518110616346576163456189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616382826000616424565b9050809350505050919050565b60608351828461639f9190617c87565b11156163aa57600080fd5b60008267ffffffffffffffff8111156163c6576163c5616bc3565b5b6040519080825280601f01601f1916602001820160405280156163f85781602001600182028036833780820191505090505b5090506000806020830191508560208801019050616417828287616459565b8293505050509392505050565b600082516008836164359190617c87565b111561644057600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811061649857815183526020836164739190617c87565b92506020826164829190617c87565b91506020816164919190617c53565b905061645a565b60008103156164dd57600060018260206164b29190617c53565b6101006164bf9190618cb0565b6164c99190617c53565b905080198351168185511681811786525050505b505050565b604051806101600160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff1681526020016000815260200160608152602001606081525090565b6040518060a00160405280600061ffff168152602001606081526020016000801916815260200160008152602001600067ffffffffffffffff1681525090565b6040518060800160405280606081526020016000801916815260200160608152602001600063ffffffff1681525090565b604051806101200160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff16815260200160608152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126166bc576166bb616697565b5b8235905067ffffffffffffffff8111156166d9576166d861669c565b5b6020830191508360018202830111156166f5576166f46166a1565b5b9250929050565b6000819050919050565b6000616711826166fc565b9050919050565b61672181616706565b811461672c57600080fd5b50565b60008135905061673e81616718565b92915050565b60008083601f84011261675a57616759616697565b5b8235905067ffffffffffffffff8111156167775761677661669c565b5b602083019150836001820283011115616793576167926166a1565b5b9250929050565b6000806000806000606086880312156167b6576167b561668d565b5b600086013567ffffffffffffffff8111156167d4576167d3616692565b5b6167e0888289016166a6565b955095505060206167f38882890161672f565b935050604086013567ffffffffffffffff81111561681457616813616692565b5b61682088828901616744565b92509250509295509295909350565b6000602082840312156168455761684461668d565b5b60006168538482850161672f565b91505092915050565b60008115159050919050565b6168718161685c565b82525050565b600060208201905061688c6000830184616868565b92915050565b6000819050919050565b6168a581616892565b81146168b057600080fd5b50565b6000813590506168c28161689c565b92915050565b600080600080600080608087890312156168e5576168e461668d565b5b600087013567ffffffffffffffff81111561690357616902616692565b5b61690f89828a016166a6565b9650965050602061692289828a016168b3565b945050604087013567ffffffffffffffff81111561694357616942616692565b5b61694f89828a016166a6565b9350935050606061696289828a016168b3565b9150509295509295509295565b600063ffffffff82169050919050565b6169888161696f565b82525050565b60006020820190506169a3600083018461697f565b92915050565b6000806000604084860312156169c2576169c161668d565b5b60006169d0868287016168b3565b935050602084013567ffffffffffffffff8111156169f1576169f0616692565b5b6169fd86828701616744565b92509250509250925092565b60008060008060008060808789031215616a2657616a2561668d565b5b600087013567ffffffffffffffff811115616a4457616a43616692565b5b616a5089828a016166a6565b96509650506020616a6389828a0161672f565b945050604087013567ffffffffffffffff811115616a8457616a83616692565b5b616a9089828a016166a6565b93509350506060616aa389828a0161672f565b9150509295509295509295565b616ab98161685c565b8114616ac457600080fd5b50565b600081359050616ad681616ab0565b92915050565b60008060008060008060808789031215616af957616af861668d565b5b600087013567ffffffffffffffff811115616b1757616b16616692565b5b616b2389828a016166a6565b96509650506020616b3689828a0161672f565b9450506040616b4789828a01616ac7565b935050606087013567ffffffffffffffff811115616b6857616b67616692565b5b616b7489828a01616744565b92509250509295509295509295565b616b8c81616892565b82525050565b6000602082019050616ba76000830184616b83565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616bfb82616bb2565b810181811067ffffffffffffffff82111715616c1a57616c19616bc3565b5b80604052505050565b6000616c2d616683565b9050616c398282616bf2565b919050565b600067ffffffffffffffff821115616c5957616c58616bc3565b5b616c6282616bb2565b9050602081019050919050565b82818337600083830152505050565b6000616c91616c8c84616c3e565b616c23565b905082815260208101848484011115616cad57616cac616bad565b5b616cb8848285616c6f565b509392505050565b600082601f830112616cd557616cd4616697565b5b8135616ce5848260208601616c7e565b91505092915050565b60008060408385031215616d0557616d0461668d565b5b6000616d138582860161672f565b925050602083013567ffffffffffffffff811115616d3457616d33616692565b5b616d4085828601616cc0565b9150509250929050565b60008060008060008060808789031215616d6757616d6661668d565b5b600087013567ffffffffffffffff811115616d8557616d84616692565b5b616d9189828a016166a6565b96509650506020616da489828a0161672f565b9450506040616db589828a0161672f565b935050606087013567ffffffffffffffff811115616dd657616dd5616692565b5b616de289828a01616744565b92509250509295509295509295565b616dfa81616706565b82525050565b6000602082019050616e156000830184616df1565b92915050565b600060208284031215616e3157616e3061668d565b5b600082013567ffffffffffffffff811115616e4f57616e4e616692565b5b616e5b84828501616cc0565b91505092915050565b60008060208385031215616e7b57616e7a61668d565b5b600083013567ffffffffffffffff811115616e9957616e98616692565b5b616ea5858286016166a6565b92509250509250929050565b600061ffff82169050919050565b616ec881616eb1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015616f08578082015181840152602081019050616eed565b83811115616f17576000848401525b50505050565b6000616f2882616ece565b616f328185616ed9565b9350616f42818560208601616eea565b616f4b81616bb2565b840191505092915050565b616f5f81616892565b82525050565b616f6e816166fc565b82525050565b600067ffffffffffffffff82169050919050565b616f9181616f74565b82525050565b600060a083016000830151616faf6000860182616ebf565b5060208301518482036020860152616fc78282616f1d565b9150506040830151616fdc6040860182616f56565b506060830151616fef6060860182616f65565b5060808301516170026080860182616f88565b508091505092915050565b600060208201905081810360008301526170278184616f97565b905092915050565b60008060008060006060868803121561704b5761704a61668d565b5b600086013567ffffffffffffffff81111561706957617068616692565b5b617075888289016166a6565b95509550506020617088888289016168b3565b935050604086013567ffffffffffffffff8111156170a9576170a8616692565b5b6170b588828901616744565b92509250509295509295909350565b600060ff82169050919050565b6170da816170c4565b81146170e557600080fd5b50565b6000813590506170f7816170d1565b92915050565b617106816166fc565b811461711157600080fd5b50565b600081359050617123816170fd565b92915050565b60008060008060008060008060c0898b0312156171495761714861668d565b5b600089013567ffffffffffffffff81111561716757617166616692565b5b6171738b828c016166a6565b985098505060206171868b828c0161672f565b96505060406171978b828c01616ac7565b955050606089013567ffffffffffffffff8111156171b8576171b7616692565b5b6171c48b828c01616744565b945094505060806171d78b828c016170e8565b92505060a06171e88b828c01617114565b9150509295985092959890939650565b6172018161696f565b811461720c57600080fd5b50565b60008135905061721e816171f8565b92915050565b6000806000806080858703121561723e5761723d61668d565b5b600085013567ffffffffffffffff81111561725c5761725b616692565b5b61726887828801616cc0565b94505060206172798782880161672f565b935050604061728a8782880161672f565b925050606061729b8782880161720f565b91505092959194509250565b600082825260208201905092915050565b7f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b60006173146022836172a7565b915061731f826172b8565b604082019050919050565b6000602082019050818103600083015261734381617307565b9050919050565b600081905092915050565b6000617361838561734a565b935061736e838584616c6f565b82840190509392505050565b6000617387828486617355565b91508190509392505050565b7f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000600082015250565b60006173c9601e836172a7565b91506173d482617393565b602082019050919050565b600060208201905081810360008301526173f8816173bc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006174356020836172a7565b9150617440826173ff565b602082019050919050565b6000602082019050818103600083015261746481617428565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006174c76027836172a7565b91506174d28261746b565b604082019050919050565b600060208201905081810360008301526174f6816174ba565b9050919050565b7f5344504d73673a2073656e646572206e6f742076616c69642072656c61796572600082015250565b60006175336020836172a7565b915061753e826174fd565b602082019050919050565b6000602082019050818103600083015261756281617526565b9050919050565b7f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60008201527f75744d6561737572652069732030000000000000000000000000000000000000602082015250565b60006175c5602e836172a7565b91506175d082617569565b604082019050919050565b600060208201905081810360008301526175f4816175b8565b9050919050565b600061760682616ece565b617610818561734a565b9350617620818560208601616eea565b80840191505092915050565b600061763882846175fb565b915081905092915050565b7f5344505f4d53475f4552524f523a20657863657074696f6e206d65737361676560008201527f206861736820646f6573206e6f74206578697374000000000000000000000000602082015250565b600061769f6034836172a7565b91506176aa82617643565b604082019050919050565b600060208201905081810360008301526176ce81617692565b9050919050565b60006176e082616ece565b6176ea81856172a7565b93506176fa818560208601616eea565b61770381616bb2565b840191505092915050565b61771781616f74565b82525050565b600081519050919050565b600082825260208201905092915050565b60006177448261771d565b61774e8185617728565b935061775e818560208601616eea565b61776781616bb2565b840191505092915050565b600060e082019050617787600083018a616b83565b818103602083015261779981896176d5565b90506177a86040830188616df1565b6177b5606083018761697f565b6177c2608083018661770e565b81810360a08301526177d48185617739565b905081810360c08301526177e881846176d5565b905098975050505050505050565b7f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60008201527f742074696d656f757420776974682074696d656f75744d656173757265203200602082015250565b6000617852603f836172a7565b915061785d826177f6565b604082019050919050565b6000602082019050818103600083015261788181617845565b9050919050565b7f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f60008201527f7574206d65617375726500000000000000000000000000000000000000000000602082015250565b60006178e4602a836172a7565b91506178ef82617888565b604082019050919050565b60006020820190508181036000830152617913816178d7565b9050919050565b600060408201905061792f6000830185616df1565b81810360208301526179418184617739565b90509392505050565b7f5344504d73673a20696e76616c696420616d20636f6e74726163740000000000600082015250565b6000617980601b836172a7565b915061798b8261794a565b602082019050919050565b600060208201905081810360008301526179af81617973565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806179fd57607f821691505b602082108103617a1057617a0f6179b6565b5b50919050565b7f5344504d73673a206e6f742076616c696420616d20636f6e7472616374000000600082015250565b6000617a4c601d836172a7565b9150617a5782617a16565b602082019050919050565b60006020820190508181036000830152617a7b81617a3f565b9050919050565b7f756e737570706f72746564207364702076657273696f6e000000000000000000600082015250565b6000617ab86017836172a7565b9150617ac382617a82565b602082019050919050565b60006020820190508181036000830152617ae781617aab565b9050919050565b7f5344503a20696e76616c69642074696d656f7574206d65617375726500000000600082015250565b6000617b24601c836172a7565b9150617b2f82617aee565b602082019050919050565b60006020820190508181036000830152617b5381617b17565b9050919050565b7f5344504d73673a20696e76616c6964206d6f6e69746f7220636f6e7472616374600082015250565b6000617b906020836172a7565b9150617b9b82617b5a565b602082019050919050565b60006020820190508181036000830152617bbf81617b83565b9050919050565b6000819050919050565b617be1617bdc82616892565b617bc6565b82525050565b6000617bf38286617bd0565b602082019150617c038285617bd0565b602082019150617c138284617bd0565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000617c5e826166fc565b9150617c69836166fc565b925082821015617c7c57617c7b617c24565b5b828203905092915050565b6000617c92826166fc565b9150617c9d836166fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617cd257617cd1617c24565b5b828201905092915050565b6000617ce88261696f565b915063ffffffff8203617cfe57617cfd617c24565b5b600182019050919050565b7f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00600082015250565b6000617d3f601f836172a7565b9150617d4a82617d09565b602082019050919050565b60006020820190508181036000830152617d6e81617d32565b9050919050565b7f656e636f64655344504d6573736167653a20626f6479206c656e677468206f7660008201527f65726c696d697400000000000000000000000000000000000000000000000000602082015250565b6000617dd16027836172a7565b9150617ddc82617d75565b604082019050919050565b60006020820190508181036000830152617e0081617dc4565b9050919050565b6000617e128261696f565b9150617e1d8361696f565b92508263ffffffff03821115617e3657617e35617c24565b5b828201905092915050565b7f656e636f64655344504d6573736167653a207a65726f206d657373616765206960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e9d6021836172a7565b9150617ea882617e41565b604082019050919050565b60006020820190508181036000830152617ecc81617e90565b9050919050565b7f756e65787065637465642061746f6d696320666c616700000000000000000000600082015250565b6000617f096016836172a7565b9150617f1482617ed3565b602082019050919050565b60006020820190508181036000830152617f3881617efc565b9050919050565b7f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e00600082015250565b6000617f75601f836172a7565b9150617f8082617f3f565b602082019050919050565b60006020820190508181036000830152617fa481617f68565b9050919050565b7f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360008201527f20666c6167000000000000000000000000000000000000000000000000000000602082015250565b60006180076025836172a7565b915061801282617fab565b604082019050919050565b6000602082019050818103600083015261803681617ffa565b9050919050565b7f6279746573546f56617242797465733a206f6666736574206c6573732074686160008201527f6e206c656e677468206f6620626f647900000000000000000000000000000000602082015250565b60006180996030836172a7565b91506180a48261803d565b604082019050919050565b600060208201905081810360008301526180c88161808c565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b600061812b6023836172a7565b9150618136826180cf565b604082019050919050565b6000602082019050818103600083015261815a8161811e565b9050919050565b7f7661724279746573546f42797465733a206f6666736574206c6573732074686160008201527f6e2074686520696e707574206c656e6774680000000000000000000000000000602082015250565b60006181bd6032836172a7565b91506181c882618161565b604082019050919050565b600060208201905081810360008301526181ec816181b0565b9050919050565b60006181ff83856172a7565b935061820c838584616c6f565b61821583616bb2565b840190509392505050565b6000606082019050818103600083015261823b8186886181f3565b905061824a6020830185616df1565b818103604083015261825c8184617739565b905095945050505050565b7f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000600082015250565b600061829d601a836172a7565b91506182a882618267565b602082019050919050565b600060208201905081810360008301526182cc81618290565b9050919050565b60008160e01c9050919050565b600060033d11156182ff5760046000803e6182fc6000516182d3565b90505b90565b600060443d1061838f57618314616683565b60043d036004823e80513d602482011167ffffffffffffffff8211171561833c57505061838f565b808201805167ffffffffffffffff81111561835a575050505061838f565b80602083010160043d03850181111561837757505050505061838f565b61838682602001850186616bf2565b82955050505050505b90565b600060c08201905081810360008301526183ad81898b6181f3565b90506183bc6020830188616b83565b6183c96040830187616df1565b6183d6606083018661697f565b6183e36080830185616868565b81810360a08301526183f581846176d5565b905098975050505050505050565b6000602082019050818103600083015261841d81846176d5565b905092915050565b61842e816170c4565b82525050565b60006101408201905061844a600083018e616b83565b818103602083015261845d818c8e6181f3565b905061846c604083018b616b83565b818103606083015261847e818a6176d5565b905061848d6080830189616df1565b61849a60a083018861697f565b6184a760c083018761770e565b6184b460e0830186618425565b6184c2610100830185616868565b8181036101208301526184d581846176d5565b90509c9b505050505050505050505050565b600060c0820190506184fc600083018a616b83565b818103602083015261850f81888a6181f3565b905061851e6040830187616df1565b61852b606083018661697f565b618538608083018561770e565b81810360a083015261854a8184617739565b905098975050505050505050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b600061858e6007836172a7565b915061859982618558565b602082019050919050565b6000610140820190506185ba600083018d616b83565b81810360208301526185cd818b8d6181f3565b90506185dc604083018a616b83565b81810360608301526185ee81896176d5565b90506185fd6080830188616df1565b61860a60a083018761697f565b61861760c083018661770e565b61862460e0830185618425565b618632610100830184616868565b81810361012083015261864481618581565b90509b9a5050505050505050505050565b600060e08201905061866a600083018b616b83565b818103602083015261867d81898b6181f3565b905061868c6040830188616df1565b618699606083018761697f565b6186a6608083018661770e565b81810360a08301526186b88185617739565b905081810360c08301526186cc81846176d5565b90509998505050505050505050565b7f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060008201527f3220616e64203420666f72206e6f770000000000000000000000000000000000602082015250565b6000618737602f836172a7565b9150618742826186db565b604082019050919050565b600060208201905081810360008301526187668161872a565b9050919050565b7f6d73672069732074696d656f7574000000000000000000000000000000000000600082015250565b60006187a3600e836172a7565b91506187ae8261876d565b602082019050919050565b600060208201905081810360008301526187d281618796565b9050919050565b6187e2816166fc565b82525050565b60006060820190506187fd6000830186616b83565b61880a6020830185618425565b61881760408301846187d9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000618859826166fc565b9150618864836166fc565b9250826188745761887361881f565b5b828204905092915050565b600061888a826166fc565b9150618895836166fc565b9250826188a5576188a461881f565b5b828206905092915050565b60006188bb826166fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036188ed576188ec617c24565b5b600182019050919050565b6000618903826166fc565b915061890e836166fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561894757618946617c24565b5b828202905092915050565b7f5344505f4d53475f4552524f523a2073657175656e6365206e6f74206571756160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006189ae6021836172a7565b91506189b982618952565b604082019050919050565b600060208201905081810360008301526189dd816189a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000618a496017836172a7565b9150618a5482618a13565b602082019050919050565b60006020820190508181036000830152618a7881618a3c565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000618adb6023836172a7565b9150618ae682618a7f565b604082019050919050565b60006020820190508181036000830152618b0a81618ace565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000618b47600e836172a7565b9150618b5282618b11565b602082019050919050565b60006020820190508181036000830152618b7681618b3a565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115618bd457808604811115618bb057618baf617c24565b5b6001851615618bbf5780820291505b8081029050618bcd85618b7d565b9450618b94565b94509492505050565b600082618bed5760019050618ca9565b81618bfb5760009050618ca9565b8160018114618c115760028114618c1b57618c4a565b6001915050618ca9565b60ff841115618c2d57618c2c617c24565b5b8360020a915084821115618c4457618c43617c24565b5b50618ca9565b5060208310610133831016604e8410600b8410161715618c7f5782820a905083811115618c7a57618c79617c24565b5b618ca9565b618c8c8484846001618b8a565b92509050818404811115618ca357618ca2617c24565b5b81810290505b9392505050565b6000618cbb826166fc565b9150618cc6836166fc565b9250618cf37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484618bdd565b90509291505056fea467616e74696e666f794c867b22636f6d6d656e7473223a22222c22636f6d70696c6572223a7b2276657273696f6e223a22302e382e31342b636f6d6d69742e6533383065373766227d2c22636f6e74726163745f6769745f6964223a2232306561313033383066643034373331636562303234626264616462336639386430633962313630222c22636f6e74726163745f76657273696f6e223a302c226c616e6775616765223a22536f6c6964697479222c226f7574707574223a7b22616269223a5b7b22696e70757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a22636f6e7374727563746f72227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a226d6573736167654964222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e7438222c226e616d65223a2274696d656f75744d656173757265222c2274797065223a2275696e7438227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a2274696d656f7574222c2274797065223a2275696e74323536227d5d2c226e616d65223a224d657373616765563354696d656f7574496e666f222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a747275652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2270726576696f75734f776e6572222c2274797065223a226964656e74697479227d2c7b22696e6465786564223a747275652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a226e65774f776e6572222c2274797065223a226964656e74697479227d5d2c226e616d65223a224f776e6572736869705472616e73666572726564222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a226d6573736167654964222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2273656e646572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2273656e6465724944222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e743332222c226e616d65223a2273657175656e6365222c2274797065223a2275696e743332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e743634222c226e616d65223a226e6f6e6365222c2274797065223a2275696e743634227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e7438222c226e616d65223a2261746f6d6963466c6167222c2274797065223a2275696e7438227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22726573756c74222c2274797065223a22626f6f6c227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a226572724d7367222c2274797065223a22737472696e67227d5d2c226e616d65223a22526563656976654d6573736167655632222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a226d6573736167654964222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2273656e646572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2273656e6465724944222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e743332222c226e616d65223a2273657175656e6365222c2274797065223a2275696e743332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e743634222c226e616d65223a226e6f6e6365222c2274797065223a2275696e743634227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e7438222c226e616d65223a2261746f6d6963466c6167222c2274797065223a2275696e7438227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22726573756c74222c2274797065223a22626f6f6c227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a226572724d7367222c2274797065223a22737472696e67227d5d2c226e616d65223a22526563656976654d6573736167655633222c2274797065223a226576656e74227d2c7b22616e6f6e796d6f7573223a66616c73652c22696e70757473223a5b7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2273656e646572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2273656e6465724944222c2274797065223a2262797465733332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a2275696e743332222c226e616d65223a2273657175656e6365222c2274797065223a2275696e743332227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22726573756c74222c2274797065223a22626f6f6c227d2c7b22696e6465786564223a66616c73652c22696e7465726e616c54797065223a22737472696e67222c226e616d65223a226572724d7367222c2274797065223a22737472696e67227d5d2c226e616d65223a22726563656976654d657373616765222c2274797065223a226576656e74227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a225f616d5f636f6e7472616374222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2265787065637465645f646f6d61696e5f6e616d65222c2274797065223a22737472696e67227d5d2c226e616d65223a22536574416d436f6e7472616374416e64446f6d61696e222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a22616d41646472657373222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a22676574416d41646472657373222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a226765744c6f63616c446f6d61696e222c226f757470757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a226c6f63616c446f6d61696e48617368222c226f757470757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a226d6f6e69746f7241646472657373222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a226f776e6572222c226f757470757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2273656e646572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2273656e6465724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d5d2c226e616d65223a2271756572795032504d73675365714f6e436861696e222c226f757470757473223a5b7b22696e7465726e616c54797065223a2275696e743332222c226e616d65223a22222c2274797065223a2275696e743332227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2273656e646572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2273656e6465724944222c2274797065223a2262797465733332227d2c7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2272656365697665724944222c2274797065223a2262797465733332227d5d2c226e616d65223a2271756572795344504d657373616765536571222c226f757470757473223a5b7b22696e7465726e616c54797065223a2275696e743332222c226e616d65223a22222c2274797065223a2275696e743332227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2272656376446f6d61696e222c2274797065223a22737472696e67227d5d2c226e616d65223a22717565727956616c696461746564426c6f636b53746174654279446f6d61696e222c226f757470757473223a5b7b22636f6d706f6e656e7473223a5b7b22696e7465726e616c54797065223a2275696e743136222c226e616d65223a2276657273696f6e222c2274797065223a2275696e743136227d2c7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a22646f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22626c6f636b48617368222c2274797065223a2262797465733332227d2c7b22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a22626c6f636b486569676874222c2274797065223a2275696e74323536227d2c7b22696e7465726e616c54797065223a2275696e743634222c226e616d65223a22626c6f636b54696d657374616d70222c2274797065223a2275696e743634227d5d2c22696e7465726e616c54797065223a2273747275637420426c6f636b5374617465222c226e616d65223a22222c2274797065223a227475706c65227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a2273656e646572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a2273656e6465724944222c2274797065223a2262797465733332227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22706b67222c2274797065223a226279746573227d5d2c226e616d65223a22726563764d657373616765222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22657863657074696f6e4d7367417574686f72222c2274797065223a2262797465733332227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a22657863657074696f6e4d7367506b67222c2274797065223a226279746573227d5d2c226e616d65223a22726563764f6666436861696e457863657074696f6e222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a22222c2274797065223a226964656e74697479227d5d2c226e616d65223a2272656c61796572417574684d6170222c226f757470757473223a5b7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a22222c2274797065223a22626f6f6c227d5d2c2273746174654d75746162696c697479223a2276696577222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b5d2c226e616d65223a2272656e6f756e63654f776e657273686970222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d5d2c226e616d65223a2273656e644d657373616765222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2273656e6465724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d5d2c226e616d65223a2273656e644d65737361676546726f6d4d6f6e69746f72222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a2261746f6d6963222c2274797065223a22626f6f6c227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d5d2c226e616d65223a2273656e644d6573736167655632222c226f757470757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a2261746f6d6963222c2274797065223a22626f6f6c227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d2c7b22696e7465726e616c54797065223a2275696e7438222c226e616d65223a225f74696d656f75744d656173757265222c2274797065223a2275696e7438227d2c7b22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a225f74696d656f7574222c2274797065223a2275696e74323536227d5d2c226e616d65223a2273656e644d6573736167655633222c226f757470757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d5d2c226e616d65223a2273656e64556e6f7264657265644d657373616765222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2273656e6465724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d5d2c226e616d65223a2273656e64556e6f7264657265644d65737361676546726f6d4d6f6e69746f72222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a2261746f6d6963222c2274797065223a22626f6f6c227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d5d2c226e616d65223a2273656e64556e6f7264657265644d6573736167655632222c226f757470757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a227265636569766572446f6d61696e222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a2272656365697665724944222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a22626f6f6c222c226e616d65223a2261746f6d6963222c2274797065223a22626f6f6c227d2c7b22696e7465726e616c54797065223a226279746573222c226e616d65223a226d657373616765222c2274797065223a226279746573227d2c7b22696e7465726e616c54797065223a2275696e7438222c226e616d65223a225f74696d656f75744d656173757265222c2274797065223a2275696e7438227d2c7b22696e7465726e616c54797065223a2275696e74323536222c226e616d65223a225f74696d656f7574222c2274797065223a2275696e74323536227d5d2c226e616d65223a2273656e64556e6f7264657265644d6573736167655633222c226f757470757473223a5b7b22696e7465726e616c54797065223a2262797465733332222c226e616d65223a22222c2274797065223a2262797465733332227d5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a226e6577416d436f6e7472616374222c2274797065223a226964656e74697479227d5d2c226e616d65223a22736574416d436f6e7472616374222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a22646f6d61696e222c2274797065223a22737472696e67227d5d2c226e616d65223a227365744c6f63616c446f6d61696e222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a226e65774d6f6e69746f72436f6e7472616374222c2274797065223a226964656e74697479227d5d2c226e616d65223a227365744d6f6e69746f72436f6e7472616374222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a22737472696e67222c226e616d65223a225f646f6d61696e5f6e616d65222c2274797065223a22737472696e67227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a225f617574686f72222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a225f7265636569766572222c2274797065223a226964656e74697479227d2c7b22696e7465726e616c54797065223a2275696e743332222c226e616d65223a225f6e65775f736571222c2274797065223a2275696e743332227d5d2c226e616d65223a227365744d7367536571222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d2c7b22696e70757473223a5b7b22696e7465726e616c54797065223a226964656e74697479222c226e616d65223a226e65774f776e6572222c2274797065223a226964656e74697479227d5d2c226e616d65223a227472616e736665724f776e657273686970222c226f757470757473223a5b5d2c2273746174654d75746162696c697479223a226e6f6e70617961626c65222c2274797065223a2266756e6374696f6e227d5d2c22646576646f63223a7b226b696e64223a22646576222c226d6574686f6473223a7b226f776e65722829223a7b2264657461696c73223a2252657475726e7320746865206964656e74697479206f66207468652063757272656e74206f776e65722e227d2c2271756572795344504d65737361676553657128737472696e672c627974657333322c737472696e672c6279746573333229223a7b2264657461696c73223a225175657279207468652063757272656e7420736470206d6573736167652073657175656e636520666f7220746865206368616e6e656c206964656e7469746564206279206073656e646572446f6d61696e602c20206073656e6465724944602c20607265636569766572446f6d61696e6020616e64206072656365697665724944602e222c22706172616d73223a7b227265636569766572446f6d61696e223a2274686520646f6d61696e206e616d65206f662074686520726563656976696e6720626c6f636b636861696e2e222c2272656365697665724944223a22746865206964656e74697479206f66207468652072656365697665722e222c2273656e646572446f6d61696e223a2274686520646f6d61696e206e616d65206f66207468652073656e64696e6720626c6f636b636861696e2e222c2273656e6465724944223a22746865206964206f66207468652073656e6465722e227d7d2c22726563764d65737361676528737472696e672c627974657333322c627974657329223a7b2264657461696c73223a22414d20636f6e747261637420746861742077616e7420746f20666f727761726420746865206d65737361676520746f2074686520726563656976696e6720626c6f636b636861696e206e65656420746f2063616c6c2074686973206d6574686f6420746f2073656e642061757468206d6573736167652e222c22706172616d73223a7b22706b67223a2274686520726177206d6573736167652066726f6d20414d20636f6e7472616374222c2273656e646572446f6d61696e223a2274686520646f6d61696e206e616d65206f66207468652073656e64696e6720626c6f636b636861696e2e222c2273656e6465724944223a22746865206964656e74697479206f66207468652073656e6465722e227d7d2c22726563764f6666436861696e457863657074696f6e28627974657333322c627974657329223a7b2264657461696c73223a2243616c6c696e6720746869732066756e6374696f6e2063616e207375626d69742061206e6f74696669636174696f6e206d657373616765206f6620616e206f66662d636861696e20657863657074696f6e206469726563746c79206f6e2d636861696e2e2048657265207765206e65656420746f20766572696679207468617420746865206f66662d636861696e20657863657074696f6e20646f6573206f636375722c206966206974206973207375626d697474656420746f2074686520636f72726573706f6e64696e6720636861696e20746f20747269676765722074686520636f72726573706f6e64696e6720657863657074696f6e20726f6c6c6261636b2e222c22706172616d73223a7b22657863657074696f6e4d7367417574686f72223a223a222c22657863657074696f6e4d7367506b67223a223a227d7d2c2272656e6f756e63654f776e6572736869702829223a7b2264657461696c73223a224c65617665732074686520636f6e747261637420776974686f7574206f776e65722e2049742077696c6c206e6f7420626520706f737369626c6520746f2063616c6c20606f6e6c794f776e6572602066756e6374696f6e7320616e796d6f72652e2043616e206f6e6c792062652063616c6c6564206279207468652063757272656e74206f776e65722e204e4f54453a2052656e6f756e63696e67206f776e6572736869702077696c6c206c656176652074686520636f6e747261637420776974686f757420616e206f776e65722c20746865726562792072656d6f76696e6720616e792066756e6374696f6e616c6974792074686174206973206f6e6c7920617661696c61626c6520746f20746865206f776e65722e227d2c2273656e644d65737361676528737472696e672c6964656e746974792c627974657329223a7b2264657461696c73223a22536d61727420636f6e747261637473206e65656420746f2063616c6c2074686973206d6574686f6420746f2073656e64206f726465726c792063726f73732d636861696e206d6573736167657320696e2053445076312e2054686520646f6d61696e206e616d65206f66207468652073656e64696e6720626c6f636b636861696e2c20746865206964656e74697479206f66207468652073656e6465722c2074686520646f6d61696e206e616d65206f662074686520726563656976696e6720626c6f636b636861696e20616e6420746865206964656e74697479206f662074686520726563656976657220756e697175656c792064657465726d696e6520612063726f73732d636861696e206368616e6e656c2e2045616368206368616e6e656c206d61696e7461696e7320612073657175656e6365206e756d62657220776869636820696e637265617365732066726f6d207a65726f20746f20656e737572652074686174207468652063726f73732d636861696e206d65737361676573206f6620746865206368616e6e656c20617265207375626d6974746564206f6e20626c6f636b636861696e20696e20616e206f726465726c79206d616e6e65722e222c22706172616d73223a7b226d657373616765223a2274686520726177206d6573736167652066726f6d204441707020636f6e747261637473222c227265636569766572446f6d61696e223a2274686520646f6d61696e206e616d65206f662074686520726563656976696e6720626c6f636b636861696e2e222c2272656365697665724944223a22746865206964656e74697479206f66207468652072656365697665722e227d7d2c2273656e644d657373616765563228737472696e672c6964656e746974792c626f6f6c2c627974657329223a7b2264657461696c73223a22536d61727420636f6e747261637473206e65656420746f2063616c6c2074686973206d6574686f6420746f2073656e64206f726465726c792063726f73732d636861696e206d6573736167657320696e2053445076322e2054686520646f6d61696e206e616d65206f66207468652073656e64696e6720626c6f636b636861696e2c20746865206964656e74697479206f66207468652073656e6465722c2074686520646f6d61696e206e616d65206f662074686520726563656976696e6720626c6f636b636861696e20616e6420746865206964656e74697479206f662074686520726563656976657220756e697175656c792064657465726d696e6520612063726f73732d636861696e206368616e6e656c2e2045616368206368616e6e656c206d61696e7461696e7320612073657175656e6365206e756d62657220776869636820696e637265617365732066726f6d207a65726f20746f20656e737572652074686174207468652063726f73732d636861696e206d65737361676573206f6620746865206368616e6e656c20617265207375626d6974746564206f6e20626c6f636b636861696e20696e20616e206f726465726c79206d616e6e65722e222c22706172616d73223a7b2261746f6d6963223a2269662073656e64696e67207468652061746f6d696320726571756573742e222c226d657373616765223a2274686520726177206d6573736167652066726f6d204441707020636f6e747261637473222c227265636569766572446f6d61696e223a2274686520646f6d61696e206e616d65206f662074686520726563656976696e6720626c6f636b636861696e2e222c2272656365697665724944223a22746865206964656e74697479206f66207468652072656365697665722e227d2c2272657475726e73223a7b225f30223a22746865206d657373616765206964206f6620534450207061636b65742073656e742e227d7d2c2273656e64556e6f7264657265644d65737361676528737472696e672c6964656e746974792c627974657329223a7b2264657461696c73223a22536d61727420636f6e7472616374732063616c6c2074686973206d6574686f6420746f2073656e642063726f73732d636861696e206d65737361676573206f7574206f66206f7264657220696e2053445076312e205468652073657175656e6365206e756d62657220666f7220756e6f726465726564206d65737361676520697320603078666666666666666660206d65616e7320746861742074686973206d657373616765206973206f7574206f66206f726465722e222c22706172616d73223a7b226d657373616765223a2274686520726177206d6573736167652066726f6d204441707020636f6e747261637473222c227265636569766572446f6d61696e223a2274686520646f6d61696e206e616d65206f662074686520726563656976696e6720626c6f636b636861696e2e222c2272656365697665724944223a22746865206964656e74697479206f66207468652072656365697665722e227d7d2c2273656e64556e6f7264657265644d657373616765563228737472696e672c6964656e746974792c626f6f6c2c627974657329223a7b2264657461696c73223a22536d61727420636f6e7472616374732063616c6c2074686973206d6574686f6420746f2073656e642063726f73732d636861696e206d65737361676573206f7574206f66206f7264657220696e2053445076322e205468652073657175656e6365206e756d62657220666f7220756e6f726465726564206d65737361676520697320603078666666666666666660206d65616e7320746861742074686973206d657373616765206973206f7574206f66206f726465722e222c22706172616d73223a7b2261746f6d6963223a2269662073656e64696e67207468652061746f6d696320726571756573742e222c226d657373616765223a2274686520726177206d6573736167652066726f6d204441707020636f6e74726163747320222c227265636569766572446f6d61696e223a2274686520646f6d61696e206e616d65206f662074686520726563656976696e6720626c6f636b636861696e2e222c2272656365697665724944223a22746865206964656e74697479206f66207468652072656365697665722e227d2c2272657475726e73223a7b225f30223a22746865206d657373616765206964206f6620534450207061636b65742073656e742e227d7d2c22736574416d436f6e7472616374286964656e7469747929223a7b2264657461696c73223a2253445020636f6e747261637420617265206261736564206f6e2074686520417574684d65737361676520636f6e74726163742e2048657265207765207365742074686520417574684d65737361676520636f6e7472616374206964656e746974792e222c22706172616d73223a7b226e6577416d436f6e7472616374223a22746865206964656e74697479206f662074686520417574684d65737361676520636f6e74726163742e227d7d2c227365744c6f63616c446f6d61696e28737472696e6729223a7b2264657461696c73223a225365742074686520646f6d61696e206f66206c6f63616c20636861696e20746f20605344506020636f6e74726163742e222c22706172616d73223a7b22646f6d61696e223a2274686520646f6d61696e206e616d65206f66206c6f63616c20636861696e2e227d7d2c227472616e736665724f776e657273686970286964656e7469747929223a7b2264657461696c73223a225472616e7366657273206f776e657273686970206f662074686520636f6e747261637420746f2061206e6577206163636f756e742028606e65774f776e657260292e2043616e206f6e6c792062652063616c6c6564206279207468652063757272656e74206f776e65722e227d7d2c2273746174655661726961626c6573223a7b225f5f676170223a7b2264657461696c73223a225468697320656d7074792072657365727665642073706163652069732070757420696e20706c61636520746f20616c6c6f77206675747572652076657273696f6e7320746f20616464206e6577207661726961626c657320776974686f7574207368696674696e6720646f776e2073746f7261676520696e2074686520696e6865726974616e636520636861696e2e205365652068747470733a2f2f646f63732e6f70656e7a657070656c696e2e636f6d2f636f6e7472616374732f342e782f7570677261646561626c652373746f726167655f67617073227d7d2c2276657273696f6e223a317d2c2275736572646f63223a7b226b696e64223a2275736572222c226d6574686f6473223a7b7d2c2276657273696f6e223a317d7d2c2273657474696e6773223a7b22636f6d70696c6174696f6e546172676574223a7b225344504d73672e736f6c223a225344504d7367227d2c2265766d56657273696f6e223a226c6f6e646f6e222c226c6962726172696573223a7b7d2c226d65746164617461223a7b2262797465636f646548617368223a2269706673227d2c226f7074696d697a6572223a7b22656e61626c6564223a66616c73652c2272756e73223a3230307d2c2272656d617070696e6773223a5b5d7d2c22736f7572636573223a7b225344504d73672e736f6c223a7b226b656363616b323536223a22307832333935323734326530653931396430656636623930393334306233313831376162363764633962343134613537333633643935626365333434646165373739222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f31303136636539326231646562393232376636316665323037346238613930333661333032326663396562333065373861656237663731363833356166396234222c22647765623a2f697066732f516d4e6269313556393679716855586242626f625a714336696831373974436761424e3558636339645967546a39225d7d2c22696e74657266616365732f49417574684d6573736167652e736f6c223a7b226b656363616b323536223a22307832643031386137313230333565323861373163343436623866346531343035633734653265393134616238653261326236343638373033373231386334366535222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f31643063333939343030393534616462636637343264383337313066303562646639353061653835326633626130303937616261326139373861343665646336222c22647765623a2f697066732f516d55696943717973575a3256534b46316b4b766e6e576d7561316b545167386d4b686d79765259716947683556225d7d2c22696e74657266616365732f49436f6e74726163745573696e675344502e736f6c223a7b226b656363616b323536223a22307839366530303863323262396266663966323432346437333638623765346566396436343161393233376462363963333335346534363636303637396133623936222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f39343664383761613535613632633739303531393632656631396266363830303661626535633638346538616139363438396162316239303663656635353131222c22647765623a2f697066732f516d62706e3864564c3934503770653868616a774c424a6272576f54324e4b53396554315366614d617270793257225d7d2c22696e74657266616365732f49436f6e74726163745769746841636b732e736f6c223a7b226b656363616b323536223a22307838613430316362386565666433366663346231653430336234313164343631313832653830623165396431373331613738633333336330653361623135323138222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f64343765613762333630353838333335346339663366633963353061633731643765366563666565626635383437363538666537356532383339313333303339222c22647765623a2f697066732f516d55786a5a35414462424d6964594a5a7a674671427664466d347570505a736a6572355a414345766b776d7775225d7d2c22696e74657266616365732f495344504d6573736167652e736f6c223a7b226b656363616b323536223a22307866636265633261613561636661313462623461383132373833383265653266626431643135633161383762343539343764393163366637376161636566383762222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f38313736663733396466653030616264656463623638363534663131386337343262306433353032386361353462323535353131383333663537343335633665222c22647765623a2f697066732f516d6179316769776b564e456939534a71346e6e7469517647727075655978725361424d76656b324d6b764a5638225d7d2c22696e74657266616365732f4953756250726f746f636f6c2e736f6c223a7b226b656363616b323536223a22307837396463666363333266316261323732663364313434303066633934363035393233303438393531653330323438663839396364326338663533363661346132222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f64363136653935353465616437386330626131646136333530353064303637383266316663363738653233646235643463343539646431336362336538336339222c22647765623a2f697066732f516d5552707934537931335275327450346b6175676152584d476f7879596a68444a476e42747036695842797079225d7d2c226c69622f7364702f5344504c69622e736f6c223a7b226b656363616b323536223a22307837343034333961313662663662656139393436383165343963386233356637303263666637316238323630646139656134303463653363323233666161623135222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f61623264386564646436633766343835663239306131343864343533343935616332636432386539663832303432363732613733643263343938653263363237222c22647765623a2f697066732f516d50764c77676d6d596f6e64567467735657426b577479624e6a6d484348576252517446634d363268734d3153225d7d2c226c69622f7574696c732f4279746573546f54797065732e736f6c223a7b226b656363616b323536223a22307865646463643437313062346565303632346366326131366438343865316566353832643938616231666665386637323634396137656130313433373462663466222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f62383338623463386636653136366162376361616138633665376631366662353664373362303865653031326235636565313234623061623532666365346132222c22647765623a2f697066732f516d527167385a31464c416969316a557a4273737165704d4578596b32654d79556e614266714b355362377a5a69225d7d2c226c69622f7574696c732f436f6e746578742e736f6c223a7b226b656363616b323536223a22307834303931663866333162313231613565393865383638353463353039353432396630663330613865393336666263353162636434313961326162346537643133222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f33333033653964356361643863613363626563376161663935323561303566313566306663656162613362333662326330313735643266613835393062313735222c22647765623a2f697066732f516d527674766d5531574c555562787a394e666b4d4e6a717837415a657462394167673676346566384a595a6a52225d7d2c226c69622f7574696c732f4f776e61626c652e736f6c223a7b226b656363616b323536223a22307866303336373530653165613665326530663632623064613332353961346365366432663562626339356163306563336363636166396137366132633231663031222c226c6963656e7365223a224d4954222c2275726c73223a5b22627a7a2d7261773a2f2f63353031333661356139653264376533376439636239323532633030623234376439323235336439306331383134363962373865303666633131383233613435222c22647765623a2f697066732f516d63613951797a46576f43573448685250334e6e786b47426e44747157686b77506d6148704a525456326d3571225d7d2c226c69622f7574696c732f536166654d6174682e736f6c223a7b226b656363616b323536223a22307836643837666532326566313339323734656665343962313961633137383532313163383031656234326533386465336137623964376639363735616539383231222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f61623962353030353463633037373262653536393832653033386636333966643330343734353737393866653664343561643439396534353665306432366635222c22647765623a2f697066732f516d4e7731525875786652693635417576634452797978364d7659485277347455726f477873646f6b7439364136225d7d2c226c69622f7574696c732f53697a654f662e736f6c223a7b226b656363616b323536223a22307866333839346265633632333837343735616533303961633964623663613538393561323739386636663734633232366130376635633137303664306466633632222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f37663136313539383464393338346236393331666131313064306364623064373330396438323637613838613163643466393239343761396331393032343464222c22647765623a2f697066732f516d664256335346594c484b514b56716e79566e3562655074774e7a5232515765674b6652435436533956645969225d7d2c226c69622f7574696c732f544c565574696c732e736f6c223a7b226b656363616b323536223a22307864616133336339356632396665383033326663303866393232633733373231333630646232346234346133616435636431363939366139386437613166326238222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f61656662643466663137636131373136383163366439666361633063313433626133373264643166376537386234383331323633303236343836643465653937222c22647765623a2f697066732f516d61324a745a4757564654453167634c6f6a505773796e6b72566d4c6a696e6b39574151687852594d55687543225d7d2c226c69622f7574696c732f5479706573546f42797465732e736f6c223a7b226b656363616b323536223a22307834666238636433393836313336333631323463343065616661653031626466303936383434663739653765626534653732346435646534373363623638643532222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f33306366323731666330393466643735383362646466373437633138313134323031356163666630633461303666326230326430363566383833353336633538222c22647765623a2f697066732f516d654b694c67697754706879644e4c776271414132755372774b39794256673135714e45797a61706454597352225d7d2c226c69622f7574696c732f5574696c732e736f6c223a7b226b656363616b323536223a22307865383534333339646365393462313632366163313966613736346563313933636136653732656138353866396434633265356333366162323337303835303963222c226c6963656e7365223a224170616368652d322e30222c2275726c73223a5b22627a7a2d7261773a2f2f66303064323934393265663132626535356637373830386332356538396539343965343832393630636464656137383533383866386534323934666662653139222c22647765623a2f697066732f516d5036356b73697a69426768574456714e356577537154677a69796531667735426d3335566d4869584b544b73225d7d7d2c2276657273696f6e223a317d646970667358221220b8450ee38034086ee03bb7cc7e5b534e4b8e15cf0f4cd5b365f599e59cc9c32f64736f6c634300080e6b636f6d70696c655f6d6f6461314cd2 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin index 592b067f..039107d0 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b5062000032620000266200006460201b60201c565b6200006c60201b60201c565b60016009600033815260200190815260200160002060006101000a81548160ff021916908315150217905550620000ab565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b618d3f80620000bb6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063715018a6116100f9578063c09b261b11610097578063e552109211610071578063e5521092146104b6578063e5e55300146104d4578063eaa71e90146104f0578063ed46aafa1461050c576101a9565b8063c09b261b1461044e578063d513f34a1461046a578063db37c08b14610486576101a9565b806389223f80116100d357806389223f80146103c65780638da5cb5b146103e2578063a9d662af14610400578063b5db295a1461041e576101a9565b8063715018a6146103825780638037d45e1461038c578063838a102c146103aa576101a9565b8063343e77921161016657806342f116bd1161014057806342f116bd146102fc57806356cb2d0214610318578063627523a4146103365780636bba080814610366576101a9565b8063343e77921461029257806334d4725a146102c25780633ac6dfb1146102de576101a9565b806304f25f96146101ae5780630a6e15db146101ca5780630d9ae9e5146101fa5780631f56086f1461022a578063203c2c851461024657806325601cdd14610262575b600080fd5b6101c860048036038101906101c3919061679a565b61053c565b005b6101e460048036038101906101df919061682f565b6105a2565b6040516101f19190616877565b60405180910390f35b610214600480360381019061020f91906168c8565b6105c2565b604051610221919061698e565b60405180910390f35b610244600480360381019061023f919061682f565b6106ba565b005b610260600480360381019061025b91906169a9565b610759565b005b61027c60048036038101906102779190616a09565b610a32565b604051610289919061698e565b60405180910390f35b6102ac60048036038101906102a79190616adc565b610b30565b6040516102b99190616b92565b60405180910390f35b6102dc60048036038101906102d7919061679a565b610d32565b005b6102e6610d98565b6040516102f39190616b92565b60405180910390f35b61031660048036038101906103119190616cee565b610da2565b005b610320610e6d565b60405161032d9190616b92565b60405180910390f35b610350600480360381019061034b9190616adc565b610e73565b60405161035d9190616b92565b60405180910390f35b610380600480360381019061037b9190616d4a565b61106f565b005b61038a6110d6565b005b610394611132565b6040516103a19190616e00565b60405180910390f35b6103c460048036038101906103bf9190616e1b565b61113c565b005b6103e060048036038101906103db9190616d4a565b6111bc565b005b6103ea611223565b6040516103f79190616e00565b60405180910390f35b61040861122c565b6040516104159190616e00565b60405180910390f35b61043860048036038101906104339190616e64565b611232565b604051610445919061700d565b60405180910390f35b6104686004803603810190610463919061702f565b611380565b005b610484600480360381019061047f919061682f565b611598565b005b6104a0600480360381019061049b9190617129565b611635565b6040516104ad9190616b92565b60405180910390f35b6104be6118d4565b6040516104cb9190616e00565b60405180910390f35b6104ee60048036038101906104e99190617224565b6118da565b005b61050a6004803603810190610505919061682f565b611978565b005b61052660048036038101906105219190617129565b611a15565b6040516105339190616b92565b60405180910390f35b6000600254148061054e575033600254145b61058d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105849061732a565b60405180910390fd5b61059b858585338686611cae565b5050505050565b60096020528060005260406000206000915054906101000a900460ff1681565b600060035484846040516020016105da92919061737a565b6040516020818303038152906040528051906020012014610630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610627906173df565b60405180910390fd5b600061068188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508785611de3565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6106c2611e3f565b6106ca611223565b1461070a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107019061744b565b60405180910390fd5b6000810361074d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610744906174dd565b60405180910390fd5b61075681611e47565b50565b6009600033815260200190815260200160002060009054906101000a900460ff166107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b090617549565b60405180910390fd5b6107c16164e2565b61081883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505082611e8690919063ffffffff16565b8060e0015160ff16600003610862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610859906175db565b60405180910390fd5b8060e0015160ff166002036109f157806101000151600760008360400151604051602001610890919061762c565b6040516020818303038152906040528051906020012081526020019081526020016000206003015411156109b157600860008260200151815260200190815260200160002060009054906101000a900460ff16610922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610919906176b5565b60405180910390fd5b61092b846120c4565b6383c6d5a282602001518360400151846060015160001c8560c001518660a001518761012001518861014001516040518863ffffffff1660e01b815260040161097a9796959493929190617772565b600060405180830381600087803b15801561099457600080fd5b505af11580156109a8573d6000803e3d6000fd5b505050506109ec565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390617868565b60405180910390fd5b610a2c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a23906178fa565b60405180910390fd5b50505050565b60006003548484604051602001610a4a92919061737a565b6040516020818303038152906040528051906020012014610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906173df565b60405180910390fd5b6000610af788888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760001b8560001b611de3565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6000610b3f8787878686612136565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610bc7576000610bca565b60015b60ff168152602001610c218b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff8016815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610cb6600354826121d390919063ffffffff16565b600154639d24799833610cc884612470565b6040518363ffffffff1660e01b8152600401610ce592919061791a565b600060405180830381600087803b158015610cff57600080fd5b505af1158015610d13573d6000803e3d6000fd5b50505050610d1f6127a2565b8060200151925050509695505050505050565b60006002541480610d44575033600254145b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a9061732a565b60405180910390fd5b610d918585853386866127a4565b5050505050565b6000600354905090565b610daa611e3f565b610db2611223565b14610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de99061744b565b60405180910390fd5b60008203610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c90617996565b60405180910390fd5b8160018190555080604051602001610e4d919061762c565b604051602081830303815290604052805190602001206003819055505050565b60035481565b6000610e828787878686612933565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610f0a576000610f0d565b60015b60ff16815260200167ffffffffffffffff80168152602001610f748b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610ff3600354826121d390919063ffffffff16565b600154639d2479983361100584612470565b6040518363ffffffff1660e01b815260040161102292919061791a565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b5050505061105c6129d0565b8060200151925050509695505050505050565b60006002541480611081575033600254145b6110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b79061732a565b60405180910390fd5b6110ce8686868686866127a4565b505050505050565b6110de611e3f565b6110e6611223565b14611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d9061744b565b60405180910390fd5b6111306000611e47565b565b6000600154905090565b611144611e3f565b61114c611223565b1461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061744b565b60405180910390fd5b8060405160200161119d919061762c565b6040516020818303038152906040528051906020012060038190555050565b600060025414806111ce575033600254145b61120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061732a565b60405180910390fd5b61121b868686868686611cae565b505050505050565b60008054905090565b60015481565b61123a61655e565b60076000848460405160200161125192919061737a565b6040516020818303038152906040528051906020012081526020019081526020016000206040518060a00160405290816000820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820180546112b0906179e5565b80601f01602080910402602001604051908101604052809291908181526020018280546112dc906179e5565b80156113295780601f106112fe57610100808354040283529160200191611329565b820191906000526020600020905b81548152906001019060200180831161130c57829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905092915050565b33600154146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90617a62565b60405180910390fd5b6113d185858585856129d2565b600061142083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506129d9565b905060018163ffffffff16036114855761148086868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a9c565b611588565b60028163ffffffff16036114e8576114e386868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b61565b611587565b60038163ffffffff160361154b5761154686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612cad565b611586565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90617ace565b60405180910390fd5b5b5b611590612e1d565b505050505050565b6115a0611e3f565b6115a8611223565b146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061744b565b60405180910390fd5b6000810361162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290617996565b60405180910390fd5b8060018190555050565b60008060ff168360ff16101580156116545750600460ff168360ff1611155b611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90617b3a565b60405180910390fd5b6116a08989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018381526020018961172857600061172b565b60015b60ff1681526020016117828d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200160405180602001604052806000815250815250905061182660035482612e1f90919063ffffffff16565b6001600860008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d247998336118688461311d565b6040518363ffffffff1660e01b815260040161188592919061791a565b600060405180830381600087803b15801561189f57600080fd5b505af11580156118b3573d6000803e3d6000fd5b505050506118bf6129d0565b80602001519250505098975050505050505050565b60025481565b6118e2611e3f565b6118ea611223565b1461192a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119219061744b565b60405180910390fd5b600061193d858560001b8560001b611de3565b9050816005600083815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050505050565b611980611e3f565b611988611223565b146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061744b565b60405180910390fd5b60008103611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290617ba6565b60405180910390fd5b8060028190555050565b60008060ff168360ff1610158015611a345750600460ff168360ff1611155b611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90617b3a565b60405180910390fd5b611a808989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189611b08576000611b0b565b60015b60ff16815260200167ffffffffffffffff80168152602001611b728d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050611c0060035482612e1f90919063ffffffff16565b6001600860008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d24799833611c428461311d565b6040518363ffffffff1660e01b8152600401611c5f92919061791a565b600060405180830381600087803b158015611c7957600080fd5b505af1158015611c8d573d6000803e3d6000fd5b50505050611c996129d0565b80602001519250505098975050505050505050565b611cbb8686868585612136565b6000604051806080016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018660001b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200163ffffffff80168152509050600154639d24799885611d83846134dd565b6040518363ffffffff1660e01b8152600401611da092919061791a565b600060405180830381600087803b158015611dba57600080fd5b505af1158015611dce573d6000803e3d6000fd5b50505050611dda6127a2565b50505050505050565b600083604051602001611df6919061762c565b604051602081830303815290604052805190602001208383604051602001611e2093929190617be7565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600081519050611e95826129d9565b836000019063ffffffff16908163ffffffff1681525050611eb6602061361f565b81611ec19190617c53565b9050611ecd8183613631565b836020018181525050611ede61363f565b60ff1681611eec9190617c53565b90506000611efa8284613648565b905080846040018190525080516004611f139190617c87565b82611f1e9190617c53565b9150611f2a8284613631565b846060018181525050611f3b61363f565b60ff1682611f499190617c53565b9150611f558284613738565b846080019060ff16908160ff1681525050600182611f739190617c53565b9150611f7f8284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050600882611fab9190617c53565b9150611fb78284613754565b8460c0019063ffffffff16908163ffffffff1681525050600482611fdb9190617c53565b9150611fe78284613738565b8460e0019060ff16908160ff16815250506001826120059190617c53565b915060006120138385613648565b905061201e81613762565b85610100018181525050805160046120369190617c87565b836120419190617c53565b925061204d8385613648565b8561012001819052508461012001515160046120699190617c87565b836120749190617c53565b9250600260ff16856080015160ff1611156120bd576120938385613648565b8561014001819052508461014001515160046120af9190617c87565b836120ba9190617c53565b92505b5050505050565b600080602067ffffffffffffffff8111156120e2576120e1616bc3565b5b6040519080825280601f01601f1916602001820160405280156121145781602001600182028036833780820191505090505b5090506121236020848361381e565b61212e602082613828565b915050919050565b5050505050565b60008061214b858585613836565b905060006006600083815260200190815260200160002060009054906101000a900463ffffffff16905060066000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906121a890617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6002826000015163ffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790617d55565b60405180910390fd5b63ffffffff8260e0015151111561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390617de7565b60405180910390fd5b60008260e001515183604001515160796122869190617c87565b6122909190617c87565b905060008167ffffffffffffffff8111156122ae576122ad616bc3565b5b6040519080825280601f01601f1916602001820160405280156122e05781602001600182028036833780820191505090505b509050600082905061230c8163ff00000087600001516123009190617e07565b63ffffffff168461389f565b61231660206138a9565b816123219190617c53565b9050600085604001519050612337828285613ad8565b805160046123459190617c87565b826123509190617c53565b91506123618287606001518561381e565b61236961363f565b60ff16826123779190617c53565b915061238882876080015185613bac565b6001826123959190617c53565b91506123a6828760a0015185613bc3565b6123b060406138a9565b826123bb9190617c53565b91506123cc828760c0015185613bda565b6123d660206138a9565b826123e19190617c53565b91506123f2828760e0015185613ad8565b8560e001515160046124049190617c87565b8261240f9190617c53565b915061241c823385613bf1565b61242461363f565b60ff16826124329190617c53565b915061243f82868561381e565b61244761363f565b60ff16826124559190617c53565b91508280519060200120866020018181525050505050505050565b60606002826000015163ffffffff16146124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690617d55565b60405180910390fd5b63ffffffff8260e0015151111561250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250290617de7565b60405180910390fd5b6000801b826020015103612554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254b90617eb3565b60405180910390fd5b600080600260ff16846080015160ff1611905080156125b3578361010001515160048560e0015151866040015151605961258e9190617c87565b6125989190617c87565b6125a29190617c87565b6125ac9190617c87565b91506125d8565b8360e001515184604001515160596125cb9190617c87565b6125d59190617c87565b91505b60008267ffffffffffffffff8111156125f4576125f3616bc3565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b50905060008390506126528163ff00000088600001516126469190617e07565b63ffffffff168461389f565b61265c60206138a9565b816126679190617c53565b90506126788187602001518461381e565b61268061363f565b60ff168161268e9190617c53565b90506000866040015190506126a4828285613ad8565b805160046126b29190617c87565b826126bd9190617c53565b91506126ce8288606001518561381e565b6126d661363f565b60ff16826126e49190617c53565b91506126f582886080015185613bac565b6001826127029190617c53565b9150612713828860a0015185613bc3565b61271d60406138a9565b826127289190617c53565b9150612739828860c0015185613bda565b61274360206138a9565b8261274e9190617c53565b915061275f828860e0015185613ad8565b8660e001515160046127719190617c87565b8261277c9190617c53565b91508315612795576127948288610100015185613ad8565b5b8295505050505050919050565b565b6127b18686868585612933565b60008460001b90506000604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016128af8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888661293a565b63ffffffff16815250905060006128c5826134dd565b9050600154639d24799887836040518363ffffffff1660e01b81526004016128ee92919061791a565b600060405180830381600087803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b505050506129286129d0565b505050505050505050565b5050505050565b600080612948858585613836565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905060046000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906129a590617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b565b5050505050565b60008060008351905060048103602085010151915060ff60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612a9057600080600467ffffffffffffffff811115612a3957612a38616bc3565b5b6040519080825280601f01601f191660200182016040528015612a6b5781602001600182028036833780820191505090505b5090506003830360200186015160218201526004810151915081945050505050612a97565b6001925050505b919050565b612aa461659e565b612ab78282613bfb90919063ffffffff16565b6003548160000151604051602001612acf919061762c565b6040516020818303038152906040528051906020012014612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c906173df565b60405180910390fd5b63ffffffff8016816060015163ffffffff1603612b4d57612b4885858584613daf565b612b5a565b612b5985858584613e1f565b5b5050505050565b612b696165cf565b612b7c828261404090919063ffffffff16565b6003548160400151604051602001612b94919061762c565b6040516020818303038152906040528051906020012014612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be1906173df565b60405180910390fd5b600060ff16816080015160ff161480612c0d5750600160ff16816080015160ff16145b15612c2357612c1e858585846141f5565b612ca6565b600260ff16816080015160ff1603612c4657612c4185858584614325565b612ca5565b600360ff16816080015160ff1603612c6957612c648585858461440d565b612ca4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b90617f1f565b60405180910390fd5b5b5b5050505050565b612cb56164e2565b612cc88282611e8690919063ffffffff16565b6003548160400151604051602001612ce0919061762c565b6040516020818303038152906040528051906020012014612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90617f8b565b60405180910390fd5b600060ff16816080015160ff161480612d595750600160ff16816080015160ff16145b15612d6f57612d6a85858584614503565b612e16565b600260ff16816080015160ff1603612d9257612d8d8585858461479c565b612e15565b600360ff16816080015160ff1603612db557612db0858585846148cd565b612e14565b600460ff16816080015160ff1603612dd857612dd385858584614a0c565b612e13565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a9061801d565b60405180910390fd5b5b5b5b5050505050565b565b6003826000015163ffffffff1614612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6390617d55565b60405180910390fd5b63ffffffff826101200151511115612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb090617de7565b60405180910390fd5b6000612ec9836101000151614bd1565b90506000815184610120015151856040015151607e612ee89190617c87565b612ef29190617c87565b612efc9190617c87565b905060008167ffffffffffffffff811115612f1a57612f19616bc3565b5b6040519080825280601f01601f191660200182016040528015612f4c5781602001600182028036833780820191505090505b5090506000829050612f728163ff0000008860000151612f6c9190617e07565b84613bda565b612f7c60206138a9565b81612f879190617c53565b9050600086604001519050612f9d828285613ad8565b80516004612fab9190617c87565b82612fb69190617c53565b9150612fc78288606001518561381e565b612fcf61363f565b60ff1682612fdd9190617c53565b9150612fee82886080015185613bac565b600182612ffb9190617c53565b915061300c828860a0015185613bc3565b61301660406138a9565b826130219190617c53565b9150613032828860c0015185613bda565b61303c60206138a9565b826130479190617c53565b9150613058828860e0015185613bac565b6001826130659190617c53565b9150613072828685613ad8565b845160046130809190617c87565b8261308b9190617c53565b915061309d8288610120015185613ad8565b8661012001515160046130b09190617c87565b826130bb9190617c53565b91506130c8823385613bf1565b6130d061363f565b60ff16826130de9190617c53565b91506130eb82878561381e565b6130f361363f565b60ff16826131019190617c53565b9150828051906020012087602001818152505050505050505050565b60606003826000015163ffffffff161461316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390617d55565b60405180910390fd5b63ffffffff8261012001515111156131b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b090617de7565b60405180910390fd5b6000801b826020015103613202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f990617eb3565b60405180910390fd5b600080600260ff16846080015160ff161190506000613225856101000151614bd1565b9050811561328057846101400151516004825187610120015151886040015151605e6132519190617c87565b61325b9190617c87565b6132659190617c87565b61326f9190617c87565b6132799190617c87565b92506132b2565b805185610120015151866040015151605e61329b9190617c87565b6132a59190617c87565b6132af9190617c87565b92505b60008367ffffffffffffffff8111156132ce576132cd616bc3565b5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b50905060008490506133268163ff00000089600001516133209190617e07565b84613bda565b61333060206138a9565b8161333b9190617c53565b905061334c8188602001518461381e565b61335461363f565b60ff16816133629190617c53565b9050600087604001519050613378828285613ad8565b805160046133869190617c87565b826133919190617c53565b91506133a28289606001518561381e565b6133aa61363f565b60ff16826133b89190617c53565b91506133c982896080015185613bac565b6001826133d69190617c53565b91506133e7828960a0015185613bc3565b6133f160406138a9565b826133fc9190617c53565b915061340d828960c0015185613bda565b61341760206138a9565b826134229190617c53565b9150613433828960e0015185613bac565b6001826134409190617c53565b915061344d828585613ad8565b8351600461345b9190617c87565b826134669190617c53565b91506134788289610120015185613ad8565b87610120015151600461348b9190617c87565b826134969190617c53565b915084156134cf576134ae8289610140015185613ad8565b8761014001515160046134c19190617c87565b826134cc9190617c53565b91505b829650505050505050919050565b606060006134ee8360000151614cda565b602060046134ff8660400151614d32565b6135099190617c87565b6135139190617c87565b61351d9190617c87565b905060008167ffffffffffffffff81111561353b5761353a616bc3565b5b6040519080825280601f01601f19166020018201604052801561356d5781602001600182028036833780820191505090505b509050600082905061358481866000015184614d8a565b6135918560000151614cda565b8161359c9190617c53565b90506135ad8186602001518461381e565b6135b561363f565b60ff16816135c39190617c53565b90506135d481866060015184613bda565b6135de602061361f565b816135e99190617c53565b90506135fa81866040015184614d8a565b6136078560400151614d32565b816136129190617c53565b9050819350505050919050565b600061362a826138a9565b9050919050565b600082820151905092915050565b60006020905090565b606060006136568484613754565b63ffffffff16905060048461366b9190617c53565b9350838111156136b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a7906180af565b60405180910390fd5b80846136bc9190617c53565b935060608115600081146136db5760405191506020820160405261372c565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561371957805183526020830192506020810190506136fc565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b600082820151905092915050565b600082820151905092915050565b6000808251905060208111156137ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a490618141565b60405180910390fd5b60008167ffffffffffffffff8111156137c9576137c8616bc3565b5b6040519080825280601f01601f1916602001820160405280156137fb5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b8183820152505050565b600082820151905092915050565b60008061384284614df5565b90508085604051602001613856919061762c565b604051602081830303815290604052805190602001208460405160200161387f93929190617be7565b604051602081830303815290604052805190602001209150509392505050565b8183820152505050565b600081600881146139b657601081146139bf57601881146139c857602081146139d157602881146139da57603081146139e357603881146139ec57604081146139f557604881146139fe5760508114613a075760588114613a105760608114613a195760688114613a225760708114613a2b5760788114613a345760808114613a3d5760888114613a465760908114613a4f5760988114613a585760a08114613a615760a88114613a6a5760b08114613a735760b88114613a7c5760c08114613a855760c88114613a8e5760d08114613a975760d88114613aa05760e08114613aa95760e88114613ab25760f08114613abb5760f88114613ac4576101008114613acd5760209150613ad2565b60019150613ad2565b60029150613ad2565b60039150613ad2565b60049150613ad2565b60059150613ad2565b60069150613ad2565b60079150613ad2565b60089150613ad2565b60099150613ad2565b600a9150613ad2565b600b9150613ad2565b600c9150613ad2565b600d9150613ad2565b600e9150613ad2565b600f9150613ad2565b60109150613ad2565b60119150613ad2565b60129150613ad2565b60139150613ad2565b60149150613ad2565b60159150613ad2565b60169150613ad2565b60179150613ad2565b60189150613ad2565b60199150613ad2565b601a9150613ad2565b601b9150613ad2565b601c9150613ad2565b601d9150613ad2565b601e9150613ad2565b601f9150613ad2565b602091505b50919050565b600082519050613ae9848284613bda565b600484613af69190617c53565b93508063ffffffff16841015613b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b38906181d3565b60405180910390fd5b8063ffffffff1684613b539190617c53565b9350801560008103613ba5578483018051601f84168015602002818801018581018215602002838601015b81831015613b9b5782518152602083019250602081019050613b7e565b5083855250505050505b5050505050565b828101600181038051848352808252505050505050565b828101600881038051848352808252505050505050565b828101600481038051848352808252505050505050565b8183820152505050565b60008151905060006020613c0f8385613754565b613c199190617e07565b905060008163ffffffff1667ffffffffffffffff811115613c3d57613c3c616bc3565b5b6040519080825280601f01601f191660200182016040528015613c6f5781602001600182028036833780820191505090505b509050613c7d838583614e5b565b613c8681614d32565b83613c919190617c53565b92506000613c9f8486613631565b9050613ca961363f565b60ff1684613cb79190617c53565b93506000613cc58587613754565b9050613cd160206138a9565b85613cdc9190617c53565b945060006020613cec8789613754565b613cf69190617e07565b905060008163ffffffff1667ffffffffffffffff811115613d1a57613d19616bc3565b5b6040519080825280601f01601f191660200182016040528015613d4c5781602001600182028036833780820191505090505b509050613d5a878983614e5b565b613d6381614d32565b87613d6e9190617c53565b96508489600001819052508389602001818152505082896060019063ffffffff16908163ffffffff1681525050808960400181905250505050505050505050565b613db881614eb3565b632e00b39585858560001c85604001516040518563ffffffff1660e01b8152600401613de79493929190618220565b600060405180830381600087803b158015613e0157600080fd5b505af1158015613e15573d6000803e3d6000fd5b5050505050505050565b6000613e7485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050848460200151614ec9565b90508063ffffffff16826060015163ffffffff1614613ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ebf906182b3565b60405180910390fd5b600060606000613ed785614eb3565b90506000813b03613f2357600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509150613ff3565b80639e41773189898960001c89604001516040518563ffffffff1660e01b8152600401613f539493929190618220565b600060405180830381600087803b158015613f6d57600080fd5b505af1925050508015613f7e575060015b613fed57613f8a6182e0565b806308c379a003613fb25750613f9e618302565b80613fa95750613fb4565b80925050613fe8565b505b3d8060008114613fe0576040519150601f19603f3d011682016040523d82523d6000602084013e613fe5565b606091505b50505b613ff2565b600192505b5b7fc5c107ebb3f0bb97a017b6d166d57ad3349b9114ef620914f2178b3559310abf8888888488888860405161402e9796959493929190618392565b60405180910390a15050505050505050565b60008151905061404f826129d9565b836000019063ffffffff16908163ffffffff1681525050614070602061361f565b8161407b9190617c53565b90506140878183613631565b83602001818152505061409861363f565b60ff16816140a69190617c53565b905060006140b48284613648565b9050808460400181905250805160046140cd9190617c87565b826140d89190617c53565b91506140e48284613631565b8460600181815250506140f561363f565b60ff16826141039190617c53565b915061410f8284613738565b846080019060ff16908160ff168152505060018261412d9190617c53565b91506141398284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff16815250506008826141659190617c53565b91506141718284613754565b8460c0019063ffffffff16908163ffffffff16815250506004826141959190617c53565b91506141a18284613648565b8460e001819052508360e001515160046141bb9190617c87565b826141c69190617c53565b9150600260ff16846080015160ff1611156141ef576141e58284613648565b8461010001819052505b50505050565b6000606063ffffffff80168360c0015163ffffffff16036142805761421c86868686614f5f565b8092508193505050600060ff16836080015160ff160361427b57818190614279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142709190618403565b60405180910390fd5b505b614295565b61428c868686866150a2565b80925081935050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239836020015187878787604001516142cc8961528d565b8960c001518a60a001518b608001518b8b6040516142f49b9a99989796959493929190618434565b60405180910390a1600160ff16836080015160ff160361431d5761431c8387878786866152a3565b5b505050505050565b61432e8161528d565b6315390358826020015186868660001c8660c001518760a001518860e001516040518863ffffffff1660e01b815260040161436f97969594939291906184e7565b600060405180830381600087803b15801561438957600080fd5b505af115801561439d573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516143d88761528d565b8760c001518860a00151896080015160016040516143ff9a999897969594939291906185a4565b60405180910390a150505050565b6144168161528d565b6383c6d5a2826020015186868660001c8660c001518760a001518860e001518961010001516040518963ffffffff1660e01b815260040161445e989796959493929190618655565b600060405180830381600087803b15801561447857600080fd5b505af115801561448c573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516144c78761528d565b8760c001518860a00151896080015160018b61010001516040516144f59b9a99989796959493929190618434565b60405180910390a150505050565b6000606060008360e0015160ff161480614524575060028360e0015160ff16145b80614536575060048360e0015160ff16145b614575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161456c9061874d565b60405180910390fd5b60028360e0015160ff16036145d05743836101000151116145cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145c2906187b9565b60405180910390fd5b614628565b60048360e0015160ff1603614627574283610100015111614626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161461d906187b9565b60405180910390fd5b5b5b63ffffffff80168360c0015163ffffffff16036146af5761464b868686866153b6565b8092508193505050600060ff16836080015160ff16036146aa578181906146a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161469f9190618403565b60405180910390fd5b505b6146c4565b6146bb868686866154fa565b80925081935050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c9836020015187878787604001516146fb896156e6565b8960c001518a60a001518b608001518b8b6040516147239b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e0015185610100015160405161476b939291906187e8565b60405180910390a1600160ff16836080015160ff1603614794576147938387878786866156fc565b5b505050505050565b6147a5816156e6565b6315390358826020015186868660001c8660c001518760a001518861012001516040518863ffffffff1660e01b81526004016147e797969594939291906184e7565b600060405180830381600087803b15801561480157600080fd5b505af1158015614815573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614850876156e6565b8760c001518860a00151896080015160016040516148779a999897969594939291906185a4565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516148bf939291906187e8565b60405180910390a150505050565b6148d6816156e6565b6383c6d5a2826020015186868660001c8660c001518760a001518861012001518961014001516040518963ffffffff1660e01b815260040161491f989796959493929190618655565b600060405180830381600087803b15801561493957600080fd5b505af115801561494d573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614988876156e6565b8760c001518860a00151896080015160018b61014001516040516149b69b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516149fe939291906187e8565b60405180910390a150505050565b6000614a1c82610120015161580f565b90508060400151600760008787604051602001614a3a92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600201819055508060800151600760008787604051602001614a8192919061737a565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060600151600760008787604051602001614aea92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600301819055507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c982602001518686868660400151614b4c886156e6565b8860c001518960a001518a6080015160018c6101400151604051614b7a9b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e00151846101000151604051614bc2939291906187e8565b60405180910390a15050505050565b60606000602067ffffffffffffffff811115614bf057614bef616bc3565b5b6040519080825280601f01601f191660200182016040528015614c225781602001600182028036833780820191505090505b5090506000602067ffffffffffffffff811115614c4257614c41616bc3565b5b6040519080825280601f01601f191660200182016040528015614c745781602001600182028036833780820191505090505b509050606084602084015260015b6020811015614cce578060208501035181602085010351808203614cc15760405193506020860151838501528284528260208501016040525050614cce565b5050600181019050614c82565b50809350505050919050565b600060208251614cea919061884e565b9050600060208351614cfc919061887f565b14614d10578080614d0c906188b0565b9150505b8080614d1b906188b0565b915050602081614d2b91906188f8565b9050919050565b600060208251614d42919061884e565b9050600060208351614d54919061887f565b14614d68578080614d64906188b0565b9150505b8080614d73906188b0565b915050602081614d8391906188f8565b9050919050565b600060208351614d9a919061884e565b9050600060208451614dac919061887f565b1115614dc1578080614dbd906188b0565b9150505b60006001820191505b81811015614dee576020810284015185840152602085039450600181019050614dca565b5050505050565b600080602067ffffffffffffffff811115614e1357614e12616bc3565b5b6040519080825280601f01601f191660200182016040528015614e455781602001600182028036833780820191505090505b5090508260208201526020810151915050919050565b6000602090506000808585015192506001602084040190506000602084061115614e86576001810190505b5b80821015614eab578585015160208302850152602086039550600182019150614e87565b505050505050565b6000614ec282602001516120c4565b9050919050565b600080614ed7858585611de3565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905060056000838152602001908152602001600020600081819054906101000a900463ffffffff1680929190614f3490617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b60006060600060606000614f728661528d565b3b03614fb957600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509050615091565b614fc28561528d565b632e00b39589898960001c8960e001516040518563ffffffff1660e01b8152600401614ff19493929190618220565b600060405180830381600087803b15801561500b57600080fd5b505af192505050801561501c575060015b61508b576150286182e0565b806308c379a003615050575061503c618302565b806150475750615052565b80915050615086565b505b3d806000811461507e576040519150601f19603f3d011682016040523d82523d6000602084013e615083565b606091505b50505b615090565b600191505b5b818193509350505094509492505050565b6000606060006150fb87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff161461514f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615146906182b3565b60405180910390fd5b60006060600061515e8761528d565b90506000813b036151aa57600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f6465000000000000000000000000815250915061527a565b80639e4177318b8b8b60001c8b60e001516040518563ffffffff1660e01b81526004016151da9493929190618220565b600060405180830381600087803b1580156151f457600080fd5b505af1925050508015615205575060015b615274576152116182e0565b806308c379a0036152395750615225618302565b80615230575061523b565b8092505061526f565b505b3d8060008114615267576040519150601f19603f3d011682016040523d82523d6000602084013e61526c565b606091505b50505b615279565b600192505b5b8282955095505050505094509492505050565b600061529c82606001516120c4565b9050919050565b60006152ae8761528d565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082615313576003615316565b60025b876080019060ff16908160ff1681525050826153325781615343565b604051806020016040528060008152505b876101000181905250600154639d2479988261535e8a612470565b6040518363ffffffff1660e01b815260040161537b92919061791a565b600060405180830381600087803b15801561539557600080fd5b505af11580156153a9573d6000803e3d6000fd5b5050505050505050505050565b600060606000606060006153c9866156e6565b3b0361541057600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525090506154e9565b615419856156e6565b632e00b39589898960001c8961012001516040518563ffffffff1660e01b81526004016154499493929190618220565b600060405180830381600087803b15801561546357600080fd5b505af1925050508015615474575060015b6154e3576154806182e0565b806308c379a0036154a85750615494618302565b8061549f57506154aa565b809150506154de565b505b3d80600081146154d6576040519150601f19603f3d011682016040523d82523d6000602084013e6154db565b606091505b50505b6154e8565b600191505b5b818193509350505094509492505050565b60006060600061555387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff16146155a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161559e906189c4565b60405180910390fd5b6000606060006155b6876156e6565b90506000813b0361560257600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506156d3565b80639e4177318b8b8b60001c8b61012001516040518563ffffffff1660e01b81526004016156339493929190618220565b600060405180830381600087803b15801561564d57600080fd5b505af192505050801561565e575060015b6156cd5761566a6182e0565b806308c379a003615692575061567e618302565b806156895750615694565b809250506156c8565b505b3d80600081146156c0576040519150601f19603f3d011682016040523d82523d6000602084013e6156c5565b606091505b50505b6156d2565b600192505b5b8282955095505050505094509492505050565b60006156f582606001516120c4565b9050919050565b6000615707876156e6565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760400181905250838760600181815250508261576c57600361576f565b60025b876080019060ff16908160ff16815250508261578b578161579c565b604051806020016040528060008152505b876101400181905250600154639d247998826157b78a61311d565b6040518363ffffffff1660e01b81526004016157d492919061791a565b600060405180830381600087803b1580156157ee57600080fd5b505af1158015615802573d6000803e3d6000fd5b5050505050505050505050565b61581761655e565b61581f61655e565b600061582a84615972565b905060005b81602001515181101561596757600082602001518281518110615855576158546189e4565b5b602002602001015190506000816000015161ffff16036158905761587881615b24565b846000019061ffff16908161ffff1681525050615953565b6001816000015161ffff16036158b6576158a981615b44565b8460200181905250615952565b6002816000015161ffff16036158e7576158d960206158d483615b52565b613631565b846040018181525050615951565b6003816000015161ffff16036159165761590861590382615b52565b613762565b846060018181525050615950565b6004816000015161ffff160361594f5761592f81615b60565b846080019067ffffffffffffffff16908167ffffffffffffffff16815250505b5b5b5b5b50808061595f906188b0565b91505061582f565b508192505050919050565b61597a61663a565b6006825110156159bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159b690618a5f565b60405180910390fd5b60006159c961663a565b6159db6159d68584615b80565b615baf565b816000019061ffff16908161ffff16815250506006826159fb9190617c87565b91506000808390505b8551811015615a5d57615a2b615a2687600284615a219190617c87565b615cda565b615d0b565b6006615a379190617e07565b63ffffffff1681615a489190617c87565b90508180615a55906188b0565b925050615a04565b60008267ffffffffffffffff811115615a7957615a78616bc3565b5b604051908082528060200260200182016040528015615ab257816020015b615a9f616658565b815260200190600190039081615a975790505b509050600092505b8651851015615b0e57615acb616658565b615ad58887615eec565b809750819250505080828580615aea906188b0565b965081518110615afd57615afc6189e4565b5b602002602001018190525050615aba565b8084602001819052508395505050505050919050565b6000615b3d615b3860028460400151616034565b615baf565b9050919050565b606081604001519050919050565b606081604001519050919050565b6000615b79615b7460088460400151613746565b616042565b9050919050565b60008251600283615b919190617c87565b1115615b9c57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff811115615bd557615bd4616bc3565b5b6040519080825280601f01601f191660200182016040528015615c075781602001600182028036833780820191505090505b50905081600160028110615c1e57615c1d6189e4565b5b1a60f81b81600081518110615c3657615c356189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060028110615c7957615c786189e4565b5b1a60f81b81600181518110615c9157615c906189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615ccd826000615b80565b9050809350505050919050565b60008251600483615ceb9190617c87565b1115615cf657600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff811115615d3157615d30616bc3565b5b6040519080825280601f01601f191660200182016040528015615d635781602001600182028036833780820191505090505b50905081600360048110615d7a57615d796189e4565b5b1a60f81b81600081518110615d9257615d916189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110615dd557615dd46189e4565b5b1a60f81b81600181518110615ded57615dec6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110615e3057615e2f6189e4565b5b1a60f81b81600281518110615e4857615e476189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110615e8b57615e8a6189e4565b5b1a60f81b81600381518110615ea357615ea26189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615edf826000615cda565b9050809350505050919050565b615ef4616658565b600082845111615f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f3090618af1565b60405180910390fd5b6006831015615f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f7490618b5d565b60405180910390fd5b615f85616658565b615f97615f928686615b80565b615baf565b816000019061ffff16908161ffff1681525050600284615fb79190617c87565b9350615fcb615fc68686615cda565b615d0b565b816020019063ffffffff16908163ffffffff1681525050600484615fef9190617c87565b93506160068585836020015163ffffffff1661638f565b8160400181905250806020015163ffffffff16846160249190617c87565b9350808492509250509250929050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff81111561606857616067616bc3565b5b6040519080825280601f01601f19166020018201604052801561609a5781602001600182028036833780820191505090505b509050816007600881106160b1576160b06189e4565b5b1a60f81b816000815181106160c9576160c86189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160066008811061610c5761610b6189e4565b5b1a60f81b81600181518110616124576161236189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600560088110616167576161666189e4565b5b1a60f81b8160028151811061617f5761617e6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816004600881106161c2576161c16189e4565b5b1a60f81b816003815181106161da576161d96189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160036008811061621d5761621c6189e4565b5b1a60f81b81600481518110616235576162346189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110616278576162776189e4565b5b1a60f81b816005815181106162905761628f6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600881106162d3576162d26189e4565b5b1a60f81b816006815181106162eb576162ea6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811061632e5761632d6189e4565b5b1a60f81b81600781518110616346576163456189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616382826000616424565b9050809350505050919050565b60608351828461639f9190617c87565b11156163aa57600080fd5b60008267ffffffffffffffff8111156163c6576163c5616bc3565b5b6040519080825280601f01601f1916602001820160405280156163f85781602001600182028036833780820191505090505b5090506000806020830191508560208801019050616417828287616459565b8293505050509392505050565b600082516008836164359190617c87565b111561644057600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811061649857815183526020836164739190617c87565b92506020826164829190617c87565b91506020816164919190617c53565b905061645a565b60008103156164dd57600060018260206164b29190617c53565b6101006164bf9190618cb0565b6164c99190617c53565b905080198351168185511681811786525050505b505050565b604051806101600160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff1681526020016000815260200160608152602001606081525090565b6040518060a00160405280600061ffff168152602001606081526020016000801916815260200160008152602001600067ffffffffffffffff1681525090565b6040518060800160405280606081526020016000801916815260200160608152602001600063ffffffff1681525090565b604051806101200160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff16815260200160608152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126166bc576166bb616697565b5b8235905067ffffffffffffffff8111156166d9576166d861669c565b5b6020830191508360018202830111156166f5576166f46166a1565b5b9250929050565b6000819050919050565b6000616711826166fc565b9050919050565b61672181616706565b811461672c57600080fd5b50565b60008135905061673e81616718565b92915050565b60008083601f84011261675a57616759616697565b5b8235905067ffffffffffffffff8111156167775761677661669c565b5b602083019150836001820283011115616793576167926166a1565b5b9250929050565b6000806000806000606086880312156167b6576167b561668d565b5b600086013567ffffffffffffffff8111156167d4576167d3616692565b5b6167e0888289016166a6565b955095505060206167f38882890161672f565b935050604086013567ffffffffffffffff81111561681457616813616692565b5b61682088828901616744565b92509250509295509295909350565b6000602082840312156168455761684461668d565b5b60006168538482850161672f565b91505092915050565b60008115159050919050565b6168718161685c565b82525050565b600060208201905061688c6000830184616868565b92915050565b6000819050919050565b6168a581616892565b81146168b057600080fd5b50565b6000813590506168c28161689c565b92915050565b600080600080600080608087890312156168e5576168e461668d565b5b600087013567ffffffffffffffff81111561690357616902616692565b5b61690f89828a016166a6565b9650965050602061692289828a016168b3565b945050604087013567ffffffffffffffff81111561694357616942616692565b5b61694f89828a016166a6565b9350935050606061696289828a016168b3565b9150509295509295509295565b600063ffffffff82169050919050565b6169888161696f565b82525050565b60006020820190506169a3600083018461697f565b92915050565b6000806000604084860312156169c2576169c161668d565b5b60006169d0868287016168b3565b935050602084013567ffffffffffffffff8111156169f1576169f0616692565b5b6169fd86828701616744565b92509250509250925092565b60008060008060008060808789031215616a2657616a2561668d565b5b600087013567ffffffffffffffff811115616a4457616a43616692565b5b616a5089828a016166a6565b96509650506020616a6389828a0161672f565b945050604087013567ffffffffffffffff811115616a8457616a83616692565b5b616a9089828a016166a6565b93509350506060616aa389828a0161672f565b9150509295509295509295565b616ab98161685c565b8114616ac457600080fd5b50565b600081359050616ad681616ab0565b92915050565b60008060008060008060808789031215616af957616af861668d565b5b600087013567ffffffffffffffff811115616b1757616b16616692565b5b616b2389828a016166a6565b96509650506020616b3689828a0161672f565b9450506040616b4789828a01616ac7565b935050606087013567ffffffffffffffff811115616b6857616b67616692565b5b616b7489828a01616744565b92509250509295509295509295565b616b8c81616892565b82525050565b6000602082019050616ba76000830184616b83565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616bfb82616bb2565b810181811067ffffffffffffffff82111715616c1a57616c19616bc3565b5b80604052505050565b6000616c2d616683565b9050616c398282616bf2565b919050565b600067ffffffffffffffff821115616c5957616c58616bc3565b5b616c6282616bb2565b9050602081019050919050565b82818337600083830152505050565b6000616c91616c8c84616c3e565b616c23565b905082815260208101848484011115616cad57616cac616bad565b5b616cb8848285616c6f565b509392505050565b600082601f830112616cd557616cd4616697565b5b8135616ce5848260208601616c7e565b91505092915050565b60008060408385031215616d0557616d0461668d565b5b6000616d138582860161672f565b925050602083013567ffffffffffffffff811115616d3457616d33616692565b5b616d4085828601616cc0565b9150509250929050565b60008060008060008060808789031215616d6757616d6661668d565b5b600087013567ffffffffffffffff811115616d8557616d84616692565b5b616d9189828a016166a6565b96509650506020616da489828a0161672f565b9450506040616db589828a0161672f565b935050606087013567ffffffffffffffff811115616dd657616dd5616692565b5b616de289828a01616744565b92509250509295509295509295565b616dfa81616706565b82525050565b6000602082019050616e156000830184616df1565b92915050565b600060208284031215616e3157616e3061668d565b5b600082013567ffffffffffffffff811115616e4f57616e4e616692565b5b616e5b84828501616cc0565b91505092915050565b60008060208385031215616e7b57616e7a61668d565b5b600083013567ffffffffffffffff811115616e9957616e98616692565b5b616ea5858286016166a6565b92509250509250929050565b600061ffff82169050919050565b616ec881616eb1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015616f08578082015181840152602081019050616eed565b83811115616f17576000848401525b50505050565b6000616f2882616ece565b616f328185616ed9565b9350616f42818560208601616eea565b616f4b81616bb2565b840191505092915050565b616f5f81616892565b82525050565b616f6e816166fc565b82525050565b600067ffffffffffffffff82169050919050565b616f9181616f74565b82525050565b600060a083016000830151616faf6000860182616ebf565b5060208301518482036020860152616fc78282616f1d565b9150506040830151616fdc6040860182616f56565b506060830151616fef6060860182616f65565b5060808301516170026080860182616f88565b508091505092915050565b600060208201905081810360008301526170278184616f97565b905092915050565b60008060008060006060868803121561704b5761704a61668d565b5b600086013567ffffffffffffffff81111561706957617068616692565b5b617075888289016166a6565b95509550506020617088888289016168b3565b935050604086013567ffffffffffffffff8111156170a9576170a8616692565b5b6170b588828901616744565b92509250509295509295909350565b600060ff82169050919050565b6170da816170c4565b81146170e557600080fd5b50565b6000813590506170f7816170d1565b92915050565b617106816166fc565b811461711157600080fd5b50565b600081359050617123816170fd565b92915050565b60008060008060008060008060c0898b0312156171495761714861668d565b5b600089013567ffffffffffffffff81111561716757617166616692565b5b6171738b828c016166a6565b985098505060206171868b828c0161672f565b96505060406171978b828c01616ac7565b955050606089013567ffffffffffffffff8111156171b8576171b7616692565b5b6171c48b828c01616744565b945094505060806171d78b828c016170e8565b92505060a06171e88b828c01617114565b9150509295985092959890939650565b6172018161696f565b811461720c57600080fd5b50565b60008135905061721e816171f8565b92915050565b6000806000806080858703121561723e5761723d61668d565b5b600085013567ffffffffffffffff81111561725c5761725b616692565b5b61726887828801616cc0565b94505060206172798782880161672f565b935050604061728a8782880161672f565b925050606061729b8782880161720f565b91505092959194509250565b600082825260208201905092915050565b7f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b60006173146022836172a7565b915061731f826172b8565b604082019050919050565b6000602082019050818103600083015261734381617307565b9050919050565b600081905092915050565b6000617361838561734a565b935061736e838584616c6f565b82840190509392505050565b6000617387828486617355565b91508190509392505050565b7f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000600082015250565b60006173c9601e836172a7565b91506173d482617393565b602082019050919050565b600060208201905081810360008301526173f8816173bc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006174356020836172a7565b9150617440826173ff565b602082019050919050565b6000602082019050818103600083015261746481617428565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006174c76027836172a7565b91506174d28261746b565b604082019050919050565b600060208201905081810360008301526174f6816174ba565b9050919050565b7f5344504d73673a2073656e646572206e6f742076616c69642072656c61796572600082015250565b60006175336020836172a7565b915061753e826174fd565b602082019050919050565b6000602082019050818103600083015261756281617526565b9050919050565b7f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60008201527f75744d6561737572652069732030000000000000000000000000000000000000602082015250565b60006175c5602e836172a7565b91506175d082617569565b604082019050919050565b600060208201905081810360008301526175f4816175b8565b9050919050565b600061760682616ece565b617610818561734a565b9350617620818560208601616eea565b80840191505092915050565b600061763882846175fb565b915081905092915050565b7f5344505f4d53475f4552524f523a20657863657074696f6e206d65737361676560008201527f206861736820646f6573206e6f74206578697374000000000000000000000000602082015250565b600061769f6034836172a7565b91506176aa82617643565b604082019050919050565b600060208201905081810360008301526176ce81617692565b9050919050565b60006176e082616ece565b6176ea81856172a7565b93506176fa818560208601616eea565b61770381616bb2565b840191505092915050565b61771781616f74565b82525050565b600081519050919050565b600082825260208201905092915050565b60006177448261771d565b61774e8185617728565b935061775e818560208601616eea565b61776781616bb2565b840191505092915050565b600060e082019050617787600083018a616b83565b818103602083015261779981896176d5565b90506177a86040830188616df1565b6177b5606083018761697f565b6177c2608083018661770e565b81810360a08301526177d48185617739565b905081810360c08301526177e881846176d5565b905098975050505050505050565b7f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60008201527f742074696d656f757420776974682074696d656f75744d656173757265203200602082015250565b6000617852603f836172a7565b915061785d826177f6565b604082019050919050565b6000602082019050818103600083015261788181617845565b9050919050565b7f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f60008201527f7574206d65617375726500000000000000000000000000000000000000000000602082015250565b60006178e4602a836172a7565b91506178ef82617888565b604082019050919050565b60006020820190508181036000830152617913816178d7565b9050919050565b600060408201905061792f6000830185616df1565b81810360208301526179418184617739565b90509392505050565b7f5344504d73673a20696e76616c696420616d20636f6e74726163740000000000600082015250565b6000617980601b836172a7565b915061798b8261794a565b602082019050919050565b600060208201905081810360008301526179af81617973565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806179fd57607f821691505b602082108103617a1057617a0f6179b6565b5b50919050565b7f5344504d73673a206e6f742076616c696420616d20636f6e7472616374000000600082015250565b6000617a4c601d836172a7565b9150617a5782617a16565b602082019050919050565b60006020820190508181036000830152617a7b81617a3f565b9050919050565b7f756e737570706f72746564207364702076657273696f6e000000000000000000600082015250565b6000617ab86017836172a7565b9150617ac382617a82565b602082019050919050565b60006020820190508181036000830152617ae781617aab565b9050919050565b7f5344503a20696e76616c69642074696d656f7574206d65617375726500000000600082015250565b6000617b24601c836172a7565b9150617b2f82617aee565b602082019050919050565b60006020820190508181036000830152617b5381617b17565b9050919050565b7f5344504d73673a20696e76616c6964206d6f6e69746f7220636f6e7472616374600082015250565b6000617b906020836172a7565b9150617b9b82617b5a565b602082019050919050565b60006020820190508181036000830152617bbf81617b83565b9050919050565b6000819050919050565b617be1617bdc82616892565b617bc6565b82525050565b6000617bf38286617bd0565b602082019150617c038285617bd0565b602082019150617c138284617bd0565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000617c5e826166fc565b9150617c69836166fc565b925082821015617c7c57617c7b617c24565b5b828203905092915050565b6000617c92826166fc565b9150617c9d836166fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617cd257617cd1617c24565b5b828201905092915050565b6000617ce88261696f565b915063ffffffff8203617cfe57617cfd617c24565b5b600182019050919050565b7f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00600082015250565b6000617d3f601f836172a7565b9150617d4a82617d09565b602082019050919050565b60006020820190508181036000830152617d6e81617d32565b9050919050565b7f656e636f64655344504d6573736167653a20626f6479206c656e677468206f7660008201527f65726c696d697400000000000000000000000000000000000000000000000000602082015250565b6000617dd16027836172a7565b9150617ddc82617d75565b604082019050919050565b60006020820190508181036000830152617e0081617dc4565b9050919050565b6000617e128261696f565b9150617e1d8361696f565b92508263ffffffff03821115617e3657617e35617c24565b5b828201905092915050565b7f656e636f64655344504d6573736167653a207a65726f206d657373616765206960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e9d6021836172a7565b9150617ea882617e41565b604082019050919050565b60006020820190508181036000830152617ecc81617e90565b9050919050565b7f756e65787065637465642061746f6d696320666c616700000000000000000000600082015250565b6000617f096016836172a7565b9150617f1482617ed3565b602082019050919050565b60006020820190508181036000830152617f3881617efc565b9050919050565b7f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e00600082015250565b6000617f75601f836172a7565b9150617f8082617f3f565b602082019050919050565b60006020820190508181036000830152617fa481617f68565b9050919050565b7f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360008201527f20666c6167000000000000000000000000000000000000000000000000000000602082015250565b60006180076025836172a7565b915061801282617fab565b604082019050919050565b6000602082019050818103600083015261803681617ffa565b9050919050565b7f6279746573546f56617242797465733a206f6666736574206c6573732074686160008201527f6e206c656e677468206f6620626f647900000000000000000000000000000000602082015250565b60006180996030836172a7565b91506180a48261803d565b604082019050919050565b600060208201905081810360008301526180c88161808c565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b600061812b6023836172a7565b9150618136826180cf565b604082019050919050565b6000602082019050818103600083015261815a8161811e565b9050919050565b7f7661724279746573546f42797465733a206f6666736574206c6573732074686160008201527f6e2074686520696e707574206c656e6774680000000000000000000000000000602082015250565b60006181bd6032836172a7565b91506181c882618161565b604082019050919050565b600060208201905081810360008301526181ec816181b0565b9050919050565b60006181ff83856172a7565b935061820c838584616c6f565b61821583616bb2565b840190509392505050565b6000606082019050818103600083015261823b8186886181f3565b905061824a6020830185616df1565b818103604083015261825c8184617739565b905095945050505050565b7f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000600082015250565b600061829d601a836172a7565b91506182a882618267565b602082019050919050565b600060208201905081810360008301526182cc81618290565b9050919050565b60008160e01c9050919050565b600060033d11156182ff5760046000803e6182fc6000516182d3565b90505b90565b600060443d1061838f57618314616683565b60043d036004823e80513d602482011167ffffffffffffffff8211171561833c57505061838f565b808201805167ffffffffffffffff81111561835a575050505061838f565b80602083010160043d03850181111561837757505050505061838f565b61838682602001850186616bf2565b82955050505050505b90565b600060c08201905081810360008301526183ad81898b6181f3565b90506183bc6020830188616b83565b6183c96040830187616df1565b6183d6606083018661697f565b6183e36080830185616868565b81810360a08301526183f581846176d5565b905098975050505050505050565b6000602082019050818103600083015261841d81846176d5565b905092915050565b61842e816170c4565b82525050565b60006101408201905061844a600083018e616b83565b818103602083015261845d818c8e6181f3565b905061846c604083018b616b83565b818103606083015261847e818a6176d5565b905061848d6080830189616df1565b61849a60a083018861697f565b6184a760c083018761770e565b6184b460e0830186618425565b6184c2610100830185616868565b8181036101208301526184d581846176d5565b90509c9b505050505050505050505050565b600060c0820190506184fc600083018a616b83565b818103602083015261850f81888a6181f3565b905061851e6040830187616df1565b61852b606083018661697f565b618538608083018561770e565b81810360a083015261854a8184617739565b905098975050505050505050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b600061858e6007836172a7565b915061859982618558565b602082019050919050565b6000610140820190506185ba600083018d616b83565b81810360208301526185cd818b8d6181f3565b90506185dc604083018a616b83565b81810360608301526185ee81896176d5565b90506185fd6080830188616df1565b61860a60a083018761697f565b61861760c083018661770e565b61862460e0830185618425565b618632610100830184616868565b81810361012083015261864481618581565b90509b9a5050505050505050505050565b600060e08201905061866a600083018b616b83565b818103602083015261867d81898b6181f3565b905061868c6040830188616df1565b618699606083018761697f565b6186a6608083018661770e565b81810360a08301526186b88185617739565b905081810360c08301526186cc81846176d5565b90509998505050505050505050565b7f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060008201527f3220616e64203420666f72206e6f770000000000000000000000000000000000602082015250565b6000618737602f836172a7565b9150618742826186db565b604082019050919050565b600060208201905081810360008301526187668161872a565b9050919050565b7f6d73672069732074696d656f7574000000000000000000000000000000000000600082015250565b60006187a3600e836172a7565b91506187ae8261876d565b602082019050919050565b600060208201905081810360008301526187d281618796565b9050919050565b6187e2816166fc565b82525050565b60006060820190506187fd6000830186616b83565b61880a6020830185618425565b61881760408301846187d9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000618859826166fc565b9150618864836166fc565b9250826188745761887361881f565b5b828204905092915050565b600061888a826166fc565b9150618895836166fc565b9250826188a5576188a461881f565b5b828206905092915050565b60006188bb826166fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036188ed576188ec617c24565b5b600182019050919050565b6000618903826166fc565b915061890e836166fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561894757618946617c24565b5b828202905092915050565b7f5344505f4d53475f4552524f523a2073657175656e6365206e6f74206571756160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006189ae6021836172a7565b91506189b982618952565b604082019050919050565b600060208201905081810360008301526189dd816189a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000618a496017836172a7565b9150618a5482618a13565b602082019050919050565b60006020820190508181036000830152618a7881618a3c565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000618adb6023836172a7565b9150618ae682618a7f565b604082019050919050565b60006020820190508181036000830152618b0a81618ace565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000618b47600e836172a7565b9150618b5282618b11565b602082019050919050565b60006020820190508181036000830152618b7681618b3a565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115618bd457808604811115618bb057618baf617c24565b5b6001851615618bbf5780820291505b8081029050618bcd85618b7d565b9450618b94565b94509492505050565b600082618bed5760019050618ca9565b81618bfb5760009050618ca9565b8160018114618c115760028114618c1b57618c4a565b6001915050618ca9565b60ff841115618c2d57618c2c617c24565b5b8360020a915084821115618c4457618c43617c24565b5b50618ca9565b5060208310610133831016604e8410600b8410161715618c7f5782820a905083811115618c7a57618c79617c24565b5b618ca9565b618c8c8484846001618b8a565b92509050818404811115618ca357618ca2617c24565b5b81810290505b9392505050565b6000618cbb826166fc565b9150618cc6836166fc565b9250618cf37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484618bdd565b90509291505056fea3646970667358221220135d62080d872feff9c83fb1ec02d7bc7bc43269ba3b34d1a247ffd959ef1b9164736f6c634300080e6b636f6d70696c655f6d6f6461300041 \ No newline at end of file +60806040523480156200001157600080fd5b5062000032620000266200006460201b60201c565b6200006c60201b60201c565b60016008600033815260200190815260200160002060006101000a81548160ff021916908315150217905550620000ab565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b618d3f80620000bb6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063715018a6116100f9578063c09b261b11610097578063e552109211610071578063e5521092146104b6578063e5e55300146104d4578063eaa71e90146104f0578063ed46aafa1461050c576101a9565b8063c09b261b1461044e578063d513f34a1461046a578063db37c08b14610486576101a9565b806389223f80116100d357806389223f80146103c65780638da5cb5b146103e2578063a9d662af14610400578063b5db295a1461041e576101a9565b8063715018a6146103825780638037d45e1461038c578063838a102c146103aa576101a9565b8063343e77921161016657806342f116bd1161014057806342f116bd146102fc57806356cb2d0214610318578063627523a4146103365780636bba080814610366576101a9565b8063343e77921461029257806334d4725a146102c25780633ac6dfb1146102de576101a9565b806304f25f96146101ae5780630a6e15db146101ca5780630d9ae9e5146101fa5780631f56086f1461022a578063203c2c851461024657806325601cdd14610262575b600080fd5b6101c860048036038101906101c3919061679a565b61053c565b005b6101e460048036038101906101df919061682f565b6105a2565b6040516101f19190616877565b60405180910390f35b610214600480360381019061020f91906168c8565b6105c2565b604051610221919061698e565b60405180910390f35b610244600480360381019061023f919061682f565b6106ba565b005b610260600480360381019061025b91906169a9565b610759565b005b61027c60048036038101906102779190616a09565b610a32565b604051610289919061698e565b60405180910390f35b6102ac60048036038101906102a79190616adc565b610b30565b6040516102b99190616b92565b60405180910390f35b6102dc60048036038101906102d7919061679a565b610d32565b005b6102e6610d98565b6040516102f39190616b92565b60405180910390f35b61031660048036038101906103119190616cee565b610da2565b005b610320610e6d565b60405161032d9190616b92565b60405180910390f35b610350600480360381019061034b9190616adc565b610e73565b60405161035d9190616b92565b60405180910390f35b610380600480360381019061037b9190616d4a565b61106f565b005b61038a6110d6565b005b610394611132565b6040516103a19190616e00565b60405180910390f35b6103c460048036038101906103bf9190616e1b565b61113c565b005b6103e060048036038101906103db9190616d4a565b6111bc565b005b6103ea611223565b6040516103f79190616e00565b60405180910390f35b61040861122c565b6040516104159190616e00565b60405180910390f35b61043860048036038101906104339190616e64565b611232565b604051610445919061700d565b60405180910390f35b6104686004803603810190610463919061702f565b611380565b005b610484600480360381019061047f919061682f565b611598565b005b6104a0600480360381019061049b9190617129565b611635565b6040516104ad9190616b92565b60405180910390f35b6104be6118d4565b6040516104cb9190616e00565b60405180910390f35b6104ee60048036038101906104e99190617224565b6118da565b005b61050a6004803603810190610505919061682f565b611978565b005b61052660048036038101906105219190617129565b611a15565b6040516105339190616b92565b60405180910390f35b6000600954148061054e575033600954145b61058d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105849061732a565b60405180910390fd5b61059b858585338686611cae565b5050505050565b60086020528060005260406000206000915054906101000a900460ff1681565b600060025484846040516020016105da92919061737a565b6040516020818303038152906040528051906020012014610630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610627906173df565b60405180910390fd5b600061068188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508785611de3565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6106c2611e3f565b6106ca611223565b1461070a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107019061744b565b60405180910390fd5b6000810361074d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610744906174dd565b60405180910390fd5b61075681611e47565b50565b6008600033815260200190815260200160002060009054906101000a900460ff166107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b090617549565b60405180910390fd5b6107c16164e2565b61081883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505082611e8690919063ffffffff16565b8060e0015160ff16600003610862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610859906175db565b60405180910390fd5b8060e0015160ff166002036109f157806101000151600660008360400151604051602001610890919061762c565b6040516020818303038152906040528051906020012081526020019081526020016000206003015411156109b157600760008260200151815260200190815260200160002060009054906101000a900460ff16610922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610919906176b5565b60405180910390fd5b61092b846120c4565b6383c6d5a282602001518360400151846060015160001c8560c001518660a001518761012001518861014001516040518863ffffffff1660e01b815260040161097a9796959493929190617772565b600060405180830381600087803b15801561099457600080fd5b505af11580156109a8573d6000803e3d6000fd5b505050506109ec565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390617868565b60405180910390fd5b610a2c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a23906178fa565b60405180910390fd5b50505050565b60006002548484604051602001610a4a92919061737a565b6040516020818303038152906040528051906020012014610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906173df565b60405180910390fd5b6000610af788888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760001b8560001b611de3565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6000610b3f8787878686612136565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610bc7576000610bca565b60015b60ff168152602001610c218b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff8016815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610cb6600254826121d390919063ffffffff16565b600154639d24799833610cc884612470565b6040518363ffffffff1660e01b8152600401610ce592919061791a565b600060405180830381600087803b158015610cff57600080fd5b505af1158015610d13573d6000803e3d6000fd5b50505050610d1f6127a2565b8060200151925050509695505050505050565b60006009541480610d44575033600954145b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a9061732a565b60405180910390fd5b610d918585853386866127a4565b5050505050565b6000600254905090565b610daa611e3f565b610db2611223565b14610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de99061744b565b60405180910390fd5b60008203610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c90617996565b60405180910390fd5b8160018190555080604051602001610e4d919061762c565b604051602081830303815290604052805190602001206002819055505050565b60025481565b6000610e828787878686612933565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610f0a576000610f0d565b60015b60ff16815260200167ffffffffffffffff80168152602001610f748b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610ff3600254826121d390919063ffffffff16565b600154639d2479983361100584612470565b6040518363ffffffff1660e01b815260040161102292919061791a565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b5050505061105c6129d0565b8060200151925050509695505050505050565b60006009541480611081575033600954145b6110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b79061732a565b60405180910390fd5b6110ce8686868686866127a4565b505050505050565b6110de611e3f565b6110e6611223565b14611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d9061744b565b60405180910390fd5b6111306000611e47565b565b6000600154905090565b611144611e3f565b61114c611223565b1461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061744b565b60405180910390fd5b8060405160200161119d919061762c565b6040516020818303038152906040528051906020012060028190555050565b600060095414806111ce575033600954145b61120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061732a565b60405180910390fd5b61121b868686868686611cae565b505050505050565b60008054905090565b60015481565b61123a61655e565b60066000848460405160200161125192919061737a565b6040516020818303038152906040528051906020012081526020019081526020016000206040518060a00160405290816000820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820180546112b0906179e5565b80601f01602080910402602001604051908101604052809291908181526020018280546112dc906179e5565b80156113295780601f106112fe57610100808354040283529160200191611329565b820191906000526020600020905b81548152906001019060200180831161130c57829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905092915050565b33600154146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90617a62565b60405180910390fd5b6113d185858585856129d2565b600061142083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506129d9565b905060018163ffffffff16036114855761148086868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a9c565b611588565b60028163ffffffff16036114e8576114e386868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b61565b611587565b60038163ffffffff160361154b5761154686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612cad565b611586565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90617ace565b60405180910390fd5b5b5b611590612e1d565b505050505050565b6115a0611e3f565b6115a8611223565b146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061744b565b60405180910390fd5b6000810361162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290617996565b60405180910390fd5b8060018190555050565b60008060ff168360ff16101580156116545750600460ff168360ff1611155b611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90617b3a565b60405180910390fd5b6116a08989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018381526020018961172857600061172b565b60015b60ff1681526020016117828d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200160405180602001604052806000815250815250905061182660025482612e1f90919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d247998336118688461311d565b6040518363ffffffff1660e01b815260040161188592919061791a565b600060405180830381600087803b15801561189f57600080fd5b505af11580156118b3573d6000803e3d6000fd5b505050506118bf6129d0565b80602001519250505098975050505050505050565b60095481565b6118e2611e3f565b6118ea611223565b1461192a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119219061744b565b60405180910390fd5b600061193d858560001b8560001b611de3565b9050816004600083815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050505050565b611980611e3f565b611988611223565b146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061744b565b60405180910390fd5b60008103611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290617ba6565b60405180910390fd5b8060098190555050565b60008060ff168360ff1610158015611a345750600460ff168360ff1611155b611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90617b3a565b60405180910390fd5b611a808989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189611b08576000611b0b565b60015b60ff16815260200167ffffffffffffffff80168152602001611b728d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050611c0060025482612e1f90919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d24799833611c428461311d565b6040518363ffffffff1660e01b8152600401611c5f92919061791a565b600060405180830381600087803b158015611c7957600080fd5b505af1158015611c8d573d6000803e3d6000fd5b50505050611c996129d0565b80602001519250505098975050505050505050565b611cbb8686868585612136565b6000604051806080016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018660001b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200163ffffffff80168152509050600154639d24799885611d83846134dd565b6040518363ffffffff1660e01b8152600401611da092919061791a565b600060405180830381600087803b158015611dba57600080fd5b505af1158015611dce573d6000803e3d6000fd5b50505050611dda6127a2565b50505050505050565b600083604051602001611df6919061762c565b604051602081830303815290604052805190602001208383604051602001611e2093929190617be7565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600081519050611e95826129d9565b836000019063ffffffff16908163ffffffff1681525050611eb6602061361f565b81611ec19190617c53565b9050611ecd8183613631565b836020018181525050611ede61363f565b60ff1681611eec9190617c53565b90506000611efa8284613648565b905080846040018190525080516004611f139190617c87565b82611f1e9190617c53565b9150611f2a8284613631565b846060018181525050611f3b61363f565b60ff1682611f499190617c53565b9150611f558284613738565b846080019060ff16908160ff1681525050600182611f739190617c53565b9150611f7f8284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050600882611fab9190617c53565b9150611fb78284613754565b8460c0019063ffffffff16908163ffffffff1681525050600482611fdb9190617c53565b9150611fe78284613738565b8460e0019060ff16908160ff16815250506001826120059190617c53565b915060006120138385613648565b905061201e81613762565b85610100018181525050805160046120369190617c87565b836120419190617c53565b925061204d8385613648565b8561012001819052508461012001515160046120699190617c87565b836120749190617c53565b9250600260ff16856080015160ff1611156120bd576120938385613648565b8561014001819052508461014001515160046120af9190617c87565b836120ba9190617c53565b92505b5050505050565b600080602067ffffffffffffffff8111156120e2576120e1616bc3565b5b6040519080825280601f01601f1916602001820160405280156121145781602001600182028036833780820191505090505b5090506121236020848361381e565b61212e602082613828565b915050919050565b5050505050565b60008061214b858585613836565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905060056000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906121a890617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6002826000015163ffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790617d55565b60405180910390fd5b63ffffffff8260e0015151111561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390617de7565b60405180910390fd5b60008260e001515183604001515160796122869190617c87565b6122909190617c87565b905060008167ffffffffffffffff8111156122ae576122ad616bc3565b5b6040519080825280601f01601f1916602001820160405280156122e05781602001600182028036833780820191505090505b509050600082905061230c8163ff00000087600001516123009190617e07565b63ffffffff168461389f565b61231660206138a9565b816123219190617c53565b9050600085604001519050612337828285613ad8565b805160046123459190617c87565b826123509190617c53565b91506123618287606001518561381e565b61236961363f565b60ff16826123779190617c53565b915061238882876080015185613bac565b6001826123959190617c53565b91506123a6828760a0015185613bc3565b6123b060406138a9565b826123bb9190617c53565b91506123cc828760c0015185613bda565b6123d660206138a9565b826123e19190617c53565b91506123f2828760e0015185613ad8565b8560e001515160046124049190617c87565b8261240f9190617c53565b915061241c823385613bf1565b61242461363f565b60ff16826124329190617c53565b915061243f82868561381e565b61244761363f565b60ff16826124559190617c53565b91508280519060200120866020018181525050505050505050565b60606002826000015163ffffffff16146124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690617d55565b60405180910390fd5b63ffffffff8260e0015151111561250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250290617de7565b60405180910390fd5b6000801b826020015103612554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254b90617eb3565b60405180910390fd5b600080600260ff16846080015160ff1611905080156125b3578361010001515160048560e0015151866040015151605961258e9190617c87565b6125989190617c87565b6125a29190617c87565b6125ac9190617c87565b91506125d8565b8360e001515184604001515160596125cb9190617c87565b6125d59190617c87565b91505b60008267ffffffffffffffff8111156125f4576125f3616bc3565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b50905060008390506126528163ff00000088600001516126469190617e07565b63ffffffff168461389f565b61265c60206138a9565b816126679190617c53565b90506126788187602001518461381e565b61268061363f565b60ff168161268e9190617c53565b90506000866040015190506126a4828285613ad8565b805160046126b29190617c87565b826126bd9190617c53565b91506126ce8288606001518561381e565b6126d661363f565b60ff16826126e49190617c53565b91506126f582886080015185613bac565b6001826127029190617c53565b9150612713828860a0015185613bc3565b61271d60406138a9565b826127289190617c53565b9150612739828860c0015185613bda565b61274360206138a9565b8261274e9190617c53565b915061275f828860e0015185613ad8565b8660e001515160046127719190617c87565b8261277c9190617c53565b91508315612795576127948288610100015185613ad8565b5b8295505050505050919050565b565b6127b18686868585612933565b60008460001b90506000604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016128af8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888661293a565b63ffffffff16815250905060006128c5826134dd565b9050600154639d24799887836040518363ffffffff1660e01b81526004016128ee92919061791a565b600060405180830381600087803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b505050506129286129d0565b505050505050505050565b5050505050565b600080612948858585613836565b905060006003600083815260200190815260200160002060009054906101000a900463ffffffff16905060036000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906129a590617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b565b5050505050565b60008060008351905060048103602085010151915060ff60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612a9057600080600467ffffffffffffffff811115612a3957612a38616bc3565b5b6040519080825280601f01601f191660200182016040528015612a6b5781602001600182028036833780820191505090505b5090506003830360200186015160218201526004810151915081945050505050612a97565b6001925050505b919050565b612aa461659e565b612ab78282613bfb90919063ffffffff16565b6002548160000151604051602001612acf919061762c565b6040516020818303038152906040528051906020012014612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c906173df565b60405180910390fd5b63ffffffff8016816060015163ffffffff1603612b4d57612b4885858584613daf565b612b5a565b612b5985858584613e1f565b5b5050505050565b612b696165cf565b612b7c828261404090919063ffffffff16565b6002548160400151604051602001612b94919061762c565b6040516020818303038152906040528051906020012014612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be1906173df565b60405180910390fd5b600060ff16816080015160ff161480612c0d5750600160ff16816080015160ff16145b15612c2357612c1e858585846141f5565b612ca6565b600260ff16816080015160ff1603612c4657612c4185858584614325565b612ca5565b600360ff16816080015160ff1603612c6957612c648585858461440d565b612ca4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b90617f1f565b60405180910390fd5b5b5b5050505050565b612cb56164e2565b612cc88282611e8690919063ffffffff16565b6002548160400151604051602001612ce0919061762c565b6040516020818303038152906040528051906020012014612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90617f8b565b60405180910390fd5b600060ff16816080015160ff161480612d595750600160ff16816080015160ff16145b15612d6f57612d6a85858584614503565b612e16565b600260ff16816080015160ff1603612d9257612d8d8585858461479c565b612e15565b600360ff16816080015160ff1603612db557612db0858585846148cd565b612e14565b600460ff16816080015160ff1603612dd857612dd385858584614a0c565b612e13565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a9061801d565b60405180910390fd5b5b5b5b5050505050565b565b6003826000015163ffffffff1614612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6390617d55565b60405180910390fd5b63ffffffff826101200151511115612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb090617de7565b60405180910390fd5b6000612ec9836101000151614bd1565b90506000815184610120015151856040015151607e612ee89190617c87565b612ef29190617c87565b612efc9190617c87565b905060008167ffffffffffffffff811115612f1a57612f19616bc3565b5b6040519080825280601f01601f191660200182016040528015612f4c5781602001600182028036833780820191505090505b5090506000829050612f728163ff0000008860000151612f6c9190617e07565b84613bda565b612f7c60206138a9565b81612f879190617c53565b9050600086604001519050612f9d828285613ad8565b80516004612fab9190617c87565b82612fb69190617c53565b9150612fc78288606001518561381e565b612fcf61363f565b60ff1682612fdd9190617c53565b9150612fee82886080015185613bac565b600182612ffb9190617c53565b915061300c828860a0015185613bc3565b61301660406138a9565b826130219190617c53565b9150613032828860c0015185613bda565b61303c60206138a9565b826130479190617c53565b9150613058828860e0015185613bac565b6001826130659190617c53565b9150613072828685613ad8565b845160046130809190617c87565b8261308b9190617c53565b915061309d8288610120015185613ad8565b8661012001515160046130b09190617c87565b826130bb9190617c53565b91506130c8823385613bf1565b6130d061363f565b60ff16826130de9190617c53565b91506130eb82878561381e565b6130f361363f565b60ff16826131019190617c53565b9150828051906020012087602001818152505050505050505050565b60606003826000015163ffffffff161461316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390617d55565b60405180910390fd5b63ffffffff8261012001515111156131b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b090617de7565b60405180910390fd5b6000801b826020015103613202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f990617eb3565b60405180910390fd5b600080600260ff16846080015160ff161190506000613225856101000151614bd1565b9050811561328057846101400151516004825187610120015151886040015151605e6132519190617c87565b61325b9190617c87565b6132659190617c87565b61326f9190617c87565b6132799190617c87565b92506132b2565b805185610120015151866040015151605e61329b9190617c87565b6132a59190617c87565b6132af9190617c87565b92505b60008367ffffffffffffffff8111156132ce576132cd616bc3565b5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b50905060008490506133268163ff00000089600001516133209190617e07565b84613bda565b61333060206138a9565b8161333b9190617c53565b905061334c8188602001518461381e565b61335461363f565b60ff16816133629190617c53565b9050600087604001519050613378828285613ad8565b805160046133869190617c87565b826133919190617c53565b91506133a28289606001518561381e565b6133aa61363f565b60ff16826133b89190617c53565b91506133c982896080015185613bac565b6001826133d69190617c53565b91506133e7828960a0015185613bc3565b6133f160406138a9565b826133fc9190617c53565b915061340d828960c0015185613bda565b61341760206138a9565b826134229190617c53565b9150613433828960e0015185613bac565b6001826134409190617c53565b915061344d828585613ad8565b8351600461345b9190617c87565b826134669190617c53565b91506134788289610120015185613ad8565b87610120015151600461348b9190617c87565b826134969190617c53565b915084156134cf576134ae8289610140015185613ad8565b8761014001515160046134c19190617c87565b826134cc9190617c53565b91505b829650505050505050919050565b606060006134ee8360000151614cda565b602060046134ff8660400151614d32565b6135099190617c87565b6135139190617c87565b61351d9190617c87565b905060008167ffffffffffffffff81111561353b5761353a616bc3565b5b6040519080825280601f01601f19166020018201604052801561356d5781602001600182028036833780820191505090505b509050600082905061358481866000015184614d8a565b6135918560000151614cda565b8161359c9190617c53565b90506135ad8186602001518461381e565b6135b561363f565b60ff16816135c39190617c53565b90506135d481866060015184613bda565b6135de602061361f565b816135e99190617c53565b90506135fa81866040015184614d8a565b6136078560400151614d32565b816136129190617c53565b9050819350505050919050565b600061362a826138a9565b9050919050565b600082820151905092915050565b60006020905090565b606060006136568484613754565b63ffffffff16905060048461366b9190617c53565b9350838111156136b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a7906180af565b60405180910390fd5b80846136bc9190617c53565b935060608115600081146136db5760405191506020820160405261372c565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561371957805183526020830192506020810190506136fc565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b600082820151905092915050565b600082820151905092915050565b6000808251905060208111156137ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a490618141565b60405180910390fd5b60008167ffffffffffffffff8111156137c9576137c8616bc3565b5b6040519080825280601f01601f1916602001820160405280156137fb5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b8183820152505050565b600082820151905092915050565b60008061384284614df5565b90508085604051602001613856919061762c565b604051602081830303815290604052805190602001208460405160200161387f93929190617be7565b604051602081830303815290604052805190602001209150509392505050565b8183820152505050565b600081600881146139b657601081146139bf57601881146139c857602081146139d157602881146139da57603081146139e357603881146139ec57604081146139f557604881146139fe5760508114613a075760588114613a105760608114613a195760688114613a225760708114613a2b5760788114613a345760808114613a3d5760888114613a465760908114613a4f5760988114613a585760a08114613a615760a88114613a6a5760b08114613a735760b88114613a7c5760c08114613a855760c88114613a8e5760d08114613a975760d88114613aa05760e08114613aa95760e88114613ab25760f08114613abb5760f88114613ac4576101008114613acd5760209150613ad2565b60019150613ad2565b60029150613ad2565b60039150613ad2565b60049150613ad2565b60059150613ad2565b60069150613ad2565b60079150613ad2565b60089150613ad2565b60099150613ad2565b600a9150613ad2565b600b9150613ad2565b600c9150613ad2565b600d9150613ad2565b600e9150613ad2565b600f9150613ad2565b60109150613ad2565b60119150613ad2565b60129150613ad2565b60139150613ad2565b60149150613ad2565b60159150613ad2565b60169150613ad2565b60179150613ad2565b60189150613ad2565b60199150613ad2565b601a9150613ad2565b601b9150613ad2565b601c9150613ad2565b601d9150613ad2565b601e9150613ad2565b601f9150613ad2565b602091505b50919050565b600082519050613ae9848284613bda565b600484613af69190617c53565b93508063ffffffff16841015613b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b38906181d3565b60405180910390fd5b8063ffffffff1684613b539190617c53565b9350801560008103613ba5578483018051601f84168015602002818801018581018215602002838601015b81831015613b9b5782518152602083019250602081019050613b7e565b5083855250505050505b5050505050565b828101600181038051848352808252505050505050565b828101600881038051848352808252505050505050565b828101600481038051848352808252505050505050565b8183820152505050565b60008151905060006020613c0f8385613754565b613c199190617e07565b905060008163ffffffff1667ffffffffffffffff811115613c3d57613c3c616bc3565b5b6040519080825280601f01601f191660200182016040528015613c6f5781602001600182028036833780820191505090505b509050613c7d838583614e5b565b613c8681614d32565b83613c919190617c53565b92506000613c9f8486613631565b9050613ca961363f565b60ff1684613cb79190617c53565b93506000613cc58587613754565b9050613cd160206138a9565b85613cdc9190617c53565b945060006020613cec8789613754565b613cf69190617e07565b905060008163ffffffff1667ffffffffffffffff811115613d1a57613d19616bc3565b5b6040519080825280601f01601f191660200182016040528015613d4c5781602001600182028036833780820191505090505b509050613d5a878983614e5b565b613d6381614d32565b87613d6e9190617c53565b96508489600001819052508389602001818152505082896060019063ffffffff16908163ffffffff1681525050808960400181905250505050505050505050565b613db881614eb3565b632e00b39585858560001c85604001516040518563ffffffff1660e01b8152600401613de79493929190618220565b600060405180830381600087803b158015613e0157600080fd5b505af1158015613e15573d6000803e3d6000fd5b5050505050505050565b6000613e7485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050848460200151614ec9565b90508063ffffffff16826060015163ffffffff1614613ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ebf906182b3565b60405180910390fd5b600060606000613ed785614eb3565b90506000813b03613f2357600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509150613ff3565b80639e41773189898960001c89604001516040518563ffffffff1660e01b8152600401613f539493929190618220565b600060405180830381600087803b158015613f6d57600080fd5b505af1925050508015613f7e575060015b613fed57613f8a6182e0565b806308c379a003613fb25750613f9e618302565b80613fa95750613fb4565b80925050613fe8565b505b3d8060008114613fe0576040519150601f19603f3d011682016040523d82523d6000602084013e613fe5565b606091505b50505b613ff2565b600192505b5b7fc5c107ebb3f0bb97a017b6d166d57ad3349b9114ef620914f2178b3559310abf8888888488888860405161402e9796959493929190618392565b60405180910390a15050505050505050565b60008151905061404f826129d9565b836000019063ffffffff16908163ffffffff1681525050614070602061361f565b8161407b9190617c53565b90506140878183613631565b83602001818152505061409861363f565b60ff16816140a69190617c53565b905060006140b48284613648565b9050808460400181905250805160046140cd9190617c87565b826140d89190617c53565b91506140e48284613631565b8460600181815250506140f561363f565b60ff16826141039190617c53565b915061410f8284613738565b846080019060ff16908160ff168152505060018261412d9190617c53565b91506141398284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff16815250506008826141659190617c53565b91506141718284613754565b8460c0019063ffffffff16908163ffffffff16815250506004826141959190617c53565b91506141a18284613648565b8460e001819052508360e001515160046141bb9190617c87565b826141c69190617c53565b9150600260ff16846080015160ff1611156141ef576141e58284613648565b8461010001819052505b50505050565b6000606063ffffffff80168360c0015163ffffffff16036142805761421c86868686614f5f565b8092508193505050600060ff16836080015160ff160361427b57818190614279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142709190618403565b60405180910390fd5b505b614295565b61428c868686866150a2565b80925081935050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239836020015187878787604001516142cc8961528d565b8960c001518a60a001518b608001518b8b6040516142f49b9a99989796959493929190618434565b60405180910390a1600160ff16836080015160ff160361431d5761431c8387878786866152a3565b5b505050505050565b61432e8161528d565b6315390358826020015186868660001c8660c001518760a001518860e001516040518863ffffffff1660e01b815260040161436f97969594939291906184e7565b600060405180830381600087803b15801561438957600080fd5b505af115801561439d573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516143d88761528d565b8760c001518860a00151896080015160016040516143ff9a999897969594939291906185a4565b60405180910390a150505050565b6144168161528d565b6383c6d5a2826020015186868660001c8660c001518760a001518860e001518961010001516040518963ffffffff1660e01b815260040161445e989796959493929190618655565b600060405180830381600087803b15801561447857600080fd5b505af115801561448c573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516144c78761528d565b8760c001518860a00151896080015160018b61010001516040516144f59b9a99989796959493929190618434565b60405180910390a150505050565b6000606060008360e0015160ff161480614524575060028360e0015160ff16145b80614536575060048360e0015160ff16145b614575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161456c9061874d565b60405180910390fd5b60028360e0015160ff16036145d05743836101000151116145cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145c2906187b9565b60405180910390fd5b614628565b60048360e0015160ff1603614627574283610100015111614626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161461d906187b9565b60405180910390fd5b5b5b63ffffffff80168360c0015163ffffffff16036146af5761464b868686866153b6565b8092508193505050600060ff16836080015160ff16036146aa578181906146a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161469f9190618403565b60405180910390fd5b505b6146c4565b6146bb868686866154fa565b80925081935050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c9836020015187878787604001516146fb896156e6565b8960c001518a60a001518b608001518b8b6040516147239b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e0015185610100015160405161476b939291906187e8565b60405180910390a1600160ff16836080015160ff1603614794576147938387878786866156fc565b5b505050505050565b6147a5816156e6565b6315390358826020015186868660001c8660c001518760a001518861012001516040518863ffffffff1660e01b81526004016147e797969594939291906184e7565b600060405180830381600087803b15801561480157600080fd5b505af1158015614815573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614850876156e6565b8760c001518860a00151896080015160016040516148779a999897969594939291906185a4565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516148bf939291906187e8565b60405180910390a150505050565b6148d6816156e6565b6383c6d5a2826020015186868660001c8660c001518760a001518861012001518961014001516040518963ffffffff1660e01b815260040161491f989796959493929190618655565b600060405180830381600087803b15801561493957600080fd5b505af115801561494d573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614988876156e6565b8760c001518860a00151896080015160018b61014001516040516149b69b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516149fe939291906187e8565b60405180910390a150505050565b6000614a1c82610120015161580f565b90508060400151600660008787604051602001614a3a92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600201819055508060800151600660008787604051602001614a8192919061737a565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060600151600660008787604051602001614aea92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600301819055507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c982602001518686868660400151614b4c886156e6565b8860c001518960a001518a6080015160018c6101400151604051614b7a9b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e00151846101000151604051614bc2939291906187e8565b60405180910390a15050505050565b60606000602067ffffffffffffffff811115614bf057614bef616bc3565b5b6040519080825280601f01601f191660200182016040528015614c225781602001600182028036833780820191505090505b5090506000602067ffffffffffffffff811115614c4257614c41616bc3565b5b6040519080825280601f01601f191660200182016040528015614c745781602001600182028036833780820191505090505b509050606084602084015260015b6020811015614cce578060208501035181602085010351808203614cc15760405193506020860151838501528284528260208501016040525050614cce565b5050600181019050614c82565b50809350505050919050565b600060208251614cea919061884e565b9050600060208351614cfc919061887f565b14614d10578080614d0c906188b0565b9150505b8080614d1b906188b0565b915050602081614d2b91906188f8565b9050919050565b600060208251614d42919061884e565b9050600060208351614d54919061887f565b14614d68578080614d64906188b0565b9150505b8080614d73906188b0565b915050602081614d8391906188f8565b9050919050565b600060208351614d9a919061884e565b9050600060208451614dac919061887f565b1115614dc1578080614dbd906188b0565b9150505b60006001820191505b81811015614dee576020810284015185840152602085039450600181019050614dca565b5050505050565b600080602067ffffffffffffffff811115614e1357614e12616bc3565b5b6040519080825280601f01601f191660200182016040528015614e455781602001600182028036833780820191505090505b5090508260208201526020810151915050919050565b6000602090506000808585015192506001602084040190506000602084061115614e86576001810190505b5b80821015614eab578585015160208302850152602086039550600182019150614e87565b505050505050565b6000614ec282602001516120c4565b9050919050565b600080614ed7858585611de3565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905060046000838152602001908152602001600020600081819054906101000a900463ffffffff1680929190614f3490617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b60006060600060606000614f728661528d565b3b03614fb957600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509050615091565b614fc28561528d565b632e00b39589898960001c8960e001516040518563ffffffff1660e01b8152600401614ff19493929190618220565b600060405180830381600087803b15801561500b57600080fd5b505af192505050801561501c575060015b61508b576150286182e0565b806308c379a003615050575061503c618302565b806150475750615052565b80915050615086565b505b3d806000811461507e576040519150601f19603f3d011682016040523d82523d6000602084013e615083565b606091505b50505b615090565b600191505b5b818193509350505094509492505050565b6000606060006150fb87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff161461514f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615146906182b3565b60405180910390fd5b60006060600061515e8761528d565b90506000813b036151aa57600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f6465000000000000000000000000815250915061527a565b80639e4177318b8b8b60001c8b60e001516040518563ffffffff1660e01b81526004016151da9493929190618220565b600060405180830381600087803b1580156151f457600080fd5b505af1925050508015615205575060015b615274576152116182e0565b806308c379a0036152395750615225618302565b80615230575061523b565b8092505061526f565b505b3d8060008114615267576040519150601f19603f3d011682016040523d82523d6000602084013e61526c565b606091505b50505b615279565b600192505b5b8282955095505050505094509492505050565b600061529c82606001516120c4565b9050919050565b60006152ae8761528d565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082615313576003615316565b60025b876080019060ff16908160ff1681525050826153325781615343565b604051806020016040528060008152505b876101000181905250600154639d2479988261535e8a612470565b6040518363ffffffff1660e01b815260040161537b92919061791a565b600060405180830381600087803b15801561539557600080fd5b505af11580156153a9573d6000803e3d6000fd5b5050505050505050505050565b600060606000606060006153c9866156e6565b3b0361541057600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525090506154e9565b615419856156e6565b632e00b39589898960001c8961012001516040518563ffffffff1660e01b81526004016154499493929190618220565b600060405180830381600087803b15801561546357600080fd5b505af1925050508015615474575060015b6154e3576154806182e0565b806308c379a0036154a85750615494618302565b8061549f57506154aa565b809150506154de565b505b3d80600081146154d6576040519150601f19603f3d011682016040523d82523d6000602084013e6154db565b606091505b50505b6154e8565b600191505b5b818193509350505094509492505050565b60006060600061555387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff16146155a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161559e906189c4565b60405180910390fd5b6000606060006155b6876156e6565b90506000813b0361560257600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506156d3565b80639e4177318b8b8b60001c8b61012001516040518563ffffffff1660e01b81526004016156339493929190618220565b600060405180830381600087803b15801561564d57600080fd5b505af192505050801561565e575060015b6156cd5761566a6182e0565b806308c379a003615692575061567e618302565b806156895750615694565b809250506156c8565b505b3d80600081146156c0576040519150601f19603f3d011682016040523d82523d6000602084013e6156c5565b606091505b50505b6156d2565b600192505b5b8282955095505050505094509492505050565b60006156f582606001516120c4565b9050919050565b6000615707876156e6565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760400181905250838760600181815250508261576c57600361576f565b60025b876080019060ff16908160ff16815250508261578b578161579c565b604051806020016040528060008152505b876101400181905250600154639d247998826157b78a61311d565b6040518363ffffffff1660e01b81526004016157d492919061791a565b600060405180830381600087803b1580156157ee57600080fd5b505af1158015615802573d6000803e3d6000fd5b5050505050505050505050565b61581761655e565b61581f61655e565b600061582a84615972565b905060005b81602001515181101561596757600082602001518281518110615855576158546189e4565b5b602002602001015190506000816000015161ffff16036158905761587881615b24565b846000019061ffff16908161ffff1681525050615953565b6001816000015161ffff16036158b6576158a981615b44565b8460200181905250615952565b6002816000015161ffff16036158e7576158d960206158d483615b52565b613631565b846040018181525050615951565b6003816000015161ffff16036159165761590861590382615b52565b613762565b846060018181525050615950565b6004816000015161ffff160361594f5761592f81615b60565b846080019067ffffffffffffffff16908167ffffffffffffffff16815250505b5b5b5b5b50808061595f906188b0565b91505061582f565b508192505050919050565b61597a61663a565b6006825110156159bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159b690618a5f565b60405180910390fd5b60006159c961663a565b6159db6159d68584615b80565b615baf565b816000019061ffff16908161ffff16815250506006826159fb9190617c87565b91506000808390505b8551811015615a5d57615a2b615a2687600284615a219190617c87565b615cda565b615d0b565b6006615a379190617e07565b63ffffffff1681615a489190617c87565b90508180615a55906188b0565b925050615a04565b60008267ffffffffffffffff811115615a7957615a78616bc3565b5b604051908082528060200260200182016040528015615ab257816020015b615a9f616658565b815260200190600190039081615a975790505b509050600092505b8651851015615b0e57615acb616658565b615ad58887615eec565b809750819250505080828580615aea906188b0565b965081518110615afd57615afc6189e4565b5b602002602001018190525050615aba565b8084602001819052508395505050505050919050565b6000615b3d615b3860028460400151616034565b615baf565b9050919050565b606081604001519050919050565b606081604001519050919050565b6000615b79615b7460088460400151613746565b616042565b9050919050565b60008251600283615b919190617c87565b1115615b9c57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff811115615bd557615bd4616bc3565b5b6040519080825280601f01601f191660200182016040528015615c075781602001600182028036833780820191505090505b50905081600160028110615c1e57615c1d6189e4565b5b1a60f81b81600081518110615c3657615c356189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060028110615c7957615c786189e4565b5b1a60f81b81600181518110615c9157615c906189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615ccd826000615b80565b9050809350505050919050565b60008251600483615ceb9190617c87565b1115615cf657600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff811115615d3157615d30616bc3565b5b6040519080825280601f01601f191660200182016040528015615d635781602001600182028036833780820191505090505b50905081600360048110615d7a57615d796189e4565b5b1a60f81b81600081518110615d9257615d916189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110615dd557615dd46189e4565b5b1a60f81b81600181518110615ded57615dec6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110615e3057615e2f6189e4565b5b1a60f81b81600281518110615e4857615e476189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110615e8b57615e8a6189e4565b5b1a60f81b81600381518110615ea357615ea26189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615edf826000615cda565b9050809350505050919050565b615ef4616658565b600082845111615f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f3090618af1565b60405180910390fd5b6006831015615f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f7490618b5d565b60405180910390fd5b615f85616658565b615f97615f928686615b80565b615baf565b816000019061ffff16908161ffff1681525050600284615fb79190617c87565b9350615fcb615fc68686615cda565b615d0b565b816020019063ffffffff16908163ffffffff1681525050600484615fef9190617c87565b93506160068585836020015163ffffffff1661638f565b8160400181905250806020015163ffffffff16846160249190617c87565b9350808492509250509250929050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff81111561606857616067616bc3565b5b6040519080825280601f01601f19166020018201604052801561609a5781602001600182028036833780820191505090505b509050816007600881106160b1576160b06189e4565b5b1a60f81b816000815181106160c9576160c86189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160066008811061610c5761610b6189e4565b5b1a60f81b81600181518110616124576161236189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600560088110616167576161666189e4565b5b1a60f81b8160028151811061617f5761617e6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816004600881106161c2576161c16189e4565b5b1a60f81b816003815181106161da576161d96189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160036008811061621d5761621c6189e4565b5b1a60f81b81600481518110616235576162346189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110616278576162776189e4565b5b1a60f81b816005815181106162905761628f6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600881106162d3576162d26189e4565b5b1a60f81b816006815181106162eb576162ea6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811061632e5761632d6189e4565b5b1a60f81b81600781518110616346576163456189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616382826000616424565b9050809350505050919050565b60608351828461639f9190617c87565b11156163aa57600080fd5b60008267ffffffffffffffff8111156163c6576163c5616bc3565b5b6040519080825280601f01601f1916602001820160405280156163f85781602001600182028036833780820191505090505b5090506000806020830191508560208801019050616417828287616459565b8293505050509392505050565b600082516008836164359190617c87565b111561644057600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811061649857815183526020836164739190617c87565b92506020826164829190617c87565b91506020816164919190617c53565b905061645a565b60008103156164dd57600060018260206164b29190617c53565b6101006164bf9190618cb0565b6164c99190617c53565b905080198351168185511681811786525050505b505050565b604051806101600160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff1681526020016000815260200160608152602001606081525090565b6040518060a00160405280600061ffff168152602001606081526020016000801916815260200160008152602001600067ffffffffffffffff1681525090565b6040518060800160405280606081526020016000801916815260200160608152602001600063ffffffff1681525090565b604051806101200160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff16815260200160608152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126166bc576166bb616697565b5b8235905067ffffffffffffffff8111156166d9576166d861669c565b5b6020830191508360018202830111156166f5576166f46166a1565b5b9250929050565b6000819050919050565b6000616711826166fc565b9050919050565b61672181616706565b811461672c57600080fd5b50565b60008135905061673e81616718565b92915050565b60008083601f84011261675a57616759616697565b5b8235905067ffffffffffffffff8111156167775761677661669c565b5b602083019150836001820283011115616793576167926166a1565b5b9250929050565b6000806000806000606086880312156167b6576167b561668d565b5b600086013567ffffffffffffffff8111156167d4576167d3616692565b5b6167e0888289016166a6565b955095505060206167f38882890161672f565b935050604086013567ffffffffffffffff81111561681457616813616692565b5b61682088828901616744565b92509250509295509295909350565b6000602082840312156168455761684461668d565b5b60006168538482850161672f565b91505092915050565b60008115159050919050565b6168718161685c565b82525050565b600060208201905061688c6000830184616868565b92915050565b6000819050919050565b6168a581616892565b81146168b057600080fd5b50565b6000813590506168c28161689c565b92915050565b600080600080600080608087890312156168e5576168e461668d565b5b600087013567ffffffffffffffff81111561690357616902616692565b5b61690f89828a016166a6565b9650965050602061692289828a016168b3565b945050604087013567ffffffffffffffff81111561694357616942616692565b5b61694f89828a016166a6565b9350935050606061696289828a016168b3565b9150509295509295509295565b600063ffffffff82169050919050565b6169888161696f565b82525050565b60006020820190506169a3600083018461697f565b92915050565b6000806000604084860312156169c2576169c161668d565b5b60006169d0868287016168b3565b935050602084013567ffffffffffffffff8111156169f1576169f0616692565b5b6169fd86828701616744565b92509250509250925092565b60008060008060008060808789031215616a2657616a2561668d565b5b600087013567ffffffffffffffff811115616a4457616a43616692565b5b616a5089828a016166a6565b96509650506020616a6389828a0161672f565b945050604087013567ffffffffffffffff811115616a8457616a83616692565b5b616a9089828a016166a6565b93509350506060616aa389828a0161672f565b9150509295509295509295565b616ab98161685c565b8114616ac457600080fd5b50565b600081359050616ad681616ab0565b92915050565b60008060008060008060808789031215616af957616af861668d565b5b600087013567ffffffffffffffff811115616b1757616b16616692565b5b616b2389828a016166a6565b96509650506020616b3689828a0161672f565b9450506040616b4789828a01616ac7565b935050606087013567ffffffffffffffff811115616b6857616b67616692565b5b616b7489828a01616744565b92509250509295509295509295565b616b8c81616892565b82525050565b6000602082019050616ba76000830184616b83565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616bfb82616bb2565b810181811067ffffffffffffffff82111715616c1a57616c19616bc3565b5b80604052505050565b6000616c2d616683565b9050616c398282616bf2565b919050565b600067ffffffffffffffff821115616c5957616c58616bc3565b5b616c6282616bb2565b9050602081019050919050565b82818337600083830152505050565b6000616c91616c8c84616c3e565b616c23565b905082815260208101848484011115616cad57616cac616bad565b5b616cb8848285616c6f565b509392505050565b600082601f830112616cd557616cd4616697565b5b8135616ce5848260208601616c7e565b91505092915050565b60008060408385031215616d0557616d0461668d565b5b6000616d138582860161672f565b925050602083013567ffffffffffffffff811115616d3457616d33616692565b5b616d4085828601616cc0565b9150509250929050565b60008060008060008060808789031215616d6757616d6661668d565b5b600087013567ffffffffffffffff811115616d8557616d84616692565b5b616d9189828a016166a6565b96509650506020616da489828a0161672f565b9450506040616db589828a0161672f565b935050606087013567ffffffffffffffff811115616dd657616dd5616692565b5b616de289828a01616744565b92509250509295509295509295565b616dfa81616706565b82525050565b6000602082019050616e156000830184616df1565b92915050565b600060208284031215616e3157616e3061668d565b5b600082013567ffffffffffffffff811115616e4f57616e4e616692565b5b616e5b84828501616cc0565b91505092915050565b60008060208385031215616e7b57616e7a61668d565b5b600083013567ffffffffffffffff811115616e9957616e98616692565b5b616ea5858286016166a6565b92509250509250929050565b600061ffff82169050919050565b616ec881616eb1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015616f08578082015181840152602081019050616eed565b83811115616f17576000848401525b50505050565b6000616f2882616ece565b616f328185616ed9565b9350616f42818560208601616eea565b616f4b81616bb2565b840191505092915050565b616f5f81616892565b82525050565b616f6e816166fc565b82525050565b600067ffffffffffffffff82169050919050565b616f9181616f74565b82525050565b600060a083016000830151616faf6000860182616ebf565b5060208301518482036020860152616fc78282616f1d565b9150506040830151616fdc6040860182616f56565b506060830151616fef6060860182616f65565b5060808301516170026080860182616f88565b508091505092915050565b600060208201905081810360008301526170278184616f97565b905092915050565b60008060008060006060868803121561704b5761704a61668d565b5b600086013567ffffffffffffffff81111561706957617068616692565b5b617075888289016166a6565b95509550506020617088888289016168b3565b935050604086013567ffffffffffffffff8111156170a9576170a8616692565b5b6170b588828901616744565b92509250509295509295909350565b600060ff82169050919050565b6170da816170c4565b81146170e557600080fd5b50565b6000813590506170f7816170d1565b92915050565b617106816166fc565b811461711157600080fd5b50565b600081359050617123816170fd565b92915050565b60008060008060008060008060c0898b0312156171495761714861668d565b5b600089013567ffffffffffffffff81111561716757617166616692565b5b6171738b828c016166a6565b985098505060206171868b828c0161672f565b96505060406171978b828c01616ac7565b955050606089013567ffffffffffffffff8111156171b8576171b7616692565b5b6171c48b828c01616744565b945094505060806171d78b828c016170e8565b92505060a06171e88b828c01617114565b9150509295985092959890939650565b6172018161696f565b811461720c57600080fd5b50565b60008135905061721e816171f8565b92915050565b6000806000806080858703121561723e5761723d61668d565b5b600085013567ffffffffffffffff81111561725c5761725b616692565b5b61726887828801616cc0565b94505060206172798782880161672f565b935050604061728a8782880161672f565b925050606061729b8782880161720f565b91505092959194509250565b600082825260208201905092915050565b7f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b60006173146022836172a7565b915061731f826172b8565b604082019050919050565b6000602082019050818103600083015261734381617307565b9050919050565b600081905092915050565b6000617361838561734a565b935061736e838584616c6f565b82840190509392505050565b6000617387828486617355565b91508190509392505050565b7f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000600082015250565b60006173c9601e836172a7565b91506173d482617393565b602082019050919050565b600060208201905081810360008301526173f8816173bc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006174356020836172a7565b9150617440826173ff565b602082019050919050565b6000602082019050818103600083015261746481617428565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006174c76027836172a7565b91506174d28261746b565b604082019050919050565b600060208201905081810360008301526174f6816174ba565b9050919050565b7f5344504d73673a2073656e646572206e6f742076616c69642072656c61796572600082015250565b60006175336020836172a7565b915061753e826174fd565b602082019050919050565b6000602082019050818103600083015261756281617526565b9050919050565b7f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60008201527f75744d6561737572652069732030000000000000000000000000000000000000602082015250565b60006175c5602e836172a7565b91506175d082617569565b604082019050919050565b600060208201905081810360008301526175f4816175b8565b9050919050565b600061760682616ece565b617610818561734a565b9350617620818560208601616eea565b80840191505092915050565b600061763882846175fb565b915081905092915050565b7f5344505f4d53475f4552524f523a20657863657074696f6e206d65737361676560008201527f206861736820646f6573206e6f74206578697374000000000000000000000000602082015250565b600061769f6034836172a7565b91506176aa82617643565b604082019050919050565b600060208201905081810360008301526176ce81617692565b9050919050565b60006176e082616ece565b6176ea81856172a7565b93506176fa818560208601616eea565b61770381616bb2565b840191505092915050565b61771781616f74565b82525050565b600081519050919050565b600082825260208201905092915050565b60006177448261771d565b61774e8185617728565b935061775e818560208601616eea565b61776781616bb2565b840191505092915050565b600060e082019050617787600083018a616b83565b818103602083015261779981896176d5565b90506177a86040830188616df1565b6177b5606083018761697f565b6177c2608083018661770e565b81810360a08301526177d48185617739565b905081810360c08301526177e881846176d5565b905098975050505050505050565b7f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60008201527f742074696d656f757420776974682074696d656f75744d656173757265203200602082015250565b6000617852603f836172a7565b915061785d826177f6565b604082019050919050565b6000602082019050818103600083015261788181617845565b9050919050565b7f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f60008201527f7574206d65617375726500000000000000000000000000000000000000000000602082015250565b60006178e4602a836172a7565b91506178ef82617888565b604082019050919050565b60006020820190508181036000830152617913816178d7565b9050919050565b600060408201905061792f6000830185616df1565b81810360208301526179418184617739565b90509392505050565b7f5344504d73673a20696e76616c696420616d20636f6e74726163740000000000600082015250565b6000617980601b836172a7565b915061798b8261794a565b602082019050919050565b600060208201905081810360008301526179af81617973565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806179fd57607f821691505b602082108103617a1057617a0f6179b6565b5b50919050565b7f5344504d73673a206e6f742076616c696420616d20636f6e7472616374000000600082015250565b6000617a4c601d836172a7565b9150617a5782617a16565b602082019050919050565b60006020820190508181036000830152617a7b81617a3f565b9050919050565b7f756e737570706f72746564207364702076657273696f6e000000000000000000600082015250565b6000617ab86017836172a7565b9150617ac382617a82565b602082019050919050565b60006020820190508181036000830152617ae781617aab565b9050919050565b7f5344503a20696e76616c69642074696d656f7574206d65617375726500000000600082015250565b6000617b24601c836172a7565b9150617b2f82617aee565b602082019050919050565b60006020820190508181036000830152617b5381617b17565b9050919050565b7f5344504d73673a20696e76616c6964206d6f6e69746f7220636f6e7472616374600082015250565b6000617b906020836172a7565b9150617b9b82617b5a565b602082019050919050565b60006020820190508181036000830152617bbf81617b83565b9050919050565b6000819050919050565b617be1617bdc82616892565b617bc6565b82525050565b6000617bf38286617bd0565b602082019150617c038285617bd0565b602082019150617c138284617bd0565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000617c5e826166fc565b9150617c69836166fc565b925082821015617c7c57617c7b617c24565b5b828203905092915050565b6000617c92826166fc565b9150617c9d836166fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617cd257617cd1617c24565b5b828201905092915050565b6000617ce88261696f565b915063ffffffff8203617cfe57617cfd617c24565b5b600182019050919050565b7f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00600082015250565b6000617d3f601f836172a7565b9150617d4a82617d09565b602082019050919050565b60006020820190508181036000830152617d6e81617d32565b9050919050565b7f656e636f64655344504d6573736167653a20626f6479206c656e677468206f7660008201527f65726c696d697400000000000000000000000000000000000000000000000000602082015250565b6000617dd16027836172a7565b9150617ddc82617d75565b604082019050919050565b60006020820190508181036000830152617e0081617dc4565b9050919050565b6000617e128261696f565b9150617e1d8361696f565b92508263ffffffff03821115617e3657617e35617c24565b5b828201905092915050565b7f656e636f64655344504d6573736167653a207a65726f206d657373616765206960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e9d6021836172a7565b9150617ea882617e41565b604082019050919050565b60006020820190508181036000830152617ecc81617e90565b9050919050565b7f756e65787065637465642061746f6d696320666c616700000000000000000000600082015250565b6000617f096016836172a7565b9150617f1482617ed3565b602082019050919050565b60006020820190508181036000830152617f3881617efc565b9050919050565b7f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e00600082015250565b6000617f75601f836172a7565b9150617f8082617f3f565b602082019050919050565b60006020820190508181036000830152617fa481617f68565b9050919050565b7f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360008201527f20666c6167000000000000000000000000000000000000000000000000000000602082015250565b60006180076025836172a7565b915061801282617fab565b604082019050919050565b6000602082019050818103600083015261803681617ffa565b9050919050565b7f6279746573546f56617242797465733a206f6666736574206c6573732074686160008201527f6e206c656e677468206f6620626f647900000000000000000000000000000000602082015250565b60006180996030836172a7565b91506180a48261803d565b604082019050919050565b600060208201905081810360008301526180c88161808c565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b600061812b6023836172a7565b9150618136826180cf565b604082019050919050565b6000602082019050818103600083015261815a8161811e565b9050919050565b7f7661724279746573546f42797465733a206f6666736574206c6573732074686160008201527f6e2074686520696e707574206c656e6774680000000000000000000000000000602082015250565b60006181bd6032836172a7565b91506181c882618161565b604082019050919050565b600060208201905081810360008301526181ec816181b0565b9050919050565b60006181ff83856172a7565b935061820c838584616c6f565b61821583616bb2565b840190509392505050565b6000606082019050818103600083015261823b8186886181f3565b905061824a6020830185616df1565b818103604083015261825c8184617739565b905095945050505050565b7f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000600082015250565b600061829d601a836172a7565b91506182a882618267565b602082019050919050565b600060208201905081810360008301526182cc81618290565b9050919050565b60008160e01c9050919050565b600060033d11156182ff5760046000803e6182fc6000516182d3565b90505b90565b600060443d1061838f57618314616683565b60043d036004823e80513d602482011167ffffffffffffffff8211171561833c57505061838f565b808201805167ffffffffffffffff81111561835a575050505061838f565b80602083010160043d03850181111561837757505050505061838f565b61838682602001850186616bf2565b82955050505050505b90565b600060c08201905081810360008301526183ad81898b6181f3565b90506183bc6020830188616b83565b6183c96040830187616df1565b6183d6606083018661697f565b6183e36080830185616868565b81810360a08301526183f581846176d5565b905098975050505050505050565b6000602082019050818103600083015261841d81846176d5565b905092915050565b61842e816170c4565b82525050565b60006101408201905061844a600083018e616b83565b818103602083015261845d818c8e6181f3565b905061846c604083018b616b83565b818103606083015261847e818a6176d5565b905061848d6080830189616df1565b61849a60a083018861697f565b6184a760c083018761770e565b6184b460e0830186618425565b6184c2610100830185616868565b8181036101208301526184d581846176d5565b90509c9b505050505050505050505050565b600060c0820190506184fc600083018a616b83565b818103602083015261850f81888a6181f3565b905061851e6040830187616df1565b61852b606083018661697f565b618538608083018561770e565b81810360a083015261854a8184617739565b905098975050505050505050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b600061858e6007836172a7565b915061859982618558565b602082019050919050565b6000610140820190506185ba600083018d616b83565b81810360208301526185cd818b8d6181f3565b90506185dc604083018a616b83565b81810360608301526185ee81896176d5565b90506185fd6080830188616df1565b61860a60a083018761697f565b61861760c083018661770e565b61862460e0830185618425565b618632610100830184616868565b81810361012083015261864481618581565b90509b9a5050505050505050505050565b600060e08201905061866a600083018b616b83565b818103602083015261867d81898b6181f3565b905061868c6040830188616df1565b618699606083018761697f565b6186a6608083018661770e565b81810360a08301526186b88185617739565b905081810360c08301526186cc81846176d5565b90509998505050505050505050565b7f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060008201527f3220616e64203420666f72206e6f770000000000000000000000000000000000602082015250565b6000618737602f836172a7565b9150618742826186db565b604082019050919050565b600060208201905081810360008301526187668161872a565b9050919050565b7f6d73672069732074696d656f7574000000000000000000000000000000000000600082015250565b60006187a3600e836172a7565b91506187ae8261876d565b602082019050919050565b600060208201905081810360008301526187d281618796565b9050919050565b6187e2816166fc565b82525050565b60006060820190506187fd6000830186616b83565b61880a6020830185618425565b61881760408301846187d9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000618859826166fc565b9150618864836166fc565b9250826188745761887361881f565b5b828204905092915050565b600061888a826166fc565b9150618895836166fc565b9250826188a5576188a461881f565b5b828206905092915050565b60006188bb826166fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036188ed576188ec617c24565b5b600182019050919050565b6000618903826166fc565b915061890e836166fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561894757618946617c24565b5b828202905092915050565b7f5344505f4d53475f4552524f523a2073657175656e6365206e6f74206571756160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006189ae6021836172a7565b91506189b982618952565b604082019050919050565b600060208201905081810360008301526189dd816189a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000618a496017836172a7565b9150618a5482618a13565b602082019050919050565b60006020820190508181036000830152618a7881618a3c565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000618adb6023836172a7565b9150618ae682618a7f565b604082019050919050565b60006020820190508181036000830152618b0a81618ace565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000618b47600e836172a7565b9150618b5282618b11565b602082019050919050565b60006020820190508181036000830152618b7681618b3a565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115618bd457808604811115618bb057618baf617c24565b5b6001851615618bbf5780820291505b8081029050618bcd85618b7d565b9450618b94565b94509492505050565b600082618bed5760019050618ca9565b81618bfb5760009050618ca9565b8160018114618c115760028114618c1b57618c4a565b6001915050618ca9565b60ff841115618c2d57618c2c617c24565b5b8360020a915084821115618c4457618c43617c24565b5b50618ca9565b5060208310610133831016604e8410600b8410161715618c7f5782820a905083811115618c7a57618c79617c24565b5b618ca9565b618c8c8484846001618b8a565b92509050818404811115618ca357618ca2617c24565b5b81810290505b9392505050565b6000618cbb826166fc565b9150618cc6836166fc565b9250618cf37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484618bdd565b90509291505056fea36469706673582212200587978355f98781742d02b6ec36a7ede2d302745d718faf98cea3fd33b07d8164736f6c634300080e6b636f6d70696c655f6d6f6461300041 \ No newline at end of file From 08a17ad24168e29ae2043c01c695f0b082fb9966 Mon Sep 17 00:00:00 2001 From: 0xstride <73103011+fengjy73@users.noreply.github.com> Date: Wed, 19 Aug 2026 04:12:02 +0800 Subject: [PATCH 03/23] Fix Mychain monitor address recovery --- .../mychain020/Mychain020BBCService.java | 60 ++++++++++++++++--- .../contract/MonitorContractClientEVM.java | 35 +++++++++++ .../contract/MonitorVerifierContractEVM.java | 25 +++++++- .../mychain020/sdk/Mychain020Client.java | 24 +++++++- .../Mychain020MonitorBBCServiceTest.java | 33 ++++++++++ 5 files changed, 165 insertions(+), 12 deletions(-) diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java index bdb5ae4f..f6658ed2 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java @@ -24,6 +24,7 @@ import com.alipay.antchain.bridge.plugins.lib.BBCService; import com.alipay.antchain.bridge.plugins.mychain020.contract.AMContractClientEVM; import com.alipay.antchain.bridge.plugins.mychain020.contract.AMContractClientWASM; +import com.alipay.antchain.bridge.plugins.mychain020.model.ContractAddressInfo; import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; import com.alipay.antchain.bridge.plugins.mychain020.utils.ContractUtils; import com.alipay.antchain.bridge.plugins.mychain020.utils.MychainUtils; @@ -31,6 +32,7 @@ import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; import com.alipay.mychain.sdk.domain.block.Block; +import com.alipay.mychain.sdk.domain.account.Identity; import com.alipay.mychain.sdk.domain.spv.BlockHeaderInfo; import com.alipay.mychain.sdk.domain.transaction.LogEntry; import com.alipay.mychain.sdk.domain.transaction.Transaction; @@ -1174,9 +1176,10 @@ public void setProtocolInMonitor(String contractAddress) { throw new RuntimeException("monitor contract is not deployed"); } - String sdpContractName = StrUtil.isNotEmpty(contractAddress) ? - contractAddress : - context.getSdpContractClientEVM().getContractAddress(); + String sdpContractName = resolveEvmContractName( + contractAddress, + context.getSdpContractClientEVM().getContractAddress(), + "sdp"); context.getMonitorContractClientEVM().setProtocol(sdpContractName); } @@ -1214,15 +1217,54 @@ public void setMonitorControl(int monitorType) { public void setPtcHubInMonitorVerifier(String contractAddress) { getBBCLogger().info("[Mychain020BBCService] set ptc hub in monitor verifier for {}", mychain020Client.getPrimary()); - if (ObjectUtil.isNull(context.getMonitorVerifierContractEVM()) - || StrUtil.isEmpty(context.getMonitorVerifierContractEVM().getContractAddress())) { + if (ObjectUtil.isNull(context.getMonitorVerifierContractEVM())) { + throw new RuntimeException("monitor verifier contract is not deployed"); + } + + String ptcHubContractName = resolveEvmContractName( + contractAddress, + context.getPtcContractEvm().getContractAddress(), + "ptc hub"); + if (StrUtil.isNotEmpty(context.getMonitorVerifierContractEVM().getContractAddress())) { + context.getMonitorVerifierContractEVM().setPtcHubAddress(ptcHubContractName); + return; + } + if (ObjectUtil.isNull(context.getMonitorContractClientEVM()) + || StrUtil.isEmpty(context.getMonitorContractClientEVM().getContractAddress())) { throw new RuntimeException("monitor verifier contract is not deployed"); } - String ptcHubContractName = StrUtil.isNotEmpty(contractAddress) ? - contractAddress : - context.getPtcContractEvm().getContractAddress(); - context.getMonitorVerifierContractEVM().setPtcHubAddress(ptcHubContractName); + Identity verifierIdentity = context.getMonitorContractClientEVM().getMonitorVerifierIdentity(); + context.getMonitorVerifierContractEVM().setPtcHubAddress(ptcHubContractName, verifierIdentity); + } + + /** + * Common relayer contexts persist Mychain multi-VM addresses as JSON. The + * EVM monitor contracts must hash the contained EVM contract name, not the + * serialized wrapper itself. + */ + private String resolveEvmContractName(String suppliedAddress, + String fallbackAddress, + String contractType) { + String address = StrUtil.isNotEmpty(suppliedAddress) ? suppliedAddress : fallbackAddress; + if (StrUtil.isEmpty(address)) { + throw new RuntimeException(StrUtil.format("{} contract is not deployed", contractType)); + } + if (!address.trim().startsWith("{")) { + return address; + } + + try { + String evmContractName = ContractAddressInfo.decode(address).getEvmContractAddress(); + if (StrUtil.isEmpty(evmContractName)) { + throw new RuntimeException(StrUtil.format( + "{} address does not contain an EVM contract", contractType)); + } + return evmContractName; + } catch (RuntimeException exception) { + throw new RuntimeException(StrUtil.format( + "invalid serialized {} contract address", contractType), exception); + } } @Override diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java index 9219e3af..4671134f 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java @@ -11,6 +11,8 @@ import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.crypto.hash.Hash; +import com.alipay.mychain.sdk.domain.account.Identity; import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; import com.alipay.mychain.sdk.errorcode.ErrorCode; import com.alipay.mychain.sdk.vm.EVMOutput; @@ -28,6 +30,7 @@ public class MonitorContractClientEVM { private static final String MONITOR_EVM_CONTRACT_PREFIX = "MONITOR_EVM_CONTRACT_"; private static final String GET_IMPLEMENTATION_VERSION_SIGN = "getImplementationVersion()"; + private static final String GET_MONITOR_VERIFIER_SIGN = "getMonitorVerifier()"; private static final String SET_SDP_ADDRESS_SIGN = "setSdpAddress(identity)"; private static final String SET_MONITOR_VERIFIER_ADDRESS_SIGN = "setMonitorVerifierAddress(identity)"; private static final String SET_MONITOR_CONTROL_SIGN = "setMonitorControl(uint32)"; @@ -44,6 +47,22 @@ public MonitorContractClientEVM(Mychain020Client mychain020Client, Logger logger this.logger = logger; } + public String getContractAddress() { + return contractAddress; + } + + public void setContractAddress(String contractAddress) { + this.contractAddress = contractAddress; + } + + public ContractStatusEnum getStatus() { + return status; + } + + public void setStatus(ContractStatusEnum status) { + this.status = status; + } + public boolean deployContract() { if (StrUtil.isNotEmpty(this.contractAddress)) { return true; @@ -89,6 +108,22 @@ public boolean isImplementationVersionSupported() { } } + public Identity getMonitorVerifierIdentity() { + TransactionReceipt receipt = mychain020Client.localCallContract( + this.contractAddress, + new EVMParameter(GET_MONITOR_VERIFIER_SIGN)); + if (ObjectUtil.isEmpty(receipt) + || receipt.getResult() != ErrorCode.SUCCESS.getErrorCode() + || ObjectUtil.isEmpty(receipt.getOutput()) + || receipt.getOutput().length != 32) { + throw new CallContractException( + this.contractAddress, + "", + "monitor verifier identity is unavailable"); + } + return new Identity(new Hash(receipt.getOutput())); + } + public void resetDeployment() { this.contractAddress = null; this.status = null; diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java index 6ebd28e9..ce09860d 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java @@ -9,6 +9,7 @@ import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.account.Identity; import com.alipay.mychain.sdk.vm.EVMParameter; import lombok.Getter; import lombok.Setter; @@ -32,6 +33,22 @@ public MonitorVerifierContractEVM(Mychain020Client mychain020Client, Logger logg this.logger = logger; } + public String getContractAddress() { + return contractAddress; + } + + public void setContractAddress(String contractAddress) { + this.contractAddress = contractAddress; + } + + public ContractStatusEnum getStatus() { + return status; + } + + public void setStatus(ContractStatusEnum status) { + this.status = status; + } + public boolean deployContract() { if (StrUtil.isNotEmpty(this.contractAddress)) { return true; @@ -54,10 +71,16 @@ public boolean deployContract() { } public void setPtcHubAddress(String ptcHubContractName) { + setPtcHubAddress(ptcHubContractName, null); + } + + public void setPtcHubAddress(String ptcHubContractName, Identity verifierContractIdentity) { EVMParameter parameters = new EVMParameter(SET_PTC_HUB_ADDRESS_SIGN); parameters.addIdentity(Utils.getIdentityByName(ptcHubContractName, mychain020Client.getConfig().getMychainHashType())); - SendResponseResult result = mychain020Client.callContract(this.contractAddress, parameters, true); + SendResponseResult result = verifierContractIdentity == null + ? mychain020Client.callContract(this.contractAddress, parameters, true) + : mychain020Client.callContract(verifierContractIdentity, parameters, true); if (!result.isSuccess()) { throw new CallContractException(this.contractAddress, result.getTxId(), result.getErrorMessage()); } diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java index 18141ae5..364fd80b 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java @@ -133,12 +133,32 @@ public boolean shutdown() { // ==================================================== 合约相关接口 public SendResponseResult callContract(String contractName, Parameters parameters, boolean sync) { + return callContract( + Utils.getIdentityByName(contractName, config.getMychainHashType()), + contractName, + parameters, + sync); + } + + /** + * Calls a contract whose Mychain identity was recovered from another + * on-chain system contract. This is required for legacy contexts which did + * not persist the randomly generated monitor-verifier contract name. + */ + public SendResponseResult callContract(Identity contractIdentity, Parameters parameters, boolean sync) { + return callContract(contractIdentity, contractIdentity.hexStrValue(), parameters, sync); + } + + private SendResponseResult callContract(Identity contractIdentity, + String contractLabel, + Parameters parameters, + boolean sync) { String account = config.getMychainAnchorAccount(); VMTypeEnum vmType = MychainUtils.getSupportedParameterType(parameters); logger.info("call {} contractName {}.{}", vmType, - contractName, + contractLabel, vmType == VMTypeEnum.EVM ? ((EVMParameter) parameters).getMethodSignature() : ((WASMParameter) parameters).getMethodSignature()); @@ -146,7 +166,7 @@ public SendResponseResult callContract(String contractName, Parameters parameter try { CallContractRequest request = new CallContractRequest( Utils.getIdentityByName(account, config.getMychainHashType()), - Utils.getIdentityByName(contractName, config.getMychainHashType()), + contractIdentity, parameters, BigInteger.ZERO, vmType diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java index d5688db0..37691cbe 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java @@ -12,6 +12,7 @@ import com.alipay.antchain.bridge.plugins.mychain020.contract.SDPContractClientEVM; import com.alipay.antchain.bridge.plugins.mychain020.contract.AMContractClientEVM; import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.mychain.sdk.domain.account.Identity; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -225,6 +226,16 @@ public void setProtocolInMonitorShouldUseExplicitAddress() { verify(monitorContractClientEVM).setProtocol("custom_sdp_contract"); } + @Test + public void setProtocolInMonitorShouldExtractEvmAddressFromPersistedContext() { + when(monitorContractClientEVM.getContractAddress()).thenReturn(MONITOR_CONTRACT); + + service.setProtocolInMonitor( + "{\"evm\":\"sdp_evm_contract\",\"wasm\":\"sdp_wasm_contract\"}"); + + verify(monitorContractClientEVM).setProtocol("sdp_evm_contract"); + } + @Test public void setProtocolInMonitorShouldUseContextSdpAddressByDefault() { when(monitorContractClientEVM.getContractAddress()).thenReturn(MONITOR_CONTRACT); @@ -293,6 +304,16 @@ public void setPtcHubInMonitorVerifierShouldUseExplicitAddress() { verify(monitorVerifierContractEVM).setPtcHubAddress("custom_ptc_hub_contract"); } + @Test + public void setPtcHubInMonitorVerifierShouldExtractEvmAddressFromPersistedContext() { + when(monitorVerifierContractEVM.getContractAddress()).thenReturn(MONITOR_VERIFIER_CONTRACT); + + service.setPtcHubInMonitorVerifier( + "{\"evm\":\"ptc_evm_contract\",\"wasm\":\"\"}"); + + verify(monitorVerifierContractEVM).setPtcHubAddress("ptc_evm_contract"); + } + @Test public void setPtcHubInMonitorVerifierShouldUseContextPtcHubAddressByDefault() { when(monitorVerifierContractEVM.getContractAddress()).thenReturn(MONITOR_VERIFIER_CONTRACT); @@ -303,6 +324,18 @@ public void setPtcHubInMonitorVerifierShouldUseContextPtcHubAddressByDefault() { verify(monitorVerifierContractEVM).setPtcHubAddress(PTC_HUB_CONTRACT); } + @Test + public void setPtcHubInMonitorVerifierShouldRecoverVerifierIdentityAfterRestart() { + Identity verifierIdentity = mock(Identity.class); + when(monitorVerifierContractEVM.getContractAddress()).thenReturn(""); + when(monitorContractClientEVM.getContractAddress()).thenReturn(MONITOR_CONTRACT); + when(monitorContractClientEVM.getMonitorVerifierIdentity()).thenReturn(verifierIdentity); + + service.setPtcHubInMonitorVerifier(PTC_HUB_CONTRACT); + + verify(monitorVerifierContractEVM).setPtcHubAddress(PTC_HUB_CONTRACT, verifierIdentity); + } + @Test(expected = RuntimeException.class) public void setPtcHubInMonitorVerifierShouldRejectMissingVerifierContract() { when(monitorVerifierContractEVM.getContractAddress()).thenReturn(""); From 16ac44530e193ca385dc1a683a9151c37c40c163 Mon Sep 17 00:00:00 2001 From: 0xstride <73103011+fengjy73@users.noreply.github.com> Date: Wed, 19 Aug 2026 04:12:12 +0800 Subject: [PATCH 04/23] Bound plugin receipt queries --- .../pluginserver/GRpcBBCServiceClient.java | 10 +++++- .../GRpcBBCServiceClientTest.java | 34 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClientTest.java diff --git a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java index 16866761..437ad921 100644 --- a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java +++ b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java @@ -25,6 +25,8 @@ public class GRpcBBCServiceClient implements IBBCServiceClient { + static final long RECEIPT_QUERY_DEADLINE_SECONDS = 30L; + private String psId; private final String product; @@ -108,7 +110,7 @@ public AbstractBBCContext getContext() { @Override public CrossChainMessageReceipt readCrossChainMessageReceipt(String txhash) { - Response response = this.blockingStub.bbcCall( + Response response = withReceiptQueryDeadline(this.blockingStub).bbcCall( CallBBCRequest.newBuilder() .setProduct(this.getProduct()) .setDomain(this.getDomain()) @@ -127,6 +129,12 @@ public CrossChainMessageReceipt readCrossChainMessageReceipt(String txhash) { ); } + static CrossChainServiceGrpc.CrossChainServiceBlockingStub withReceiptQueryDeadline( + CrossChainServiceGrpc.CrossChainServiceBlockingStub stub + ) { + return stub.withDeadlineAfter(RECEIPT_QUERY_DEADLINE_SECONDS, TimeUnit.SECONDS); + } + @Override public List