Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
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:
Layer2
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-11 */ // File: contracts/lib/SafeMath.sol pragma solidity ^0.5.12; /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two numbers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0); // Solidity only automatically asserts when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } /** * @dev Multiplies two numbers, reverts on overflow. */ function mul64(uint64 a, uint64 b) internal pure returns (uint64) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint64 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div64(uint64 a, uint64 b) internal pure returns (uint64) { require(b > 0); // Solidity only automatically asserts when dividing by 0 uint64 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub64(uint64 a, uint64 b) internal pure returns (uint64) { require(b <= a); uint64 c = a - b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add64(uint64 a, uint64 b) internal pure returns (uint64) { uint64 c = a + b; require(c >= a); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod64(uint64 a, uint64 b) internal pure returns (uint64) { require(b != 0); return a % b; } } // File: contracts/lib/Math.sol pragma solidity ^0.5.12; /** * @title Math * @dev Assorted math operations */ library Math { function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } // return ceil(n/d) function divCeil(uint256 n, uint256 d) internal pure returns (uint256) { return n % d == 0 ? n / d : n / d + 1; } } // File: contracts/lib/RLP.sol pragma solidity ^0.5.12; /** * @title RLPReader * @dev RLPReader is used to read and parse RLP encoded data in memory. * @author Andreas Olofsson ([email protected]) */ library RLP { uint constant DATA_SHORT_START = 0x80; uint constant DATA_LONG_START = 0xB8; uint constant LIST_SHORT_START = 0xC0; uint constant LIST_LONG_START = 0xF8; uint constant DATA_LONG_OFFSET = 0xB7; uint constant LIST_LONG_OFFSET = 0xF7; struct RLPItem { uint _unsafeMemPtr; // Pointer to the RLP-encoded bytes. uint _unsafeLength; // Number of bytes. This is the full length of the string. } struct Iterator { RLPItem _unsafeItem; // Item that's being iterated over. uint _unsafeNextPtr; // Position of the next item in the list. } /* RLPItem */ /// @dev Creates an RLPItem from an array of RLP encoded bytes. /// @param self The RLP encoded bytes. /// @return An RLPItem function toRLPItem(bytes memory self) internal pure returns (RLPItem memory) { uint len = self.length; uint memPtr; assembly { memPtr := add(self, 0x20) } return RLPItem(memPtr, len); } /// @dev Get the list of sub-items from an RLP encoded list. /// Warning: This requires passing in the number of items. /// @param self The RLP item. /// @return Array of RLPItems. function toList(RLPItem memory self, uint256 numItems) internal pure returns (RLPItem[] memory list) { list = new RLPItem[](numItems); Iterator memory it = iterator(self); uint idx; while (idx < numItems) { list[idx] = next(it); idx++; } } /// @dev Decode an RLPItem into a uint. This will not work if the /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. function toUint(RLPItem memory self) internal pure returns (uint data) { (uint rStartPos, uint len) = _decode(self); assembly { data := div(mload(rStartPos), exp(256, sub(32, len))) } } /// @dev Decode an RLPItem into an address. This will not work if the /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. function toAddress(RLPItem memory self) internal pure returns (address data) { (uint rStartPos,) = _decode(self); assembly { data := div(mload(rStartPos), exp(256, 12)) } } /// @dev Create an iterator. /// @param self The RLP item. /// @return An 'Iterator' over the item. function iterator(RLPItem memory self) private pure returns (Iterator memory it) { uint ptr = self._unsafeMemPtr + _payloadOffset(self); it._unsafeItem = self; it._unsafeNextPtr = ptr; } /* Iterator */ function next(Iterator memory self) private pure returns (RLPItem memory subItem) { uint ptr = self._unsafeNextPtr; uint itemLength = _itemLength(ptr); subItem._unsafeMemPtr = ptr; subItem._unsafeLength = itemLength; self._unsafeNextPtr = ptr + itemLength; } function hasNext(Iterator memory self) private pure returns (bool) { RLPItem memory item = self._unsafeItem; return self._unsafeNextPtr < item._unsafeMemPtr + item._unsafeLength; } // Get the payload offset. function _payloadOffset(RLPItem memory self) private pure returns (uint) { uint b0; uint memPtr = self._unsafeMemPtr; assembly { b0 := byte(0, mload(memPtr)) } if (b0 < DATA_SHORT_START) return 0; if (b0 < DATA_LONG_START || (b0 >= LIST_SHORT_START && b0 < LIST_LONG_START)) return 1; if (b0 < LIST_SHORT_START) return b0 - DATA_LONG_OFFSET + 1; return b0 - LIST_LONG_OFFSET + 1; } // Get the full length of an RLP item. function _itemLength(uint memPtr) private pure returns (uint len) { uint b0; assembly { b0 := byte(0, mload(memPtr)) } if (b0 < DATA_SHORT_START) len = 1; else if (b0 < DATA_LONG_START) len = b0 - DATA_SHORT_START + 1; } // Get start position and length of the data. function _decode(RLPItem memory self) private pure returns (uint memPtr, uint len) { uint b0; uint start = self._unsafeMemPtr; assembly { b0 := byte(0, mload(start)) } if (b0 < DATA_SHORT_START) { memPtr = start; len = 1; return (memPtr, len); } if (b0 < DATA_LONG_START) { len = self._unsafeLength - 1; memPtr = start + 1; } else { uint bLen; assembly { bLen := sub(b0, 0xB7) // DATA_LONG_OFFSET } len = self._unsafeLength - 1 - bLen; memPtr = start + bLen + 1; } return (memPtr, len); } /// @dev Return the RLP encoded bytes. /// @param self The RLPItem. /// @return The bytes. function toBytes(RLPItem memory self) internal pure returns (bytes memory bts) { uint len = self._unsafeLength; if (len == 0) return bts; bts = new bytes(len); _copyToBytes(self._unsafeMemPtr, bts, len); } // Assumes that enough memory has been allocated to store in target. function _copyToBytes(uint btsPtr, bytes memory tgt, uint btsLen) private pure { // Exploiting the fact that 'tgt' was the last thing to be allocated, // we can write entire words, and just overwrite any excess. assembly { { // evm operations on words let words := div(add(btsLen, 31), 32) let rOffset := btsPtr let wOffset := add(tgt, 0x20) for { let i := 0 } // start at arr + 0x20 -> first byte corresponds to length lt(i, words) { i := add(i, 1) } { let offset := mul(i, 0x20) mstore(add(wOffset, offset), mload(add(rOffset, offset))) } mstore(add(tgt, add(0x20, mload(tgt))), 0) } } } } // File: contracts/lib/RLPEncode.sol pragma solidity ^0.5.12; /** * @title A simple RLP encoding library * @author Bakaoh */ library RLPEncode { uint8 constant STRING_OFFSET = 0x80; uint8 constant LIST_OFFSET = 0xc0; /** * @notice Encode string item * @param self The string (ie. byte array) item to encode * @return The RLP encoded string in bytes */ function encodeBytes(bytes memory self) internal pure returns (bytes memory) { if (self.length == 1 && self[0] <= 0x7f) { return self; } return mergeBytes(encodeLength(self.length, STRING_OFFSET), self); } /** * @notice Encode address * @param self The address to encode * @return The RLP encoded address in bytes */ function encodeAddress(address self) internal pure returns (bytes memory) { bytes memory b; assembly { let m := mload(0x40) mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, self)) mstore(0x40, add(m, 52)) b := m } return encodeBytes(b); } /** * @notice Encode uint * @param self The uint to encode * @return The RLP encoded uint in bytes */ function encodeUint(uint self) internal pure returns (bytes memory) { return encodeBytes(toBinary(self)); } /** * @notice Encode int * @param self The int to encode * @return The RLP encoded int in bytes */ function encodeInt(int self) internal pure returns (bytes memory) { return encodeUint(uint(self)); } /** * @notice Encode bool * @param self The bool to encode * @return The RLP encoded bool in bytes */ function encodeBool(bool self) internal pure returns (bytes memory) { bytes memory rs = new bytes(1); if (self) { rs[0] = bytes1(uint8(1)); } return rs; } /** * @notice Encode list of items * @param self The list of items to encode, each item in list must be already encoded * @return The RLP encoded list of items in bytes */ function encodeList(bytes[] memory self) internal pure returns (bytes memory) { bytes memory payload = new bytes(0); for (uint i = 0; i < self.length; i++) { payload = mergeBytes(payload, self[i]); } return mergeBytes(encodeLength(payload.length, LIST_OFFSET), payload); } /** * @notice Concat two bytes arrays * @dev This should be optimize with assembly to save gas costs * @param param1 The first bytes array * @param param2 The second bytes array * @return The merged bytes array */ function mergeBytes(bytes memory param1, bytes memory param2) internal pure returns (bytes memory) { bytes memory merged = new bytes(param1.length + param2.length); uint k = 0; uint i; for (i = 0; i < param1.length; i++) { merged[k] = param1[i]; k++; } for (i = 0; i < param2.length; i++) { merged[k] = param2[i]; k++; } return merged; } /** * @notice Encode the first byte, followed by the `length` in binary form if `length` is more than 55. * @param length The length of the string or the payload * @param offset `STRING_OFFSET` if item is string, `LIST_OFFSET` if item is list * @return RLP encoded bytes */ function encodeLength(uint length, uint offset) internal pure returns (bytes memory) { require(length < 256**8, "input too long"); bytes memory rs = new bytes(1); if (length <= 55) { rs[0] = byte(uint8(length + offset)); return rs; } bytes memory bl = toBinary(length); rs[0] = byte(uint8(bl.length + offset + 55)); return mergeBytes(rs, bl); } /** * @notice Encode integer in big endian binary form with no leading zeroes * @dev This should be optimize with assembly to save gas costs * @param x The integer to encode * @return RLP encoded bytes */ function toBinary(uint x) internal pure returns (bytes memory) { uint i; bytes memory b = new bytes(32); assembly { mstore(add(b, 32), x) } for (i = 0; i < 32; i++) { if (b[i] != 0) { break; } } bytes memory rs = new bytes(32 - i); for (uint j = 0; j < rs.length; j++) { rs[j] = b[i++]; } return rs; } } // File: contracts/lib/BMT.sol pragma solidity ^0.5.12; library BMT { // TODO: remove recursive call function getRoot(bytes32[] memory level) internal view returns (bytes32) { if (level.length == 1) return level[0]; bytes32[] memory nextLevel = new bytes32[]((level.length + 1) / 2); uint i; for (; i + 1 < level.length; i += 2) { nextLevel[i/2] = keccak256(abi.encodePacked(level[i], level[i+1])); } if (level.length % 2 == 1) { nextLevel[i/2] = keccak256( abi.encodePacked(level[level.length - 1], level[level.length - 1]) ); } return getRoot(nextLevel); } function checkMembership( bytes32 leaf, uint256 index, bytes32 rootHash, bytes memory proof ) internal pure returns (bool) { require(proof.length % 32 == 0); uint256 numElements = proof.length / 32; require(numElements < 16); bytes32 proofElement; bytes32 computedHash = leaf; for (uint256 i = 32; i <= 32 * numElements; i += 32) { assembly { proofElement := mload(add(proof, i)) } if (index % 2 == 0) { computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } index = index / 2; } return computedHash == rootHash; } } // File: contracts/RequestableI.sol pragma solidity ^0.5.12; interface RequestableI { function applyRequestInRootChain( bool isExit, uint256 requestId, address requestor, bytes32 trieKey, bytes calldata trieValue ) external returns (bool success); function applyRequestInChildChain( bool isExit, uint256 requestId, address requestor, bytes32 trieKey, bytes calldata trieValue ) external returns (bool success); } // File: contracts/lib/Data.sol pragma solidity ^0.5.12; // import "../patricia_tree/PatriciaTree.sol"; // use binary merkle tree library Data { using SafeMath for uint; using SafeMath for uint64; using Math for *; using RLP for *; using RLPEncode for *; using BMT for *; // solium-disable max-len bytes4 public constant APPLY_IN_CHILDCHAIN_SIGNATURE = bytes4(keccak256("applyRequestInChildChain(bool,uint256,address,bytes32,bytes)")); bytes4 public constant APPLY_IN_ROOTCHAIN_SIGNATURE = bytes4(keccak256("applyRequestInRootChain(bool,uint256,address,bytes32,bytes)")); // solium-enable max-len address public constant NA = address(0); uint public constant NA_TX_GAS_PRICE = 1e9; uint public constant NA_TX_GAS_LIMIT = 100000; // How many requests can be included in a single request block function MAX_REQUESTS() internal pure returns (uint) { // TODO: use 100 in production mode // return 1000; return 20; } // Timeout for URB submission function URE_TIMEOUT() internal pure returns (uint) { return 1 hours; } function decodePos(uint _pos) internal pure returns (uint v1, uint v2) { assembly { v1 := div(_pos, exp(2, 128)) v2 := and(_pos, sub(exp(2, 128), 1)) } } /** * highestFinalizedBlock * firstEpochNumber * blockToRenew 0 means no renew required * forkedBlock forked block number due to URB submission * last finalized block is forkedBlockNumber - 1 * urbEpochNumber * lastEpoch * lastBlock * lastFinalizedBlock * timestamp * firstEnterEpoch epoch number of first enter request epoch * lastEnterEpoch epoch number of last enter request epoch * nextBlockToRebase * rebased true if all blocks are rebased * epochs epochs in this fork * blocks blocks in this fork */ struct Fork { // uint64 blockToRenew; uint64 forkedBlock; // TODO: change to forkedEpoch uint64 firstEpoch; uint64 lastEpoch; uint64 firstBlock; uint64 lastBlock; uint64 lastFinalizedEpoch; uint64 lastFinalizedBlock; uint64 timestamp; uint64 firstEnterEpoch; uint64 lastEnterEpoch; uint64 nextBlockToRebase; bool rebased; mapping (uint => Epoch) epochs; mapping (uint => PlasmaBlock) blocks; } function getForkedEpoch(Fork storage self) internal view returns (uint64) { require(self.forkedBlock != 0); return self.blocks[self.forkedBlock].epochNumber; } /** * @notice Insert a block (ORB / NRB) into the fork. */ function insertBlock( Fork storage _f, bytes32 _statesRoot, bytes32 _transactionsRoot, bytes32 _receiptsRoot, bool _isRequest, bool _userActivated, bool _rebase ) internal returns (uint epochNumber, uint blockNumber) { epochNumber = _f.lastEpoch; blockNumber = _f.lastBlock.add(1); Data.Epoch storage epoch = _f.epochs[epochNumber]; if (blockNumber == epoch.endBlockNumber + 1) { epochNumber += 1; _f.lastEpoch = uint64(epochNumber); epoch = _f.epochs[epochNumber]; } require(epoch.startBlockNumber <= blockNumber); require(_rebase || epoch.endBlockNumber >= blockNumber); require(epoch.isRequest == _isRequest); require(epoch.userActivated == _userActivated); Data.PlasmaBlock storage b = _f.blocks[blockNumber]; b.epochNumber = uint64(epochNumber); b.statesRoot = _statesRoot; b.transactionsRoot = _transactionsRoot; b.receiptsRoot = _receiptsRoot; b.timestamp = uint64(block.timestamp); b.isRequest = _isRequest; b.userActivated = _userActivated; if (_isRequest) { b.requestBlockId = uint64(epoch.RE.firstRequestBlockId + blockNumber - epoch.startBlockNumber); } _f.lastBlock = uint64(blockNumber); return (epochNumber, blockNumber); } /** * TODO: implement insert rebased non-request epoch * @notice Insert non-request epoch into the fork. */ function insertNRE( Fork storage _f, uint _epochNumber, bytes32 _epochStateRoot, bytes32 _epochTransactionsRoot, bytes32 _epochReceiptsRoot, uint _startBlockNumber, uint _endBlockNumber ) internal { require(_f.lastEpoch.add(1) == _epochNumber); require(_f.lastBlock.add(1) == _startBlockNumber); Data.Epoch storage epoch = _f.epochs[_epochNumber]; require(!epoch.isRequest); require(!epoch.userActivated); require(!epoch.rebase); require(epoch.startBlockNumber == _startBlockNumber); require(epoch.endBlockNumber == _endBlockNumber); epoch.NRE.epochStateRoot = _epochStateRoot; epoch.NRE.epochTransactionsRoot = _epochTransactionsRoot; epoch.NRE.epochReceiptsRoot = _epochReceiptsRoot; epoch.NRE.submittedAt = uint64(block.timestamp); _f.lastEpoch = uint64(_epochNumber); _f.lastBlock = uint64(_endBlockNumber); } function getLastEpochNumber(Fork storage _f, bool _isRequest) internal returns (uint) { if (_f.epochs[_f.lastEpoch].isRequest == _isRequest) { return _f.lastEpoch; } return _f.lastEpoch - 1; } // function getFirstNotFinalizedEpochNumber(Fork storage _f, bool _isRequest) internal returns (uint) { // if (_f.epochs[_f.lastEpoch].isRequest == _isRequest) { // return _f.lastEpoch; // } // return _f.lastEpoch - 1; // } /** * @notice Update nextBlockToRebase to next request block containing enter request. * If all ORBs are rebased, return true. */ function checkNextORBToRebase( Fork storage _cur, Fork storage _pre, RequestBlock[] storage _rbs ) internal returns (bool finished) { uint blockNumber = _cur.nextBlockToRebase; uint epochNumber = _pre.blocks[_cur.nextBlockToRebase].epochNumber; // uint lastEpochNumber = getLastEpochNumber(_pre, true); while (_pre.epochs[epochNumber].initialized) { // at the end of epoch if (_pre.epochs[epochNumber].endBlockNumber <= blockNumber) { epochNumber += 2; blockNumber = _pre.epochs[epochNumber].startBlockNumber; } // skip until epoch has enter request while (_pre.epochs[epochNumber].RE.numEnter == 0 && _pre.epochs[epochNumber].initialized) { epochNumber += 2; blockNumber = _pre.epochs[epochNumber].startBlockNumber; } // short circuit if all OREs are empty or has no enter if (!_pre.epochs[epochNumber].initialized) { return true; } // skip blocks without enter request uint endBlockNumber = _pre.epochs[epochNumber].endBlockNumber; while (blockNumber <= endBlockNumber) { if (_rbs[_pre.blocks[blockNumber].requestBlockId].numEnter > 0) { break; } blockNumber += 1; } // continue if there is no block containing enter request if (blockNumber > endBlockNumber) { epochNumber += 2; blockNumber = _pre.epochs[epochNumber].startBlockNumber; continue; } // target block number is found _cur.nextBlockToRebase = uint64(blockNumber); return false; } // ready to prepare NRE return true; } /** * @notice Update nextBlockToRebase to next non request block * If all NRBs are rebased, return true. * TODO What if no ORE' ? */ function checkNextNRBToRebase( Fork storage _cur, Fork storage _pre ) internal returns (bool finished) { uint blockNumber = _cur.nextBlockToRebase; uint epochNumber = _pre.blocks[blockNumber].epochNumber; // at the end of epoch if (_pre.epochs[epochNumber].endBlockNumber <= blockNumber) { epochNumber += 2; blockNumber = _pre.epochs[epochNumber].startBlockNumber; } else { blockNumber += 1; } // short circit if all NRE's are rebased if (!_pre.epochs[epochNumber].initialized) { _cur.nextBlockToRebase = 0; return true; } // short circuit if block is not submitted if (_pre.blocks[blockNumber].timestamp == 0) { _cur.nextBlockToRebase = 0; return true; } _cur.nextBlockToRebase = uint64(blockNumber); return false; } /** * * startBlockNumber first block number of the epoch. * endBlockNumber last block number of the epoch. 0 if the epoch is ORE' / NRE' until ORE' is filled. * timestamp timestamp when the epoch is initialized. * required for URB / ORB * epochStateRoot merkle root of [block.stateRoot] for block in the epoch. * epochTransactionsRoot merkle root of [block.transactionsRoot] for block in the epoch. * epochReceiptsRoot merkle root of [block.receiptsRoot] for block in the epoch. * isEmpty true if request epoch has no request block * also and requestStart == requestEnd == previousEpoch.RE.requestEnd * and startBlockNumber == endBlockNumber == previousEpoch.endBlockNumber * and firstRequestBlockId == previousEpoch.firstRequestBlockId * initialized true if epoch is initialized * isRequest true in case of URB / ORB * userActivated true in case of URB * rebase true in case of ORE' or NRE' */ struct Epoch { uint64 startBlockNumber; uint64 endBlockNumber; uint64 timestamp; bool isEmpty; bool initialized; bool isRequest; bool userActivated; bool rebase; RequestEpochMeta RE; NonRequestEpochMeta NRE; } struct NonRequestEpochMeta { bytes32 epochStateRoot; bytes32 epochTransactionsRoot; bytes32 epochReceiptsRoot; uint64 submittedAt; uint64 finalizedAt; bool finalized; bool challenging; bool challenged; } /** * requestStart first request id. * requestEnd last request id. * firstRequestBlockId first id of RequestBlock[] * if epochs is ORE', copy from last request epoch in previous fork * numEnter number of enter request * nextEnterEpoch next request epoch including enter request * nextEpoch next non-empty request epoch */ struct RequestEpochMeta { uint64 requestStart; uint64 requestEnd; uint64 firstRequestBlockId; uint64 numEnter; uint64 nextEnterEpoch; uint64 nextEpoch; } // function noExit(Epoch storage self) internal returns (bool) { // if (self.rebase) return true; // return self.RE.requestEnd.sub64(self.RE.requestStart).add64(1) == self.RE.firstRequestBlockId; // } function getNumBlocks(Epoch storage _e) internal view returns (uint) { if (_e.isEmpty || _e.rebase && _e.endBlockNumber == 0) return 0; return _e.endBlockNumber + 1 - _e.startBlockNumber; } function getNumRequests(Epoch storage _e) internal view returns (uint) { if (_e.isEmpty || _e.rebase && _e.endBlockNumber == 0) return 0; return _e.RE.requestEnd + 1 - _e.RE.requestStart; } function calcNumBlock(uint _rs, uint _re) internal pure returns (uint) { return _re.sub(_rs).add(1).divCeil(MAX_REQUESTS()); } /** * epochNumber * requestBlockId id of RequestBlock[] * timestamp * referenceBlock block number in previous fork * statesRoot * transactionsRoot * receiptsRoot * isRequest true in case of URB & OR * userActivated true in case of URB * challenged true if it is challenge * challenging true if it is being challenged * finalized true if it is successfully finalize */ struct PlasmaBlock { uint64 epochNumber; uint64 requestBlockId; uint64 timestamp; uint64 finalizedAt; uint64 referenceBlock; bytes32 statesRoot; bytes32 transactionsRoot; bytes32 receiptsRoot; bool isRequest; bool userActivated; bool challenged; bool challenging; bool finalized; } /** * * timestamp * isExit * isTransfer * finalized true if request is finalized * challenged * value ether amount in wei * requestor * to requestable contract in root chain * trieKey * trieValue * hash keccak256 hash of request transaction (in plasma chain) */ struct Request { uint64 timestamp; bool isExit; bool isTransfer; bool finalized; bool challenged; uint128 value; address payable requestor; address to; bytes32 trieKey; bytes32 hash; bytes trieValue; } function applyRequestInRootChain( Request memory self, uint _requestId ) internal returns (bool) { require(gasleft() > NA_TX_GAS_LIMIT + 5000); return RequestableI(self.to).applyRequestInRootChain( self.isExit, _requestId, self.requestor, self.trieKey, self.trieValue ); } function toChildChainRequest( Request memory self, address _to ) internal pure returns (Request memory out) { out.isExit = self.isExit; out.isTransfer = self.isTransfer; out.requestor = self.requestor; // Enter request of EtherToken mints PETH to requestor. if (!self.isExit && self.isTransfer) { out.to = self.requestor; bytes memory b = self.trieValue; uint128 v; assembly { v := mload(add(b, 0x20)) } require(v > 0); // no trieKey and trieValue for EtherToken enter out.value = uint128(v); } else { out.to = _to; out.value = self.value; out.trieKey = self.trieKey; out.trieValue = self.trieValue; } } /** * @notice return tx.data */ function getData( Request memory self, uint _requestId, bool _rootchain ) internal pure returns (bytes memory out) { if (self.isTransfer && !self.isExit) { return out; } bytes4 funcSig = _rootchain ? APPLY_IN_ROOTCHAIN_SIGNATURE : APPLY_IN_CHILDCHAIN_SIGNATURE; out = abi.encodePacked( funcSig, abi.encode( bytes32(uint(self.isExit ? 1 : 0)), _requestId, uint256(uint160(self.requestor)), self.trieKey, self.trieValue ) ); } /** * @notice convert Request to TX */ function toTX( Request memory self, uint _requestId, bool _rootchain ) internal pure returns (TX memory out) { out.gasPrice = NA_TX_GAS_PRICE; out.gasLimit = uint64(NA_TX_GAS_LIMIT); out.to = self.to; out.value = self.value; out.data = getData(self, _requestId, _rootchain); } /** * submitted true if no more request can be inserted * because epoch is initialized * epochNumber non request epoch number where the request is created * requestStart first request id * requestEnd last request id * trie patricia tree contract address */ struct RequestBlock { bool submitted; uint64 numEnter; uint64 epochNumber; uint64 requestStart; uint64 requestEnd; address trie; } // function noExit(RequestBlock storage self) internal returns (bool) { // return self.RE.requestEnd.sub64(self.RE.requestStart).add64(1) == self.RE.firstRequestBlockId; // } function init(RequestBlock storage self) internal { /* use binary merkle tree instead of patricia tree if (self.trie == address(0)) { self.trie = new PatriciaTree(); } */ } function addRequest( RequestBlock storage self, Request storage _rootchainRequest, // request in root chain Request memory _childchainRequest, // request in child chain uint _requestId ) internal { _rootchainRequest.hash = hash(toTX(_childchainRequest, _requestId, false)); /* use binary merkle tree instead of patricia tree require(self.trie != address(0)); uint txIndex = _requestId.sub(self.RE.requestStart); bytes memory key = txIndex.encodeUint(); bytes memory value = toBytes(toTX(_request, _requestId, false)); PatriciaTree(self.trie).insert(key, value); self.transactionsRoot = PatriciaTree(self.trie).getRootHash(); */ } /* * TX for Ethereum transaction */ struct TX { uint64 nonce; uint256 gasPrice; uint64 gasLimit; address to; uint256 value; bytes data; uint256 v; uint256 r; uint256 s; } function isNATX(TX memory self) internal pure returns (bool) { return self.v == 0 && self.r == 0 && self.s == 0; } // function toTX(bytes memory self) internal pure returns (TX memory out) { // RLP.RLPItem[] memory packArr = self.toRLPItem().toList(9); // out.nonce = uint64(packArr[0].toUint()); // out.gasPrice = packArr[1].toUint(); // out.gasLimit = uint64(packArr[2].toUint()); // out.to = packArr[3].toAddress(); // out.value = packArr[4].toUint(); // out.data = packArr[5].toBytes(); // out.v = packArr[6].toUint(); // out.r = packArr[7].toUint(); // out.s = packArr[8].toUint(); // } /** * @notice Convert TX to RLP-encoded bytes */ function toBytes(TX memory self) internal pure returns (bytes memory out) { bytes[] memory packArr = new bytes[](9); packArr[0] = self.nonce.encodeUint(); packArr[1] = self.gasPrice.encodeUint(); packArr[2] = self.gasLimit.encodeUint(); packArr[3] = self.to.encodeAddress(); packArr[4] = self.value.encodeUint(); packArr[5] = self.data.encodeBytes(); packArr[6] = self.v.encodeUint(); packArr[7] = self.r.encodeUint(); packArr[8] = self.s.encodeUint(); return packArr.encodeList(); } function hash(TX memory self) internal pure returns (bytes32) { bytes memory txBytes = toBytes(self); return keccak256(txBytes); } /** * Transaction Receipt */ struct Log { address contractAddress; bytes32[] topics; bytes data; } struct Receipt { uint64 status; uint64 cumulativeGasUsed; bytes bloom; // 2048 bloom bits, byte[256] Log[] logs; } function toReceipt(bytes memory self) internal pure returns (Receipt memory r) { RLP.RLPItem[] memory items = self.toRLPItem().toList(4); r.status = uint64(items[0].toUint()); r.cumulativeGasUsed = uint64(items[1].toUint()); r.bloom = items[2].toBytes(); // TODO: parse Logs r.logs = new Log[](0); } function toReceiptStatus(bytes memory self) internal pure returns (uint) { RLP.RLPItem[] memory items = self.toRLPItem().toList(4); return items[0].toUint(); } /** * Helpers */ /** * @notice Checks transaction root of a request block */ function _checkTxRoot( bytes32 _transactionsRoot, RequestBlock storage _rb, Request[] storage _rs, bool _skipExit ) internal { uint s = _rb.requestStart; uint e = _rb.requestEnd; uint n = _skipExit ? _rb.numEnter : e - s + 1; require(n > 0); bytes32[] memory hashes = new bytes32[](n); // TODO: optimize to reduce gas uint j = s; for (uint i = s; i <= e; i++) { if (!_skipExit || !_rs[i].isExit) { hashes[j - s] = _rs[i].hash; j++; } } require(hashes.getRoot() == _transactionsRoot); /* use binary merkle tree instead of patricia tree Data.RequestBlock storage ORB = ORBs[fork.blocks[blockNumber].requestBlockId]; require(_transactionsRoot == ORB.transactionsRoot); */ } } // File: contracts/lib/Address.sol // https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/utils/Address.sol pragma solidity ^0.5.12; /** * Utility library of inline functions on addresses */ library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: contracts/lib/Roles.sol // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/67bca85/contracts/access/Roles.sol pragma solidity ^0.5.12; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account)); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account)); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0)); return role.bearer[account]; } } // File: contracts/roles/MapperRole.sol pragma solidity ^0.5.12; contract MapperRole { using Roles for Roles.Role; event MapperAdded(address indexed account); event MapperRemoved(address indexed account); Roles.Role private _mappers; constructor () internal { _addMapper(msg.sender); } modifier onlyMapper() { require(isMapper(msg.sender)); _; } function isMapper(address account) public view returns (bool) { return _mappers.has(account); } function addMapper(address account) public onlyMapper { _addMapper(account); } function renounceMapper() public { _removeMapper(msg.sender); } function _addMapper(address account) internal { _mappers.add(account); emit MapperAdded(account); } function _removeMapper(address account) internal { _mappers.remove(account); emit MapperRemoved(account); } } // File: contracts/roles/SubmitterRole.sol pragma solidity ^0.5.12; contract SubmitterRole { using Roles for Roles.Role; event SubmitterAdded(address indexed account); event SubmitterRemoved(address indexed account); Roles.Role private _submitters; constructor () internal { _addSubmitter(msg.sender); } modifier onlySubmitter() { require(isSubmitter(msg.sender)); _; } function isSubmitter(address account) public view returns (bool) { return _submitters.has(account); } function addSubmitter(address account) public onlySubmitter { _addSubmitter(account); } function renounceSubmitter() public { _removeSubmitter(msg.sender); } function _addSubmitter(address account) internal { _submitters.add(account); emit SubmitterAdded(account); } function _removeSubmitter(address account) internal { _submitters.remove(account); emit SubmitterRemoved(account); } } // File: contracts/Layer2Storage.sol pragma solidity ^0.5.12; contract Layer2Storage { /* * Storage */ bool public development; // dev mode address public operator; address public epochHandler; address public submitHandler; address public etherToken; address public seigManager; // 1 epoch = N NRBs or k URBs or k ORBs. // N consecutive NRBs must be submitted in an epoch. In case of request block, // massive requests can be included in k ORBs, and k is determined when // N NRBs are submitted or when preparing URBs submission. uint public NRELength; // Increase for each URB uint public currentFork; // First not-empty request epochs of a fork mapping (uint => uint) public firstFilledORENumber; mapping (uint => Data.Fork) public forks; // Enter & Exit requests for ORB / URB Data.Request[] public EROs; Data.Request[] public ERUs; // Consecutive request block. The fork where they are in is defined in Data.PlasmaBlock Data.RequestBlock[] public ORBs; Data.RequestBlock[] public URBs; // count enter requests for epoch uint public numEnterForORB; // epoch number of last non-empty request epoch. mapping(uint => uint) public lastNonEmptyRequestEpoch; // epoch number of first non-empty request epoch. mapping(uint => uint) public firstNonEmptyRequestEpoch; // Last applied request uint public lastAppliedForkNumber; uint public lastAppliedEpochNumber; uint public lastAppliedBlockNumber; // solium-disable mixedcase uint public EROIdToFinalize; uint public ERUIdToFinalize; // solium-enable mixedcase // uint public finalizableEROId = 2^256 - 1; // uint public finalizableERUId = 2^256 - 1; // Requestable contract address in child chain mapping (address => address) public requestableContracts; /* * Constant */ address constant public NULL_ADDRESS = 0x0000000000000000000000000000000000000000; // Cost parameters for development and test uint public constant COST_ERO = 0; uint public constant COST_ERU = 0; uint public constant COST_URB_PREPARE = 0; uint public constant COST_URB = 0; uint public constant COST_ORB = 0; uint public constant COST_NRB = 0; uint public constant PREPARE_TIMEOUT = 60; // 60 sec for dev // Challenge periods for computation and withholding uint public constant CP_COMPUTATION = 15; // 15 sec for dev uint public constant CP_WITHHOLDING = 20; // 20 sec for dev uint public constant CP_EXIT = 10; // 10 sec for dev // TODO: develop more concrete cost model // Cost parameters for production // uint public constant COST_ERO = 0.1 ether; // cost for invalid exit // uint public constant COST_ERU = 0.2 ether; // cost for fork & rebase // uint public constant COST_URB_PREPARE = 0.1 ether; // cost for URB prepare // uint public constant COST_URB = 0.9 ether; // cost for fork & rebase // uint public constant COST_ORB = 0.1 ether; // cost for invalid computation // uint public constant COST_NRB = 0.1 ether; // cost for invalid computation // uint public constant PREPARE_TIMEOUT = 1 hours; // // Challenge periods for computation and withholding // uint public constant CP_COMPUTATION = 1 days; // uint public constant CP_WITHHOLDING = 7 days; // uint public constant CP_EXIT = 1 days; // Gas limit for request trasaction uint public constant REQUEST_GAS = 100000; bool public constant isLayer2 = true; } // File: contracts/Layer2Event.sol pragma solidity ^0.5.12; contract Layer2Event { event OperatorChanged(address _newOperator); event SessionTimeout(bool userActivated); event Forked(uint newFork, uint epochNumber, uint forkedBlockNumber); /** * epochNumber the number of prepared epoch * startBlockNumber first block number of the epoch. * endBlockNumber last block number of the epoch. It is 0 for ORE' and NRE'. * requestStart first request id of the epoch. * requestEnd last request id of the epoch. * epochIsEmpty true if epoch doesn't have block. * isRequest true for ORE and URE. * userActivated true for URE. */ event EpochPrepared( uint forkNumber, uint epochNumber, uint startBlockNumber, uint endBlockNumber, uint requestStart, uint requestEnd, bool epochIsEmpty, bool isRequest, bool userActivated, bool rebase ); event EpochFilling( uint forkNumber, uint epochNumber ); event EpochFilled( uint forkNumber, uint epochNumber ); event EpochRebased( uint forkNumber, uint epochNumber, uint startBlockNumber, uint endBlockNumber, uint requestStart, uint requestEnd, bool epochIsEmpty, bool isRequest, bool userActivated ); event BlockSubmitted( uint fork, uint epochNumber, uint blockNumber, bool isRequest, bool userActivated ); event RequestCreated( uint requestId, address requestor, address to, uint weiAmount, bytes32 trieKey, bytes trieValue, bool isExit, bool userActivated ); event ERUCreated( uint requestId, address requestor, address to, bytes trieKey, bytes32 trieValue ); event BlockFinalized(uint forkNumber, uint blockNumber); event EpochFinalized( uint forkNumber, uint epochNumber, uint startBlockNumber, uint endBlockNumber ); // emit when exit is finalized. _userActivated is true for ERU event RequestFinalized(uint requestId, bool userActivated); event RequestApplied(uint requestId, bool userActivated); event RequestChallenged(uint requestId, bool userActivated); event RequestableContractMapped(address contractInRootchain, address contractInChildchain); } // File: contracts/Layer2Base.sol pragma solidity ^0.5.12; /** * @notice Layer2Base provides functions to be delegated to other handlers, * EpochHandler, SubmitHandler. */ contract Layer2Base is Layer2Storage, Layer2Event { /** * Constants */ // solium-disable mixedcase // EpochHandler functions bytes4 constant PREPARE_TO_SUTMIBT_ORB_SIG = bytes4(keccak256("prepareORE()")); bytes4 constant PREPARE_TO_SUTMIBT_NRB_SIG = bytes4(keccak256("prepareNRE()")); bytes4 constant PREPARE_TO_SUTMIBT_URB_SIG = bytes4(keccak256("prepareToSubmitURB()")); bytes4 constant PREPARE_ORE_AFTER_URE_SIG = bytes4(keccak256("prepareOREAfterURE()")); bytes4 constant PREPARE_NRE_AFTER_URE_SIG = bytes4(keccak256("prepareNREAfterURE()")); // SubmitHandler functions bytes4 constant SUBMIT_NRE_SIG = bytes4(keccak256("submitNRE(uint256,uint256,bytes32,bytes32,bytes32)")); bytes4 constant SUBMIT_ORB_SIG = bytes4(keccak256("submitORB(uint256,bytes32,bytes32,bytes32)")); bytes4 constant SUBMIT_URB_SIG = bytes4(keccak256("submitURB(uint256,bytes32,bytes32,bytes32)")); // solium-endable mixedcase /** * Functions */ // delegate to epoch handler function _delegatePrepareORE() internal { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_ORB_SIG)); require(success); } // delegate to epoch handler function _delegatePrepareNRE() internal { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_NRB_SIG)); // (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_NRB_SIG)); require(success); } // delegate to epoch handler function _delegatePrepareToSubmitURB() internal { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_URB_SIG)); // (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_NRB_SIG)); require(success); } // delegate to epoch handler function _delegatePrepareOREAfterURE() internal { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_ORE_AFTER_URE_SIG)); require(success); } // delegate to epoch handler function _delegatePrepareNREAfterURE() internal { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_NRE_AFTER_URE_SIG)); require(success); } // delegate to submit handler function _delegateSubmitNRE( uint _pos1, // forknumber + epochNumber uint _pos2, // startBlockNumber + endBlockNumber bytes32 _epochStateRoot, bytes32 _epochTransactionsRoot, bytes32 _epochReceiptsRoot ) internal returns (bool success) { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = submitHandler.delegatecall(abi.encodeWithSelector( SUBMIT_NRE_SIG, _pos1, _pos2, _epochStateRoot, _epochTransactionsRoot, _epochReceiptsRoot )); require(success); return true; } // delegate to submit handler function _delegateSubmitORB( uint _pos, bytes32 _statesRoot, bytes32 _transactionsRoot, bytes32 _receiptsRoot ) internal returns (bool success) { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = submitHandler.delegatecall(abi.encodeWithSelector( SUBMIT_ORB_SIG, _pos, _statesRoot, _transactionsRoot, _receiptsRoot )); require(success); return true; } // delegate to submit handler function _delegateSubmitURB( uint _pos, bytes32 _statesRoot, bytes32 _transactionsRoot, bytes32 _receiptsRoot ) internal returns (bool success) { // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars (bool success, bytes memory returnData) = submitHandler.delegatecall(abi.encodeWithSelector( SUBMIT_URB_SIG, _pos, _statesRoot, _transactionsRoot, _receiptsRoot )); require(success); return true; } } // File: contracts/Layer2.sol pragma solidity ^0.5.12; pragma experimental ABIEncoderV2; // import "./patricia_tree/PatriciaTreeFace.sol"; contract Layer2 is Layer2Storage, Layer2Event, Layer2Base, MapperRole, SubmitterRole { using SafeMath for uint; using SafeMath for uint64; using Math for *; using Data for *; using Address for address; using BMT for *; /* * Modifiers */ modifier onlyOperator() { require(msg.sender == operator); _; } modifier onlyValidCost(uint _expected) { require(msg.value >= _expected); _; } modifier finalizeBlocks() { if (!development) { _finalizeBlock(); } _; } modifier checkURBSubmission () { Data.Fork storage fork = forks[currentFork]; if (fork.timestamp + Data.URE_TIMEOUT() < block.timestamp) { // TODO: reset fork fork.forkedBlock = 0; } _; } modifier onlyOperatorOrSeigManager () { require(msg.sender == operator || msg.sender == seigManager); _; } /* * Constructor */ constructor( address _epochHandler, address _submitHandler, address _etherToken, bool _development, uint _NRELength, // genesis block state bytes32 _statesRoot, bytes32 _transactionsRoot, bytes32 _receiptsRoot ) public { require(_epochHandler.isContract()); require(_submitHandler.isContract()); require(_etherToken.isContract()); epochHandler = _epochHandler; submitHandler = _submitHandler; etherToken = _etherToken; development = _development; operator = msg.sender; NRELength = _NRELength; Data.Fork storage fork = forks[currentFork]; Data.PlasmaBlock storage genesis = fork.blocks[0]; genesis.statesRoot = _statesRoot; genesis.transactionsRoot = _transactionsRoot; genesis.receiptsRoot = _receiptsRoot; // set up the genesis epoch fork.epochs[0].timestamp = uint64(block.timestamp); fork.epochs[0].initialized = true; // prepare ORE#2 fork.epochs[2].isEmpty = true; fork.epochs[2].isRequest = true; _doFinalizeBlock(fork, genesis, 0); _doFinalizeNRE(fork, 0); _delegatePrepareNRE(); } /* * External Functions */ function changeOperator(address _operator) external onlyOperatorOrSeigManager { operator = _operator; emit OperatorChanged(_operator); } function addSubmitter(address account) public onlyOperator { _addSubmitter(account); } function addMapper(address account) public onlyOperator { _addMapper(account); } function setSeigManager(address account) public onlyOperatorOrSeigManager { seigManager = account; } /** * @notice map requestable contract in child chain * NOTE: only operator? */ function mapRequestableContractByOperator(address _layer2, address _childchain) external onlyMapper returns (bool success) { require(_layer2.isContract()); require(requestableContracts[_layer2] == address(0)); requestableContracts[_layer2] = _childchain; emit RequestableContractMapped(_layer2, _childchain); return true; } function getNumEROs() external view returns (uint) { return EROs.length; } function getNumORBs() external view returns (uint) { return ORBs.length; } function getEROBytes(uint _requestId) public view returns (bytes memory out) { Data.Request storage ERO = EROs[_requestId]; return ERO.toChildChainRequest(requestableContracts[ERO.to]) .toTX(_requestId, false) .toBytes(); } /** * @notice Declare to submit URB. */ function prepareToSubmitURB() public payable onlyValidCost(COST_URB_PREPARE) // finalizeBlocks { // TODO: change to continuous rebase scheme. // disable UAF. revert(); // return false; // Layer2Base.prepareToSubmitURB(); } function submitNRE( uint _pos1, // forknumber + epochNumber uint _pos2, // startBlockNumber + endBlockNumber bytes32 _epochStateRoot, bytes32 _epochTransactionsRoot, bytes32 _epochReceiptsRoot ) external payable onlySubmitter onlyValidCost(COST_NRB) finalizeBlocks returns (bool success) { return Layer2Base._delegateSubmitNRE( _pos1, _pos2, _epochStateRoot, _epochTransactionsRoot, _epochReceiptsRoot ); } function submitORB( uint _pos, bytes32 _statesRoot, bytes32 _transactionsRoot, bytes32 _receiptsRoot ) external payable onlySubmitter onlyValidCost(COST_NRB) finalizeBlocks returns (bool success) { return Layer2Base._delegateSubmitORB( _pos, _statesRoot, _transactionsRoot, _receiptsRoot ); } function submitURB( uint _pos, bytes32 _statesRoot, bytes32 _transactionsRoot, bytes32 _receiptsRoot ) external payable onlyValidCost(COST_URB) returns (bool success) { // TODO: change to continuous rebase scheme. // disable UAF. revert(); return false; // return Layer2Base._delegateSubmitURB( // _pos, // _statesRoot, // _transactionsRoot, // _receiptsRoot // ); } function finalizeBlock() external returns (bool success) { require(_finalizeBlock()); return true; } /** * @notice Computation verifier contract reverts the block in case of wrong * computation. */ /* function revertBlock(uint _forkNumber, uint _blockNumber) external { // TODO: make a new fork? } */ function challengeExit( uint _forkNumber, uint _blockNumber, uint _index, bytes calldata _receiptData, bytes calldata _proof ) external { Data.Fork storage fork = forks[_forkNumber]; Data.PlasmaBlock storage pb = fork.blocks[_blockNumber]; require(pb.isRequest); require(pb.finalized); uint requestId; bool userActivated = pb.userActivated; if (userActivated) { requestId = _doChallengeExit(pb, URBs[pb.requestBlockId], ERUs, _index, _receiptData, _proof); // TODO: dynamic cost for ERU msg.sender.transfer(COST_ERU); } else { requestId = _doChallengeExit(pb, ORBs[pb.requestBlockId], EROs,_index, _receiptData, _proof); msg.sender.transfer(COST_ERO); } emit RequestChallenged(requestId, userActivated); } function _doChallengeExit( Data.PlasmaBlock storage _pb, Data.RequestBlock storage _rb, Data.Request[] storage _rs, uint _index, bytes memory _receiptData, bytes memory _proof ) internal returns (uint requestId) { requestId = _rb.requestStart + _index; require(requestId <= _rb.requestEnd); Data.Request storage r = _rs[requestId]; require(_pb.finalizedAt + CP_EXIT > block.timestamp); require(_pb.finalized); require(!r.challenged); require(!r.finalized); bytes32 leaf = keccak256(_receiptData); require(_receiptData.toReceiptStatus() == 0); if (!development) { require(BMT.checkMembership(leaf, _index, _pb.receiptsRoot, _proof)); } r.challenged = true; return requestId; } /** * @notice It challenges on NRBs containing null address transaction. */ function challengeNullAddress( uint _blockNumber, bytes calldata _key, bytes calldata _txByte, // RLP encoded transaction uint _branchMask, bytes32[] calldata _siblings ) external { Data.Fork storage fork = forks[currentFork]; Data.PlasmaBlock storage pb = fork.blocks[_blockNumber]; // check if the plasma block is NRB require(!pb.isRequest); // check if challenge period does not end yet require(pb.timestamp + CP_COMPUTATION > block.timestamp); // PatriciaTreeFace trie; // if (pb.userActivated) { // trie = PatriciaTreeFace(URBs[pb.requestBlockId].trie); // } else { // trie = PatriciaTreeFace(ORBs[pb.requestBlockId].trie); // } // Data.TX memory txData = Data.toTX(_txByte); // require(txData.isNATX()); // TODO: use patricia verify library // require(trie.verifyProof(pb.transactionsRoot, _key, _txByte, _branchMask, _siblings)); // TODO: fork? penalize? } /* * Public Functions */ function startExit( address _to, bytes32 _trieKey, bytes memory _trieValue ) public payable onlyValidCost(COST_ERO) returns (bool success) { uint requestId; requestId = _storeRequest(EROs, ORBs, _to, 0, _trieKey, _trieValue, true, false); emit RequestCreated(requestId, msg.sender, _to, 0, _trieKey, _trieValue, true, false); return true; } function startEnter( address _to, bytes32 _trieKey, bytes memory _trieValue ) public payable returns (bool success) { uint requestId; uint weiAmount = msg.value; requestId = _storeRequest(EROs, ORBs, _to, weiAmount, _trieKey, _trieValue, false, false); numEnterForORB += 1; Data.Fork storage fork = forks[currentFork]; emit RequestApplied(requestId, false); emit RequestCreated(requestId, msg.sender, _to, weiAmount, _trieKey, _trieValue, false, false); return true; } function makeERU( address _to, bytes32 _trieKey, bytes memory _trieValue ) public payable onlyValidCost(COST_ERU) returns (bool success) { uint requestId; requestId = _storeRequest(ERUs, URBs, _to, 0, _trieKey, _trieValue, true, true); emit RequestCreated(requestId, msg.sender, _to, 0, _trieKey, _trieValue, true, true); return true; } /** * @notice Finalize a request if request block including it * is finalized. * TODO: refactor implementation */ function finalizeRequest() public returns (bool success) { uint requestId; Data.Fork storage fork = forks[lastAppliedForkNumber]; uint epochNumber = lastAppliedEpochNumber; require(lastAppliedBlockNumber <= fork.lastBlock); Data.PlasmaBlock storage pb = fork.blocks[lastAppliedBlockNumber]; Data.Epoch storage epoch = fork.epochs[epochNumber]; // TODO: execute after finding next request block // find next fork if (fork.forkedBlock != 0 && lastAppliedBlockNumber >= fork.forkedBlock) { lastAppliedForkNumber += 1; fork = forks[lastAppliedForkNumber]; epochNumber = fork.firstEpoch; epoch = fork.epochs[epochNumber]; lastAppliedBlockNumber = fork.firstBlock; lastAppliedEpochNumber = epochNumber; pb = fork.blocks[lastAppliedBlockNumber]; } // find next request block if (!pb.isRequest) { if (epochNumber == 0) { epochNumber = firstNonEmptyRequestEpoch[lastAppliedForkNumber]; } else { epochNumber = fork.epochs[epochNumber].RE.nextEpoch; } require(epochNumber != 0); epoch = fork.epochs[epochNumber]; lastAppliedBlockNumber = epoch.startBlockNumber; pb = fork.blocks[lastAppliedBlockNumber]; } else { epochNumber = pb.epochNumber; epoch = fork.epochs[epochNumber]; } lastAppliedEpochNumber = epochNumber; require(!epoch.isEmpty); require(epoch.isRequest); require(pb.isRequest); require(pb.finalized); require(pb.finalizedAt + CP_EXIT <= block.timestamp); // apply ERU if (pb.userActivated) { requestId = ERUIdToFinalize; require(ERUs.length > requestId); Data.Request storage ERU = ERUs[requestId]; Data.RequestBlock storage URB = URBs[pb.requestBlockId]; require(URB.requestStart <= requestId && requestId <= URB.requestEnd); // check next block if (requestId == URB.requestEnd) { if (fork.forkedBlock > 0 && lastAppliedBlockNumber == fork.forkedBlock - 1) { lastAppliedForkNumber += 1; } lastAppliedBlockNumber += 1; } ERUIdToFinalize = requestId + 1; if (ERU.isExit && !ERU.challenged) { // NOTE: do not check it reverted or not? ERU.applyRequestInRootChain(requestId); // TODO: dynamic cost and bond release period ERU.requestor.transfer(COST_ERU); emit RequestApplied(requestId, true); } ERU.finalized = true; emit RequestFinalized(requestId, true); return true; } // apply ERO requestId = EROIdToFinalize; require(EROs.length > requestId); Data.RequestBlock storage ORB = ORBs[pb.requestBlockId]; require(ORB.requestStart <= requestId && requestId <= ORB.requestEnd); // check next block if (requestId == ORB.requestEnd) { // TODO: iterator blocks by NRE length for NRE' if (fork.forkedBlock > 0 && lastAppliedBlockNumber == fork.forkedBlock - 1) { lastAppliedForkNumber += 1; } lastAppliedBlockNumber += 1; } Data.Request storage ERO = EROs[requestId]; EROIdToFinalize = requestId + 1; ERO.finalized = true; if (ERO.isExit && !ERO.challenged) { ERO.applyRequestInRootChain(requestId); ERO.requestor.transfer(COST_ERO); emit RequestApplied(requestId, false); } emit RequestFinalized(requestId, false); return true; } function finalizeRequests(uint n) external returns (bool success) { for (uint i = 0; i < n; i++) { require(finalizeRequest()); } return true; } /** * @notice return the max number of request */ function MAX_REQUESTS() external pure returns (uint maxRequests) { return Data.MAX_REQUESTS(); } function lastBlock(uint forkNumber) public view returns (uint lastBlock) { return forks[forkNumber].lastBlock; } function lastEpoch(uint forkNumber) public view returns (uint lastBlock) { return forks[forkNumber].lastEpoch; } function getEpoch( uint forkNumber, uint epochNumber ) external view returns ( Data.Epoch memory epoch ) { return forks[forkNumber].epochs[epochNumber]; } function getLastEpoch() public view returns (Data.Epoch memory) { return forks[currentFork].epochs[forks[currentFork].lastEpoch]; } function getBlock( uint forkNumber, uint blockNumber ) public view returns (Data.PlasmaBlock memory) { return forks[forkNumber].blocks[blockNumber]; } function getBlockFinalizedAt( uint forkNumber, uint blockNumber ) public view returns (uint) { return forks[forkNumber].blocks[blockNumber].finalizedAt; } function getLastFinalizedBlock(uint forkNumber) public view returns (uint) { return forks[forkNumber].lastFinalizedBlock; } function getLastFinalizedEpoch(uint forkNumber) public view returns (uint) { return forks[forkNumber].lastFinalizedEpoch; } /** * @notice return true if the chain is forked by URB */ function forked(uint _forkNumber) public view returns (bool result) { return _forkNumber != currentFork; } /** * @notice return true if the request is finalized */ function getRequestFinalized(uint _requestId, bool _userActivated) public view returns (bool finalized) { if (_userActivated) { ERUs[_requestId].finalized; } return EROs[_requestId].finalized; } /* * Internal Functions */ function _storeRequest( Data.Request[] storage _requests, Data.RequestBlock[] storage _rbs, address _to, uint _weiAmount, bytes32 _trieKey, bytes memory _trieValue, bool _isExit, bool _userActivated ) internal returns (uint requestId) { // trieValue cannot be longer than 1KB. require(_trieValue.length <= 1024); bool isTransfer = _to == etherToken; // check parameters for simple ether transfer and message-call require(isTransfer && !_isExit || (requestableContracts[_to] != address(0))); requestId = _requests.length++; Data.Request storage r = _requests[requestId]; r.requestor = msg.sender; r.to = _to; r.timestamp = uint64(block.timestamp); r.isExit = _isExit; r.isTransfer = isTransfer; r.value = uint128(_weiAmount); r.trieKey = _trieKey; r.trieValue = _trieValue; // apply message-call in case of enter request. if (!_isExit) { require(r.applyRequestInRootChain(requestId)); } uint requestBlockId = _rbs.length == 0 ? _rbs.length++ : _rbs.length - 1; Data.RequestBlock storage rb = _rbs[requestBlockId]; // make a new RequestBlock. if (rb.submitted || rb.requestEnd - rb.requestStart + 1 == Data.MAX_REQUESTS()) { rb.submitted = true; rb = _rbs[_rbs.length++]; rb.requestStart = uint64(requestId); } rb.init(); rb.requestEnd = uint64(requestId); if (!_isExit) { rb.numEnter += 1; } if (isTransfer && !_isExit) { rb.addRequest(r, r.toChildChainRequest(msg.sender), requestId); } else { rb.addRequest(r, r.toChildChainRequest(requestableContracts[_to]), requestId); } } /** * @notice finalize a block if possible. */ function _finalizeBlock() internal returns (bool) { Data.Fork storage fork = forks[currentFork]; // short circuit if waiting URBs if (fork.forkedBlock != 0) { return false; } uint blockNumber = Math.max(fork.firstBlock, fork.lastFinalizedBlock + 1); // short circuit if all blocks are submitted yet if (blockNumber > fork.lastBlock) { return false; } Data.PlasmaBlock storage pb = fork.blocks[blockNumber]; // short circuit if the block is under challenge if (pb.challenging) { return false; } // 1. finalize request block if (pb.isRequest) { // short circuit if challenge period doesn't end if (pb.timestamp + CP_COMPUTATION > block.timestamp) { return false; } // finalize block _doFinalizeBlock(fork, pb, blockNumber); return true; } // 2. finalize non request epoch uint nextEpochNumber = fork.lastFinalizedEpoch + 1; while (fork.epochs[nextEpochNumber].isRequest) { nextEpochNumber += 1; } // if the first block of the next request epoch is finalized, finalize all // blocks of the current non request epoch. if (_checkFinalizableNRE(fork, nextEpochNumber)) { _doFinalizeNRE(fork, nextEpochNumber); return true; } return false; } /** * @notice return true if NRE can be finalized. */ function _checkFinalizableNRE(Data.Fork storage fork, uint _epochNumber) internal view returns (bool) { // short circuit if epoch is not submitted yet if (_epochNumber > fork.lastEpoch) { return false; } Data.Epoch storage epoch = fork.epochs[_epochNumber]; // short circuit if epoch is not initialized if (!epoch.initialized) { return false; } // short circuit if epoch is not NRE if (epoch.isRequest) { return false; } // short circuit if epoch is challenged or under challenge if (epoch.NRE.challenging || epoch.NRE.challenged) { return false; } // return if challenge period end return epoch.NRE.submittedAt + CP_WITHHOLDING <= block.timestamp; // return true; } /** * @notice finalize a block */ function _doFinalizeBlock( Data.Fork storage _f, Data.PlasmaBlock storage _pb, uint _blockNumber ) internal { _pb.finalized = true; _pb.finalizedAt = uint64(block.timestamp); _f.lastFinalizedBlock = uint64(_blockNumber); _f.lastFinalizedEpoch = uint64(_pb.epochNumber); emit BlockFinalized(currentFork, _blockNumber); } /** * @notice finalize all blocks in the non request epoch */ function _doFinalizeNRE( Data.Fork storage _f, uint _epochNumber ) internal { Data.Epoch storage epoch = _f.epochs[_epochNumber]; epoch.NRE.finalized = true; epoch.NRE.finalizedAt = uint64(block.timestamp); _f.lastFinalizedBlock = uint64(epoch.endBlockNumber); _f.lastFinalizedEpoch = uint64(_epochNumber); // a single EpochFinalized event replaces lots of BlockFinalized events. emit EpochFinalized(currentFork, _epochNumber, epoch.startBlockNumber, epoch.endBlockNumber); return; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_epochHandler","type":"address"},{"internalType":"address","name":"_submitHandler","type":"address"},{"internalType":"address","name":"_etherToken","type":"address"},{"internalType":"bool","name":"_development","type":"bool"},{"internalType":"uint256","name":"_NRELength","type":"uint256"},{"internalType":"bytes32","name":"_statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"_transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_receiptsRoot","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"BlockFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fork","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isRequest","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"BlockSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"address","name":"requestor","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"trieKey","type":"bytes"},{"indexed":false,"internalType":"bytes32","name":"trieValue","type":"bytes32"}],"name":"ERUCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"EpochFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"EpochFilling","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlockNumber","type":"uint256"}],"name":"EpochFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestEnd","type":"uint256"},{"indexed":false,"internalType":"bool","name":"epochIsEmpty","type":"bool"},{"indexed":false,"internalType":"bool","name":"isRequest","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"},{"indexed":false,"internalType":"bool","name":"rebase","type":"bool"}],"name":"EpochPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestEnd","type":"uint256"},{"indexed":false,"internalType":"bool","name":"epochIsEmpty","type":"bool"},{"indexed":false,"internalType":"bool","name":"isRequest","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"EpochRebased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFork","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forkedBlockNumber","type":"uint256"}],"name":"Forked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MapperAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MapperRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newOperator","type":"address"}],"name":"OperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestChallenged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"address","name":"requestor","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"trieKey","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"trieValue","type":"bytes"},{"indexed":false,"internalType":"bool","name":"isExit","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractInRootchain","type":"address"},{"indexed":false,"internalType":"address","name":"contractInChildchain","type":"address"}],"name":"RequestableContractMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"SessionTimeout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SubmitterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SubmitterRemoved","type":"event"},{"constant":true,"inputs":[],"name":"COST_ERO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_ERU","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_NRB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_ORB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_URB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_URB_PREPARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CP_COMPUTATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CP_EXIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CP_WITHHOLDING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EROIdToFinalize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"EROs","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isExit","type":"bool"},{"internalType":"bool","name":"isTransfer","type":"bool"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"},{"internalType":"uint128","name":"value","type":"uint128"},{"internalType":"address payable","name":"requestor","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"trieKey","type":"bytes32"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"trieValue","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERUIdToFinalize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ERUs","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isExit","type":"bool"},{"internalType":"bool","name":"isTransfer","type":"bool"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"},{"internalType":"uint128","name":"value","type":"uint128"},{"internalType":"address payable","name":"requestor","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"trieKey","type":"bytes32"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"trieValue","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_REQUESTS","outputs":[{"internalType":"uint256","name":"maxRequests","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NRELength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ORBs","outputs":[{"internalType":"bool","name":"submitted","type":"bool"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"epochNumber","type":"uint64"},{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"address","name":"trie","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PREPARE_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REQUEST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"URBs","outputs":[{"internalType":"bool","name":"submitted","type":"bool"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"epochNumber","type":"uint64"},{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"address","name":"trie","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMapper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addSubmitter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_forkNumber","type":"uint256"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"_receiptData","type":"bytes"},{"internalType":"bytes","name":"_proof","type":"bytes"}],"name":"challengeExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bytes","name":"_key","type":"bytes"},{"internalType":"bytes","name":"_txByte","type":"bytes"},{"internalType":"uint256","name":"_branchMask","type":"uint256"},{"internalType":"bytes32[]","name":"_siblings","type":"bytes32[]"}],"name":"challengeNullAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"changeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentFork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"development","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"epochHandler","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"etherToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalizeBlock","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeRequest","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"finalizeRequests","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstFilledORENumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstNonEmptyRequestEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_forkNumber","type":"uint256"}],"name":"forked","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"forks","outputs":[{"internalType":"uint64","name":"forkedBlock","type":"uint64"},{"internalType":"uint64","name":"firstEpoch","type":"uint64"},{"internalType":"uint64","name":"lastEpoch","type":"uint64"},{"internalType":"uint64","name":"firstBlock","type":"uint64"},{"internalType":"uint64","name":"lastBlock","type":"uint64"},{"internalType":"uint64","name":"lastFinalizedEpoch","type":"uint64"},{"internalType":"uint64","name":"lastFinalizedBlock","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"firstEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"lastEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"nextBlockToRebase","type":"uint64"},{"internalType":"bool","name":"rebased","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getBlock","outputs":[{"components":[{"internalType":"uint64","name":"epochNumber","type":"uint64"},{"internalType":"uint64","name":"requestBlockId","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"finalizedAt","type":"uint64"},{"internalType":"uint64","name":"referenceBlock","type":"uint64"},{"internalType":"bytes32","name":"statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"receiptsRoot","type":"bytes32"},{"internalType":"bool","name":"isRequest","type":"bool"},{"internalType":"bool","name":"userActivated","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"},{"internalType":"bool","name":"challenging","type":"bool"},{"internalType":"bool","name":"finalized","type":"bool"}],"internalType":"struct Data.PlasmaBlock","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getBlockFinalizedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"getEROBytes","outputs":[{"internalType":"bytes","name":"out","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"},{"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"getEpoch","outputs":[{"components":[{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isEmpty","type":"bool"},{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"bool","name":"isRequest","type":"bool"},{"internalType":"bool","name":"userActivated","type":"bool"},{"internalType":"bool","name":"rebase","type":"bool"},{"components":[{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"uint64","name":"firstRequestBlockId","type":"uint64"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"nextEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"nextEpoch","type":"uint64"}],"internalType":"struct Data.RequestEpochMeta","name":"RE","type":"tuple"},{"components":[{"internalType":"bytes32","name":"epochStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochTransactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochReceiptsRoot","type":"bytes32"},{"internalType":"uint64","name":"submittedAt","type":"uint64"},{"internalType":"uint64","name":"finalizedAt","type":"uint64"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenging","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"}],"internalType":"struct Data.NonRequestEpochMeta","name":"NRE","type":"tuple"}],"internalType":"struct Data.Epoch","name":"epoch","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastEpoch","outputs":[{"components":[{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isEmpty","type":"bool"},{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"bool","name":"isRequest","type":"bool"},{"internalType":"bool","name":"userActivated","type":"bool"},{"internalType":"bool","name":"rebase","type":"bool"},{"components":[{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"uint64","name":"firstRequestBlockId","type":"uint64"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"nextEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"nextEpoch","type":"uint64"}],"internalType":"struct Data.RequestEpochMeta","name":"RE","type":"tuple"},{"components":[{"internalType":"bytes32","name":"epochStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochTransactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochReceiptsRoot","type":"bytes32"},{"internalType":"uint64","name":"submittedAt","type":"uint64"},{"internalType":"uint64","name":"finalizedAt","type":"uint64"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenging","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"}],"internalType":"struct Data.NonRequestEpochMeta","name":"NRE","type":"tuple"}],"internalType":"struct Data.Epoch","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"getLastFinalizedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"getLastFinalizedEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumEROs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumORBs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"bool","name":"_userActivated","type":"bool"}],"name":"getRequestFinalized","outputs":[{"internalType":"bool","name":"finalized","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isLayer2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMapper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSubmitter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastAppliedBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastAppliedEpochNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastAppliedForkNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"lastBlock","outputs":[{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"lastEpoch","outputs":[{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastNonEmptyRequestEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_trieKey","type":"bytes32"},{"internalType":"bytes","name":"_trieValue","type":"bytes"}],"name":"makeERU","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_layer2","type":"address"},{"internalType":"address","name":"_childchain","type":"address"}],"name":"mapRequestableContractByOperator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"numEnterForORB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"prepareToSubmitURB","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMapper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSubmitter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"requestableContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"seigManager","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setSeigManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_trieKey","type":"bytes32"},{"internalType":"bytes","name":"_trieValue","type":"bytes"}],"name":"startEnter","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_trieKey","type":"bytes32"},{"internalType":"bytes","name":"_trieValue","type":"bytes"}],"name":"startExit","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"submitHandler","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pos1","type":"uint256"},{"internalType":"uint256","name":"_pos2","type":"uint256"},{"internalType":"bytes32","name":"_epochStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"_epochTransactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_epochReceiptsRoot","type":"bytes32"}],"name":"submitNRE","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pos","type":"uint256"},{"internalType":"bytes32","name":"_statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"_transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_receiptsRoot","type":"bytes32"}],"name":"submitORB","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pos","type":"uint256"},{"internalType":"bytes32","name":"_statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"_transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_receiptsRoot","type":"bytes32"}],"name":"submitURB","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005fbe38038062005fbe83398101604081905262000034916200063e565b62000048336001600160e01b036200026316565b6200005c336001600160e01b03620002b516565b6200007b886001600160a01b03166200030760201b6200359d1760201c565b6200008557600080fd5b620000a4876001600160a01b03166200030760201b6200359d1760201c565b620000ae57600080fd5b620000cd866001600160a01b03166200030760201b6200359d1760201c565b620000d757600080fd5b600180546001600160a01b03199081166001600160a01b038b8116919091179092556002805482168a8416178155600380549092169289169290921781556000805460ff191688151517610100600160a81b031916610100330217815560058790556006548152600860209081526040808320838052600480820184528285208088018b90558087018a90559081018890559481019092528083208054790100000000000000000000000000000000000000000000000000600160801b600160c01b0319909116700100000000000000000000000000000000426001600160401b0316021760ff60c81b191617905593825292812080547a010000000000000000000000000000000000000000000000000000780100000000000000000000000000000000000000000000000060ff60c01b199092169190911760ff60d01b19161790556200022a90839083906200030d565b620002408260006001600160e01b03620003f316565b620002536001600160e01b03620004c916565b50505050505050505050620008b8565b6200027e8160166200059860201b6200386c1790919060201c565b6040516001600160a01b038216907fa199526a01dbcba68aa3ab9d7d06c6692c83fb1a8bcf2184e6d94ad34f5aaf9590600090a250565b620002d08160176200059860201b6200386c1790919060201c565b6040516001600160a01b038216907fb079bc2cbde1f186e0b351d4a87c4597e3ed098f571548617449e73506428d8b90600090a250565b3b151590565b60058201805464010000000060ff60201b1990911617905581546001600160c01b03167801000000000000000000000000000000000000000000000000426001600160401b0390811691909102919091178355600184018054600160801b600160c01b03191670010000000000000000000000000000000084841602178082558454600160401b600160801b0319909116921668010000000000000000029190911790556006546040517ffb96205e4b3633fd57aa805b26b51ecf528714a10241a4af015929dce86768d991620003e6918490620007ad565b60405180910390a1505050565b6000818152600383016020526040908190206006808201805470010000000000000000000000000000000060ff60801b199091168117600160401b600160801b031990811668010000000000000000426001600160401b03908116820292909217909455855460018a018054600160801b600160c01b0319169186900483169094021790911681881684021790915591548354945193947f70801d4d63b3da6c19ba7349911f45bed5a99ccdfb51b8138c105872529bebd594620003e6949293889383811693919091041690620007cc565b5050565b6001546040516000916060916001600160a01b0390911690620004ec90620007a0565b60408051918290038220600483526024830182526020830180516001600160e01b03167fffffffff00000000000000000000000000000000000000000000000000000000909216919091179052516200054691906200078b565b600060405180830381855af49150503d806000811462000583576040519150601f19603f3d011682016040523d82523d6000602084013e62000588565b606091505b509150915081620004c557600080fd5b620005ad82826001600160e01b03620005dd16565b15620005b857600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620005f357600080fd5b506001600160a01b03811660009081526020839052604090205460ff165b92915050565b8051620006118162000888565b80516200061181620008a2565b80516200061181620008ad565b600080600080600080600080610100898b0312156200065c57600080fd5b60006200066a8b8b62000617565b98505060206200067d8b828c0162000617565b9750506040620006908b828c0162000617565b9650506060620006a38b828c0162000624565b9550506080620006b68b828c0162000631565b94505060a0620006c98b828c0162000631565b93505060c0620006dc8b828c0162000631565b92505060e0620006ef8b828c0162000631565b9150509295985092959890939650565b60006200070c8262000812565b62000718818562000816565b93506200072a81856020860162000855565b9290920192915050565b600062000743600c8362000816565b7f707265706172654e5245282900000000000000000000000000000000000000008152600c0192915050565b6200077a816200082d565b82525050565b6200077a8162000848565b6000620007998284620006ff565b9392505050565b6000620006118262000734565b60408101620007bd82856200076f565b6200079960208301846200076f565b60808101620007dc82876200076f565b620007eb60208301866200076f565b620007fa604083018562000780565b62000809606083018462000780565b95945050505050565b5190565b919050565b6000620006118262000830565b151590565b90565b6001600160a01b031690565b6001600160401b031690565b600062000611826200083c565b60005b838110156200087257818101518382015260200162000858565b8381111562000882576000848401525b50505050565b62000893816200081b565b81146200089f57600080fd5b50565b620008938162000828565b62000893816200082d565b6156f680620008c86000396000f3fe6080604052600436106104105760003560e01c80638b5172d01161021e578063c8ad329f11610123578063e259faf7116100ab578063ea0c73f61161007a578063ea0c73f614610ab5578063ea7f22a814610aca578063f28a7afa14610aea578063f4f31de414610b0a578063fb788a2714610b2a57610410565b8063e259faf714610a70578063e6925d0814610a85578063e7b88b8014610a8d578063e7f9650514610aa257610410565b8063d1723a96116100f2578063d1723a96146109ee578063d636857e14610a1b578063d691acd81461044b578063da0185f814610a3b578063de0ce17d14610a5b57610410565b8063c8ad329f14610979578063ca6f63801461098e578063cb5d742f146109ae578063ce8a2bc2146109ce57610410565b8063b2ae9ba8116101a6578063b8066bcb11610175578063b8066bcb146108e8578063c0c49c2a146108fd578063c0e860641461091d578063c2bc88fa1461094f578063c54626cc1461096457610410565b8063b2ae9ba81461044b578063b443f3cc1461087c578063b540adba146108b3578063b6715647146108c857610410565b806399bd3600116101ed57806399bd36001461080a578063a820c0671461081f578063a926fdbc14610832578063ab96da2d14610852578063b17fa6e91461086757610410565b80638b5172d01461044b5780638eb288ca146107e057806393521222146107f557806394be3aa51461044b57610410565b8063404f7d66116103245780636fb7f558116102ac57806378fe705f1161027b57806378fe705f1461076e5780637b929c271461078157806380e3e81d146107965780638155717d146107b6578063882eed2c146107cb57610410565b80636fb7f5581461070457806372ecb9a81461071957806375395a58146107395780637657f20a1461074e57610410565b8063570ca735116102f3578063570ca7351461067a5780635b8846821461069c5780635e0ca71b146106bc5780636299fb24146106d15780636f3e4b90146106f157610410565b8063404f7d66146105d55780634a44bdb8146105f55780634ba3a12614610622578063547685711461065a57610410565b8063183d2d1c116103a75780632aa196c8116103765780632aa196c8146105565780632b25a38b146105695780632dc6bb7b146105965780633565fb0d146105ab578063398bac63146105c057610410565b8063183d2d1c1461050c578063192adc5b1461044b5780631ec2042b14610521578063236915661461054157610410565b806308c4fff0116103e357806308c4fff0146104a25780630eaf45a8146104b757806311e4c914146104d7578063164bc2ae146104f757610410565b8063019dc09914610415578063033cfbed1461044b57806306394c9b14610460578063072900f914610482575b600080fd5b34801561042157600080fd5b506104356104303660046148f7565b610b3f565b6040516104429190615294565b60405180910390f35b34801561045757600080fd5b50610435610b67565b34801561046c57600080fd5b5061048061047b366004614815565b610b6c565b005b34801561048e57600080fd5b5061048061049d366004614815565b610bf8565b3480156104ae57600080fd5b50610435610c20565b6104ca6104c5366004614a9d565b610c25565b6040516104429190615189565b3480156104e357600080fd5b506104356104f23660046148f7565b610c66565b34801561050357600080fd5b50610435610c88565b34801561051857600080fd5b50610435610c8e565b34801561052d57600080fd5b5061043561053c3660046148f7565b610c94565b34801561054d57600080fd5b50610435610cb2565b6104ca610564366004614875565b610cb8565b34801561057557600080fd5b50610589610584366004614a6d565b610d7a565b6040516104429190615276565b3480156105a257600080fd5b506104356110e2565b3480156105b757600080fd5b506104806110e8565b3480156105cc57600080fd5b506105896110f3565b3480156105e157600080fd5b506104806105f0366004614b12565b61148e565b34801561060157600080fd5b50610615610610366004614a6d565b61171a565b6040516104429190615285565b34801561062e57600080fd5b5061064261063d3660046148f7565b61180a565b6040516104429c9b9a999897969594939291906154e2565b34801561066657600080fd5b506104ca6106753660046148f7565b611881565b34801561068657600080fd5b5061068f6118af565b6040516104429190615160565b3480156106a857600080fd5b506104356106b7366004614a6d565b6118c3565b3480156106c857600080fd5b506104806118f4565b3480156106dd57600080fd5b506104806106ec3660046149a6565b6118fd565b6104ca6106ff366004614945565b611960565b34801561071057600080fd5b5061068f611968565b34801561072557600080fd5b506104356107343660046148f7565b611977565b34801561074557600080fd5b506104ca611989565b34801561075a57600080fd5b50610480610769366004614815565b6119a2565b6104ca61077c366004614875565b6119f5565b34801561078d57600080fd5b506104ca611a63565b3480156107a257600080fd5b506104806107b1366004614815565b611a6c565b3480156107c257600080fd5b50610435611a91565b3480156107d757600080fd5b506104ca611a96565b3480156107ec57600080fd5b50610435611a9b565b34801561080157600080fd5b50610435611aa2565b34801561081657600080fd5b506104ca611ab1565b6104ca61082d366004614945565b612351565b34801561083e57600080fd5b506104ca61084d366004614815565b612390565b34801561085e57600080fd5b506104356123a3565b34801561087357600080fd5b506104356123a9565b34801561088857600080fd5b5061089c6108973660046148f7565b6123ae565b6040516104429b9a99989796959493929190615438565b3480156108bf57600080fd5b506104356124cf565b3480156108d457600080fd5b506104356108e33660046148f7565b6124d5565b3480156108f457600080fd5b5061068f6124e7565b34801561090957600080fd5b506104ca610918366004614815565b6124f6565b34801561092957600080fd5b5061093d6109383660046148f7565b612509565b604051610442969594939291906151de565b34801561095b57600080fd5b50610435612570565b34801561097057600080fd5b50610435612575565b34801561098557600080fd5b5061043561257b565b34801561099a57600080fd5b506104356109a93660046148f7565b612581565b3480156109ba57600080fd5b506104ca6109c936600461483b565b612593565b3480156109da57600080fd5b506104ca6109e93660046148f7565b612659565b3480156109fa57600080fd5b50610a0e610a093660046148f7565b612661565b6040516104429190615255565b348015610a2757600080fd5b50610435610a363660046148f7565b61280a565b348015610a4757600080fd5b5061068f610a56366004614815565b61282f565b348015610a6757600080fd5b5061068f610b67565b348015610a7c57600080fd5b5061068f61284a565b610480612859565b348015610a9957600080fd5b5061068f612860565b6104ca610ab0366004614875565b61286f565b348015610ac157600080fd5b506104356128cb565b348015610ad657600080fd5b5061093d610ae53660046148f7565b6128d1565b348015610af657600080fd5b506104ca610b05366004614915565b6128de565b348015610b1657600080fd5b5061089c610b253660046148f7565b612927565b348015610b3657600080fd5b50610435612934565b600081815260086020526040902060010154600160401b90046001600160401b03165b919050565b600081565b60005461010090046001600160a01b0316331480610b9457506004546001600160a01b031633145b610b9d57600080fd5b60008054610100600160a81b0319166101006001600160a01b038416021790556040517f4721129e0e676ed6a92909bb24e853ccdd63ad72280cc2e974e38e480e0e6e5490610bed908390615160565b60405180910390a150565b60005461010090046001600160a01b03163314610c1457600080fd5b610c1d8161293a565b50565b600f81565b6000610c3033612390565b610c3957600080fd5b6000805460ff16610c4e57610c4c612982565b505b610c5b8787878787612af8565b979650505050505050565b600090815260086020526040902054600160801b90046001600160401b031690565b60105481565b60065481565b6000908152600860205260409020600101546001600160401b031690565b600d5481565b60008034610cce6009600b888489898880612bd7565b600d805460010190556006546000908152600860205260408082209051929450917f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c291610d1d91869190615356565b60405180910390a17f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d833389858a8a600080604051610d63989796959493929190615320565b60405180910390a1600193505050505b9392505050565b610d826142f7565b600860008481526020019081526020016000206003016000838152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b92915050565b60135481565b6110f1336131f9565b565b6110fb6142f7565b600860006006548152602001908152602001600020600301600060086000600654815260200190815260200160002060000160109054906101000a90046001600160401b03166001600160401b03168152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b90565b600087815260086020908152604080832089845260048101909252909120600581015460ff166114bd57600080fd5b6005810154640100000000900460ff166114d657600080fd5b6005810154600090610100900460ff1680156115e2576115af83600c8560000160089054906101000a90046001600160401b03166001600160401b03168154811061151d57fe5b9060005260206000209060020201600a8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156115dc573d6000803e3d6000fd5b506116d4565b6116a583600b8560000160089054906101000a90046001600160401b03166001600160401b03168154811061161357fe5b906000526020600020906002020160098c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156116d2573d6000803e3d6000fd5b505b7fc8135db115644ed4ae193313c4c801235ef740d2a57a8d5e6fe26ab66635698a8282604051611705929190615356565b60405180910390a15050505050505050505050565b611722614357565b506000918252600860209081526040808420928452600492830182529283902083516101a08101855281546001600160401b038082168352600160401b8204811694830194909452600160801b8104841695820195909552600160c01b9094048216606085015260018101549091166080840152600281015460a0840152600381015460c08401529081015460e08301526005015460ff80821615156101008085019190915282048116151561012084015262010000820481161515610140840152630100000082048116151561016084015264010000000090910416151561018082015290565b6008602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b808504831694600160801b808204851695600160c01b92839004861695858116958581048216958482048316959182900483169484841694918204841693908204169160ff9104168c565b6000805b828110156118a657611895611ab1565b61189e57600080fd5b600101611885565b50600192915050565b60005461010090046001600160a01b031681565b600091825260086020908152604080842092845260049092019052902054600160c01b90046001600160401b031690565b6110f13361334c565b60065460009081526008602090815260408083208b845260048101909252909120600581015460ff161561193057600080fd5b8054426001600160401b03600160801b90920491909116600f011161195457600080fd5b50505050505050505050565b600080610410565b6004546001600160a01b031681565b60076020526000908152604090205481565b6000611993612982565b61199c57600080fd5b50600190565b60005461010090046001600160a01b03163314806119ca57506004546001600160a01b031633145b6119d357600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000611a0e600a600c8860008989600180612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d81338860008989600180604051611a4f9897969594939291906152a2565b60405180910390a150600195945050505050565b60005460ff1681565b60005461010090046001600160a01b03163314611a8857600080fd5b610c1d81613394565b600a81565b600181565b620186a081565b6000611aac6133dc565b905090565b60105460009081526008602052604081206011546001820154601254849392916001600160401b03161015611ae557600080fd5b601254600090815260048301602090815260408083208484526003860190925290912083546001600160401b031615801590611b2f575083546012546001600160401b0390911611155b15611b9a5750506010805460010190819055600090815260086020908152604080832080546001600160401b03600160401b82048116808752600384018652848720600160c01b90930490911660128190556011829055865260048301909452919093209294509092505b600582015460ff16611c2c5782611bc4576010546000908152600f60205260409020549250611beb565b600092835260038401602052604090922060020154600160401b90046001600160401b0316915b82611bf557600080fd5b50506000818152600383016020908152604080832080546001600160401b0316601281905584526004860190925290912090611c4c565b5080546001600160401b0316600081815260038501602052604090209092505b60118390558054600160c01b900460ff1615611c6757600080fd5b8054600160d01b900460ff16611c7c57600080fd5b600582015460ff16611c8d57600080fd5b6005820154640100000000900460ff16611ca657600080fd5b8154426001600160401b03600160c01b90920491909116600a011115611ccb57600080fd5b6005820154610100900460ff161561203f57601454600a549095508510611cf157600080fd5b6000600a8681548110611d0057fe5b906000526020600020906006020190506000600c8460000160089054906101000a90046001600160401b03166001600160401b031681548110611d3f57fe5b600091825260209091206002909102018054909150600160881b90046001600160401b03168710801590611d80575060018101546001600160401b03168711155b611d8957600080fd5b60018101546001600160401b0316871415611de45785546001600160401b031615801590611dcb575085546012546000196001600160401b0392831601909116145b15611dda576010805460010190555b6012805460010190555b600187016014558154600160401b900460ff168015611e0c57508154600160581b900460ff16155b15611fe357604080516101608101825283546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808601546001600160a01b0390811660c085015260028088015490911660e085015260038701546101008086019190915260048801546101208601526005880180548751948116159092026000190190911691909104601f8101849004840283018401909552848252611f6d948c9493889361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b820191906000526020600020905b815481529060010190602001808311611f3957829003601f168201915b5050505050815250506133e190919063ffffffff16565b5060018201546040516001600160a01b03909116906108fc9060009081818181818888f19350505050158015611fa7573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876001604051611fda929190615356565b60405180910390a15b815460ff60501b1916600160501b1782556040517f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047390612027908990600190615356565b60405180910390a1600197505050505050505061148b565b601354600954909550851061205357600080fd5b8154600b8054600092600160401b90046001600160401b031690811061207557fe5b600091825260209091206002909102018054909150600160881b90046001600160401b031686108015906120b6575060018101546001600160401b03168611155b6120bf57600080fd5b60018101546001600160401b031686141561211a5784546001600160401b031615801590612101575084546012546000196001600160401b0392831601909116145b15612110576010805460010190555b6012805460010190555b60006009878154811061212957fe5b6000918252602090912060018901601355600690910201805460ff60501b1916600160501b17808255909150600160401b900460ff16801561217457508054600160581b900460ff16155b1561230957604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612293948c9493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b5060018101546040516001600160a01b03909116906108fc9060009081818181818888f193505050501580156122cd573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876000604051612300929190615356565b60405180910390a15b7f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047387600060405161233b929190615356565b60405180910390a1600197505050505050505090565b600061235c33612390565b61236557600080fd5b6000805460ff1661237a57612378612982565b505b6123868686868661348e565b9695505050505050565b60006110dc60178363ffffffff61356816565b60055481565b601481565b600981815481106123bb57fe5b6000918252602091829020600691909102018054600180830154600280850154600386015460048701546005880180546040805161010099831615999099026000190190911695909504601f81018b90048b0288018b019095528487526001600160401b0388169a50600160401b880460ff9081169a600160481b8a0482169a600160501b8b0483169a600160581b810490931699600160601b9093046001600160801b0316986001600160a01b03908116989716969093918301828280156124c55780601f1061249a576101008083540402835291602001916124c5565b820191906000526020600020905b8154815290600101906020018083116124a857829003601f168201915b505050505090508b565b60095490565b600e6020526000908152604090205481565b6003546001600160a01b031681565b60006110dc60168363ffffffff61356816565b600c818154811061251657fe5b60009182526020909120600290910201805460019091015460ff821692506001600160401b036101008304811692600160481b8104821692600160881b9091048216918116906001600160a01b03600160401b9091041686565b603c81565b60145481565b60115481565b600f6020526000908152604090205481565b600061259e336124f6565b6125a757600080fd5b6125b9836001600160a01b031661359d565b6125c257600080fd5b6001600160a01b0383811660009081526015602052604090205416156125e757600080fd5b6001600160a01b038381166000908152601560205260409081902080546001600160a01b03191692851692909217909155517fc5ec2ed49686197edd2ed642c7e6096893cc81e6658cde2527030316037715d090612648908590859061516e565b60405180910390a150600192915050565b600654141590565b606060006009838154811061267257fe5b600091825260208083206002600690930201828101546001600160a01b039081168086526015845260408087205481516101608101835285546001600160401b038116825260ff600160401b820481161515838a0152600160481b82048116151583860152600160501b8204811615156060840152600160581b820416151560808301526001600160801b03600160601b9091041660a0820152600180870154861660c083015260e082019490945260038601546101008281019190915260048701546101208301526005870180548551601f60001998831615909402979097011699909904908101889004880285018801909352828452949850610d7397612805978c9791966127f896939093169492938b93610140860193909291908301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b820191906000526020600020905b8154815290600101906020018083116127c457829003601f168201915b5050505050815250506135a390919063ffffffff16565b919063ffffffff61367116565b6136c9565b600090815260086020526040902060010154600160801b90046001600160401b031690565b6015602052600090815260409020546001600160a01b031681565b6002546001600160a01b031681565b6000610410565b6001546001600160a01b031681565b60008060006128896009600b886000898960016000612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d8133886000898960016000604051611a4f9897969594939291906152a2565b600b5490565b600b818154811061251657fe5b600081156128f857600a83815481106128f357fe5b506000525b6009838154811061290557fe5b6000918252602090912060069091020154600160501b900460ff169392505050565b600a81815481106123bb57fe5b60125481565b61294b60178263ffffffff61386c16565b6040516001600160a01b038216907fb079bc2cbde1f186e0b351d4a87c4597e3ed098f571548617449e73506428d8b90600090a250565b600654600090815260086020526040812080546001600160401b0316156129ad57600091505061148b565b80546001808301546000926129df926001600160401b03600160c01b909204821692600160801b9004821601166138a5565b60018301549091506001600160401b0316811115612a025760009250505061148b565b6000818152600483016020526040902060058101546301000000900460ff1615612a32576000935050505061148b565b600581015460ff1615612a82578054426001600160401b03600160801b90920491909116600f011115612a6b576000935050505061148b565b612a768382846138bc565b6001935050505061148b565b6001808401546001600160401b03600160401b9091048116909101165b6000818152600385016020526040902054600160d01b900460ff1615612ac757600101612a9f565b612ad1848261397c565b15612aed57612ae08482613a36565b600194505050505061148b565b600094505050505090565b60025460405160009182916060916001600160a01b031690612b1990615134565b60405180910390208989898989604051602401612b3a9594939291906153c1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b789190615128565b600060405180830381855af49150503d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b509150915081612bc757600080fd5b6001925050505b95945050505050565b600061040084511115612be957600080fd5b6003546001600160a01b03888116911614808015612c05575083155b80612c2957506001600160a01b038881166000908152601560205260409020541615155b612c3257600080fd5b8954612c418b600183016143c3565b915060008a8381548110612c5157fe5b600091825260209182902060069190910201600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038d16179055805467ffffffffffffffff1916426001600160401b03161768ff00000000000000001916600160401b881515021769ff0000000000000000001916600160481b85151502176fffffffffffffffffffffffffffffffff60601b1916600160601b6001600160801b038c1602178155600381018990558751909250612d1c916005840191908901906143f4565b5084612e4557604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612e3c94889493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b612e4557600080fd5b895460009015612e5a578a5460001901612e69565b8a54612e698c60018301614472565b905060008b8281548110612e7957fe5b60009182526020909120600290910201805490915060ff1680612ec15750612e9f6133dc565b81546001808401546001600160401b03600160881b9093048316908316030116145b15612f2457805460ff1916600190811782558c548d91612ee49083908301614472565b81548110612eee57fe5b60009182526020909120600290910201805467ffffffffffffffff60881b1916600160881b6001600160401b0388160217815590505b612f2d81610c1d565b60018101805467ffffffffffffffff19166001600160401b03871617905586612f7b5780546001600160401b0361010080830482166001019091160268ffffffffffffffff00199091161781555b838015612f86575086155b156130bd57604080516101608101825284546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808701546001600160a01b0390811660c085015260028089015490911660e085015260038801546101008086019190915260048901546101208601526005890180548751948116159092026000190190911691909104601f81018490048402830184019095528482526130b89488946130a994339491938793610140860193928301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b8391908863ffffffff613af616565b6131e9565b6001600160a01b038b81166000908152601560209081526040918290205482516101608101845287546001600160401b0381168252600160401b810460ff908116151583860152600160481b82048116151583870152600160501b8204811615156060840152600160581b82041615156080830152600160601b90046001600160801b031660a0820152600180890154861660c08301526002808a0154871660e084015260038a01546101008085019190915260048b015461012085015260058b0180548851948116159092026000190190911691909104601f81018690048602830186019096528582526131e9968a966130a99695909116948793610140860193909290918301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b5050505098975050505050505050565b61320a60168263ffffffff613b1816565b6040516001600160a01b038216907ff012269e1b6bb33c7800e7e54167ddd74f0ae7244108030b6876821d3779822f90600090a250565b845460018601546001600160401b03600160881b90920482168501911681111561326a57600080fd5b600085828154811061327857fe5b6000918252602090912089546006909202019150426001600160401b03600160c01b90920491909116600a01116132ae57600080fd5b6005880154640100000000900460ff166132c757600080fd5b8054600160581b900460ff16156132dd57600080fd5b8054600160501b900460ff16156132f357600080fd5b8351602085012061330385613b4d565b1561330d57600080fd5b60005460ff166133305761332781878b6004015487613b8a565b61333057600080fd5b50805460ff60581b1916600160581b1790559695505050505050565b61335d60178263ffffffff613b1816565b6040516001600160a01b038216907ff84a004e1673d2f349a7c93c72b3794b8eba6d2f9338044d8c8cd260e51a57a190600090a250565b6133a560168263ffffffff61386c16565b6040516001600160a01b038216907fa199526a01dbcba68aa3ab9d7d06c6692c83fb1a8bcf2184e6d94ad34f5aaf9590600090a250565b601490565b600062019a285a116133f257600080fd5b8260e001516001600160a01b031663a9f793088460200151848660c001518761010001518861014001516040518663ffffffff1660e01b815260040161343c959493929190615197565b602060405180830381600087803b15801561345657600080fd5b505af115801561346a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d7391908101906148d9565b60025460405160009182916060916001600160a01b0316906134af9061514a565b6040518091039020888888886040516024016134ce9493929190615371565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161350c9190615128565b600060405180830381855af49150503d8060008114613547576040519150601f19603f3d011682016040523d82523d6000602084013e61354c565b606091505b50915091508161355b57600080fd5b5060019695505050505050565b60006001600160a01b03821661357d57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b3b151590565b6135ab61449e565b6020808401805115159183019190915260408085015115159083015260c0808501516001600160a01b031690830152511580156135e9575082604001515b156136335760c08301516001600160a01b031660e082015261014083015160208101516001600160801b03811661361f57600080fd5b6001600160801b031660a0830152506110dc565b6001600160a01b03821660e082015260a0808401516001600160801b0316908201526101008084015190820152610140808401519082015292915050565b6136796144fc565b633b9aca006020820152620186a0604082015260e08401516001600160a01b0316606082015260a08401516001600160801b031660808201526136bd848484613c55565b60a08201529392505050565b6040805160098082526101408201909252606091829190816020015b60608152602001906001900390816136e55750508351909150613710906001600160401b0316613d2b565b8160008151811061371d57fe5b60200260200101819052506137358360200151613d2b565b8160018151811061374257fe5b602002602001018190525061376383604001516001600160401b0316613d2b565b8160028151811061377057fe5b602002602001018190525061379183606001516001600160a01b0316613d3e565b8160038151811061379e57fe5b60200260200101819052506137b68360800151613d2b565b816004815181106137c357fe5b60200260200101819052506137db8360a00151613d5d565b816005815181106137e857fe5b60200260200101819052506138008360c00151613d2b565b8160068151811061380d57fe5b60200260200101819052506138258360e00151613d2b565b8160078151811061383257fe5b602002602001018190525061384b836101000151613d2b565b8160088151811061385857fe5b6020026020010181905250610d7381613db3565b6138768282613568565b1561388057600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000818310156138b55781610d73565b5090919050565b60058201805464010000000064ff000000001990911617905581546001600160c01b0316600160c01b426001600160401b039081169190910291909117835560018401805467ffffffffffffffff60801b1916600160801b8484160217808255845467ffffffffffffffff60401b199091169216600160401b029190911790556006546040517ffb96205e4b3633fd57aa805b26b51ecf528714a10241a4af015929dce86768d99161396f9184906153a6565b60405180910390a1505050565b8154600090600160801b90046001600160401b03168211156139a0575060006110dc565b600082815260038401602052604090208054600160c81b900460ff166139ca5760009150506110dc565b8054600160d01b900460ff16156139e55760009150506110dc565b6006810154600160881b900460ff1680613a0a57506006810154600160901b900460ff165b15613a195760009150506110dc565b60060154426001600160401b039091166014011115905092915050565b60008181526003830160205260409081902060068082018054600160801b60ff60801b19909116811767ffffffffffffffff60401b19908116600160401b426001600160401b03908116820292909217909455855460018a01805467ffffffffffffffff60801b19169186900483169094021790911681881684021790915591548354945193947f70801d4d63b3da6c19ba7349911f45bed5a99ccdfb51b8138c105872529bebd59461396f949293889383811693919091041690615403565b613b0a613b0583836000613671565b613e10565b836004018190555050505050565b613b228282613568565b613b2b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006060613b6b6004613b5f85613e2c565b9063ffffffff613e4f16565b9050610d7381600081518110613b7d57fe5b6020026020010151613edc565b60006020825181613b9757fe5b0615613ba257600080fd5b60006020835181613baf57fe5b04905060108110613bbf57600080fd5b60008660205b836020028111613c475785810151925060028806613c0d578183604051602001613bf09291906150e6565b604051602081830303815290604052805190602001209150613c39565b8282604051602001613c209291906150e6565b6040516020818303038152906040528051906020012091505b600288049750602001613bc5565b509094149695505050505050565b606083604001518015613c6a57508360200151155b15613c7457610d73565b600082613c9457604051613c879061513f565b6040518091039020613ca9565b604051613ca090615155565b60405180910390205b9050808560200151613cbc576000613cbf565b60015b60ff1660001b858760c001516001600160a01b0316886101000151896101400151604051602001613cf495949392919061522d565b60408051601f1981840301815290829052613d12929160200161510c565b6040516020818303038152906040529150509392505050565b60606110dc613d3983613f00565b613d5d565b60408051600560a21b8318601482015260348101909152606090610d73815b606081516001148015613d8f5750607f60f81b82600081518110613d7d57fe5b01602001516001600160f81b03191611155b15613d9b575080610b62565b6110dc613dad8351608060ff16613ff9565b836140c2565b604080516000808252602082019092526060915b8351811015613df757613ded82858381518110613de057fe5b60200260200101516140c2565b9150600101613dc7565b50610d73613e0a825160c060ff16613ff9565b826140c2565b60006060613e1d836136c9565b80516020909101209392505050565b613e34614563565b50805160408051808201909152602092830181529182015290565b606081604051908082528060200260200182016040528015613e8b57816020015b613e78614563565b815260200190600190039081613e705790505b509050613e9661457d565b613e9f846141a7565b905060005b83811015613ed457613eb5826141cc565b838281518110613ec157fe5b6020908102919091010152600101613ea4565b505092915050565b6000806000613eea846141fe565b90516020919091036101000a9004949350505050565b6040805160208082528183019092526060916000918391602082018180388339019050509050836020820152600091505b6020821015613f6a57808281518110613f4657fe5b01602001516001600160f81b03191615613f5f57613f6a565b600190910190613f31565b6060826020036040519080825280601f01601f191660200182016040528015613f9a576020820181803883390190505b50905060005b8151811015613ff0578251600185019484918110613fba57fe5b602001015160f81c60f81b828281518110613fd157fe5b60200101906001600160f81b031916908160001a905350600101613fa0565b50949350505050565b6060600160401b83106140275760405162461bcd60e51b815260040161401e90615266565b60405180910390fd5b604080516001808252818301909252606091602082018180388339019050509050603784116140815782840160f81b8160008151811061406357fe5b60200101906001600160f81b031916908160001a90535090506110dc565b606061408c85613f00565b90508381510160370160f81b826000815181106140a557fe5b60200101906001600160f81b031916908160001a905350612bce82825b60608082518451016040519080825280601f01601f1916602001820160405280156140f4576020820181803883390190505b5090506000805b855181101561414a5785818151811061411057fe5b602001015160f81c60f81b83838151811061412757fe5b60200101906001600160f81b031916908160001a905350600191820191016140fb565b5060005b845181101561419d5784818151811061416357fe5b602001015160f81c60f81b83838151811061417a57fe5b60200101906001600160f81b031916908160001a9053506001918201910161414e565b5090949350505050565b6141af61457d565b60006141ba8361425d565b83519383529092016020820152919050565b6141d4614563565b602082015160006141e4826142c7565b828452602080850182905292019390910192909252919050565b805180516000918291821a906080821015614220579250600191506142589050565b60b882101561423e5760018560200151039250806001019350614255565b602085015182820160b51901945082900360b60192505b50505b915091565b8051805160009190821a90608082101561427c57600092505050610b62565b60b8821080614297575060c08210158015614297575060f882105b156142a757600192505050610b62565b60c08210156142bc575060b519019050610b62565b5060f5190192915050565b8051600090811a60808110156142e057600191506142f1565b60b88110156142f157607e19810191505b50919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152610100810161434561459d565b81526020016143526145d2565b905290565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b8154818355818111156143ef576006028160060283600052602060002091820191016143ef9190614616565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061443557805160ff1916838001178555614462565b82800160010185558215614462579182015b82811115614462578251825591602001919060010190614447565b5061446e929150614678565b5090565b8154818355818111156143ef576002028160020283600052602060002091820191016143ef9190614692565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915290565b60405180610120016040528060006001600160401b031681526020016000815260200160006001600160401b0316815260200160006001600160a01b0316815260200160008152602001606081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518060400160405280614590614563565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b61148b91905b8082111561446e5780546001600160e01b03191681556001810180546001600160a01b031990811690915560028201805490911690556000600382018190556004820181905561466f60058301826146c8565b5060060161461c565b61148b91905b8082111561446e576000815560010161467e565b61148b91905b8082111561446e5780546001600160c81b03191681556001810180546001600160e01b0319169055600201614698565b50805460018160011615610100020316600290046000825580601f106146ee5750610c1d565b601f016020900490600052602060002090810190610c1d9190614678565b80356110dc8161568d565b60008083601f84011261472957600080fd5b5081356001600160401b0381111561474057600080fd5b60208301915083602082028301111561475857600080fd5b9250929050565b80356110dc816156a1565b80516110dc816156a1565b80356110dc816156aa565b60008083601f84011261479257600080fd5b5081356001600160401b038111156147a957600080fd5b60208301915083600182028301111561475857600080fd5b600082601f8301126147d257600080fd5b81356147e56147e0826155aa565b615584565b9150808252602083016020830185838301111561480157600080fd5b61480c83828461564b565b50505092915050565b60006020828403121561482757600080fd5b6000614833848461470c565b949350505050565b6000806040838503121561484e57600080fd5b600061485a858561470c565b925050602061486b8582860161470c565b9150509250929050565b60008060006060848603121561488a57600080fd5b6000614896868661470c565b93505060206148a786828701614775565b92505060408401356001600160401b038111156148c357600080fd5b6148cf868287016147c1565b9150509250925092565b6000602082840312156148eb57600080fd5b6000614833848461476a565b60006020828403121561490957600080fd5b60006148338484614775565b6000806040838503121561492857600080fd5b60006149348585614775565b925050602061486b8582860161475f565b6000806000806080858703121561495b57600080fd5b60006149678787614775565b945050602061497887828801614775565b935050604061498987828801614775565b925050606061499a87828801614775565b91505092959194509250565b60008060008060008060008060a0898b0312156149c257600080fd5b60006149ce8b8b614775565b98505060208901356001600160401b038111156149ea57600080fd5b6149f68b828c01614780565b975097505060408901356001600160401b03811115614a1457600080fd5b614a208b828c01614780565b95509550506060614a338b828c01614775565b93505060808901356001600160401b03811115614a4f57600080fd5b614a5b8b828c01614717565b92509250509295985092959890939650565b60008060408385031215614a8057600080fd5b6000614a8c8585614775565b925050602061486b85828601614775565b600080600080600060a08688031215614ab557600080fd5b6000614ac18888614775565b9550506020614ad288828901614775565b9450506040614ae388828901614775565b9350506060614af488828901614775565b9250506080614b0588828901614775565b9150509295509295909350565b600080600080600080600060a0888a031215614b2d57600080fd5b6000614b398a8a614775565b9750506020614b4a8a828b01614775565b9650506040614b5b8a828b01614775565b95505060608801356001600160401b03811115614b7757600080fd5b614b838a828b01614780565b945094505060808801356001600160401b03811115614ba157600080fd5b614bad8a828b01614780565b925092505092959891949750929550565b614bc78161561f565b82525050565b614bc7816155de565b614bc7816155e9565b614bc78161148b565b614bc7614bf48261148b565b61148b565b614bc7614bf4826155ee565b6000614c10826155d1565b614c1a81856155d5565b9350614c2a818560208601615657565b614c3381615683565b9093019392505050565b6000614c48826155d1565b614c528185610b62565b9350614c62818560208601615657565b9290920192915050565b614bc78161562a565b6000614c82603283610b62565b7f7375626d69744e52452875696e743235362c75696e743235362c627974657333815271322c627974657333322c627974657333322960701b602082015260320192915050565b6000614cd6603c83610b62565b7f6170706c7952657175657374496e4368696c64436861696e28626f6f6c2c756981527f6e743235362c616464726573732c627974657333322c627974657329000000006020820152603c0192915050565b6000614d35600e836155d5565b6d696e70757420746f6f206c6f6e6760901b815260200192915050565b6000614d5f602a83610b62565b7f7375626d69744f52422875696e743235362c627974657333322c627974657333815269322c627974657333322960b01b6020820152602a0192915050565b6000614dab603b83610b62565b7f6170706c7952657175657374496e526f6f74436861696e28626f6f6c2c75696e81527f743235362c616464726573732c627974657333322c62797465732900000000006020820152603b0192915050565b80516102c0830190614e0f84826150dd565b506020820151614e2260208501826150dd565b506040820151614e3560408501826150dd565b506060820151614e486060850182614bd6565b506080820151614e5b6080850182614bd6565b5060a0820151614e6e60a0850182614bd6565b5060c0820151614e8160c0850182614bd6565b5060e0820151614e9460e0850182614bd6565b50610100820151614ea961010085018261505b565b50610120820151614ebe6101c0850182614ec4565b50505050565b8051610100830190614ed68482614bdf565b506020820151614ee96020850182614bdf565b506040820151614efc6040850182614bdf565b506060820151614f0f60608501826150dd565b506080820151614f2260808501826150dd565b5060a0820151614f3560a0850182614bd6565b5060c0820151614f4860c0850182614bd6565b5060e0820151614ebe60e0850182614bd6565b80516101a0830190614f6d84826150dd565b506020820151614f8060208501826150dd565b506040820151614f9360408501826150dd565b506060820151614fa660608501826150dd565b506080820151614fb960808501826150dd565b5060a0820151614fcc60a0850182614bdf565b5060c0820151614fdf60c0850182614bdf565b5060e0820151614ff260e0850182614bdf565b50610100820151615007610100850182614bd6565b5061012082015161501c610120850182614bd6565b50610140820151615031610140850182614bd6565b50610160820151615046610160850182614bd6565b50610180820151614ebe610180850182614bd6565b805160c083019061506c84826150dd565b50602082015161507f60208501826150dd565b50604082015161509260408501826150dd565b5060608201516150a560608501826150dd565b5060808201516150b860808501826150dd565b5060a0820151614ebe60a08501826150dd565b614bc7816155fb565b614bc781615640565b614bc781615613565b60006150f28285614be8565b6020820191506151028284614be8565b5060200192915050565b60006151188285614bf9565b6004820191506148338284614c3d565b6000610d738284614c3d565b60006110dc82614c75565b60006110dc82614cc9565b60006110dc82614d52565b60006110dc82614d9e565b602081016110dc8284614bcd565b6040810161517c8285614bcd565b610d736020830184614bcd565b602081016110dc8284614bd6565b60a081016151a58288614bd6565b6151b26020830187614bdf565b6151bf6040830186614bbe565b6151cc6060830185614bdf565b8181036080830152610c5b8184614c05565b60c081016151ec8289614bd6565b6151f960208301886150dd565b61520660408301876150dd565b61521360608301866150dd565b61522060808301856150dd565b610c5b60a0830184614bcd565b60a0810161523b8288614bdf565b6152486020830187614bdf565b6151bf6040830186614bdf565b60208082528101610d738184614c05565b602080825281016110dc81614d28565b6102c081016110dc8284614dfd565b6101a081016110dc8284614f5b565b602081016110dc8284614bdf565b61010081016152b1828b614bdf565b6152be602083018a614bbe565b6152cb6040830189614bcd565b6152d86060830188614c6c565b6152e56080830187614bdf565b81810360a08301526152f78186614c05565b905061530660c0830185614bd6565b61531360e0830184614bd6565b9998505050505050505050565b610100810161532f828b614bdf565b61533c602083018a614bbe565b6153496040830189614bcd565b6152d86060830188614bdf565b604081016153648285614bdf565b610d736020830184614bd6565b6080810161537f8287614bdf565b61538c6020830186614bdf565b6153996040830185614bdf565b612bce6060830184614bdf565b604081016153b48285614bdf565b610d736020830184614bdf565b60a081016153cf8288614bdf565b6153dc6020830187614bdf565b6153e96040830186614bdf565b6153f66060830185614bdf565b6123866080830184614bdf565b608081016154118287614bdf565b61541e6020830186614bdf565b61542b60408301856150d4565b612bce60608301846150d4565b6101608101615447828e6150dd565b615454602083018d614bd6565b615461604083018c614bd6565b61546e606083018b614bd6565b61547b608083018a614bd6565b61548860a08301896150cb565b61549560c0830188614bcd565b6154a260e0830187614bcd565b6154b0610100830186614bdf565b6154be610120830185614bdf565b8181036101408301526154d18184614c05565b9d9c50505050505050505050505050565b61018081016154f1828f6150dd565b6154fe602083018e6150dd565b61550b604083018d6150dd565b615518606083018c6150dd565b615525608083018b6150dd565b61553260a083018a6150dd565b61553f60c08301896150dd565b61554c60e08301886150dd565b61555a6101008301876150dd565b6155686101208301866150dd565b6155766101408301856150dd565b6154d1610160830184614bd6565b6040518181016001600160401b03811182821017156155a257600080fd5b604052919050565b60006001600160401b038211156155c057600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b60006110dc82615607565b151590565b6001600160e01b03191690565b6001600160801b031690565b6001600160a01b031690565b6001600160401b031690565b60006110dc82615635565b60006110dc8261148b565b60006110dc826155de565b60006110dc82615613565b82818337506000910152565b60005b8381101561567257818101518382015260200161565a565b83811115614ebe5750506000910152565b601f01601f191690565b615696816155de565b8114610c1d57600080fd5b615696816155e9565b6156968161148b56fea365627a7a72315820bfe268b1a951973c135b3127ddf36b187f7ab4cdf0aca2a2f9f73df2846800136c6578706572696d656e74616cf564736f6c634300050c00400000000000000000000000000a2d8bf53ff0e6b208fddd2696b156a7ccb4d1a80000000000000000000000004b01361e3bb5c1856103ce7fc1c923b6adcc3eed0000000000000000000000005c642140a3b6fa39dfd1aa9eba6c5239f5c457d500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002db431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc356e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42156e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
Deployed Bytecode
0x6080604052600436106104105760003560e01c80638b5172d01161021e578063c8ad329f11610123578063e259faf7116100ab578063ea0c73f61161007a578063ea0c73f614610ab5578063ea7f22a814610aca578063f28a7afa14610aea578063f4f31de414610b0a578063fb788a2714610b2a57610410565b8063e259faf714610a70578063e6925d0814610a85578063e7b88b8014610a8d578063e7f9650514610aa257610410565b8063d1723a96116100f2578063d1723a96146109ee578063d636857e14610a1b578063d691acd81461044b578063da0185f814610a3b578063de0ce17d14610a5b57610410565b8063c8ad329f14610979578063ca6f63801461098e578063cb5d742f146109ae578063ce8a2bc2146109ce57610410565b8063b2ae9ba8116101a6578063b8066bcb11610175578063b8066bcb146108e8578063c0c49c2a146108fd578063c0e860641461091d578063c2bc88fa1461094f578063c54626cc1461096457610410565b8063b2ae9ba81461044b578063b443f3cc1461087c578063b540adba146108b3578063b6715647146108c857610410565b806399bd3600116101ed57806399bd36001461080a578063a820c0671461081f578063a926fdbc14610832578063ab96da2d14610852578063b17fa6e91461086757610410565b80638b5172d01461044b5780638eb288ca146107e057806393521222146107f557806394be3aa51461044b57610410565b8063404f7d66116103245780636fb7f558116102ac57806378fe705f1161027b57806378fe705f1461076e5780637b929c271461078157806380e3e81d146107965780638155717d146107b6578063882eed2c146107cb57610410565b80636fb7f5581461070457806372ecb9a81461071957806375395a58146107395780637657f20a1461074e57610410565b8063570ca735116102f3578063570ca7351461067a5780635b8846821461069c5780635e0ca71b146106bc5780636299fb24146106d15780636f3e4b90146106f157610410565b8063404f7d66146105d55780634a44bdb8146105f55780634ba3a12614610622578063547685711461065a57610410565b8063183d2d1c116103a75780632aa196c8116103765780632aa196c8146105565780632b25a38b146105695780632dc6bb7b146105965780633565fb0d146105ab578063398bac63146105c057610410565b8063183d2d1c1461050c578063192adc5b1461044b5780631ec2042b14610521578063236915661461054157610410565b806308c4fff0116103e357806308c4fff0146104a25780630eaf45a8146104b757806311e4c914146104d7578063164bc2ae146104f757610410565b8063019dc09914610415578063033cfbed1461044b57806306394c9b14610460578063072900f914610482575b600080fd5b34801561042157600080fd5b506104356104303660046148f7565b610b3f565b6040516104429190615294565b60405180910390f35b34801561045757600080fd5b50610435610b67565b34801561046c57600080fd5b5061048061047b366004614815565b610b6c565b005b34801561048e57600080fd5b5061048061049d366004614815565b610bf8565b3480156104ae57600080fd5b50610435610c20565b6104ca6104c5366004614a9d565b610c25565b6040516104429190615189565b3480156104e357600080fd5b506104356104f23660046148f7565b610c66565b34801561050357600080fd5b50610435610c88565b34801561051857600080fd5b50610435610c8e565b34801561052d57600080fd5b5061043561053c3660046148f7565b610c94565b34801561054d57600080fd5b50610435610cb2565b6104ca610564366004614875565b610cb8565b34801561057557600080fd5b50610589610584366004614a6d565b610d7a565b6040516104429190615276565b3480156105a257600080fd5b506104356110e2565b3480156105b757600080fd5b506104806110e8565b3480156105cc57600080fd5b506105896110f3565b3480156105e157600080fd5b506104806105f0366004614b12565b61148e565b34801561060157600080fd5b50610615610610366004614a6d565b61171a565b6040516104429190615285565b34801561062e57600080fd5b5061064261063d3660046148f7565b61180a565b6040516104429c9b9a999897969594939291906154e2565b34801561066657600080fd5b506104ca6106753660046148f7565b611881565b34801561068657600080fd5b5061068f6118af565b6040516104429190615160565b3480156106a857600080fd5b506104356106b7366004614a6d565b6118c3565b3480156106c857600080fd5b506104806118f4565b3480156106dd57600080fd5b506104806106ec3660046149a6565b6118fd565b6104ca6106ff366004614945565b611960565b34801561071057600080fd5b5061068f611968565b34801561072557600080fd5b506104356107343660046148f7565b611977565b34801561074557600080fd5b506104ca611989565b34801561075a57600080fd5b50610480610769366004614815565b6119a2565b6104ca61077c366004614875565b6119f5565b34801561078d57600080fd5b506104ca611a63565b3480156107a257600080fd5b506104806107b1366004614815565b611a6c565b3480156107c257600080fd5b50610435611a91565b3480156107d757600080fd5b506104ca611a96565b3480156107ec57600080fd5b50610435611a9b565b34801561080157600080fd5b50610435611aa2565b34801561081657600080fd5b506104ca611ab1565b6104ca61082d366004614945565b612351565b34801561083e57600080fd5b506104ca61084d366004614815565b612390565b34801561085e57600080fd5b506104356123a3565b34801561087357600080fd5b506104356123a9565b34801561088857600080fd5b5061089c6108973660046148f7565b6123ae565b6040516104429b9a99989796959493929190615438565b3480156108bf57600080fd5b506104356124cf565b3480156108d457600080fd5b506104356108e33660046148f7565b6124d5565b3480156108f457600080fd5b5061068f6124e7565b34801561090957600080fd5b506104ca610918366004614815565b6124f6565b34801561092957600080fd5b5061093d6109383660046148f7565b612509565b604051610442969594939291906151de565b34801561095b57600080fd5b50610435612570565b34801561097057600080fd5b50610435612575565b34801561098557600080fd5b5061043561257b565b34801561099a57600080fd5b506104356109a93660046148f7565b612581565b3480156109ba57600080fd5b506104ca6109c936600461483b565b612593565b3480156109da57600080fd5b506104ca6109e93660046148f7565b612659565b3480156109fa57600080fd5b50610a0e610a093660046148f7565b612661565b6040516104429190615255565b348015610a2757600080fd5b50610435610a363660046148f7565b61280a565b348015610a4757600080fd5b5061068f610a56366004614815565b61282f565b348015610a6757600080fd5b5061068f610b67565b348015610a7c57600080fd5b5061068f61284a565b610480612859565b348015610a9957600080fd5b5061068f612860565b6104ca610ab0366004614875565b61286f565b348015610ac157600080fd5b506104356128cb565b348015610ad657600080fd5b5061093d610ae53660046148f7565b6128d1565b348015610af657600080fd5b506104ca610b05366004614915565b6128de565b348015610b1657600080fd5b5061089c610b253660046148f7565b612927565b348015610b3657600080fd5b50610435612934565b600081815260086020526040902060010154600160401b90046001600160401b03165b919050565b600081565b60005461010090046001600160a01b0316331480610b9457506004546001600160a01b031633145b610b9d57600080fd5b60008054610100600160a81b0319166101006001600160a01b038416021790556040517f4721129e0e676ed6a92909bb24e853ccdd63ad72280cc2e974e38e480e0e6e5490610bed908390615160565b60405180910390a150565b60005461010090046001600160a01b03163314610c1457600080fd5b610c1d8161293a565b50565b600f81565b6000610c3033612390565b610c3957600080fd5b6000805460ff16610c4e57610c4c612982565b505b610c5b8787878787612af8565b979650505050505050565b600090815260086020526040902054600160801b90046001600160401b031690565b60105481565b60065481565b6000908152600860205260409020600101546001600160401b031690565b600d5481565b60008034610cce6009600b888489898880612bd7565b600d805460010190556006546000908152600860205260408082209051929450917f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c291610d1d91869190615356565b60405180910390a17f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d833389858a8a600080604051610d63989796959493929190615320565b60405180910390a1600193505050505b9392505050565b610d826142f7565b600860008481526020019081526020016000206003016000838152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b92915050565b60135481565b6110f1336131f9565b565b6110fb6142f7565b600860006006548152602001908152602001600020600301600060086000600654815260200190815260200160002060000160109054906101000a90046001600160401b03166001600160401b03168152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b90565b600087815260086020908152604080832089845260048101909252909120600581015460ff166114bd57600080fd5b6005810154640100000000900460ff166114d657600080fd5b6005810154600090610100900460ff1680156115e2576115af83600c8560000160089054906101000a90046001600160401b03166001600160401b03168154811061151d57fe5b9060005260206000209060020201600a8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156115dc573d6000803e3d6000fd5b506116d4565b6116a583600b8560000160089054906101000a90046001600160401b03166001600160401b03168154811061161357fe5b906000526020600020906002020160098c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156116d2573d6000803e3d6000fd5b505b7fc8135db115644ed4ae193313c4c801235ef740d2a57a8d5e6fe26ab66635698a8282604051611705929190615356565b60405180910390a15050505050505050505050565b611722614357565b506000918252600860209081526040808420928452600492830182529283902083516101a08101855281546001600160401b038082168352600160401b8204811694830194909452600160801b8104841695820195909552600160c01b9094048216606085015260018101549091166080840152600281015460a0840152600381015460c08401529081015460e08301526005015460ff80821615156101008085019190915282048116151561012084015262010000820481161515610140840152630100000082048116151561016084015264010000000090910416151561018082015290565b6008602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b808504831694600160801b808204851695600160c01b92839004861695858116958581048216958482048316959182900483169484841694918204841693908204169160ff9104168c565b6000805b828110156118a657611895611ab1565b61189e57600080fd5b600101611885565b50600192915050565b60005461010090046001600160a01b031681565b600091825260086020908152604080842092845260049092019052902054600160c01b90046001600160401b031690565b6110f13361334c565b60065460009081526008602090815260408083208b845260048101909252909120600581015460ff161561193057600080fd5b8054426001600160401b03600160801b90920491909116600f011161195457600080fd5b50505050505050505050565b600080610410565b6004546001600160a01b031681565b60076020526000908152604090205481565b6000611993612982565b61199c57600080fd5b50600190565b60005461010090046001600160a01b03163314806119ca57506004546001600160a01b031633145b6119d357600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000611a0e600a600c8860008989600180612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d81338860008989600180604051611a4f9897969594939291906152a2565b60405180910390a150600195945050505050565b60005460ff1681565b60005461010090046001600160a01b03163314611a8857600080fd5b610c1d81613394565b600a81565b600181565b620186a081565b6000611aac6133dc565b905090565b60105460009081526008602052604081206011546001820154601254849392916001600160401b03161015611ae557600080fd5b601254600090815260048301602090815260408083208484526003860190925290912083546001600160401b031615801590611b2f575083546012546001600160401b0390911611155b15611b9a5750506010805460010190819055600090815260086020908152604080832080546001600160401b03600160401b82048116808752600384018652848720600160c01b90930490911660128190556011829055865260048301909452919093209294509092505b600582015460ff16611c2c5782611bc4576010546000908152600f60205260409020549250611beb565b600092835260038401602052604090922060020154600160401b90046001600160401b0316915b82611bf557600080fd5b50506000818152600383016020908152604080832080546001600160401b0316601281905584526004860190925290912090611c4c565b5080546001600160401b0316600081815260038501602052604090209092505b60118390558054600160c01b900460ff1615611c6757600080fd5b8054600160d01b900460ff16611c7c57600080fd5b600582015460ff16611c8d57600080fd5b6005820154640100000000900460ff16611ca657600080fd5b8154426001600160401b03600160c01b90920491909116600a011115611ccb57600080fd5b6005820154610100900460ff161561203f57601454600a549095508510611cf157600080fd5b6000600a8681548110611d0057fe5b906000526020600020906006020190506000600c8460000160089054906101000a90046001600160401b03166001600160401b031681548110611d3f57fe5b600091825260209091206002909102018054909150600160881b90046001600160401b03168710801590611d80575060018101546001600160401b03168711155b611d8957600080fd5b60018101546001600160401b0316871415611de45785546001600160401b031615801590611dcb575085546012546000196001600160401b0392831601909116145b15611dda576010805460010190555b6012805460010190555b600187016014558154600160401b900460ff168015611e0c57508154600160581b900460ff16155b15611fe357604080516101608101825283546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808601546001600160a01b0390811660c085015260028088015490911660e085015260038701546101008086019190915260048801546101208601526005880180548751948116159092026000190190911691909104601f8101849004840283018401909552848252611f6d948c9493889361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b820191906000526020600020905b815481529060010190602001808311611f3957829003601f168201915b5050505050815250506133e190919063ffffffff16565b5060018201546040516001600160a01b03909116906108fc9060009081818181818888f19350505050158015611fa7573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876001604051611fda929190615356565b60405180910390a15b815460ff60501b1916600160501b1782556040517f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047390612027908990600190615356565b60405180910390a1600197505050505050505061148b565b601354600954909550851061205357600080fd5b8154600b8054600092600160401b90046001600160401b031690811061207557fe5b600091825260209091206002909102018054909150600160881b90046001600160401b031686108015906120b6575060018101546001600160401b03168611155b6120bf57600080fd5b60018101546001600160401b031686141561211a5784546001600160401b031615801590612101575084546012546000196001600160401b0392831601909116145b15612110576010805460010190555b6012805460010190555b60006009878154811061212957fe5b6000918252602090912060018901601355600690910201805460ff60501b1916600160501b17808255909150600160401b900460ff16801561217457508054600160581b900460ff16155b1561230957604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612293948c9493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b5060018101546040516001600160a01b03909116906108fc9060009081818181818888f193505050501580156122cd573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876000604051612300929190615356565b60405180910390a15b7f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047387600060405161233b929190615356565b60405180910390a1600197505050505050505090565b600061235c33612390565b61236557600080fd5b6000805460ff1661237a57612378612982565b505b6123868686868661348e565b9695505050505050565b60006110dc60178363ffffffff61356816565b60055481565b601481565b600981815481106123bb57fe5b6000918252602091829020600691909102018054600180830154600280850154600386015460048701546005880180546040805161010099831615999099026000190190911695909504601f81018b90048b0288018b019095528487526001600160401b0388169a50600160401b880460ff9081169a600160481b8a0482169a600160501b8b0483169a600160581b810490931699600160601b9093046001600160801b0316986001600160a01b03908116989716969093918301828280156124c55780601f1061249a576101008083540402835291602001916124c5565b820191906000526020600020905b8154815290600101906020018083116124a857829003601f168201915b505050505090508b565b60095490565b600e6020526000908152604090205481565b6003546001600160a01b031681565b60006110dc60168363ffffffff61356816565b600c818154811061251657fe5b60009182526020909120600290910201805460019091015460ff821692506001600160401b036101008304811692600160481b8104821692600160881b9091048216918116906001600160a01b03600160401b9091041686565b603c81565b60145481565b60115481565b600f6020526000908152604090205481565b600061259e336124f6565b6125a757600080fd5b6125b9836001600160a01b031661359d565b6125c257600080fd5b6001600160a01b0383811660009081526015602052604090205416156125e757600080fd5b6001600160a01b038381166000908152601560205260409081902080546001600160a01b03191692851692909217909155517fc5ec2ed49686197edd2ed642c7e6096893cc81e6658cde2527030316037715d090612648908590859061516e565b60405180910390a150600192915050565b600654141590565b606060006009838154811061267257fe5b600091825260208083206002600690930201828101546001600160a01b039081168086526015845260408087205481516101608101835285546001600160401b038116825260ff600160401b820481161515838a0152600160481b82048116151583860152600160501b8204811615156060840152600160581b820416151560808301526001600160801b03600160601b9091041660a0820152600180870154861660c083015260e082019490945260038601546101008281019190915260048701546101208301526005870180548551601f60001998831615909402979097011699909904908101889004880285018801909352828452949850610d7397612805978c9791966127f896939093169492938b93610140860193909291908301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b820191906000526020600020905b8154815290600101906020018083116127c457829003601f168201915b5050505050815250506135a390919063ffffffff16565b919063ffffffff61367116565b6136c9565b600090815260086020526040902060010154600160801b90046001600160401b031690565b6015602052600090815260409020546001600160a01b031681565b6002546001600160a01b031681565b6000610410565b6001546001600160a01b031681565b60008060006128896009600b886000898960016000612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d8133886000898960016000604051611a4f9897969594939291906152a2565b600b5490565b600b818154811061251657fe5b600081156128f857600a83815481106128f357fe5b506000525b6009838154811061290557fe5b6000918252602090912060069091020154600160501b900460ff169392505050565b600a81815481106123bb57fe5b60125481565b61294b60178263ffffffff61386c16565b6040516001600160a01b038216907fb079bc2cbde1f186e0b351d4a87c4597e3ed098f571548617449e73506428d8b90600090a250565b600654600090815260086020526040812080546001600160401b0316156129ad57600091505061148b565b80546001808301546000926129df926001600160401b03600160c01b909204821692600160801b9004821601166138a5565b60018301549091506001600160401b0316811115612a025760009250505061148b565b6000818152600483016020526040902060058101546301000000900460ff1615612a32576000935050505061148b565b600581015460ff1615612a82578054426001600160401b03600160801b90920491909116600f011115612a6b576000935050505061148b565b612a768382846138bc565b6001935050505061148b565b6001808401546001600160401b03600160401b9091048116909101165b6000818152600385016020526040902054600160d01b900460ff1615612ac757600101612a9f565b612ad1848261397c565b15612aed57612ae08482613a36565b600194505050505061148b565b600094505050505090565b60025460405160009182916060916001600160a01b031690612b1990615134565b60405180910390208989898989604051602401612b3a9594939291906153c1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b789190615128565b600060405180830381855af49150503d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b509150915081612bc757600080fd5b6001925050505b95945050505050565b600061040084511115612be957600080fd5b6003546001600160a01b03888116911614808015612c05575083155b80612c2957506001600160a01b038881166000908152601560205260409020541615155b612c3257600080fd5b8954612c418b600183016143c3565b915060008a8381548110612c5157fe5b600091825260209182902060069190910201600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038d16179055805467ffffffffffffffff1916426001600160401b03161768ff00000000000000001916600160401b881515021769ff0000000000000000001916600160481b85151502176fffffffffffffffffffffffffffffffff60601b1916600160601b6001600160801b038c1602178155600381018990558751909250612d1c916005840191908901906143f4565b5084612e4557604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612e3c94889493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b612e4557600080fd5b895460009015612e5a578a5460001901612e69565b8a54612e698c60018301614472565b905060008b8281548110612e7957fe5b60009182526020909120600290910201805490915060ff1680612ec15750612e9f6133dc565b81546001808401546001600160401b03600160881b9093048316908316030116145b15612f2457805460ff1916600190811782558c548d91612ee49083908301614472565b81548110612eee57fe5b60009182526020909120600290910201805467ffffffffffffffff60881b1916600160881b6001600160401b0388160217815590505b612f2d81610c1d565b60018101805467ffffffffffffffff19166001600160401b03871617905586612f7b5780546001600160401b0361010080830482166001019091160268ffffffffffffffff00199091161781555b838015612f86575086155b156130bd57604080516101608101825284546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808701546001600160a01b0390811660c085015260028089015490911660e085015260038801546101008086019190915260048901546101208601526005890180548751948116159092026000190190911691909104601f81018490048402830184019095528482526130b89488946130a994339491938793610140860193928301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b8391908863ffffffff613af616565b6131e9565b6001600160a01b038b81166000908152601560209081526040918290205482516101608101845287546001600160401b0381168252600160401b810460ff908116151583860152600160481b82048116151583870152600160501b8204811615156060840152600160581b82041615156080830152600160601b90046001600160801b031660a0820152600180890154861660c08301526002808a0154871660e084015260038a01546101008085019190915260048b015461012085015260058b0180548851948116159092026000190190911691909104601f81018690048602830186019096528582526131e9968a966130a99695909116948793610140860193909290918301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b5050505098975050505050505050565b61320a60168263ffffffff613b1816565b6040516001600160a01b038216907ff012269e1b6bb33c7800e7e54167ddd74f0ae7244108030b6876821d3779822f90600090a250565b845460018601546001600160401b03600160881b90920482168501911681111561326a57600080fd5b600085828154811061327857fe5b6000918252602090912089546006909202019150426001600160401b03600160c01b90920491909116600a01116132ae57600080fd5b6005880154640100000000900460ff166132c757600080fd5b8054600160581b900460ff16156132dd57600080fd5b8054600160501b900460ff16156132f357600080fd5b8351602085012061330385613b4d565b1561330d57600080fd5b60005460ff166133305761332781878b6004015487613b8a565b61333057600080fd5b50805460ff60581b1916600160581b1790559695505050505050565b61335d60178263ffffffff613b1816565b6040516001600160a01b038216907ff84a004e1673d2f349a7c93c72b3794b8eba6d2f9338044d8c8cd260e51a57a190600090a250565b6133a560168263ffffffff61386c16565b6040516001600160a01b038216907fa199526a01dbcba68aa3ab9d7d06c6692c83fb1a8bcf2184e6d94ad34f5aaf9590600090a250565b601490565b600062019a285a116133f257600080fd5b8260e001516001600160a01b031663a9f793088460200151848660c001518761010001518861014001516040518663ffffffff1660e01b815260040161343c959493929190615197565b602060405180830381600087803b15801561345657600080fd5b505af115801561346a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d7391908101906148d9565b60025460405160009182916060916001600160a01b0316906134af9061514a565b6040518091039020888888886040516024016134ce9493929190615371565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161350c9190615128565b600060405180830381855af49150503d8060008114613547576040519150601f19603f3d011682016040523d82523d6000602084013e61354c565b606091505b50915091508161355b57600080fd5b5060019695505050505050565b60006001600160a01b03821661357d57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b3b151590565b6135ab61449e565b6020808401805115159183019190915260408085015115159083015260c0808501516001600160a01b031690830152511580156135e9575082604001515b156136335760c08301516001600160a01b031660e082015261014083015160208101516001600160801b03811661361f57600080fd5b6001600160801b031660a0830152506110dc565b6001600160a01b03821660e082015260a0808401516001600160801b0316908201526101008084015190820152610140808401519082015292915050565b6136796144fc565b633b9aca006020820152620186a0604082015260e08401516001600160a01b0316606082015260a08401516001600160801b031660808201526136bd848484613c55565b60a08201529392505050565b6040805160098082526101408201909252606091829190816020015b60608152602001906001900390816136e55750508351909150613710906001600160401b0316613d2b565b8160008151811061371d57fe5b60200260200101819052506137358360200151613d2b565b8160018151811061374257fe5b602002602001018190525061376383604001516001600160401b0316613d2b565b8160028151811061377057fe5b602002602001018190525061379183606001516001600160a01b0316613d3e565b8160038151811061379e57fe5b60200260200101819052506137b68360800151613d2b565b816004815181106137c357fe5b60200260200101819052506137db8360a00151613d5d565b816005815181106137e857fe5b60200260200101819052506138008360c00151613d2b565b8160068151811061380d57fe5b60200260200101819052506138258360e00151613d2b565b8160078151811061383257fe5b602002602001018190525061384b836101000151613d2b565b8160088151811061385857fe5b6020026020010181905250610d7381613db3565b6138768282613568565b1561388057600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000818310156138b55781610d73565b5090919050565b60058201805464010000000064ff000000001990911617905581546001600160c01b0316600160c01b426001600160401b039081169190910291909117835560018401805467ffffffffffffffff60801b1916600160801b8484160217808255845467ffffffffffffffff60401b199091169216600160401b029190911790556006546040517ffb96205e4b3633fd57aa805b26b51ecf528714a10241a4af015929dce86768d99161396f9184906153a6565b60405180910390a1505050565b8154600090600160801b90046001600160401b03168211156139a0575060006110dc565b600082815260038401602052604090208054600160c81b900460ff166139ca5760009150506110dc565b8054600160d01b900460ff16156139e55760009150506110dc565b6006810154600160881b900460ff1680613a0a57506006810154600160901b900460ff165b15613a195760009150506110dc565b60060154426001600160401b039091166014011115905092915050565b60008181526003830160205260409081902060068082018054600160801b60ff60801b19909116811767ffffffffffffffff60401b19908116600160401b426001600160401b03908116820292909217909455855460018a01805467ffffffffffffffff60801b19169186900483169094021790911681881684021790915591548354945193947f70801d4d63b3da6c19ba7349911f45bed5a99ccdfb51b8138c105872529bebd59461396f949293889383811693919091041690615403565b613b0a613b0583836000613671565b613e10565b836004018190555050505050565b613b228282613568565b613b2b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006060613b6b6004613b5f85613e2c565b9063ffffffff613e4f16565b9050610d7381600081518110613b7d57fe5b6020026020010151613edc565b60006020825181613b9757fe5b0615613ba257600080fd5b60006020835181613baf57fe5b04905060108110613bbf57600080fd5b60008660205b836020028111613c475785810151925060028806613c0d578183604051602001613bf09291906150e6565b604051602081830303815290604052805190602001209150613c39565b8282604051602001613c209291906150e6565b6040516020818303038152906040528051906020012091505b600288049750602001613bc5565b509094149695505050505050565b606083604001518015613c6a57508360200151155b15613c7457610d73565b600082613c9457604051613c879061513f565b6040518091039020613ca9565b604051613ca090615155565b60405180910390205b9050808560200151613cbc576000613cbf565b60015b60ff1660001b858760c001516001600160a01b0316886101000151896101400151604051602001613cf495949392919061522d565b60408051601f1981840301815290829052613d12929160200161510c565b6040516020818303038152906040529150509392505050565b60606110dc613d3983613f00565b613d5d565b60408051600560a21b8318601482015260348101909152606090610d73815b606081516001148015613d8f5750607f60f81b82600081518110613d7d57fe5b01602001516001600160f81b03191611155b15613d9b575080610b62565b6110dc613dad8351608060ff16613ff9565b836140c2565b604080516000808252602082019092526060915b8351811015613df757613ded82858381518110613de057fe5b60200260200101516140c2565b9150600101613dc7565b50610d73613e0a825160c060ff16613ff9565b826140c2565b60006060613e1d836136c9565b80516020909101209392505050565b613e34614563565b50805160408051808201909152602092830181529182015290565b606081604051908082528060200260200182016040528015613e8b57816020015b613e78614563565b815260200190600190039081613e705790505b509050613e9661457d565b613e9f846141a7565b905060005b83811015613ed457613eb5826141cc565b838281518110613ec157fe5b6020908102919091010152600101613ea4565b505092915050565b6000806000613eea846141fe565b90516020919091036101000a9004949350505050565b6040805160208082528183019092526060916000918391602082018180388339019050509050836020820152600091505b6020821015613f6a57808281518110613f4657fe5b01602001516001600160f81b03191615613f5f57613f6a565b600190910190613f31565b6060826020036040519080825280601f01601f191660200182016040528015613f9a576020820181803883390190505b50905060005b8151811015613ff0578251600185019484918110613fba57fe5b602001015160f81c60f81b828281518110613fd157fe5b60200101906001600160f81b031916908160001a905350600101613fa0565b50949350505050565b6060600160401b83106140275760405162461bcd60e51b815260040161401e90615266565b60405180910390fd5b604080516001808252818301909252606091602082018180388339019050509050603784116140815782840160f81b8160008151811061406357fe5b60200101906001600160f81b031916908160001a90535090506110dc565b606061408c85613f00565b90508381510160370160f81b826000815181106140a557fe5b60200101906001600160f81b031916908160001a905350612bce82825b60608082518451016040519080825280601f01601f1916602001820160405280156140f4576020820181803883390190505b5090506000805b855181101561414a5785818151811061411057fe5b602001015160f81c60f81b83838151811061412757fe5b60200101906001600160f81b031916908160001a905350600191820191016140fb565b5060005b845181101561419d5784818151811061416357fe5b602001015160f81c60f81b83838151811061417a57fe5b60200101906001600160f81b031916908160001a9053506001918201910161414e565b5090949350505050565b6141af61457d565b60006141ba8361425d565b83519383529092016020820152919050565b6141d4614563565b602082015160006141e4826142c7565b828452602080850182905292019390910192909252919050565b805180516000918291821a906080821015614220579250600191506142589050565b60b882101561423e5760018560200151039250806001019350614255565b602085015182820160b51901945082900360b60192505b50505b915091565b8051805160009190821a90608082101561427c57600092505050610b62565b60b8821080614297575060c08210158015614297575060f882105b156142a757600192505050610b62565b60c08210156142bc575060b519019050610b62565b5060f5190192915050565b8051600090811a60808110156142e057600191506142f1565b60b88110156142f157607e19810191505b50919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152610100810161434561459d565b81526020016143526145d2565b905290565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b8154818355818111156143ef576006028160060283600052602060002091820191016143ef9190614616565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061443557805160ff1916838001178555614462565b82800160010185558215614462579182015b82811115614462578251825591602001919060010190614447565b5061446e929150614678565b5090565b8154818355818111156143ef576002028160020283600052602060002091820191016143ef9190614692565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915290565b60405180610120016040528060006001600160401b031681526020016000815260200160006001600160401b0316815260200160006001600160a01b0316815260200160008152602001606081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518060400160405280614590614563565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b61148b91905b8082111561446e5780546001600160e01b03191681556001810180546001600160a01b031990811690915560028201805490911690556000600382018190556004820181905561466f60058301826146c8565b5060060161461c565b61148b91905b8082111561446e576000815560010161467e565b61148b91905b8082111561446e5780546001600160c81b03191681556001810180546001600160e01b0319169055600201614698565b50805460018160011615610100020316600290046000825580601f106146ee5750610c1d565b601f016020900490600052602060002090810190610c1d9190614678565b80356110dc8161568d565b60008083601f84011261472957600080fd5b5081356001600160401b0381111561474057600080fd5b60208301915083602082028301111561475857600080fd5b9250929050565b80356110dc816156a1565b80516110dc816156a1565b80356110dc816156aa565b60008083601f84011261479257600080fd5b5081356001600160401b038111156147a957600080fd5b60208301915083600182028301111561475857600080fd5b600082601f8301126147d257600080fd5b81356147e56147e0826155aa565b615584565b9150808252602083016020830185838301111561480157600080fd5b61480c83828461564b565b50505092915050565b60006020828403121561482757600080fd5b6000614833848461470c565b949350505050565b6000806040838503121561484e57600080fd5b600061485a858561470c565b925050602061486b8582860161470c565b9150509250929050565b60008060006060848603121561488a57600080fd5b6000614896868661470c565b93505060206148a786828701614775565b92505060408401356001600160401b038111156148c357600080fd5b6148cf868287016147c1565b9150509250925092565b6000602082840312156148eb57600080fd5b6000614833848461476a565b60006020828403121561490957600080fd5b60006148338484614775565b6000806040838503121561492857600080fd5b60006149348585614775565b925050602061486b8582860161475f565b6000806000806080858703121561495b57600080fd5b60006149678787614775565b945050602061497887828801614775565b935050604061498987828801614775565b925050606061499a87828801614775565b91505092959194509250565b60008060008060008060008060a0898b0312156149c257600080fd5b60006149ce8b8b614775565b98505060208901356001600160401b038111156149ea57600080fd5b6149f68b828c01614780565b975097505060408901356001600160401b03811115614a1457600080fd5b614a208b828c01614780565b95509550506060614a338b828c01614775565b93505060808901356001600160401b03811115614a4f57600080fd5b614a5b8b828c01614717565b92509250509295985092959890939650565b60008060408385031215614a8057600080fd5b6000614a8c8585614775565b925050602061486b85828601614775565b600080600080600060a08688031215614ab557600080fd5b6000614ac18888614775565b9550506020614ad288828901614775565b9450506040614ae388828901614775565b9350506060614af488828901614775565b9250506080614b0588828901614775565b9150509295509295909350565b600080600080600080600060a0888a031215614b2d57600080fd5b6000614b398a8a614775565b9750506020614b4a8a828b01614775565b9650506040614b5b8a828b01614775565b95505060608801356001600160401b03811115614b7757600080fd5b614b838a828b01614780565b945094505060808801356001600160401b03811115614ba157600080fd5b614bad8a828b01614780565b925092505092959891949750929550565b614bc78161561f565b82525050565b614bc7816155de565b614bc7816155e9565b614bc78161148b565b614bc7614bf48261148b565b61148b565b614bc7614bf4826155ee565b6000614c10826155d1565b614c1a81856155d5565b9350614c2a818560208601615657565b614c3381615683565b9093019392505050565b6000614c48826155d1565b614c528185610b62565b9350614c62818560208601615657565b9290920192915050565b614bc78161562a565b6000614c82603283610b62565b7f7375626d69744e52452875696e743235362c75696e743235362c627974657333815271322c627974657333322c627974657333322960701b602082015260320192915050565b6000614cd6603c83610b62565b7f6170706c7952657175657374496e4368696c64436861696e28626f6f6c2c756981527f6e743235362c616464726573732c627974657333322c627974657329000000006020820152603c0192915050565b6000614d35600e836155d5565b6d696e70757420746f6f206c6f6e6760901b815260200192915050565b6000614d5f602a83610b62565b7f7375626d69744f52422875696e743235362c627974657333322c627974657333815269322c627974657333322960b01b6020820152602a0192915050565b6000614dab603b83610b62565b7f6170706c7952657175657374496e526f6f74436861696e28626f6f6c2c75696e81527f743235362c616464726573732c627974657333322c62797465732900000000006020820152603b0192915050565b80516102c0830190614e0f84826150dd565b506020820151614e2260208501826150dd565b506040820151614e3560408501826150dd565b506060820151614e486060850182614bd6565b506080820151614e5b6080850182614bd6565b5060a0820151614e6e60a0850182614bd6565b5060c0820151614e8160c0850182614bd6565b5060e0820151614e9460e0850182614bd6565b50610100820151614ea961010085018261505b565b50610120820151614ebe6101c0850182614ec4565b50505050565b8051610100830190614ed68482614bdf565b506020820151614ee96020850182614bdf565b506040820151614efc6040850182614bdf565b506060820151614f0f60608501826150dd565b506080820151614f2260808501826150dd565b5060a0820151614f3560a0850182614bd6565b5060c0820151614f4860c0850182614bd6565b5060e0820151614ebe60e0850182614bd6565b80516101a0830190614f6d84826150dd565b506020820151614f8060208501826150dd565b506040820151614f9360408501826150dd565b506060820151614fa660608501826150dd565b506080820151614fb960808501826150dd565b5060a0820151614fcc60a0850182614bdf565b5060c0820151614fdf60c0850182614bdf565b5060e0820151614ff260e0850182614bdf565b50610100820151615007610100850182614bd6565b5061012082015161501c610120850182614bd6565b50610140820151615031610140850182614bd6565b50610160820151615046610160850182614bd6565b50610180820151614ebe610180850182614bd6565b805160c083019061506c84826150dd565b50602082015161507f60208501826150dd565b50604082015161509260408501826150dd565b5060608201516150a560608501826150dd565b5060808201516150b860808501826150dd565b5060a0820151614ebe60a08501826150dd565b614bc7816155fb565b614bc781615640565b614bc781615613565b60006150f28285614be8565b6020820191506151028284614be8565b5060200192915050565b60006151188285614bf9565b6004820191506148338284614c3d565b6000610d738284614c3d565b60006110dc82614c75565b60006110dc82614cc9565b60006110dc82614d52565b60006110dc82614d9e565b602081016110dc8284614bcd565b6040810161517c8285614bcd565b610d736020830184614bcd565b602081016110dc8284614bd6565b60a081016151a58288614bd6565b6151b26020830187614bdf565b6151bf6040830186614bbe565b6151cc6060830185614bdf565b8181036080830152610c5b8184614c05565b60c081016151ec8289614bd6565b6151f960208301886150dd565b61520660408301876150dd565b61521360608301866150dd565b61522060808301856150dd565b610c5b60a0830184614bcd565b60a0810161523b8288614bdf565b6152486020830187614bdf565b6151bf6040830186614bdf565b60208082528101610d738184614c05565b602080825281016110dc81614d28565b6102c081016110dc8284614dfd565b6101a081016110dc8284614f5b565b602081016110dc8284614bdf565b61010081016152b1828b614bdf565b6152be602083018a614bbe565b6152cb6040830189614bcd565b6152d86060830188614c6c565b6152e56080830187614bdf565b81810360a08301526152f78186614c05565b905061530660c0830185614bd6565b61531360e0830184614bd6565b9998505050505050505050565b610100810161532f828b614bdf565b61533c602083018a614bbe565b6153496040830189614bcd565b6152d86060830188614bdf565b604081016153648285614bdf565b610d736020830184614bd6565b6080810161537f8287614bdf565b61538c6020830186614bdf565b6153996040830185614bdf565b612bce6060830184614bdf565b604081016153b48285614bdf565b610d736020830184614bdf565b60a081016153cf8288614bdf565b6153dc6020830187614bdf565b6153e96040830186614bdf565b6153f66060830185614bdf565b6123866080830184614bdf565b608081016154118287614bdf565b61541e6020830186614bdf565b61542b60408301856150d4565b612bce60608301846150d4565b6101608101615447828e6150dd565b615454602083018d614bd6565b615461604083018c614bd6565b61546e606083018b614bd6565b61547b608083018a614bd6565b61548860a08301896150cb565b61549560c0830188614bcd565b6154a260e0830187614bcd565b6154b0610100830186614bdf565b6154be610120830185614bdf565b8181036101408301526154d18184614c05565b9d9c50505050505050505050505050565b61018081016154f1828f6150dd565b6154fe602083018e6150dd565b61550b604083018d6150dd565b615518606083018c6150dd565b615525608083018b6150dd565b61553260a083018a6150dd565b61553f60c08301896150dd565b61554c60e08301886150dd565b61555a6101008301876150dd565b6155686101208301866150dd565b6155766101408301856150dd565b6154d1610160830184614bd6565b6040518181016001600160401b03811182821017156155a257600080fd5b604052919050565b60006001600160401b038211156155c057600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b60006110dc82615607565b151590565b6001600160e01b03191690565b6001600160801b031690565b6001600160a01b031690565b6001600160401b031690565b60006110dc82615635565b60006110dc8261148b565b60006110dc826155de565b60006110dc82615613565b82818337506000910152565b60005b8381101561567257818101518382015260200161565a565b83811115614ebe5750506000910152565b601f01601f191690565b615696816155de565b8114610c1d57600080fd5b615696816155e9565b6156968161148b56fea365627a7a72315820bfe268b1a951973c135b3127ddf36b187f7ab4cdf0aca2a2f9f73df2846800136c6578706572696d656e74616cf564736f6c634300050c0040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000a2d8bf53ff0e6b208fddd2696b156a7ccb4d1a80000000000000000000000004b01361e3bb5c1856103ce7fc1c923b6adcc3eed0000000000000000000000005c642140a3b6fa39dfd1aa9eba6c5239f5c457d500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002db431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc356e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42156e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
-----Decoded View---------------
Arg [0] : _epochHandler (address): 0x0A2D8BF53FF0E6B208fddd2696b156a7cCb4D1A8
Arg [1] : _submitHandler (address): 0x4B01361e3bb5C1856103ce7fc1C923b6ADcC3eED
Arg [2] : _etherToken (address): 0x5c642140A3b6fA39Dfd1AA9eBA6C5239F5c457D5
Arg [3] : _development (bool): True
Arg [4] : _NRELength (uint256): 2
Arg [5] : _statesRoot (bytes32): 0xdb431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc3
Arg [6] : _transactionsRoot (bytes32): 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
Arg [7] : _receiptsRoot (bytes32): 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000a2d8bf53ff0e6b208fddd2696b156a7ccb4d1a8
Arg [1] : 0000000000000000000000004b01361e3bb5c1856103ce7fc1c923b6adcc3eed
Arg [2] : 0000000000000000000000005c642140a3b6fa39dfd1aa9eba6c5239f5c457d5
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : db431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc3
Arg [6] : 56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
Arg [7] : 56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
Deployed Bytecode Sourcemap
52769:20642:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67654:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67654:131:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43844:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43844:41:0;;;:::i;54933:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54933:149:0;;;;;;;;:::i;:::-;;55088:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55088:94:0;;;;;;;;:::i;44126:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44126:40:0;;;:::i;56634:515::-;;;;;;;;;:::i;:::-;;;;;;;;66699:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66699:120:0;;;;;;;;:::i;43149:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43149:33:0;;;:::i;42374:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42374:23:0;;;:::i;66573:120::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66573:120:0;;;;;;;;:::i;42863:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42863:26:0;;;:::i;61572:551::-;;;;;;;;;:::i;66825:183::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66825:183:0;;;;;;;;:::i;:::-;;;;;;;;43298:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43298:27:0;;;:::i;40416:71::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40416:71:0;;;:::i;67014:139::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67014:139:0;;;:::i;58386:829::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58386:829:0;;;;;;;;:::i;67159:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67159:171:0;;;;;;;;:::i;:::-;;;;;;;;42508:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42508:40:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66226:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66226:170:0;;;;;;;;:::i;41899:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41899:23:0;;;:::i;:::-;;;;;;;;67336:175;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67336:175:0;;;;;;;;:::i;41386:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41386:77:0;;;:::i;60122:996::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;60122:996:0;;;;;;;;:::i;57550:475::-;;;;;;;;;:::i;42022:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42022:26:0;;;:::i;42451:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42451:50:0;;;;;;;;:::i;58031:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58031:113:0;;;:::i;55282:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55282:108:0;;;;;;;;:::i;62129:402::-;;;;;;;;;:::i;41859:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41859:23:0;;;:::i;55188:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55188:88:0;;;;;;;;:::i;44252:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44252:33:0;;;:::i;45254:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45254:36:0;;;:::i;45206:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45206:41:0;;;:::i;66463:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66463:104:0;;;:::i;62678:3542::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62678:3542:0;;;:::i;57155:389::-;;;;;;;;;:::i;41170:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41170:109:0;;;;;;;;:::i;42318:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42318:21:0;;;:::i;44189:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44189:40:0;;;:::i;42597:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42597:26:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;55870:82;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55870:82:0;;;:::i;42948:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42948:53:0;;;;;;;;:::i;41992:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41992:25:0;;;:::i;40215:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40215:103:0;;;;;;;;:::i;42788:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42788:31:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;44004:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44004:41:0;;;:::i;43330:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43330:27:0;;;:::i;43187:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43187:34:0;;;:::i;43061:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43061:54:0;;;;;;;;:::i;55491:373::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55491:373:0;;;;;;;;:::i;67861:114::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67861:114:0;;;;;;;;:::i;56046:252::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56046:252:0;;;;;;;;:::i;:::-;;;;;;;;67517:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67517:131:0;;;;;;;;:::i;43542:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43542:56:0;;;;;;;;:::i;43633:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43633:81:0;;;:::i;41959:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41959:28:0;;;:::i;56355:273::-;;;:::i;41927:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41927:27:0;;;:::i;61160:406::-;;;;;;;;;:::i;55958:82::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55958:82:0;;;:::i;42752:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42752:31:0;;;;;;;;:::i;68049:221::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;68049:221:0;;;;;;;;:::i;42628:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42628:26:0;;;;;;;;:::i;43226:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43226:34:0;;;:::i;67654:131::-;67723:4;67743:17;;;:5;:17;;;;;:36;;;-1:-1:-1;;;67743:36:0;;-1:-1:-1;;;;;67743:36:0;67654:131;;;;:::o;43844:41::-;43884:1;43844:41;:::o;54933:149::-;53619:8;;;;;-1:-1:-1;;;;;53619:8:0;53605:10;:22;;:51;;-1:-1:-1;53645:11:0;;-1:-1:-1;;;;;53645:11:0;53631:10;:25;53605:51;53597:60;;;;;;55018:8;:20;;-1:-1:-1;;;;;;55018:20:0;;-1:-1:-1;;;;;55018:20:0;;;;;;55050:26;;;;;;55018:20;;55050:26;;;;;;;;;;54933:149;:::o;55088:94::-;53093:8;;;;;-1:-1:-1;;;;;53093:8:0;53079:10;:22;53071:31;;;;;;55154:22;55168:7;55154:13;:22::i;:::-;55088:94;:::o;44126:40::-;44164:2;44126:40;:::o;56634:515::-;56966:12;41126:23;41138:10;41126:11;:23::i;:::-;41118:32;;;;;;43998:1;53257:11;;;;53252:51;;53279:16;:14;:16::i;:::-;;53252:51;56997:146;57035:5;57049;57063:15;57087:22;57118:18;56997:29;:146::i;:::-;56990:153;56634:515;-1:-1:-1;;;;;;;56634:515:0:o;66699:120::-;66756:14;66786:17;;;:5;:17;;;;;:27;-1:-1:-1;;;66786:27:0;;-1:-1:-1;;;;;66786:27:0;;66699:120::o;43149:33::-;;;;:::o;42374:23::-;;;;:::o;66573:120::-;66630:14;66660:17;;;:5;:17;;;;;:27;;;-1:-1:-1;;;;;66660:27:0;;66573:120::o;42863:26::-;;;;:::o;61572:551::-;61707:12;;61769:9;61797:77;61811:4;61817;61823:3;61769:9;61839:8;61849:10;61707:12;;61797:13;:77::i;:::-;61881:14;:19;;61899:1;61881:19;;;61940:11;;61881:14;61934:18;;;:5;:18;;;;;;61966:32;;61785:89;;-1:-1:-1;61934:18:0;61966:32;;;;61785:89;;61881:14;61966:32;;;;;;;;;;62010:89;62025:9;62036:10;62048:3;62053:9;62064:8;62074:10;62086:5;62093;62010:89;;;;;;;;;;;;;;;;;;;;;;62113:4;62106:11;;;;;61572:551;;;;;;:::o;66825:183::-;66922:23;;:::i;:::-;66965:5;:17;66971:10;66965:17;;;;;;;;;;;:24;;:37;66990:11;66965:37;;;;;;;;;;;66958:44;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66825:183;;;;;:::o;43298:27::-;;;;:::o;40416:71::-;40456:25;40470:10;40456:13;:25::i;:::-;40416:71::o;67014:139::-;67059:17;;:::i;:::-;67092:5;:18;67098:11;;67092:18;;;;;;;;;;;:25;;:55;67118:5;:18;67124:11;;67118:18;;;;;;;;;;;:28;;;;;;;;;;-1:-1:-1;;;;;67118:28:0;-1:-1:-1;;;;;67092:55:0;;;;;;;;;;;;67085:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67014:139;;:::o;58386:829::-;58557:22;58582:18;;;:5;:18;;;;;;;;58637:25;;;:11;;;:25;;;;;;58679:12;;;;;;58671:21;;;;;;58707:12;;;;;;;;;58699:21;;;;;;58771:16;;;;58729:14;;58771:16;;;;;58796:357;;;;58836:81;58853:2;58857:4;58862:2;:17;;;;;;;;;;-1:-1:-1;;;;;58862:17:0;-1:-1:-1;;;;;58857:23:0;;;;;;;;;;;;;;;;;;;58882:4;58888:6;58896:12;;58836:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;58836:81:0;;;;;;58910:6;;58836:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58836:16:0;;-1:-1:-1;;;58836:81:0:i;:::-;58963:29;;58824:93;;-1:-1:-1;58963:10:0;;:29;;43838:1;;;58963:29;43838:1;58963:29;43838:1;58963:10;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58963:29:0;58796:357;;;59027:80;59044:2;59048:4;59053:2;:17;;;;;;;;;;-1:-1:-1;;;;;59053:17:0;-1:-1:-1;;;;;59048:23:0;;;;;;;;;;;;;;;;;;;59073:4;59078:6;59086:12;;59027:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;59027:80:0;;;;;;59100:6;;59027:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;59027:16:0;;-1:-1:-1;;;59027:80:0:i;:::-;59116:29;;59015:92;;-1:-1:-1;59116:10:0;;:29;;43800:1;;;59116:29;43800:1;59116:29;43800:1;59116:10;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59116:29:0;58796:357;59166:43;59184:9;59195:13;59166:43;;;;;;;;;;;;;;;;58386:829;;;;;;;;;;;:::o;67159:171::-;67248:23;;:::i;:::-;-1:-1:-1;67287:17:0;;;;:5;:17;;;;;;;;:37;;;:24;;;;:37;;;;;;67280:44;;;;;;;;;-1:-1:-1;;;;;67280:44:0;;;;;-1:-1:-1;;;67280:44:0;;;;;;;;;;;-1:-1:-1;;;67280:44:0;;;;;;;;;;;-1:-1:-1;;;67280:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67159:171::o;42508:40::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42508:40:0;;;;-1:-1:-1;;;42508:40:0;;;;;;-1:-1:-1;;;42508:40:0;;;;;;-1:-1:-1;;;42508:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66226:170::-;66278:12;;66299:72;66320:1;66316;:5;66299:72;;;66345:17;:15;:17::i;:::-;66337:26;;;;;;66323:3;;66299:72;;;-1:-1:-1;66386:4:0;;66226:170;-1:-1:-1;;66226:170:0:o;41899:23::-;;;;;;-1:-1:-1;;;;;41899:23:0;;:::o;67336:175::-;67436:4;67456:17;;;:5;:17;;;;;;;;:37;;;:24;;;;:37;;;;:49;-1:-1:-1;;;67456:49:0;;-1:-1:-1;;;;;67456:49:0;;67336:175::o;41386:77::-;41429:28;41446:10;41429:16;:28::i;60122:996::-;60369:11;;60338:22;60363:18;;;:5;:18;;;;;;;;60418:25;;;:11;;;:25;;;;;;60502:12;;;;;;60501:13;60493:22;;;;;;60583:12;;60615:15;-1:-1:-1;;;;;;;;60583:12:0;;;;;;;44164:2;60583:29;:47;60575:56;;;;;;60122:996;;;;;;;;;;:::o;57550:475::-;57746:12;;53168:31;;42022:26;;;-1:-1:-1;;;;;42022:26:0;;:::o;42451:50::-;;;;;;;;;;;;;:::o;58031:113::-;58074:12;58103:16;:14;:16::i;:::-;58095:25;;;;;;-1:-1:-1;58134:4:0;58031:113;:::o;55282:108::-;53619:8;;;;;-1:-1:-1;;;;;53619:8:0;53605:10;:22;;:51;;-1:-1:-1;53645:11:0;;-1:-1:-1;;;;;53645:11:0;53631:10;:25;53605:51;53597:60;;;;;;55363:11;:21;;-1:-1:-1;;;;;;55363:21:0;-1:-1:-1;;;;;55363:21:0;;;;;;;;;;55282:108::o;62129:402::-;62290:12;;62314:14;62347:67;62361:4;62367;62373:3;62378:1;62381:8;62391:10;62403:4;62409;62347:13;:67::i;:::-;62335:79;;62428;62443:9;62454:10;62466:3;62471:1;62474:8;62484:10;62496:4;62502;62428:79;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62521:4:0;;62129:402;-1:-1:-1;;;;;62129:402:0:o;41859:23::-;;;;;;:::o;55188:88::-;53093:8;;;;;-1:-1:-1;;;;;53093:8:0;53079:10;:22;53071:31;;;;;;55251:19;55262:7;55251:10;:19::i;44252:33::-;44283:2;44252:33;:::o;45254:36::-;45286:4;45254:36;:::o;45206:41::-;45241:6;45206:41;:::o;66463:104::-;66510:16;66542:19;:17;:19::i;:::-;66535:26;;66463:104;:::o;62678:3542::-;62794:21;;62721:12;62788:28;;;:5;:28;;;;;62842:22;;62907:14;;;;62881:22;;62721:12;;62788:28;62842:22;-1:-1:-1;;;;;62907:14:0;-1:-1:-1;62881:40:0;62873:49;;;;;;62973:22;;62931:27;62961:35;;;:11;;;:35;;;;;;;;63030:24;;;:11;;;:24;;;;;;63145:16;;-1:-1:-1;;;;;63145:16:0;:21;;;;:67;;-1:-1:-1;63196:16:0;;63170:22;;-1:-1:-1;;;;;63196:16:0;;;-1:-1:-1;63170:42:0;63145:67;63141:388;;;-1:-1:-1;;63223:21:0;:26;;63248:1;63223:26;;;;;:21;63265:28;;;:5;:28;;;;;;;;63318:15;;-1:-1:-1;;;;;;;;63318:15:0;;;;63350:24;;;:11;;;:24;;;;;-1:-1:-1;;;63410:15:0;;;;;;63385:22;:40;;;63434:22;:36;;;63486:35;;:11;;;:35;;;;;;;63265:28;;-1:-1:-1;63318:15:0;;-1:-1:-1;63141:388:0;63574:12;;;;;;63569:492;;63601:16;63597:183;;63670:21;;63644:48;;;;:25;:48;;;;;;;-1:-1:-1;63597:183:0;;;63733:24;;;;:11;;;:24;;;;;;:37;;;-1:-1:-1;;;63733:37:0;;-1:-1:-1;;;;;63733:37:0;;63597:183;63796:16;63788:25;;;;;;-1:-1:-1;;63832:24:0;;;;:11;;;:24;;;;;;;;63890:22;;-1:-1:-1;;;;;63890:22:0;63865;:47;;;63926:35;;:11;;;:35;;;;;;;63569:492;;;-1:-1:-1;63998:14:0;;-1:-1:-1;;;;;63998:14:0;;64029:24;;;:11;;;:24;;;;;63998:14;;-1:-1:-1;63569:492:0;64069:22;:36;;;64123:13;;-1:-1:-1;;;64123:13:0;;;;64122:14;64114:23;;;;;;64152:15;;-1:-1:-1;;;64152:15:0;;;;64144:24;;;;;;64183:12;;;;;;64175:21;;;;;;64211:12;;;;;;;;;64203:21;;;;;;64239:14;;64267:15;-1:-1:-1;;;;;;;;64239:14:0;;;;;;;44283:2;64239:24;:43;;64231:52;;;;;;64314:16;;;;;;;;;64310:1003;;;64353:15;;64387:4;:11;64353:15;;-1:-1:-1;64387:23:0;-1:-1:-1;64379:32:0;;;;;;64422:24;64449:4;64454:9;64449:15;;;;;;;;;;;;;;;;;;64422:42;;64473:29;64505:4;64510:2;:17;;;;;;;;;;-1:-1:-1;;;;;64510:17:0;-1:-1:-1;;;;;64505:23:0;;;;;;;;;;;;;;;;;;;;;;64547:16;;64505:23;;-1:-1:-1;;;;64547:16:0;;-1:-1:-1;;;;;64547:16:0;-1:-1:-1;;64547:29:0;;;:60;;-1:-1:-1;64593:14:0;;;;-1:-1:-1;;;;;64593:14:0;64580:27;;;64547:60;64539:69;;;;;;64663:14;;;;-1:-1:-1;;;;;64663:14:0;64650:27;;64646:220;;;64694:16;;-1:-1:-1;;;;;64694:16:0;:20;;;;:70;;-1:-1:-1;64744:16:0;;64718:22;;-1:-1:-1;;;;;;;64744:16:0;;;:20;64718:46;;;;64694:70;64690:127;;;64779:21;:26;;64804:1;64779:26;;;64690:127;64829:22;:27;;64855:1;64829:27;;;64646:220;64906:1;64894:13;;64876:15;:31;64922:10;;-1:-1:-1;;;64922:10:0;;;;:29;;;;-1:-1:-1;64937:14:0;;-1:-1:-1;;;64937:14:0;;;;64936:15;64922:29;64918:290;;;65015:27;;;;;;;;;;-1:-1:-1;;;;;65015:27:0;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;-1:-1:-1;;;;;65015:27:0;;;;;;;;;;-1:-1:-1;;;;;65015:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65015:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;65043:9;;65015:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;-1:-1:-1;65119:13:0;;;;:32;;-1:-1:-1;;;;;65119:13:0;;;;:32;;:13;;;:32;:13;:32;:13;;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65119:32:0;65167:31;65182:9;65193:4;65167:31;;;;;;;;;;;;;;;;64918:290;65216:20;;-1:-1:-1;;;;65216:20:0;-1:-1:-1;;;65216:20:0;;;65252:33;;;;;;65269:9;;65232:4;;65252:33;;;;;;;;;;65301:4;65294:11;;;;;;;;;;;64310:1003;65351:15;;65383:4;:11;65351:15;;-1:-1:-1;65383:23:0;-1:-1:-1;65375:32:0;;;;;;65453:17;;65448:4;:23;;65416:29;;-1:-1:-1;;;65453:17:0;;-1:-1:-1;;;;;65453:17:0;;65448:23;;;;;;;;;;;;;;;;;;;65488:16;;65448:23;;-1:-1:-1;;;;65488:16:0;;-1:-1:-1;;;;;65488:16:0;-1:-1:-1;;65488:29:0;;;:60;;-1:-1:-1;65534:14:0;;;;-1:-1:-1;;;;;65534:14:0;65521:27;;;65488:60;65480:69;;;;;;65600:14;;;;-1:-1:-1;;;;;65600:14:0;65587:27;;65583:265;;;65684:16;;-1:-1:-1;;;;;65684:16:0;:20;;;;:70;;-1:-1:-1;65734:16:0;;65708:22;;-1:-1:-1;;;;;;;65734:16:0;;;:20;65708:46;;;;65684:70;65680:123;;;65767:21;:26;;65792:1;65767:26;;;65680:123;65813:22;:27;;65839:1;65813:27;;;65583:265;65856:24;65883:4;65888:9;65883:15;;;;;;;;;;;;;;;;65935:1;65923:13;;65905:15;:31;65883:15;;;;;65943:20;;-1:-1:-1;;;;65943:20:0;-1:-1:-1;;;65943:20:0;;;;65883:15;;-1:-1:-1;;;;65976:10:0;;65943:20;65976:10;:29;;;;-1:-1:-1;65991:14:0;;-1:-1:-1;;;65991:14:0;;;;65990:15;65976:29;65972:177;;;66016:27;;;;;;;;;;-1:-1:-1;;;;;66016:27:0;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;-1:-1:-1;;;;;66016:27:0;;;;;;;;;;-1:-1:-1;;;;;66016:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66016:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;66044:9;;66016:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:38;-1:-1:-1;66063:13:0;;;;:32;;-1:-1:-1;;;;;66063:13:0;;;;:32;;:13;;;:32;:13;:32;:13;;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66063:32:0;66109;66124:9;66135:5;66109:32;;;;;;;;;;;;;;;;65972:177;66162:34;66179:9;66190:5;66162:34;;;;;;;;;;;;;;;;66210:4;66203:11;;;;;;;;;62678:3542;:::o;57155:389::-;57390:12;41126:23;41138:10;41126:11;:23::i;:::-;41118:32;;;;;;43998:1;53257:11;;;;53252:51;;53279:16;:14;:16::i;:::-;;53252:51;57421:117;57459:4;57472:11;57492:17;57518:13;57421:29;:117::i;:::-;57414:124;57155:389;-1:-1:-1;;;;;;57155:389:0:o;41170:109::-;41229:4;41249:24;:11;41265:7;41249:24;:15;:24;:::i;42318:21::-;;;;:::o;44189:40::-;44227:2;44189:40;:::o;42597:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42597:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42597:26:0;;;-1:-1:-1;;;;42597:26:0;;;;;;;-1:-1:-1;;;42597:26:0;;;;;-1:-1:-1;;;42597:26:0;;;;;-1:-1:-1;;;42597:26:0;;;;;;-1:-1:-1;;;42597:26:0;;;-1:-1:-1;;;;;42597:26:0;;-1:-1:-1;;;;;42597:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55870:82::-;55935:4;:11;55870:82;:::o;42948:53::-;;;;;;;;;;;;;:::o;41992:25::-;;;-1:-1:-1;;;;;41992:25:0;;:::o;40215:103::-;40271:4;40291:21;:8;40304:7;40291:21;:12;:21;:::i;42788:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42788:31:0;;;;;;-1:-1:-1;;;42788:31:0;;;;;-1:-1:-1;;;42788:31:0;;;;;;;;;-1:-1:-1;;;;;;;;42788:31:0;;;;;:::o;44004:41::-;44043:2;44004:41;:::o;43330:27::-;;;;:::o;43187:34::-;;;;:::o;43061:54::-;;;;;;;;;;;;;:::o;55491:373::-;55615:12;40174:20;40183:10;40174:8;:20::i;:::-;40166:29;;;;;;55647:20;:7;-1:-1:-1;;;;;55647:18:0;;:20::i;:::-;55639:29;;;;;;-1:-1:-1;;;;;55683:29:0;;;55724:1;55683:29;;;:20;:29;;;;;;;:43;55675:52;;;;;;-1:-1:-1;;;;;55736:29:0;;;;;;;:20;:29;;;;;;;:43;;-1:-1:-1;;;;;;55736:43:0;;;;;;;;;;;55793:47;;;;;55736:29;;:43;;55793:47;;;;;;;;;;-1:-1:-1;55854:4:0;55491:373;;;;:::o;67861:114::-;67958:11;;67943:26;;;67861:114::o;56046:252::-;56105:16;56130:24;56157:4;56162:10;56157:16;;;;;;;;;;;;;;;;56234:6;56157:16;;;;;56234:6;;;;-1:-1:-1;;;;;56234:6:0;;;56213:28;;;:20;:28;;;;;;;56189:23;;;;;;;;;-1:-1:-1;;;;;56189:23:0;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;-1:-1:-1;;;;;;;;56189:23:0;;;;;;;;56234:6;56189:23;;;;;;;;;;;;;;;;;;;;;56234:6;56189:23;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56189:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56157:16;;-1:-1:-1;56189:103:0;;:85;;56256:10;;56157:16;;56189:53;;56213:28;;;;;56189:23;;56157:16;;56189:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;:66;:85;;:66;:85;:::i;:::-;:101;:103::i;67517:131::-;67586:4;67606:17;;;:5;:17;;;;;:36;;;-1:-1:-1;;;67606:36:0;;-1:-1:-1;;;;;67606:36:0;;67517:131::o;43542:56::-;;;;;;;;;;;;-1:-1:-1;;;;;43542:56:0;;:::o;41959:28::-;;;-1:-1:-1;;;;;41959:28:0;;:::o;56355:273::-;43884:1;53168:31;;41927:27;;;-1:-1:-1;;;;;41927:27:0;;:::o;61160:406::-;61323:12;;61347:14;61380:68;61394:4;61400;61406:3;61411:1;61414:8;61424:10;61436:4;61442:5;61380:13;:68::i;:::-;61368:80;;61462;61477:9;61488:10;61500:3;61505:1;61508:8;61518:10;61530:4;61536:5;61462:80;;;;;;;;;;;;;;55958:82;56023:4;:11;55958:82;:::o;42752:31::-;;;;;;;;;;68049:221;68137:14;68164;68160:63;;;68189:4;68194:10;68189:16;;;;;;;;-1:-1:-1;68189:16:0;;68160:63;68238:4;68243:10;68238:16;;;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;68238:26:0;;;;;68049:221;-1:-1:-1;;;68049:221:0:o;42628:26::-;;;;;;;;;;43226:34;;;;:::o;41469:121::-;41525:24;:11;41541:7;41525:24;:15;:24;:::i;:::-;41561:23;;-1:-1:-1;;;;;41561:23:0;;;;;;;;41469:121;:::o;70134:1370::-;70222:11;;70178:4;70216:18;;;:5;:18;;;;;70285:16;;-1:-1:-1;;;;;70285:16:0;:21;70281:56;;70324:5;70317:12;;;;;70281:56;70373:15;;70390:23;;;;;70345:16;;70364:54;;-1:-1:-1;;;;;;;;70373:15:0;;;;;;-1:-1:-1;;;70390:23:0;;;;:27;70364:54;:8;:54::i;:::-;70499:14;;;;70345:73;;-1:-1:-1;;;;;;70499:14:0;70485:28;;70481:63;;;70531:5;70524:12;;;;;;70481:63;70552:27;70582:24;;;:11;;;:24;;;;;70673:14;;;;;;;;;70669:49;;;70705:5;70698:12;;;;;;;70669:49;70764:12;;;;;;70760:271;;;70847:12;;70879:15;-1:-1:-1;;;;;;;;70847:12:0;;;;;;;44164:2;70847:29;:47;70843:86;;;70914:5;70907:12;;;;;;;70843:86;70964:39;70981:4;70987:2;70991:11;70964:16;:39::i;:::-;71019:4;71012:11;;;;;;;70760:271;71100:23;;;;;-1:-1:-1;;;;;;;;71100:23:0;;;;;:27;;;71077:50;71134:84;71141:28;;;;:11;;;:28;;;;;:38;-1:-1:-1;;;71141:38:0;;;;71134:84;;;71209:1;71190:20;71134:84;;;71359:43;71380:4;71386:15;71359:20;:43::i;:::-;71355:123;;;71413:37;71428:4;71434:15;71413:14;:37::i;:::-;71466:4;71459:11;;;;;;;;71355:123;71493:5;71486:12;;;;;;70134:1370;:::o;50820:649::-;51232:13;;48578:63;;51080:12;;;;51205:23;;-1:-1:-1;;;;;51232:13:0;;48578:63;;;;;;;;;;;;51313:5;51327;51341:15;51365:22;51396:18;51259:162;;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;51259:162:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;51259:162:0;;;179:29:-1;;;;160:49;;;51232:190:0;;;;51259:162;51232:190;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51190:232:0;;;;51437:7;51429:16;;;;;;51459:4;51452:11;;;;50820:649;;;;;;;;:::o;68314:1756::-;68586:14;68686:4;68665:10;:17;:25;;68657:34;;;;;;68725:10;;-1:-1:-1;;;;;68718:17:0;;;68725:10;;68718:17;;68820:22;;;;;68835:7;68834:8;68820:22;:67;;;-1:-1:-1;;;;;;68847:25:0;;;68884:1;68847:25;;;:20;:25;;;;;;;:39;;68820:67;68812:76;;;;;;68909:18;;;:9;:18;;;;:::i;:::-;68897:30;;68934:22;68959:9;68969;68959:20;;;;;;;;;;;;;;;;;;;;;;;68988:11;;;:24;;69002:10;-1:-1:-1;;;;;;68988:24:0;;;;;;;69019:4;;;:10;;;;;-1:-1:-1;;;;;69019:10:0;;;;;69036:37;;-1:-1:-1;;69036:37:0;69057:15;-1:-1:-1;;;;;69036:37:0;;-1:-1:-1;;69080:18:0;-1:-1:-1;;;69080:18:0;;;;;-1:-1:-1;;69105:25:0;-1:-1:-1;;;69105:25:0;;;;;-1:-1:-1;;;;69137:29:0;-1:-1:-1;;;;;;;;69137:29:0;;;;;;69173:9;;;:20;;;69200:24;;68959:20;;-1:-1:-1;69200:24:0;;:11;;;;:24;;;;;:::i;:::-;;69291:7;69286:76;;69317:25;;;;;;;;;;-1:-1:-1;;;;;69317:25:0;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;-1:-1:-1;;;;;69317:25:0;;;;;;;;;;-1:-1:-1;;;;;69317:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69317:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;69343:9;;69317:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;69309:45;;;;;;69392:11;;69370:19;;69392:16;:50;;69427:11;;-1:-1:-1;;69427:15:0;69392:50;;;69411:13;;;:4;:13;;;;:::i;:::-;69370:72;;69451:28;69482:4;69487:14;69482:20;;;;;;;;;;;;;;;;;;;;;69548:12;;69482:20;;-1:-1:-1;69548:12:0;;;:74;;;69603:19;:17;:19::i;:::-;69580:15;;69564:13;;;;;-1:-1:-1;;;;;;;;69580:15:0;;;;;69564:13;;;:31;:35;:58;;69548:74;69544:193;;;69633:19;;-1:-1:-1;;69633:19:0;69648:4;69633:19;;;;;69671:13;;69666:4;;69671:13;;69666:4;;69671:13;;;:::i;:::-;69666:19;;;;;;;;;;;;;;;;;;;;;69694:35;;-1:-1:-1;;;;69694:35:0;-1:-1:-1;;;;;;;;69694:35:0;;;;;;69666:19;-1:-1:-1;69544:193:0;69745:9;:2;:7;:9::i;:::-;69763:13;;;:33;;-1:-1:-1;;69763:33:0;-1:-1:-1;;;;;69763:33:0;;;;;69808:7;69803:47;;69826:16;;-1:-1:-1;;;;;69826:16:0;;;;;;69841:1;69826:16;;;;;-1:-1:-1;;69826:16:0;;;;;;69803:47;69862:10;:22;;;;;69877:7;69876:8;69862:22;69858:207;;;69912:21;;;;;;;;;;-1:-1:-1;;;;;69912:21:0;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;-1:-1:-1;;;;;69912:21:0;;;;;;;;;;-1:-1:-1;;;;;69912:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69912:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;69895:62;;69912:21;;:33;;69934:10;;69912:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;69895:2;;:62;69947:9;69895:62;:13;:62;:::i;:::-;69858:207;;;-1:-1:-1;;;;;70019:25:0;;;;;;;:20;:25;;;;;;;;;;69997:21;;;;;;;;;-1:-1:-1;;;;;69997:21:0;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;-1:-1:-1;;;69997:21:0;;-1:-1:-1;;;;;69997:21:0;;;;;70019:25;69997:21;;;;;;;;;;;;;;;;;;;;;;;;;70019:25;69997:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69997:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;69980:77;;69997:21;;:48;;70019:25;;;;;69997:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69980:77;68314:1756;;;;;;;;;;;;;;:::o;40611:120::-;40667:24;:8;40683:7;40667:24;:15;:24;:::i;:::-;40703:22;;-1:-1:-1;;;;;40703:22:0;;;;;;;;40611:120;:::o;59221:808::-;59498:16;;59551:14;;;;-1:-1:-1;;;;;;;;59498:16:0;;;;;:25;;;59551:14;59538:27;;;59530:36;;;;;;59575:22;59600:3;59604:9;59600:14;;;;;;;;;;;;;;;;59631:15;;59600:14;;;;;;-1:-1:-1;59659:15:0;-1:-1:-1;;;;;;;;59631:15:0;;;;;;;44283:2;59631:25;:43;59623:52;;;;;;59690:13;;;;;;;;;59682:22;;;;;;59720:12;;-1:-1:-1;;;59720:12:0;;;;59719:13;59711:22;;;;;;59749:11;;-1:-1:-1;;;59749:11:0;;;;59748:12;59740:21;;;;;;59785:23;;;;;;59825:30;59795:12;59825:28;:30::i;:::-;:35;59817:44;;;;;;59873:11;;;;59868:103;;59903:59;59923:4;59929:6;59937:3;:16;;;59955:6;59903:19;:59::i;:::-;59895:68;;;;;;-1:-1:-1;59979:19:0;;-1:-1:-1;;;;59979:19:0;-1:-1:-1;;;59979:19:0;;;59221:808;;;;;;;;:::o;41596:129::-;41655:27;:11;41674:7;41655:27;:18;:27;:::i;:::-;41694:25;;-1:-1:-1;;;;;41694:25:0;;;;;;;;41596:129;:::o;40493:112::-;40546:21;:8;40559:7;40546:21;:12;:21;:::i;:::-;40579:20;;-1:-1:-1;;;;;40579:20:0;;;;;;;;40493:112;:::o;18259:137::-;18388:2;18259:137;:::o;30488:353::-;30602:4;30638:22;30626:9;:34;30618:43;;;;;;30690:4;:7;;;-1:-1:-1;;;;;30677:45:0;;30731:4;:11;;;30751:10;30770:4;:14;;;30793:4;:12;;;30814:4;:14;;;30677:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30677:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30677:158:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30677:158:0;;;;;;;;51508:523;51823:13;;48687:55;;51671:12;;;;51796:23;;-1:-1:-1;;;;;51823:13:0;;48687:55;;;;;;;;;;;;51904:4;51917:11;51937:17;51963:13;51850:133;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;51850:133:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;51850:133:0;;;179:29:-1;;;;160:49;;;51823:161:0;;;;51850:133;51823:161;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51781:203:0;;;;51999:7;51991:16;;;;;;-1:-1:-1;52021:4:0;;51508:523;-1:-1:-1;;;;;;51508:523:0:o;39645:155::-;39717:4;-1:-1:-1;;;;;39738:21:0;;39730:30;;;;;;-1:-1:-1;;;;;;39774:20:0;:11;:20;;;;;;;;;;;;;;;39645:155::o;38223:593::-;38767:20;38802:8;;;38223:593::o;30847:773::-;30963:18;;:::i;:::-;31006:11;;;;;;30993:24;;:10;;;:24;;;;31041:15;;;;;31024:32;;:14;;;:32;31079:14;;;;;-1:-1:-1;;;;;31063:30:0;:13;;;:30;31168:11;31167:12;:31;;;;;31183:4;:15;;;31167:31;31163:452;;;31218:14;;;;-1:-1:-1;;;;;31209:23:0;:6;;;:23;31258:14;;;;31339:4;31332:12;;31326:19;-1:-1:-1;;;;;31372:5:0;;31364:14;;;;;;-1:-1:-1;;;;;31445:22:0;:9;;;:22;-1:-1:-1;31163:452:0;;;-1:-1:-1;;;;;31490:12:0;;:6;;;:12;31523:10;;;;;-1:-1:-1;;;;;31511:22:0;:9;;;:22;31556:12;;;;;31542:11;;;:26;31593:14;;;;;31577:13;;;:30;30847:773;;;;:::o;32290:340::-;32417:13;;:::i;:::-;18133:3;32442:12;;;:30;18180:6;32479:12;;;:38;32533:7;;;;-1:-1:-1;;;;;32524:16:0;:6;;;:16;32559:10;;;;-1:-1:-1;;;;;32547:22:0;-1:-1:-1;32547:9:0;;:22;32587:37;32533:4;32601:10;32613;32587:7;:37::i;:::-;32576:8;;;:48;:3;32290:340;-1:-1:-1;;;32290:340:0:o;35206:545::-;35312:14;;;35324:1;35312:14;;;;;;;;;35262:16;;;;35312:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;35348:10:0;;35287:39;;-1:-1:-1;35348:23:0;;-1:-1:-1;;;;;35348:21:0;;:23::i;:::-;35335:7;35343:1;35335:10;;;;;;;;;;;;;:36;;;;35391:26;:4;:13;;;:24;:26::i;:::-;35378:7;35386:1;35378:10;;;;;;;;;;;;;:39;;;;35437:26;:4;:13;;;-1:-1:-1;;;;;35437:24:0;;:26::i;:::-;35424:7;35432:1;35424:10;;;;;;;;;;;;;:39;;;;35483:23;:4;:7;;;-1:-1:-1;;;;;35483:21:0;;:23::i;:::-;35470:7;35478:1;35470:10;;;;;;;;;;;;;:36;;;;35526:23;:4;:10;;;:21;:23::i;:::-;35513:7;35521:1;35513:10;;;;;;;;;;;;;:36;;;;35569:23;:4;:9;;;:21;:23::i;:::-;35556:7;35564:1;35556:10;;;;;;;;;;;;;:36;;;;35612:19;:4;:6;;;:17;:19::i;:::-;35599:7;35607:1;35599:10;;;;;;;;;;;;;:32;;;;35651:19;:4;:6;;;:17;:19::i;:::-;35638:7;35646:1;35638:10;;;;;;;;;;;;;:32;;;;35690:19;:4;:6;;;:17;:19::i;:::-;35677:7;35685:1;35677:10;;;;;;;;;;;;;:32;;;;35725:20;:7;:18;:20::i;39219:133::-;39293:18;39297:4;39303:7;39293:3;:18::i;:::-;39292:19;39284:28;;;;;;-1:-1:-1;;;;;39319:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;39319:27:0;39342:4;39319:27;;;39219:133::o;3455:101::-;3513:7;3541:1;3536;:6;;:14;;3549:1;3536:14;;;-1:-1:-1;3545:1:0;;3455:101;-1:-1:-1;3455:101:0:o;72413:369::-;72546:13;;;:20;;;-1:-1:-1;;72546:20:0;;;;;;72573:41;;-1:-1:-1;;;;;72573:41:0;-1:-1:-1;;;72598:15:0;-1:-1:-1;;;;;72573:41:0;;;;;;;;;;;;;-1:-1:-1;72623:21:0;;:44;;-1:-1:-1;;;;72623:44:0;-1:-1:-1;;;72623:44:0;;;;;;;;72705:15;;-1:-1:-1;;;;72674:47:0;;;72705:15;;-1:-1:-1;;;72674:47:0;;;;;;;72750:11;;72735:41;;;;;;72623:44;;72735:41;;;;;;;;;;72413:369;;;:::o;71575:787::-;71755:14;;71671:4;;-1:-1:-1;;;71755:14:0;;-1:-1:-1;;;;;71755:14:0;71740:29;;71736:64;;;-1:-1:-1;71787:5:0;71780:12;;71736:64;71808:24;71835:25;;;:11;;;:25;;;;;71924:17;;-1:-1:-1;;;71924:17:0;;;;71919:53;;71959:5;71952:12;;;;;71919:53;72026:15;;-1:-1:-1;;;72026:15:0;;;;72022:50;;;72059:5;72052:12;;;;;72022:50;72148:21;;;;-1:-1:-1;;;72148:21:0;;;;;:45;;-1:-1:-1;72173:20:0;;;;-1:-1:-1;;;72173:20:0;;;;72148:45;72144:80;;;72211:5;72204:12;;;;;72144:80;72278:21;;;72320:15;-1:-1:-1;;;;;72278:21:0;;;44227:2;72278:38;:57;;;-1:-1:-1;71575:787:0;;;;:::o;72861:547::-;72957:24;72984:23;;;:9;;;:23;;;;;;;73016:19;;;;:26;;-1:-1:-1;;;;;;;73016:26:0;;;;;-1:-1:-1;;;;73049:47:0;;;-1:-1:-1;;;73080:15:0;-1:-1:-1;;;;;73049:47:0;;;;;;;;;;;;73136:20;;-1:-1:-1;73105:21:0;;:52;;-1:-1:-1;;;;73105:52:0;73136:20;;;;;;73105:52;;;;73164:44;;;;;;;;;;;;73315:11;;73342:22;;73300:87;;72984:23;;73300:87;;;;73315:11;;72984:23;;73342:22;;;;73366:20;;;;;;73300:87;;33529:711;33782:49;33787:43;33792:18;33812:10;33824:5;33787:4;:43::i;:::-;33782:4;:49::i;:::-;33757:17;:22;;:74;;;;33529:711;;;;:::o;39424:136::-;39500:18;39504:4;39510:7;39500:3;:18::i;:::-;39492:27;;;;;;-1:-1:-1;;;;;39526:20:0;39549:5;39526:20;;;;;;;;;;;:28;;-1:-1:-1;;39526:28:0;;;39424:136::o;36526:172::-;36593:4;36606:26;36635;36659:1;36635:16;:4;:14;:16::i;:::-;:23;:26;:23;:26;:::i;:::-;36606:55;;36675:17;:5;36681:1;36675:8;;;;;;;;;;;;;;:15;:17::i;16126:773::-;16281:4;16320:2;16305:5;:12;:17;;;;;;:22;16297:31;;;;;;16337:19;16374:2;16359:5;:12;:17;;;;;;16337:39;;16405:2;16391:11;:16;16383:25;;;;;;16417:20;16467:4;16497:2;16480:376;16511:11;16506:2;:16;16501:1;:21;16480:376;;16584:13;;;16578:20;;-1:-1:-1;16627:1:0;16619:5;:9;16615:208;;16688:12;16702;16671:44;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16671:44:0;;;16661:55;;;;;;16646:70;;16615:208;;;16785:12;16799;16768:44;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16768:44:0;;;16758:55;;;;;;16743:70;;16615:208;16847:1;16839:5;:9;;-1:-1:-1;16529:2:0;16524:7;16480:376;;;-1:-1:-1;16869:24:0;;;;16126:773;-1:-1:-1;;;;;;16126:773:0:o;31669:565::-;31799:16;31831:4;:15;;;:31;;;;;31851:4;:11;;;31850:12;31831:31;31827:64;;;31873:10;;31827:64;31899:14;31916:10;:73;;17802;;;;;;;;;;;;;;31916;;;17942:72;;;;;;;;;;;;;;31916:73;31899:90;;32029:7;32079:4;:11;;;:19;;32097:1;32079:19;;;32093:1;32079:19;32074:25;;32066:34;;32111:10;32148:4;:14;;;-1:-1:-1;;;;;32132:32:0;32175:4;:12;;;32198:4;:14;;;32045:176;;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;32045:176:0;;;;32004:224;;;49:4:-1;32004:224:0;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;32004:224:0;;;31998:230;;31669:565;;;;;;:::o;11990:121::-;12044:12;12076:27;12088:14;12097:4;12088:8;:14::i;:::-;12076:11;:27::i;11500:351::-;11649:4;11643:11;;-1:-1:-1;;;11687:55:0;;11682:2;11675:10;;11668:75;11777:2;11770:10;;11757:24;;;11560:12;;11829:14;11643:11;11102:250;11165:12;11194:4;:11;11209:1;11194:16;:35;;;;;11225:4;11214:15;;:4;11219:1;11214:7;;;;;;;;;;;;-1:-1:-1;;;;;;11214:7:0;:15;;11194:35;11190:79;;;-1:-1:-1;11253:4:0;11246:11;;11190:79;11286:58;11297:40;11310:4;:11;10885:4;11297:40;;:12;:40::i;:::-;11339:4;11286:10;:58::i;12917:326::-;13029:12;;;13039:1;13029:12;;;;;;;;;12981;;13052:104;13073:4;:11;13069:1;:15;13052:104;;;13116:28;13127:7;13136:4;13141:1;13136:7;;;;;;;;;;;;;;13116:10;:28::i;:::-;13106:38;-1:-1:-1;13086:3:0;;13052:104;;;;13173:62;13184:41;13197:7;:14;10925:4;13184:41;;:12;:41::i;:::-;13227:7;13173:10;:62::i;35757:143::-;35810:7;35826:20;35849:13;35857:4;35849:7;:13::i;:::-;35876:18;;;;;;;;35757:143;-1:-1:-1;;;35757:143:0:o;5047:248::-;5108:14;;:::i;:::-;-1:-1:-1;5146:11:0;;5267:20;;;;;;;;;5234:4;5224:15;;;5267:20;;;;;;;5047:248::o;5504:315::-;5582:21;5637:8;5623:23;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5616:30;;5657:18;;:::i;:::-;5678:14;5687:4;5678:8;:14::i;:::-;5657:35;;5703:8;5722:90;5735:8;5729:3;:14;5722:90;;;5772:8;5777:2;5772:4;:8::i;:::-;5760:4;5765:3;5760:9;;;;;;;;;;;;;;;;;:20;5795:5;;5722:90;;;5504:315;;;;;;:::o;5997:230::-;6057:9;6080:14;6096:8;6108:13;6116:4;6108:7;:13::i;:::-;6168:16;;6199:2;6195:12;;;;6190:3;6186:22;6164:45;;;6141:79;-1:-1:-1;;;;6141:79:0:o;14977:465::-;15085:13;;;15095:2;15085:13;;;;;;;;;15026:12;;15051:6;;15026:12;;15085:13;;;21:6:-1;;104:10;15085:13:0;87:34:-1;135:17;;-1:-1;15085:13:0;15068:30;;15152:1;15147:2;15144:1;15140:10;15133:21;15184:1;15180:5;;15175:106;15191:2;15187:1;:6;15175:106;;;15219:1;15221;15219:4;;;;;;;;;;;;-1:-1:-1;;;;;;15219:4:0;:9;15215:55;;15249:5;;15215:55;15195:3;;;;;15175:106;;;15291:15;15324:1;15319:2;:6;15309:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;15309:17:0;87:34:-1;135:17;;-1:-1;15309:17:0;-1:-1:-1;15291:35:0;-1:-1:-1;15342:6:0;15337:78;15358:2;:9;15354:1;:13;15337:78;;;15397:6;;15399:3;;;;15397:1;;:6;;;;;;;;;;;;;;15389:2;15392:1;15389:5;;;;;;;;;;;:14;-1:-1:-1;;;;;15389:14:0;;;;;;;;-1:-1:-1;15369:3:0;;15337:78;;;-1:-1:-1;15432:2:0;14977:465;-1:-1:-1;;;;14977:465:0:o;14291:438::-;14362:12;-1:-1:-1;;;14395:6:0;:15;14387:42;;;;-1:-1:-1;;;14387:42:0;;;;;;;;;;;;;;;;;14458:12;;;14468:1;14458:12;;;;;;;;;14440:15;;14458:12;;;21:6:-1;;104:10;14458:12:0;87:34:-1;135:17;;-1:-1;14458:12:0;14440:30;;14495:2;14485:6;:12;14481:105;;14542:6;14533;:15;14522:28;;14514:2;14517:1;14514:5;;;;;;;;;;;:36;-1:-1:-1;;;;;14514:36:0;;;;;;;;-1:-1:-1;14572:2:0;-1:-1:-1;14565:9:0;;14481:105;14596:15;14614:16;14623:6;14614:8;:16::i;:::-;14596:34;;14672:6;14660:2;:9;:18;14681:2;14660:23;14649:36;;14641:2;14644:1;14641:5;;;;;;;;;;;:44;-1:-1:-1;;;;;14641:44:0;;;;;;;;;14703:18;14714:2;14718;13506:468;13591:12;13616:19;13664:6;:13;13648:6;:13;:29;13638:40;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;13638:40:0;87:34:-1;135:17;;-1:-1;13638:40:0;-1:-1:-1;13616:62:0;-1:-1:-1;13689:6:0;;13727:102;13743:6;:13;13739:1;:17;13727:102;;;13790:6;13797:1;13790:9;;;;;;;;;;;;;;;;13778:6;13785:1;13778:9;;;;;;;;;;;:21;-1:-1:-1;;;;;13778:21:0;;;;;;;;-1:-1:-1;13814:3:0;;;;;13758;13727:102;;;-1:-1:-1;13850:1:0;13841:102;13857:6;:13;13853:1;:17;13841:102;;;13904:6;13911:1;13904:9;;;;;;;;;;;;;;;;13892:6;13899:1;13892:9;;;;;;;;;;;:21;-1:-1:-1;;;;;13892:21:0;;;;;;;;-1:-1:-1;13928:3:0;;;;;13872;13841:102;;;-1:-1:-1;13960:6:0;;13506:468;-1:-1:-1;;;;13506:468:0:o;6769:218::-;6830:18;;:::i;:::-;6861:8;6893:20;6908:4;6893:14;:20::i;:::-;6872:18;;6924:21;;;6872:41;;;6956:17;;;:23;6924:2;6769:218;-1:-1:-1;6769:218:0:o;7015:308::-;7073:22;;:::i;:::-;7119:19;;;;7108:8;7167:16;7119:19;7167:11;:16::i;:::-;7194:27;;;7232:21;;;;:34;;;7299:16;;7277:19;;;;:38;;;;7194:7;7015:308;-1:-1:-1;7015:308:0:o;8544:763::-;8689:18;;8756:12;;8619:11;;;;8748:21;;;4283:4;8794:21;;8790:125;;;8841:5;-1:-1:-1;8867:1:0;;-1:-1:-1;8883:20:0;;-1:-1:-1;8883:20:0;8790:125;4326:4;8929:2;:20;8925:344;;;8993:1;8972:4;:18;;;:22;8966:28;;9018:5;9026:1;9018:9;9009:18;;8925:344;;;9188:18;;;;9241:12;;;-1:-1:-1;;9241:16:0;;-1:-1:-1;9188:29:0;;;;;;-1:-1:-1;8925:344:0;-1:-1:-1;;8544:763:0;;;;:::o;7574:530::-;7710:18;;7777:13;;7656:4;;7769:22;;;;4283:4;7816:21;;7812:48;;;7859:1;7852:8;;;;;;7812:48;4326:4;7875:2;:20;:72;;;;4370:4;7900:2;:22;;:46;;;;;4413:4;7926:2;:20;7900:46;7871:99;;;7969:1;7962:8;;;;;;7871:99;4370:4;7985:2;:21;7981:72;;;-1:-1:-1;;;8028:25:0;;-1:-1:-1;8021:32:0;;7981:72;-1:-1:-1;;;8071:25:0;;7574:530;-1:-1:-1;;7574:530:0:o;8156:329::-;8309:13;;8227:8;;8301:22;;4283:4;8348:21;;8344:133;;;8390:1;8384:7;;8344:133;;;4326:4;8411:2;:20;8407:70;;;-1:-1:-1;;8452:25:0;;;-1:-1:-1;8407:70:0;8156:329;;;;:::o;52769:20642::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52769:20642:0;;;-1:-1:-1;52769:20642:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;52769:20642:0;;;;;;;;;;;-1:-1:-1;;;;;52769:20642:0;;;;;;-1:-1:-1;;;;;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5:130:-1:-;72:20;;97:33;72:20;97:33;;160:352;;;290:3;283:4;275:6;271:17;267:27;257:2;;308:1;305;298:12;257:2;-1:-1;328:20;;-1:-1;;;;;357:30;;354:2;;;400:1;397;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;477:4;469:6;465:17;455:8;451:32;448:41;445:2;;;502:1;499;492:12;445:2;250:262;;;;;;520:124;584:20;;609:30;584:20;609:30;;651:128;726:13;;744:30;726:13;744:30;;786:130;853:20;;878:33;853:20;878:33;;937:335;;;1051:3;1044:4;1036:6;1032:17;1028:27;1018:2;;1069:1;1066;1059:12;1018:2;-1:-1;1089:20;;-1:-1;;;;;1118:30;;1115:2;;;1161:1;1158;1151:12;1115:2;1195:4;1187:6;1183:17;1171:29;;1245:3;1238;1230:6;1226:16;1216:8;1212:31;1209:40;1206:2;;;1262:1;1259;1252:12;1281:440;;1382:3;1375:4;1367:6;1363:17;1359:27;1349:2;;1400:1;1397;1390:12;1349:2;1437:6;1424:20;1459:64;1474:48;1515:6;1474:48;;;1459:64;;;1450:73;;1543:6;1536:5;1529:21;1579:4;1571:6;1567:17;1612:4;1605:5;1601:16;1647:3;1638:6;1633:3;1629:16;1626:25;1623:2;;;1664:1;1661;1654:12;1623:2;1674:41;1708:6;1703:3;1698;1674:41;;;1342:379;;;;;;;;1866:241;;1970:2;1958:9;1949:7;1945:23;1941:32;1938:2;;;1986:1;1983;1976:12;1938:2;2021:1;2038:53;2083:7;2063:9;2038:53;;;2028:63;1932:175;-1:-1;;;;1932:175;2114:366;;;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;2251:1;2248;2241:12;2203:2;2286:1;2303:53;2348:7;2328:9;2303:53;;;2293:63;;2265:97;2393:2;2411:53;2456:7;2447:6;2436:9;2432:22;2411:53;;;2401:63;;2372:98;2197:283;;;;;;2487:595;;;;2634:2;2622:9;2613:7;2609:23;2605:32;2602:2;;;2650:1;2647;2640:12;2602:2;2685:1;2702:53;2747:7;2727:9;2702:53;;;2692:63;;2664:97;2792:2;2810:53;2855:7;2846:6;2835:9;2831:22;2810:53;;;2800:63;;2771:98;2928:2;2917:9;2913:18;2900:32;-1:-1;;;;;2944:6;2941:30;2938:2;;;2984:1;2981;2974:12;2938:2;3004:62;3058:7;3049:6;3038:9;3034:22;3004:62;;;2994:72;;2879:193;2596:486;;;;;;3089:257;;3201:2;3189:9;3180:7;3176:23;3172:32;3169:2;;;3217:1;3214;3207:12;3169:2;3252:1;3269:61;3322:7;3302:9;3269:61;;3353:241;;3457:2;3445:9;3436:7;3432:23;3428:32;3425:2;;;3473:1;3470;3463:12;3425:2;3508:1;3525:53;3570:7;3550:9;3525:53;;3601:360;;;3719:2;3707:9;3698:7;3694:23;3690:32;3687:2;;;3735:1;3732;3725:12;3687:2;3770:1;3787:53;3832:7;3812:9;3787:53;;;3777:63;;3749:97;3877:2;3895:50;3937:7;3928:6;3917:9;3913:22;3895:50;;3968:617;;;;;4123:3;4111:9;4102:7;4098:23;4094:33;4091:2;;;4140:1;4137;4130:12;4091:2;4175:1;4192:53;4237:7;4217:9;4192:53;;;4182:63;;4154:97;4282:2;4300:53;4345:7;4336:6;4325:9;4321:22;4300:53;;;4290:63;;4261:98;4390:2;4408:53;4453:7;4444:6;4433:9;4429:22;4408:53;;;4398:63;;4369:98;4498:2;4516:53;4561:7;4552:6;4541:9;4537:22;4516:53;;;4506:63;;4477:98;4085:500;;;;;;;;4592:1147;;;;;;;;;4837:3;4825:9;4816:7;4812:23;4808:33;4805:2;;;4854:1;4851;4844:12;4805:2;4889:1;4906:53;4951:7;4931:9;4906:53;;;4896:63;;4868:97;5024:2;5013:9;5009:18;4996:32;-1:-1;;;;;5040:6;5037:30;5034:2;;;5080:1;5077;5070:12;5034:2;5108:64;5164:7;5155:6;5144:9;5140:22;5108:64;;;5098:74;;;;4975:203;5237:2;5226:9;5222:18;5209:32;-1:-1;;;;;5253:6;5250:30;5247:2;;;5293:1;5290;5283:12;5247:2;5321:64;5377:7;5368:6;5357:9;5353:22;5321:64;;;5311:74;;;;5188:203;5422:2;5440:53;5485:7;5476:6;5465:9;5461:22;5440:53;;;5430:63;;5401:98;5558:3;5547:9;5543:19;5530:33;-1:-1;;;;;5575:6;5572:30;5569:2;;;5615:1;5612;5605:12;5569:2;5643:80;5715:7;5706:6;5695:9;5691:22;5643:80;;;5633:90;;;;5509:220;4799:940;;;;;;;;;;;;5746:366;;;5867:2;5855:9;5846:7;5842:23;5838:32;5835:2;;;5883:1;5880;5873:12;5835:2;5918:1;5935:53;5980:7;5960:9;5935:53;;;5925:63;;5897:97;6025:2;6043:53;6088:7;6079:6;6068:9;6064:22;6043:53;;6119:743;;;;;;6291:3;6279:9;6270:7;6266:23;6262:33;6259:2;;;6308:1;6305;6298:12;6259:2;6343:1;6360:53;6405:7;6385:9;6360:53;;;6350:63;;6322:97;6450:2;6468:53;6513:7;6504:6;6493:9;6489:22;6468:53;;;6458:63;;6429:98;6558:2;6576:53;6621:7;6612:6;6601:9;6597:22;6576:53;;;6566:63;;6537:98;6666:2;6684:53;6729:7;6720:6;6709:9;6705:22;6684:53;;;6674:63;;6645:98;6774:3;6793:53;6838:7;6829:6;6818:9;6814:22;6793:53;;;6783:63;;6753:99;6253:609;;;;;;;;;6869:991;;;;;;;;7079:3;7067:9;7058:7;7054:23;7050:33;7047:2;;;7096:1;7093;7086:12;7047:2;7131:1;7148:53;7193:7;7173:9;7148:53;;;7138:63;;7110:97;7238:2;7256:53;7301:7;7292:6;7281:9;7277:22;7256:53;;;7246:63;;7217:98;7346:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;;;7354:63;;7325:98;7482:2;7471:9;7467:18;7454:32;-1:-1;;;;;7498:6;7495:30;7492:2;;;7538:1;7535;7528:12;7492:2;7566:64;7622:7;7613:6;7602:9;7598:22;7566:64;;;7556:74;;;;7433:203;7695:3;7684:9;7680:19;7667:33;-1:-1;;;;;7712:6;7709:30;7706:2;;;7752:1;7749;7742:12;7706:2;7780:64;7836:7;7827:6;7816:9;7812:22;7780:64;;;7770:74;;;;7646:204;7041:819;;;;;;;;;;;7867:142;7958:45;7997:5;7958:45;;;7953:3;7946:58;7940:69;;;8016:137;8115:32;8141:5;8115:32;;8280:94;8347:21;8362:5;8347:21;;8492:103;8565:24;8583:5;8565:24;;8722:152;8823:45;8843:24;8861:5;8843:24;;;8823:45;;8881:148;8980:43;8999:23;9016:5;8999:23;;9036:343;;9146:38;9178:5;9146:38;;;9196:70;9259:6;9254:3;9196:70;;;9189:77;;9271:52;9316:6;9311:3;9304:4;9297:5;9293:16;9271:52;;;9344:29;9366:6;9344:29;;;9335:39;;;;9126:253;-1:-1;;;9126:253;9386:356;;9514:38;9546:5;9514:38;;;9564:88;9645:6;9640:3;9564:88;;;9557:95;;9657:52;9702:6;9697:3;9690:4;9683:5;9679:16;9657:52;;;9721:16;;;;;9494:248;-1:-1;;9494:248;10091:142;10182:45;10221:5;10182:45;;10241:501;;10419:85;10501:2;10496:3;10419:85;;;10537:66;10517:87;;-1:-1;;;10633:2;10624:12;;10617:88;10733:2;10724:12;;10405:337;-1:-1;;10405:337;10751:501;;10929:85;11011:2;11006:3;10929:85;;;11047:66;11027:87;;11148:66;11143:2;11134:12;;11127:88;11243:2;11234:12;;10915:337;-1:-1;;10915:337;11261:364;;11421:67;11485:2;11480:3;11421:67;;;-1:-1;;;11501:87;;11616:2;11607:12;;11407:218;-1:-1;;11407:218;11634:501;;11812:85;11894:2;11889:3;11812:85;;;11930:66;11910:87;;-1:-1;;;12026:2;12017:12;;12010:88;12126:2;12117:12;;11798:337;-1:-1;;11798:337;12144:501;;12322:85;12404:2;12399:3;12322:85;;;12440:66;12420:87;;12541:66;12536:2;12527:12;;12520:88;12636:2;12627:12;;12308:337;-1:-1;;12308:337;12698:1855;12916:22;;12837:5;12828:15;;;12944:60;12832:3;12916:22;12944:60;;;12858:152;13093:4;13086:5;13082:16;13076:23;13105:61;13160:4;13155:3;13151:14;13137:12;13105:61;;;13020:152;13250:4;13243:5;13239:16;13233:23;13262:61;13317:4;13312:3;13308:14;13294:12;13262:61;;;13182:147;13405:4;13398:5;13394:16;13388:23;13417:57;13468:4;13463:3;13459:14;13445:12;13417:57;;;13339:141;13560:4;13553:5;13549:16;13543:23;13572:57;13623:4;13618:3;13614:14;13600:12;13572:57;;;13490:145;13713:4;13706:5;13702:16;13696:23;13725:57;13776:4;13771:3;13767:14;13753:12;13725:57;;;13645:143;13870:4;13863:5;13859:16;13853:23;13882:57;13933:4;13928:3;13924:14;13910:12;13882:57;;;13798:147;14020:4;14013:5;14009:16;14003:23;14032:57;14083:4;14078:3;14074:14;14060:12;14032:57;;;13955:140;14166:5;14159;14155:17;14149:24;14179:128;14300:5;14295:3;14291:15;14277:12;14179:128;;;14105:208;14385:5;14378;14374:17;14368:24;14398:134;14525:5;14520:3;14516:15;14502:12;14398:134;;;14323:215;12810:1743;;;;14633:1459;14863:22;;14786:5;14777:15;;;14891:62;14781:3;14863:22;14891:62;;;14807:152;15049:4;15042:5;15038:16;15032:23;15061:63;15118:4;15113:3;15109:14;15095:12;15061:63;;;14969:161;15216:4;15209:5;15205:16;15199:23;15228:63;15285:4;15280:3;15276:14;15262:12;15228:63;;;15140:157;15377:4;15370:5;15366:16;15360:23;15389:61;15444:4;15439:3;15435:14;15421:12;15389:61;;;15307:149;15536:4;15529:5;15525:16;15519:23;15548:61;15603:4;15598:3;15594:14;15580:12;15548:61;;;15466:149;15693:4;15686:5;15682:16;15676:23;15705:57;15756:4;15751:3;15747:14;15733:12;15705:57;;;15625:143;15848:4;15841:5;15837:16;15831:23;15860:57;15911:4;15906:3;15902:14;15888:12;15860:57;;;15778:145;16002:4;15995:5;15991:16;15985:23;16014:57;16065:4;16060:3;16056:14;16042:12;16014:57;;16156:2244;16381:22;;16307:5;16298:15;;;16409:60;16302:3;16381:22;16409:60;;;16328:147;16558:4;16551:5;16547:16;16541:23;16570:61;16625:4;16620:3;16616:14;16602:12;16570:61;;;16485:152;16715:4;16708:5;16704:16;16698:23;16727:61;16782:4;16777:3;16773:14;16759:12;16727:61;;;16647:147;16874:4;16867:5;16863:16;16857:23;16886:61;16941:4;16936:3;16932:14;16918:12;16886:61;;;16804:149;17036:4;17029:5;17025:16;17019:23;17048:61;17103:4;17098:3;17094:14;17080:12;17048:61;;;16963:152;17194:4;17187:5;17183:16;17177:23;17206:63;17263:4;17258:3;17254:14;17240:12;17206:63;;;17125:150;17360:4;17353:5;17349:16;17343:23;17372:63;17429:4;17424:3;17420:14;17406:12;17372:63;;;17285:156;17522:4;17515:5;17511:16;17505:23;17534:63;17591:4;17586:3;17582:14;17568:12;17534:63;;;17451:152;17681:5;17674;17670:17;17664:24;17694:58;17745:5;17740:3;17736:15;17722:12;17694:58;;;17613:145;17840:5;17833;17829:17;17823:24;17853:58;17904:5;17899:3;17895:15;17881:12;17853:58;;;17768:149;17996:5;17989;17985:17;17979:24;18009:58;18060:5;18055:3;18051:15;18037:12;18009:58;;;17927:146;18153:5;18146;18142:17;18136:24;18166:58;18217:5;18212:3;18208:15;18194:12;18166:58;;;18083:147;18308:5;18301;18297:17;18291:24;18321:58;18372:5;18367:3;18363:15;18349:12;18321:58;;18474:1130;18695:22;;18621:4;18612:14;;;18723:60;18616:3;18695:22;18723:60;;;18641:148;18868:4;18861:5;18857:16;18851:23;18880:61;18935:4;18930:3;18926:14;18912:12;18880:61;;;18799:148;19035:4;19028:5;19024:16;19018:23;19047:61;19102:4;19097:3;19093:14;19079:12;19047:61;;;18957:157;19191:4;19184:5;19180:16;19174:23;19203:61;19258:4;19253:3;19249:14;19235:12;19203:61;;;19124:146;19353:4;19346:5;19342:16;19336:23;19365:61;19420:4;19415:3;19411:14;19397:12;19365:61;;;19280:152;19510:4;19503:5;19499:16;19493:23;19522:61;19577:4;19572:3;19568:14;19554:12;19522:61;;19611:113;19694:24;19712:5;19694:24;;19851:124;19933:36;19963:5;19933:36;;19982:100;20053:23;20070:5;20053:23;;20206:383;;20353:75;20424:3;20415:6;20353:75;;;20450:2;20445:3;20441:12;20434:19;;20464:75;20535:3;20526:6;20464:75;;;-1:-1;20561:2;20552:12;;20341:248;-1:-1;;20341:248;20596:396;;20759:73;20828:3;20819:6;20759:73;;;20854:1;20849:3;20845:11;20838:18;;20874:93;20963:3;20954:6;20874:93;;20999:262;;21143:93;21232:3;21223:6;21143:93;;21268:372;;21467:148;21611:3;21467:148;;21647:372;;21846:148;21990:3;21846:148;;22026:372;;22225:148;22369:3;22225:148;;22405:372;;22604:148;22748:3;22604:148;;22784:213;22902:2;22887:18;;22916:71;22891:9;22960:6;22916:71;;23004:324;23150:2;23135:18;;23164:71;23139:9;23208:6;23164:71;;;23246:72;23314:2;23303:9;23299:18;23290:6;23246:72;;23335:201;23447:2;23432:18;;23461:65;23436:9;23499:6;23461:65;;23543:739;23789:3;23774:19;;23804:65;23778:9;23842:6;23804:65;;;23880:72;23948:2;23937:9;23933:18;23924:6;23880:72;;;23963:80;24039:2;24028:9;24024:18;24015:6;23963:80;;;24054:72;24122:2;24111:9;24107:18;24098:6;24054:72;;;24175:9;24169:4;24165:20;24159:3;24148:9;24144:19;24137:49;24200:72;24267:4;24258:6;24200:72;;24289:743;24533:3;24518:19;;24548:65;24522:9;24586:6;24548:65;;;24624:70;24690:2;24679:9;24675:18;24666:6;24624:70;;;24705;24771:2;24760:9;24756:18;24747:6;24705:70;;;24786;24852:2;24841:9;24837:18;24828:6;24786:70;;;24867:71;24933:3;24922:9;24918:19;24909:6;24867:71;;;24949:73;25017:3;25006:9;25002:19;24993:6;24949:73;;25039:735;25283:3;25268:19;;25298:71;25272:9;25342:6;25298:71;;;25380:72;25448:2;25437:9;25433:18;25424:6;25380:72;;;25463;25531:2;25520:9;25516:18;25507:6;25463:72;;25781:297;25917:2;25931:47;;;25902:18;;25992:76;25902:18;26054:6;25992:76;;26085:407;26276:2;26290:47;;;26261:18;;26351:131;26261:18;26351:131;;26499:306;26663:3;26648:19;;26678:117;26652:9;26768:6;26678:117;;26812:330;26988:3;26973:19;;27003:129;26977:9;27105:6;27003:129;;27149:213;27267:2;27252:18;;27281:71;27256:9;27325:6;27281:71;;27369:1087;27705:3;27690:19;;27720:71;27694:9;27764:6;27720:71;;;27802:80;27878:2;27867:9;27863:18;27854:6;27802:80;;;27893:72;27961:2;27950:9;27946:18;27937:6;27893:72;;;27976:80;28052:2;28041:9;28037:18;28028:6;27976:80;;;28067:73;28135:3;28124:9;28120:19;28111:6;28067:73;;;28189:9;28183:4;28179:20;28173:3;28162:9;28158:19;28151:49;28214:76;28285:4;28276:6;28214:76;;;28206:84;;28301:67;28363:3;28352:9;28348:19;28339:6;28301:67;;;28379;28441:3;28430:9;28426:19;28417:6;28379:67;;;27676:780;;;;;;;;;;;;28463:1071;28791:3;28776:19;;28806:71;28780:9;28850:6;28806:71;;;28888:80;28964:2;28953:9;28949:18;28940:6;28888:80;;;28979:72;29047:2;29036:9;29032:18;29023:6;28979:72;;;29062;29130:2;29119:9;29115:18;29106:6;29062:72;;29541:312;29681:2;29666:18;;29695:71;29670:9;29739:6;29695:71;;;29777:66;29839:2;29828:9;29824:18;29815:6;29777:66;;29860:547;30062:3;30047:19;;30077:71;30051:9;30121:6;30077:71;;;30159:72;30227:2;30216:9;30212:18;30203:6;30159:72;;;30242;30310:2;30299:9;30295:18;30286:6;30242:72;;;30325;30393:2;30382:9;30378:18;30369:6;30325:72;;30414:324;30560:2;30545:18;;30574:71;30549:9;30618:6;30574:71;;;30656:72;30724:2;30713:9;30709:18;30700:6;30656:72;;30745:659;30975:3;30960:19;;30990:71;30964:9;31034:6;30990:71;;;31072:72;31140:2;31129:9;31125:18;31116:6;31072:72;;;31155;31223:2;31212:9;31208:18;31199:6;31155:72;;;31238;31306:2;31295:9;31291:18;31282:6;31238:72;;;31321:73;31389:3;31378:9;31374:19;31365:6;31321:73;;31411:543;31611:3;31596:19;;31626:71;31600:9;31670:6;31626:71;;;31708:72;31776:2;31765:9;31761:18;31752:6;31708:72;;;31791:71;31858:2;31847:9;31843:18;31834:6;31791:71;;;31873;31940:2;31929:9;31925:18;31916:6;31873:71;;31961:1389;32364:3;32349:19;;32379:69;32353:9;32421:6;32379:69;;;32459:66;32521:2;32510:9;32506:18;32497:6;32459:66;;;32536;32598:2;32587:9;32583:18;32574:6;32536:66;;;32613;32675:2;32664:9;32660:18;32651:6;32613:66;;;32690:67;32752:3;32741:9;32737:19;32728:6;32690:67;;;32768:73;32836:3;32825:9;32821:19;32812:6;32768:73;;;32852:89;32936:3;32925:9;32921:19;32912:6;32852:89;;;32952:73;33020:3;33009:9;33005:19;32996:6;32952:73;;;33036;33104:3;33093:9;33089:19;33080:6;33036:73;;;33120;33188:3;33177:9;33173:19;33164:6;33120:73;;;33242:9;33236:4;33232:20;33226:3;33215:9;33211:19;33204:49;33267:73;33335:4;33325:7;33267:73;;;33259:81;32335:1015;-1:-1;;;;;;;;;;;;;32335:1015;33357:1391;33757:3;33742:19;;33772:69;33746:9;33814:6;33772:69;;;33852:70;33918:2;33907:9;33903:18;33894:6;33852:70;;;33933;33999:2;33988:9;33984:18;33975:6;33933:70;;;34014;34080:2;34069:9;34065:18;34056:6;34014:70;;;34095:71;34161:3;34150:9;34146:19;34137:6;34095:71;;;34177;34243:3;34232:9;34228:19;34219:6;34177:71;;;34259;34325:3;34314:9;34310:19;34301:6;34259:71;;;34341;34407:3;34396:9;34392:19;34383:6;34341:71;;;34423;34489:3;34478:9;34474:19;34465:6;34423:71;;;34505;34571:3;34560:9;34556:19;34547:6;34505:71;;;34587:72;34654:3;34643:9;34639:19;34629:7;34587:72;;;34670:68;34733:3;34722:9;34718:19;34708:7;34670:68;;34755:256;34817:2;34811:9;34843:17;;;-1:-1;;;;;34903:34;;34939:22;;;34900:62;34897:2;;;34975:1;34972;34965:12;34897:2;34991;34984:22;34795:216;;-1:-1;34795:216;35018:321;;-1:-1;;;;;35153:6;35150:30;35147:2;;;35193:1;35190;35183:12;35147:2;-1:-1;35324:4;35260;35237:17;;;;-1:-1;;35233:33;35314:15;;35084:255;35346:117;35429:12;;35400:63;35599:162;35701:19;;;35750:4;35741:14;;35694:67;36248:91;;36310:24;36328:5;36310:24;;36452:85;36518:13;36511:21;;36494:43;36623:144;-1:-1;;;;;;36684:78;;36667:100;36774:113;-1:-1;;;;;36836:46;;36819:68;36894:121;-1:-1;;;;;36956:54;;36939:76;37101:96;-1:-1;;;;;37162:30;;37145:52;37204:129;;37291:37;37322:5;37291:37;;37340:116;;37427:24;37445:5;37427:24;;37463:121;;37542:37;37573:5;37542:37;;37706:106;;37784:23;37801:5;37784:23;;37820:145;37901:6;37896:3;37891;37878:30;-1:-1;37957:1;37939:16;;37932:27;37871:94;37974:268;38039:1;38046:101;38060:6;38057:1;38054:13;38046:101;;;38127:11;;;38121:18;38108:11;;;38101:39;38082:2;38075:10;38046:101;;;38162:6;38159:1;38156:13;38153:2;;;-1:-1;;38227:1;38209:16;;38202:27;38023:219;38411:97;38499:2;38479:14;-1:-1;;38475:28;;38459:49;38516:117;38585:24;38603:5;38585:24;;;38578:5;38575:35;38565:2;;38624:1;38621;38614:12;38640:111;38706:21;38721:5;38706:21;;38758:117;38827:24;38845:5;38827:24;
Swarm Source
bzzr://bfe268b1a951973c135b3127ddf36b187f7ab4cdf0aca2a2f9f73df284680013
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.