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
Contract Name:
StakeManager
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-21 */ /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot 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-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * ////IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity 0.5.17; pragma experimental ABIEncoderV2; contract MPondLogic is Initializable { /// @notice EIP-20 token name for this token string public name; /// @notice EIP-20 token symbol for this token string public symbol; /// @notice EIP-20 token decimals for this token uint8 public decimals; /// @notice Total number of tokens in circulation uint256 public totalSupply; // 10k MPond uint256 public bridgeSupply; // 3k MPond address public dropBridge; /// @notice Allowance amounts on behalf of others mapping(address => mapping(address => uint96)) internal allowances; /// @notice Official record of token balances for each account mapping(address => uint96) internal balances; /// @notice A record of each accounts delegate mapping(address => mapping(address => uint96)) public delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint96 votes; } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public DOMAIN_TYPEHASH; /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public DELEGATION_TYPEHASH; /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public UNDELEGATION_TYPEHASH; /// @notice A record of states for signing / validating signatures mapping(address => uint256) public nonces; /// customized params address public admin; mapping(address => bool) public isWhiteListed; bool public enableAllTranfers; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); /// @notice The standard EIP-20 transfer event event Transfer(address indexed from, address indexed to, uint256 amount); /// @notice The standard EIP-20 approval event event Approval( address indexed owner, address indexed spender, uint256 amount ); /** * @notice Initializer a new MPond token * @param account The initial account to grant all the tokens */ function initialize( address account, address bridge, address dropBridgeAddress ) public initializer { createConstants(); require( account != bridge, "Bridge and account should not be the same address" ); balances[bridge] = uint96(bridgeSupply); delegates[bridge][address(0)] = uint96(bridgeSupply); isWhiteListed[bridge] = true; emit Transfer(address(0), bridge, bridgeSupply); uint96 remainingSupply = sub96( uint96(totalSupply), uint96(bridgeSupply), "MPond: Subtraction overflow in the constructor" ); balances[account] = remainingSupply; delegates[account][address(0)] = remainingSupply; isWhiteListed[account] = true; dropBridge = dropBridgeAddress; emit Transfer(address(0), account, uint256(remainingSupply)); } function createConstants() internal { name = "Marlin"; symbol = "MPond"; decimals = 18; totalSupply = 10000e18; bridgeSupply = 7000e18; DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); DELEGATION_TYPEHASH = keccak256( "Delegation(address delegatee,uint256 nonce,uint256 expiry,uint96 amount)" ); UNDELEGATION_TYPEHASH = keccak256( "Unelegation(address delegatee,uint256 nonce,uint256 expiry,uint96 amount)" ); admin = msg.sender; // enableAllTranfers = true; //This is only for testing, will be false } function addWhiteListAddress(address _address) external onlyAdmin("Only admin can whitelist") returns (bool) { isWhiteListed[_address] = true; return true; } function removeWhiteListAddress(address _address) external onlyAdmin("Only admin can remove from whitelist") returns (bool) { isWhiteListed[_address] = false; return true; } function enableAllTransfers() external onlyAdmin("Only admin can enable all transfers") returns (bool) { enableAllTranfers = true; return true; } function disableAllTransfers() external onlyAdmin("Only admin can disable all transfers") returns (bool) { enableAllTranfers = false; return true; } function changeDropBridge(address _updatedBridge) public onlyAdmin("Only admin can change drop bridge") { dropBridge = _updatedBridge; } function isWhiteListedTransfer(address _address1, address _address2) public view returns (bool) { if ( enableAllTranfers || isWhiteListed[_address1] || isWhiteListed[_address2] ) { return true; } else if (_address1 == dropBridge) { return true; } return false; } /** * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` * @param account The address of the account holding the funds * @param spender The address of the account spending the funds * @return The number of tokens approved */ function allowance(address account, address spender) external view returns (uint256) { return allowances[account][spender]; } /** * @notice Approve `spender` to transfer up to `amount` from `src` * @dev This will overwrite the approval amount for `spender` * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) * @param spender The address of the account which may transfer tokens * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) * @return Whether or not the approval succeeded */ function approve(address spender, uint256 rawAmount) external returns (bool) { uint96 amount; if (rawAmount == uint256(-1)) { amount = uint96(-1); } else { amount = safe96( rawAmount, "MPond::approve: amount exceeds 96 bits" ); } allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function increaseAllowance(address spender, uint256 addedAmount) external returns (bool) { uint96 amount; if (addedAmount == uint256(-1)) { amount = uint96(-1); } else { amount = safe96( addedAmount, "MPond::approve: addedAmount exceeds 96 bits" ); } allowances[msg.sender][spender] = add96( allowances[msg.sender][spender], amount, "MPond: increaseAllowance allowance value overflows" ); emit Approval(msg.sender, spender, allowances[msg.sender][spender]); return true; } function decreaseAllowance(address spender, uint256 removedAmount) external returns (bool) { uint96 amount; if (removedAmount == uint256(-1)) { amount = uint96(-1); } else { amount = safe96( removedAmount, "MPond::approve: removedAmount exceeds 96 bits" ); } allowances[msg.sender][spender] = sub96( allowances[msg.sender][spender], amount, "MPond: decreaseAllowance allowance value underflows" ); emit Approval(msg.sender, spender, allowances[msg.sender][spender]); return true; } /** * @notice Get the number of tokens held by the `account` * @param account The address of the account to get the balance of * @return The number of tokens held */ function balanceOf(address account) external view returns (uint256) { return balances[account]; } /** * @notice Transfer `amount` tokens from `msg.sender` to `dst` * @param dst The address of the destination account * @param rawAmount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transfer(address dst, uint256 rawAmount) external returns (bool) { require( isWhiteListedTransfer(msg.sender, dst), "Atleast one of the address (src or dst) should be whitelisted or all transfers must be enabled via enableAllTransfers()" ); uint96 amount = safe96( rawAmount, "MPond::transfer: amount exceeds 96 bits" ); _transferTokens(msg.sender, dst, amount); return true; } /** * @notice Transfer `amount` tokens from `src` to `dst` * @param src The address of the source account * @param dst The address of the destination account * @param rawAmount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transferFrom( address src, address dst, uint256 rawAmount ) external returns (bool) { require( isWhiteListedTransfer(src, dst), "Atleast one of the address (src or dst) should be whitelisted or all transfers must be enabled via enableAllTransfers()" ); address spender = msg.sender; uint96 spenderAllowance = allowances[src][spender]; uint96 amount = safe96( rawAmount, "MPond::approve: amount exceeds 96 bits" ); if (spender != src && spenderAllowance != uint96(-1)) { uint96 newAllowance = sub96( spenderAllowance, amount, "MPond::transferFrom: transfer amount exceeds spender allowance" ); allowances[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee, uint96 amount) public { return _delegate(msg.sender, delegatee, amount); } function undelegate(address delegatee, uint96 amount) public { return _undelegate(msg.sender, delegatee, amount); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s, uint96 amount ) public { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry, amount) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "MPond::delegateBySig: invalid signature" ); require( nonce == nonces[signatory]++, "MPond::delegateBySig: invalid nonce" ); require(now <= expiry, "MPond::delegateBySig: signature expired"); return _delegate(signatory, delegatee, amount); } function undelegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s, uint96 amount ) public { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(UNDELEGATION_TYPEHASH, delegatee, nonce, expiry, amount) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "MPond::undelegateBySig: invalid signature" ); require( nonce == nonces[signatory]++, "MPond::undelegateBySig: invalid nonce" ); require(now <= expiry, "MPond::undelegateBySig: signature expired"); return _undelegate(signatory, delegatee, amount); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint96) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints != 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) public view returns (uint96) { require( blockNumber < block.number, "MPond::getPriorVotes: not yet determined" ); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate( address delegator, address delegatee, uint96 amount ) internal { delegates[delegator][address(0)] = sub96( delegates[delegator][address(0)], amount, "MPond: delegates underflow" ); delegates[delegator][delegatee] = add96( delegates[delegator][delegatee], amount, "MPond: delegates overflow" ); emit DelegateChanged(delegator, address(0), delegatee); _moveDelegates(address(0), delegatee, amount); } function _undelegate( address delegator, address delegatee, uint96 amount ) internal { delegates[delegator][delegatee] = sub96( delegates[delegator][delegatee], amount, "MPond: undelegates underflow" ); delegates[delegator][address(0)] = add96( delegates[delegator][address(0)], amount, "MPond: delegates underflow" ); emit DelegateChanged(delegator, delegatee, address(0)); _moveDelegates(delegatee, address(0), amount); } function _transferTokens( address src, address dst, uint96 amount ) internal { require( src != address(0), "MPond::_transferTokens: cannot transfer from the zero address" ); require( delegates[src][address(0)] >= amount, "MPond: _transferTokens: undelegated amount should be greater than transfer amount" ); require( dst != address(0), "MPond::_transferTokens: cannot transfer to the zero address" ); balances[src] = sub96( balances[src], amount, "MPond::_transferTokens: transfer amount exceeds balance" ); delegates[src][address(0)] = sub96( delegates[src][address(0)], amount, "MPond: _tranferTokens: undelegate subtraction error" ); balances[dst] = add96( balances[dst], amount, "MPond::_transferTokens: transfer amount overflows" ); delegates[dst][address(0)] = add96( delegates[dst][address(0)], amount, "MPond: _transferTokens: undelegate addition error" ); emit Transfer(src, dst, amount); // _moveDelegates(delegates[src], delegates[dst], amount); } function _moveDelegates( address srcRep, address dstRep, uint96 amount ) internal { if (srcRep != dstRep && amount != 0) { if (srcRep != address(0)) { uint32 srcRepNum = numCheckpoints[srcRep]; uint96 srcRepOld = srcRepNum != 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint96 srcRepNew = sub96( srcRepOld, amount, "MPond::_moveVotes: vote amount underflows" ); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { uint32 dstRepNum = numCheckpoints[dstRep]; uint96 dstRepOld = dstRepNum != 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint96 dstRepNew = add96( dstRepOld, amount, "MPond::_moveVotes: vote amount overflows" ); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes ) internal { uint32 blockNumber = safe32( block.number, "MPond::_writeCheckpoint: block number exceeds 32 bits" ); if ( nCheckpoints != 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber ) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint( blockNumber, newVotes ); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) { require(n < 2**96, errorMessage); return uint96(n); } function add96( uint96 a, uint96 b, string memory errorMessage ) internal pure returns (uint96) { uint96 c = a + b; require(c >= a, errorMessage); return c; } function sub96( uint96 a, uint96 b, string memory errorMessage ) internal pure returns (uint96) { require(b <= a, errorMessage); return a - b; } function getChainId() internal pure returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } modifier onlyAdmin(string memory _error) { require(msg.sender == admin, _error); _; } } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity ^0.5.17; interface IRewardDelegators { // there's no undelegationWaitTime in rewardDelegators contract function undelegationWaitTime() external returns(uint256); function minMPONDStake() external returns(uint256); function MPONDTokenId() external returns(bytes32); function updateMPONDTokenId(bytes32 _updatedMPONDTokenId) external; function addRewardFactor(bytes32 _tokenId, uint256 _rewardFactor) external; function removeRewardFactor(bytes32 _tokenId) external; function updateRewardFactor(bytes32 _tokenId, uint256 _updatedRewardFactor) external; function _updateRewards(address _cluster) external; function delegate( address _delegator, address _cluster, bytes32[] calldata _tokens, uint256[] calldata _amounts ) external; function undelegate( address _delegator, address _cluster, bytes32[] calldata _tokens, uint256[] calldata _amounts ) external; function withdrawRewards(address _delegator, address _cluster) external returns(uint256); function isClusterActive(address _cluster) external returns(bool); function getClusterDelegation(address _cluster, bytes32 _tokenId) external view returns(uint256); function getDelegation(address _cluster, address _delegator, bytes32 _tokenId) external view returns(uint256); function updateUndelegationWaitTime(uint256 _undelegationWaitTime) external; function updateMinMPONDStake(uint256 _minMPONDStake) external; function updateStakeAddress(address _updatedStakeAddress) external; function updateClusterRewards(address _updatedClusterRewards) external; function updateClusterRegistry(address _updatedClusterRegistry) external; function updatePONDAddress(address _updatedPOND) external; function getFullTokenList() external view returns (bytes32[] memory); function getAccRewardPerShare(address _cluster, bytes32 _tokenId) external view returns(uint256); } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initialize(address sender) public initializer { _owner = sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * > Note: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[50] private ______gap; } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Initializable, Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } uint256[50] private ______gap; } /** * SourceUnit: /Users/prateekyammanuru/work/marlin/contracts_github/Contracts/contracts/Stake/StakeManager.sol */ pragma solidity >=0.4.21 <0.7.0; interface Inbox { function createRetryableTicket( address destAddr, uint256 l2CallValue, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 maxGas, uint256 gasPriceBid, bytes calldata data ) external payable returns (uint256); } interface TokenGateway { function transferL2( address _to, uint256 _amount, uint256 _maxSubmissionCost, uint256 _maxGas, uint256 _gasPriceBid ) external payable returns (uint256); } contract StakeManager is Initializable, Ownable { using SafeMath for uint256; struct Stash { address staker; address delegatedCluster; mapping(bytes32 => uint256) amount; // name is not intuitive uint256 undelegatesAt; } struct Token { address addr; bool isActive; } // stashId to stash // stashId = keccak256(index) mapping(bytes32 => Stash) public stashes; // Stash index for unique id generation uint256 public stashIndex; // tokenId to token address - tokenId = keccak256(tokenTicker) mapping(bytes32 => Token) tokenAddresses; MPondLogic MPOND; MPondLogic prevMPOND; address _unused_1; IRewardDelegators public rewardDelegators; // new variables struct Lock { uint256 unlockBlock; uint256 iValue; } mapping(bytes32 => Lock) public locks; mapping(bytes32 => uint256) public lockWaitTime; bytes32 constant REDELEGATION_LOCK_SELECTOR = keccak256("REDELEGATION_LOCK"); uint256 public undelegationWaitTime; // gap so we do not accidentally access tainted storage uint256[50] __gap; mapping(bytes32 => bool) public isStashBridged; address public inbox; address public gatewayL2; address public stakeManagerL2; mapping(bytes32 => uint256) public amountBridged; mapping(bytes32 => address) public tokenGateways; event StashCreated( address indexed creator, bytes32 stashId, uint256 stashIndex, bytes32[] tokens, uint256[] amounts ); event StashDelegated(bytes32 stashId, address delegatedCluster); event StashUndelegated(bytes32 stashId, address undelegatedCluster, uint256 undelegatesAt); event StashWithdrawn(bytes32 stashId, bytes32[] tokens, uint256[] amounts); event StashClosed(bytes32 stashId, address indexed staker); event AddedToStash(bytes32 stashId, address delegatedCluster, bytes32[] tokens, uint256[] amounts); event TokenAdded(bytes32 tokenId, address tokenAddress); event TokenRemoved(bytes32 tokenId); event TokenUpdated(bytes32 tokenId, address tokenAddress); event RedelegationRequested(bytes32 stashId, address currentCluster, address updatedCluster, uint256 redelegatesAt); event Redelegated(bytes32 stashId, address updatedCluster); event LockTimeUpdated(bytes32 selector, uint256 prevLockTime, uint256 updatedLockTime); event StashSplit( bytes32 _newStashId, bytes32 _stashId, uint256 _stashIndex, bytes32[] _splitTokens, uint256[] _splitAmounts ); event StashesMerged(bytes32 _stashId1, bytes32 _stashId2); event StashUndelegationCancelled(bytes32 _stashId); event UndelegationWaitTimeUpdated(uint256 undelegationWaitTime); event RedelegationCancelled(bytes32 indexed _stashId); event StashesBridged(uint256 indexed _ticketId, bytes32[] _stashIds); function initialize( bytes32[] memory _tokenIds, address[] memory _tokenAddresses, address _MPONDTokenAddress, address _rewardDelegatorsAddress, address _owner, uint256 _undelegationWaitTime) initializer public { require( _tokenIds.length == _tokenAddresses.length ); for(uint256 i=0; i < _tokenIds.length; i++) { tokenAddresses[_tokenIds[i]] = Token(_tokenAddresses[i], true); emit TokenAdded(_tokenIds[i], _tokenAddresses[i]); } MPOND = MPondLogic(_MPONDTokenAddress); rewardDelegators = IRewardDelegators(_rewardDelegatorsAddress); undelegationWaitTime = _undelegationWaitTime; super.initialize(_owner); } function updateLockWaitTime(bytes32 _selector, uint256 _updatedWaitTime) external onlyOwner { emit LockTimeUpdated(_selector, lockWaitTime[_selector], _updatedWaitTime); lockWaitTime[_selector] = _updatedWaitTime; } function changeMPONDTokenAddress( address _MPONDTokenAddress ) external onlyOwner { prevMPOND = MPOND; MPOND = MPondLogic(_MPONDTokenAddress); emit TokenUpdated(keccak256("MPOND"), _MPONDTokenAddress); } function updateRewardDelegators( address _updatedRewardDelegator ) external onlyOwner { require( _updatedRewardDelegator != address(0) ); rewardDelegators = IRewardDelegators(_updatedRewardDelegator); } function updateInbox( address _inbox ) external onlyOwner { require( _inbox != address(0) ); inbox = _inbox; } function updateGatewayL2( address _gatewayL2 ) external onlyOwner { require( _gatewayL2 != address(0) ); gatewayL2 = _gatewayL2; } function updateStakeManagerL2( address _stakeManagerL2 ) external onlyOwner { require( _stakeManagerL2 != address(0) ); stakeManagerL2 = _stakeManagerL2; } function setAmountBridged( bytes32[] calldata _tokenIds, uint256[] calldata _amounts ) external onlyOwner { require(_tokenIds.length == _amounts.length); for(uint256 i = 0; i < _tokenIds.length; i++) { amountBridged[_tokenIds[i]] = _amounts[i]; } } function setTokenGateway( bytes32[] calldata _tokenIds, address[] calldata _gateways ) external onlyOwner { require(_tokenIds.length == _gateways.length); for(uint256 i = 0; i < _tokenIds.length; i++) { tokenGateways[_tokenIds[i]] = _gateways[i]; } } function bridgeStash( bytes32 _stashId ) external onlyOwner { isStashBridged[_stashId] = true; } function unbridgeStash( bytes32 _stashId ) external onlyOwner { isStashBridged[_stashId] = false; } function updateUndelegationWaitTime( uint256 _undelegationWaitTime ) external onlyOwner { undelegationWaitTime = _undelegationWaitTime; emit UndelegationWaitTimeUpdated(_undelegationWaitTime); } function enableToken( bytes32 _tokenId, address _address ) external onlyOwner { require( !tokenAddresses[_tokenId].isActive ); require(_address != address(0)); tokenAddresses[_tokenId] = Token(_address, true); emit TokenAdded(_tokenId, _address); } function disableToken( bytes32 _tokenId ) external onlyOwner { require( tokenAddresses[_tokenId].isActive ); tokenAddresses[_tokenId].isActive = false; emit TokenRemoved(_tokenId); } function createStashAndDelegate( bytes32[] memory _tokens, uint256[] memory _amounts, address _delegatedCluster ) public { bytes32 stashId = createStash(_tokens, _amounts); delegateStash(stashId, _delegatedCluster); } function createStash( bytes32[] memory _tokens, uint256[] memory _amounts ) public returns(bytes32) { require( _tokens.length == _amounts.length, "CS1" ); require( _tokens.length != 0, "CS2" ); uint256 _stashIndex = stashIndex; bytes32 _stashId = keccak256(abi.encodePacked(_stashIndex)); for(uint256 _index=0; _index < _tokens.length; _index++) { bytes32 _tokenId = _tokens[_index]; uint256 _amount = _amounts[_index]; require( tokenAddresses[_tokenId].isActive, "CS3" ); require( stashes[_stashId].amount[_tokenId] == 0, "CS4" ); require( _amount != 0, "CS5" ); stashes[_stashId].amount[_tokenId] = _amount; _lockTokens(_tokenId, _amount, msg.sender); } stashes[_stashId].staker = msg.sender; emit StashCreated(msg.sender, _stashId, _stashIndex, _tokens, _amounts); stashIndex = _stashIndex + 1; // Can't overflow return _stashId; } function addToStash( bytes32 _stashId, bytes32[] calldata _tokens, uint256[] calldata _amounts ) external { require(isStashBridged[_stashId] == false, "AS0"); Stash memory _stash = stashes[_stashId]; require( _stash.staker == msg.sender, "AS1" ); require( _stash.undelegatesAt <= block.number, "AS2" ); require( _tokens.length == _amounts.length, "AS3" ); if( _stash.delegatedCluster != address(0) ) { rewardDelegators.delegate(msg.sender, _stash.delegatedCluster, _tokens, _amounts); } for(uint256 i = 0; i < _tokens.length; i++) { bytes32 _tokenId = _tokens[i]; require( tokenAddresses[_tokenId].isActive, "AS4" ); if(_amounts[i] != 0) { stashes[_stashId].amount[_tokenId] = stashes[_stashId].amount[_tokenId].add(_amounts[i]); _lockTokens(_tokenId, _amounts[i], msg.sender); } } emit AddedToStash(_stashId, _stash.delegatedCluster, _tokens, _amounts); } function delegateStash(bytes32 _stashId, address _delegatedCluster) public { require(isStashBridged[_stashId] == false, "DS0"); Stash memory _stash = stashes[_stashId]; require( _stash.staker == msg.sender, "DS1" ); require( _delegatedCluster != address(0), "DS2" ); require( _stash.delegatedCluster == address(0), "DS3" ); require( _stash.undelegatesAt <= block.number, "DS4" ); stashes[_stashId].delegatedCluster = _delegatedCluster; delete stashes[_stashId].undelegatesAt; bytes32[] memory _tokens = rewardDelegators.getFullTokenList(); uint256[] memory _amounts = new uint256[](_tokens.length); for(uint256 i = 0; i < _tokens.length; i++) { _amounts[i] = stashes[_stashId].amount[_tokens[i]]; } rewardDelegators.delegate(msg.sender, _delegatedCluster, _tokens, _amounts); emit StashDelegated(_stashId, _delegatedCluster); } function requestStashRedelegation(bytes32 _stashId, address _newCluster) public { require(isStashBridged[_stashId] == false, "RSR0"); Stash memory _stash = stashes[_stashId]; require( _stash.staker == msg.sender, "RSR1" ); require( _stash.delegatedCluster != address(0), "RSR2" ); require( _newCluster != address(0), "RSR3" ); uint256 _redelegationBlock = _requestStashRedelegation(_stashId, _newCluster); emit RedelegationRequested(_stashId, _stash.delegatedCluster, _newCluster, _redelegationBlock); } function _requestStashRedelegation(bytes32 _stashId, address _newCluster) internal returns(uint256) { require(isStashBridged[_stashId] == false, "_RSR0"); bytes32 _lockId = keccak256(abi.encodePacked(REDELEGATION_LOCK_SELECTOR, _stashId)); uint256 _unlockBlock = locks[_lockId].unlockBlock; require( _unlockBlock == 0, "IRSR1" ); uint256 _redelegationBlock = block.number.add(lockWaitTime[REDELEGATION_LOCK_SELECTOR]); locks[_lockId] = Lock(_redelegationBlock, uint256(_newCluster)); return _redelegationBlock; } function requestStashRedelegations(bytes32[] memory _stashIds, address[] memory _newClusters) public { require(_stashIds.length == _newClusters.length, "SM:RSRs - Invalid input data"); for(uint256 i=0; i < _stashIds.length; i++) { requestStashRedelegation(_stashIds[i], _newClusters[i]); } } function redelegateStash(bytes32 _stashId) public { require(isStashBridged[_stashId] == false, "RS0"); Stash memory _stash = stashes[_stashId]; require( _stash.delegatedCluster != address(0), "RS1" ); bytes32 _lockId = keccak256(abi.encodePacked(REDELEGATION_LOCK_SELECTOR, _stashId)); uint256 _unlockBlock = locks[_lockId].unlockBlock; require( _unlockBlock != 0 && _unlockBlock <= block.number, "RS2" ); address _updatedCluster = address(locks[_lockId].iValue); _redelegateStash(_stashId, _stash.staker, _stash.delegatedCluster, _updatedCluster); delete locks[_lockId]; } function _redelegateStash( bytes32 _stashId, address _staker, address _delegatedCluster, address _updatedCluster ) internal { require(isStashBridged[_stashId] == false, "_RS0"); bytes32[] memory _tokens = rewardDelegators.getFullTokenList(); uint256[] memory _amounts = new uint256[](_tokens.length); for(uint256 i=0; i < _tokens.length; i++) { _amounts[i] = stashes[_stashId].amount[_tokens[i]]; } if(_delegatedCluster != address(0)) { rewardDelegators.undelegate(_staker, _delegatedCluster, _tokens, _amounts); } rewardDelegators.delegate(_staker, _updatedCluster, _tokens, _amounts); stashes[_stashId].delegatedCluster = _updatedCluster; emit Redelegated(_stashId, _updatedCluster); } function splitStash(bytes32 _stashId, bytes32[] calldata _tokens, uint256[] calldata _amounts) external { require(isStashBridged[_stashId] == false, "SS0"); Stash memory _stash = stashes[_stashId]; require( _stash.staker == msg.sender, "SS1" ); require( _tokens.length != 0, "SS2" ); require( _tokens.length == _amounts.length, "SS3" ); uint256 _stashIndex = stashIndex; bytes32 _newStashId = keccak256(abi.encodePacked(_stashIndex)); for(uint256 _index=0; _index < _tokens.length; _index++) { bytes32 _tokenId = _tokens[_index]; uint256 _amount = _amounts[_index]; require( stashes[_newStashId].amount[_tokenId] == 0, "SS4" ); require( _amount != 0, "SS5" ); stashes[_stashId].amount[_tokenId] = stashes[_stashId].amount[_tokenId].sub( _amount, "SS6" ); stashes[_newStashId].amount[_tokenId] = _amount; } stashes[_newStashId].staker = msg.sender; stashes[_newStashId].delegatedCluster = _stash.delegatedCluster; stashes[_newStashId].undelegatesAt = _stash.undelegatesAt; emit StashSplit(_newStashId, _stashId, _stashIndex, _tokens, _amounts); stashIndex = _stashIndex + 1; } function mergeStash(bytes32 _stashId1, bytes32 _stashId2) external { require(isStashBridged[_stashId1] == false, "MS01"); require(isStashBridged[_stashId2] == false, "MS02"); require(_stashId1 != _stashId2, "MS1"); Stash memory _stash1 = stashes[_stashId1]; Stash memory _stash2 = stashes[_stashId2]; require( _stash1.staker == msg.sender && _stash2.staker == msg.sender, "MS2" ); require( _stash1.delegatedCluster == _stash2.delegatedCluster, "MS3" ); require( (_stash1.undelegatesAt <= block.number) && (_stash2.undelegatesAt <= block.number), "MS4" ); bytes32 _lockId1 = keccak256(abi.encodePacked(REDELEGATION_LOCK_SELECTOR, _stashId1)); uint256 _unlockBlock1 = locks[_lockId1].unlockBlock; bytes32 _lockId2 = keccak256(abi.encodePacked(REDELEGATION_LOCK_SELECTOR, _stashId2)); uint256 _unlockBlock2 = locks[_lockId2].unlockBlock; require( _unlockBlock1 == 0 && _unlockBlock2 == 0, "MS5" ); bytes32[] memory _tokens = rewardDelegators.getFullTokenList(); for(uint256 i=0; i < _tokens.length; i++) { uint256 _amount = stashes[_stashId2].amount[_tokens[i]]; if(_amount == 0) { continue; } delete stashes[_stashId2].amount[_tokens[i]]; stashes[_stashId1].amount[_tokens[i]] = stashes[_stashId1].amount[_tokens[i]].add(_amount); } delete stashes[_stashId2]; emit StashesMerged(_stashId1, _stashId2); } function redelegateStashes(bytes32[] memory _stashIds) public { for(uint256 i=0; i < _stashIds.length; i++) { redelegateStash(_stashIds[i]); } } function cancelRedelegation(bytes32 _stashId) public { require(isStashBridged[_stashId] == false, "CR0"); require( msg.sender == stashes[_stashId].staker, "CR1" ); require(_cancelRedelegation(_stashId), "CR2"); } function _cancelRedelegation(bytes32 _stashId) internal returns(bool) { require(isStashBridged[_stashId] == false, "_CR0"); bytes32 _lockId = keccak256(abi.encodePacked(REDELEGATION_LOCK_SELECTOR, _stashId)); if(locks[_lockId].unlockBlock != 0) { delete locks[_lockId]; emit RedelegationCancelled(_stashId); return true; } return false; } function undelegateStash(bytes32 _stashId) public { require(isStashBridged[_stashId] == false, "US0"); Stash memory _stash = stashes[_stashId]; require( _stash.staker == msg.sender, "US1" ); require( _stash.delegatedCluster != address(0), "US2" ); uint256 _waitTime = undelegationWaitTime; uint256 _undelegationBlock = block.number.add(_waitTime); stashes[_stashId].undelegatesAt = _undelegationBlock; delete stashes[_stashId].delegatedCluster; _cancelRedelegation(_stashId); bytes32[] memory _tokens = rewardDelegators.getFullTokenList(); uint256[] memory _amounts = new uint256[](_tokens.length); for(uint256 i=0; i < _tokens.length; i++) { _amounts[i] = stashes[_stashId].amount[_tokens[i]]; } rewardDelegators.undelegate(msg.sender, _stash.delegatedCluster, _tokens, _amounts); emit StashUndelegated(_stashId, _stash.delegatedCluster, _undelegationBlock); } function undelegateStashes(bytes32[] memory _stashIds) public { for(uint256 i=0; i < _stashIds.length; i++) { undelegateStash(_stashIds[i]); } } function cancelUndelegation(bytes32 _stashId, address _delegatedCluster) public { require(isStashBridged[_stashId] == false, "CU0"); address _staker = stashes[_stashId].staker; uint256 _undelegatesAt = stashes[_stashId].undelegatesAt; require( _staker == msg.sender, "CU1" ); require( _undelegatesAt > block.number, "CU2" ); require( _undelegatesAt < block.number .add(undelegationWaitTime) .sub(lockWaitTime[REDELEGATION_LOCK_SELECTOR]), "CU3" ); delete stashes[_stashId].undelegatesAt; emit StashUndelegationCancelled(_stashId); _redelegateStash(_stashId, _staker, address(0), _delegatedCluster); } function withdrawStash(bytes32 _stashId) external { require(isStashBridged[_stashId] == false, "WS0"); Stash memory _stash = stashes[_stashId]; require( _stash.staker == msg.sender, "WS1" ); require( _stash.delegatedCluster == address(0), "WS2" ); require( _stash.undelegatesAt <= block.number, "WS3" ); bytes32[] memory _tokens = rewardDelegators.getFullTokenList(); uint256[] memory _amounts = new uint256[](_tokens.length); for(uint256 i=0; i < _tokens.length; i++) { _amounts[i] = stashes[_stashId].amount[_tokens[i]]; if(_amounts[i] == 0) continue; delete stashes[_stashId].amount[_tokens[i]]; _unlockTokens(_tokens[i], _amounts[i], msg.sender); } // Other items already zeroed delete stashes[_stashId].staker; delete stashes[_stashId].undelegatesAt; emit StashWithdrawn(_stashId, _tokens, _amounts); emit StashClosed(_stashId, msg.sender); } function withdrawStash( bytes32 _stashId, bytes32[] calldata _tokens, uint256[] calldata _amounts ) external { require(isStashBridged[_stashId] == false, "WS0"); Stash memory _stash = stashes[_stashId]; require( _stash.staker == msg.sender, "WSC1" ); require( _stash.delegatedCluster == address(0), "WSC2" ); require( _stash.undelegatesAt <= block.number, "WSC3" ); require( _tokens.length == _amounts.length, "WSC4" ); for(uint256 i=0; i < _tokens.length; i++) { uint256 _balance = stashes[_stashId].amount[_tokens[i]]; require( _balance >= _amounts[i], "WSC5" ); if(_balance == _amounts[i]) { delete stashes[_stashId].amount[_tokens[i]]; } else { stashes[_stashId].amount[_tokens[i]] = _balance.sub(_amounts[i]); } _unlockTokens(_tokens[i], _amounts[i], msg.sender); } emit StashWithdrawn(_stashId, _tokens, _amounts); } function _lockTokens(bytes32 _tokenId, uint256 _amount, address _delegator) internal { if(_amount == 0) { return; } address tokenAddress = tokenAddresses[_tokenId].addr; // pull tokens from mpond/pond contract // if mpond transfer the governance rights back require( ERC20(tokenAddress).transferFrom( _delegator, address(this), _amount ), "LT1" ); if (tokenAddress == address(MPOND)) { // send a request to delegate governance rights for the amount to delegator MPOND.delegate( _delegator, uint96(_amount) ); } } function _unlockTokens(bytes32 _tokenId, uint256 _amount, address _delegator) internal { if(_amount == 0) { return; } address tokenAddress = tokenAddresses[_tokenId].addr; if(tokenAddress == address(MPOND)) { // send a request to undelegate governacne rights for the amount to previous delegator MPOND.undelegate( _delegator, uint96(_amount) ); } else if(tokenAddress == address(prevMPOND)) { prevMPOND.undelegate( _delegator, uint96(_amount) ); } require( ERC20(tokenAddress).transfer( _delegator, _amount ), "UT1" ); } function getTokenAmountInStash(bytes32 _stashId, bytes32 _tokenId) external view returns(uint256) { return stashes[_stashId].amount[_tokenId]; } function transferStashL2( address _to, bytes32[] calldata _stashIds, uint256 _maxGas, uint256 _gasPriceBid ) external payable returns (uint256) { bytes32[] memory _tokens = rewardDelegators.getFullTokenList(); uint256[] memory _amounts = new uint256[](_tokens.length * _stashIds.length); address[] memory _delegatedClusters = new address[](_stashIds.length); for(uint256 idx = 0; idx < _stashIds.length; idx++) { bytes32 _stashId = _stashIds[idx]; address _staker = stashes[_stashId].staker; address _delegatedCluster = stashes[_stashId].delegatedCluster; uint256 _undelegatesAt = stashes[_stashId].undelegatesAt; // stash should not be bridged already require(isStashBridged[_stashId] == false, "TL20"); isStashBridged[_stashId] = true; // stash owner should match sender require(_staker == msg.sender, "TL21"); // stash should be delegated require(_delegatedCluster != address(0), "TL22"); // stash should not be undelegating require(_undelegatesAt < block.number, "TL23"); _delegatedClusters[idx] = _delegatedCluster; for(uint256 i=0; i < _tokens.length; i++) { uint256 _amount = stashes[_stashId].amount[_tokens[i]]; if(_amount == 0) { continue; } amountBridged[_tokens[i]] += _amount; // mpond has to be undelegated first address tokenAddress = tokenAddresses[_tokens[i]].addr; if(tokenAddress == address(MPOND)) { MPOND.undelegate( _staker, uint96(_amount) ); } else if(tokenAddress == address(prevMPOND)) { prevMPOND.undelegate( _staker, uint96(_amount) ); } _amounts[idx * _tokens.length + i] = _amount; } } // encode for L2 tx bytes memory _data = abi.encodeWithSignature( "transferL2(address,bytes32[],uint256[],address[])", _to, _tokens, _amounts, _delegatedClusters ); bytes memory callAbi = abi.encodeWithSignature( "createRetryableTicket(address,uint256,uint256,address,address,uint256,uint256,bytes)", // send msg to corresponding gateway on L2 gatewayL2, // do not need to send eth to gateway 0, // send all eth minus gas as submission cost, excess will be refunded msg.value - _maxGas * _gasPriceBid, // all refunds and ticket ownership to _to _to, _to, _maxGas, _gasPriceBid, _data ); (bool success, bytes memory returnValue) = inbox.call.value(msg.value)(callAbi); require(success, "InboxCall"); (uint256 _ticketId) = abi.decode(returnValue, (uint256)); emit StashesBridged( _ticketId, _stashIds ); return _ticketId; } function transferTokenL2( bytes32 _tokenId, uint256 _maxGas, uint256 _gasPriceBid ) external onlyOwner payable returns (uint256) { address _tokenAddress = tokenAddresses[_tokenId].addr; address _tokenGateway = tokenGateways[_tokenId]; uint256 _amount = amountBridged[_tokenId]; amountBridged[_tokenId] = 0; // approve first ERC20(_tokenAddress).approve( _tokenGateway, _amount ); bytes memory callAbi = abi.encodeWithSignature( "transferL2(address,uint256,uint256,uint256)", // send tokens to l2 staking contract stakeManagerL2, _amount, _maxGas, _gasPriceBid ); // initiate transfer (bool success, bytes memory returnValue) = _tokenGateway.call.value(msg.value)(callAbi); require(success, "TGCall"); (uint256 _ticketId) = abi.decode(returnValue, (uint256)); return _ticketId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"delegatedCluster","type":"address"},{"indexed":false,"internalType":"bytes32[]","name":"tokens","type":"bytes32[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"AddedToStash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"selector","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"prevLockTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedLockTime","type":"uint256"}],"name":"LockTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"updatedCluster","type":"address"}],"name":"Redelegated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"RedelegationCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currentCluster","type":"address"},{"indexed":false,"internalType":"address","name":"updatedCluster","type":"address"},{"indexed":false,"internalType":"uint256","name":"redelegatesAt","type":"uint256"}],"name":"RedelegationRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"staker","type":"address"}],"name":"StashClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"stashIndex","type":"uint256"},{"indexed":false,"internalType":"bytes32[]","name":"tokens","type":"bytes32[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"StashCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"delegatedCluster","type":"address"}],"name":"StashDelegated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_newStashId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_stashIndex","type":"uint256"},{"indexed":false,"internalType":"bytes32[]","name":"_splitTokens","type":"bytes32[]"},{"indexed":false,"internalType":"uint256[]","name":"_splitAmounts","type":"uint256[]"}],"name":"StashSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"undelegatedCluster","type":"address"},{"indexed":false,"internalType":"uint256","name":"undelegatesAt","type":"uint256"}],"name":"StashUndelegated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"StashUndelegationCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"stashId","type":"bytes32"},{"indexed":false,"internalType":"bytes32[]","name":"tokens","type":"bytes32[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"StashWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_ticketId","type":"uint256"},{"indexed":false,"internalType":"bytes32[]","name":"_stashIds","type":"bytes32[]"}],"name":"StashesBridged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_stashId1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_stashId2","type":"bytes32"}],"name":"StashesMerged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"undelegationWaitTime","type":"uint256"}],"name":"UndelegationWaitTimeUpdated","type":"event"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"internalType":"bytes32[]","name":"_tokens","type":"bytes32[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"addToStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"amountBridged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"bridgeStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"cancelRedelegation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"internalType":"address","name":"_delegatedCluster","type":"address"}],"name":"cancelUndelegation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_MPONDTokenAddress","type":"address"}],"name":"changeMPONDTokenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_tokens","type":"bytes32[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"createStash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_tokens","type":"bytes32[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address","name":"_delegatedCluster","type":"address"}],"name":"createStashAndDelegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"internalType":"address","name":"_delegatedCluster","type":"address"}],"name":"delegateStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"disableToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_tokenId","type":"bytes32"},{"internalType":"address","name":"_address","type":"address"}],"name":"enableToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gatewayL2","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"getTokenAmountInStash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"inbox","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_tokenIds","type":"bytes32[]"},{"internalType":"address[]","name":"_tokenAddresses","type":"address[]"},{"internalType":"address","name":"_MPONDTokenAddress","type":"address"},{"internalType":"address","name":"_rewardDelegatorsAddress","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_undelegationWaitTime","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isStashBridged","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lockWaitTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"locks","outputs":[{"internalType":"uint256","name":"unlockBlock","type":"uint256"},{"internalType":"uint256","name":"iValue","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId1","type":"bytes32"},{"internalType":"bytes32","name":"_stashId2","type":"bytes32"}],"name":"mergeStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"redelegateStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_stashIds","type":"bytes32[]"}],"name":"redelegateStashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"internalType":"address","name":"_newCluster","type":"address"}],"name":"requestStashRedelegation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_stashIds","type":"bytes32[]"},{"internalType":"address[]","name":"_newClusters","type":"address[]"}],"name":"requestStashRedelegations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardDelegators","outputs":[{"internalType":"contract IRewardDelegators","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_tokenIds","type":"bytes32[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setAmountBridged","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_tokenIds","type":"bytes32[]"},{"internalType":"address[]","name":"_gateways","type":"address[]"}],"name":"setTokenGateway","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"internalType":"bytes32[]","name":"_tokens","type":"bytes32[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"splitStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakeManagerL2","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stashIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"stashes","outputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"delegatedCluster","type":"address"},{"internalType":"uint256","name":"undelegatesAt","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"tokenGateways","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_stashIds","type":"bytes32[]"},{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"}],"name":"transferStashL2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_tokenId","type":"bytes32"},{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"}],"name":"transferTokenL2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"unbridgeStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"undelegateStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_stashIds","type":"bytes32[]"}],"name":"undelegateStashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"undelegationWaitTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_gatewayL2","type":"address"}],"name":"updateGatewayL2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_inbox","type":"address"}],"name":"updateInbox","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_selector","type":"bytes32"},{"internalType":"uint256","name":"_updatedWaitTime","type":"uint256"}],"name":"updateLockWaitTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_updatedRewardDelegator","type":"address"}],"name":"updateRewardDelegators","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_stakeManagerL2","type":"address"}],"name":"updateStakeManagerL2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_undelegationWaitTime","type":"uint256"}],"name":"updateUndelegationWaitTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"}],"name":"withdrawStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_stashId","type":"bytes32"},{"internalType":"bytes32[]","name":"_tokens","type":"bytes32[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"withdrawStash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052615d60806100136000396000f3fe6080604052600436106102c95760003560e01c80638da5cb5b11610175578063bcda6408116100dc578063cfa114f111610095578063f2fde38b1161006f578063f2fde38b14610878578063f80263aa14610898578063fb0e722b146108b8578063fff0d190146108cd576102c9565b8063cfa114f11461080a578063d21de9901461082a578063ed5e84371461084a576102c9565b8063bcda64081461074a578063bf3e116b1461076a578063c0403fb11461078a578063c4d66de8146107aa578063c5ccd697146107ca578063cc873bfd146107ea576102c9565b8063a8834f4e1161012e578063a8834f4e14610695578063aa49f091146106b5578063b0571ec5146106d5578063b1f4d1cf146106ea578063b6ce4dd31461070a578063bc66c94b1461072a576102c9565b80638da5cb5b146105e95780638f32d59b146105fe578063934efeb91461061357806393cc4450146106335780639a5e0e6014610646578063a76f955f14610666576102c9565b806347ae58b311610234578063645954ea116101ed5780637a099cce116101c75780637a099cce146105695780638616e44d146105895780638894dfd6146105a957806388afbc68146105c9576102c9565b8063645954ea146105075780636dd3266d14610534578063715018a614610554576102c9565b806347ae58b31461045d57806348ad85721461047d5780634bd63cc51461049d5780634c8e7d81146104b25780635dc47b57146104d2578063625aa555146104f2576102c9565b8063244864d811610286578063244864d81461039b578063315db6d8146103bb578063324b5d68146103db57806338e6cc38146103fb5780633fa364cd1461041b578063452a62791461043d576102c9565b8063044ff62b146102ce57806309457ff6146102f057806313b929f01461031957806315c5dfa5146103395780631a028fa91461034e5780631a282d991461037b575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004614650565b6108ed565b005b6103036102fe3660046142ed565b610983565b60405161031091906155f7565b60405180910390f35b34801561032557600080fd5b506102ee61033436600461436a565b610f22565b34801561034557600080fd5b50610303610fd4565b34801561035a57600080fd5b5061036e610369366004614650565b610fda565b60405161031091906153c9565b34801561038757600080fd5b506102ee610396366004614650565b610ff5565b3480156103a757600080fd5b506102ee6103b6366004614440565b611148565b3480156103c757600080fd5b506102ee6103d636600461466e565b6111b2565b3480156103e757600080fd5b506103036103f6366004614650565b611309565b34801561040757600080fd5b506102ee61041636600461466e565b61131b565b34801561042757600080fd5b5061043061161c565b604051610310919061577a565b34801561044957600080fd5b506102ee610458366004614650565b61162b565b34801561046957600080fd5b506102ee6104783660046142c7565b611966565b34801561048957600080fd5b50610303610498366004614650565b6119bf565b3480156104a957600080fd5b5061036e6119d1565b3480156104be57600080fd5b506102ee6104cd366004614650565b6119e0565b3480156104de57600080fd5b506102ee6104ed366004614650565b611a7a565b3480156104fe57600080fd5b50610303611d53565b34801561051357600080fd5b50610527610522366004614650565b611d59565b60405161031091906155e9565b34801561054057600080fd5b506102ee61054f36600461466e565b611d6e565b34801561056057600080fd5b506102ee611eaf565b34801561057557600080fd5b506102ee6105843660046142c7565b611f1d565b34801561059557600080fd5b506102ee6105a436600461469e565b611faf565b3480156105b557600080fd5b506102ee6105c43660046142c7565b612248565b3480156105d557600080fd5b506102ee6105e436600461436a565b6122a1565b3480156105f557600080fd5b5061036e612321565b34801561060a57600080fd5b50610527612330565b34801561061f57600080fd5b506102ee61062e366004614650565b612356565b610303610641366004614753565b6123af565b34801561065257600080fd5b50610303610661366004614723565b612582565b34801561067257600080fd5b50610686610681366004614650565b6125a6565b6040516103109392919061547f565b3480156106a157600080fd5b506102ee6106b036600461469e565b6125d4565b3480156106c157600080fd5b506102ee6106d036600461469e565b612874565b3480156106e157600080fd5b5061036e612b33565b3480156106f657600080fd5b506102ee6107053660046143d8565b612b42565b34801561071657600080fd5b506102ee6107253660046143d8565b612b76565b34801561073657600080fd5b506102ee6107453660046144a7565b612ba6565b34801561075657600080fd5b506102ee610765366004614723565b612d8d565b34801561077657600080fd5b506102ee6107853660046145b8565b61322a565b34801561079657600080fd5b506103036107a536600461455b565b613242565b3480156107b657600080fd5b506102ee6107c53660046142c7565b613427565b3480156107d657600080fd5b506102ee6107e536600461466e565b6134f9565b3480156107f657600080fd5b506102ee6108053660046142c7565b6135e8565b34801561081657600080fd5b506102ee610825366004614650565b613641565b34801561083657600080fd5b506102ee6108453660046142c7565b613680565b34801561085657600080fd5b5061086a610865366004614650565b6136d9565b6040516103109291906156d9565b34801561088457600080fd5b506102ee6108933660046142c7565b6136f2565b3480156108a457600080fd5b506102ee6108b3366004614650565b61371f565b3480156108c457600080fd5b5061036e61375b565b3480156108d957600080fd5b506102ee6108e8366004614723565b61376a565b600081815260a2602052604090205460ff16156109255760405162461bcd60e51b815260040161091c90615829565b60405180910390fd5b6000818152606660205260409020546001600160a01b0316331461095b5760405162461bcd60e51b815260040161091c90615839565b610964816137eb565b6109805760405162461bcd60e51b815260040161091c90615969565b50565b60006060606c60009054906101000a90046001600160a01b03166001600160a01b0316632cd767586040518163ffffffff1660e01b815260040160006040518083038186803b1580156109d557600080fd5b505afa1580156109e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a11919081019061440c565b9050606086869050825102604051908082528060200260200182016040528015610a45578160200160208202803883390190505b509050606087879050604051908082528060200260200182016040528015610a77578160200160208202803883390190505b50905060005b87811015610d92576000898983818110610a9357fe5b6020908102929092013560008181526066845260408082208054600182015460039092015460a290975291909220549295506001600160a01b0390811694911692509060ff1615610af65760405162461bcd60e51b815260040161091c90615879565b600084815260a260205260409020805460ff191660011790556001600160a01b0383163314610b375760405162461bcd60e51b815260040161091c906157f9565b6001600160a01b038216610b5d5760405162461bcd60e51b815260040161091c90615909565b438110610b7c5760405162461bcd60e51b815260040161091c90615a39565b81868681518110610b8957fe5b6001600160a01b039092166020928302919091019091015260005b8851811015610d815760006066600087815260200190815260200160002060020160008b8481518110610bd357fe5b602002602001015181526020019081526020016000205490508060001415610bfb5750610d79565b8060a660008c8581518110610c0c57fe5b60200260200101518152602001908152602001600020600082825401925050819055506000606860008c8581518110610c4157fe5b6020908102919091018101518252810191909152604001600020546069546001600160a01b03918216925016811415610cdd5760695460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390610ca690899086906004016155bc565b600060405180830381600087803b158015610cc057600080fd5b505af1158015610cd4573d6000803e3d6000fd5b50505050610d58565b606a546001600160a01b0382811691161415610d5857606a5460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390610d2590899086906004016155bc565b600060405180830381600087803b158015610d3f57600080fd5b505af1158015610d53573d6000803e3d6000fd5b505050505b818a848d518b020181518110610d6a57fe5b60200260200101818152505050505b600101610ba4565b505060019093019250610a7d915050565b50606089848484604051602401610dac94939291906154a7565b60408051601f198184030181529181526020820180516001600160e01b031663d07cf52160e01b17905260a4549051919250606091610e0a916001600160a01b0316906000908b8b023403908f9081908e908e908a906024016154ef565b60408051601f198184030181529181526020820180516001600160e01b031663679b6ded60e01b17905260a35490519192506000916060916001600160a01b0316903490610e59908690615392565b60006040518083038185875af1925050503d8060008114610e96576040519150601f19603f3d011682016040523d82523d6000602084013e610e9b565b606091505b509150915081610ebd5760405162461bcd60e51b815260040161091c90615899565b600081806020019051610ed39190810190614796565b9050807f54ed6ea9718d447824486ae2dbc3eabd8e307140fe50cf12766f0e2beb8c80e98e8e604051610f079291906155d7565b60405180910390a29750505050505050505b95945050505050565b610f2a612330565b610f465760405162461bcd60e51b815260040161091c90615a09565b828114610f5257600080fd5b60005b83811015610fcd57828282818110610f6957fe5b9050602002016020610f7e91908101906142c7565b60a76000878785818110610f8e57fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600101610f55565b5050505050565b60675481565b60a7602052600090815260409020546001600160a01b031681565b600081815260a2602052604090205460ff16156110245760405162461bcd60e51b815260040161091c90615b79565b61102c614064565b50600081815260666020908152604091829020825160608101845281546001600160a01b0390811682526001830154169281018390526003909101549281019290925261108b5760405162461bcd60e51b815260040161091c90615ab9565b6000604051611099906153a9565b6040519081900381206110b091859060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d90935291205490915080158015906110e75750438111155b6111035760405162461bcd60e51b815260040161091c906158b9565b6000828152606d6020908152604090912060010154845191850151909161112d91879190846138bf565b50506000908152606d60205260408120818155600101555050565b80518251146111695760405162461bcd60e51b815260040161091c90615979565b60005b82518110156111ad576111a583828151811061118457fe5b602002602001015183838151811061119857fe5b6020026020010151611d6e565b60010161116c565b505050565b600082815260a2602052604090205460ff16156111e15760405162461bcd60e51b815260040161091c90615b69565b600082815260666020526040902080546003909101546001600160a01b03909116903382146112225760405162461bcd60e51b815260040161091c906157b9565b4381116112415760405162461bcd60e51b815260040161091c90615bc9565b61128c606e6000604051611254906153a9565b6040518091039020815260200190815260200160002054611280606f5443613b4390919063ffffffff16565b9063ffffffff613b6816565b81106112aa5760405162461bcd60e51b815260040161091c90615a29565b60008481526066602052604080822060030191909155517fe82d816130a7347cc60ff37b0c5e9c5eb73bbd73c5a4260112932e1001112327906112ee9086906155f7565b60405180910390a161130384836000866138bf565b50505050565b60a66020526000908152604090205481565b600082815260a2602052604090205460ff161561134a5760405162461bcd60e51b815260040161091c90615819565b611352614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146113b75760405162461bcd60e51b815260040161091c90615a69565b6001600160a01b0382166113dd5760405162461bcd60e51b815260040161091c90615799565b60208101516001600160a01b0316156114085760405162461bcd60e51b815260040161091c906158c9565b438160400151111561142c5760405162461bcd60e51b815260040161091c906159b9565b6000838152606660205260408082206001810180546001600160a01b0319166001600160a01b03878116919091179091556003909101839055606c54825163059aeceb60e31b815292516060949190921692632cd767589260048083019392829003018186803b15801561149f57600080fd5b505afa1580156114b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114db919081019061440c565b90506060815160405190808252806020026020018201604052801561150a578160200160208202803883390190505b50905060005b82518110156115735760666000878152602001908152602001600020600201600084838151811061153d57fe5b602002602001015181526020019081526020016000205482828151811061156057fe5b6020908102919091010152600101611510565b50606c546040516304855c6b60e31b81526001600160a01b039091169063242ae358906115aa903390889087908790600401615426565b600060405180830381600087803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b505050507f1d7a1ceec042fe10baf115a3343fbc7647382acfb27b3bb9d63877a592627c81858560405161160d929190615605565b60405180910390a15050505050565b606c546001600160a01b031681565b600081815260a2602052604090205460ff161561165a5760405162461bcd60e51b815260040161091c90615999565b611662614064565b50600081815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146116c75760405162461bcd60e51b815260040161091c90615a79565b60208101516001600160a01b0316156116f25760405162461bcd60e51b815260040161091c906159c9565b43816040015111156117165760405162461bcd60e51b815260040161091c90615ad9565b606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611797919081019061440c565b9050606081516040519080825280602002602001820160405280156117c6578160200160208202803883390190505b50905060005b82518110156118c0576066600086815260200190815260200160002060020160008483815181106117f957fe5b602002602001015181526020019081526020016000205482828151811061181c57fe5b60200260200101818152505081818151811061183457fe5b602002602001015160001415611849576118b8565b60666000868152602001908152602001600020600201600084838151811061186d57fe5b60200260200101518152602001908152602001600020600090556118b883828151811061189657fe5b60200260200101518383815181106118aa57fe5b602002602001015133613baa565b6001016117cc565b5060008481526066602052604080822080546001600160a01b031916815560030191909155517ff7b17d83b1c6d7f3c428e708ce63a8afc9ce528790694f379bd32da3b09d585090611917908690859085906156a5565b60405180910390a1336001600160a01b03167f44ec1f9e039c512541fb6904909fc8b3fd32a960374888656587103a37a0c0f88560405161195891906155f7565b60405180910390a250505050565b61196e612330565b61198a5760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b03811661199d57600080fd5b606c80546001600160a01b0319166001600160a01b0392909216919091179055565b606e6020526000908152604090205481565b60a5546001600160a01b031681565b6119e8612330565b611a045760405162461bcd60e51b815260040161091c90615a09565b600081815260686020526040902054600160a01b900460ff16611a2657600080fd5b60008181526068602052604090819020805460ff60a01b19169055517f27b51627532fe8cd0df946e5a9590efb06cc367d3d611c1e4084c7e1dccb3ab490611a6f9083906155f7565b60405180910390a150565b600081815260a2602052604090205460ff1615611aa95760405162461bcd60e51b815260040161091c90615ae9565b611ab1614064565b50600081815260666020908152604091829020825160608101845281546001600160a01b03908116808352600184015490911693820193909352600390910154928101929092523314611b165760405162461bcd60e51b815260040161091c906157c9565b60208101516001600160a01b0316611b405760405162461bcd60e51b815260040161091c90615a99565b606f546000611b55438363ffffffff613b4316565b60008581526066602052604090206003810182905560010180546001600160a01b03191690559050611b86846137eb565b50606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b158015611bcc57600080fd5b505afa158015611be0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c08919081019061440c565b905060608151604051908082528060200260200182016040528015611c37578160200160208202803883390190505b50905060005b8251811015611ca057606660008881526020019081526020016000206002016000848381518110611c6a57fe5b6020026020010151815260200190815260200160002054828281518110611c8d57fe5b6020908102919091010152600101611c3d565b50606c546020860151604051624d4a1f60e91b81526001600160a01b0390921691639a943e0091611cda9133919087908790600401615426565b600060405180830381600087803b158015611cf457600080fd5b505af1158015611d08573d6000803e3d6000fd5b505050507f910aaad05eef8babc75a5bbd3987092b49f6dcd0fd06c860d9af177b650c562586866020015185604051611d4393929190615656565b60405180910390a1505050505050565b606f5481565b60a26020526000908152604090205460ff1681565b600082815260a2602052604090205460ff1615611d9d5760405162461bcd60e51b815260040161091c906158f9565b611da5614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b03908116808352600184015490911693820193909352600390910154928101929092523314611e0a5760405162461bcd60e51b815260040161091c90615b59565b60208101516001600160a01b0316611e345760405162461bcd60e51b815260040161091c906157a9565b6001600160a01b038216611e5a5760405162461bcd60e51b815260040161091c906159a9565b6000611e668484613d5a565b90507fcc9ff84a5150218e8e56d3d43cfd422a96d5994a3877a760afc1f85dcbab545d8483602001518584604051611ea19493929190615620565b60405180910390a150505050565b611eb7612330565b611ed35760405162461bcd60e51b815260040161091c90615a09565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b611f25612330565b611f415760405162461bcd60e51b815260040161091c90615a09565b60698054606a80546001600160a01b038084166001600160a01b0319928316179092559091169083161790556040517f2aada7c835843a942d6bae43540591b084921c87edbb049c55d49d114424279490611f9b9061539e565b604051908190038120611a6f918490615605565b600085815260a2602052604090205460ff1615611fde5760405162461bcd60e51b815260040161091c906158e9565b611fe6614064565b50600085815260666020908152604091829020825160608101845281546001600160a01b0390811680835260018401549091169382019390935260039091015492810192909252331461204b5760405162461bcd60e51b815260040161091c906158d9565b438160400151111561206f5760405162461bcd60e51b815260040161091c90615809565b83821461208e5760405162461bcd60e51b815260040161091c90615bf9565b60208101516001600160a01b03161561211257606c5460208201516040516304855c6b60e31b81526001600160a01b039092169163242ae358916120df913391908a908a908a908a906004016153d7565b600060405180830381600087803b1580156120f957600080fd5b505af115801561210d573d6000803e3d6000fd5b505050505b60005b8481101561220a57600086868381811061212b57fe5b602090810292909201356000818152606890935260409092205491925050600160a01b900460ff1661216f5760405162461bcd60e51b815260040161091c90615919565b84848381811061217b57fe5b90506020020135600014612201576121c785858481811061219857fe5b60008c81526066602090815260408083208884526002018252909120549391020135905063ffffffff613b4316565b6000898152606660209081526040808320858452600201909152902055612201818686858181106121f457fe5b9050602002013533613e71565b50600101612115565b507f08fc62a716797765934c34e699a0dd8276e455b0dd6e2831d026bb7764a3945c86826020015187878787604051611d4396959493929190615648565b612250612330565b61226c5760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b03811661227f57600080fd5b60a480546001600160a01b0319166001600160a01b0392909216919091179055565b6122a9612330565b6122c55760405162461bcd60e51b815260040161091c90615a09565b8281146122d157600080fd5b60005b83811015610fcd578282828181106122e857fe5b9050602002013560a660008787858181106122ff57fe5b60209081029290920135835250810191909152604001600020556001016122d4565b6033546001600160a01b031690565b6033546000906001600160a01b0316612347613fac565b6001600160a01b031614905090565b61235e612330565b61237a5760405162461bcd60e51b815260040161091c90615a09565b606f8190556040517fd2d74b9fbd3364e161a82e64e07b2f1d94a781cf730d0e65810f7fb5a57c462590611a6f9083906155f7565b60006123b9612330565b6123d55760405162461bcd60e51b815260040161091c90615a09565b60008481526068602090815260408083205460a783528184205460a69093528184208054949055905163095ea7b360e01b81526001600160a01b03918216939190921691839063095ea7b390612431908590859060040161556c565b602060405180830381600087803b15801561244b57600080fd5b505af115801561245f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124839190810190614632565b5060a5546040516060916124ab916001600160a01b039091169084908a908a90602401615587565b60408051601f198184030181529181526020820180516001600160e01b031663402b1ced60e11b179052519091506000906060906001600160a01b0386169034906124f7908690615392565b60006040518083038185875af1925050503d8060008114612534576040519150601f19603f3d011682016040523d82523d6000602084013e612539565b606091505b50915091508161255b5760405162461bcd60e51b815260040161091c90615959565b6000818060200190516125719190810190614796565b9750505050505050505b9392505050565b60008281526066602090815260408083208484526002019091529020545b92915050565b6066602052600090815260409020805460018201546003909201546001600160a01b03918216929091169083565b600085815260a2602052604090205460ff16156126035760405162461bcd60e51b815260040161091c90615999565b61260b614064565b50600085815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146126705760405162461bcd60e51b815260040161091c90615939565b60208101516001600160a01b03161561269b5760405162461bcd60e51b815260040161091c90615949565b43816040015111156126bf5760405162461bcd60e51b815260040161091c906159d9565b8382146126de5760405162461bcd60e51b815260040161091c90615bb9565b60005b8481101561283c5760008781526066602052604081206002018188888581811061270757fe5b90506020020135815260200190815260200160002054905084848381811061272b57fe5b905060200201358110156127515760405162461bcd60e51b815260040161091c90615a59565b84848381811061275d57fe5b905060200201358114156127a75760008881526066602052604081206002019088888581811061278957fe5b90506020020135815260200190815260200160002060009055612804565b6127cc8585848181106127b657fe5b9050602002013582613b6890919063ffffffff16565b6000898152606660205260408120600201908989868181106127ea57fe5b905060200201358152602001908152602001600020819055505b61283387878481811061281357fe5b9050602002013586868581811061282657fe5b9050602002013533613baa565b506001016126e1565b507ff7b17d83b1c6d7f3c428e708ce63a8afc9ce528790694f379bd32da3b09d58508686868686604051611d43959493929190615664565b600085815260a2602052604090205460ff16156128a35760405162461bcd60e51b815260040161091c90615aa9565b6128ab614064565b50600085815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146129105760405162461bcd60e51b815260040161091c90615b09565b8361292d5760405162461bcd60e51b815260040161091c906157d9565b83821461294c5760405162461bcd60e51b815260040161091c90615929565b6067546040516000906129639083906020016153b4565b60408051601f198184030181529190528051602090910120905060005b86811015612a9757600088888381811061299657fe5b90506020020135905060008787848181106129ad57fe5b600087815260666020908152604080832088845260020182529091205491029290920135925050156129f15760405162461bcd60e51b815260040161091c906157e9565b80612a0e5760405162461bcd60e51b815260040161091c90615b29565b604080518082018252600381526229a99b60e91b60208083019190915260008e8152606682528381208682526002019091529190912054612a5691839063ffffffff613fb016565b60008c815260666020818152604080842087855260029081018352818520959095558884529181528183209583529490920190935290912055600101612980565b506000818152606660209081526040918290208054336001600160a01b0319918216178255918601516001820180549093166001600160a01b039091161790915584820151600390910155517f147f8735c585be62efbb75aee3c165de6e2b5f7cdc0fb65b9e5d358ce2871cfd90612b1c9083908b9086908c908c908c908c906156e7565b60405180910390a150600101606755505050505050565b60a4546001600160a01b031681565b60005b8151811015612b7257612b6a828281518110612b5d57fe5b6020026020010151610ff5565b600101612b45565b5050565b60005b8151811015612b7257612b9e828281518110612b9157fe5b6020026020010151611a7a565b600101612b79565b600054610100900460ff1680612bbf5750612bbf613fdc565b80612bcd575060005460ff16155b612be95760405162461bcd60e51b815260040161091c90615a19565b600054610100900460ff16158015612c14576000805460ff1961ff0019909116610100171660011790555b8551875114612c2257600080fd5b60005b8751811015612d33576040518060400160405280888381518110612c4557fe5b60200260200101516001600160a01b0316815260200160011515815250606860008a8481518110612c7257fe5b6020908102919091018101518252818101929092526040016000208251815493909201511515600160a01b0260ff60a01b196001600160a01b039093166001600160a01b0319909416939093179190911691909117905587517f662cc3305b9b4ea3a5fd06717cdaece79b6ac0a7734fd44eabe0f37951dc587c90899083908110612cf957fe5b6020026020010151888381518110612d0d57fe5b6020026020010151604051612d23929190615605565b60405180910390a1600101612c25565b50606980546001600160a01b038088166001600160a01b031992831617909255606c805492871692909116919091179055606f829055612d7283613427565b8015612d84576000805461ff00191690555b50505050505050565b600082815260a2602052604090205460ff1615612dbc5760405162461bcd60e51b815260040161091c90615b99565b600081815260a2602052604090205460ff1615612deb5760405162461bcd60e51b815260040161091c90615ac9565b80821415612e0b5760405162461bcd60e51b815260040161091c90615a49565b612e13614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b039081168252600183015416928101929092526003015491810191909152612e5d614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b03908116825260018301548116938201939093526003909101549281019290925282511633148015612ebc575080516001600160a01b031633145b612ed85760405162461bcd60e51b815260040161091c90615bd9565b80602001516001600160a01b031682602001516001600160a01b031614612f115760405162461bcd60e51b815260040161091c90615b49565b43826040015111158015612f29575043816040015111155b612f455760405162461bcd60e51b815260040161091c90615be9565b6000604051612f53906153a9565b604051908190038120612f6a91879060200161536c565b60408051601f1981840301815282825280516020918201206000818152606d909252918120549193509091612f9e906153a9565b604051908190038120612fb591889060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d90935291205490915082158015612fe9575080155b6130055760405162461bcd60e51b815260040161091c90615b19565b606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b15801561304a57600080fd5b505afa15801561305e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613086919081019061440c565b905060005b81518110156131b5576000606660008b815260200190815260200160002060020160008484815181106130ba57fe5b6020026020010151815260200190815260200160002054905080600014156130e257506131ad565b606660008b8152602001908152602001600020600201600084848151811061310657fe5b602002602001015181526020019081526020016000206000905561316d81606660008e8152602001908152602001600020600201600086868151811061314857fe5b6020026020010151815260200190815260200160002054613b4390919063ffffffff16565b606660008d8152602001908152602001600020600201600085858151811061319157fe5b6020026020010151815260200190815260200160002081905550505b60010161308b565b5060008881526066602052604080822080546001600160a01b03199081168255600182018054909116905560030191909155517f24a7a8f3e9dc071723fbfe550a5ad792fcba5e3886938d619dede64aebacd84490613217908b908b906156d9565b60405180910390a1505050505050505050565b60006132368484613242565b9050611303818361131b565b600081518351146132655760405162461bcd60e51b815260040161091c90615989565b82516132835760405162461bcd60e51b815260040161091c90615af9565b60675460405160009061329a9083906020016153b4565b60408051601f198184030181529190528051602090910120905060005b85518110156133b65760008682815181106132ce57fe5b6020026020010151905060008683815181106132e657fe5b60209081029190910181015160008481526068909252604090912054909150600160a01b900460ff1661332b5760405162461bcd60e51b815260040161091c90615889565b6000848152606660209081526040808320858452600201909152902054156133655760405162461bcd60e51b815260040161091c90615b89565b806133825760405162461bcd60e51b815260040161091c906159e9565b600084815260666020908152604080832085845260020190915290208190556133ac828233613e71565b50506001016132b7565b506000818152606660205260409081902080546001600160a01b0319163390811790915590517f614d6f8319493a3bb5dd50287615457dd869414d3d6b96136f80ac1c1ef2428d9061340f90849086908a908a90615744565b60405180910390a26001909101606755905092915050565b600054610100900460ff16806134405750613440613fdc565b8061344e575060005460ff16155b61346a5760405162461bcd60e51b815260040161091c90615a19565b600054610100900460ff16158015613495576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015612b72576000805461ff00191690555050565b613501612330565b61351d5760405162461bcd60e51b815260040161091c90615a09565b600082815260686020526040902054600160a01b900460ff161561354057600080fd5b6001600160a01b03811661355357600080fd5b6040805180820182526001600160a01b03808416825260016020808401918252600087815260689091528490209251835491511515600160a01b0260ff60a01b19919093166001600160a01b03199092169190911716179055517f662cc3305b9b4ea3a5fd06717cdaece79b6ac0a7734fd44eabe0f37951dc587c906135dc9084908490615605565b60405180910390a15050565b6135f0612330565b61360c5760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b03811661361f57600080fd5b60a380546001600160a01b0319166001600160a01b0392909216919091179055565b613649612330565b6136655760405162461bcd60e51b815260040161091c90615a09565b600090815260a260205260409020805460ff19166001179055565b613688612330565b6136a45760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b0381166136b757600080fd5b60a580546001600160a01b0319166001600160a01b0392909216919091179055565b606d602052600090815260409020805460019091015482565b6136fa612330565b6137165760405162461bcd60e51b815260040161091c90615a09565b61098081613fe2565b613727612330565b6137435760405162461bcd60e51b815260040161091c90615a09565b600090815260a260205260409020805460ff19169055565b60a3546001600160a01b031681565b613772612330565b61378e5760405162461bcd60e51b815260040161091c90615a09565b6000828152606e6020526040908190205490517f5793ae75ad4ae6b7dc6492360b49ac802ad3f243d386419158aa87761383df5a916137d191859190859061575f565b60405180910390a16000918252606e602052604090912055565b600081815260a2602052604081205460ff161561381a5760405162461bcd60e51b815260040161091c90615b39565b6000604051613828906153a9565b60405190819003812061383f91859060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d909352912054909150156138b4576000818152606d60205260408082208281556001018290555184917ff61bf087105cbbc9ce12db206c8223c224de07a98a51c1d606ed90322480b48b91a260019150506138ba565b60009150505b919050565b600084815260a2602052604090205460ff16156138ee5760405162461bcd60e51b815260040161091c90615a89565b606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b15801561393357600080fd5b505afa158015613947573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261396f919081019061440c565b90506060815160405190808252806020026020018201604052801561399e578160200160208202803883390190505b50905060005b8251811015613a07576066600088815260200190815260200160002060020160008483815181106139d157fe5b60200260200101518152602001908152602001600020548282815181106139f457fe5b60209081029190910101526001016139a4565b506001600160a01b03841615613a7f57606c54604051624d4a1f60e91b81526001600160a01b0390911690639a943e0090613a4c908890889087908790600401615471565b600060405180830381600087803b158015613a6657600080fd5b505af1158015613a7a573d6000803e3d6000fd5b505050505b606c546040516304855c6b60e31b81526001600160a01b039091169063242ae35890613ab5908890879087908790600401615471565b600060405180830381600087803b158015613acf57600080fd5b505af1158015613ae3573d6000803e3d6000fd5b5050506000878152606660205260409081902060010180546001600160a01b0319166001600160a01b038716179055517f63c996749362048abd5162a384284583851200b5c4cb4ae2fa1ebb09815289059150611d439088908690615605565b60008282018381101561257b5760405162461bcd60e51b815260040161091c906158a9565b600061257b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613fb0565b81613bb4576111ad565b6000838152606860205260409020546069546001600160a01b039182169116811415613c435760695460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390613c0c90859087906004016155bc565b600060405180830381600087803b158015613c2657600080fd5b505af1158015613c3a573d6000803e3d6000fd5b50505050613cbe565b606a546001600160a01b0382811691161415613cbe57606a5460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390613c8b90859087906004016155bc565b600060405180830381600087803b158015613ca557600080fd5b505af1158015613cb9573d6000803e3d6000fd5b505050505b60405163a9059cbb60e01b81526001600160a01b0382169063a9059cbb90613cec908590879060040161556c565b602060405180830381600087803b158015613d0657600080fd5b505af1158015613d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613d3e9190810190614632565b6113035760405162461bcd60e51b815260040161091c90615859565b600082815260a2602052604081205460ff1615613d895760405162461bcd60e51b815260040161091c90615ba9565b6000604051613d97906153a9565b604051908190038120613dae91869060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d9093529120549091508015613df45760405162461bcd60e51b815260040161091c90615869565b6000613e2f606e6000604051613e09906153a9565b604051809103902081526020019081526020016000205443613b4390919063ffffffff16565b6040805180820182528281526001600160a01b039790971660208089019182526000968752606d90529420955186559251600190950194909455509392505050565b81613e7b576111ad565b600083815260686020526040908190205490516323b872dd60e01b81526001600160a01b039091169081906323b872dd90613ebe9085903090889060040161547f565b602060405180830381600087803b158015613ed857600080fd5b505af1158015613eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f109190810190614632565b613f2c5760405162461bcd60e51b815260040161091c906159f9565b6069546001600160a01b0382811691161415611303576069546040516322d0459b60e21b81526001600160a01b0390911690638b41166c90613f7490859087906004016155bc565b600060405180830381600087803b158015613f8e57600080fd5b505af1158015613fa2573d6000803e3d6000fd5b5050505050505050565b3390565b60008184841115613fd45760405162461bcd60e51b815260040161091c9190615788565b505050900390565b303b1590565b6001600160a01b0381166140085760405162461bcd60e51b815260040161091c90615849565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b604080516060810182526000808252602082018190529181019190915290565b80356125a081615cf7565b60008083601f8401126140a157600080fd5b5081356001600160401b038111156140b857600080fd5b6020830191508360208202830111156140d057600080fd5b9250929050565b600082601f8301126140e857600080fd5b81356140fb6140f682615c2f565b615c09565b9150818183526020840193506020810190508385602084028201111561412057600080fd5b60005b8381101561414c57816141368882614084565b8452506020928301929190910190600101614123565b5050505092915050565b600082601f83011261416757600080fd5b81356141756140f682615c2f565b9150818183526020840193506020810190508385602084028201111561419a57600080fd5b60005b8381101561414c57816141b088826142b1565b845250602092830192919091019060010161419d565b600082601f8301126141d757600080fd5b81516141e56140f682615c2f565b9150818183526020840193506020810190508385602084028201111561420a57600080fd5b60005b8381101561414c578161422088826142bc565b845250602092830192919091019060010161420d565b600082601f83011261424757600080fd5b81356142556140f682615c2f565b9150818183526020840193506020810190508385602084028201111561427a57600080fd5b60005b8381101561414c578161429088826142b1565b845250602092830192919091019060010161427d565b80516125a081615d0b565b80356125a081615d14565b80516125a081615d14565b6000602082840312156142d957600080fd5b60006142e58484614084565b949350505050565b60008060008060006080868803121561430557600080fd5b60006143118888614084565b95505060208601356001600160401b0381111561432d57600080fd5b6143398882890161408f565b9450945050604061434c888289016142b1565b925050606061435d888289016142b1565b9150509295509295909350565b6000806000806040858703121561438057600080fd5b84356001600160401b0381111561439657600080fd5b6143a28782880161408f565b945094505060208501356001600160401b038111156143c057600080fd5b6143cc8782880161408f565b95989497509550505050565b6000602082840312156143ea57600080fd5b81356001600160401b0381111561440057600080fd5b6142e584828501614156565b60006020828403121561441e57600080fd5b81516001600160401b0381111561443457600080fd5b6142e5848285016141c6565b6000806040838503121561445357600080fd5b82356001600160401b0381111561446957600080fd5b61447585828601614156565b92505060208301356001600160401b0381111561449157600080fd5b61449d858286016140d7565b9150509250929050565b60008060008060008060c087890312156144c057600080fd5b86356001600160401b038111156144d657600080fd5b6144e289828a01614156565b96505060208701356001600160401b038111156144fe57600080fd5b61450a89828a016140d7565b955050604061451b89828a01614084565b945050606061452c89828a01614084565b935050608061453d89828a01614084565b92505060a061454e89828a016142b1565b9150509295509295509295565b6000806040838503121561456e57600080fd5b82356001600160401b0381111561458457600080fd5b61459085828601614156565b92505060208301356001600160401b038111156145ac57600080fd5b61449d85828601614236565b6000806000606084860312156145cd57600080fd5b83356001600160401b038111156145e357600080fd5b6145ef86828701614156565b93505060208401356001600160401b0381111561460b57600080fd5b61461786828701614236565b925050604061462886828701614084565b9150509250925092565b60006020828403121561464457600080fd5b60006142e584846142a6565b60006020828403121561466257600080fd5b60006142e584846142b1565b6000806040838503121561468157600080fd5b600061468d85856142b1565b925050602061449d85828601614084565b6000806000806000606086880312156146b657600080fd5b60006146c288886142b1565b95505060208601356001600160401b038111156146de57600080fd5b6146ea8882890161408f565b945094505060408601356001600160401b0381111561470857600080fd5b6147148882890161408f565b92509250509295509295909350565b6000806040838503121561473657600080fd5b600061474285856142b1565b925050602061449d858286016142b1565b60008060006060848603121561476857600080fd5b600061477486866142b1565b9350506020614785868287016142b1565b9250506040614628868287016142b1565b6000602082840312156147a857600080fd5b60006142e584846142bc565b60006147c083836147e3565b505060200190565b60006147c08383614923565b6147dd81615c98565b82525050565b6147dd81615c62565b60006147f782615c55565b6148018185615c59565b935061480c83615c4f565b8060005b8381101561483a57815161482488826147b4565b975061482f83615c4f565b925050600101614810565b509495945050505050565b60006148518385615c59565b93506001600160fb1b0383111561486757600080fd5b602083029250614878838584615cb5565b50500190565b600061488982615c55565b6148938185615c59565b935061489e83615c4f565b8060005b8381101561483a5781516148b688826147c8565b97506148c183615c4f565b9250506001016148a2565b60006148d782615c55565b6148e18185615c59565b93506148ec83615c4f565b8060005b8381101561483a57815161490488826147c8565b975061490f83615c4f565b9250506001016148f0565b6147dd81615c6d565b6147dd81615c72565b6147dd61493882615c72565b615c72565b600061494882615c55565b6149528185615c59565b9350614962818560208601615cc1565b61496b81615ced565b9093019392505050565b600061498082615c55565b61498a81856138ba565b935061499a818560208601615cc1565b9290920192915050565b6147dd81615c9f565b6147dd81615caa565b60006149c3600383615c59565b6222299960e91b815260200192915050565b60006149e2600483615c59565b632929a91960e11b815260200192915050565b6000614a02600383615c59565b6243553160e81b815260200192915050565b6000614a21600383615c59565b6255533160e81b815260200192915050565b6000614a40600383615c59565b6229a99960e91b815260200192915050565b6000614a5f600383615c59565b6214d4cd60ea1b815260200192915050565b6000614a7e600483615c59565b63544c323160e01b815260200192915050565b6000614a9e600383615c59565b6220a99960e91b815260200192915050565b6000614abd600383615c59565b6204453360ec1b815260200192915050565b6000614adc600383615c59565b6204352360ec1b815260200192915050565b6000614afb600383615c59565b6243523160e81b815260200192915050565b6000614b1a602683615c59565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000614b62600383615c59565b6255543160e81b815260200192915050565b6000614b81600583615c59565b64495253523160d81b815260200192915050565b6000614ba2600483615c59565b630544c32360e41b815260200192915050565b6000614bc2600383615c59565b6243533360e81b815260200192915050565b6000614be1600983615c59565b68125b989bde10d85b1b60ba1b815260200192915050565b6000614c06601b83615c59565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000614c3f600383615c59565b6229299960e91b815260200192915050565b6000614c5e600383615c59565b6244533360e81b815260200192915050565b6000614c7d600383615c59565b6241533160e81b815260200192915050565b6000614c9c600383615c59565b6204153360ec1b815260200192915050565b6000614cbb600483615c59565b630525352360e41b815260200192915050565b6000614cdb600483615c59565b632a26191960e11b815260200192915050565b6000614cfb600383615c59565b621054cd60ea1b815260200192915050565b6000614d1a600383615c59565b6253533360e81b815260200192915050565b6000614d39600483615c59565b635753433160e01b815260200192915050565b6000614d59600483615c59565b632ba9a19960e11b815260200192915050565b6000614d79600683615c59565b651511d0d85b1b60d21b815260200192915050565b6000614d9b600383615c59565b6221a91960e91b815260200192915050565b6000614dba601c83615c59565b7f534d3a52535273202d20496e76616c696420696e707574206461746100000000815260200192915050565b6000614df3600383615c59565b6243533160e81b815260200192915050565b6000614e12600383615c59565b6205753360ec1b815260200192915050565b6000614e31600483615c59565b635253523360e01b815260200192915050565b6000614e51600383615c59565b621114cd60ea1b815260200192915050565b6000614e70600383615c59565b622ba99960e91b815260200192915050565b6000614e8f600483615c59565b635753433360e01b815260200192915050565b6000614eaf600383615c59565b6243533560e81b815260200192915050565b6000614ece600383615c59565b624c543160e81b815260200192915050565b6000614eed602083615c59565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000614f266005836138ba565b64135413d39160da1b815260050192915050565b6000614f47602e83615c59565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626581526d195b881a5b9a5d1a585b1a5e995960921b602082015260400192915050565b6000614f97600383615c59565b6243553360e81b815260200192915050565b6000614fb6600483615c59565b63544c323360e01b815260200192915050565b6000614fd6600383615c59565b624d533160e81b815260200192915050565b6000614ff5600483615c59565b635753433560e01b815260200192915050565b6000615015600383615c59565b6244533160e81b815260200192915050565b6000615034600383615c59565b6257533160e81b815260200192915050565b6000615053600483615c59565b6305f5253360e41b815260200192915050565b6000615073600383615c59565b622aa99960e91b815260200192915050565b6000615092600383615c59565b6205353360ec1b815260200192915050565b60006150b1600383615c59565b6252533160e81b815260200192915050565b60006150d0600483615c59565b6326a9981960e11b815260200192915050565b60006150f0600383615c59565b6257533360e81b815260200192915050565b600061510f600383615c59565b6205553360ec1b815260200192915050565b600061512e600383615c59565b6221a99960e91b815260200192915050565b600061514d600383615c59565b6253533160e81b815260200192915050565b600061516c600383615c59565b624d533560e81b815260200192915050565b600061518b6011836138ba565b70524544454c45474154494f4e5f4c4f434b60781b815260110192915050565b60006151b8600383615c59565b6253533560e81b815260200192915050565b60006151d7600483615c59565b6305f4352360e41b815260200192915050565b60006151f7600383615c59565b624d533360e81b815260200192915050565b6000615216600483615c59565b635253523160e01b815260200192915050565b6000615236600383615c59565b6204355360ec1b815260200192915050565b6000615255600383615c59565b6205253360ec1b815260200192915050565b6000615274600383615c59565b6210d4cd60ea1b815260200192915050565b6000615293600483615c59565b634d53303160e01b815260200192915050565b60006152b3600583615c59565b6405f525352360dc1b815260200192915050565b60006152d4600483615c59565b6315d4d0cd60e21b815260200192915050565b60006152f4600383615c59565b6221aa9960e91b815260200192915050565b6000615313600383615c59565b6226a99960e91b815260200192915050565b6000615332600383615c59565b621354cd60ea1b815260200192915050565b6000615351600383615c59565b6241533360e81b815260200192915050565b6147dd81615c87565b6000615378828561492c565b602082019150615388828461492c565b5060200192915050565b600061257b8284614975565b60006125a082614f19565b60006125a08261517e565b60006153c0828461492c565b50602001919050565b602081016125a082846147e3565b608081016153e582896147d4565b6153f260208301886147e3565b8181036040830152615405818688614845565b9050818103606083015261541a818486614845565b98975050505050505050565b6080810161543482876147d4565b61544160208301866147e3565b8181036040830152615453818561487e565b9050818103606083015261546781846148cc565b9695505050505050565b6080810161543482876147e3565b6060810161548d82866147e3565b61549a60208301856147e3565b6142e56040830184614923565b608081016154b582876147e3565b81810360208301526154c7818661487e565b905081810360408301526154db81856148cc565b9050818103606083015261546781846147ec565b61010081016154fe828b6147e3565b61550b602083018a6149ad565b6155186040830189614923565b61552560608301886147e3565b61553260808301876147e3565b61553f60a0830186614923565b61554c60c0830185614923565b81810360e083015261555e818461493d565b9a9950505050505050505050565b6040810161557a82856147e3565b61257b6020830184614923565b6080810161559582876147e3565b6155a26020830186614923565b6155af6040830185614923565b610f196060830184614923565b604081016155ca82856147e3565b61257b6020830184615363565b602080825281016142e5818486614845565b602081016125a0828461491a565b602081016125a08284614923565b604081016156138285614923565b61257b60208301846147e3565b6080810161562e8287614923565b61563b60208301866147e3565b6155af60408301856147e3565b608081016153e58289614923565b6060810161548d8286614923565b606081016156728288614923565b8181036020830152615685818688614845565b9050818103604083015261569a818486614845565b979650505050505050565b606081016156b38286614923565b81810360208301526156c5818561487e565b90508181036040830152610f1981846148cc565b6040810161557a8285614923565b60a081016156f5828a614923565b6157026020830189614923565b61570f6040830188614923565b8181036060830152615722818688614845565b90508181036080830152615737818486614845565b9998505050505050505050565b608081016157528287614923565b6154416020830186614923565b6060810161576d8286614923565b61549a6020830185614923565b602081016125a082846149a4565b6020808252810161257b818461493d565b602080825281016125a0816149b6565b602080825281016125a0816149d5565b602080825281016125a0816149f5565b602080825281016125a081614a14565b602080825281016125a081614a33565b602080825281016125a081614a52565b602080825281016125a081614a71565b602080825281016125a081614a91565b602080825281016125a081614ab0565b602080825281016125a081614acf565b602080825281016125a081614aee565b602080825281016125a081614b0d565b602080825281016125a081614b55565b602080825281016125a081614b74565b602080825281016125a081614b95565b602080825281016125a081614bb5565b602080825281016125a081614bd4565b602080825281016125a081614bf9565b602080825281016125a081614c32565b602080825281016125a081614c51565b602080825281016125a081614c70565b602080825281016125a081614c8f565b602080825281016125a081614cae565b602080825281016125a081614cce565b602080825281016125a081614cee565b602080825281016125a081614d0d565b602080825281016125a081614d2c565b602080825281016125a081614d4c565b602080825281016125a081614d6c565b602080825281016125a081614d8e565b602080825281016125a081614dad565b602080825281016125a081614de6565b602080825281016125a081614e05565b602080825281016125a081614e24565b602080825281016125a081614e44565b602080825281016125a081614e63565b602080825281016125a081614e82565b602080825281016125a081614ea2565b602080825281016125a081614ec1565b602080825281016125a081614ee0565b602080825281016125a081614f3a565b602080825281016125a081614f8a565b602080825281016125a081614fa9565b602080825281016125a081614fc9565b602080825281016125a081614fe8565b602080825281016125a081615008565b602080825281016125a081615027565b602080825281016125a081615046565b602080825281016125a081615066565b602080825281016125a081615085565b602080825281016125a0816150a4565b602080825281016125a0816150c3565b602080825281016125a0816150e3565b602080825281016125a081615102565b602080825281016125a081615121565b602080825281016125a081615140565b602080825281016125a08161515f565b602080825281016125a0816151ab565b602080825281016125a0816151ca565b602080825281016125a0816151ea565b602080825281016125a081615209565b602080825281016125a081615229565b602080825281016125a081615248565b602080825281016125a081615267565b602080825281016125a081615286565b602080825281016125a0816152a6565b602080825281016125a0816152c7565b602080825281016125a0816152e7565b602080825281016125a081615306565b602080825281016125a081615325565b602080825281016125a081615344565b6040518181016001600160401b0381118282101715615c2757600080fd5b604052919050565b60006001600160401b03821115615c4557600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b60006125a082615c75565b151590565b90565b6001600160a01b031690565b60ff1690565b6bffffffffffffffffffffffff1690565b60006125a0825b60006125a082615c62565b60006125a082615c81565b82818337506000910152565b60005b83811015615cdc578181015183820152602001615cc4565b838111156113035750506000910152565b601f01601f191690565b615d0081615c62565b811461098057600080fd5b615d0081615c6d565b615d0081615c7256fea365627a7a72315820c2078afaddac6695852aa138a2cd72d0c16e4b8d432fc137733eb0827c2af50f6c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode
0x6080604052600436106102c95760003560e01c80638da5cb5b11610175578063bcda6408116100dc578063cfa114f111610095578063f2fde38b1161006f578063f2fde38b14610878578063f80263aa14610898578063fb0e722b146108b8578063fff0d190146108cd576102c9565b8063cfa114f11461080a578063d21de9901461082a578063ed5e84371461084a576102c9565b8063bcda64081461074a578063bf3e116b1461076a578063c0403fb11461078a578063c4d66de8146107aa578063c5ccd697146107ca578063cc873bfd146107ea576102c9565b8063a8834f4e1161012e578063a8834f4e14610695578063aa49f091146106b5578063b0571ec5146106d5578063b1f4d1cf146106ea578063b6ce4dd31461070a578063bc66c94b1461072a576102c9565b80638da5cb5b146105e95780638f32d59b146105fe578063934efeb91461061357806393cc4450146106335780639a5e0e6014610646578063a76f955f14610666576102c9565b806347ae58b311610234578063645954ea116101ed5780637a099cce116101c75780637a099cce146105695780638616e44d146105895780638894dfd6146105a957806388afbc68146105c9576102c9565b8063645954ea146105075780636dd3266d14610534578063715018a614610554576102c9565b806347ae58b31461045d57806348ad85721461047d5780634bd63cc51461049d5780634c8e7d81146104b25780635dc47b57146104d2578063625aa555146104f2576102c9565b8063244864d811610286578063244864d81461039b578063315db6d8146103bb578063324b5d68146103db57806338e6cc38146103fb5780633fa364cd1461041b578063452a62791461043d576102c9565b8063044ff62b146102ce57806309457ff6146102f057806313b929f01461031957806315c5dfa5146103395780631a028fa91461034e5780631a282d991461037b575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004614650565b6108ed565b005b6103036102fe3660046142ed565b610983565b60405161031091906155f7565b60405180910390f35b34801561032557600080fd5b506102ee61033436600461436a565b610f22565b34801561034557600080fd5b50610303610fd4565b34801561035a57600080fd5b5061036e610369366004614650565b610fda565b60405161031091906153c9565b34801561038757600080fd5b506102ee610396366004614650565b610ff5565b3480156103a757600080fd5b506102ee6103b6366004614440565b611148565b3480156103c757600080fd5b506102ee6103d636600461466e565b6111b2565b3480156103e757600080fd5b506103036103f6366004614650565b611309565b34801561040757600080fd5b506102ee61041636600461466e565b61131b565b34801561042757600080fd5b5061043061161c565b604051610310919061577a565b34801561044957600080fd5b506102ee610458366004614650565b61162b565b34801561046957600080fd5b506102ee6104783660046142c7565b611966565b34801561048957600080fd5b50610303610498366004614650565b6119bf565b3480156104a957600080fd5b5061036e6119d1565b3480156104be57600080fd5b506102ee6104cd366004614650565b6119e0565b3480156104de57600080fd5b506102ee6104ed366004614650565b611a7a565b3480156104fe57600080fd5b50610303611d53565b34801561051357600080fd5b50610527610522366004614650565b611d59565b60405161031091906155e9565b34801561054057600080fd5b506102ee61054f36600461466e565b611d6e565b34801561056057600080fd5b506102ee611eaf565b34801561057557600080fd5b506102ee6105843660046142c7565b611f1d565b34801561059557600080fd5b506102ee6105a436600461469e565b611faf565b3480156105b557600080fd5b506102ee6105c43660046142c7565b612248565b3480156105d557600080fd5b506102ee6105e436600461436a565b6122a1565b3480156105f557600080fd5b5061036e612321565b34801561060a57600080fd5b50610527612330565b34801561061f57600080fd5b506102ee61062e366004614650565b612356565b610303610641366004614753565b6123af565b34801561065257600080fd5b50610303610661366004614723565b612582565b34801561067257600080fd5b50610686610681366004614650565b6125a6565b6040516103109392919061547f565b3480156106a157600080fd5b506102ee6106b036600461469e565b6125d4565b3480156106c157600080fd5b506102ee6106d036600461469e565b612874565b3480156106e157600080fd5b5061036e612b33565b3480156106f657600080fd5b506102ee6107053660046143d8565b612b42565b34801561071657600080fd5b506102ee6107253660046143d8565b612b76565b34801561073657600080fd5b506102ee6107453660046144a7565b612ba6565b34801561075657600080fd5b506102ee610765366004614723565b612d8d565b34801561077657600080fd5b506102ee6107853660046145b8565b61322a565b34801561079657600080fd5b506103036107a536600461455b565b613242565b3480156107b657600080fd5b506102ee6107c53660046142c7565b613427565b3480156107d657600080fd5b506102ee6107e536600461466e565b6134f9565b3480156107f657600080fd5b506102ee6108053660046142c7565b6135e8565b34801561081657600080fd5b506102ee610825366004614650565b613641565b34801561083657600080fd5b506102ee6108453660046142c7565b613680565b34801561085657600080fd5b5061086a610865366004614650565b6136d9565b6040516103109291906156d9565b34801561088457600080fd5b506102ee6108933660046142c7565b6136f2565b3480156108a457600080fd5b506102ee6108b3366004614650565b61371f565b3480156108c457600080fd5b5061036e61375b565b3480156108d957600080fd5b506102ee6108e8366004614723565b61376a565b600081815260a2602052604090205460ff16156109255760405162461bcd60e51b815260040161091c90615829565b60405180910390fd5b6000818152606660205260409020546001600160a01b0316331461095b5760405162461bcd60e51b815260040161091c90615839565b610964816137eb565b6109805760405162461bcd60e51b815260040161091c90615969565b50565b60006060606c60009054906101000a90046001600160a01b03166001600160a01b0316632cd767586040518163ffffffff1660e01b815260040160006040518083038186803b1580156109d557600080fd5b505afa1580156109e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a11919081019061440c565b9050606086869050825102604051908082528060200260200182016040528015610a45578160200160208202803883390190505b509050606087879050604051908082528060200260200182016040528015610a77578160200160208202803883390190505b50905060005b87811015610d92576000898983818110610a9357fe5b6020908102929092013560008181526066845260408082208054600182015460039092015460a290975291909220549295506001600160a01b0390811694911692509060ff1615610af65760405162461bcd60e51b815260040161091c90615879565b600084815260a260205260409020805460ff191660011790556001600160a01b0383163314610b375760405162461bcd60e51b815260040161091c906157f9565b6001600160a01b038216610b5d5760405162461bcd60e51b815260040161091c90615909565b438110610b7c5760405162461bcd60e51b815260040161091c90615a39565b81868681518110610b8957fe5b6001600160a01b039092166020928302919091019091015260005b8851811015610d815760006066600087815260200190815260200160002060020160008b8481518110610bd357fe5b602002602001015181526020019081526020016000205490508060001415610bfb5750610d79565b8060a660008c8581518110610c0c57fe5b60200260200101518152602001908152602001600020600082825401925050819055506000606860008c8581518110610c4157fe5b6020908102919091018101518252810191909152604001600020546069546001600160a01b03918216925016811415610cdd5760695460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390610ca690899086906004016155bc565b600060405180830381600087803b158015610cc057600080fd5b505af1158015610cd4573d6000803e3d6000fd5b50505050610d58565b606a546001600160a01b0382811691161415610d5857606a5460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390610d2590899086906004016155bc565b600060405180830381600087803b158015610d3f57600080fd5b505af1158015610d53573d6000803e3d6000fd5b505050505b818a848d518b020181518110610d6a57fe5b60200260200101818152505050505b600101610ba4565b505060019093019250610a7d915050565b50606089848484604051602401610dac94939291906154a7565b60408051601f198184030181529181526020820180516001600160e01b031663d07cf52160e01b17905260a4549051919250606091610e0a916001600160a01b0316906000908b8b023403908f9081908e908e908a906024016154ef565b60408051601f198184030181529181526020820180516001600160e01b031663679b6ded60e01b17905260a35490519192506000916060916001600160a01b0316903490610e59908690615392565b60006040518083038185875af1925050503d8060008114610e96576040519150601f19603f3d011682016040523d82523d6000602084013e610e9b565b606091505b509150915081610ebd5760405162461bcd60e51b815260040161091c90615899565b600081806020019051610ed39190810190614796565b9050807f54ed6ea9718d447824486ae2dbc3eabd8e307140fe50cf12766f0e2beb8c80e98e8e604051610f079291906155d7565b60405180910390a29750505050505050505b95945050505050565b610f2a612330565b610f465760405162461bcd60e51b815260040161091c90615a09565b828114610f5257600080fd5b60005b83811015610fcd57828282818110610f6957fe5b9050602002016020610f7e91908101906142c7565b60a76000878785818110610f8e57fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600101610f55565b5050505050565b60675481565b60a7602052600090815260409020546001600160a01b031681565b600081815260a2602052604090205460ff16156110245760405162461bcd60e51b815260040161091c90615b79565b61102c614064565b50600081815260666020908152604091829020825160608101845281546001600160a01b0390811682526001830154169281018390526003909101549281019290925261108b5760405162461bcd60e51b815260040161091c90615ab9565b6000604051611099906153a9565b6040519081900381206110b091859060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d90935291205490915080158015906110e75750438111155b6111035760405162461bcd60e51b815260040161091c906158b9565b6000828152606d6020908152604090912060010154845191850151909161112d91879190846138bf565b50506000908152606d60205260408120818155600101555050565b80518251146111695760405162461bcd60e51b815260040161091c90615979565b60005b82518110156111ad576111a583828151811061118457fe5b602002602001015183838151811061119857fe5b6020026020010151611d6e565b60010161116c565b505050565b600082815260a2602052604090205460ff16156111e15760405162461bcd60e51b815260040161091c90615b69565b600082815260666020526040902080546003909101546001600160a01b03909116903382146112225760405162461bcd60e51b815260040161091c906157b9565b4381116112415760405162461bcd60e51b815260040161091c90615bc9565b61128c606e6000604051611254906153a9565b6040518091039020815260200190815260200160002054611280606f5443613b4390919063ffffffff16565b9063ffffffff613b6816565b81106112aa5760405162461bcd60e51b815260040161091c90615a29565b60008481526066602052604080822060030191909155517fe82d816130a7347cc60ff37b0c5e9c5eb73bbd73c5a4260112932e1001112327906112ee9086906155f7565b60405180910390a161130384836000866138bf565b50505050565b60a66020526000908152604090205481565b600082815260a2602052604090205460ff161561134a5760405162461bcd60e51b815260040161091c90615819565b611352614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146113b75760405162461bcd60e51b815260040161091c90615a69565b6001600160a01b0382166113dd5760405162461bcd60e51b815260040161091c90615799565b60208101516001600160a01b0316156114085760405162461bcd60e51b815260040161091c906158c9565b438160400151111561142c5760405162461bcd60e51b815260040161091c906159b9565b6000838152606660205260408082206001810180546001600160a01b0319166001600160a01b03878116919091179091556003909101839055606c54825163059aeceb60e31b815292516060949190921692632cd767589260048083019392829003018186803b15801561149f57600080fd5b505afa1580156114b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114db919081019061440c565b90506060815160405190808252806020026020018201604052801561150a578160200160208202803883390190505b50905060005b82518110156115735760666000878152602001908152602001600020600201600084838151811061153d57fe5b602002602001015181526020019081526020016000205482828151811061156057fe5b6020908102919091010152600101611510565b50606c546040516304855c6b60e31b81526001600160a01b039091169063242ae358906115aa903390889087908790600401615426565b600060405180830381600087803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b505050507f1d7a1ceec042fe10baf115a3343fbc7647382acfb27b3bb9d63877a592627c81858560405161160d929190615605565b60405180910390a15050505050565b606c546001600160a01b031681565b600081815260a2602052604090205460ff161561165a5760405162461bcd60e51b815260040161091c90615999565b611662614064565b50600081815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146116c75760405162461bcd60e51b815260040161091c90615a79565b60208101516001600160a01b0316156116f25760405162461bcd60e51b815260040161091c906159c9565b43816040015111156117165760405162461bcd60e51b815260040161091c90615ad9565b606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611797919081019061440c565b9050606081516040519080825280602002602001820160405280156117c6578160200160208202803883390190505b50905060005b82518110156118c0576066600086815260200190815260200160002060020160008483815181106117f957fe5b602002602001015181526020019081526020016000205482828151811061181c57fe5b60200260200101818152505081818151811061183457fe5b602002602001015160001415611849576118b8565b60666000868152602001908152602001600020600201600084838151811061186d57fe5b60200260200101518152602001908152602001600020600090556118b883828151811061189657fe5b60200260200101518383815181106118aa57fe5b602002602001015133613baa565b6001016117cc565b5060008481526066602052604080822080546001600160a01b031916815560030191909155517ff7b17d83b1c6d7f3c428e708ce63a8afc9ce528790694f379bd32da3b09d585090611917908690859085906156a5565b60405180910390a1336001600160a01b03167f44ec1f9e039c512541fb6904909fc8b3fd32a960374888656587103a37a0c0f88560405161195891906155f7565b60405180910390a250505050565b61196e612330565b61198a5760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b03811661199d57600080fd5b606c80546001600160a01b0319166001600160a01b0392909216919091179055565b606e6020526000908152604090205481565b60a5546001600160a01b031681565b6119e8612330565b611a045760405162461bcd60e51b815260040161091c90615a09565b600081815260686020526040902054600160a01b900460ff16611a2657600080fd5b60008181526068602052604090819020805460ff60a01b19169055517f27b51627532fe8cd0df946e5a9590efb06cc367d3d611c1e4084c7e1dccb3ab490611a6f9083906155f7565b60405180910390a150565b600081815260a2602052604090205460ff1615611aa95760405162461bcd60e51b815260040161091c90615ae9565b611ab1614064565b50600081815260666020908152604091829020825160608101845281546001600160a01b03908116808352600184015490911693820193909352600390910154928101929092523314611b165760405162461bcd60e51b815260040161091c906157c9565b60208101516001600160a01b0316611b405760405162461bcd60e51b815260040161091c90615a99565b606f546000611b55438363ffffffff613b4316565b60008581526066602052604090206003810182905560010180546001600160a01b03191690559050611b86846137eb565b50606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b158015611bcc57600080fd5b505afa158015611be0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c08919081019061440c565b905060608151604051908082528060200260200182016040528015611c37578160200160208202803883390190505b50905060005b8251811015611ca057606660008881526020019081526020016000206002016000848381518110611c6a57fe5b6020026020010151815260200190815260200160002054828281518110611c8d57fe5b6020908102919091010152600101611c3d565b50606c546020860151604051624d4a1f60e91b81526001600160a01b0390921691639a943e0091611cda9133919087908790600401615426565b600060405180830381600087803b158015611cf457600080fd5b505af1158015611d08573d6000803e3d6000fd5b505050507f910aaad05eef8babc75a5bbd3987092b49f6dcd0fd06c860d9af177b650c562586866020015185604051611d4393929190615656565b60405180910390a1505050505050565b606f5481565b60a26020526000908152604090205460ff1681565b600082815260a2602052604090205460ff1615611d9d5760405162461bcd60e51b815260040161091c906158f9565b611da5614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b03908116808352600184015490911693820193909352600390910154928101929092523314611e0a5760405162461bcd60e51b815260040161091c90615b59565b60208101516001600160a01b0316611e345760405162461bcd60e51b815260040161091c906157a9565b6001600160a01b038216611e5a5760405162461bcd60e51b815260040161091c906159a9565b6000611e668484613d5a565b90507fcc9ff84a5150218e8e56d3d43cfd422a96d5994a3877a760afc1f85dcbab545d8483602001518584604051611ea19493929190615620565b60405180910390a150505050565b611eb7612330565b611ed35760405162461bcd60e51b815260040161091c90615a09565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b611f25612330565b611f415760405162461bcd60e51b815260040161091c90615a09565b60698054606a80546001600160a01b038084166001600160a01b0319928316179092559091169083161790556040517f2aada7c835843a942d6bae43540591b084921c87edbb049c55d49d114424279490611f9b9061539e565b604051908190038120611a6f918490615605565b600085815260a2602052604090205460ff1615611fde5760405162461bcd60e51b815260040161091c906158e9565b611fe6614064565b50600085815260666020908152604091829020825160608101845281546001600160a01b0390811680835260018401549091169382019390935260039091015492810192909252331461204b5760405162461bcd60e51b815260040161091c906158d9565b438160400151111561206f5760405162461bcd60e51b815260040161091c90615809565b83821461208e5760405162461bcd60e51b815260040161091c90615bf9565b60208101516001600160a01b03161561211257606c5460208201516040516304855c6b60e31b81526001600160a01b039092169163242ae358916120df913391908a908a908a908a906004016153d7565b600060405180830381600087803b1580156120f957600080fd5b505af115801561210d573d6000803e3d6000fd5b505050505b60005b8481101561220a57600086868381811061212b57fe5b602090810292909201356000818152606890935260409092205491925050600160a01b900460ff1661216f5760405162461bcd60e51b815260040161091c90615919565b84848381811061217b57fe5b90506020020135600014612201576121c785858481811061219857fe5b60008c81526066602090815260408083208884526002018252909120549391020135905063ffffffff613b4316565b6000898152606660209081526040808320858452600201909152902055612201818686858181106121f457fe5b9050602002013533613e71565b50600101612115565b507f08fc62a716797765934c34e699a0dd8276e455b0dd6e2831d026bb7764a3945c86826020015187878787604051611d4396959493929190615648565b612250612330565b61226c5760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b03811661227f57600080fd5b60a480546001600160a01b0319166001600160a01b0392909216919091179055565b6122a9612330565b6122c55760405162461bcd60e51b815260040161091c90615a09565b8281146122d157600080fd5b60005b83811015610fcd578282828181106122e857fe5b9050602002013560a660008787858181106122ff57fe5b60209081029290920135835250810191909152604001600020556001016122d4565b6033546001600160a01b031690565b6033546000906001600160a01b0316612347613fac565b6001600160a01b031614905090565b61235e612330565b61237a5760405162461bcd60e51b815260040161091c90615a09565b606f8190556040517fd2d74b9fbd3364e161a82e64e07b2f1d94a781cf730d0e65810f7fb5a57c462590611a6f9083906155f7565b60006123b9612330565b6123d55760405162461bcd60e51b815260040161091c90615a09565b60008481526068602090815260408083205460a783528184205460a69093528184208054949055905163095ea7b360e01b81526001600160a01b03918216939190921691839063095ea7b390612431908590859060040161556c565b602060405180830381600087803b15801561244b57600080fd5b505af115801561245f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124839190810190614632565b5060a5546040516060916124ab916001600160a01b039091169084908a908a90602401615587565b60408051601f198184030181529181526020820180516001600160e01b031663402b1ced60e11b179052519091506000906060906001600160a01b0386169034906124f7908690615392565b60006040518083038185875af1925050503d8060008114612534576040519150601f19603f3d011682016040523d82523d6000602084013e612539565b606091505b50915091508161255b5760405162461bcd60e51b815260040161091c90615959565b6000818060200190516125719190810190614796565b9750505050505050505b9392505050565b60008281526066602090815260408083208484526002019091529020545b92915050565b6066602052600090815260409020805460018201546003909201546001600160a01b03918216929091169083565b600085815260a2602052604090205460ff16156126035760405162461bcd60e51b815260040161091c90615999565b61260b614064565b50600085815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146126705760405162461bcd60e51b815260040161091c90615939565b60208101516001600160a01b03161561269b5760405162461bcd60e51b815260040161091c90615949565b43816040015111156126bf5760405162461bcd60e51b815260040161091c906159d9565b8382146126de5760405162461bcd60e51b815260040161091c90615bb9565b60005b8481101561283c5760008781526066602052604081206002018188888581811061270757fe5b90506020020135815260200190815260200160002054905084848381811061272b57fe5b905060200201358110156127515760405162461bcd60e51b815260040161091c90615a59565b84848381811061275d57fe5b905060200201358114156127a75760008881526066602052604081206002019088888581811061278957fe5b90506020020135815260200190815260200160002060009055612804565b6127cc8585848181106127b657fe5b9050602002013582613b6890919063ffffffff16565b6000898152606660205260408120600201908989868181106127ea57fe5b905060200201358152602001908152602001600020819055505b61283387878481811061281357fe5b9050602002013586868581811061282657fe5b9050602002013533613baa565b506001016126e1565b507ff7b17d83b1c6d7f3c428e708ce63a8afc9ce528790694f379bd32da3b09d58508686868686604051611d43959493929190615664565b600085815260a2602052604090205460ff16156128a35760405162461bcd60e51b815260040161091c90615aa9565b6128ab614064565b50600085815260666020908152604091829020825160608101845281546001600160a01b039081168083526001840154909116938201939093526003909101549281019290925233146129105760405162461bcd60e51b815260040161091c90615b09565b8361292d5760405162461bcd60e51b815260040161091c906157d9565b83821461294c5760405162461bcd60e51b815260040161091c90615929565b6067546040516000906129639083906020016153b4565b60408051601f198184030181529190528051602090910120905060005b86811015612a9757600088888381811061299657fe5b90506020020135905060008787848181106129ad57fe5b600087815260666020908152604080832088845260020182529091205491029290920135925050156129f15760405162461bcd60e51b815260040161091c906157e9565b80612a0e5760405162461bcd60e51b815260040161091c90615b29565b604080518082018252600381526229a99b60e91b60208083019190915260008e8152606682528381208682526002019091529190912054612a5691839063ffffffff613fb016565b60008c815260666020818152604080842087855260029081018352818520959095558884529181528183209583529490920190935290912055600101612980565b506000818152606660209081526040918290208054336001600160a01b0319918216178255918601516001820180549093166001600160a01b039091161790915584820151600390910155517f147f8735c585be62efbb75aee3c165de6e2b5f7cdc0fb65b9e5d358ce2871cfd90612b1c9083908b9086908c908c908c908c906156e7565b60405180910390a150600101606755505050505050565b60a4546001600160a01b031681565b60005b8151811015612b7257612b6a828281518110612b5d57fe5b6020026020010151610ff5565b600101612b45565b5050565b60005b8151811015612b7257612b9e828281518110612b9157fe5b6020026020010151611a7a565b600101612b79565b600054610100900460ff1680612bbf5750612bbf613fdc565b80612bcd575060005460ff16155b612be95760405162461bcd60e51b815260040161091c90615a19565b600054610100900460ff16158015612c14576000805460ff1961ff0019909116610100171660011790555b8551875114612c2257600080fd5b60005b8751811015612d33576040518060400160405280888381518110612c4557fe5b60200260200101516001600160a01b0316815260200160011515815250606860008a8481518110612c7257fe5b6020908102919091018101518252818101929092526040016000208251815493909201511515600160a01b0260ff60a01b196001600160a01b039093166001600160a01b0319909416939093179190911691909117905587517f662cc3305b9b4ea3a5fd06717cdaece79b6ac0a7734fd44eabe0f37951dc587c90899083908110612cf957fe5b6020026020010151888381518110612d0d57fe5b6020026020010151604051612d23929190615605565b60405180910390a1600101612c25565b50606980546001600160a01b038088166001600160a01b031992831617909255606c805492871692909116919091179055606f829055612d7283613427565b8015612d84576000805461ff00191690555b50505050505050565b600082815260a2602052604090205460ff1615612dbc5760405162461bcd60e51b815260040161091c90615b99565b600081815260a2602052604090205460ff1615612deb5760405162461bcd60e51b815260040161091c90615ac9565b80821415612e0b5760405162461bcd60e51b815260040161091c90615a49565b612e13614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b039081168252600183015416928101929092526003015491810191909152612e5d614064565b50600082815260666020908152604091829020825160608101845281546001600160a01b03908116825260018301548116938201939093526003909101549281019290925282511633148015612ebc575080516001600160a01b031633145b612ed85760405162461bcd60e51b815260040161091c90615bd9565b80602001516001600160a01b031682602001516001600160a01b031614612f115760405162461bcd60e51b815260040161091c90615b49565b43826040015111158015612f29575043816040015111155b612f455760405162461bcd60e51b815260040161091c90615be9565b6000604051612f53906153a9565b604051908190038120612f6a91879060200161536c565b60408051601f1981840301815282825280516020918201206000818152606d909252918120549193509091612f9e906153a9565b604051908190038120612fb591889060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d90935291205490915082158015612fe9575080155b6130055760405162461bcd60e51b815260040161091c90615b19565b606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b15801561304a57600080fd5b505afa15801561305e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613086919081019061440c565b905060005b81518110156131b5576000606660008b815260200190815260200160002060020160008484815181106130ba57fe5b6020026020010151815260200190815260200160002054905080600014156130e257506131ad565b606660008b8152602001908152602001600020600201600084848151811061310657fe5b602002602001015181526020019081526020016000206000905561316d81606660008e8152602001908152602001600020600201600086868151811061314857fe5b6020026020010151815260200190815260200160002054613b4390919063ffffffff16565b606660008d8152602001908152602001600020600201600085858151811061319157fe5b6020026020010151815260200190815260200160002081905550505b60010161308b565b5060008881526066602052604080822080546001600160a01b03199081168255600182018054909116905560030191909155517f24a7a8f3e9dc071723fbfe550a5ad792fcba5e3886938d619dede64aebacd84490613217908b908b906156d9565b60405180910390a1505050505050505050565b60006132368484613242565b9050611303818361131b565b600081518351146132655760405162461bcd60e51b815260040161091c90615989565b82516132835760405162461bcd60e51b815260040161091c90615af9565b60675460405160009061329a9083906020016153b4565b60408051601f198184030181529190528051602090910120905060005b85518110156133b65760008682815181106132ce57fe5b6020026020010151905060008683815181106132e657fe5b60209081029190910181015160008481526068909252604090912054909150600160a01b900460ff1661332b5760405162461bcd60e51b815260040161091c90615889565b6000848152606660209081526040808320858452600201909152902054156133655760405162461bcd60e51b815260040161091c90615b89565b806133825760405162461bcd60e51b815260040161091c906159e9565b600084815260666020908152604080832085845260020190915290208190556133ac828233613e71565b50506001016132b7565b506000818152606660205260409081902080546001600160a01b0319163390811790915590517f614d6f8319493a3bb5dd50287615457dd869414d3d6b96136f80ac1c1ef2428d9061340f90849086908a908a90615744565b60405180910390a26001909101606755905092915050565b600054610100900460ff16806134405750613440613fdc565b8061344e575060005460ff16155b61346a5760405162461bcd60e51b815260040161091c90615a19565b600054610100900460ff16158015613495576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015612b72576000805461ff00191690555050565b613501612330565b61351d5760405162461bcd60e51b815260040161091c90615a09565b600082815260686020526040902054600160a01b900460ff161561354057600080fd5b6001600160a01b03811661355357600080fd5b6040805180820182526001600160a01b03808416825260016020808401918252600087815260689091528490209251835491511515600160a01b0260ff60a01b19919093166001600160a01b03199092169190911716179055517f662cc3305b9b4ea3a5fd06717cdaece79b6ac0a7734fd44eabe0f37951dc587c906135dc9084908490615605565b60405180910390a15050565b6135f0612330565b61360c5760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b03811661361f57600080fd5b60a380546001600160a01b0319166001600160a01b0392909216919091179055565b613649612330565b6136655760405162461bcd60e51b815260040161091c90615a09565b600090815260a260205260409020805460ff19166001179055565b613688612330565b6136a45760405162461bcd60e51b815260040161091c90615a09565b6001600160a01b0381166136b757600080fd5b60a580546001600160a01b0319166001600160a01b0392909216919091179055565b606d602052600090815260409020805460019091015482565b6136fa612330565b6137165760405162461bcd60e51b815260040161091c90615a09565b61098081613fe2565b613727612330565b6137435760405162461bcd60e51b815260040161091c90615a09565b600090815260a260205260409020805460ff19169055565b60a3546001600160a01b031681565b613772612330565b61378e5760405162461bcd60e51b815260040161091c90615a09565b6000828152606e6020526040908190205490517f5793ae75ad4ae6b7dc6492360b49ac802ad3f243d386419158aa87761383df5a916137d191859190859061575f565b60405180910390a16000918252606e602052604090912055565b600081815260a2602052604081205460ff161561381a5760405162461bcd60e51b815260040161091c90615b39565b6000604051613828906153a9565b60405190819003812061383f91859060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d909352912054909150156138b4576000818152606d60205260408082208281556001018290555184917ff61bf087105cbbc9ce12db206c8223c224de07a98a51c1d606ed90322480b48b91a260019150506138ba565b60009150505b919050565b600084815260a2602052604090205460ff16156138ee5760405162461bcd60e51b815260040161091c90615a89565b606c546040805163059aeceb60e31b815290516060926001600160a01b031691632cd76758916004808301926000929190829003018186803b15801561393357600080fd5b505afa158015613947573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261396f919081019061440c565b90506060815160405190808252806020026020018201604052801561399e578160200160208202803883390190505b50905060005b8251811015613a07576066600088815260200190815260200160002060020160008483815181106139d157fe5b60200260200101518152602001908152602001600020548282815181106139f457fe5b60209081029190910101526001016139a4565b506001600160a01b03841615613a7f57606c54604051624d4a1f60e91b81526001600160a01b0390911690639a943e0090613a4c908890889087908790600401615471565b600060405180830381600087803b158015613a6657600080fd5b505af1158015613a7a573d6000803e3d6000fd5b505050505b606c546040516304855c6b60e31b81526001600160a01b039091169063242ae35890613ab5908890879087908790600401615471565b600060405180830381600087803b158015613acf57600080fd5b505af1158015613ae3573d6000803e3d6000fd5b5050506000878152606660205260409081902060010180546001600160a01b0319166001600160a01b038716179055517f63c996749362048abd5162a384284583851200b5c4cb4ae2fa1ebb09815289059150611d439088908690615605565b60008282018381101561257b5760405162461bcd60e51b815260040161091c906158a9565b600061257b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613fb0565b81613bb4576111ad565b6000838152606860205260409020546069546001600160a01b039182169116811415613c435760695460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390613c0c90859087906004016155bc565b600060405180830381600087803b158015613c2657600080fd5b505af1158015613c3a573d6000803e3d6000fd5b50505050613cbe565b606a546001600160a01b0382811691161415613cbe57606a5460405163e1032b8360e01b81526001600160a01b039091169063e1032b8390613c8b90859087906004016155bc565b600060405180830381600087803b158015613ca557600080fd5b505af1158015613cb9573d6000803e3d6000fd5b505050505b60405163a9059cbb60e01b81526001600160a01b0382169063a9059cbb90613cec908590879060040161556c565b602060405180830381600087803b158015613d0657600080fd5b505af1158015613d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613d3e9190810190614632565b6113035760405162461bcd60e51b815260040161091c90615859565b600082815260a2602052604081205460ff1615613d895760405162461bcd60e51b815260040161091c90615ba9565b6000604051613d97906153a9565b604051908190038120613dae91869060200161536c565b60408051601f1981840301815291815281516020928301206000818152606d9093529120549091508015613df45760405162461bcd60e51b815260040161091c90615869565b6000613e2f606e6000604051613e09906153a9565b604051809103902081526020019081526020016000205443613b4390919063ffffffff16565b6040805180820182528281526001600160a01b039790971660208089019182526000968752606d90529420955186559251600190950194909455509392505050565b81613e7b576111ad565b600083815260686020526040908190205490516323b872dd60e01b81526001600160a01b039091169081906323b872dd90613ebe9085903090889060040161547f565b602060405180830381600087803b158015613ed857600080fd5b505af1158015613eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f109190810190614632565b613f2c5760405162461bcd60e51b815260040161091c906159f9565b6069546001600160a01b0382811691161415611303576069546040516322d0459b60e21b81526001600160a01b0390911690638b41166c90613f7490859087906004016155bc565b600060405180830381600087803b158015613f8e57600080fd5b505af1158015613fa2573d6000803e3d6000fd5b5050505050505050565b3390565b60008184841115613fd45760405162461bcd60e51b815260040161091c9190615788565b505050900390565b303b1590565b6001600160a01b0381166140085760405162461bcd60e51b815260040161091c90615849565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b604080516060810182526000808252602082018190529181019190915290565b80356125a081615cf7565b60008083601f8401126140a157600080fd5b5081356001600160401b038111156140b857600080fd5b6020830191508360208202830111156140d057600080fd5b9250929050565b600082601f8301126140e857600080fd5b81356140fb6140f682615c2f565b615c09565b9150818183526020840193506020810190508385602084028201111561412057600080fd5b60005b8381101561414c57816141368882614084565b8452506020928301929190910190600101614123565b5050505092915050565b600082601f83011261416757600080fd5b81356141756140f682615c2f565b9150818183526020840193506020810190508385602084028201111561419a57600080fd5b60005b8381101561414c57816141b088826142b1565b845250602092830192919091019060010161419d565b600082601f8301126141d757600080fd5b81516141e56140f682615c2f565b9150818183526020840193506020810190508385602084028201111561420a57600080fd5b60005b8381101561414c578161422088826142bc565b845250602092830192919091019060010161420d565b600082601f83011261424757600080fd5b81356142556140f682615c2f565b9150818183526020840193506020810190508385602084028201111561427a57600080fd5b60005b8381101561414c578161429088826142b1565b845250602092830192919091019060010161427d565b80516125a081615d0b565b80356125a081615d14565b80516125a081615d14565b6000602082840312156142d957600080fd5b60006142e58484614084565b949350505050565b60008060008060006080868803121561430557600080fd5b60006143118888614084565b95505060208601356001600160401b0381111561432d57600080fd5b6143398882890161408f565b9450945050604061434c888289016142b1565b925050606061435d888289016142b1565b9150509295509295909350565b6000806000806040858703121561438057600080fd5b84356001600160401b0381111561439657600080fd5b6143a28782880161408f565b945094505060208501356001600160401b038111156143c057600080fd5b6143cc8782880161408f565b95989497509550505050565b6000602082840312156143ea57600080fd5b81356001600160401b0381111561440057600080fd5b6142e584828501614156565b60006020828403121561441e57600080fd5b81516001600160401b0381111561443457600080fd5b6142e5848285016141c6565b6000806040838503121561445357600080fd5b82356001600160401b0381111561446957600080fd5b61447585828601614156565b92505060208301356001600160401b0381111561449157600080fd5b61449d858286016140d7565b9150509250929050565b60008060008060008060c087890312156144c057600080fd5b86356001600160401b038111156144d657600080fd5b6144e289828a01614156565b96505060208701356001600160401b038111156144fe57600080fd5b61450a89828a016140d7565b955050604061451b89828a01614084565b945050606061452c89828a01614084565b935050608061453d89828a01614084565b92505060a061454e89828a016142b1565b9150509295509295509295565b6000806040838503121561456e57600080fd5b82356001600160401b0381111561458457600080fd5b61459085828601614156565b92505060208301356001600160401b038111156145ac57600080fd5b61449d85828601614236565b6000806000606084860312156145cd57600080fd5b83356001600160401b038111156145e357600080fd5b6145ef86828701614156565b93505060208401356001600160401b0381111561460b57600080fd5b61461786828701614236565b925050604061462886828701614084565b9150509250925092565b60006020828403121561464457600080fd5b60006142e584846142a6565b60006020828403121561466257600080fd5b60006142e584846142b1565b6000806040838503121561468157600080fd5b600061468d85856142b1565b925050602061449d85828601614084565b6000806000806000606086880312156146b657600080fd5b60006146c288886142b1565b95505060208601356001600160401b038111156146de57600080fd5b6146ea8882890161408f565b945094505060408601356001600160401b0381111561470857600080fd5b6147148882890161408f565b92509250509295509295909350565b6000806040838503121561473657600080fd5b600061474285856142b1565b925050602061449d858286016142b1565b60008060006060848603121561476857600080fd5b600061477486866142b1565b9350506020614785868287016142b1565b9250506040614628868287016142b1565b6000602082840312156147a857600080fd5b60006142e584846142bc565b60006147c083836147e3565b505060200190565b60006147c08383614923565b6147dd81615c98565b82525050565b6147dd81615c62565b60006147f782615c55565b6148018185615c59565b935061480c83615c4f565b8060005b8381101561483a57815161482488826147b4565b975061482f83615c4f565b925050600101614810565b509495945050505050565b60006148518385615c59565b93506001600160fb1b0383111561486757600080fd5b602083029250614878838584615cb5565b50500190565b600061488982615c55565b6148938185615c59565b935061489e83615c4f565b8060005b8381101561483a5781516148b688826147c8565b97506148c183615c4f565b9250506001016148a2565b60006148d782615c55565b6148e18185615c59565b93506148ec83615c4f565b8060005b8381101561483a57815161490488826147c8565b975061490f83615c4f565b9250506001016148f0565b6147dd81615c6d565b6147dd81615c72565b6147dd61493882615c72565b615c72565b600061494882615c55565b6149528185615c59565b9350614962818560208601615cc1565b61496b81615ced565b9093019392505050565b600061498082615c55565b61498a81856138ba565b935061499a818560208601615cc1565b9290920192915050565b6147dd81615c9f565b6147dd81615caa565b60006149c3600383615c59565b6222299960e91b815260200192915050565b60006149e2600483615c59565b632929a91960e11b815260200192915050565b6000614a02600383615c59565b6243553160e81b815260200192915050565b6000614a21600383615c59565b6255533160e81b815260200192915050565b6000614a40600383615c59565b6229a99960e91b815260200192915050565b6000614a5f600383615c59565b6214d4cd60ea1b815260200192915050565b6000614a7e600483615c59565b63544c323160e01b815260200192915050565b6000614a9e600383615c59565b6220a99960e91b815260200192915050565b6000614abd600383615c59565b6204453360ec1b815260200192915050565b6000614adc600383615c59565b6204352360ec1b815260200192915050565b6000614afb600383615c59565b6243523160e81b815260200192915050565b6000614b1a602683615c59565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000614b62600383615c59565b6255543160e81b815260200192915050565b6000614b81600583615c59565b64495253523160d81b815260200192915050565b6000614ba2600483615c59565b630544c32360e41b815260200192915050565b6000614bc2600383615c59565b6243533360e81b815260200192915050565b6000614be1600983615c59565b68125b989bde10d85b1b60ba1b815260200192915050565b6000614c06601b83615c59565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000614c3f600383615c59565b6229299960e91b815260200192915050565b6000614c5e600383615c59565b6244533360e81b815260200192915050565b6000614c7d600383615c59565b6241533160e81b815260200192915050565b6000614c9c600383615c59565b6204153360ec1b815260200192915050565b6000614cbb600483615c59565b630525352360e41b815260200192915050565b6000614cdb600483615c59565b632a26191960e11b815260200192915050565b6000614cfb600383615c59565b621054cd60ea1b815260200192915050565b6000614d1a600383615c59565b6253533360e81b815260200192915050565b6000614d39600483615c59565b635753433160e01b815260200192915050565b6000614d59600483615c59565b632ba9a19960e11b815260200192915050565b6000614d79600683615c59565b651511d0d85b1b60d21b815260200192915050565b6000614d9b600383615c59565b6221a91960e91b815260200192915050565b6000614dba601c83615c59565b7f534d3a52535273202d20496e76616c696420696e707574206461746100000000815260200192915050565b6000614df3600383615c59565b6243533160e81b815260200192915050565b6000614e12600383615c59565b6205753360ec1b815260200192915050565b6000614e31600483615c59565b635253523360e01b815260200192915050565b6000614e51600383615c59565b621114cd60ea1b815260200192915050565b6000614e70600383615c59565b622ba99960e91b815260200192915050565b6000614e8f600483615c59565b635753433360e01b815260200192915050565b6000614eaf600383615c59565b6243533560e81b815260200192915050565b6000614ece600383615c59565b624c543160e81b815260200192915050565b6000614eed602083615c59565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000614f266005836138ba565b64135413d39160da1b815260050192915050565b6000614f47602e83615c59565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626581526d195b881a5b9a5d1a585b1a5e995960921b602082015260400192915050565b6000614f97600383615c59565b6243553360e81b815260200192915050565b6000614fb6600483615c59565b63544c323360e01b815260200192915050565b6000614fd6600383615c59565b624d533160e81b815260200192915050565b6000614ff5600483615c59565b635753433560e01b815260200192915050565b6000615015600383615c59565b6244533160e81b815260200192915050565b6000615034600383615c59565b6257533160e81b815260200192915050565b6000615053600483615c59565b6305f5253360e41b815260200192915050565b6000615073600383615c59565b622aa99960e91b815260200192915050565b6000615092600383615c59565b6205353360ec1b815260200192915050565b60006150b1600383615c59565b6252533160e81b815260200192915050565b60006150d0600483615c59565b6326a9981960e11b815260200192915050565b60006150f0600383615c59565b6257533360e81b815260200192915050565b600061510f600383615c59565b6205553360ec1b815260200192915050565b600061512e600383615c59565b6221a99960e91b815260200192915050565b600061514d600383615c59565b6253533160e81b815260200192915050565b600061516c600383615c59565b624d533560e81b815260200192915050565b600061518b6011836138ba565b70524544454c45474154494f4e5f4c4f434b60781b815260110192915050565b60006151b8600383615c59565b6253533560e81b815260200192915050565b60006151d7600483615c59565b6305f4352360e41b815260200192915050565b60006151f7600383615c59565b624d533360e81b815260200192915050565b6000615216600483615c59565b635253523160e01b815260200192915050565b6000615236600383615c59565b6204355360ec1b815260200192915050565b6000615255600383615c59565b6205253360ec1b815260200192915050565b6000615274600383615c59565b6210d4cd60ea1b815260200192915050565b6000615293600483615c59565b634d53303160e01b815260200192915050565b60006152b3600583615c59565b6405f525352360dc1b815260200192915050565b60006152d4600483615c59565b6315d4d0cd60e21b815260200192915050565b60006152f4600383615c59565b6221aa9960e91b815260200192915050565b6000615313600383615c59565b6226a99960e91b815260200192915050565b6000615332600383615c59565b621354cd60ea1b815260200192915050565b6000615351600383615c59565b6241533360e81b815260200192915050565b6147dd81615c87565b6000615378828561492c565b602082019150615388828461492c565b5060200192915050565b600061257b8284614975565b60006125a082614f19565b60006125a08261517e565b60006153c0828461492c565b50602001919050565b602081016125a082846147e3565b608081016153e582896147d4565b6153f260208301886147e3565b8181036040830152615405818688614845565b9050818103606083015261541a818486614845565b98975050505050505050565b6080810161543482876147d4565b61544160208301866147e3565b8181036040830152615453818561487e565b9050818103606083015261546781846148cc565b9695505050505050565b6080810161543482876147e3565b6060810161548d82866147e3565b61549a60208301856147e3565b6142e56040830184614923565b608081016154b582876147e3565b81810360208301526154c7818661487e565b905081810360408301526154db81856148cc565b9050818103606083015261546781846147ec565b61010081016154fe828b6147e3565b61550b602083018a6149ad565b6155186040830189614923565b61552560608301886147e3565b61553260808301876147e3565b61553f60a0830186614923565b61554c60c0830185614923565b81810360e083015261555e818461493d565b9a9950505050505050505050565b6040810161557a82856147e3565b61257b6020830184614923565b6080810161559582876147e3565b6155a26020830186614923565b6155af6040830185614923565b610f196060830184614923565b604081016155ca82856147e3565b61257b6020830184615363565b602080825281016142e5818486614845565b602081016125a0828461491a565b602081016125a08284614923565b604081016156138285614923565b61257b60208301846147e3565b6080810161562e8287614923565b61563b60208301866147e3565b6155af60408301856147e3565b608081016153e58289614923565b6060810161548d8286614923565b606081016156728288614923565b8181036020830152615685818688614845565b9050818103604083015261569a818486614845565b979650505050505050565b606081016156b38286614923565b81810360208301526156c5818561487e565b90508181036040830152610f1981846148cc565b6040810161557a8285614923565b60a081016156f5828a614923565b6157026020830189614923565b61570f6040830188614923565b8181036060830152615722818688614845565b90508181036080830152615737818486614845565b9998505050505050505050565b608081016157528287614923565b6154416020830186614923565b6060810161576d8286614923565b61549a6020830185614923565b602081016125a082846149a4565b6020808252810161257b818461493d565b602080825281016125a0816149b6565b602080825281016125a0816149d5565b602080825281016125a0816149f5565b602080825281016125a081614a14565b602080825281016125a081614a33565b602080825281016125a081614a52565b602080825281016125a081614a71565b602080825281016125a081614a91565b602080825281016125a081614ab0565b602080825281016125a081614acf565b602080825281016125a081614aee565b602080825281016125a081614b0d565b602080825281016125a081614b55565b602080825281016125a081614b74565b602080825281016125a081614b95565b602080825281016125a081614bb5565b602080825281016125a081614bd4565b602080825281016125a081614bf9565b602080825281016125a081614c32565b602080825281016125a081614c51565b602080825281016125a081614c70565b602080825281016125a081614c8f565b602080825281016125a081614cae565b602080825281016125a081614cce565b602080825281016125a081614cee565b602080825281016125a081614d0d565b602080825281016125a081614d2c565b602080825281016125a081614d4c565b602080825281016125a081614d6c565b602080825281016125a081614d8e565b602080825281016125a081614dad565b602080825281016125a081614de6565b602080825281016125a081614e05565b602080825281016125a081614e24565b602080825281016125a081614e44565b602080825281016125a081614e63565b602080825281016125a081614e82565b602080825281016125a081614ea2565b602080825281016125a081614ec1565b602080825281016125a081614ee0565b602080825281016125a081614f3a565b602080825281016125a081614f8a565b602080825281016125a081614fa9565b602080825281016125a081614fc9565b602080825281016125a081614fe8565b602080825281016125a081615008565b602080825281016125a081615027565b602080825281016125a081615046565b602080825281016125a081615066565b602080825281016125a081615085565b602080825281016125a0816150a4565b602080825281016125a0816150c3565b602080825281016125a0816150e3565b602080825281016125a081615102565b602080825281016125a081615121565b602080825281016125a081615140565b602080825281016125a08161515f565b602080825281016125a0816151ab565b602080825281016125a0816151ca565b602080825281016125a0816151ea565b602080825281016125a081615209565b602080825281016125a081615229565b602080825281016125a081615248565b602080825281016125a081615267565b602080825281016125a081615286565b602080825281016125a0816152a6565b602080825281016125a0816152c7565b602080825281016125a0816152e7565b602080825281016125a081615306565b602080825281016125a081615325565b602080825281016125a081615344565b6040518181016001600160401b0381118282101715615c2757600080fd5b604052919050565b60006001600160401b03821115615c4557600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b60006125a082615c75565b151590565b90565b6001600160a01b031690565b60ff1690565b6bffffffffffffffffffffffff1690565b60006125a0825b60006125a082615c62565b60006125a082615c81565b82818337506000910152565b60005b83811015615cdc578181015183820152602001615cc4565b838111156113035750506000910152565b601f01601f191690565b615d0081615c62565b811461098057600080fd5b615d0081615c6d565b615d0081615c7256fea365627a7a72315820c2078afaddac6695852aa138a2cd72d0c16e4b8d432fc137733eb0827c2af50f6c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode Sourcemap
48594:28999:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66161:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66161:281:0;;;;;;;;:::i;:::-;;73168:3361;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;54103:318;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54103:318:0;;;;;;;;:::i;49105:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49105:25:0;;;:::i;49991:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49991:48:0;;;;;;;;:::i;:::-;;;;;;;;61122:731;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;61122:731:0;;;;;;;;:::i;60778:336::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;60778:336:0;;;;;;;;:::i;68169:851::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;68169:851:0;;;;;;;;:::i;49936:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49936:48:0;;;;;;;;:::i;58346:1113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58346:1113:0;;;;;;;;:::i;49326:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49326:41:0;;;:::i;:::-;;;;;;;;69028:1137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;69028:1137:0;;;;;;;;:::i;52914:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52914:261:0;;;;;;;;:::i;49523:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49523:47:0;;;;;;;;:::i;49900:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49900:29:0;;;:::i;55277:250::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55277:250:0;;;;;;;;:::i;66887:1086::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66887:1086:0;;;;;;;;:::i;49660:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49660:35:0;;;:::i;49789:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49789:46:0;;;;;;;;:::i;:::-;;;;;;;;59467:678;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59467:678:0;;;;;;;;:::i;38611:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38611:140:0;;;:::i;52657:249::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52657:249:0;;;;;;;;:::i;57078:1260::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57078:1260:0;;;;;;;;:::i;53360:189::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53360:189:0;;;;;;;;:::i;53779:316::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53779:316:0;;;;;;;;:::i;37798:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37798:79:0;;;:::i;38164:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38164:94:0;;;:::i;54696:231::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54696:231:0;;;;;;;;:::i;76537:1053::-;;;;;;;;;:::i;73002:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;73002:158:0;;;;;;;;:::i;49013:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49013:40:0;;;;;;;;:::i;:::-;;;;;;;;;;70173:1241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;70173:1241:0;;;;;;;;:::i;62720:1532::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;62720:1532:0;;;;;;;;:::i;49869:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49869:24:0;;;:::i;65973:180::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;65973:180:0;;;;;;;;:::i;67981:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67981:180:0;;;;;;;;:::i;51602:801::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;51602:801:0;;;;;;;;:::i;64260:1705::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;64260:1705:0;;;;;;;;:::i;55535:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55535:272:0;;;;;;;;:::i;55815:1255::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55815:1255:0;;;;;;;;:::i;37572:145::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37572:145:0;;;;;;;;:::i;54935:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54935:334:0;;;;;;;;:::i;53183:169::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53183:169:0;;;;;;;;:::i;54429:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54429:124:0;;;;;;;;:::i;53557:214::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53557:214:0;;;;;;;;:::i;49479:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49479:37:0;;;;;;;;:::i;:::-;;;;;;;;;38906:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38906:109:0;;;;;;;;:::i;54561:127::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54561:127:0;;;;;;;;:::i;49842:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49842:20:0;;;:::i;52411:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52411:238:0;;;;;;;;:::i;66161:281::-;66233:24;;;;:14;:24;;;;;;;;:33;66225:49;;;;-1:-1:-1;;;66225:49:0;;;;;;;;;;;;;;;;;66323:17;;;;:7;:17;;;;;:24;-1:-1:-1;;;;;66323:24:0;66309:10;:38;66287:91;;;;-1:-1:-1;;;66287:91:0;;;;;;;;;66397:29;66417:8;66397:19;:29::i;:::-;66389:45;;;;-1:-1:-1;;;66389:45:0;;;;;;;;;66161:281;:::o;73168:3361::-;73344:7;73364:24;73391:16;;;;;;;;;-1:-1:-1;;;;;73391:16:0;-1:-1:-1;;;;;73391:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73391:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73391:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;73391:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;73391:35:0;;;;;;;;;73364:62;;73437:25;73496:9;;:16;;73479:7;:14;:33;73465:48;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;73465:48:0;;73437:76;;73524:35;73576:9;;:16;;73562:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;73562:31:0;-1:-1:-1;73524:69:0;-1:-1:-1;73610:11:0;73606:1766;73627:22;;;73606:1766;;;73673:16;73692:9;;73702:3;73692:14;;;;;;;;;;;;;;;;73721:15;73739:17;;;:7;:17;;;;;;:24;;;73806:34;;;73880:31;;;;;73988:14;:24;;;;;;;;73692:14;;-1:-1:-1;;;;;;73739:24:0;;;;73806:34;;;-1:-1:-1;73880:31:0;73988:24;;:33;73980:50;;;;-1:-1:-1;;;73980:50:0;;;;;;;;;74045:24;;;;:14;:24;;;;;:31;;-1:-1:-1;;74045:31:0;74072:4;74045:31;;;-1:-1:-1;;;;;74149:21:0;;74160:10;74149:21;74141:38;;;;-1:-1:-1;;;74141:38:0;;;;;;;;;-1:-1:-1;;;;;74246:31:0;;74238:48;;;;-1:-1:-1;;;74238:48:0;;;;;;;;;74377:12;74360:14;:29;74352:46;;;;-1:-1:-1;;;74352:46:0;;;;;;;;;74441:17;74415:18;74434:3;74415:23;;;;;;;;-1:-1:-1;;;;;74415:43:0;;;:23;;;;;;;;;;;:43;74479:9;74475:886;74496:7;:14;74492:1;:18;74475:886;;;74536:15;74554:7;:17;74562:8;74554:17;;;;;;;;;;;:24;;:36;74579:7;74587:1;74579:10;;;;;;;;;;;;;;74554:36;;;;;;;;;;;;74536:54;;74612:7;74623:1;74612:12;74609:68;;;74649:8;;;74609:68;74726:7;74697:13;:25;74711:7;74719:1;74711:10;;;;;;;;;;;;;;74697:25;;;;;;;;;;;;:36;;;;;;;;;;;74808:20;74831:14;:26;74846:7;74854:1;74846:10;;;;;;;;;;;;;;;;;;;74831:26;;;;;;;;;;-1:-1:-1;74831:26:0;:31;74908:5;;-1:-1:-1;;;;;74831:31:0;;;;-1:-1:-1;74908:5:0;74884:30;;74881:400;;;74939:5;;:115;;-1:-1:-1;;;74939:115:0;;-1:-1:-1;;;;;74939:5:0;;;;:16;;:115;;74982:7;;75023;;74939:115;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74939:115:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74939:115:0;;;;74881:400;;;75107:9;;-1:-1:-1;;;;;75083:34:0;;;75107:9;;75083:34;75080:201;;;75142:9;;:119;;-1:-1:-1;;;75142:119:0;;-1:-1:-1;;;;;75142:9:0;;;;:20;;:119;;75189:7;;75230;;75142:119;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75142:119:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75142:119:0;;;;75080:201;75338:7;75301:8;75333:1;75316:7;:14;75310:3;:20;:24;75301:34;;;;;;;;;;;;;:44;;;;;74475:886;;;74512:3;;74475:886;;;-1:-1:-1;;73651:5:0;;;;;-1:-1:-1;73606:1766:0;;-1:-1:-1;;73606:1766:0;;;75413:18;75538:3;75543:7;75552:8;75562:18;75434:157;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;75434:157:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;75822:9:0;;75627:575;;75434:157;;-1:-1:-1;75604:20:0;;75627:575;;-1:-1:-1;;;;;75822:9:0;;-1:-1:-1;;76008:22:0;;;75996:9;:34;;76101:3;;;;76008:7;;76018:12;;75434:157;;75627:575;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;75627:575:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;76258:5:0;;:36;;75627:575;;-1:-1:-1;;;76230:24:0;;-1:-1:-1;;;;;76258:5:0;;76275:9;;76258:36;;75627:575;;76258:36;;;;;;;;;;;;;;;;;;;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;;76215:79:0;;;;76313:7;76305:29;;;;-1:-1:-1;;;76305:29:0;;;;;;;;;76346:17;76378:11;76367:34;;;;;;;;;;;;;;76345:56;;76448:9;76419:73;76472:9;;76419:73;;;;;;;;;;;;;;;;76512:9;-1:-1:-1;;;;;;;;73168:3361:0;;;;;;;;:::o;54103:318::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;54251:36;;;54243:45;;;;;;54303:9;54299:115;54318:20;;;54299:115;;;54390:9;;54400:1;54390:12;;;;;;;;;;;;;;;;;;;;;;54360:13;:27;54374:9;;54384:1;54374:12;;;;;;;;;;;;;;;;54360:27;;-1:-1:-1;54360:27:0;;;;;;;;-1:-1:-1;54360:27:0;:42;;-1:-1:-1;;;;;;54360:42:0;-1:-1:-1;;;;;54360:42:0;;;;;;;;;;-1:-1:-1;54340:3:0;54299:115;;;;54103:318;;;;:::o;49105:25::-;;;;:::o;49991:48::-;;;;;;;;;;;;-1:-1:-1;;;;;49991:48:0;;:::o;61122:731::-;61191:24;;;;:14;:24;;;;;;;;:33;61183:49;;;;-1:-1:-1;;;61183:49:0;;;;;;;;;61245:19;;:::i;:::-;-1:-1:-1;61267:17:0;;;;:7;:17;;;;;;;;;61245:39;;;;;;;;;-1:-1:-1;;;;;61245:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61295:90;;;;-1:-1:-1;;;61295:90:0;;;;;;;;;61396:15;49623:30;;;;;;;;;;;;;;;61424:54;;61469:8;;61424:54;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;61424:54:0;;;61414:65;;49:4:-1;61414:65:0;;;;61490:20;61513:14;;;:5;:14;;;;;:26;61414:65;;-1:-1:-1;61572:17:0;;;;;:49;;;61609:12;61593;:28;;61572:49;61550:102;;;;-1:-1:-1;;;61550:102:0;;;;;;;;;61663:23;61697:14;;;:5;:14;;;;;;;;:21;;;61757:13;;61772:23;;;;61697:21;;61730:83;;61747:8;;61757:13;61697:21;61730:16;:83::i;:::-;-1:-1:-1;;61831:14:0;;;;:5;:14;;;;;61824:21;;;;;;-1:-1:-1;;61122:731:0:o;60778:336::-;60918:12;:19;60898:9;:16;:39;60890:80;;;;-1:-1:-1;;;60890:80:0;;;;;;;;;60985:9;60981:126;61002:9;:16;60998:1;:20;60981:126;;;61040:55;61065:9;61075:1;61065:12;;;;;;;;;;;;;;61079;61092:1;61079:15;;;;;;;;;;;;;;61040:24;:55::i;:::-;61020:3;;60981:126;;;;60778:336;;:::o;68169:851::-;68268:24;;;;:14;:24;;;;;;;;:33;68260:49;;;;-1:-1:-1;;;68260:49:0;;;;;;;;;68322:15;68340:17;;;:7;:17;;;;;:24;;68400:31;;;;;-1:-1:-1;;;;;68340:24:0;;;;68475:10;68464:21;;68442:74;;;;-1:-1:-1;;;68442:74:0;;;;;;;;;68566:12;68549:14;:29;68527:82;;;;-1:-1:-1;;;68527:82:0;;;;;;;;;68659:144;68762:12;:40;49623:30;;;;;;;;;;;;;;68762:40;;;;;;;;;;;;68659:68;68706:20;;68659:12;:46;;:68;;;;:::i;:::-;:102;:144;:102;:144;:::i;:::-;68642:14;:161;68620:214;;;;-1:-1:-1;;;68620:214:0;;;;;;;;;68852:17;;;;:7;:17;;;;;;:31;;68845:38;;;;68899:36;;;;;68860:8;;68899:36;;;;;;;;;;68946:66;68963:8;68973:7;68990:1;68994:17;68946:16;:66::i;:::-;68169:851;;;;:::o;49936:48::-;;;;;;;;;;;;;:::o;58346:1113::-;58440:24;;;;:14;:24;;;;;;;;:33;58432:49;;;;-1:-1:-1;;;58432:49:0;;;;;;;;;58494:19;;:::i;:::-;-1:-1:-1;58516:17:0;;;;:7;:17;;;;;;;;;58494:39;;;;;;;;;-1:-1:-1;;;;;58494:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58583:10;58566:27;58544:80;;;;-1:-1:-1;;;58544:80:0;;;;;;;;;-1:-1:-1;;;;;58657:31:0;;58635:84;;;;-1:-1:-1;;;58635:84:0;;;;;;;;;58752:23;;;;-1:-1:-1;;;;;58752:37:0;;58730:90;;;;-1:-1:-1;;;58730:90:0;;;;;;;;;58877:12;58853:6;:20;;;:36;;58831:89;;;;-1:-1:-1;;;58831:89:0;;;;;;;;;58931:17;;;;:7;:17;;;;;;:34;;;:54;;-1:-1:-1;;;;;;58931:54:0;-1:-1:-1;;;;;58931:54:0;;;;;;;;;;59003:31;;;;58996:38;;;59072:16;;:35;;-1:-1:-1;;;59072:35:0;;;;59045:24;;59072:16;;;;;:33;;:35;;;;;58931:17;59072:35;;;;;:16;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;59072:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59072:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;59072:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;59072:35:0;;;;;;;;;59045:62;;59118:25;59160:7;:14;59146:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;59146:29:0;-1:-1:-1;59118:57:0;-1:-1:-1;59190:9:0;59186:121;59209:7;:14;59205:1;:18;59186:121;;;59259:7;:17;59267:8;59259:17;;;;;;;;;;;:24;;:36;59284:7;59292:1;59284:10;;;;;;;;;;;;;;59259:36;;;;;;;;;;;;59245:8;59254:1;59245:11;;;;;;;;;;;;;;;;;:50;59225:3;;59186:121;;;-1:-1:-1;59317:16:0;;:75;;-1:-1:-1;;;59317:75:0;;-1:-1:-1;;;;;59317:16:0;;;;:25;;:75;;59343:10;;59355:17;;59374:7;;59383:8;;59317:75;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59317:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59317:75:0;;;;59408:43;59423:8;59433:17;59408:43;;;;;;;;;;;;;;;;58346:1113;;;;;:::o;49326:41::-;;;-1:-1:-1;;;;;49326:41:0;;:::o;69028:1137::-;69097:24;;;;:14;:24;;;;;;;;:33;69089:49;;;;-1:-1:-1;;;69089:49:0;;;;;;;;;69151:19;;:::i;:::-;-1:-1:-1;69173:17:0;;;;:7;:17;;;;;;;;;69151:39;;;;;;;;;-1:-1:-1;;;;;69151:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69240:10;69223:27;69201:80;;;;-1:-1:-1;;;69201:80:0;;;;;;;;;69314:23;;;;-1:-1:-1;;;;;69314:37:0;;69292:90;;;;-1:-1:-1;;;69292:90:0;;;;;;;;;69439:12;69415:6;:20;;;:36;;69393:89;;;;-1:-1:-1;;;69393:89:0;;;;;;;;;69520:16;;:35;;;-1:-1:-1;;;69520:35:0;;;;69493:24;;-1:-1:-1;;;;;69520:16:0;;:33;;:35;;;;;:16;;:35;;;;;;;:16;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;69520:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69520:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;69520:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;69520:35:0;;;;;;;;;69493:62;;69566:25;69608:7;:14;69594:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;69594:29:0;-1:-1:-1;69566:57:0;-1:-1:-1;69638:9:0;69634:286;69655:7;:14;69651:1;:18;69634:286;;;69705:7;:17;69713:8;69705:17;;;;;;;;;;;:24;;:36;69730:7;69738:1;69730:10;;;;;;;;;;;;;;69705:36;;;;;;;;;;;;69691:8;69700:1;69691:11;;;;;;;;;;;;;:50;;;;;69759:8;69768:1;69759:11;;;;;;;;;;;;;;69774:1;69759:16;69756:29;;;69777:8;;69756:29;69807:7;:17;69815:8;69807:17;;;;;;;;;;;:24;;:36;69832:7;69840:1;69832:10;;;;;;;;;;;;;;69807:36;;;;;;;;;;;69800:43;;;69858:50;69872:7;69880:1;69872:10;;;;;;;;;;;;;;69884:8;69893:1;69884:11;;;;;;;;;;;;;;69897:10;69858:13;:50::i;:::-;69671:3;;69634:286;;;-1:-1:-1;69976:17:0;;;;:7;:17;;;;;;69969:31;;-1:-1:-1;;;;;;69969:31:0;;;70018;;70011:38;;;;70065:43;;;;;69984:8;;70090:7;;70099:8;;70065:43;;;;;;;;;;70146:10;-1:-1:-1;;;;;70124:33:0;;70136:8;70124:33;;;;;;;;;;;;;;;69028:1137;;;;:::o;52914:261::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;-1:-1:-1;;;;;53047:37:0;;53025:70;;;;;;53106:16;:61;;-1:-1:-1;;;;;;53106:61:0;-1:-1:-1;;;;;53106:61:0;;;;;;;;;;52914:261::o;49523:47::-;;;;;;;;;;;;;:::o;49900:29::-;;;-1:-1:-1;;;;;49900:29:0;;:::o;55277:250::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;55385:24;;;;:14;:24;;;;;:33;-1:-1:-1;;;55385:33:0;;;;55363:66;;;;;;55476:5;55440:24;;;:14;:24;;;;;;;:41;;-1:-1:-1;;;;55440:41:0;;;55497:22;;;;;55455:8;;55497:22;;;;;;;;;;55277:250;:::o;66887:1086::-;66956:24;;;;:14;:24;;;;;;;;:33;66948:49;;;;-1:-1:-1;;;66948:49:0;;;;;;;;;67010:19;;:::i;:::-;-1:-1:-1;67032:17:0;;;;:7;:17;;;;;;;;;67010:39;;;;;;;;;-1:-1:-1;;;;;67010:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67099:10;67082:27;67060:80;;;;-1:-1:-1;;;67060:80:0;;;;;;;;;67173:23;;;;-1:-1:-1;;;;;67173:37:0;67151:90;;;;-1:-1:-1;;;67151:90:0;;;;;;;;;67272:20;;67252:17;67332:27;:12;67272:20;67332:27;:16;:27;:::i;:::-;67370:17;;;;:7;:17;;;;;:31;;;:52;;;67440:34;;67433:41;;-1:-1:-1;;;;;;67433:41:0;;;67303:56;-1:-1:-1;67485:29:0;67378:8;67485:19;:29::i;:::-;-1:-1:-1;67552:16:0;;:35;;;-1:-1:-1;;;67552:35:0;;;;67525:24;;-1:-1:-1;;;;;67552:16:0;;:33;;:35;;;;;:16;;:35;;;;;;;:16;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;67552:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67552:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;67552:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;67552:35:0;;;;;;;;;67525:62;;67598:25;67640:7;:14;67626:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;67626:29:0;-1:-1:-1;67598:57:0;-1:-1:-1;67670:9:0;67666:119;67687:7;:14;67683:1;:18;67666:119;;;67737:7;:17;67745:8;67737:17;;;;;;;;;;;:24;;:36;67762:7;67770:1;67762:10;;;;;;;;;;;;;;67737:36;;;;;;;;;;;;67723:8;67732:1;67723:11;;;;;;;;;;;;;;;;;:50;67703:3;;67666:119;;;-1:-1:-1;67795:16:0;;67835:23;;;;67795:83;;-1:-1:-1;;;67795:83:0;;-1:-1:-1;;;;;67795:16:0;;;;:27;;:83;;67823:10;;67835:23;67860:7;;67869:8;;67795:83;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67795:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67795:83:0;;;;67894:71;67911:8;67921:6;:23;;;67946:18;67894:71;;;;;;;;;;;;;;;;;66887:1086;;;;;;:::o;49660:35::-;;;;:::o;49789:46::-;;;;;;;;;;;;;;;:::o;59467:678::-;59566:24;;;;:14;:24;;;;;;;;:33;59558:50;;;;-1:-1:-1;;;59558:50:0;;;;;;;;;59621:19;;:::i;:::-;-1:-1:-1;59643:17:0;;;;:7;:17;;;;;;;;;59621:39;;;;;;;;;-1:-1:-1;;;;;59621:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59710:10;59693:27;59671:81;;;;-1:-1:-1;;;59671:81:0;;;;;;;;;59785:23;;;;-1:-1:-1;;;;;59785:37:0;59763:91;;;;-1:-1:-1;;;59763:91:0;;;;;;;;;-1:-1:-1;;;;;59887:25:0;;59865:79;;;;-1:-1:-1;;;59865:79:0;;;;;;;;;59955:26;59984:48;60010:8;60020:11;59984:25;:48::i;:::-;59955:77;;60048:89;60070:8;60080:6;:23;;;60105:11;60118:18;60048:89;;;;;;;;;;;;;;;;;;59467:678;;;;:::o;38611:140::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;38694:6;;38673:40;;38710:1;;-1:-1:-1;;;;;38694:6:0;;38673:40;;38710:1;;38673:40;38724:6;:19;;-1:-1:-1;;;;;;38724:19:0;;;38611:140::o;52657:249::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;52776:5;;;52764:9;:17;;-1:-1:-1;;;;;52776:5:0;;;-1:-1:-1;;;;;;52764:17:0;;;;;;;52792:38;;;;;;;;;52859:18;;52846:52;;52859:18;;;;;;;;;;;;;52846:52;;52879:18;;52846:52;;57078:1260;57235:24;;;;:14;:24;;;;;;;;:33;57227:49;;;;-1:-1:-1;;;57227:49:0;;;;;;;;;57289:19;;:::i;:::-;-1:-1:-1;57311:17:0;;;;:7;:17;;;;;;;;;57289:39;;;;;;;;;-1:-1:-1;;;;;57289:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57378:10;57361:27;57339:80;;;;-1:-1:-1;;;57339:80:0;;;;;;;;;57476:12;57452:6;:20;;;:36;;57430:89;;;;-1:-1:-1;;;57430:89:0;;;;;;;;;57552:33;;;57530:86;;;;-1:-1:-1;;;57530:86:0;;;;;;;;;57644:23;;;;-1:-1:-1;;;;;57644:37:0;;57627:174;;57708:16;;57746:23;;;;57708:81;;-1:-1:-1;;;57708:81:0;;-1:-1:-1;;;;;57708:16:0;;;;:25;;:81;;57734:10;;57746:23;57771:7;;;;57780:8;;;;57708:81;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57708:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57708:81:0;;;;57627:174;57815:9;57811:436;57830:18;;;57811:436;;;57870:16;57889:7;;57897:1;57889:10;;;;;;;;;;;;;;;;57940:24;;;;:14;:24;;;;;;;:33;57889:10;;-1:-1:-1;;;;;57940:33:0;;;;57914:98;;;;-1:-1:-1;;;57914:98:0;;;;;;;;;58030:8;;58039:1;58030:11;;;;;;;;;;;;;58045:1;58030:16;58027:209;;58104:51;58143:8;;58152:1;58143:11;;;;;;;58104:17;;;;:7;58143:11;58104:17;;;;;;;:34;;;:24;;:34;;;;;;;58143:11;;;;;-1:-1:-1;58104:51:0;:38;:51;:::i;:::-;58067:17;;;;:7;:17;;;;;;;;:34;;;:24;;:34;;;;;:88;58174:46;58092:8;58196;;58205:1;58196:11;;;;;;;;;;;;;58209:10;58174:11;:46::i;:::-;-1:-1:-1;57850:3:0;;57811:436;;;;58264:66;58277:8;58287:6;:23;;;58312:7;;58321:8;;58264:66;;;;;;;;;;;;53360:189;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;-1:-1:-1;;;;;53473:24:0;;53451:57;;;;;;53519:9;:22;;-1:-1:-1;;;;;;53519:22:0;-1:-1:-1;;;;;53519:22:0;;;;;;;;;;53360:189::o;53779:316::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;53927:35;;;53919:44;;;;;;53978:9;53974:114;53993:20;;;53974:114;;;54065:8;;54074:1;54065:11;;;;;;;;;;;;;54035:13;:27;54049:9;;54059:1;54049:12;;;;;;;;;;;;;;;;54035:27;;-1:-1:-1;54035:27:0;;;;;;;;-1:-1:-1;54035:27:0;:41;54015:3;;53974:114;;37798:79;37863:6;;-1:-1:-1;;;;;37863:6:0;37798:79;:::o;38164:94::-;38244:6;;38204:4;;-1:-1:-1;;;;;38244:6:0;38228:12;:10;:12::i;:::-;-1:-1:-1;;;;;38228:22:0;;38221:29;;38164:94;:::o;54696:231::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;54809:20;:44;;;54869:50;;;;;;54832:21;;54869:50;;76537:1053;76689:7;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;76709:21;76733:24;;;:14;:24;;;;;;;;:29;76797:13;:23;;;;;;76849:13;:23;;;;;;;;76883:27;;;76949:89;;-1:-1:-1;;;76949:89:0;;-1:-1:-1;;;;;76733:29:0;;;;76797:23;;;;;76733:29;;76949:28;;:89;;76797:23;;76849;;76949:89;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76949:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;76949:89: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;76949:89:0;;;;;;;;;-1:-1:-1;77223:14:0;;77074:245;;77051:20;;77074:245;;-1:-1:-1;;;;;77223:14:0;;;;77252:7;;77274;;77296:12;;77074:245;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;77074:245:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;77405:44:0;77074:245;;-1:-1:-1;;;77377:24:0;;-1:-1:-1;;;;;77405:18:0;;;77430:9;;77405:44;;77074:245;;77405:44;;;;;;;;;;;;;;;;;;;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;;77362:87:0;;;;77468:7;77460:26;;;;-1:-1:-1;;;77460:26:0;;;;;;;;;77498:17;77530:11;77519:34;;;;;;;;;;;;;;77497:56;-1:-1:-1;;;;;;;;38067:1:0;76537:1053;;;;;:::o;73002:158::-;73091:7;73118:17;;;:7;:17;;;;;;;;:34;;;:24;;:34;;;;;;73002:158;;;;;:::o;49013:40::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49013:40:0;;;;;;;;;:::o;70173:1241::-;70333:24;;;;:14;:24;;;;;;;;:33;70325:49;;;;-1:-1:-1;;;70325:49:0;;;;;;;;;70387:19;;:::i;:::-;-1:-1:-1;70409:17:0;;;;:7;:17;;;;;;;;;70387:39;;;;;;;;;-1:-1:-1;;;;;70387:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70476:10;70459:27;70437:81;;;;-1:-1:-1;;;70437:81:0;;;;;;;;;70551:23;;;;-1:-1:-1;;;;;70551:37:0;;70529:91;;;;-1:-1:-1;;;70529:91:0;;;;;;;;;70677:12;70653:6;:20;;;:36;;70631:90;;;;-1:-1:-1;;;70631:90:0;;;;;;;;;70754:33;;;70732:87;;;;-1:-1:-1;;;70732:87:0;;;;;;;;;70834:9;70830:518;70847:18;;;70830:518;;;70887:16;70906:17;;;:7;:17;;;;;:24;;70887:16;70931:7;;70939:1;70931:10;;;;;;;;;;;;;70906:36;;;;;;;;;;;;70887:55;;70995:8;;71004:1;70995:11;;;;;;;;;;;;;70983:8;:23;;70957:89;;;;-1:-1:-1;;;70957:89:0;;;;;;;;;71076:8;;71085:1;71076:11;;;;;;;;;;;;;71064:8;:23;71061:211;;;71115:17;;;;:7;:17;;;;;:24;;;71140:7;;71148:1;71140:10;;;;;;;;;;;;;71115:36;;;;;;;;;;;71108:43;;;71061:211;;;71231:25;71244:8;;71253:1;71244:11;;;;;;;;;;;;;71231:8;:12;;:25;;;;:::i;:::-;71192:17;;;;:7;:17;;;;;:24;;;71217:7;;71225:1;71217:10;;;;;;;;;;;;;71192:36;;;;;;;;;;;:64;;;;71061:211;71286:50;71300:7;;71308:1;71300:10;;;;;;;;;;;;;71312:8;;71321:1;71312:11;;;;;;;;;;;;;71325:10;71286:13;:50::i;:::-;-1:-1:-1;70867:3:0;;70830:518;;;;71363:43;71378:8;71388:7;;71397:8;;71363:43;;;;;;;;;;;62720:1532;62843:24;;;;:14;:24;;;;;;;;:33;62835:49;;;;-1:-1:-1;;;62835:49:0;;;;;;;;;62897:19;;:::i;:::-;-1:-1:-1;62919:17:0;;;;:7;:17;;;;;;;;;62897:39;;;;;;;;;-1:-1:-1;;;;;62897:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62986:10;62969:27;62947:80;;;;-1:-1:-1;;;62947:80:0;;;;;;;;;63060:19;63038:72;;;;-1:-1:-1;;;63038:72:0;;;;;;;;;63143:33;;;63121:86;;;;-1:-1:-1;;;63121:86:0;;;;;;;;;63240:10;;63293:29;;63218:19;;63293:29;;63240:10;;63293:29;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;63293:29:0;;;63283:40;;49:4:-1;63283:40:0;;;;;-1:-1:-1;63338:14:0;63334:598;63356:23;;;63334:598;;;63406:16;63425:7;;63433:6;63425:15;;;;;;;;;;;;;63406:34;;63455:15;63473:8;;63482:6;63473:16;;;;;;;63530:20;;;;:7;63473:16;63530:20;;;;;;;:37;;;:27;;:37;;;;;;63473:16;;;;;;;;-1:-1:-1;;63530:42:0;63504:107;;;;-1:-1:-1;;;63504:107:0;;;;;;;;;63652:12;63626:77;;;;-1:-1:-1;;;63626:77:0;;;;;;;;;63755:103;;;;;;;;;;;-1:-1:-1;;;63755:103:0;;;;;;;;-1:-1:-1;63755:17:0;;;:7;:17;;;;;:34;;;:24;;:34;;;;;;;;:103;;63812:7;;63755:103;:38;:103;:::i;:::-;63718:17;;;;:7;:17;;;;;;;;:34;;;:24;;;;:34;;;;;:140;;;;63873:20;;;;;;;;;:37;;;:27;;;;:37;;;;;;:47;63381:8;;63334:598;;;-1:-1:-1;63942:20:0;;;;:7;:20;;;;;;;;;:40;;63972:10;-1:-1:-1;;;;;;63942:40:0;;;;;;64033:23;;;;-1:-1:-1;63993:37:0;;:63;;;;;-1:-1:-1;;;;;63993:63:0;;;;;;;64104:20;;;;64067:34;;;;:57;64140:65;;;;;63942:20;;64164:8;;64174:11;;64187:7;;;;64196:8;;;;64140:65;;;;;;;;;;-1:-1:-1;64243:1:0;64229:15;64216:10;:28;-1:-1:-1;;;;;;62720:1532:0:o;49869:24::-;;;-1:-1:-1;;;;;49869:24:0;;:::o;65973:180::-;66050:9;66046:100;66067:9;:16;66063:1;:20;66046:100;;;66105:29;66121:9;66131:1;66121:12;;;;;;;;;;;;;;66105:15;:29::i;:::-;66085:3;;66046:100;;;;65973:180;:::o;67981:::-;68058:9;68054:100;68075:9;:16;68071:1;:20;68054:100;;;68113:29;68129:9;68139:1;68129:12;;;;;;;;;;;;;;68113:15;:29::i;:::-;68093:3;;68054:100;;51602:801;1192:12;;;;;;;;:31;;;1208:15;:13;:15::i;:::-;1192:47;;;-1:-1:-1;1228:11:0;;;;1227:12;1192:47;1184:106;;;;-1:-1:-1;;;1184:106:0;;;;;;;;;1299:19;1322:12;;;;;;1321:13;1341:83;;;;1370:12;:19;;-1:-1:-1;;;;1370:19:0;;;;;1398:18;1385:4;1398:18;;;1341:83;51943:15;:22;51923:9;:16;:42;51901:75;;;;;;51991:9;51987:197;52008:9;:16;52004:1;:20;51987:197;;;52077:31;;;;;;;;52083:15;52099:1;52083:18;;;;;;;;;;;;;;-1:-1:-1;;;;;52077:31:0;;;;;52103:4;52077:31;;;;;52046:14;:28;52061:9;52071:1;52061:12;;;;;;;;;;;;;;;;;;;52046:28;;;;;;;;;;;-1:-1:-1;52046:28:0;:62;;;;;;;;;;;-1:-1:-1;;;52046:62:0;-1:-1:-1;;;;;;;;;52046:62:0;;;-1:-1:-1;;;;;;52046:62:0;;;;;;;;;;;;;;;;;52139:12;;52128:44;;52139:9;;52149:1;;52139:12;;;;;;;;;;;;52153:15;52169:1;52153:18;;;;;;;;;;;;;;52128:44;;;;;;;;;;;;;;;;52026:3;;51987:197;;;-1:-1:-1;52194:5:0;:38;;-1:-1:-1;;;;;52194:38:0;;;-1:-1:-1;;;;;;52194:38:0;;;;;;;52243:16;:62;;;;;;;;;;;;;;;52316:20;:44;;;52371:24;52388:6;52371:16;:24::i;:::-;1446:14;1442:57;;;1486:5;1471:20;;-1:-1:-1;;1471:20:0;;;1442:57;51602:801;;;;;;;:::o;64260:1705::-;64346:25;;;;:14;:25;;;;;;;;:34;64338:51;;;;-1:-1:-1;;;64338:51:0;;;;;;;;;64408:25;;;;:14;:25;;;;;;;;:34;64400:51;;;;-1:-1:-1;;;64400:51:0;;;;;;;;;64485:9;64472;:22;;64464:38;;;;-1:-1:-1;;;64464:38:0;;;;;;;;;64513:20;;:::i;:::-;-1:-1:-1;64536:18:0;;;;:7;:18;;;;;;;;;64513:41;;;;;;;;;-1:-1:-1;;;;;64513:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;64565:20;;:::i;:::-;-1:-1:-1;64588:18:0;;;;:7;:18;;;;;;;;;64565:41;;;;;;;;;-1:-1:-1;;;;;64565:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64639:14;;:28;64657:10;64639:28;:60;;;;-1:-1:-1;64671:14:0;;-1:-1:-1;;;;;64671:28:0;64689:10;64671:28;64639:60;64617:113;;;;-1:-1:-1;;;64617:113:0;;;;;;;;;64791:7;:24;;;-1:-1:-1;;;;;64763:52:0;:7;:24;;;-1:-1:-1;;;;;64763:52:0;;64741:105;;;;-1:-1:-1;;;64741:105:0;;;;;;;;;64905:12;64880:7;:21;;;:37;;64879:95;;;;;64961:12;64936:7;:21;;;:37;;64879:95;64857:148;;;;-1:-1:-1;;;64857:148:0;;;;;;;;;65016:16;49623:30;;;;;;;;;;;;;;;65045:55;;65090:9;;65045:55;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;65045:55:0;;;65035:66;;49:4:-1;65035:66:0;;;;65112:21;65136:15;;;:5;:15;;;;;;:27;65035:66;;-1:-1:-1;65136:27:0;;49623:30;;;;;;;;;;;;;65203:55;;65248:9;;65203:55;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;65203:55:0;;;65193:66;;49:4:-1;65193:66:0;;;;65270:21;65294:15;;;:5;:15;;;;;:27;65193:66;;-1:-1:-1;65354:18:0;;:40;;;;-1:-1:-1;65376:18:0;;65354:40;65332:93;;;;-1:-1:-1;;;65332:93:0;;;;;;;;;65463:16;;:35;;;-1:-1:-1;;;65463:35:0;;;;65436:24;;-1:-1:-1;;;;;65463:16:0;;:33;;:35;;;;;:16;;:35;;;;;;;:16;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;65463:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65463:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;65463:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;65463:35:0;;;;;;;;;65436:62;-1:-1:-1;65513:9:0;65509:362;65530:7;:14;65526:1;:18;65509:362;;;65566:15;65584:7;:18;65592:9;65584:18;;;;;;;;;;;:25;;:37;65610:7;65618:1;65610:10;;;;;;;;;;;;;;65584:37;;;;;;;;;;;;65566:55;;65639:7;65650:1;65639:12;65636:60;;;65672:8;;;65636:60;65717:7;:18;65725:9;65717:18;;;;;;;;;;;:25;;:37;65743:7;65751:1;65743:10;;;;;;;;;;;;;;65717:37;;;;;;;;;;;65710:44;;;65809:50;65851:7;65809;:18;65817:9;65809:18;;;;;;;;;;;:25;;:37;65835:7;65843:1;65835:10;;;;;;;;;;;;;;65809:37;;;;;;;;;;;;:41;;:50;;;;:::i;:::-;65769:7;:18;65777:9;65769:18;;;;;;;;;;;:25;;:37;65795:7;65803:1;65795:10;;;;;;;;;;;;;;65769:37;;;;;;;;;;;:90;;;;65509:362;;65546:3;;65509:362;;;-1:-1:-1;65888:18:0;;;;:7;:18;;;;;;65881:25;;-1:-1:-1;;;;;;65881:25:0;;;;;;;;;;;;;;;;;;;;;65922:35;;;;;65936:9;;65896;;65922:35;;;;;;;;;;64260:1705;;;;;;;;;:::o;55535:272::-;55699:15;55717:30;55729:7;55738:8;55717:11;:30::i;:::-;55699:48;;55758:41;55772:7;55781:17;55758:13;:41::i;55815:1255::-;55929:7;55989:8;:15;55971:7;:14;:33;55949:86;;;;-1:-1:-1;;;55949:86:0;;;;;;;;;56068:14;;56046:72;;;;-1:-1:-1;;;56046:72:0;;;;;;;;;56151:10;;56201:29;;56129:19;;56201:29;;56151:10;;56201:29;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;56201:29:0;;;56191:40;;49:4:-1;56191:40:0;;;;;-1:-1:-1;56246:14:0;56242:607;56273:7;:14;56264:6;:23;56242:607;;;56314:16;56333:7;56341:6;56333:15;;;;;;;;;;;;;;56314:34;;56363:15;56381:8;56390:6;56381:16;;;;;;;;;;;;;;;;;;;56438:24;;;;:14;:24;;;;;;;:33;56381:16;;-1:-1:-1;;;;56438:33:0;;;;56412:98;;;;-1:-1:-1;;;56412:98:0;;;;;;;;;56551:17;;;;:7;:17;;;;;;;;:34;;;:24;;:34;;;;;;:39;56525:104;;;;-1:-1:-1;;;56525:104:0;;;;;;;;;56670:12;56644:77;;;;-1:-1:-1;;;56644:77:0;;;;;;;;;56736:17;;;;:7;:17;;;;;;;;:34;;;:24;;:34;;;;;:44;;;56795:42;56761:8;56773:7;56826:10;56795:11;:42::i;:::-;-1:-1:-1;;56289:8:0;;56242:607;;;-1:-1:-1;56859:17:0;;;;:7;:17;;;;;;;:37;;-1:-1:-1;;;;;;56859:37:0;56886:10;56859:37;;;;;;56912:66;;;;;;56867:8;;56947:11;;56960:7;;56969:8;;56912:66;;;;;;;;;;57016:1;57002:15;;;56989:10;:28;57054:8;-1:-1:-1;55815:1255:0;;;;:::o;37572:145::-;1192:12;;;;;;;;:31;;;1208:15;:13;:15::i;:::-;1192:47;;;-1:-1:-1;1228:11:0;;;;1227:12;1192:47;1184:106;;;;-1:-1:-1;;;1184:106:0;;;;;;;;;1299:19;1322:12;;;;;;1321:13;1341:83;;;;1370:12;:19;;-1:-1:-1;;;;1370:19:0;;;;;1398:18;1385:4;1398:18;;;1341:83;37638:6;:15;;-1:-1:-1;;;;;;37638:15:0;-1:-1:-1;;;;;37638:15:0;;;;;;;;;;;37669:40;;37702:6;;;-1:-1:-1;;37669:40:0;;-1:-1:-1;;37669:40:0;1446:14;1442:57;;;1486:5;1471:20;;-1:-1:-1;;1471:20:0;;;37572:145;;:::o;54935:334::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;55070:24;;;;:14;:24;;;;;:33;-1:-1:-1;;;55070:33:0;;;;55069:34;55047:67;;;;;;-1:-1:-1;;;;;55133:22:0;;55125:31;;;;;;55194:21;;;;;;;;-1:-1:-1;;;;;55194:21:0;;;;;55210:4;55194:21;;;;;;;-1:-1:-1;55167:24:0;;;:14;:24;;;;;;:48;;;;;;;;-1:-1:-1;;;55167:48:0;-1:-1:-1;;;;55167:48:0;;;;-1:-1:-1;;;;;;55167:48:0;;;;;;;;;;;55231:30;;;;;55182:8;;55200;;55231:30;;;;;;;;;;54935:334;;:::o;53183:169::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;-1:-1:-1;;;;;53288:20:0;;53266:53;;;;;;53330:5;:14;;-1:-1:-1;;;;;;53330:14:0;-1:-1:-1;;;;;53330:14:0;;;;;;;;;;53183:169::o;54429:124::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;54514:24;;;;:14;:24;;;;;:31;;-1:-1:-1;;54514:31:0;54541:4;54514:31;;;54429:124::o;53557:214::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;-1:-1:-1;;;;;53680:29:0;;53658:62;;;;;;53731:14;:32;;-1:-1:-1;;;;;;53731:32:0;-1:-1:-1;;;;;53731:32:0;;;;;;;;;;53557:214::o;49479:37::-;;;;;;;;;;;;;;;;;;;:::o;38906:109::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;38979:28;38998:8;38979:18;:28::i;54561:127::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;54675:5;54648:24;;;:14;:24;;;;;:32;;-1:-1:-1;;54648:32:0;;;54561:127::o;49842:20::-;;;-1:-1:-1;;;;;49842:20:0;;:::o;52411:238::-;38010:9;:7;:9::i;:::-;38002:54;;;;-1:-1:-1;;;38002:54:0;;;;;;;;;52546:23;;;;:12;:23;;;;;;;;52519:69;;;;;;52535:9;;52546:23;52571:16;;52519:69;;;;;;;;;;52599:23;;;;:12;:23;;;;;;:42;52411:238::o;66450:429::-;66514:4;66539:24;;;:14;:24;;;;;;;;:33;66531:50;;;;-1:-1:-1;;;66531:50:0;;;;;;;;;66594:15;49623:30;;;;;;;;;;;;;;;66622:54;;66667:8;;66622:54;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;66622:54:0;;;66612:65;;49:4:-1;66612:65:0;;;;66691:14;;;;:5;:14;;;;;:26;66612:65;;-1:-1:-1;66691:31:0;66688:161;;66746:14;;;;:5;:14;;;;;;66739:21;;;;;;;;66780:31;66802:8;;66780:31;;;66833:4;66826:11;;;;;66688:161;66866:5;66859:12;;;66450:429;;;;:::o;61861:851::-;62045:24;;;;:14;:24;;;;;;;;:33;62037:50;;;;-1:-1:-1;;;62037:50:0;;;;;;;;;62127:16;;:35;;;-1:-1:-1;;;62127:35:0;;;;62100:24;;-1:-1:-1;;;;;62127:16:0;;:33;;:35;;;;;:16;;:35;;;;;;;:16;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;62127:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62127:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;62127:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;62127:35:0;;;;;;;;;62100:62;;62173:25;62215:7;:14;62201:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;62201:29:0;-1:-1:-1;62173:57:0;-1:-1:-1;62245:9:0;62241:119;62262:7;:14;62258:1;:18;62241:119;;;62312:7;:17;62320:8;62312:17;;;;;;;;;;;:24;;:36;62337:7;62345:1;62337:10;;;;;;;;;;;;;;62312:36;;;;;;;;;;;;62298:8;62307:1;62298:11;;;;;;;;;;;;;;;;;:50;62278:3;;62241:119;;;-1:-1:-1;;;;;;62373:31:0;;;62370:137;;62421:16;;:74;;-1:-1:-1;;;62421:74:0;;-1:-1:-1;;;;;62421:16:0;;;;:27;;:74;;62449:7;;62458:17;;62477:7;;62486:8;;62421:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62421:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62421:74:0;;;;62370:137;62517:16;;:70;;-1:-1:-1;;;62517:70:0;;-1:-1:-1;;;;;62517:16:0;;;;:25;;:70;;62543:7;;62552:15;;62569:7;;62578:8;;62517:70;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62517:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;62598:17:0;;;;:7;:17;;;;;;;:34;;:52;;-1:-1:-1;;;;;;62598:52:0;-1:-1:-1;;;;;62598:52:0;;;;;62666:38;;;-1:-1:-1;62666:38:0;;62598:17;;:52;;62666:38;;4522:181;4580:7;4612:5;;;4636:6;;;;4628:46;;;;-1:-1:-1;;;4628:46:0;;;;;;;;4978:136;5036:7;5063:43;5067:1;5070;5063:43;;;;;;;;;;;;;;;;;:3;:43::i;72191:803::-;72292:12;72289:50;;72321:7;;72289:50;72349:20;72372:24;;;:14;:24;;;;;:29;72439:5;;-1:-1:-1;;;;;72372:29:0;;;;72439:5;72415:30;;72412:426;;;72562:5;;:94;;-1:-1:-1;;;72562:94:0;;-1:-1:-1;;;;;72562:5:0;;;;:16;;:94;;72597:10;;72633:7;;72562:94;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72562:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72562:94:0;;;;72412:426;;;72701:9;;-1:-1:-1;;;;;72677:34:0;;;72701:9;;72677:34;72674:164;;;72728:9;;:98;;-1:-1:-1;;;72728:98:0;;-1:-1:-1;;;;;72728:9:0;;;;:20;;:98;;72767:10;;72803:7;;72728:98;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72728:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72728:98:0;;;;72674:164;72870:98;;-1:-1:-1;;;72870:98:0;;-1:-1:-1;;;;;72870:28:0;;;;;:98;;72917:10;;72946:7;;72870:98;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72870:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72870:98: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;72870:98:0;;;;;;;;;72848:138;;;;-1:-1:-1;;;72848:138:0;;;;;;;;60153:617;60244:7;60272:24;;;:14;:24;;;;;;;;:33;60264:51;;;;-1:-1:-1;;;60264:51:0;;;;;;;;;60328:15;49623:30;;;;;;;;;;;;;;;60356:54;;60401:8;;60356:54;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;60356:54:0;;;60346:65;;49:4:-1;60346:65:0;;;;60422:20;60445:14;;;:5;:14;;;;;:26;60346:65;;-1:-1:-1;60504:17:0;;60482:72;;;;-1:-1:-1;;;60482:72:0;;;;;;;;;60565:26;60594:58;60611:12;:40;49623:30;;;;;;;;;;;;;;60611:40;;;;;;;;;;;;60594:12;:16;;:58;;;;:::i;:::-;60680:46;;;;;;;;;;;-1:-1:-1;;;;;60705:20:0;;;;60680:46;;;;;;;-1:-1:-1;60663:14:0;;;:5;:14;;;;:63;;;;;;;;;;;;;;-1:-1:-1;60680:46:0;60153:617;-1:-1:-1;;;60153:617:0:o;71422:761::-;71521:12;71518:50;;71550:7;;71518:50;71578:20;71601:24;;;:14;:24;;;;;;;:29;71769:134;;-1:-1:-1;;;71769:134:0;;-1:-1:-1;;;;;71601:29:0;;;;;;71769:32;;:134;;71820:10;;71857:4;;71881:7;;71769:134;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71769:134:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71769:134: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;71769:134:0;;;;;;;;;71747:174;;;;-1:-1:-1;;;71747:174:0;;;;;;;;;71960:5;;-1:-1:-1;;;;;71936:30:0;;;71960:5;;71936:30;71932:244;;;72072:5;;:92;;-1:-1:-1;;;72072:92:0;;-1:-1:-1;;;;;72072:5:0;;;;:14;;:92;;72105:10;;72141:7;;72072:92;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72072:92:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72072:92:0;;;;71422:761;;;;:::o;3182:98::-;3262:10;3182:98;:::o;5451:192::-;5537:7;5573:12;5565:6;;;;5557:29;;;;-1:-1:-1;;;5557:29:0;;;;;;;;;;-1:-1:-1;;;5609:5:0;;;5451:192::o;1593:508::-;2010:4;2056:17;2088:7;1593:508;:::o;39121:229::-;-1:-1:-1;;;;;39195:22:0;;39187:73;;;;-1:-1:-1;;;39187:73:0;;;;;;;;;39297:6;;39276:38;;-1:-1:-1;;;;;39276:38:0;;;;39297:6;;39276:38;;39297:6;;39276:38;39325:6;:17;;-1:-1:-1;;;;;;39325:17:0;-1:-1:-1;;;;;39325:17:0;;;;;;;;;;39121:229::o;48594:28999::-;;;;;;;;;-1:-1:-1;48594:28999:0;;;;;;;;;;;;;;;;;:::o;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;;;;;;538:707;;655:3;648:4;640:6;636:17;632:27;622:2;;673:1;670;663:12;622:2;710:6;697:20;732:80;747:64;804:6;747:64;;;732:80;;;723:89;;829:5;854:6;847:5;840:21;884:4;876:6;872:17;862:27;;906:4;901:3;897:14;890:21;;959:6;1006:3;998:4;990:6;986:17;981:3;977:27;974:36;971:2;;;1023:1;1020;1013:12;971:2;1048:1;1033:206;1058:6;1055:1;1052:13;1033:206;;;1116:3;1138:37;1171:3;1159:10;1138:37;;;1126:50;;-1:-1;1199:4;1190:14;;;;1218;;;;;1080:1;1073:9;1033:206;;;1037:14;615:630;;;;;;;;1649:707;;1766:3;1759:4;1751:6;1747:17;1743:27;1733:2;;1784:1;1781;1774:12;1733:2;1821:6;1808:20;1843:80;1858:64;1915:6;1858:64;;1843:80;1834:89;;1940:5;1965:6;1958:5;1951:21;1995:4;1987:6;1983:17;1973:27;;2017:4;2012:3;2008:14;2001:21;;2070:6;2117:3;2109:4;2101:6;2097:17;2092:3;2088:27;2085:36;2082:2;;;2134:1;2131;2124:12;2082:2;2159:1;2144:206;2169:6;2166:1;2163:13;2144:206;;;2227:3;2249:37;2282:3;2270:10;2249:37;;;2237:50;;-1:-1;2310:4;2301:14;;;;2329;;;;;2191:1;2184:9;2144:206;;2382:722;;2510:3;2503:4;2495:6;2491:17;2487:27;2477:2;;2528:1;2525;2518:12;2477:2;2558:6;2552:13;2580:80;2595:64;2652:6;2595:64;;2580:80;2571:89;;2677:5;2702:6;2695:5;2688:21;2732:4;2724:6;2720:17;2710:27;;2754:4;2749:3;2745:14;2738:21;;2807:6;2854:3;2846:4;2838:6;2834:17;2829:3;2825:27;2822:36;2819:2;;;2871:1;2868;2861:12;2819:2;2896:1;2881:217;2906:6;2903:1;2900:13;2881:217;;;2964:3;2986:48;3030:3;3018:10;2986:48;;;2974:61;;-1:-1;3058:4;3049:14;;;;3077;;;;;2928:1;2921:9;2881:217;;3508:707;;3625:3;3618:4;3610:6;3606:17;3602:27;3592:2;;3643:1;3640;3633:12;3592:2;3680:6;3667:20;3702:80;3717:64;3774:6;3717:64;;3702:80;3693:89;;3799:5;3824:6;3817:5;3810:21;3854:4;3846:6;3842:17;3832:27;;3876:4;3871:3;3867:14;3860:21;;3929:6;3976:3;3968:4;3960:6;3956:17;3951:3;3947:27;3944:36;3941:2;;;3993:1;3990;3983:12;3941:2;4018:1;4003:206;4028:6;4025:1;4022:13;4003:206;;;4086:3;4108:37;4141:3;4129:10;4108:37;;;4096:50;;-1:-1;4169:4;4160:14;;;;4188;;;;;4050:1;4043:9;4003:206;;4223:128;4298:13;;4316:30;4298:13;4316:30;;4358:130;4425:20;;4450:33;4425:20;4450:33;;4495:134;4573:13;;4591:33;4573:13;4591:33;;4914:241;;5018:2;5006:9;4997:7;4993:23;4989:32;4986:2;;;5034:1;5031;5024:12;4986:2;5069:1;5086:53;5131:7;5111:9;5086:53;;;5076:63;4980:175;-1:-1;;;;4980:175;5162:773;;;;;;5352:3;5340:9;5331:7;5327:23;5323:33;5320:2;;;5369:1;5366;5359:12;5320:2;5404:1;5421:53;5466:7;5446:9;5421:53;;;5411:63;;5383:97;5539:2;5528:9;5524:18;5511:32;-1:-1;;;;;5555:6;5552:30;5549:2;;;5595:1;5592;5585:12;5549:2;5623:80;5695:7;5686:6;5675:9;5671:22;5623:80;;;5613:90;;;;5490:219;5740:2;5758:53;5803:7;5794:6;5783:9;5779:22;5758:53;;;5748:63;;5719:98;5848:2;5866:53;5911:7;5902:6;5891:9;5887:22;5866:53;;;5856:63;;5827:98;5314:621;;;;;;;;;5942:678;;;;;6133:2;6121:9;6112:7;6108:23;6104:32;6101:2;;;6149:1;6146;6139:12;6101:2;6184:31;;-1:-1;;;;;6224:30;;6221:2;;;6267:1;6264;6257:12;6221:2;6295:80;6367:7;6358:6;6347:9;6343:22;6295:80;;;6285:90;;;;6163:218;6440:2;6429:9;6425:18;6412:32;-1:-1;;;;;6456:6;6453:30;6450:2;;;6496:1;6493;6486:12;6450:2;6524:80;6596:7;6587:6;6576:9;6572:22;6524:80;;;6095:525;;;;-1:-1;6514:90;-1:-1;;;;6095:525;7312:377;;7441:2;7429:9;7420:7;7416:23;7412:32;7409:2;;;7457:1;7454;7447:12;7409:2;7492:31;;-1:-1;;;;;7532:30;;7529:2;;;7575:1;7572;7565:12;7529:2;7595:78;7665:7;7656:6;7645:9;7641:22;7595:78;;7696:392;;7836:2;7824:9;7815:7;7811:23;7807:32;7804:2;;;7852:1;7849;7842:12;7804:2;7887:24;;-1:-1;;;;;7920:30;;7917:2;;;7963:1;7960;7953:12;7917:2;7983:89;8064:7;8055:6;8044:9;8040:22;7983:89;;8095:638;;;8266:2;8254:9;8245:7;8241:23;8237:32;8234:2;;;8282:1;8279;8272:12;8234:2;8317:31;;-1:-1;;;;;8357:30;;8354:2;;;8400:1;8397;8390:12;8354:2;8420:78;8490:7;8481:6;8470:9;8466:22;8420:78;;;8410:88;;8296:208;8563:2;8552:9;8548:18;8535:32;-1:-1;;;;;8579:6;8576:30;8573:2;;;8619:1;8616;8609:12;8573:2;8639:78;8709:7;8700:6;8689:9;8685:22;8639:78;;;8629:88;;8514:209;8228:505;;;;;;8740:1141;;;;;;;8979:3;8967:9;8958:7;8954:23;8950:33;8947:2;;;8996:1;8993;8986:12;8947:2;9031:31;;-1:-1;;;;;9071:30;;9068:2;;;9114:1;9111;9104:12;9068:2;9134:78;9204:7;9195:6;9184:9;9180:22;9134:78;;;9124:88;;9010:208;9277:2;9266:9;9262:18;9249:32;-1:-1;;;;;9293:6;9290:30;9287:2;;;9333:1;9330;9323:12;9287:2;9353:78;9423:7;9414:6;9403:9;9399:22;9353:78;;;9343:88;;9228:209;9468:2;9486:53;9531:7;9522:6;9511:9;9507:22;9486:53;;;9476:63;;9447:98;9576:2;9594:53;9639:7;9630:6;9619:9;9615:22;9594:53;;;9584:63;;9555:98;9684:3;9703:53;9748:7;9739:6;9728:9;9724:22;9703:53;;;9693:63;;9663:99;9793:3;9812:53;9857:7;9848:6;9837:9;9833:22;9812:53;;;9802:63;;9772:99;8941:940;;;;;;;;;9888:638;;;10059:2;10047:9;10038:7;10034:23;10030:32;10027:2;;;10075:1;10072;10065:12;10027:2;10110:31;;-1:-1;;;;;10150:30;;10147:2;;;10193:1;10190;10183:12;10147:2;10213:78;10283:7;10274:6;10263:9;10259:22;10213:78;;;10203:88;;10089:208;10356:2;10345:9;10341:18;10328:32;-1:-1;;;;;10372:6;10369:30;10366:2;;;10412:1;10409;10402:12;10366:2;10432:78;10502:7;10493:6;10482:9;10478:22;10432:78;;10533:763;;;;10721:2;10709:9;10700:7;10696:23;10692:32;10689:2;;;10737:1;10734;10727:12;10689:2;10772:31;;-1:-1;;;;;10812:30;;10809:2;;;10855:1;10852;10845:12;10809:2;10875:78;10945:7;10936:6;10925:9;10921:22;10875:78;;;10865:88;;10751:208;11018:2;11007:9;11003:18;10990:32;-1:-1;;;;;11034:6;11031:30;11028:2;;;11074:1;11071;11064:12;11028:2;11094:78;11164:7;11155:6;11144:9;11140:22;11094:78;;;11084:88;;10969:209;11209:2;11227:53;11272:7;11263:6;11252:9;11248:22;11227:53;;;11217:63;;11188:98;10683:613;;;;;;11303:257;;11415:2;11403:9;11394:7;11390:23;11386:32;11383:2;;;11431:1;11428;11421:12;11383:2;11466:1;11483:61;11536:7;11516:9;11483:61;;11567:241;;11671:2;11659:9;11650:7;11646:23;11642:32;11639:2;;;11687:1;11684;11677:12;11639:2;11722:1;11739:53;11784:7;11764:9;11739:53;;11815:366;;;11936:2;11924:9;11915:7;11911:23;11907:32;11904:2;;;11952:1;11949;11942:12;11904:2;11987:1;12004:53;12049:7;12029:9;12004:53;;;11994:63;;11966:97;12094:2;12112:53;12157:7;12148:6;12137:9;12133:22;12112:53;;12188:803;;;;;;12396:2;12384:9;12375:7;12371:23;12367:32;12364:2;;;12412:1;12409;12402:12;12364:2;12447:1;12464:53;12509:7;12489:9;12464:53;;;12454:63;;12426:97;12582:2;12571:9;12567:18;12554:32;-1:-1;;;;;12598:6;12595:30;12592:2;;;12638:1;12635;12628:12;12592:2;12666:80;12738:7;12729:6;12718:9;12714:22;12666:80;;;12656:90;;;;12533:219;12811:2;12800:9;12796:18;12783:32;-1:-1;;;;;12827:6;12824:30;12821:2;;;12867:1;12864;12857:12;12821:2;12895:80;12967:7;12958:6;12947:9;12943:22;12895:80;;;12885:90;;;;12762:219;12358:633;;;;;;;;;12998:366;;;13119:2;13107:9;13098:7;13094:23;13090:32;13087:2;;;13135:1;13132;13125:12;13087:2;13170:1;13187:53;13232:7;13212:9;13187:53;;;13177:63;;13149:97;13277:2;13295:53;13340:7;13331:6;13320:9;13316:22;13295:53;;13744:491;;;;13882:2;13870:9;13861:7;13857:23;13853:32;13850:2;;;13898:1;13895;13888:12;13850:2;13933:1;13950:53;13995:7;13975:9;13950:53;;;13940:63;;13912:97;14040:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;;;14048:63;;14019:98;14148:2;14166:53;14211:7;14202:6;14191:9;14187:22;14166:53;;14490:263;;14605:2;14593:9;14584:7;14580:23;14576:32;14573:2;;;14621:1;14618;14611:12;14573:2;14656:1;14673:64;14729:7;14709:9;14673:64;;14761:173;;14848:46;14890:3;14882:6;14848:46;;;-1:-1;;14923:4;14914:14;;14841:93;14943:173;;15030:46;15072:3;15064:6;15030:46;;15306:142;15397:45;15436:5;15397:45;;;15392:3;15385:58;15379:69;;;15455:103;15528:24;15546:5;15528:24;;15716:690;;15861:54;15909:5;15861:54;;;15928:86;16007:6;16002:3;15928:86;;;15921:93;;16035:56;16085:5;16035:56;;;16111:7;16139:1;16124:260;16149:6;16146:1;16143:13;16124:260;;;16216:6;16210:13;16237:63;16296:3;16281:13;16237:63;;;16230:70;;16317:60;16370:6;16317:60;;;16307:70;-1:-1;;16171:1;16164:9;16124:260;;;-1:-1;16397:3;;15840:566;-1:-1;;;;;15840:566;16445:467;;16591:86;16670:6;16665:3;16591:86;;;16584:93;;-1:-1;;;;;16696:6;16693:78;16690:2;;;16784:1;16781;16774:12;16690:2;16817:4;16809:6;16805:17;16795:27;;16834:43;16870:6;16865:3;16858:5;16834:43;;;-1:-1;;16890:16;;16577:335;16951:690;;17096:54;17144:5;17096:54;;;17163:86;17242:6;17237:3;17163:86;;;17156:93;;17270:56;17320:5;17270:56;;;17346:7;17374:1;17359:260;17384:6;17381:1;17378:13;17359:260;;;17451:6;17445:13;17472:63;17531:3;17516:13;17472:63;;;17465:70;;17552:60;17605:6;17552:60;;;17542:70;-1:-1;;17406:1;17399:9;17359:260;;18186:690;;18331:54;18379:5;18331:54;;;18398:86;18477:6;18472:3;18398:86;;;18391:93;;18505:56;18555:5;18505:56;;;18581:7;18609:1;18594:260;18619:6;18616:1;18613:13;18594:260;;;18686:6;18680:13;18707:63;18766:3;18751:13;18707:63;;;18700:70;;18787:60;18840:6;18787:60;;;18777:70;-1:-1;;18641:1;18634:9;18594:260;;18884:104;18961:21;18976:5;18961:21;;18995:103;19068:24;19086:5;19068:24;;19225:152;19326:45;19346:24;19364:5;19346:24;;;19326:45;;19384:343;;19494:38;19526:5;19494:38;;;19544:70;19607:6;19602:3;19544:70;;;19537:77;;19619:52;19664:6;19659:3;19652:4;19645:5;19641:16;19619:52;;;19692:29;19714:6;19692:29;;;19683:39;;;;19474:253;-1:-1;;;19474:253;19734:356;;19862:38;19894:5;19862:38;;;19912:88;19993:6;19988:3;19912:88;;;19905:95;;20005:52;20050:6;20045:3;20038:4;20031:5;20027:16;20005:52;;;20069:16;;;;;19842:248;-1:-1;;19842:248;20097:178;20206:63;20263:5;20206:63;;20282:138;20371:43;20408:5;20371:43;;20782:302;;20942:66;21006:1;21001:3;20942:66;;;-1:-1;;;21021:26;;21075:2;21066:12;;20928:156;-1:-1;;20928:156;21093:303;;21253:66;21317:1;21312:3;21253:66;;;-1:-1;;;21332:27;;21387:2;21378:12;;21239:157;-1:-1;;21239:157;21405:302;;21565:66;21629:1;21624:3;21565:66;;;-1:-1;;;21644:26;;21698:2;21689:12;;21551:156;-1:-1;;21551:156;21716:302;;21876:66;21940:1;21935:3;21876:66;;;-1:-1;;;21955:26;;22009:2;22000:12;;21862:156;-1:-1;;21862:156;22027:302;;22187:66;22251:1;22246:3;22187:66;;;-1:-1;;;22266:26;;22320:2;22311:12;;22173:156;-1:-1;;22173:156;22338:302;;22498:66;22562:1;22557:3;22498:66;;;-1:-1;;;22577:26;;22631:2;22622:12;;22484:156;-1:-1;;22484:156;22649:303;;22809:66;22873:1;22868:3;22809:66;;;-1:-1;;;22888:27;;22943:2;22934:12;;22795:157;-1:-1;;22795:157;22961:302;;23121:66;23185:1;23180:3;23121:66;;;-1:-1;;;23200:26;;23254:2;23245:12;;23107:156;-1:-1;;23107:156;23272:302;;23432:66;23496:1;23491:3;23432:66;;;-1:-1;;;23511:26;;23565:2;23556:12;;23418:156;-1:-1;;23418:156;23583:302;;23743:66;23807:1;23802:3;23743:66;;;-1:-1;;;23822:26;;23876:2;23867:12;;23729:156;-1:-1;;23729:156;23894:302;;24054:66;24118:1;24113:3;24054:66;;;-1:-1;;;24133:26;;24187:2;24178:12;;24040:156;-1:-1;;24040:156;24205:375;;24365:67;24429:2;24424:3;24365:67;;;24465:34;24445:55;;-1:-1;;;24529:2;24520:12;;24513:30;24571:2;24562:12;;24351:229;-1:-1;;24351:229;24589:302;;24749:66;24813:1;24808:3;24749:66;;;-1:-1;;;24828:26;;24882:2;24873:12;;24735:156;-1:-1;;24735:156;24900:304;;25060:66;25124:1;25119:3;25060:66;;;-1:-1;;;25139:28;;25195:2;25186:12;;25046:158;-1:-1;;25046:158;25213:303;;25373:66;25437:1;25432:3;25373:66;;;-1:-1;;;25452:27;;25507:2;25498:12;;25359:157;-1:-1;;25359:157;25525:302;;25685:66;25749:1;25744:3;25685:66;;;-1:-1;;;25764:26;;25818:2;25809:12;;25671:156;-1:-1;;25671:156;25836:308;;25996:66;26060:1;26055:3;25996:66;;;-1:-1;;;26075:32;;26135:2;26126:12;;25982:162;-1:-1;;25982:162;26153:327;;26313:67;26377:2;26372:3;26313:67;;;26413:29;26393:50;;26471:2;26462:12;;26299:181;-1:-1;;26299:181;26489:302;;26649:66;26713:1;26708:3;26649:66;;;-1:-1;;;26728:26;;26782:2;26773:12;;26635:156;-1:-1;;26635:156;26800:302;;26960:66;27024:1;27019:3;26960:66;;;-1:-1;;;27039:26;;27093:2;27084:12;;26946:156;-1:-1;;26946:156;27111:302;;27271:66;27335:1;27330:3;27271:66;;;-1:-1;;;27350:26;;27404:2;27395:12;;27257:156;-1:-1;;27257:156;27422:302;;27582:66;27646:1;27641:3;27582:66;;;-1:-1;;;27661:26;;27715:2;27706:12;;27568:156;-1:-1;;27568:156;27733:303;;27893:66;27957:1;27952:3;27893:66;;;-1:-1;;;27972:27;;28027:2;28018:12;;27879:157;-1:-1;;27879:157;28045:303;;28205:66;28269:1;28264:3;28205:66;;;-1:-1;;;28284:27;;28339:2;28330:12;;28191:157;-1:-1;;28191:157;28357:302;;28517:66;28581:1;28576:3;28517:66;;;-1:-1;;;28596:26;;28650:2;28641:12;;28503:156;-1:-1;;28503:156;28668:302;;28828:66;28892:1;28887:3;28828:66;;;-1:-1;;;28907:26;;28961:2;28952:12;;28814:156;-1:-1;;28814:156;28979:303;;29139:66;29203:1;29198:3;29139:66;;;-1:-1;;;29218:27;;29273:2;29264:12;;29125:157;-1:-1;;29125:157;29291:303;;29451:66;29515:1;29510:3;29451:66;;;-1:-1;;;29530:27;;29585:2;29576:12;;29437:157;-1:-1;;29437:157;29603:305;;29763:66;29827:1;29822:3;29763:66;;;-1:-1;;;29842:29;;29899:2;29890:12;;29749:159;-1:-1;;29749:159;29917:302;;30077:66;30141:1;30136:3;30077:66;;;-1:-1;;;30156:26;;30210:2;30201:12;;30063:156;-1:-1;;30063:156;30228:328;;30388:67;30452:2;30447:3;30388:67;;;30488:30;30468:51;;30547:2;30538:12;;30374:182;-1:-1;;30374:182;30565:302;;30725:66;30789:1;30784:3;30725:66;;;-1:-1;;;30804:26;;30858:2;30849:12;;30711:156;-1:-1;;30711:156;30876:302;;31036:66;31100:1;31095:3;31036:66;;;-1:-1;;;31115:26;;31169:2;31160:12;;31022:156;-1:-1;;31022:156;31187:303;;31347:66;31411:1;31406:3;31347:66;;;-1:-1;;;31426:27;;31481:2;31472:12;;31333:157;-1:-1;;31333:157;31499:302;;31659:66;31723:1;31718:3;31659:66;;;-1:-1;;;31738:26;;31792:2;31783:12;;31645:156;-1:-1;;31645:156;31810:302;;31970:66;32034:1;32029:3;31970:66;;;-1:-1;;;32049:26;;32103:2;32094:12;;31956:156;-1:-1;;31956:156;32121:303;;32281:66;32345:1;32340:3;32281:66;;;-1:-1;;;32360:27;;32415:2;32406:12;;32267:157;-1:-1;;32267:157;32433:302;;32593:66;32657:1;32652:3;32593:66;;;-1:-1;;;32672:26;;32726:2;32717:12;;32579:156;-1:-1;;32579:156;32744:302;;32904:66;32968:1;32963:3;32904:66;;;-1:-1;;;32983:26;;33037:2;33028:12;;32890:156;-1:-1;;32890:156;33055:332;;33215:67;33279:2;33274:3;33215:67;;;33315:34;33295:55;;33378:2;33369:12;;33201:186;-1:-1;;33201:186;33396:339;;33574:84;33656:1;33651:3;33574:84;;;-1:-1;;;33671:28;;33727:1;33718:11;;33560:175;-1:-1;;33560:175;33744:383;;33904:67;33968:2;33963:3;33904:67;;;34004:34;33984:55;;-1:-1;;;34068:2;34059:12;;34052:38;34118:2;34109:12;;33890:237;-1:-1;;33890:237;34136:302;;34296:66;34360:1;34355:3;34296:66;;;-1:-1;;;34375:26;;34429:2;34420:12;;34282:156;-1:-1;;34282:156;34447:303;;34607:66;34671:1;34666:3;34607:66;;;-1:-1;;;34686:27;;34741:2;34732:12;;34593:157;-1:-1;;34593:157;34759:302;;34919:66;34983:1;34978:3;34919:66;;;-1:-1;;;34998:26;;35052:2;35043:12;;34905:156;-1:-1;;34905:156;35070:303;;35230:66;35294:1;35289:3;35230:66;;;-1:-1;;;35309:27;;35364:2;35355:12;;35216:157;-1:-1;;35216:157;35382:302;;35542:66;35606:1;35601:3;35542:66;;;-1:-1;;;35621:26;;35675:2;35666:12;;35528:156;-1:-1;;35528:156;35693:302;;35853:66;35917:1;35912:3;35853:66;;;-1:-1;;;35932:26;;35986:2;35977:12;;35839:156;-1:-1;;35839:156;36004:303;;36164:66;36228:1;36223:3;36164:66;;;-1:-1;;;36243:27;;36298:2;36289:12;;36150:157;-1:-1;;36150:157;36316:302;;36476:66;36540:1;36535:3;36476:66;;;-1:-1;;;36555:26;;36609:2;36600:12;;36462:156;-1:-1;;36462:156;36627:302;;36787:66;36851:1;36846:3;36787:66;;;-1:-1;;;36866:26;;36920:2;36911:12;;36773:156;-1:-1;;36773:156;36938:302;;37098:66;37162:1;37157:3;37098:66;;;-1:-1;;;37177:26;;37231:2;37222:12;;37084:156;-1:-1;;37084:156;37249:303;;37409:66;37473:1;37468:3;37409:66;;;-1:-1;;;37488:27;;37543:2;37534:12;;37395:157;-1:-1;;37395:157;37561:302;;37721:66;37785:1;37780:3;37721:66;;;-1:-1;;;37800:26;;37854:2;37845:12;;37707:156;-1:-1;;37707:156;37872:302;;38032:66;38096:1;38091:3;38032:66;;;-1:-1;;;38111:26;;38165:2;38156:12;;38018:156;-1:-1;;38018:156;38183:302;;38343:66;38407:1;38402:3;38343:66;;;-1:-1;;;38422:26;;38476:2;38467:12;;38329:156;-1:-1;;38329:156;38494:302;;38654:66;38718:1;38713:3;38654:66;;;-1:-1;;;38733:26;;38787:2;38778:12;;38640:156;-1:-1;;38640:156;38805:302;;38965:66;39029:1;39024:3;38965:66;;;-1:-1;;;39044:26;;39098:2;39089:12;;38951:156;-1:-1;;38951:156;39116:353;;39294:85;39376:2;39371:3;39294:85;;;-1:-1;;;39392:40;;39460:2;39451:12;;39280:189;-1:-1;;39280:189;39478:302;;39638:66;39702:1;39697:3;39638:66;;;-1:-1;;;39717:26;;39771:2;39762:12;;39624:156;-1:-1;;39624:156;39789:303;;39949:66;40013:1;40008:3;39949:66;;;-1:-1;;;40028:27;;40083:2;40074:12;;39935:157;-1:-1;;39935:157;40101:302;;40261:66;40325:1;40320:3;40261:66;;;-1:-1;;;40340:26;;40394:2;40385:12;;40247:156;-1:-1;;40247:156;40412:303;;40572:66;40636:1;40631:3;40572:66;;;-1:-1;;;40651:27;;40706:2;40697:12;;40558:157;-1:-1;;40558:157;40724:302;;40884:66;40948:1;40943:3;40884:66;;;-1:-1;;;40963:26;;41017:2;41008:12;;40870:156;-1:-1;;40870:156;41035:302;;41195:66;41259:1;41254:3;41195:66;;;-1:-1;;;41274:26;;41328:2;41319:12;;41181:156;-1:-1;;41181:156;41346:302;;41506:66;41570:1;41565:3;41506:66;;;-1:-1;;;41585:26;;41639:2;41630:12;;41492:156;-1:-1;;41492:156;41657:303;;41817:66;41881:1;41876:3;41817:66;;;-1:-1;;;41896:27;;41951:2;41942:12;;41803:157;-1:-1;;41803:157;41969:304;;42129:66;42193:1;42188:3;42129:66;;;-1:-1;;;42208:28;;42264:2;42255:12;;42115:158;-1:-1;;42115:158;42282:303;;42442:66;42506:1;42501:3;42442:66;;;-1:-1;;;42521:27;;42576:2;42567:12;;42428:157;-1:-1;;42428:157;42594:302;;42754:66;42818:1;42813:3;42754:66;;;-1:-1;;;42833:26;;42887:2;42878:12;;42740:156;-1:-1;;42740:156;42905:302;;43065:66;43129:1;43124:3;43065:66;;;-1:-1;;;43144:26;;43198:2;43189:12;;43051:156;-1:-1;;43051:156;43216:302;;43376:66;43440:1;43435:3;43376:66;;;-1:-1;;;43455:26;;43509:2;43500:12;;43362:156;-1:-1;;43362:156;43527:302;;43687:66;43751:1;43746:3;43687:66;;;-1:-1;;;43766:26;;43820:2;43811:12;;43673:156;-1:-1;;43673:156;44226:110;44307:23;44324:5;44307:23;;44343:383;;44490:75;44561:3;44552:6;44490:75;;;44587:2;44582:3;44578:12;44571:19;;44601:75;44672:3;44663:6;44601:75;;;-1:-1;44698:2;44689:12;;44478:248;-1:-1;;44478:248;44733:262;;44877:93;44966:3;44957:6;44877:93;;45002:372;;45201:148;45345:3;45201:148;;45381:372;;45580:148;45724:3;45580:148;;45760:244;;45879:75;45950:3;45941:6;45879:75;;;-1:-1;45976:2;45967:12;;45867:137;-1:-1;45867:137;46011:213;46129:2;46114:18;;46143:71;46118:9;46187:6;46143:71;;46231:899;46561:3;46546:19;;46576:79;46550:9;46628:6;46576:79;;;46666:72;46734:2;46723:9;46719:18;46710:6;46666:72;;;46786:9;46780:4;46776:20;46771:2;46760:9;46756:18;46749:48;46811:118;46924:4;46915:6;46907;46811:118;;;46803:126;;46977:9;46971:4;46967:20;46962:2;46951:9;46947:18;46940:48;47002:118;47115:4;47106:6;47098;47002:118;;;46994:126;46532:598;-1:-1;;;;;;;;46532:598;47137:859;47447:3;47432:19;;47462:79;47436:9;47514:6;47462:79;;;47552:72;47620:2;47609:9;47605:18;47596:6;47552:72;;;47672:9;47666:4;47662:20;47657:2;47646:9;47642:18;47635:48;47697:108;47800:4;47791:6;47697:108;;;47689:116;;47853:9;47847:4;47843:20;47838:2;47827:9;47823:18;47816:48;47878:108;47981:4;47972:6;47878:108;;;47870:116;47418:578;-1:-1;;;;;;47418:578;48003:843;48305:3;48290:19;;48320:71;48294:9;48364:6;48320:71;;48853:435;49027:2;49012:18;;49041:71;49016:9;49085:6;49041:71;;;49123:72;49191:2;49180:9;49176:18;49167:6;49123:72;;;49206;49274:2;49263:9;49259:18;49250:6;49206:72;;49295:991;49647:3;49632:19;;49662:71;49636:9;49706:6;49662:71;;;49781:9;49775:4;49771:20;49766:2;49755:9;49751:18;49744:48;49806:108;49909:4;49900:6;49806:108;;;49798:116;;49962:9;49956:4;49952:20;49947:2;49936:9;49932:18;49925:48;49987:108;50090:4;50081:6;49987:108;;;49979:116;;50143:9;50137:4;50133:20;50128:2;50117:9;50113:18;50106:48;50168:108;50271:4;50262:6;50168:108;;50293:1091;50631:3;50616:19;;50646:71;50620:9;50690:6;50646:71;;;50728:78;50802:2;50791:9;50787:18;50778:6;50728:78;;;50817:72;50885:2;50874:9;50870:18;50861:6;50817:72;;;50900;50968:2;50957:9;50953:18;50944:6;50900:72;;;50983:73;51051:3;51040:9;51036:19;51027:6;50983:73;;;51067;51135:3;51124:9;51120:19;51111:6;51067:73;;;51151;51219:3;51208:9;51204:19;51195:6;51151:73;;;51273:9;51267:4;51263:20;51257:3;51246:9;51242:19;51235:49;51298:76;51369:4;51360:6;51298:76;;;51290:84;50602:782;-1:-1;;;;;;;;;;50602:782;51391:324;51537:2;51522:18;;51551:71;51526:9;51595:6;51551:71;;;51633:72;51701:2;51690:9;51686:18;51677:6;51633:72;;51722:547;51924:3;51909:19;;51939:71;51913:9;51983:6;51939:71;;;52021:72;52089:2;52078:9;52074:18;52065:6;52021:72;;;52104;52172:2;52161:9;52157:18;52148:6;52104:72;;;52187;52255:2;52244:9;52240:18;52231:6;52187:72;;52276:320;52420:2;52405:18;;52434:71;52409:9;52478:6;52434:71;;;52516:70;52582:2;52571:9;52567:18;52558:6;52516:70;;52603:381;52781:2;52795:47;;;52766:18;;52856:118;52766:18;52960:6;52952;52856:118;;52991:201;53103:2;53088:18;;53117:65;53092:9;53155:6;53117:65;;53199:213;53317:2;53302:18;;53331:71;53306:9;53375:6;53331:71;;53419:324;53565:2;53550:18;;53579:71;53554:9;53623:6;53579:71;;;53661:72;53729:2;53718:9;53714:18;53705:6;53661:72;;53750:547;53952:3;53937:19;;53967:71;53941:9;54011:6;53967:71;;;54049:72;54117:2;54106:9;54102:18;54093:6;54049:72;;;54132;54200:2;54189:9;54185:18;54176:6;54132:72;;54304:883;54626:3;54611:19;;54641:71;54615:9;54685:6;54641:71;;55194:435;55368:2;55353:18;;55382:71;55357:9;55426:6;55382:71;;55636:771;55930:2;55915:18;;55944:71;55919:9;55988:6;55944:71;;;56063:9;56057:4;56053:20;56048:2;56037:9;56033:18;56026:48;56088:118;56201:4;56192:6;56184;56088:118;;;56080:126;;56254:9;56248:4;56244:20;56239:2;56228:9;56224:18;56217:48;56279:118;56392:4;56383:6;56375;56279:118;;;56271:126;55901:506;-1:-1;;;;;;;55901:506;56414:731;56688:2;56673:18;;56702:71;56677:9;56746:6;56702:71;;;56821:9;56815:4;56811:20;56806:2;56795:9;56791:18;56784:48;56846:108;56949:4;56940:6;56846:108;;;56838:116;;57002:9;56996:4;56992:20;56987:2;56976:9;56972:18;56965:48;57027:108;57130:4;57121:6;57027:108;;57152:324;57298:2;57283:18;;57312:71;57287:9;57356:6;57312:71;;57483:995;57833:3;57818:19;;57848:71;57822:9;57892:6;57848:71;;;57930:72;57998:2;57987:9;57983:18;57974:6;57930:72;;;58013;58081:2;58070:9;58066:18;58057:6;58013:72;;;58133:9;58127:4;58123:20;58118:2;58107:9;58103:18;58096:48;58158:118;58271:4;58262:6;58254;58158:118;;;58150:126;;58325:9;58319:4;58315:20;58309:3;58298:9;58294:19;58287:49;58350:118;58463:4;58454:6;58446;58350:118;;;58342:126;57804:674;-1:-1;;;;;;;;;57804:674;58485:843;58787:3;58772:19;;58802:71;58776:9;58846:6;58802:71;;;58884:72;58952:2;58941:9;58937:18;58928:6;58884:72;;59335:435;59509:2;59494:18;;59523:71;59498:9;59567:6;59523:71;;;59605:72;59673:2;59662:9;59658:18;59649:6;59605:72;;59777:265;59921:2;59906:18;;59935:97;59910:9;60005:6;59935:97;;60049:301;60187:2;60201:47;;;60172:18;;60262:78;60172:18;60326:6;60262:78;;60357:407;60548:2;60562:47;;;60533:18;;60623:131;60533:18;60623:131;;60771:407;60962:2;60976:47;;;60947:18;;61037:131;60947:18;61037:131;;61185:407;61376:2;61390:47;;;61361:18;;61451:131;61361:18;61451:131;;61599:407;61790:2;61804:47;;;61775:18;;61865:131;61775:18;61865:131;;62013:407;62204:2;62218:47;;;62189:18;;62279:131;62189:18;62279:131;;62427:407;62618:2;62632:47;;;62603:18;;62693:131;62603:18;62693:131;;62841:407;63032:2;63046:47;;;63017:18;;63107:131;63017:18;63107:131;;63255:407;63446:2;63460:47;;;63431:18;;63521:131;63431:18;63521:131;;63669:407;63860:2;63874:47;;;63845:18;;63935:131;63845:18;63935:131;;64083:407;64274:2;64288:47;;;64259:18;;64349:131;64259:18;64349:131;;64497:407;64688:2;64702:47;;;64673:18;;64763:131;64673:18;64763:131;;64911:407;65102:2;65116:47;;;65087:18;;65177:131;65087:18;65177:131;;65325:407;65516:2;65530:47;;;65501:18;;65591:131;65501:18;65591:131;;65739:407;65930:2;65944:47;;;65915:18;;66005:131;65915:18;66005:131;;66153:407;66344:2;66358:47;;;66329:18;;66419:131;66329:18;66419:131;;66567:407;66758:2;66772:47;;;66743:18;;66833:131;66743:18;66833:131;;66981:407;67172:2;67186:47;;;67157:18;;67247:131;67157:18;67247:131;;67395:407;67586:2;67600:47;;;67571:18;;67661:131;67571:18;67661:131;;67809:407;68000:2;68014:47;;;67985:18;;68075:131;67985:18;68075:131;;68223:407;68414:2;68428:47;;;68399:18;;68489:131;68399:18;68489:131;;68637:407;68828:2;68842:47;;;68813:18;;68903:131;68813:18;68903:131;;69051:407;69242:2;69256:47;;;69227:18;;69317:131;69227:18;69317:131;;69465:407;69656:2;69670:47;;;69641:18;;69731:131;69641:18;69731:131;;69879:407;70070:2;70084:47;;;70055:18;;70145:131;70055:18;70145:131;;70293:407;70484:2;70498:47;;;70469:18;;70559:131;70469:18;70559:131;;70707:407;70898:2;70912:47;;;70883:18;;70973:131;70883:18;70973:131;;71121:407;71312:2;71326:47;;;71297:18;;71387:131;71297:18;71387:131;;71535:407;71726:2;71740:47;;;71711:18;;71801:131;71711:18;71801:131;;71949:407;72140:2;72154:47;;;72125:18;;72215:131;72125:18;72215:131;;72363:407;72554:2;72568:47;;;72539:18;;72629:131;72539:18;72629:131;;72777:407;72968:2;72982:47;;;72953:18;;73043:131;72953:18;73043:131;;73191:407;73382:2;73396:47;;;73367:18;;73457:131;73367:18;73457:131;;73605:407;73796:2;73810:47;;;73781:18;;73871:131;73781:18;73871:131;;74019:407;74210:2;74224:47;;;74195:18;;74285:131;74195:18;74285:131;;74433:407;74624:2;74638:47;;;74609:18;;74699:131;74609:18;74699:131;;74847:407;75038:2;75052:47;;;75023:18;;75113:131;75023:18;75113:131;;75261:407;75452:2;75466:47;;;75437:18;;75527:131;75437:18;75527:131;;75675:407;75866:2;75880:47;;;75851:18;;75941:131;75851:18;75941:131;;76089:407;76280:2;76294:47;;;76265:18;;76355:131;76265:18;76355:131;;76503:407;76694:2;76708:47;;;76679:18;;76769:131;76679:18;76769:131;;76917:407;77108:2;77122:47;;;77093:18;;77183:131;77093:18;77183:131;;77331:407;77522:2;77536:47;;;77507:18;;77597:131;77507:18;77597:131;;77745:407;77936:2;77950:47;;;77921:18;;78011:131;77921:18;78011:131;;78159:407;78350:2;78364:47;;;78335:18;;78425:131;78335:18;78425:131;;78573:407;78764:2;78778:47;;;78749:18;;78839:131;78749:18;78839:131;;78987:407;79178:2;79192:47;;;79163:18;;79253:131;79163:18;79253:131;;79401:407;79592:2;79606:47;;;79577:18;;79667:131;79577:18;79667:131;;79815:407;80006:2;80020:47;;;79991:18;;80081:131;79991:18;80081:131;;80229:407;80420:2;80434:47;;;80405:18;;80495:131;80405:18;80495:131;;80643:407;80834:2;80848:47;;;80819:18;;80909:131;80819:18;80909:131;;81057:407;81248:2;81262:47;;;81233:18;;81323:131;81233:18;81323:131;;81471:407;81662:2;81676:47;;;81647:18;;81737:131;81647:18;81737:131;;81885:407;82076:2;82090:47;;;82061:18;;82151:131;82061:18;82151:131;;82299:407;82490:2;82504:47;;;82475:18;;82565:131;82475:18;82565:131;;82713:407;82904:2;82918:47;;;82889:18;;82979:131;82889:18;82979:131;;83127:407;83318:2;83332:47;;;83303:18;;83393:131;83303:18;83393:131;;83541:407;83732:2;83746:47;;;83717:18;;83807:131;83717:18;83807:131;;83955:407;84146:2;84160:47;;;84131:18;;84221:131;84131:18;84221:131;;84369:407;84560:2;84574:47;;;84545:18;;84635:131;84545:18;84635:131;;84783:407;84974:2;84988:47;;;84959:18;;85049:131;84959:18;85049:131;;85197:407;85388:2;85402:47;;;85373:18;;85463:131;85373:18;85463:131;;85611:407;85802:2;85816:47;;;85787:18;;85877:131;85787:18;85877:131;;86025:407;86216:2;86230:47;;;86201:18;;86291:131;86201:18;86291:131;;86439:407;86630:2;86644:47;;;86615:18;;86705:131;86615:18;86705:131;;86853:407;87044:2;87058:47;;;87029:18;;87119:131;87029:18;87119:131;;87267:407;87458:2;87472:47;;;87443:18;;87533:131;87443:18;87533:131;;87681:407;87872:2;87886:47;;;87857:18;;87947:131;87857:18;87947:131;;88095:407;88286:2;88300:47;;;88271:18;;88361:131;88271:18;88361:131;;88509:407;88700:2;88714:47;;;88685:18;;88775:131;88685:18;88775:131;;88923:407;89114:2;89128:47;;;89099:18;;89189:131;89099:18;89189:131;;89337:407;89528:2;89542:47;;;89513:18;;89603:131;89513:18;89603:131;;90302:256;90364:2;90358:9;90390:17;;;-1:-1;;;;;90450:34;;90486:22;;;90447:62;90444:2;;;90522:1;90519;90512:12;90444:2;90538;90531:22;90342:216;;-1:-1;90342:216;90565:304;;-1:-1;;;;;90716:6;90713:30;90710:2;;;90756:1;90753;90746:12;90710:2;-1:-1;90791:4;90779:17;;;90844:15;;90647:222;91498:151;91622:4;91613:14;;91570:79;91972:137;92075:12;;92046:63;93007:178;93125:19;;;93174:4;93165:14;;93118:67;94217:91;;94279:24;94297:5;94279:24;;94315:85;94381:13;94374:21;;94357:43;94407:72;94469:5;94452:27;94486:121;-1:-1;;;;;94548:54;;94531:76;94693:81;94764:4;94753:16;;94736:38;94781:104;94853:26;94842:38;;94825:60;94892:129;;94979:37;95010:5;95028:173;;95133:63;95190:5;95133:63;;95349:112;;95434:22;95450:5;95434:22;;95712:145;95793:6;95788:3;95783;95770:30;-1:-1;95849:1;95831:16;;95824:27;95763:94;95866:268;95931:1;95938:101;95952:6;95949:1;95946:13;95938:101;;;96019:11;;;96013:18;96000:11;;;95993:39;95974:2;95967:10;95938:101;;;96054:6;96051:1;96048:13;96045:2;;;-1:-1;;96119:1;96101:16;;96094:27;95915:219;96304:97;96392:2;96372:14;-1:-1;;96368:28;;96352:49;96409:117;96478:24;96496:5;96478:24;;;96471:5;96468:35;96458:2;;96517:1;96514;96507:12;96533:111;96599:21;96614:5;96599:21;;96651:117;96720:24;96738:5;96720:24;
Swarm Source
bzzr://c2078afaddac6695852aa138a2cd72d0c16e4b8d432fc137733eb0827c2af50f
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.