Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,590 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Light Client... | 20434965 | 162 days ago | IN | 0 ETH | 0.00559053 | ||||
Add Light Client... | 15514183 | 852 days ago | IN | 0 ETH | 0.01000601 | ||||
Add Light Client... | 15513204 | 852 days ago | IN | 0 ETH | 0.01062493 | ||||
Add Light Client... | 15512190 | 852 days ago | IN | 0 ETH | 0.01108033 | ||||
Add Light Client... | 15511181 | 853 days ago | IN | 0 ETH | 0.05495311 | ||||
Add Light Client... | 15510100 | 853 days ago | IN | 0 ETH | 0.02311491 | ||||
Add Light Client... | 15509102 | 853 days ago | IN | 0 ETH | 0.01393574 | ||||
Add Light Client... | 15508114 | 853 days ago | IN | 0 ETH | 0.01340337 | ||||
Add Light Client... | 15507123 | 853 days ago | IN | 0 ETH | 0.02652387 | ||||
Add Light Client... | 15506033 | 853 days ago | IN | 0 ETH | 0.02269829 | ||||
Add Light Client... | 15505045 | 854 days ago | IN | 0 ETH | 0.02548569 | ||||
Add Light Client... | 15503984 | 854 days ago | IN | 0 ETH | 0.05537567 | ||||
Add Light Client... | 15502989 | 854 days ago | IN | 0 ETH | 0.11525877 | ||||
Add Light Client... | 15502008 | 854 days ago | IN | 0 ETH | 0.0310332 | ||||
Add Light Client... | 15500995 | 854 days ago | IN | 0 ETH | 0.03180939 | ||||
Add Light Client... | 15499939 | 854 days ago | IN | 0 ETH | 0.02067362 | ||||
Add Light Client... | 15498915 | 855 days ago | IN | 0 ETH | 0.06265305 | ||||
Add Light Client... | 15497870 | 855 days ago | IN | 0 ETH | 0.25579376 | ||||
Add Light Client... | 15496816 | 855 days ago | IN | 0 ETH | 0.04783095 | ||||
Add Light Client... | 15495755 | 855 days ago | IN | 0 ETH | 0.0122451 | ||||
Add Light Client... | 15494716 | 855 days ago | IN | 0 ETH | 0.02725285 | ||||
Add Light Client... | 15493649 | 855 days ago | IN | 0 ETH | 0.06402079 | ||||
Add Light Client... | 15492596 | 856 days ago | IN | 0 ETH | 0.03795805 | ||||
Add Light Client... | 15491552 | 856 days ago | IN | 0 ETH | 0.04533675 | ||||
Add Light Client... | 15490498 | 856 days ago | IN | 0 ETH | 0.03323549 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
NearBridge
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8; import "./AdminControlled.sol"; import "./INearBridge.sol"; import "./NearDecoder.sol"; import "./Ed25519.sol"; contract NearBridge is INearBridge, AdminControlled { using Borsh for Borsh.Data; using NearDecoder for Borsh.Data; // Assumed to be even and to not exceed 256. uint constant MAX_BLOCK_PRODUCERS = 100; struct Epoch { bytes32 epochId; uint numBPs; bytes32[MAX_BLOCK_PRODUCERS] keys; bytes32[MAX_BLOCK_PRODUCERS / 2] packedStakes; uint256 stakeThreshold; } // Whether the contract was initialized. bool public initialized; uint256 public lockEthAmount; // lockDuration and replaceDuration shouldn't be extremely big, so adding them to an uint64 timestamp should not overflow uint256. uint256 public lockDuration; // replaceDuration is in nanoseconds, because it is a difference between NEAR timestamps. uint256 public replaceDuration; Ed25519 immutable edwards; Epoch[3] epochs; uint curEpoch; uint64 curHeight; // The most recently added block. May still be in its challenge period, so should not be trusted. uint64 untrustedHeight; uint256 untrustedTimestamp; bool untrustedNextEpoch; bytes32 untrustedHash; bytes32 untrustedMerkleRoot; bytes32 untrustedNextHash; uint256 untrustedSignatureSet; NearDecoder.Signature[MAX_BLOCK_PRODUCERS] untrustedSignatures; // Address of the account which submitted the last block. address lastSubmitter; // End of challenge period. If zero, untrusted* fields and lastSubmitter are not meaningful. uint public lastValidAt; mapping(uint64 => bytes32) blockHashes_; mapping(uint64 => bytes32) blockMerkleRoots_; mapping(address => uint256) public override balanceOf; constructor( Ed25519 ed, uint256 lockEthAmount_, uint256 lockDuration_, uint256 replaceDuration_, address admin_, uint256 pausedFlags_ ) AdminControlled(admin_, pausedFlags_) { require(replaceDuration_ > lockDuration_ * 1000000000); edwards = ed; lockEthAmount = lockEthAmount_; lockDuration = lockDuration_; replaceDuration = replaceDuration_; } uint constant UNPAUSE_ALL = 0; uint constant PAUSED_DEPOSIT = 1; uint constant PAUSED_WITHDRAW = 2; uint constant PAUSED_ADD_BLOCK = 4; uint constant PAUSED_CHALLENGE = 8; uint constant PAUSED_VERIFY = 16; function deposit() public payable override pausable(PAUSED_DEPOSIT) { require(msg.value == lockEthAmount && balanceOf[msg.sender] == 0); balanceOf[msg.sender] = msg.value; } function withdraw() public override pausable(PAUSED_WITHDRAW) { require(msg.sender != lastSubmitter || block.timestamp >= lastValidAt); uint amount = balanceOf[msg.sender]; require(amount != 0); balanceOf[msg.sender] = 0; payable(msg.sender).transfer(amount); } function challenge(address payable receiver, uint signatureIndex) public override pausable(PAUSED_CHALLENGE) { require(block.timestamp < lastValidAt, "No block can be challenged at this time"); require(!checkBlockProducerSignatureInHead(signatureIndex), "Can't challenge valid signature"); balanceOf[lastSubmitter] = balanceOf[lastSubmitter] - lockEthAmount; receiver.transfer(lockEthAmount / 2); lastValidAt = 0; } function checkBlockProducerSignatureInHead(uint signatureIndex) public view override returns (bool) { // Shifting by a number >= 256 returns zero. require((untrustedSignatureSet & (1 << signatureIndex)) != 0, "No such signature"); unchecked { Epoch storage untrustedEpoch = epochs[untrustedNextEpoch ? (curEpoch + 1) % 3 : curEpoch]; NearDecoder.Signature storage signature = untrustedSignatures[signatureIndex]; bytes memory message = abi.encodePacked( uint8(0), untrustedNextHash, Utils.swapBytes8(untrustedHeight + 2), bytes23(0) ); (bytes32 arg1, bytes9 arg2) = abi.decode(message, (bytes32, bytes9)); return edwards.check(untrustedEpoch.keys[signatureIndex], signature.r, signature.s, arg1, arg2); } } // The first part of initialization -- setting the validators of the current epoch. function initWithValidators(bytes memory data) public override onlyAdmin { require(!initialized && epochs[0].numBPs == 0, "Wrong initialization stage"); Borsh.Data memory borsh = Borsh.from(data); NearDecoder.BlockProducer[] memory initialValidators = borsh.decodeBlockProducers(); borsh.done(); setBlockProducers(initialValidators, epochs[0]); } // The second part of the initialization -- setting the current head. function initWithBlock(bytes memory data) public override onlyAdmin { require(!initialized && epochs[0].numBPs != 0, "Wrong initialization stage"); initialized = true; Borsh.Data memory borsh = Borsh.from(data); NearDecoder.LightClientBlock memory nearBlock = borsh.decodeLightClientBlock(); borsh.done(); require(nearBlock.next_bps.some, "Initialization block must contain next_bps"); curHeight = nearBlock.inner_lite.height; epochs[0].epochId = nearBlock.inner_lite.epoch_id; epochs[1].epochId = nearBlock.inner_lite.next_epoch_id; blockHashes_[nearBlock.inner_lite.height] = nearBlock.hash; blockMerkleRoots_[nearBlock.inner_lite.height] = nearBlock.inner_lite.block_merkle_root; setBlockProducers(nearBlock.next_bps.blockProducers, epochs[1]); } struct BridgeState { uint currentHeight; // Height of the current confirmed block // If there is currently no unconfirmed block, the last three fields are zero. uint nextTimestamp; // Timestamp of the current unconfirmed block uint nextValidAt; // Timestamp when the current unconfirmed block will be confirmed uint numBlockProducers; // Number of block producers for the current unconfirmed block } function bridgeState() public view returns (BridgeState memory res) { if (block.timestamp < lastValidAt) { res.currentHeight = curHeight; res.nextTimestamp = untrustedTimestamp; res.nextValidAt = lastValidAt; unchecked { res.numBlockProducers = epochs[untrustedNextEpoch ? (curEpoch + 1) % 3 : curEpoch].numBPs; } } else { res.currentHeight = lastValidAt == 0 ? curHeight : untrustedHeight; } } function addLightClientBlock(bytes memory data) public override pausable(PAUSED_ADD_BLOCK) { require(initialized, "Contract is not initialized"); require(balanceOf[msg.sender] >= lockEthAmount, "Balance is not enough"); Borsh.Data memory borsh = Borsh.from(data); NearDecoder.LightClientBlock memory nearBlock = borsh.decodeLightClientBlock(); borsh.done(); unchecked { // Commit the previous block, or make sure that it is OK to replace it. if (block.timestamp < lastValidAt) { require( nearBlock.inner_lite.timestamp >= untrustedTimestamp + replaceDuration, "Can only replace with a sufficiently newer block" ); } else if (lastValidAt != 0) { curHeight = untrustedHeight; if (untrustedNextEpoch) { curEpoch = (curEpoch + 1) % 3; } lastValidAt = 0; blockHashes_[curHeight] = untrustedHash; blockMerkleRoots_[curHeight] = untrustedMerkleRoot; } // Check that the new block's height is greater than the current one's. require(nearBlock.inner_lite.height > curHeight, "New block must have higher height"); // Check that the new block is from the same epoch as the current one, or from the next one. bool fromNextEpoch; if (nearBlock.inner_lite.epoch_id == epochs[curEpoch].epochId) { fromNextEpoch = false; } else if (nearBlock.inner_lite.epoch_id == epochs[(curEpoch + 1) % 3].epochId) { fromNextEpoch = true; } else { revert("Epoch id of the block is not valid"); } // Check that the new block is signed by more than 2/3 of the validators. Epoch storage thisEpoch = epochs[fromNextEpoch ? (curEpoch + 1) % 3 : curEpoch]; // Last block in the epoch might contain extra approvals that light client can ignore. require(nearBlock.approvals_after_next.length >= thisEpoch.numBPs, "Approval list is too short"); // The sum of uint128 values cannot overflow. uint256 votedFor = 0; for ((uint i, uint cnt) = (0, thisEpoch.numBPs); i != cnt; ++i) { bytes32 stakes = thisEpoch.packedStakes[i >> 1]; if (nearBlock.approvals_after_next[i].some) { votedFor += uint128(bytes16(stakes)); } if (++i == cnt) { break; } if (nearBlock.approvals_after_next[i].some) { votedFor += uint128(uint256(stakes)); } } require(votedFor > thisEpoch.stakeThreshold, "Too few approvals"); // If the block is from the next epoch, make sure that next_bps is supplied and has a correct hash. if (fromNextEpoch) { require(nearBlock.next_bps.some, "Next next_bps should not be None"); require( nearBlock.next_bps.hash == nearBlock.inner_lite.next_bp_hash, "Hash of block producers does not match" ); } untrustedHeight = nearBlock.inner_lite.height; untrustedTimestamp = nearBlock.inner_lite.timestamp; untrustedHash = nearBlock.hash; untrustedMerkleRoot = nearBlock.inner_lite.block_merkle_root; untrustedNextHash = nearBlock.next_hash; uint256 signatureSet = 0; for ((uint i, uint cnt) = (0, thisEpoch.numBPs); i < cnt; i++) { NearDecoder.OptionalSignature memory approval = nearBlock.approvals_after_next[i]; if (approval.some) { signatureSet |= 1 << i; untrustedSignatures[i] = approval.signature; } } untrustedSignatureSet = signatureSet; untrustedNextEpoch = fromNextEpoch; if (fromNextEpoch) { Epoch storage nextEpoch = epochs[(curEpoch + 2) % 3]; nextEpoch.epochId = nearBlock.inner_lite.next_epoch_id; setBlockProducers(nearBlock.next_bps.blockProducers, nextEpoch); } lastSubmitter = msg.sender; lastValidAt = block.timestamp + lockDuration; } } function setBlockProducers(NearDecoder.BlockProducer[] memory src, Epoch storage epoch) internal { uint cnt = src.length; require(cnt <= MAX_BLOCK_PRODUCERS, "It is not expected having that many block producers for the provided block"); epoch.numBPs = cnt; unchecked { for (uint i = 0; i < cnt; i++) { epoch.keys[i] = src[i].publicKey.k; } uint256 totalStake = 0; // Sum of uint128, can't be too big. for (uint i = 0; i != cnt; ++i) { uint128 stake1 = src[i].stake; totalStake += stake1; if (++i == cnt) { epoch.packedStakes[i >> 1] = bytes32(bytes16(stake1)); break; } uint128 stake2 = src[i].stake; totalStake += stake2; epoch.packedStakes[i >> 1] = bytes32(uint256(bytes32(bytes16(stake1))) + stake2); } epoch.stakeThreshold = (totalStake * 2) / 3; } } function blockHashes(uint64 height) public view override pausable(PAUSED_VERIFY) returns (bytes32 res) { res = blockHashes_[height]; if (res == 0 && block.timestamp >= lastValidAt && lastValidAt != 0 && height == untrustedHeight) { res = untrustedHash; } } function blockMerkleRoots(uint64 height) public view override pausable(PAUSED_VERIFY) returns (bytes32 res) { res = blockMerkleRoots_[height]; if (res == 0 && block.timestamp >= lastValidAt && lastValidAt != 0 && height == untrustedHeight) { res = untrustedMerkleRoot; } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8; contract AdminControlled { address public admin; uint public paused; constructor(address _admin, uint flags) { admin = _admin; paused = flags; } modifier onlyAdmin { require(msg.sender == admin); _; } modifier pausable(uint flag) { require((paused & flag) == 0 || msg.sender == admin); _; } function adminPause(uint flags) public onlyAdmin { paused = flags; } function adminSstore(uint key, uint value) public onlyAdmin { assembly { sstore(key, value) } } function adminSstoreWithMask( uint key, uint value, uint mask ) public onlyAdmin { assembly { let oldval := sload(key) sstore(key, xor(and(xor(value, oldval), mask), oldval)) } } function adminSendEth(address payable destination, uint amount) public onlyAdmin { destination.transfer(amount); } function adminReceiveEth() public payable onlyAdmin {} function adminDelegatecall(address target, bytes memory data) public payable onlyAdmin returns (bytes memory) { (bool success, bytes memory rdata) = target.delegatecall(data); require(success); return rdata; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8; import "./Utils.sol"; library Borsh { using Borsh for Data; struct Data { uint ptr; uint end; } function from(bytes memory data) internal pure returns (Data memory res) { uint ptr; assembly { ptr := data } unchecked { res.ptr = ptr + 32; res.end = res.ptr + Utils.readMemory(ptr); } } // This function assumes that length is reasonably small, so that data.ptr + length will not overflow. In the current code, length is always less than 2^32. function requireSpace(Data memory data, uint length) internal pure { unchecked { require(data.ptr + length <= data.end, "Parse error: unexpected EOI"); } } function read(Data memory data, uint length) internal pure returns (bytes32 res) { data.requireSpace(length); res = bytes32(Utils.readMemory(data.ptr)); unchecked { data.ptr += length; } return res; } function done(Data memory data) internal pure { require(data.ptr == data.end, "Parse error: EOI expected"); } // Same considerations as for requireSpace. function peekKeccak256(Data memory data, uint length) internal pure returns (bytes32) { data.requireSpace(length); return Utils.keccak256Raw(data.ptr, length); } // Same considerations as for requireSpace. function peekSha256(Data memory data, uint length) internal view returns (bytes32) { data.requireSpace(length); return Utils.sha256Raw(data.ptr, length); } function decodeU8(Data memory data) internal pure returns (uint8) { return uint8(bytes1(data.read(1))); } function decodeU16(Data memory data) internal pure returns (uint16) { return Utils.swapBytes2(uint16(bytes2(data.read(2)))); } function decodeU32(Data memory data) internal pure returns (uint32) { return Utils.swapBytes4(uint32(bytes4(data.read(4)))); } function decodeU64(Data memory data) internal pure returns (uint64) { return Utils.swapBytes8(uint64(bytes8(data.read(8)))); } function decodeU128(Data memory data) internal pure returns (uint128) { return Utils.swapBytes16(uint128(bytes16(data.read(16)))); } function decodeU256(Data memory data) internal pure returns (uint256) { return Utils.swapBytes32(uint256(data.read(32))); } function decodeBytes20(Data memory data) internal pure returns (bytes20) { return bytes20(data.read(20)); } function decodeBytes32(Data memory data) internal pure returns (bytes32) { return data.read(32); } function decodeBool(Data memory data) internal pure returns (bool) { uint8 res = data.decodeU8(); require(res <= 1, "Parse error: invalid bool"); return res != 0; } function skipBytes(Data memory data) internal pure { uint length = data.decodeU32(); data.requireSpace(length); unchecked { data.ptr += length; } } function decodeBytes(Data memory data) internal pure returns (bytes memory res) { uint length = data.decodeU32(); data.requireSpace(length); res = Utils.memoryToBytes(data.ptr, length); unchecked { data.ptr += length; } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8; contract Ed25519 { // Computes (v^(2^250-1), v^11) mod p function pow22501(uint256 v) private pure returns (uint256 p22501, uint256 p11) { p11 = mulmod(v, v, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); p22501 = mulmod(p11, p11, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); p22501 = mulmod( mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed), v, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); p11 = mulmod(p22501, p11, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); p22501 = mulmod( mulmod(p11, p11, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed), p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 a = mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); p22501 = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); uint256 b = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); p22501 = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); p22501 = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); } function check( bytes32 k, bytes32 r, bytes32 s, bytes32 m1, bytes9 m2 ) public pure returns (bool) { unchecked { uint256 hh; // Step 1: compute SHA-512(R, A, M) { uint256[5][16] memory kk = [ [ uint256(0x428a2f98_d728ae22), uint256(0xe49b69c1_9ef14ad2), uint256(0x27b70a85_46d22ffc), uint256(0x19a4c116_b8d2d0c8), uint256(0xca273ece_ea26619c) ], [ uint256(0x71374491_23ef65cd), uint256(0xefbe4786_384f25e3), uint256(0x2e1b2138_5c26c926), uint256(0x1e376c08_5141ab53), uint256(0xd186b8c7_21c0c207) ], [ uint256(0xb5c0fbcf_ec4d3b2f), uint256(0xfc19dc6_8b8cd5b5), uint256(0x4d2c6dfc_5ac42aed), uint256(0x2748774c_df8eeb99), uint256(0xeada7dd6_cde0eb1e) ], [ uint256(0xe9b5dba5_8189dbbc), uint256(0x240ca1cc_77ac9c65), uint256(0x53380d13_9d95b3df), uint256(0x34b0bcb5_e19b48a8), uint256(0xf57d4f7f_ee6ed178) ], [ uint256(0x3956c25b_f348b538), uint256(0x2de92c6f_592b0275), uint256(0x650a7354_8baf63de), uint256(0x391c0cb3_c5c95a63), uint256(0x6f067aa_72176fba) ], [ uint256(0x59f111f1_b605d019), uint256(0x4a7484aa_6ea6e483), uint256(0x766a0abb_3c77b2a8), uint256(0x4ed8aa4a_e3418acb), uint256(0xa637dc5_a2c898a6) ], [ uint256(0x923f82a4_af194f9b), uint256(0x5cb0a9dc_bd41fbd4), uint256(0x81c2c92e_47edaee6), uint256(0x5b9cca4f_7763e373), uint256(0x113f9804_bef90dae) ], [ uint256(0xab1c5ed5_da6d8118), uint256(0x76f988da_831153b5), uint256(0x92722c85_1482353b), uint256(0x682e6ff3_d6b2b8a3), uint256(0x1b710b35_131c471b) ], [ uint256(0xd807aa98_a3030242), uint256(0x983e5152_ee66dfab), uint256(0xa2bfe8a1_4cf10364), uint256(0x748f82ee_5defb2fc), uint256(0x28db77f5_23047d84) ], [ uint256(0x12835b01_45706fbe), uint256(0xa831c66d_2db43210), uint256(0xa81a664b_bc423001), uint256(0x78a5636f_43172f60), uint256(0x32caab7b_40c72493) ], [ uint256(0x243185be_4ee4b28c), uint256(0xb00327c8_98fb213f), uint256(0xc24b8b70_d0f89791), uint256(0x84c87814_a1f0ab72), uint256(0x3c9ebe0a_15c9bebc) ], [ uint256(0x550c7dc3_d5ffb4e2), uint256(0xbf597fc7_beef0ee4), uint256(0xc76c51a3_0654be30), uint256(0x8cc70208_1a6439ec), uint256(0x431d67c4_9c100d4c) ], [ uint256(0x72be5d74_f27b896f), uint256(0xc6e00bf3_3da88fc2), uint256(0xd192e819_d6ef5218), uint256(0x90befffa_23631e28), uint256(0x4cc5d4be_cb3e42b6) ], [ uint256(0x80deb1fe_3b1696b1), uint256(0xd5a79147_930aa725), uint256(0xd6990624_5565a910), uint256(0xa4506ceb_de82bde9), uint256(0x597f299c_fc657e2a) ], [ uint256(0x9bdc06a7_25c71235), uint256(0x6ca6351_e003826f), uint256(0xf40e3585_5771202a), uint256(0xbef9a3f7_b2c67915), uint256(0x5fcb6fab_3ad6faec) ], [ uint256(0xc19bf174_cf692694), uint256(0x14292967_0a0e6e70), uint256(0x106aa070_32bbd1b8), uint256(0xc67178f2_e372532b), uint256(0x6c44198c_4a475817) ] ]; uint256 w0 = (uint256(r) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000_ffffffff_ffffffff) | ((uint256(r) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) | ((uint256(r) & 0xffffffff_ffffffff_00000000_00000000) << 64); uint256 w1 = (uint256(k) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000_ffffffff_ffffffff) | ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) | ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000) << 64); uint256 w2 = (uint256(m1) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000_ffffffff_ffffffff) | ((uint256(m1) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) | ((uint256(m1) & 0xffffffff_ffffffff_00000000_00000000) << 64); uint256 w3 = (uint256(bytes32(m2)) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000_00000000_00000000) | ((uint256(bytes32(m2)) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) | 0x800000_00000000_00000000_00000348; uint256 a = 0x6a09e667_f3bcc908; uint256 b = 0xbb67ae85_84caa73b; uint256 c = 0x3c6ef372_fe94f82b; uint256 d = 0xa54ff53a_5f1d36f1; uint256 e = 0x510e527f_ade682d1; uint256 f = 0x9b05688c_2b3e6c1f; uint256 g = 0x1f83d9ab_fb41bd6b; uint256 h = 0x5be0cd19_137e2179; for (uint256 i = 0; ; i++) { // Round 16 * i { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[0][i]; temp1 += w0 >> 192; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 1 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[1][i]; temp1 += w0 >> 64; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 2 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[2][i]; temp1 += w0 >> 128; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 3 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[3][i]; temp1 += w0; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 4 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[4][i]; temp1 += w1 >> 192; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 5 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[5][i]; temp1 += w1 >> 64; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 6 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[6][i]; temp1 += w1 >> 128; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 7 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[7][i]; temp1 += w1; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 8 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[8][i]; temp1 += w2 >> 192; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 9 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[9][i]; temp1 += w2 >> 64; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 10 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[10][i]; temp1 += w2 >> 128; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 11 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[11][i]; temp1 += w2; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 12 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[12][i]; temp1 += w3 >> 192; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 13 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[13][i]; temp1 += w3 >> 64; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 14 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[14][i]; temp1 += w3 >> 128; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Round 16 * i + 15 { uint256 temp1; uint256 temp2; e &= 0xffffffff_ffffffff; { uint256 ss = e | (e << 64); uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41); uint256 ch = (e & (f ^ g)) ^ g; temp1 = h + s1 + ch; } temp1 += kk[15][i]; temp1 += w3; a &= 0xffffffff_ffffffff; { uint256 ss = a | (a << 64); uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39); uint256 maj = (a & (b | c)) | (b & c); temp2 = s0 + maj; } h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } if (i == 4) { break; } // Message expansion uint256 t0 = w0; uint256 t1 = w1; { uint256 t2 = w2; uint256 t3 = w3; { uint256 n1 = t0 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; n1 += ((t2 & 0xffffffff_ffffffff_00000000_00000000) << 128) | ((t2 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64); { uint256 u1 = ((t0 & 0xffffffff_ffffffff_00000000_00000000) << 64) | ((t0 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128); uint256 uu1 = u1 | (u1 << 64); n1 += ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } { uint256 v1 = t3 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; uint256 vv1 = v1 | (v1 << 64); n1 += ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; uint256 n2 = t0 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; n2 += ((t2 & 0xffffffff_ffffffff) << 128) | (t3 >> 192); { uint256 u2 = ((t0 & 0xffffffff_ffffffff) << 128) | (t1 >> 192); uint256 uu2 = u2 | (u2 << 64); n2 += ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } { uint256 vv2 = n1 | (n1 >> 64); n2 += ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; t0 = n1 | n2; } { uint256 n1 = t1 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; n1 += ((t3 & 0xffffffff_ffffffff_00000000_00000000) << 128) | ((t3 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64); { uint256 u1 = ((t1 & 0xffffffff_ffffffff_00000000_00000000) << 64) | ((t1 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128); uint256 uu1 = u1 | (u1 << 64); n1 += ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } { uint256 v1 = t0 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; uint256 vv1 = v1 | (v1 << 64); n1 += ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; uint256 n2 = t1 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; n2 += ((t3 & 0xffffffff_ffffffff) << 128) | (t0 >> 192); { uint256 u2 = ((t1 & 0xffffffff_ffffffff) << 128) | (t2 >> 192); uint256 uu2 = u2 | (u2 << 64); n2 += ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } { uint256 vv2 = n1 | (n1 >> 64); n2 += ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; t1 = n1 | n2; } { uint256 n1 = t2 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; n1 += ((t0 & 0xffffffff_ffffffff_00000000_00000000) << 128) | ((t0 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64); { uint256 u1 = ((t2 & 0xffffffff_ffffffff_00000000_00000000) << 64) | ((t2 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128); uint256 uu1 = u1 | (u1 << 64); n1 += ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } { uint256 v1 = t1 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; uint256 vv1 = v1 | (v1 << 64); n1 += ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; uint256 n2 = t2 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; n2 += ((t0 & 0xffffffff_ffffffff) << 128) | (t1 >> 192); { uint256 u2 = ((t2 & 0xffffffff_ffffffff) << 128) | (t3 >> 192); uint256 uu2 = u2 | (u2 << 64); n2 += ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } { uint256 vv2 = n1 | (n1 >> 64); n2 += ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; t2 = n1 | n2; } { uint256 n1 = t3 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; n1 += ((t1 & 0xffffffff_ffffffff_00000000_00000000) << 128) | ((t1 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64); { uint256 u1 = ((t3 & 0xffffffff_ffffffff_00000000_00000000) << 64) | ((t3 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128); uint256 uu1 = u1 | (u1 << 64); n1 += ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } { uint256 v1 = t2 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; uint256 vv1 = v1 | (v1 << 64); n1 += ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; } n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000; uint256 n2 = t3 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; n2 += ((t1 & 0xffffffff_ffffffff) << 128) | (t2 >> 192); { uint256 u2 = ((t3 & 0xffffffff_ffffffff) << 128) | (t0 >> 192); uint256 uu2 = u2 | (u2 << 64); n2 += ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } { uint256 vv2 = n1 | (n1 >> 64); n2 += ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; } n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff; t3 = n1 | n2; } w3 = t3; w2 = t2; } w1 = t1; w0 = t0; } uint256 h0 = ((a + 0x6a09e667_f3bcc908) & 0xffffffff_ffffffff) | (((b + 0xbb67ae85_84caa73b) & 0xffffffff_ffffffff) << 64) | (((c + 0x3c6ef372_fe94f82b) & 0xffffffff_ffffffff) << 128) | ((d + 0xa54ff53a_5f1d36f1) << 192); h0 = ((h0 & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) | ((h0 & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8); h0 = ((h0 & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) | ((h0 & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16); h0 = ((h0 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) | ((h0 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32); uint256 h1 = ((e + 0x510e527f_ade682d1) & 0xffffffff_ffffffff) | (((f + 0x9b05688c_2b3e6c1f) & 0xffffffff_ffffffff) << 64) | (((g + 0x1f83d9ab_fb41bd6b) & 0xffffffff_ffffffff) << 128) | ((h + 0x5be0cd19_137e2179) << 192); h1 = ((h1 & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) | ((h1 & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8); h1 = ((h1 & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) | ((h1 & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16); h1 = ((h1 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) | ((h1 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32); hh = addmod( h0, mulmod( h1, 0xfffffff_ffffffff_ffffffff_fffffffe_c6ef5bf4_737dcf70_d6ec3174_8d98951d, 0x10000000_00000000_00000000_00000000_14def9de_a2f79cd6_5812631a_5cf5d3ed ), 0x10000000_00000000_00000000_00000000_14def9de_a2f79cd6_5812631a_5cf5d3ed ); } // Step 2: unpack k k = bytes32( ((uint256(k) & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) | ((uint256(k) & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8) ); k = bytes32( ((uint256(k) & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) | ((uint256(k) & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16) ); k = bytes32( ((uint256(k) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) | ((uint256(k) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32) ); k = bytes32( ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff) << 64) | ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000) >> 64) ); k = bytes32((uint256(k) << 128) | (uint256(k) >> 128)); uint256 ky = uint256(k) & 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff; uint256 kx; { uint256 ky2 = mulmod(ky, ky, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); uint256 u = addmod( ky2, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffec, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 v = mulmod( ky2, 0x52036cee_2b6ffe73_8cc74079_7779e898_00700a4d_4141d8ab_75eb4dca_135978a3, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ) + 1; uint256 t = mulmod(u, v, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); (kx, ) = pow22501(t); kx = mulmod(kx, kx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); kx = mulmod( u, mulmod( mulmod(kx, kx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed), t, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ), 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); t = mulmod( mulmod(kx, kx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed), v, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); if (t != u) { if (t != 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - u) { return false; } kx = mulmod( kx, 0x2b832480_4fc1df0b_2b4d0099_3dfbd7a7_2f431806_ad2fe478_c4ee1b27_4a0ea0b0, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } } if ((kx & 1) != uint256(k) >> 255) { kx = 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - kx; } // Verify s s = bytes32( ((uint256(s) & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) | ((uint256(s) & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8) ); s = bytes32( ((uint256(s) & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) | ((uint256(s) & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16) ); s = bytes32( ((uint256(s) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) | ((uint256(s) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32) ); s = bytes32( ((uint256(s) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff) << 64) | ((uint256(s) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000) >> 64) ); s = bytes32((uint256(s) << 128) | (uint256(s) >> 128)); if (uint256(s) >= 0x10000000_00000000_00000000_00000000_14def9de_a2f79cd6_5812631a_5cf5d3ed) { return false; } uint256 vx; uint256 vu; uint256 vy; uint256 vv; // Step 3: compute multiples of k uint256[8][3][2] memory tables; { uint256 ks = ky + kx; uint256 kd = ky + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - kx; uint256 k2dt = mulmod( mulmod(kx, ky, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed), 0x2406d9dc_56dffce7_198e80f2_eef3d130_00e0149a_8283b156_ebd69b94_26b2f159, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 kky = ky; uint256 kkx = kx; uint256 kku = 1; uint256 kkv = 1; { uint256 xx = mulmod( kkx, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy = mulmod( kky, kku, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz = mulmod( kku, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xx2 = mulmod( xx, xx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy2 = mulmod( yy, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xxyy = mulmod( xx, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz2 = mulmod( zz, zz, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); kkx = xxyy + xxyy; kku = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; kky = xx2 + yy2; kkv = addmod( zz2 + zz2, 0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - kku, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } { uint256 xx = mulmod( kkx, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy = mulmod( kky, kku, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz = mulmod( kku, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xx2 = mulmod( xx, xx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy2 = mulmod( yy, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xxyy = mulmod( xx, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz2 = mulmod( zz, zz, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); kkx = xxyy + xxyy; kku = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; kky = xx2 + yy2; kkv = addmod( zz2 + zz2, 0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - kku, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } { uint256 xx = mulmod( kkx, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy = mulmod( kky, kku, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz = mulmod( kku, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xx2 = mulmod( xx, xx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy2 = mulmod( yy, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xxyy = mulmod( xx, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz2 = mulmod( zz, zz, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); kkx = xxyy + xxyy; kku = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; kky = xx2 + yy2; kkv = addmod( zz2 + zz2, 0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - kku, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } uint256 cprod = 1; uint256[8][3][2] memory tables_ = tables; for (uint256 i = 0; ; i++) { uint256 cs; uint256 cd; uint256 ct; uint256 c2z; { uint256 cx = mulmod( kkx, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 cy = mulmod( kky, kku, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 cz = mulmod( kku, kkv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); ct = mulmod( kkx, kky, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); cs = cy + cx; cd = cy - cx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; c2z = cz + cz; } tables_[1][0][i] = cs; tables_[1][1][i] = cd; tables_[1][2][i] = mulmod( ct, 0x2406d9dc_56dffce7_198e80f2_eef3d130_00e0149a_8283b156_ebd69b94_26b2f159, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); tables_[0][0][i] = c2z; tables_[0][1][i] = cprod; cprod = mulmod( cprod, c2z, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); if (i == 7) { break; } uint256 ab = mulmod( cs, ks, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 aa = mulmod( cd, kd, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 ac = mulmod( ct, k2dt, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); kkx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; kku = addmod(c2z, ac, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); kky = ab + aa; kkv = addmod( c2z, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - ac, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } uint256 t; (cprod, t) = pow22501(cprod); cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); cprod = mulmod(cprod, t, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); for (uint256 i = 7; ; i--) { uint256 cinv = mulmod( cprod, tables_[0][1][i], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); tables_[1][0][i] = mulmod( tables_[1][0][i], cinv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); tables_[1][1][i] = mulmod( tables_[1][1][i], cinv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); tables_[1][2][i] = mulmod( tables_[1][2][i], cinv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); if (i == 0) { break; } cprod = mulmod( cprod, tables_[0][0][i], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } tables_[0] = [ [ 0x43e7ce9d_19ea5d32_9385a44c_321ea161_67c996e3_7dc6070c_97de49e3_7ac61db9, 0x40cff344_25d8ec30_a3bb74ba_58cd5854_fa1e3818_6ad0d31e_bc8ae251_ceb2c97e, 0x459bd270_46e8dd45_aea7008d_b87a5a8f_79067792_53d64523_58951859_9fdfbf4b, 0x69fdd1e2_8c23cc38_94d0c8ff_90e76f6d_5b6e4c2e_620136d0_4dd83c4a_51581ab9, 0x54dceb34_13ce5cfa_11196dfc_960b6eda_f4b380c6_d4d23784_19cc0279_ba49c5f3, 0x4e24184d_d71a3d77_eef3729f_7f8cf7c1_7224cf40_aa7b9548_b9942f3c_5084ceed, 0x5a0e5aab_20262674_ae117576_1cbf5e88_9b52a55f_d7ac5027_c228cebd_c8d2360a, 0x26239334_073e9b38_c6285955_6d451c3d_cc8d30e8_4b361174_f488eadd_e2cf17d9 ], [ 0x227e97c9_4c7c0933_d2e0c21a_3447c504_fe9ccf82_e8a05f59_ce881c82_eba0489f, 0x226a3e0e_cc4afec6_fd0d2884_13014a9d_bddecf06_c1a2f0bb_702ba77c_613d8209, 0x34d7efc8_51d45c5e_71efeb0f_235b7946_91de6228_877569b3_a8d52bf0_58b8a4a0, 0x3c1f5fb3_ca7166fc_e1471c9b_752b6d28_c56301ad_7b65e845_1b2c8c55_26726e12, 0x6102416c_f02f02ff_5be75275_f55f28db_89b2a9d2_456b860c_e22fc0e5_031f7cc5, 0x40adf677_f1bfdae0_57f0fd17_9c126179_18ddaa28_91a6530f_b1a4294f_a8665490, 0x61936f3c_41560904_6187b8ba_a978cbc9_b4789336_3ae5a3cc_7d909f36_35ae7f48, 0x562a9662_b6ec47f9_e979d473_c02b51e4_42336823_8c58ddb5_2f0e5c6a_180e6410 ], [ 0x3788bdb4_4f8632d4_2d0dbee5_eea1acc6_136cf411_e655624f_55e48902_c3bd5534, 0x6190cf2c_2a7b5ad7_69d594a8_2844f23b_4167fa7c_8ac30e51_aa6cfbeb_dcd4b945, 0x65f77870_96be9204_123a71f3_ac88a87b_e1513217_737d6a1e_2f3a13a4_3d7e3a9a, 0x23af32d_bfa67975_536479a7_a7ce74a0_2142147f_ac048018_7f1f1334_9cda1f2d, 0x64fc44b7_fc6841bd_db0ced8b_8b0fe675_9137ef87_ee966512_15fc1dbc_d25c64dc, 0x1434aa37_48b701d5_b69df3d7_d340c1fe_3f6b9c1e_fc617484_caadb47e_382f4475, 0x457a6da8_c962ef35_f2b21742_3e5844e9_d2353452_7e8ea429_0d24e3dd_f21720c6, 0x63b9540c_eb60ccb5_1e4d989d_956e053c_f2511837_efb79089_d2ff4028_4202c53d ] ]; } // Step 4: compute s*G - h*A { uint256 ss = uint256(s) << 3; uint256 hhh = hh + 0x80000000_00000000_00000000_00000000_a6f7cef5_17bce6b2_c09318d2_e7ae9f60; uint256 vvx = 0; uint256 vvu = 1; uint256 vvy = 1; uint256 vvv = 1; for (uint256 i = 252; ; i--) { uint256 bit = 8 << i; if ((ss & bit) != 0) { uint256 ws; uint256 wd; uint256 wz; uint256 wt; { uint256 wx = mulmod( vvx, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 wy = mulmod( vvy, vvu, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); ws = wy + wx; wd = wy - wx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; wz = mulmod( vvu, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); wt = mulmod( vvx, vvy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } uint256 j = (ss >> i) & 7; ss &= ~(7 << i); uint256[8][3][2] memory tables_ = tables; uint256 aa = mulmod( wd, tables_[0][1][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 ab = mulmod( ws, tables_[0][0][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 ac = mulmod( wt, tables_[0][2][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); vvx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; vvu = wz + ac; vvy = ab + aa; vvv = wz - ac + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; } if ((hhh & bit) != 0) { uint256 ws; uint256 wd; uint256 wz; uint256 wt; { uint256 wx = mulmod( vvx, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 wy = mulmod( vvy, vvu, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); ws = wy + wx; wd = wy - wx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; wz = mulmod( vvu, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); wt = mulmod( vvx, vvy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } uint256 j = (hhh >> i) & 7; hhh &= ~(7 << i); uint256[8][3][2] memory tables_ = tables; uint256 aa = mulmod( wd, tables_[1][0][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 ab = mulmod( ws, tables_[1][1][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 ac = mulmod( wt, tables_[1][2][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); vvx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; vvu = wz - ac + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; vvy = ab + aa; vvv = wz + ac; } if (i == 0) { uint256 ws; uint256 wd; uint256 wz; uint256 wt; { uint256 wx = mulmod( vvx, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 wy = mulmod( vvy, vvu, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); ws = wy + wx; wd = wy - wx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; wz = mulmod( vvu, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); wt = mulmod( vvx, vvy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } uint256 j = hhh & 7; uint256[8][3][2] memory tables_ = tables; uint256 aa = mulmod( wd, tables_[1][0][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 ab = mulmod( ws, tables_[1][1][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 ac = mulmod( wt, tables_[1][2][j], 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); vvx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; vvu = wz - ac + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; vvy = ab + aa; vvv = wz + ac; break; } { uint256 xx = mulmod( vvx, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy = mulmod( vvy, vvu, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz = mulmod( vvu, vvv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xx2 = mulmod( xx, xx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 yy2 = mulmod( yy, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 xxyy = mulmod( xx, yy, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); uint256 zz2 = mulmod( zz, zz, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); vvx = xxyy + xxyy; vvu = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed; vvy = xx2 + yy2; vvv = addmod( zz2 + zz2, 0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - vvu, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); } } vx = vvx; vu = vvu; vy = vvy; vv = vvv; } // Step 5: compare the points (uint256 vi, uint256 vj) = pow22501( mulmod(vu, vv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed) ); vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); vi = mulmod(vi, vj, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed); vx = mulmod( vx, mulmod(vi, vv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed), 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); vy = mulmod( vy, mulmod(vi, vu, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed), 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed ); bytes32 vr = bytes32(vy | (vx << 255)); vr = bytes32( ((uint256(vr) & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) | ((uint256(vr) & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8) ); vr = bytes32( ((uint256(vr) & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) | ((uint256(vr) & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16) ); vr = bytes32( ((uint256(vr) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) | ((uint256(vr) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32) ); vr = bytes32( ((uint256(vr) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff) << 64) | ((uint256(vr) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000) >> 64) ); vr = bytes32((uint256(vr) << 128) | (uint256(vr) >> 128)); return vr == r; } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8; interface INearBridge { event BlockHashAdded(uint64 indexed height, bytes32 blockHash); event BlockHashReverted(uint64 indexed height, bytes32 blockHash); function blockHashes(uint64 blockNumber) external view returns (bytes32); function blockMerkleRoots(uint64 blockNumber) external view returns (bytes32); function balanceOf(address wallet) external view returns (uint256); function deposit() external payable; function withdraw() external; function initWithValidators(bytes calldata initialValidators) external; function initWithBlock(bytes calldata data) external; function addLightClientBlock(bytes calldata data) external; function challenge(address payable receiver, uint256 signatureIndex) external; function checkBlockProducerSignatureInHead(uint256 signatureIndex) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8; import "./Borsh.sol"; library NearDecoder { using Borsh for Borsh.Data; using NearDecoder for Borsh.Data; uint8 constant VALIDATOR_V1 = 0; uint8 constant VALIDATOR_V2 = 1; struct PublicKey { bytes32 k; } function decodePublicKey(Borsh.Data memory data) internal pure returns (PublicKey memory res) { require(data.decodeU8() == 0, "Parse error: invalid key type"); res.k = data.decodeBytes32(); } struct Signature { bytes32 r; bytes32 s; } function decodeSignature(Borsh.Data memory data) internal pure returns (Signature memory res) { require(data.decodeU8() == 0, "Parse error: invalid signature type"); res.r = data.decodeBytes32(); res.s = data.decodeBytes32(); } struct BlockProducer { PublicKey publicKey; uint128 stake; // Flag indicating if this validator proposed to be a chunk-only producer (i.e. cannot become a block producer). bool isChunkOnly; } function decodeBlockProducer(Borsh.Data memory data) internal pure returns (BlockProducer memory res) { uint8 validator_version = data.decodeU8(); data.skipBytes(); res.publicKey = data.decodePublicKey(); res.stake = data.decodeU128(); if (validator_version == VALIDATOR_V2) { res.isChunkOnly = data.decodeU8() != 0; } else { res.isChunkOnly = false; } } function decodeBlockProducers(Borsh.Data memory data) internal pure returns (BlockProducer[] memory res) { uint length = data.decodeU32(); res = new BlockProducer[](length); for (uint i = 0; i < length; i++) { res[i] = data.decodeBlockProducer(); } } struct OptionalBlockProducers { bool some; BlockProducer[] blockProducers; bytes32 hash; // Additional computable element } function decodeOptionalBlockProducers(Borsh.Data memory data) internal view returns (OptionalBlockProducers memory res) { res.some = data.decodeBool(); if (res.some) { uint start = data.ptr; res.blockProducers = data.decodeBlockProducers(); res.hash = Utils.sha256Raw(start, data.ptr - start); } } struct OptionalSignature { bool some; Signature signature; } function decodeOptionalSignature(Borsh.Data memory data) internal pure returns (OptionalSignature memory res) { res.some = data.decodeBool(); if (res.some) { res.signature = data.decodeSignature(); } } struct BlockHeaderInnerLite { uint64 height; // Height of this block since the genesis block (height 0). bytes32 epoch_id; // Epoch start hash of this block's epoch. Used for retrieving validator information bytes32 next_epoch_id; bytes32 prev_state_root; // Root hash of the state at the previous block. bytes32 outcome_root; // Root of the outcomes of transactions and receipts. uint64 timestamp; // Timestamp at which the block was built. bytes32 next_bp_hash; // Hash of the next epoch block producers set bytes32 block_merkle_root; bytes32 hash; // Additional computable element } function decodeBlockHeaderInnerLite(Borsh.Data memory data) internal view returns (BlockHeaderInnerLite memory res) { res.hash = data.peekSha256(208); res.height = data.decodeU64(); res.epoch_id = data.decodeBytes32(); res.next_epoch_id = data.decodeBytes32(); res.prev_state_root = data.decodeBytes32(); res.outcome_root = data.decodeBytes32(); res.timestamp = data.decodeU64(); res.next_bp_hash = data.decodeBytes32(); res.block_merkle_root = data.decodeBytes32(); } struct LightClientBlock { bytes32 prev_block_hash; bytes32 next_block_inner_hash; BlockHeaderInnerLite inner_lite; bytes32 inner_rest_hash; OptionalBlockProducers next_bps; OptionalSignature[] approvals_after_next; bytes32 hash; bytes32 next_hash; } function decodeLightClientBlock(Borsh.Data memory data) internal view returns (LightClientBlock memory res) { res.prev_block_hash = data.decodeBytes32(); res.next_block_inner_hash = data.decodeBytes32(); res.inner_lite = data.decodeBlockHeaderInnerLite(); res.inner_rest_hash = data.decodeBytes32(); res.next_bps = data.decodeOptionalBlockProducers(); uint length = data.decodeU32(); res.approvals_after_next = new OptionalSignature[](length); for (uint i = 0; i < length; i++) { res.approvals_after_next[i] = data.decodeOptionalSignature(); } res.hash = sha256( abi.encodePacked(sha256(abi.encodePacked(res.inner_lite.hash, res.inner_rest_hash)), res.prev_block_hash) ); res.next_hash = sha256(abi.encodePacked(res.next_block_inner_hash, res.hash)); } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8; library Utils { function swapBytes2(uint16 v) internal pure returns (uint16) { return (v << 8) | (v >> 8); } function swapBytes4(uint32 v) internal pure returns (uint32) { v = ((v & 0x00ff00ff) << 8) | ((v & 0xff00ff00) >> 8); return (v << 16) | (v >> 16); } function swapBytes8(uint64 v) internal pure returns (uint64) { v = ((v & 0x00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00) >> 8); v = ((v & 0x0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000) >> 16); return (v << 32) | (v >> 32); } function swapBytes16(uint128 v) internal pure returns (uint128) { v = ((v & 0x00ff00ff00ff00ff00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00ff00ff00ff00ff00) >> 8); v = ((v & 0x0000ffff0000ffff0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000ffff0000ffff0000) >> 16); v = ((v & 0x00000000ffffffff00000000ffffffff) << 32) | ((v & 0xffffffff00000000ffffffff00000000) >> 32); return (v << 64) | (v >> 64); } function swapBytes32(uint256 v) internal pure returns (uint256) { v = ((v & 0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00) >> 8); v = ((v & 0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000) >> 16); v = ((v & 0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff) << 32) | ((v & 0xffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000) >> 32); v = ((v & 0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff) << 64) | ((v & 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000) >> 64); return (v << 128) | (v >> 128); } function readMemory(uint ptr) internal pure returns (uint res) { assembly { res := mload(ptr) } } function writeMemory(uint ptr, uint value) internal pure { assembly { mstore(ptr, value) } } function memoryToBytes(uint ptr, uint length) internal pure returns (bytes memory res) { if (length != 0) { assembly { // 0x40 is the address of free memory pointer. res := mload(0x40) let end := add( res, and(add(length, 63), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0) ) // end = res + 32 + 32 * ceil(length / 32). mstore(0x40, end) mstore(res, length) let destPtr := add(res, 32) // prettier-ignore for { } 1 { } { mstore(destPtr, mload(ptr)) destPtr := add(destPtr, 32) if eq(destPtr, end) { break } ptr := add(ptr, 32) } } } } function keccak256Raw(uint ptr, uint length) internal pure returns (bytes32 res) { assembly { res := keccak256(ptr, length) } } function sha256Raw(uint ptr, uint length) internal view returns (bytes32 res) { assembly { // 2 is the address of SHA256 precompiled contract. // First 64 bytes of memory can be used as scratch space. let ret := staticcall(gas(), 2, ptr, length, 0, 32) // If the call to SHA256 precompile ran out of gas, burn any gas that remains. // prettier-ignore for { } iszero(ret) { } { } res := mload(0) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract Ed25519","name":"ed","type":"address"},{"internalType":"uint256","name":"lockEthAmount_","type":"uint256"},{"internalType":"uint256","name":"lockDuration_","type":"uint256"},{"internalType":"uint256","name":"replaceDuration_","type":"uint256"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"uint256","name":"pausedFlags_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"height","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"name":"BlockHashAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"height","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"name":"BlockHashReverted","type":"event"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"addLightClientBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"adminDelegatecall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flags","type":"uint256"}],"name":"adminPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminReceiveEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminSendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"adminSstore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"}],"name":"adminSstoreWithMask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"name":"blockHashes","outputs":[{"internalType":"bytes32","name":"res","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"name":"blockMerkleRoots","outputs":[{"internalType":"bytes32","name":"res","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeState","outputs":[{"components":[{"internalType":"uint256","name":"currentHeight","type":"uint256"},{"internalType":"uint256","name":"nextTimestamp","type":"uint256"},{"internalType":"uint256","name":"nextValidAt","type":"uint256"},{"internalType":"uint256","name":"numBlockProducers","type":"uint256"}],"internalType":"struct NearBridge.BridgeState","name":"res","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"signatureIndex","type":"uint256"}],"name":"challenge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"signatureIndex","type":"uint256"}],"name":"checkBlockProducerSignatureInHead","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initWithBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initWithValidators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastValidAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockEthAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"replaceDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162002b6438038062002b64833981016040819052620000349162000097565b600080546001600160a01b0319166001600160a01b03841617905560018190556200006484633b9aca00620000fb565b83116200007057600080fd5b505060609390931b6001600160601b03191660805260039190915560045560055562000140565b60008060008060008060c08789031215620000b0578182fd5b8651620000bd8162000127565b809650506020870151945060408701519350606087015192506080870151620000e68162000127565b8092505060a087015190509295509295509295565b60008160001904831182151516156200012257634e487b7160e01b81526011600452602481fd5b500290565b6001600160a01b03811681146200013d57600080fd5b50565b60805160601c612a056200015f60003960006115400152612a056000f3fe60806040526004361061018b5760003560e01c80636c4624c3116100d6578063b3bf91e71161007f578063d0e30db011610059578063d0e30db014610449578063f48ab4e014610451578063f851a440146104595761018b565b8063b3bf91e7146103f3578063b8e9744c14610409578063be831a2e146104295761018b565b80637875a55c116100b05780637875a55c1461039d578063a3155fbb146103b3578063acb99828146103d35761018b565b80636c4624c31461032f5780636d2d6ae01461034f57806370a082311461036f5761018b565b806337da8ec5116101385780634466ec2c116101125780634466ec2c146102b1578063530208f2146102f95780635c975abb146103195761018b565b806337da8ec5146102655780633ccfd60b146102855780633e54ce681461029a5761018b565b8063160bc0ba11610169578063160bc0ba146102055780631e703806146102255780632692c59f146102455761018b565b8063045544431461019057806309d7e8e7146101b9578063158ef93e146101db575b600080fd5b34801561019c57600080fd5b506101a660045481565b6040519081526020015b60405180910390f35b3480156101c557600080fd5b506101d96101d43660046127fe565b610491565b005b3480156101e757600080fd5b506002546101f59060ff1681565b60405190151581526020016101b0565b34801561021157600080fd5b506101d96102203660046127fe565b610546565b34801561023157600080fd5b506101a6610240366004612895565b6106e2565b34801561025157600080fd5b506101d9610260366004612831565b610781565b34801561027157600080fd5b506101a6610280366004612895565b61079d565b34801561029157600080fd5b506101d961083a565b3480156102a657600080fd5b506101a66102a25481565b3480156102bd57600080fd5b506102c66108e0565b6040516101b091908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561030557600080fd5b506101d9610314366004612702565b6109f0565b34801561032557600080fd5b506101a660015481565b34801561033b57600080fd5b506101d961034a36600461286a565b610a3d565b34801561035b57600080fd5b506101d961036a3660046127fe565b610a5f565b34801561037b57600080fd5b506101a661038a3660046126e6565b6102a56020526000908152604090205481565b3480156103a957600080fd5b506101a660035481565b3480156103bf57600080fd5b506101f56103ce366004612831565b61130c565b3480156103df57600080fd5b506101d96103ee366004612702565b611661565b3480156103ff57600080fd5b506101a660055481565b61041c61041736600461272d565b6117ee565b6040516101b091906128d9565b34801561043557600080fd5b506101d9610444366004612849565b61187a565b6101d9611895565b6101d96118f8565b34801561046557600080fd5b50600054610479906001600160a01b031681565b6040516001600160a01b0390911681526020016101b0565b6000546001600160a01b031633146104a857600080fd5b60025460ff161580156104bb5750600754155b61050c5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e20737461676500000000000060448201526064015b60405180910390fd5b600061051782611911565b9050600061052482611942565b905061052f82611a2b565b61054181600660005b60990201611a82565b505050565b6000546001600160a01b0316331461055d57600080fd5b60025460ff16158015610571575060075415155b6105bd5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e2073746167650000000000006044820152606401610503565b6002805460ff1916600117905560006105d582611911565b905060006105e282611cf2565b90506105ed82611a2b565b6080810151516106655760405162461bcd60e51b815260206004820152602a60248201527f496e697469616c697a6174696f6e20626c6f636b206d75737420636f6e74616960448201527f6e206e6578745f627073000000000000000000000000000000000000000000006064820152608401610503565b6040818101805180516101d2805467ffffffffffffffff191667ffffffffffffffff928316908117909155602080840151600690815593860151609f5560c087015160009283526102a3825286832055935160e0810151905190921681526102a48452939093209290925560808301510151610541916001610538565b6000601080600154166000148061070357506000546001600160a01b031633145b61070c57600080fd5b67ffffffffffffffff831660009081526102a4602052604090205491508115801561073a57506102a2544210155b801561074857506102a25415155b801561076f57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b576101d65491505b50919050565b6000546001600160a01b0316331461079857600080fd5b600155565b600060108060015416600014806107be57506000546001600160a01b031633145b6107c757600080fd5b67ffffffffffffffff831660009081526102a360205260409020549150811580156107f557506102a2544210155b801561080357506102a25415155b801561082a57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b5750506101d554919050565b600280600154166000148061085957506000546001600160a01b031633145b61086257600080fd5b6102a1546001600160a01b03163314158061088057506102a2544210155b61088957600080fd5b3360009081526102a56020526040902054806108a457600080fd5b3360008181526102a560205260408082208290555183156108fc0291849190818181858888f19350505050158015610541573d6000803e3d6000fd5b61090b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6102a2544210156109a9576101d25467ffffffffffffffff1681526101d35460208201526102a25460408201526101d45460069060ff1661094f576101d154610975565b60036101d1546001018161097357634e487b7160e01b600052601260045260246000fd5b065b6003811061099357634e487b7160e01b600052603260045260246000fd5b60990201600101548160600181815250506109ed565b6102a254156109d1576101d25468010000000000000000900467ffffffffffffffff166109e0565b6101d25467ffffffffffffffff165b67ffffffffffffffff1681525b90565b6000546001600160a01b03163314610a0757600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610541573d6000803e3d6000fd5b6000546001600160a01b03163314610a5457600080fd5b825491821816189055565b6004806001541660001480610a7e57506000546001600160a01b031633145b610a8757600080fd5b60025460ff16610ad95760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206973206e6f7420696e697469616c697a656400000000006044820152606401610503565b6003543360009081526102a560205260409020541015610b3b5760405162461bcd60e51b815260206004820152601560248201527f42616c616e6365206973206e6f7420656e6f75676800000000000000000000006044820152606401610503565b6000610b4683611911565b90506000610b5382611cf2565b9050610b5e82611a2b565b6102a254421015610bfd576005546101d35401816040015160a0015167ffffffffffffffff161015610bf85760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c79207265706c6163652077697468206120737566666963696560448201527f6e746c79206e6577657220626c6f636b000000000000000000000000000000006064820152608401610503565b610cab565b6102a25415610cab576101d2805468010000000000000000810467ffffffffffffffff1667ffffffffffffffff199091161790556101d45460ff1615610c675760036101d15460010181610c6157634e487b7160e01b600052601260045260246000fd5b066101d1555b60006102a28190556101d5546101d2805467ffffffffffffffff90811684526102a360209081526040808620949094556101d654925490911684526102a490529120555b6101d25460408201515167ffffffffffffffff918216911611610d365760405162461bcd60e51b815260206004820152602160248201527f4e657720626c6f636b206d75737420686176652068696768657220686569676860448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610503565b600060066101d15460038110610d5c57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610d7857506000610e47565b600660036101d15460010181610d9e57634e487b7160e01b600052601260045260246000fd5b0660038110610dbd57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610dd957506001610e47565b60405162461bcd60e51b815260206004820152602260248201527f45706f6368206964206f662074686520626c6f636b206973206e6f742076616c60448201527f69640000000000000000000000000000000000000000000000000000000000006064820152608401610503565b6000600682610e59576101d154610e7f565b60036101d15460010181610e7d57634e487b7160e01b600052601260045260246000fd5b065b60038110610e9d57634e487b7160e01b600052603260045260246000fd5b60990201905080600101548360a00151511015610efc5760405162461bcd60e51b815260206004820152601a60248201527f417070726f76616c206c69737420697320746f6f2073686f72740000000000006044820152606401610503565b600181015460009081905b808214610ff957600084606601600184901c60328110610f3757634e487b7160e01b600052603260045260246000fd5b015490508660a001518381518110610f5f57634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610f8b578060801c6fffffffffffffffffffffffffffffffff16840193505b81836001019350831415610f9f5750610ff9565b8660a001518381518110610fc357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610fed576fffffffffffffffffffffffffffffffff811693909301925b50816001019150610f07565b50508160980154811161104e5760405162461bcd60e51b815260206004820152601160248201527f546f6f2066657720617070726f76616c730000000000000000000000000000006044820152606401610503565b821561112b576080840151516110a65760405162461bcd60e51b815260206004820181905260248201527f4e657874206e6578745f6270732073686f756c64206e6f74206265204e6f6e656044820152606401610503565b836040015160c001518460800151604001511461112b5760405162461bcd60e51b815260206004820152602660248201527f48617368206f6620626c6f636b2070726f64756365727320646f6573206e6f7460448201527f206d6174636800000000000000000000000000000000000000000000000000006064820152608401610503565b604084015180516101d280547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff9384160217905560a0820151166101d35560c08501516101d55560e0908101516101d6558401516101d755600182015460009081905b8082101561123c5760008760a0015183815181106111d057634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600001511561123057826001901b8417935080602001516101d9846064811061121457634e487b7160e01b600052603260045260246000fd5b6002020160008201518160000155602082015181600101559050505b506001909101906111a2565b50506101d88190556101d4805460ff191685158015919091179091556112ce576000600660036101d1546002018161128457634e487b7160e01b600052601260045260246000fd5b06600381106112a357634e487b7160e01b600052603260045260246000fd5b60990201905085604001516040015181600001819055506112cc86608001516020015182611a82565b505b50506102a180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055505060045442016102a25550505050565b6101d8546000906001831b166113645760405162461bcd60e51b815260206004820152601160248201527f4e6f2073756368207369676e61747572650000000000000000000000000000006044820152606401610503565b6101d45460009060069060ff1661137e576101d1546113a4565b60036101d154600101816113a257634e487b7160e01b600052601260045260246000fd5b065b600381106113c257634e487b7160e01b600052603260045260246000fd5b60990201905060006101d984606481106113ec57634e487b7160e01b600052603260045260246000fd5b6002020190506000806101d7546114a66101d260089054906101000a900467ffffffffffffffff16600201600060088267ff00ff00ff00ff001667ffffffffffffffff16901c60088366ff00ff00ff00ff1667ffffffffffffffff16901b17915060108267ffff0000ffff00001667ffffffffffffffff16901c60108365ffff0000ffff1667ffffffffffffffff16901b17915060208267ffffffffffffffff16901c60208367ffffffffffffffff16901b179050919050565b60405160f89390931b7fff00000000000000000000000000000000000000000000000000000000000000166020840152602183019190915260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660418201526000604982015260600160405160208183030381529060405290506000808280602001905181019061153a91906127b3565b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebd1b95186600201896064811061159057634e487b7160e01b600052603260045260246000fd5b01548654600188015460405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810193909352602483019190915260448201526064810185905276ffffffffffffffffffffffffffffffffffffffffffffff198416608482015260a40160206040518083038186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611654919061277b565b955050505050505b919050565b600880600154166000148061168057506000546001600160a01b031633145b61168957600080fd5b6102a25442106117015760405162461bcd60e51b815260206004820152602760248201527f4e6f20626c6f636b2063616e206265206368616c6c656e67656420617420746860448201527f69732074696d65000000000000000000000000000000000000000000000000006064820152608401610503565b61170a8261130c565b156117575760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206368616c6c656e67652076616c6964207369676e6174757265006044820152606401610503565b6003546102a1546001600160a01b031660009081526102a56020526040902054611781919061292c565b6102a1546001600160a01b0390811660009081526102a56020526040902091909155600354908416906108fc906117ba9060029061290c565b6040518115909202916000818181858888f193505050501580156117e2573d6000803e3d6000fd5b505060006102a2555050565b6000546060906001600160a01b0316331461180857600080fd5b600080846001600160a01b03168460405161182391906128bd565b600060405180830381855af49150503d806000811461185e576040519150601f19603f3d011682016040523d82523d6000602084013e611863565b606091505b50915091508161187257600080fd5b949350505050565b6000546001600160a01b0316331461189157600080fd5b9055565b60018054811615806118b157506000546001600160a01b031633145b6118ba57600080fd5b600354341480156118d957503360009081526102a56020526040902054155b6118e257600080fd5b503360009081526102a560205260409020349055565b6000546001600160a01b0316331461190f57600080fd5b565b604080518082019091526000808252602082015260208201815281611934815190565b825101602083015250919050565b6060600061194f8361204b565b63ffffffff1690508067ffffffffffffffff81111561197e57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119cf57816020015b604080516080810182526000606082018181528252602080830182905292820152825260001990920191018161199c5790505b50915060005b81811015611a24576119e684612087565b838281518110611a0657634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611a1c90612973565b9150506119d5565b5050919050565b6020810151815114611a7f5760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20454f49206578706563746564000000000000006044820152606401610503565b50565b81516064811115611b215760405162461bcd60e51b815260206004820152604a60248201527f4974206973206e6f7420657870656374656420686176696e672074686174206d60448201527f616e7920626c6f636b2070726f64756365727320666f72207468652070726f7660648201527f6964656420626c6f636b00000000000000000000000000000000000000000000608482015260a401610503565b6001820181905560005b81811015611b9057838181518110611b5357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015160000151836002018260648110611b8657634e487b7160e01b600052603260045260246000fd5b0155600101611b2b565b506000805b828114611cdc576000858281518110611bbe57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001519050806fffffffffffffffffffffffffffffffff168301925083826001019250821415611c37578060801b6fffffffffffffffffffffffffffffffff191685606601600184901c60328110611c2f57634e487b7160e01b600052603260045260246000fd5b015550611cdc565b6000868381518110611c5957634e487b7160e01b600052603260045260246000fd5b60209081029190910181015101516fffffffffffffffffffffffffffffffff8116948501949091507fffffffffffffffffffffffffffffffff00000000000000000000000000000000608084901b160160668701600185901c60328110611cd057634e487b7160e01b600052603260045260246000fd5b01555050600101611b95565b5060036002820204836098018190555050505050565b611d9760408051610100808201835260008083526020808401829052845161012081018652828152908101829052808501829052606081018290526080810182905260a0810182905260c0810182905260e0810182905291820152909182019081526000602080830182905260408051606080820183528482529281019290925281810192909252910190815260606020820181905260006040830181905291015290565b611da08261211a565b8152611dab8261211a565b6020820152611db982612127565b6040820152611dc78261211a565b6060820152611dd582612207565b60808201526000611de58361204b565b63ffffffff1690508067ffffffffffffffff811115611e1457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e6d57816020015b60408051808201825260008082528251808401909352808352602080840191909152810191909152815260200190600190039081611e325790505b5060a083015260005b81811015611ec957611e878461226b565b8360a001518281518110611eab57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611ec190612973565b915050611e76565b50600280836040015161010001518460600151604051602001611ef6929190918252602082015260400190565b60408051601f1981840301815290829052611f10916128bd565b602060405180830381855afa158015611f2d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611f50919061279b565b835160408051602081019390935282015260600160408051601f1981840301815290829052611f7e916128bd565b602060405180830381855afa158015611f9b573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611fbe919061279b565b60c08301819052602080840151604051600293611fe693909101918252602082015260400190565b60408051601f1981840301815290829052612000916128bd565b602060405180830381855afa15801561201d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612040919061279b565b60e083015250919050565b600061208161205b8360046122b8565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92915050565b60408051608081018252600060608201818152825260208201819052918101829052906120b3836122d1565b90506120be836122e7565b6120c783612314565b82526120d28361238c565b6fffffffffffffffffffffffffffffffff16602083015260ff81166001141561210d576120fe836122d1565b60ff161515604083015261077b565b6000604083015250919050565b60006120818260206122b8565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915261217b8260d061243a565b61010082015261218a82612459565b67ffffffffffffffff16815261219f8261211a565b60208201526121ad8261211a565b60408201526121bb8261211a565b60608201526121c98261211a565b60808201526121d782612459565b67ffffffffffffffff1660a08201526121ef8261211a565b60c08201526121fd8261211a565b60e0820152919050565b6040805160608082018352600080835260208301919091529181019190915261222f826124ce565b158015825261165c57815161224383611942565b6020830152825161226090829061225b90829061292c565b61253b565b604083015250919050565b6040805180820182526000808252825180840190935280835260208084019190915281019190915261229c826124ce565b158015825261165c576122ae8261255d565b6020820152919050565b60006122c48383612604565b5081518051910190915290565b60006122de8260016122b8565b60f81c92915050565b60006122f28261204b565b63ffffffff16905061230d818361260490919063ffffffff16565b8151019052565b60408051602081019091526000815261232c826122d1565b60ff161561237c5760405162461bcd60e51b815260206004820152601d60248201527f5061727365206572726f723a20696e76616c6964206b657920747970650000006044820152606401610503565b6123858261211a565b8152919050565b600061208161239c8360106122b8565b6dff000000ff000000ff000000ff00607882901c9081166cff000000ff000000ff000000ff60889390931c92831617601090811b6fff000000ff000000ff000000ff000000929092166eff000000ff000000ff000000ff0000939093169290921790911c17602081811b6fffffffff00000000ffffffff00000000166bffffffff00000000ffffffff9290911c9190911617604081811b91901c1790565b60006124468383612604565b8251612452908361253b565b9392505050565b60006120816124698360086122b8565b66ff000000ff000060c882901c90811667ff000000ff00000060b89390931c92831617601090811c64ff000000ff9290921665ff000000ff00939093169290921790911b17602081811c63ffffffff1691901b6bffffffffffffffff00000000161790565b6000806124da836122d1565b905060018160ff1611156125305760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20696e76616c696420626f6f6c000000000000006044820152606401610503565b60ff16151592915050565b600060206000838560025afa5b8061255257612548565b505060005192915050565b604080518082019091526000808252602082015261257a826122d1565b60ff16156125f05760405162461bcd60e51b815260206004820152602360248201527f5061727365206572726f723a20696e76616c6964207369676e6174757265207460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152608401610503565b6125f98261211a565b81526122ae8261211a565b602082015182518201111561265b5760405162461bcd60e51b815260206004820152601b60248201527f5061727365206572726f723a20756e657870656374656420454f4900000000006044820152606401610503565b5050565b600082601f83011261266f578081fd5b813567ffffffffffffffff8082111561268a5761268a6129a4565b604051601f8301601f19908116603f011681019082821181831017156126b2576126b26129a4565b816040528381528660208588010111156126ca578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156126f7578081fd5b8135612452816129ba565b60008060408385031215612714578081fd5b823561271f816129ba565b946020939093013593505050565b6000806040838503121561273f578182fd5b823561274a816129ba565b9150602083013567ffffffffffffffff811115612765578182fd5b6127718582860161265f565b9150509250929050565b60006020828403121561278c578081fd5b81518015158114612452578182fd5b6000602082840312156127ac578081fd5b5051919050565b600080604083850312156127c5578182fd5b82519150602083015176ffffffffffffffffffffffffffffffffffffffffffffff19811681146127f3578182fd5b809150509250929050565b60006020828403121561280f578081fd5b813567ffffffffffffffff811115612825578182fd5b6118728482850161265f565b600060208284031215612842578081fd5b5035919050565b6000806040838503121561285b578182fd5b50508035926020909101359150565b60008060006060848603121561287e578081fd5b505081359360208301359350604090920135919050565b6000602082840312156128a6578081fd5b813567ffffffffffffffff81168114612452578182fd5b600082516128cf818460208701612943565b9190910192915050565b60006020825282518060208401526128f8816040850160208701612943565b601f01601f19169190910160400192915050565b60008261292757634e487b7160e01b81526012600452602481fd5b500490565b60008282101561293e5761293e61298e565b500390565b60005b8381101561295e578181015183820152602001612946565b8381111561296d576000848401525b50505050565b60006000198214156129875761298761298e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a7f57600080fdfea2646970667358221220c4e6e79813650f87983cecaaecad09dcd9553de5fd09d0482a231f30c6db1fc864736f6c6343000803003300000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b60000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000105ef39b2000000000000000000000000000d9cb077700aa4d32d30bda5e99bb171549b5a3820000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061018b5760003560e01c80636c4624c3116100d6578063b3bf91e71161007f578063d0e30db011610059578063d0e30db014610449578063f48ab4e014610451578063f851a440146104595761018b565b8063b3bf91e7146103f3578063b8e9744c14610409578063be831a2e146104295761018b565b80637875a55c116100b05780637875a55c1461039d578063a3155fbb146103b3578063acb99828146103d35761018b565b80636c4624c31461032f5780636d2d6ae01461034f57806370a082311461036f5761018b565b806337da8ec5116101385780634466ec2c116101125780634466ec2c146102b1578063530208f2146102f95780635c975abb146103195761018b565b806337da8ec5146102655780633ccfd60b146102855780633e54ce681461029a5761018b565b8063160bc0ba11610169578063160bc0ba146102055780631e703806146102255780632692c59f146102455761018b565b8063045544431461019057806309d7e8e7146101b9578063158ef93e146101db575b600080fd5b34801561019c57600080fd5b506101a660045481565b6040519081526020015b60405180910390f35b3480156101c557600080fd5b506101d96101d43660046127fe565b610491565b005b3480156101e757600080fd5b506002546101f59060ff1681565b60405190151581526020016101b0565b34801561021157600080fd5b506101d96102203660046127fe565b610546565b34801561023157600080fd5b506101a6610240366004612895565b6106e2565b34801561025157600080fd5b506101d9610260366004612831565b610781565b34801561027157600080fd5b506101a6610280366004612895565b61079d565b34801561029157600080fd5b506101d961083a565b3480156102a657600080fd5b506101a66102a25481565b3480156102bd57600080fd5b506102c66108e0565b6040516101b091908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561030557600080fd5b506101d9610314366004612702565b6109f0565b34801561032557600080fd5b506101a660015481565b34801561033b57600080fd5b506101d961034a36600461286a565b610a3d565b34801561035b57600080fd5b506101d961036a3660046127fe565b610a5f565b34801561037b57600080fd5b506101a661038a3660046126e6565b6102a56020526000908152604090205481565b3480156103a957600080fd5b506101a660035481565b3480156103bf57600080fd5b506101f56103ce366004612831565b61130c565b3480156103df57600080fd5b506101d96103ee366004612702565b611661565b3480156103ff57600080fd5b506101a660055481565b61041c61041736600461272d565b6117ee565b6040516101b091906128d9565b34801561043557600080fd5b506101d9610444366004612849565b61187a565b6101d9611895565b6101d96118f8565b34801561046557600080fd5b50600054610479906001600160a01b031681565b6040516001600160a01b0390911681526020016101b0565b6000546001600160a01b031633146104a857600080fd5b60025460ff161580156104bb5750600754155b61050c5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e20737461676500000000000060448201526064015b60405180910390fd5b600061051782611911565b9050600061052482611942565b905061052f82611a2b565b61054181600660005b60990201611a82565b505050565b6000546001600160a01b0316331461055d57600080fd5b60025460ff16158015610571575060075415155b6105bd5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e2073746167650000000000006044820152606401610503565b6002805460ff1916600117905560006105d582611911565b905060006105e282611cf2565b90506105ed82611a2b565b6080810151516106655760405162461bcd60e51b815260206004820152602a60248201527f496e697469616c697a6174696f6e20626c6f636b206d75737420636f6e74616960448201527f6e206e6578745f627073000000000000000000000000000000000000000000006064820152608401610503565b6040818101805180516101d2805467ffffffffffffffff191667ffffffffffffffff928316908117909155602080840151600690815593860151609f5560c087015160009283526102a3825286832055935160e0810151905190921681526102a48452939093209290925560808301510151610541916001610538565b6000601080600154166000148061070357506000546001600160a01b031633145b61070c57600080fd5b67ffffffffffffffff831660009081526102a4602052604090205491508115801561073a57506102a2544210155b801561074857506102a25415155b801561076f57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b576101d65491505b50919050565b6000546001600160a01b0316331461079857600080fd5b600155565b600060108060015416600014806107be57506000546001600160a01b031633145b6107c757600080fd5b67ffffffffffffffff831660009081526102a360205260409020549150811580156107f557506102a2544210155b801561080357506102a25415155b801561082a57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b5750506101d554919050565b600280600154166000148061085957506000546001600160a01b031633145b61086257600080fd5b6102a1546001600160a01b03163314158061088057506102a2544210155b61088957600080fd5b3360009081526102a56020526040902054806108a457600080fd5b3360008181526102a560205260408082208290555183156108fc0291849190818181858888f19350505050158015610541573d6000803e3d6000fd5b61090b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6102a2544210156109a9576101d25467ffffffffffffffff1681526101d35460208201526102a25460408201526101d45460069060ff1661094f576101d154610975565b60036101d1546001018161097357634e487b7160e01b600052601260045260246000fd5b065b6003811061099357634e487b7160e01b600052603260045260246000fd5b60990201600101548160600181815250506109ed565b6102a254156109d1576101d25468010000000000000000900467ffffffffffffffff166109e0565b6101d25467ffffffffffffffff165b67ffffffffffffffff1681525b90565b6000546001600160a01b03163314610a0757600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610541573d6000803e3d6000fd5b6000546001600160a01b03163314610a5457600080fd5b825491821816189055565b6004806001541660001480610a7e57506000546001600160a01b031633145b610a8757600080fd5b60025460ff16610ad95760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206973206e6f7420696e697469616c697a656400000000006044820152606401610503565b6003543360009081526102a560205260409020541015610b3b5760405162461bcd60e51b815260206004820152601560248201527f42616c616e6365206973206e6f7420656e6f75676800000000000000000000006044820152606401610503565b6000610b4683611911565b90506000610b5382611cf2565b9050610b5e82611a2b565b6102a254421015610bfd576005546101d35401816040015160a0015167ffffffffffffffff161015610bf85760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c79207265706c6163652077697468206120737566666963696560448201527f6e746c79206e6577657220626c6f636b000000000000000000000000000000006064820152608401610503565b610cab565b6102a25415610cab576101d2805468010000000000000000810467ffffffffffffffff1667ffffffffffffffff199091161790556101d45460ff1615610c675760036101d15460010181610c6157634e487b7160e01b600052601260045260246000fd5b066101d1555b60006102a28190556101d5546101d2805467ffffffffffffffff90811684526102a360209081526040808620949094556101d654925490911684526102a490529120555b6101d25460408201515167ffffffffffffffff918216911611610d365760405162461bcd60e51b815260206004820152602160248201527f4e657720626c6f636b206d75737420686176652068696768657220686569676860448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610503565b600060066101d15460038110610d5c57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610d7857506000610e47565b600660036101d15460010181610d9e57634e487b7160e01b600052601260045260246000fd5b0660038110610dbd57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610dd957506001610e47565b60405162461bcd60e51b815260206004820152602260248201527f45706f6368206964206f662074686520626c6f636b206973206e6f742076616c60448201527f69640000000000000000000000000000000000000000000000000000000000006064820152608401610503565b6000600682610e59576101d154610e7f565b60036101d15460010181610e7d57634e487b7160e01b600052601260045260246000fd5b065b60038110610e9d57634e487b7160e01b600052603260045260246000fd5b60990201905080600101548360a00151511015610efc5760405162461bcd60e51b815260206004820152601a60248201527f417070726f76616c206c69737420697320746f6f2073686f72740000000000006044820152606401610503565b600181015460009081905b808214610ff957600084606601600184901c60328110610f3757634e487b7160e01b600052603260045260246000fd5b015490508660a001518381518110610f5f57634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610f8b578060801c6fffffffffffffffffffffffffffffffff16840193505b81836001019350831415610f9f5750610ff9565b8660a001518381518110610fc357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610fed576fffffffffffffffffffffffffffffffff811693909301925b50816001019150610f07565b50508160980154811161104e5760405162461bcd60e51b815260206004820152601160248201527f546f6f2066657720617070726f76616c730000000000000000000000000000006044820152606401610503565b821561112b576080840151516110a65760405162461bcd60e51b815260206004820181905260248201527f4e657874206e6578745f6270732073686f756c64206e6f74206265204e6f6e656044820152606401610503565b836040015160c001518460800151604001511461112b5760405162461bcd60e51b815260206004820152602660248201527f48617368206f6620626c6f636b2070726f64756365727320646f6573206e6f7460448201527f206d6174636800000000000000000000000000000000000000000000000000006064820152608401610503565b604084015180516101d280547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff9384160217905560a0820151166101d35560c08501516101d55560e0908101516101d6558401516101d755600182015460009081905b8082101561123c5760008760a0015183815181106111d057634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600001511561123057826001901b8417935080602001516101d9846064811061121457634e487b7160e01b600052603260045260246000fd5b6002020160008201518160000155602082015181600101559050505b506001909101906111a2565b50506101d88190556101d4805460ff191685158015919091179091556112ce576000600660036101d1546002018161128457634e487b7160e01b600052601260045260246000fd5b06600381106112a357634e487b7160e01b600052603260045260246000fd5b60990201905085604001516040015181600001819055506112cc86608001516020015182611a82565b505b50506102a180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055505060045442016102a25550505050565b6101d8546000906001831b166113645760405162461bcd60e51b815260206004820152601160248201527f4e6f2073756368207369676e61747572650000000000000000000000000000006044820152606401610503565b6101d45460009060069060ff1661137e576101d1546113a4565b60036101d154600101816113a257634e487b7160e01b600052601260045260246000fd5b065b600381106113c257634e487b7160e01b600052603260045260246000fd5b60990201905060006101d984606481106113ec57634e487b7160e01b600052603260045260246000fd5b6002020190506000806101d7546114a66101d260089054906101000a900467ffffffffffffffff16600201600060088267ff00ff00ff00ff001667ffffffffffffffff16901c60088366ff00ff00ff00ff1667ffffffffffffffff16901b17915060108267ffff0000ffff00001667ffffffffffffffff16901c60108365ffff0000ffff1667ffffffffffffffff16901b17915060208267ffffffffffffffff16901c60208367ffffffffffffffff16901b179050919050565b60405160f89390931b7fff00000000000000000000000000000000000000000000000000000000000000166020840152602183019190915260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660418201526000604982015260600160405160208183030381529060405290506000808280602001905181019061153a91906127b3565b915091507f00000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b66001600160a01b031663ebd1b95186600201896064811061159057634e487b7160e01b600052603260045260246000fd5b01548654600188015460405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810193909352602483019190915260448201526064810185905276ffffffffffffffffffffffffffffffffffffffffffffff198416608482015260a40160206040518083038186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611654919061277b565b955050505050505b919050565b600880600154166000148061168057506000546001600160a01b031633145b61168957600080fd5b6102a25442106117015760405162461bcd60e51b815260206004820152602760248201527f4e6f20626c6f636b2063616e206265206368616c6c656e67656420617420746860448201527f69732074696d65000000000000000000000000000000000000000000000000006064820152608401610503565b61170a8261130c565b156117575760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206368616c6c656e67652076616c6964207369676e6174757265006044820152606401610503565b6003546102a1546001600160a01b031660009081526102a56020526040902054611781919061292c565b6102a1546001600160a01b0390811660009081526102a56020526040902091909155600354908416906108fc906117ba9060029061290c565b6040518115909202916000818181858888f193505050501580156117e2573d6000803e3d6000fd5b505060006102a2555050565b6000546060906001600160a01b0316331461180857600080fd5b600080846001600160a01b03168460405161182391906128bd565b600060405180830381855af49150503d806000811461185e576040519150601f19603f3d011682016040523d82523d6000602084013e611863565b606091505b50915091508161187257600080fd5b949350505050565b6000546001600160a01b0316331461189157600080fd5b9055565b60018054811615806118b157506000546001600160a01b031633145b6118ba57600080fd5b600354341480156118d957503360009081526102a56020526040902054155b6118e257600080fd5b503360009081526102a560205260409020349055565b6000546001600160a01b0316331461190f57600080fd5b565b604080518082019091526000808252602082015260208201815281611934815190565b825101602083015250919050565b6060600061194f8361204b565b63ffffffff1690508067ffffffffffffffff81111561197e57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119cf57816020015b604080516080810182526000606082018181528252602080830182905292820152825260001990920191018161199c5790505b50915060005b81811015611a24576119e684612087565b838281518110611a0657634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611a1c90612973565b9150506119d5565b5050919050565b6020810151815114611a7f5760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20454f49206578706563746564000000000000006044820152606401610503565b50565b81516064811115611b215760405162461bcd60e51b815260206004820152604a60248201527f4974206973206e6f7420657870656374656420686176696e672074686174206d60448201527f616e7920626c6f636b2070726f64756365727320666f72207468652070726f7660648201527f6964656420626c6f636b00000000000000000000000000000000000000000000608482015260a401610503565b6001820181905560005b81811015611b9057838181518110611b5357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015160000151836002018260648110611b8657634e487b7160e01b600052603260045260246000fd5b0155600101611b2b565b506000805b828114611cdc576000858281518110611bbe57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001519050806fffffffffffffffffffffffffffffffff168301925083826001019250821415611c37578060801b6fffffffffffffffffffffffffffffffff191685606601600184901c60328110611c2f57634e487b7160e01b600052603260045260246000fd5b015550611cdc565b6000868381518110611c5957634e487b7160e01b600052603260045260246000fd5b60209081029190910181015101516fffffffffffffffffffffffffffffffff8116948501949091507fffffffffffffffffffffffffffffffff00000000000000000000000000000000608084901b160160668701600185901c60328110611cd057634e487b7160e01b600052603260045260246000fd5b01555050600101611b95565b5060036002820204836098018190555050505050565b611d9760408051610100808201835260008083526020808401829052845161012081018652828152908101829052808501829052606081018290526080810182905260a0810182905260c0810182905260e0810182905291820152909182019081526000602080830182905260408051606080820183528482529281019290925281810192909252910190815260606020820181905260006040830181905291015290565b611da08261211a565b8152611dab8261211a565b6020820152611db982612127565b6040820152611dc78261211a565b6060820152611dd582612207565b60808201526000611de58361204b565b63ffffffff1690508067ffffffffffffffff811115611e1457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e6d57816020015b60408051808201825260008082528251808401909352808352602080840191909152810191909152815260200190600190039081611e325790505b5060a083015260005b81811015611ec957611e878461226b565b8360a001518281518110611eab57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611ec190612973565b915050611e76565b50600280836040015161010001518460600151604051602001611ef6929190918252602082015260400190565b60408051601f1981840301815290829052611f10916128bd565b602060405180830381855afa158015611f2d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611f50919061279b565b835160408051602081019390935282015260600160408051601f1981840301815290829052611f7e916128bd565b602060405180830381855afa158015611f9b573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611fbe919061279b565b60c08301819052602080840151604051600293611fe693909101918252602082015260400190565b60408051601f1981840301815290829052612000916128bd565b602060405180830381855afa15801561201d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612040919061279b565b60e083015250919050565b600061208161205b8360046122b8565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92915050565b60408051608081018252600060608201818152825260208201819052918101829052906120b3836122d1565b90506120be836122e7565b6120c783612314565b82526120d28361238c565b6fffffffffffffffffffffffffffffffff16602083015260ff81166001141561210d576120fe836122d1565b60ff161515604083015261077b565b6000604083015250919050565b60006120818260206122b8565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915261217b8260d061243a565b61010082015261218a82612459565b67ffffffffffffffff16815261219f8261211a565b60208201526121ad8261211a565b60408201526121bb8261211a565b60608201526121c98261211a565b60808201526121d782612459565b67ffffffffffffffff1660a08201526121ef8261211a565b60c08201526121fd8261211a565b60e0820152919050565b6040805160608082018352600080835260208301919091529181019190915261222f826124ce565b158015825261165c57815161224383611942565b6020830152825161226090829061225b90829061292c565b61253b565b604083015250919050565b6040805180820182526000808252825180840190935280835260208084019190915281019190915261229c826124ce565b158015825261165c576122ae8261255d565b6020820152919050565b60006122c48383612604565b5081518051910190915290565b60006122de8260016122b8565b60f81c92915050565b60006122f28261204b565b63ffffffff16905061230d818361260490919063ffffffff16565b8151019052565b60408051602081019091526000815261232c826122d1565b60ff161561237c5760405162461bcd60e51b815260206004820152601d60248201527f5061727365206572726f723a20696e76616c6964206b657920747970650000006044820152606401610503565b6123858261211a565b8152919050565b600061208161239c8360106122b8565b6dff000000ff000000ff000000ff00607882901c9081166cff000000ff000000ff000000ff60889390931c92831617601090811b6fff000000ff000000ff000000ff000000929092166eff000000ff000000ff000000ff0000939093169290921790911c17602081811b6fffffffff00000000ffffffff00000000166bffffffff00000000ffffffff9290911c9190911617604081811b91901c1790565b60006124468383612604565b8251612452908361253b565b9392505050565b60006120816124698360086122b8565b66ff000000ff000060c882901c90811667ff000000ff00000060b89390931c92831617601090811c64ff000000ff9290921665ff000000ff00939093169290921790911b17602081811c63ffffffff1691901b6bffffffffffffffff00000000161790565b6000806124da836122d1565b905060018160ff1611156125305760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20696e76616c696420626f6f6c000000000000006044820152606401610503565b60ff16151592915050565b600060206000838560025afa5b8061255257612548565b505060005192915050565b604080518082019091526000808252602082015261257a826122d1565b60ff16156125f05760405162461bcd60e51b815260206004820152602360248201527f5061727365206572726f723a20696e76616c6964207369676e6174757265207460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152608401610503565b6125f98261211a565b81526122ae8261211a565b602082015182518201111561265b5760405162461bcd60e51b815260206004820152601b60248201527f5061727365206572726f723a20756e657870656374656420454f4900000000006044820152606401610503565b5050565b600082601f83011261266f578081fd5b813567ffffffffffffffff8082111561268a5761268a6129a4565b604051601f8301601f19908116603f011681019082821181831017156126b2576126b26129a4565b816040528381528660208588010111156126ca578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156126f7578081fd5b8135612452816129ba565b60008060408385031215612714578081fd5b823561271f816129ba565b946020939093013593505050565b6000806040838503121561273f578182fd5b823561274a816129ba565b9150602083013567ffffffffffffffff811115612765578182fd5b6127718582860161265f565b9150509250929050565b60006020828403121561278c578081fd5b81518015158114612452578182fd5b6000602082840312156127ac578081fd5b5051919050565b600080604083850312156127c5578182fd5b82519150602083015176ffffffffffffffffffffffffffffffffffffffffffffff19811681146127f3578182fd5b809150509250929050565b60006020828403121561280f578081fd5b813567ffffffffffffffff811115612825578182fd5b6118728482850161265f565b600060208284031215612842578081fd5b5035919050565b6000806040838503121561285b578182fd5b50508035926020909101359150565b60008060006060848603121561287e578081fd5b505081359360208301359350604090920135919050565b6000602082840312156128a6578081fd5b813567ffffffffffffffff81168114612452578182fd5b600082516128cf818460208701612943565b9190910192915050565b60006020825282518060208401526128f8816040850160208701612943565b601f01601f19169190910160400192915050565b60008261292757634e487b7160e01b81526012600452602481fd5b500490565b60008282101561293e5761293e61298e565b500390565b60005b8381101561295e578181015183820152602001612946565b8381111561296d576000848401525b50505050565b60006000198214156129875761298761298e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a7f57600080fdfea2646970667358221220c4e6e79813650f87983cecaaecad09dcd9553de5fd09d0482a231f30c6db1fc864736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b60000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000105ef39b2000000000000000000000000000d9cb077700aa4d32d30bda5e99bb171549b5a3820000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : ed (address): 0x88f975D5A1153Ea92AF66e7c4292576a329c04B6
Arg [1] : lockEthAmount_ (uint256): 5000000000000000000
Arg [2] : lockDuration_ (uint256): 14400
Arg [3] : replaceDuration_ (uint256): 18000000000000
Arg [4] : admin_ (address): 0xD9cB077700AA4D32d30bDA5e99bb171549b5a382
Arg [5] : pausedFlags_ (uint256): 0
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b6
Arg [1] : 0000000000000000000000000000000000000000000000004563918244f40000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000003840
Arg [3] : 0000000000000000000000000000000000000000000000000000105ef39b2000
Arg [4] : 000000000000000000000000d9cb077700aa4d32d30bda5e99bb171549b5a382
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
181:12747:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:27;;;;;;;;;;;;;;;;;;;5876:25:7;;;5864:2;5849:18;850:27:4;;;;;;;;4492:392;;;;;;;;;;-1:-1:-1;4492:392:4;;;;;:::i;:::-;;:::i;:::-;;652:23;;;;;;;;;;-1:-1:-1;652:23:4;;;;;;;;;;;5703:14:7;;5696:22;5678:41;;5666:2;5651:18;652:23:4;5633:92:7;4964:852:4;;;;;;;;;;-1:-1:-1;4964:852:4;;;;;:::i;:::-;;:::i;12614:312::-;;;;;;;;;;-1:-1:-1;12614:312:4;;;;;:::i;:::-;;:::i;447:80:0:-;;;;;;;;;;-1:-1:-1;447:80:0;;;;;:::i;:::-;;:::i;12312:296:4:-;;;;;;;;;;-1:-1:-1;12312:296:4;;;;;:::i;:::-;;:::i;2743:305::-;;;;;;;;;;;;;:::i;1680:23::-;;;;;;;;;;;;;;;;6271:510;;;;;;;;;;;;;:::i;:::-;;;;;;14646:13:7;;14628:32;;14716:4;14704:17;;;14698:24;14676:20;;;14669:54;14779:4;14767:17;;;14761:24;14739:20;;;14732:54;14842:4;14830:17;;;14824:24;14802:20;;;14795:54;;;;14615:3;14600:19;;14582:273;922:126:0;;;;;;;;;;-1:-1:-1;922:126:0;;;;;:::i;:::-;;:::i;125:18::-;;;;;;;;;;;;;;;;666:250;;;;;;;;;;-1:-1:-1;666:250:0;;;;;:::i;:::-;;:::i;6787:4474:4:-;;;;;;;;;;-1:-1:-1;6787:4474:4;;;;;:::i;:::-;;:::i;1805:53::-;;;;;;;;;;-1:-1:-1;1805:53:4;;;;;:::i;:::-;;;;;;;;;;;;;;681:28;;;;;;;;;;;;;;;;3520:878;;;;;;;;;;-1:-1:-1;3520:878:4;;;;;:::i;:::-;;:::i;3054:460::-;;;;;;;;;;-1:-1:-1;3054:460:4;;;;;:::i;:::-;;:::i;977:30::-;;;;;;;;;;;;;;;;1114:237:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;533:127::-;;;;;;;;;;-1:-1:-1;533:127:0;;;;;:::i;:::-;;:::i;2544:193:4:-;;;:::i;1054:54:0:-;;;:::i;99:20::-;;;;;;;;;;-1:-1:-1;99:20:0;;;;-1:-1:-1;;;;;99:20:0;;;;;;-1:-1:-1;;;;;5471:55:7;;;5453:74;;5441:2;5426:18;99:20:0;5408:125:7;4492:392:4;302:5:0;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;4584:11:4::1;::::0;::::1;;4583:12;:37:::0;::::1;;;-1:-1:-1::0;4599:16:4;;:21;4583:37:::1;4575:76;;;::::0;-1:-1:-1;;;4575:76:4;;7397:2:7;4575:76:4::1;::::0;::::1;7379:21:7::0;7436:2;7416:18;;;7409:30;7475:28;7455:18;;;7448:56;7521:18;;4575:76:4::1;;;;;;;;;4662:23;4688:16;4699:4;4688:10;:16::i;:::-;4662:42;;4714:52;4769:28;:5;:26;:28::i;:::-;4714:83;;4807:12;:5;:10;:12::i;:::-;4830:47;4848:17:::0;4867:6:::1;4874:1;4867:9;;;;4830:17;:47::i;:::-;318:1:0;;4492:392:4::0;:::o;4964:852::-;302:5:0;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;5051:11:4::1;::::0;::::1;;5050:12;:37:::0;::::1;;;-1:-1:-1::0;5066:16:4;;:21;::::1;5050:37;5042:76;;;::::0;-1:-1:-1;;;5042:76:4;;7397:2:7;5042:76:4::1;::::0;::::1;7379:21:7::0;7436:2;7416:18;;;7409:30;7475:28;7455:18;;;7448:56;7521:18;;5042:76:4::1;7369:176:7::0;5042:76:4::1;5128:11;:18:::0;;-1:-1:-1;;5128:18:4::1;5142:4;5128:18;::::0;;:11:::1;5183:16;5194:4:::0;5183:10:::1;:16::i;:::-;5157:42;;5209:45;5257:30;:5;:28;:30::i;:::-;5209:78;;5297:12;:5;:10;:12::i;:::-;5328:18;::::0;::::1;::::0;:23;5320:78:::1;;;::::0;-1:-1:-1;;;5320:78:4;;10402:2:7;5320:78:4::1;::::0;::::1;10384:21:7::0;10441:2;10421:18;;;10414:30;10480:34;10460:18;;;10453:62;10551:12;10531:18;;;10524:40;10581:19;;5320:78:4::1;10374:232:7::0;5320:78:4::1;5421:20;::::0;;::::1;::::0;;:27;;5409:9:::1;:39:::0;;-1:-1:-1;;5409:39:4::1;;::::0;;::::1;::::0;;::::1;::::0;;;5478:29:::1;::::0;;::::1;::::0;5458:6:::1;:49:::0;;;5537:34;;::::1;::::0;5517:9;:54;5625:14:::1;::::0;::::1;::::0;-1:-1:-1;5581:41:4;;;:12:::1;:41:::0;;;;;:58;5698:20;;:38:::1;::::0;::::1;::::0;5667:27;;5649:46;;::::1;::::0;;:17:::1;:46:::0;;;;;;:87;;;;5764:18:::1;::::0;::::1;::::0;:33:::1;::::0;5746:63:::1;::::0;-1:-1:-1;5799:9:4::1;::::0;12614:312;12709:11;2535:2;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;12738:25:4::1;::::0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;-1:-1:-1;12777:8:4;;:42;::::1;;;;12808:11;;12789:15;:30;;12777:42;:62;;;;-1:-1:-1::0;12823:11:4::1;::::0;:16;::::1;12777:62;:91;;;;-1:-1:-1::0;12853:15:4::1;::::0;::::1;12843:25:::0;;::::1;12853:15:::0;;;::::1;;12843:25;12777:91;12773:147;;;12890:19;;12884:25;;12773:147;12614:312:::0;;;;:::o;447:80:0:-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;506:6:::1;:14:::0;447:80::o;12312:296:4:-;12402:11;2535:2;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;12431:20:4::1;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;-1:-1:-1;12465:8:4;;:42;::::1;;;;12496:11;;12477:15;:30;;12465:42;:62;;;;-1:-1:-1::0;12511:11:4::1;::::0;:16;::::1;12465:62;:91;;;;-1:-1:-1::0;12541:15:4::1;::::0;::::1;12531:25:::0;;::::1;12541:15:::0;;;::::1;;12531:25;12465:91;12461:141;;;-1:-1:-1::0;;12578:13:4::1;::::0;;12312:296;-1:-1:-1;12312:296:4:o;2743:305::-;2418:1;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;2837:13:4::1;::::0;-1:-1:-1;;;;;2837:13:4::1;2823:10;:27;;::::0;:61:::1;;;2873:11;;2854:15;:30;;2823:61;2815:70;;;::::0;::::1;;2919:10;2895:11;2909:21:::0;;;:9:::1;:21;::::0;;;;;2948:11;2940:20:::1;;;::::0;::::1;;2980:10;2994:1;2970:21:::0;;;:9:::1;:21;::::0;;;;;:25;;;3005:36;;::::1;;;::::0;3034:6;;3005:36;;2994:1;3005:36;3034:6;2980:10;3005:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;6271:510:::0;6315:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6315:22:4;6371:11;;6353:15;:29;6349:426;;;6418:9;;;;6398:29;;6461:18;;6441:17;;;:38;6511:11;;6493:15;;;:29;6595:18;;6588:6;;6595:18;;:50;;6637:8;;6595:50;;;6633:1;6617:8;;6628:1;6617:12;6616:18;;;-1:-1:-1;;;6616:18:4;;;;;;;;;;6595:50;6588:58;;;;;-1:-1:-1;;;6588:58:4;;;;;;;;;;;;:65;;;6564:3;:21;;:89;;;;;6349:426;;;6718:11;;:16;:46;;6749:15;;;;;;;6718:46;;;6737:9;;;;6718:46;6698:66;;;;6349:426;6271:510;:::o;922:126:0:-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;1013::::1;::::0;-1:-1:-1;;;;;1013:20:0;::::1;::::0;:28;::::1;;;::::0;1034:6;;1013:28:::1;::::0;;;1034:6;1013:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;666:250:::0;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;822:10;;865:18;;::::1;861:29;857:42;845:55:::0;;666:250::o;6787:4474:4:-;2458:1;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;6896:11:4::1;::::0;::::1;;6888:51;;;::::0;-1:-1:-1;;;6888:51:4;;9685:2:7;6888:51:4::1;::::0;::::1;9667:21:7::0;9724:2;9704:18;;;9697:30;9763:29;9743:18;;;9736:57;9810:18;;6888:51:4::1;9657:177:7::0;6888:51:4::1;6982:13;::::0;6967:10:::1;6957:21;::::0;;;:9:::1;:21;::::0;;;;;:38:::1;;6949:72;;;::::0;-1:-1:-1;;;6949:72:4;;13518:2:7;6949:72:4::1;::::0;::::1;13500:21:7::0;13557:2;13537:18;;;13530:30;13596:23;13576:18;;;13569:51;13637:18;;6949:72:4::1;13490:171:7::0;6949:72:4::1;7032:23;7058:16;7069:4;7058:10;:16::i;:::-;7032:42;;7084:45;7132:30;:5;:28;:30::i;:::-;7084:78;;7172:12;:5;:10;:12::i;:::-;7325:11;;7307:15;:29;7303:615;;;7440:15;;7419:18;;:36;7385:9;:20;;;:30;;;:70;;;;7356:189;;;::::0;-1:-1:-1;;;7356:189:4;;12618:2:7;7356:189:4::1;::::0;::::1;12600:21:7::0;12657:2;12637:18;;;12630:30;12696:34;12676:18;;;12669:62;12767:18;12747;;;12740:46;12803:19;;7356:189:4::1;12590:238:7::0;7356:189:4::1;7303:615;;;7570:11;::::0;:16;7566:352:::1;;7618:15;::::0;;;;::::1;;;-1:-1:-1::0;;7606:27:4;;::::1;;::::0;;7655:18:::1;::::0;::::1;;7651:94;;;7725:1;7709:8;;7720:1;7709:12;7708:18;;;-1:-1:-1::0;;;7708:18:4::1;;;;;;;;;;7697:8;:29:::0;7651:94:::1;7776:1;7762:11;:15:::0;;;7822:13:::1;::::0;7809:9:::1;::::0;;::::1;::::0;;::::1;7796:23:::0;;:12:::1;:23;::::0;;;;;;;:39;;;;7884:19:::1;::::0;7871:9;;;;::::1;7853:28:::0;;:17:::1;:28:::0;;;;:50;7566:352:::1;8054:9;::::0;8024:20:::1;::::0;::::1;::::0;:27;8054:9:::1;::::0;;::::1;8024:39:::0;::::1;;8016:85;;;::::0;-1:-1:-1;;;8016:85:4;;13868:2:7;8016:85:4::1;::::0;::::1;13850:21:7::0;13907:2;13887:18;;;13880:30;13946:34;13926:18;;;13919:62;14017:3;13997:18;;;13990:31;14038:19;;8016:85:4::1;13840:223:7::0;8016:85:4::1;8221:18;8290:6;8297:8;;8290:16;;;;;-1:-1:-1::0;;;8290:16:4::1;;;;;;;;;;;;:24:::0;8257:20:::1;::::0;::::1;::::0;:29:::1;;::::0;:57:::1;8253:332;;;-1:-1:-1::0;8350:5:4::1;8253:332;;;8413:6;8437:1;8421:8;;8432:1;8421:12;8420:18;;;-1:-1:-1::0;;;8420:18:4::1;;;;;;;;;;8413:26;;;;;-1:-1:-1::0;;;8413:26:4::1;;;;;;;;;;;;:34:::0;8380:20:::1;::::0;::::1;::::0;:29:::1;;::::0;:67:::1;8376:209;;;-1:-1:-1::0;8483:4:4::1;8376:209;;;8526:44;::::0;-1:-1:-1;;;8526:44:4;;12215:2:7;8526:44:4::1;::::0;::::1;12197:21:7::0;12254:2;12234:18;;;12227:30;12293:34;12273:18;;;12266:62;12364:4;12344:18;;;12337:32;12386:19;;8526:44:4::1;12187:224:7::0;8376:209:4::1;8685:23;8711:6;8718:13;:45;;8755:8;;8718:45;;;8751:1;8735:8;;8746:1;8735:12;8734:18;;;-1:-1:-1::0;;;8734:18:4::1;;;;;;;;;;8718:45;8711:53;;;;;-1:-1:-1::0;;;8711:53:4::1;;;;;;;;;;;;8685:79;;8926:9;:16;;;8885:9;:30;;;:37;:57;;8877:96;;;::::0;-1:-1:-1;;;8877:96:4;;14270:2:7;8877:96:4::1;::::0;::::1;14252:21:7::0;14309:2;14289:18;;;14282:30;14348:28;14328:18;;;14321:56;14394:18;;8877:96:4::1;14242:176:7::0;8877:96:4::1;9109:16;::::0;::::1;::::0;9045::::1;::::0;;;9079:499:::1;9133:3;9128:1;:8;9079:499;;9161:14;9178:9;:22;;9206:1;9201;:6;;9178:30;;;;;-1:-1:-1::0;;;9178:30:4::1;;;;;;;;;;;9161:47;;9230:9;:30;;;9261:1;9230:33;;;;;;-1:-1:-1::0;;;9230:33:4::1;;;;;;;;;;;;;;;:38;;;9226:121;;;9320:6;9304:24;;9292:36;;;;;;9226:121;9375:3;9368;;;;;;:10;9364:62;;;9402:5;;;9364:62;9447:9;:30;;;9478:1;9447:33;;;;;;-1:-1:-1::0;;;9447:33:4::1;;;;;;;;;;;;;;;:38;;;9443:121;;;9509:36;::::0;::::1;::::0;;;::::1;::::0;9443:121:::1;9079:499;9138:3;;;;;9079:499;;;;;9610:9;:24;;;9599:8;:35;9591:65;;;::::0;-1:-1:-1;;;9591:65:4;;11513:2:7;9591:65:4::1;::::0;::::1;11495:21:7::0;11552:2;11532:18;;;11525:30;11591:19;11571:18;;;11564:47;11628:18;;9591:65:4::1;11485:167:7::0;9591:65:4::1;9787:13;9783:307;;;9828:18;::::0;::::1;::::0;:23;9820:68:::1;;;::::0;-1:-1:-1;;;9820:68:4;;10041:2:7;9820:68:4::1;::::0;::::1;10023:21:7::0;;;10060:18;;;10053:30;10119:34;10099:18;;;10092:62;10171:18;;9820:68:4::1;10013:182:7::0;9820:68:4::1;9962:9;:20;;;:33;;;9935:9;:18;;;:23;;;:60;9906:169;;;::::0;-1:-1:-1;;;9906:169:4;;8160:2:7;9906:169:4::1;::::0;::::1;8142:21:7::0;8199:2;8179:18;;;8172:30;8238:34;8218:18;;;8211:62;8309:8;8289:18;;;8282:36;8335:19;;9906:169:4::1;8132:228:7::0;9906:169:4::1;10122:20;::::0;::::1;::::0;:27;;10104:15:::1;:45:::0;;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;10184:30:::1;::::0;::::1;::::0;10163:51:::1;:18;:51:::0;10244:14:::1;::::0;::::1;::::0;10228:13:::1;:30:::0;10294:38:::1;::::0;;::::1;::::0;10272:19:::1;:60:::0;10366:19;::::1;::::0;10346:17:::1;:39:::0;-1:-1:-1;10468:16:4;::::1;::::0;-1:-1:-1;;;;10438:341:4::1;10491:3;10487:1;:7;10438:341;;;10519:45;10567:9;:30;;;10598:1;10567:33;;;;;;-1:-1:-1::0;;;10567:33:4::1;;;;;;;;;;;;;;;10519:81;;10622:8;:13;;;10618:147;;;10680:1;10675;:6;;10659:22;;;;10728:8;:18;;;10703:19;10723:1;10703:22;;;;;-1:-1:-1::0;;;10703:22:4::1;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;10618:147;-1:-1:-1::0;10496:3:4::1;::::0;;::::1;::::0;10438:341:::1;;;-1:-1:-1::0;;10792:21:4::1;:36:::0;;;10842:18:::1;:34:::0;;-1:-1:-1;;10842:34:4::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;10890:257:::1;;10927:23;10953:6;10977:1;10961:8;;10972:1;10961:12;10960:18;;;-1:-1:-1::0;;;10960:18:4::1;;;;;;;;;;10953:26;;;;;-1:-1:-1::0;;;10953:26:4::1;;;;;;;;;;;;10927:52;;11017:9;:20;;;:34;;;10997:9;:17;;:54;;;;11069:63;11087:9;:18;;;:33;;;11122:9;11069:17;:63::i;:::-;10890:257;;-1:-1:-1::0;;11160:13:4::1;:26:::0;;;::::1;11176:10;11160:26;::::0;;-1:-1:-1;;11232:12:4::1;::::0;11214:15:::1;:30;11200:11;:44:::0;-1:-1:-1;;;;6787:4474:4:o;3520:878::-;3692:21;;3614:4;;3717:1;:19;;3692:45;3683:82;;;;-1:-1:-1;;;3683:82:4;;10813:2:7;3683:82:4;;;10795:21:7;10852:2;10832:18;;;10825:30;10891:19;10871:18;;;10864:47;10928:18;;3683:82:4;10785:167:7;3683:82:4;3837:18;;3799:28;;3830:6;;3837:18;;:50;;3879:8;;3837:50;;;3875:1;3859:8;;3870:1;3859:12;3858:18;;;-1:-1:-1;;;3858:18:4;;;;;;;;;;3837:50;3830:58;;;;;-1:-1:-1;;;3830:58:4;;;;;;;;;;;;3799:89;;3902:39;3944:19;3964:14;3944:35;;;;;-1:-1:-1;;;3944:35:4;;;;;;;;;;;;3902:77;;3993:20;4056:1;4076:17;;4111:37;4128:15;;;;;;;;;;;4146:1;4128:19;426:6:6;511:1;484;488:18;484:22;483:29;;;;477:1;450;454:18;450:22;449:29;;;;448:65;444:69;;591:2;564:1;568:18;564:22;563:30;;;;556:2;529:1;533:18;529:22;528:30;;;;527:67;523:71;;629:2;624:1;:7;;;;617:2;612:1;:7;;;;611:21;604:28;;373:266;;;;4111:37:4;4016:174;;4961:3:7;4957:16;;;;4975:66;4953:89;4016:174:4;;;4941:102:7;5059:11;;;5052:27;;;;5117:3;5113:16;5131:66;5109:89;5095:12;;;5088:111;-1:-1:-1;5215:12:7;;;5208:60;5284:12;;4016:174:4;;;;;;;;;;;;3993:197;;4205:12;4219:11;4245:7;4234:38;;;;;;;;;;;;:::i;:::-;4204:68;;;;4293:7;-1:-1:-1;;;;;4293:13:4;;4307:14;:19;;4327:14;4307:35;;;;;-1:-1:-1;;;4307:35:4;;;;;;;;;;;4344:11;;4357;;;;4293:88;;;;;;;;;;;;;6169:25:7;;;;6210:18;;;6203:34;;;;6253:18;;;6246:34;6296:18;;;6289:34;;;-1:-1:-1;;6360:79:7;;6339:19;;;6332:108;6141:19;;4293:88:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4286:95;;;;;;;3520:878;;;;:::o;3054:460::-;2498:1;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;3199:11:4::1;;3181:15;:29;3173:81;;;::::0;-1:-1:-1;;;3173:81:4;;7752:2:7;3173:81:4::1;::::0;::::1;7734:21:7::0;7791:2;7771:18;;;7764:30;7830:34;7810:18;;;7803:62;7901:9;7881:18;;;7874:37;7928:19;;3173:81:4::1;7724:229:7::0;3173:81:4::1;3273:49;3307:14;3273:33;:49::i;:::-;3272:50;3264:94;;;::::0;-1:-1:-1;;;3264:94:4;;8971:2:7;3264:94:4::1;::::0;::::1;8953:21:7::0;9010:2;8990:18;;;8983:30;9049:33;9029:18;;;9022:61;9100:18;;3264:94:4::1;8943:181:7::0;3264:94:4::1;3423:13;::::0;3406::::1;::::0;-1:-1:-1;;;;;3406:13:4::1;3396:24;::::0;;;:9:::1;:24;::::0;;;;;:40:::1;::::0;3423:13;3396:40:::1;:::i;:::-;3379:13;::::0;-1:-1:-1;;;;;3379:13:4;;::::1;3369:24;::::0;;;:9:::1;:24;::::0;;;;:67;;;;3464:13:::1;::::0;3446:17;;::::1;::::0;:36:::1;::::0;3464:17:::1;::::0;3480:1:::1;::::0;3464:17:::1;:::i;:::-;3446:36;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;3506:1:4::1;3492:11;:15:::0;-1:-1:-1;;3054:460:4:o;1114:237:0:-;302:5;;1210:12;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;1235:12:::1;1249:18:::0;1271:6:::1;-1:-1:-1::0;;;;;1271:19:0::1;1291:4;1271:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1234:62;;;;1314:7;1306:16;;;::::0;::::1;;1339:5:::0;1114:237;-1:-1:-1;;;;1114:237:0:o;533:127::-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;626:18;;533:127::o;2544:193:4:-;2379:1;380:6:0;;:13;;379:20;;:43;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;2643:13:4::1;;2630:9;:26;:56;;;;-1:-1:-1::0;2670:10:4::1;2660:21;::::0;;;:9:::1;:21;::::0;;;;;:26;2630:56:::1;2622:65;;;::::0;::::1;;-1:-1:-1::0;2707:10:4::1;2697:21;::::0;;;:9:::1;:21;::::0;;;;2721:9:::1;2697:33:::0;;2544:193::o;1054:54:0:-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;1054:54::o;199:268:1:-;-1:-1:-1;;;;;;;;;;;;;;;;;393:2:1;387:8;;377:18;;330:4;429:21;330:4;2119:10:6;;2098:41;429:21:1;419:7;;:31;409:7;;;:41;-1:-1:-1;419:3:1;199:268;-1:-1:-1;199:268:1:o;1535:298:5:-;1612:26;1650:11;1664:16;:4;:14;:16::i;:::-;1650:30;;;;1716:6;1696:27;;;;;;-1:-1:-1;;;1696:27:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;1696:27:5;;-1:-1:-1;;1696:27:5;;;;;;;;;;;;1690:33;;1738:6;1733:94;1754:6;1750:1;:10;1733:94;;;1790:26;:4;:24;:26::i;:::-;1781:3;1785:1;1781:6;;;;;;-1:-1:-1;;;1781:6:5;;;;;;;;;;;;;;:35;;;;1762:3;;;;;:::i;:::-;;;;1733:94;;;;1535:298;;;;:::o;1089:121:1:-;1165:8;;;;1153;;:20;1145:58;;;;-1:-1:-1;;;1145:58:1;;9331:2:7;1145:58:1;;;9313:21:7;9370:2;9350:18;;;9343:30;9409:27;9389:18;;;9382:55;9454:18;;1145:58:1;9303:175:7;1145:58:1;1089:121;:::o;11267:1039:4:-;11385:10;;395:3;11413:26;;;11405:113;;;;-1:-1:-1;;;11405:113:4;;13035:2:7;11405:113:4;;;13017:21:7;13074:2;13054:18;;;13047:30;13113:34;13093:18;;;13086:62;13184:34;13164:18;;;13157:62;13256:12;13235:19;;;13228:41;13286:19;;11405:113:4;13007:304:7;11405:113:4;11528:12;;;:18;;;11585:6;11580:98;11601:3;11597:1;:7;11580:98;;;11645:3;11649:1;11645:6;;;;;;-1:-1:-1;;;11645:6:4;;;;;;;;;;;;;;;:16;;;:18;;;11629:5;:10;;11640:1;11629:13;;;;;-1:-1:-1;;;11629:13:4;;;;;;;;;;:34;11606:3;;11580:98;;;;11691:18;11769:6;11764:469;11786:3;11781:1;:8;11764:469;;11814:14;11831:3;11835:1;11831:6;;;;;;-1:-1:-1;;;11831:6:4;;;;;;;;;;;;;;;:12;;;11814:29;;11875:6;11861:20;;;;;;11910:3;11903;;;;;;:10;11899:137;;;11982:6;11974:15;;11966:24;;;11937:5;:18;;11961:1;11956;:6;;11937:26;;;;;-1:-1:-1;;;11937:26:4;;;;;;;;;;:53;-1:-1:-1;12012:5:4;;11899:137;12053:14;12070:3;12074:1;12070:6;;;;;;-1:-1:-1;;;12070:6:4;;;;;;;;;;;;;;;;;;;;:12;;12100:20;;;;;;;12070:12;;-1:-1:-1;12183:24:4;12191:15;;;;12183:24;12175:42;12138:18;;;12162:1;12157:6;;;12138:26;;;;;-1:-1:-1;;;12138:26:4;;;;;;;;;;:80;-1:-1:-1;;11791:3:4;;11764:469;;;-1:-1:-1;12288:1:4;12283;12270:14;;12269:20;12246:5;:20;;:43;;;;11267:1039;;;;:::o;4292:879:5:-;4371:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4371:27:5;4432:20;:4;:18;:20::i;:::-;4410:42;;4490:20;:4;:18;:20::i;:::-;4462:25;;;:48;4537:33;:4;:31;:33::i;:::-;4520:14;;;:50;4602:20;:4;:18;:20::i;:::-;4580:19;;;:42;4647:35;:4;:33;:35::i;:::-;4632:12;;;:50;4693:11;4707:16;:4;:14;:16::i;:::-;4693:30;;;;4784:6;4760:31;;;;;;-1:-1:-1;;;4760:31:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4760:31:5;;;;;;;;;;;;;;;-1:-1:-1;4733:24:5;;;:58;4806:6;4801:119;4822:6;4818:1;:10;4801:119;;;4879:30;:4;:28;:30::i;:::-;4849:3;:24;;;4874:1;4849:27;;;;;;-1:-1:-1;;;4849:27:5;;;;;;;;;;;;;;:60;;;;4830:3;;;;;:::i;:::-;;;;4801:119;;;;4941:135;4978:66;5002:3;:14;;;:19;;;5023:3;:19;;;4985:58;;;;;;;;4360:19:7;;;4404:2;4395:12;;4388:28;4441:2;4432:12;;4350:100;4985:58:5;;;;-1:-1:-1;;4985:58:5;;;;;;;;;;4978:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5046:19;;4961:105;;;;;;4360:19:7;;;;4395:12;;4388:28;4432:12;;4961:105:5;;;-1:-1:-1;;4961:105:5;;;;;;;;;;4941:135;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4930:8;;;:146;;;5127:25;;;;;5110:53;;5103:61;;5110:53;;4930:146;;5110:53;4360:19:7;;;4404:2;4395:12;;4388:28;4441:2;4432:12;;4350:100;5110:53:5;;;;-1:-1:-1;;5110:53:5;;;;;;;;;;5103:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5087:13;;;:77;-1:-1:-1;5087:3:5;4292:879;-1:-1:-1;4292:879:5:o;1947:138:1:-;2007:6;2032:46;2063:12;:4;2073:1;2063:9;:12::i;:::-;274:21:6;;;;305:10;274:21;300;;;;;;;;;;273:49;357:2;340:7;;;352;;;339:21;;198:169;2032:46:1;2025:53;1947:138;-1:-1:-1;;1947:138:1:o;1091:438:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1229:15:5;:4;:13;:15::i;:::-;1203:41;;1254:16;:4;:14;:16::i;:::-;1296:22;:4;:20;:22::i;:::-;1280:38;;1340:17;:4;:15;:17::i;:::-;1328:29;;:9;;;:29;1371:33;;;255:1;1371:33;1367:156;;;1438:15;:4;:13;:15::i;:::-;:20;;;;1420:15;;;:38;1367:156;;;1507:5;1489:15;;;:23;1091:438;;;;:::o;2651:110:1:-;2715:7;2741:13;:4;2751:2;2741:9;:13::i;3391:572:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3556:20:5;:4;3572:3;3556:15;:20::i;:::-;3545:8;;;:31;3599:16;:4;:14;:16::i;:::-;3586:29;;;;3640:20;:4;:18;:20::i;:::-;3625:12;;;:35;3690:20;:4;:18;:20::i;:::-;3670:17;;;:40;3742:20;:4;:18;:20::i;:::-;3720:19;;;:42;3791:20;:4;:18;:20::i;:::-;3772:16;;;:39;3837:16;:4;:14;:16::i;:::-;3821:32;;:13;;;:32;3882:20;:4;:18;:20::i;:::-;3863:16;;;:39;3936:20;:4;:18;:20::i;:::-;3912:21;;;:44;:3;3391:572;-1:-1:-1;3391:572:5:o;1996:389::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;2165:17:5;:4;:15;:17::i;:::-;2154:28;;;;;2192:187;;2233:8;;2276:27;2233:4;2276:25;:27::i;:::-;2255:18;;;:48;2351:8;;2328:40;;2344:5;;2351:16;;2344:5;;2351:16;:::i;:::-;2328:15;:40::i;:::-;2317:8;;;:51;-1:-1:-1;1996:389:5;;;:::o;2477:241::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2608:17:5;:4;:15;:17::i;:::-;2597:28;;;;;2635:77;;2679:22;:4;:20;:22::i;:::-;2663:13;;;:38;2477:241;;;:::o;827:256:1:-;895:11;918:25;:4;936:6;918:17;:25::i;:::-;-1:-1:-1;984:8:1;;2119:10:6;;1028:18:1;;;;;2119:10:6;827:256:1:o;1680:117::-;1739:5;1776:12;:4;1786:1;1776:9;:12::i;:::-;1763:27;;;1680:117;-1:-1:-1;;1680:117:1:o;2965:195::-;3026:11;3040:16;:4;:14;:16::i;:::-;3026:30;;;;3066:25;3084:6;3066:4;:17;;:25;;;;:::i;:::-;3125:18;;;;;2965:195::o;312:211:5:-;-1:-1:-1;;;;;;;;;;;;424:15:5;:4;:13;:15::i;:::-;:20;;;416:62;;;;-1:-1:-1;;;416:62:5;;7039:2:7;416:62:5;;;7021:21:7;7078:2;7058:18;;;7051:30;7117:31;7097:18;;;7090:59;7166:18;;416:62:5;7011:179:7;416:62:5;496:20;:4;:18;:20::i;:::-;488:28;;:3;312:211;-1:-1:-1;312:211:5:o;2235:144:1:-;2296:7;2322:50;2356:13;:4;2366:2;2356:9;:13::i;:::-;836:38:6;724:45;;;;836:38;;;;774:45;;;;;836:38;;;;930:2;835:46;;;887:38;;;;;;;;;;;;;;886:46;;;834:99;1043:2;948:46;;;1004:34;948:46;999;;;;;;;;;947:99;1081:2;1064:7;;;1076;;;1063:21;;645:446;1499:175:1;1573:7;1592:25;:4;1610:6;1592:17;:25::i;:::-;1650:8;;1634:33;;1660:6;1634:15;:33::i;:::-;1627:40;1499:175;-1:-1:-1;;;1499:175:1:o;2091:138::-;2151:6;2176:46;2207:12;:4;2217:1;2207:9;:12::i;:::-;564:22:6;483:29;;;;564:22;;;;449:29;;;;;564:22;;;;591:2;563:30;;;529:22;;;;;;;;;;;;;;528:30;;;527:67;629:2;624:7;;;;;612;;;;;611:21;;373:266;2767:192:1;2828:4;2844:9;2856:15;:4;:13;:15::i;:::-;2844:27;;2896:1;2889:3;:8;;;;2881:46;;;;-1:-1:-1;;;2881:46:1;;11159:2:7;2881:46:1;;;11141:21:7;11198:2;11178:18;;;11171:30;11237:27;11217:18;;;11210:55;11282:18;;2881:46:1;11131:175:7;2881:46:1;2944:8;;;;;2767:192;-1:-1:-1;;2767:192:1:o;3391:502:6:-;3456:11;3684:2;3681:1;3673:6;3668:3;3665:1;3658:5;3647:40;3822:27;3837:3;3822:27;;;;;-1:-1:-1;;3875:1:6;3869:8;;3488:399;-1:-1:-1;;3488:399:6:o;597:255:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;709:15:5;:4;:13;:15::i;:::-;:20;;;701:68;;;;-1:-1:-1;;;701:68:5;;8567:2:7;701:68:5;;;8549:21:7;8606:2;8586:18;;;8579:30;8645:34;8625:18;;;8618:62;8716:5;8696:18;;;8689:33;8739:19;;701:68:5;8539:225:7;701:68:5;787:20;:4;:18;:20::i;:::-;779:28;;825:20;:4;:18;:20::i;634:187:1:-;764:8;;;;743;;:17;;:29;;735:69;;;;-1:-1:-1;;;735:69:1;;11859:2:7;735:69:1;;;11841:21:7;11898:2;11878:18;;;11871:30;11937:29;11917:18;;;11910:57;11984:18;;735:69:1;11831:177:7;735:69:1;634:187;;:::o;14:738:7:-;;109:3;102:4;94:6;90:17;86:27;76:2;;131:5;124;117:20;76:2;171:6;158:20;197:18;234:2;230;227:10;224:2;;;240:18;;:::i;:::-;315:2;309:9;283:2;369:13;;-1:-1:-1;;365:22:7;;;389:2;361:31;357:40;345:53;;;413:18;;;433:22;;;410:46;407:2;;;459:18;;:::i;:::-;499:10;495:2;488:22;534:2;526:6;519:18;580:3;573:4;568:2;560:6;556:15;552:26;549:35;546:2;;;601:5;594;587:20;546:2;669;662:4;654:6;650:17;643:4;635:6;631:17;618:54;692:15;;;709:4;688:26;681:41;;;;-1:-1:-1;696:6:7;66:686;-1:-1:-1;;;66:686:7:o;757:257::-;;869:2;857:9;848:7;844:23;840:32;837:2;;;890:6;882;875:22;837:2;934:9;921:23;953:31;978:5;953:31;:::i;1019:333::-;;;1156:2;1144:9;1135:7;1131:23;1127:32;1124:2;;;1177:6;1169;1162:22;1124:2;1221:9;1208:23;1240:31;1265:5;1240:31;:::i;:::-;1290:5;1342:2;1327:18;;;;1314:32;;-1:-1:-1;;;1114:238:7:o;1357:475::-;;;1495:2;1483:9;1474:7;1470:23;1466:32;1463:2;;;1516:6;1508;1501:22;1463:2;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;-1:-1:-1;1685:2:7;1670:18;;1657:32;1712:18;1701:30;;1698:2;;;1749:6;1741;1734:22;1698:2;1777:49;1818:7;1809:6;1798:9;1794:22;1777:49;:::i;:::-;1767:59;;;1453:379;;;;;:::o;1837:297::-;;1957:2;1945:9;1936:7;1932:23;1928:32;1925:2;;;1978:6;1970;1963:22;1925:2;2015:9;2009:16;2068:5;2061:13;2054:21;2047:5;2044:32;2034:2;;2095:6;2087;2080:22;2139:194;;2262:2;2250:9;2241:7;2237:23;2233:32;2230:2;;;2283:6;2275;2268:22;2230:2;-1:-1:-1;2311:16:7;;2220:113;-1:-1:-1;2220:113:7:o;2338:417::-;;;2477:2;2465:9;2456:7;2452:23;2448:32;2445:2;;;2498:6;2490;2483:22;2445:2;2532:9;2526:16;2516:26;;2585:2;2574:9;2570:18;2564:25;-1:-1:-1;;2622:5:7;2618:78;2611:5;2608:89;2598:2;;2716:6;2708;2701:22;2598:2;2744:5;2734:15;;;2435:320;;;;;:::o;2760:340::-;;2881:2;2869:9;2860:7;2856:23;2852:32;2849:2;;;2902:6;2894;2887:22;2849:2;2947:9;2934:23;2980:18;2972:6;2969:30;2966:2;;;3017:6;3009;3002:22;2966:2;3045:49;3086:7;3077:6;3066:9;3062:22;3045:49;:::i;3105:190::-;;3217:2;3205:9;3196:7;3192:23;3188:32;3185:2;;;3238:6;3230;3223:22;3185:2;-1:-1:-1;3266:23:7;;3175:120;-1:-1:-1;3175:120:7:o;3300:258::-;;;3429:2;3417:9;3408:7;3404:23;3400:32;3397:2;;;3450:6;3442;3435:22;3397:2;-1:-1:-1;;3478:23:7;;;3548:2;3533:18;;;3520:32;;-1:-1:-1;3387:171:7:o;3563:326::-;;;;3709:2;3697:9;3688:7;3684:23;3680:32;3677:2;;;3730:6;3722;3715:22;3677:2;-1:-1:-1;;3758:23:7;;;3828:2;3813:18;;3800:32;;-1:-1:-1;3879:2:7;3864:18;;;3851:32;;3667:222;-1:-1:-1;3667:222:7:o;3894:304::-;;4005:2;3993:9;3984:7;3980:23;3976:32;3973:2;;;4026:6;4018;4011:22;3973:2;4070:9;4057:23;4120:18;4113:5;4109:30;4102:5;4099:41;4089:2;;4159:6;4151;4144:22;4455:274;;4622:6;4616:13;4638:53;4684:6;4679:3;4672:4;4664:6;4660:17;4638:53;:::i;:::-;4707:16;;;;;4592:137;-1:-1:-1;;4592:137:7:o;6451:381::-;;6598:2;6587:9;6580:21;6630:6;6624:13;6673:6;6668:2;6657:9;6653:18;6646:34;6689:66;6748:6;6743:2;6732:9;6728:18;6723:2;6715:6;6711:15;6689:66;:::i;:::-;6816:2;6795:15;-1:-1:-1;;6791:29:7;6776:45;;;;6823:2;6772:54;;6570:262;-1:-1:-1;;6570:262:7:o;15042:274::-;;15108:1;15098:2;;-1:-1:-1;;;15140:1:7;15133:88;15244:4;15241:1;15234:15;15272:4;15269:1;15262:15;15098:2;-1:-1:-1;15301:9:7;;15088:228::o;15321:125::-;;15389:1;15386;15383:8;15380:2;;;15394:18;;:::i;:::-;-1:-1:-1;15431:9:7;;15370:76::o;15451:258::-;15523:1;15533:113;15547:6;15544:1;15541:13;15533:113;;;15623:11;;;15617:18;15604:11;;;15597:39;15569:2;15562:10;15533:113;;;15664:6;15661:1;15658:13;15655:2;;;15699:1;15690:6;15685:3;15681:16;15674:27;15655:2;;15504:205;;;:::o;15714:135::-;;-1:-1:-1;;15774:17:7;;15771:2;;;15794:18;;:::i;:::-;-1:-1:-1;15841:1:7;15830:13;;15761:88::o;15854:184::-;-1:-1:-1;;;15903:1:7;15896:88;16003:4;16000:1;15993:15;16027:4;16024:1;16017:15;16043:184;-1:-1:-1;;;16092:1:7;16085:88;16192:4;16189:1;16182:15;16216:4;16213:1;16206:15;16232:154;-1:-1:-1;;;;;16311:5:7;16307:54;16300:5;16297:65;16287:2;;16376:1;16373;16366:12
Swarm Source
ipfs://c4e6e79813650f87983cecaaecad09dcd9553de5fd09d0482a231f30c6db1fc8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,273.43 | 10 | $32,734.26 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.