ERC-20
Overview
Max Total Supply
1,280 bBTC50
Holders
20
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
POWToken
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-03 */ // Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.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); } // Dependency file: @openzeppelin/contracts/math/SafeMath.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; } } // Dependency file: @openzeppelin/contracts/utils/Address.sol // pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [// importANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * // importANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // Dependency file: @openzeppelin/contracts/token/ERC20/SafeERC20.sol // pragma solidity ^0.5.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/math/SafeMath.sol"; // import "@openzeppelin/contracts/utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Dependency file: contracts/interfaces/IStaking.sol // pragma solidity >=0.5.0; interface IStaking { function incomeRateChanged() external; function rewardRateChanged() external; function hashRateToken() external view returns(address); function totalSupply() external view returns(uint256); } // Dependency file: contracts/interfaces/IMineParam.sol // pragma solidity >=0.5.0; interface IMineParam { function minePrice() external view returns (uint256); function getMinePrice() external view returns (uint256); function mineIncomePerTPerSecInWei() external view returns(uint256); function incomePerTPerSecInWei() external view returns(uint256); function setIncomePerTPerSecInWeiAndUpdateMinePrice(uint256 _incomePerTPerSecInWei) external; function updateMinePrice() external; function paramSetter() external view returns(address); function addListener(address _listener) external; function removeListener(address _listener) external returns(bool); } // Dependency file: contracts/interfaces/ILpStaking.sol // pragma solidity >=0.5.0; interface ILpStaking { function stakingLpToken() external view returns (address); function totalSupply() external view returns(uint256); } // Dependency file: contracts/interfaces/ITokenTreasury.sol // pragma solidity >=0.5.0; interface ITokenTreasury { function claim(address _token, uint _amount) external; } // Dependency file: contracts/modules/Pausable.sol // pragma solidity >=0.5.0; contract Pausable { event Paused(); event Unpaused(); bool private _paused; /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function _pause() internal { _paused = true; emit Paused(); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function _unpause() internal { _paused = false; emit Unpaused(); } } // Dependency file: contracts/modules/POWERC20.sol // pragma solidity >=0.5.0; // import "@openzeppelin/contracts/math/SafeMath.sol"; // import 'contracts/modules/Pausable.sol'; contract POWERC20 is Pausable{ using SafeMath for uint; string public name; string public symbol; uint8 public constant decimals = 18; uint public totalSupply; mapping(address => uint) public balanceOf; mapping(address => mapping(address => uint)) public allowance; bytes32 public DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function initializeToken(string memory tokenName, string memory tokenSymbol) internal { name = tokenName; symbol = tokenSymbol; uint chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256(bytes('1')), chainId, address(this) ) ); } function _mint(address to, uint value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint value) internal { balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve(address owner, address spender, uint value) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer(address from, address to, uint value) private { balanceOf[from] = balanceOf[from].sub(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function approve(address spender, uint value) external returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint value) external whenNotPaused returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom(address from, address to, uint value) whenNotPaused external returns (bool) { if (allowance[from][msg.sender] != uint(-1)) { allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); } _transfer(from, to, value); return true; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'HashRateERC20: EXPIRED'); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, 'HashRateERC20: INVALID_SIGNATURE'); _approve(owner, spender, value); } } // Dependency file: contracts/modules/Ownable.sol // pragma solidity >=0.5.0; contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() public { owner = msg.sender; } modifier onlyOwner() { require(msg.sender == owner, 'Ownable: FORBIDDEN'); _; } function transferOwnership(address newOwner) external onlyOwner { require(newOwner != address(0), "new owner is the zero address"); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } // Dependency file: contracts/modules/Paramable.sol // pragma solidity >=0.5.0; // import 'contracts/modules/Ownable.sol'; contract Paramable is Ownable { address public paramSetter; event ParamSetterChanged(address indexed previousSetter, address indexed newSetter); constructor() public { paramSetter = msg.sender; } modifier onlyParamSetter() { require(msg.sender == owner || msg.sender == paramSetter, "!paramSetter"); _; } function setParamSetter(address _paramSetter) external onlyOwner { require(_paramSetter != address(0), "param setter is the zero address"); emit ParamSetterChanged(paramSetter, _paramSetter); paramSetter = _paramSetter; } } // Dependency file: contracts/interfaces/IERC20Detail.sol // pragma solidity >=0.5.0; interface IERC20Detail { function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); } // Dependency file: contracts/interfaces/ISwapPair.sol // pragma solidity >=0.5.0; interface ISwapPair { function totalSupply() external view returns(uint256); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); } // Root file: contracts/POWToken.sol pragma solidity >=0.5.0; // import '/Users/tercel/work/bmining/bmining-protocol/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol'; // import '/Users/tercel/work/bmining/bmining-protocol/node_modules/@openzeppelin/contracts/token/ERC20/SafeERC20.sol'; // import "@openzeppelin/contracts/math/SafeMath.sol"; // import 'contracts/interfaces/IStaking.sol'; // import 'contracts/interfaces/IMineParam.sol'; // import 'contracts/interfaces/ILpStaking.sol'; // import 'contracts/interfaces/ITokenTreasury.sol'; // import 'contracts/modules/POWERC20.sol'; // import 'contracts/modules/Paramable.sol'; // import "contracts/interfaces/IERC20Detail.sol"; // import 'contracts/interfaces/ISwapPair.sol'; contract POWToken is Paramable, POWERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; bool internal initialized; address public minter; address public stakingPool; address public mineParam; address public treasury; uint256 public elecPowerPerTHSec; uint256 public startMiningTime; uint256 public electricCharge; uint256 public minerPoolFeeNumerator; uint256 public depreciationNumerator; uint256 public workingRateNumerator; uint256 public workingHashRate; uint256 public totalHashRate; uint256 public workerNumLastUpdateTime; address public incomeToken; uint256 public incomeRate; address public rewardsToken; uint256 public rewardRate; uint256 public rewardsDuration; uint256 public rewardPeriodFinish; address[] public stakings; mapping(address => uint256) public stakingRewardWeight; uint256 public stakingRewardWeightTotal; mapping(address => uint256) public lpStakingIncomeWeight; uint256 public lpStakingIncomeWeightTotal; mapping(address => uint256) public stakingType; // 0: unknown, 1: normal erc20 token, 2: LP token function initialize(string memory name, string memory symbol, address _stakingPool, address _lpStakingPool, address _lpStakingPool2, address _minter, address _mineParam, address _incomeToken, address _rewardsToken, address _treasury, uint256 _elecPowerPerTHSec, uint256 _electricCharge, uint256 _minerPoolFeeNumerator, uint256 _totalHashRate) public { require(!initialized, "Token already initialized"); require(_minerPoolFeeNumerator < 1000000, "nonlegal minerPoolFeeNumerator."); initialized = true; initializeToken(name, symbol); stakingPool = _stakingPool; // POWStaking address _setStakingPool(stakingPool, 1); _setStakingPool(_lpStakingPool, 2); _setStakingPool(_lpStakingPool2, 2); minter = _minter; // TokenExchange address mineParam = _mineParam; incomeToken = _incomeToken; rewardsToken = _rewardsToken; treasury = _treasury; elecPowerPerTHSec = _elecPowerPerTHSec; startMiningTime = block.timestamp; electricCharge = _electricCharge; minerPoolFeeNumerator = _minerPoolFeeNumerator; totalHashRate = _totalHashRate; rewardsDuration = 30 days; depreciationNumerator = 1000000; workingHashRate = _totalHashRate; workerNumLastUpdateTime = startMiningTime; updateIncomeRate(); } function isStakingPool(address _pool) public view returns (bool) { return stakingType[_pool] != 0; } function setStakingPools(address[] calldata _pools, uint256[] calldata _values) external onlyOwner { require(_pools.length == _values.length, 'invalid parameters'); for(uint256 i; i< _pools.length; i++) { _setStakingPool(_pools[i], _values[i]); } updateStakingPoolsIncome(); updateStakingPoolsReward(); } function setStakingPool(address _pool, uint256 _value) external onlyOwner { _setStakingPool(_pool, _value); updateStakingPoolsIncome(); updateStakingPoolsReward(); } function _setStakingPool(address _pool, uint256 _value) internal { if(_pool != address(0)) { stakingType[_pool] = _value; if(foundStaking(_pool) == false) { stakings.push(_pool); } } } function foundStaking(address _pool) public view returns (bool) { for(uint256 i; i< stakings.length; i++) { if(stakings[i] == _pool) { return true; } } return false; } function countStaking() public view returns (uint256) { return stakings.length; } function setStakingRewardWeights(address[] calldata _pools, uint256[] calldata _values) external onlyParamSetter { require(_pools.length == _values.length, "illegal parameters"); updateStakingPoolsReward(); for(uint256 i; i<_pools.length; i++) { _setStakingRewardWeight(_pools[i], _values[i]); } } function setStakingRewardWeight(address _pool, uint256 _value) external onlyParamSetter { updateStakingPoolsReward(); _setStakingRewardWeight(_pool, _value); } function _setStakingRewardWeight(address _pool, uint256 _value) internal { require(isStakingPool(_pool), "illegal pool"); stakingRewardWeightTotal = stakingRewardWeightTotal.sub(stakingRewardWeight[_pool]).add(_value); stakingRewardWeight[_pool] = _value; } function getStakingRewardRate(address _pool) public view returns(uint256) { if(stakingRewardWeightTotal == 0) { return 0; } return rewardRate.mul(stakingRewardWeight[_pool]).div(stakingRewardWeightTotal); } function setLpStakingIncomeWeights(address[] calldata _pools, uint256[] calldata _values) external onlyParamSetter { require(_pools.length == _values.length, "illegal parameters"); updateStakingPoolsIncome(); for(uint256 i; i<_pools.length; i++) { _setLpStakingIncomeWeight(_pools[i], _values[i]); } } function setLpStakingIncomeWeight(address _pool, uint256 _value) external onlyParamSetter { updateStakingPoolsIncome(); _setLpStakingIncomeWeight(_pool, _value); } function _setLpStakingIncomeWeight(address _pool, uint256 _value) internal { require(stakingType[_pool] == 2, "illegal pool"); lpStakingIncomeWeightTotal = lpStakingIncomeWeightTotal.sub(lpStakingIncomeWeight[_pool]).add(_value); lpStakingIncomeWeight[_pool] = _value; } function getLpStakingSupply(address _pool) public view returns(uint256) { if(totalSupply == 0 || stakingType[_pool] != 2 || lpStakingIncomeWeightTotal == 0) { return 0; } uint256 poolAmount; uint256 windfallAmount; { uint256 stakingPoolSupply; if (stakingPool != address(0)) { stakingPoolSupply = IStaking(stakingPool).totalSupply(); } uint256 poolsTotal; uint256 unknown; (poolAmount, poolsTotal) = getLpStakingsReserve(_pool); if(totalSupply > stakingPoolSupply.add(poolsTotal)) { unknown = totalSupply.sub(stakingPoolSupply).sub(poolsTotal); } windfallAmount = unknown.mul(lpStakingIncomeWeight[_pool]).div(lpStakingIncomeWeightTotal); } return poolAmount.add(windfallAmount); } function getLpStakingsReserve(address _pool) public view returns (uint256, uint256) { uint256 total; uint256 amount; for (uint256 i; i<stakings.length; i++) { if(stakingType[stakings[i]] == 2) { uint256 _amount = getLpStakingReserve(stakings[i]); total = total.add(_amount); if(_pool == stakings[i]) { amount = _amount; } } } return (amount, total); } function getLpStakingReserve(address _pool) public view returns (uint256) { address pair = ILpStaking(_pool).stakingLpToken(); if(pair == address(0)) { return 0; } uint256 reserve = getReserveFromLp(pair); if(reserve == 0) { return 0; } uint256 stakingAmount = ILpStaking(_pool).totalSupply(); uint256 pairTotal = ISwapPair(pair).totalSupply(); if(pairTotal > 0 && reserve.mul(stakingAmount) > pairTotal) { return reserve.mul(stakingAmount).div(pairTotal); } return 0; } function getReserveFromLp(address _pair) public view returns (uint256) { address token0 = ISwapPair(_pair).token0(); address token1 = ISwapPair(_pair).token1(); (uint256 reserve0, uint256 reserve1, ) = ISwapPair(_pair).getReserves(); if (token0 == address(this)) { return reserve0; } else if (token1 == address(this)) { return reserve1; } return 0; } function setTreasury(address _treasury) external onlyOwner { treasury = _treasury; } function pause() onlyOwner external { _pause(); } function unpause() onlyOwner external { _unpause(); } function weiToIncomeTokenValue(uint256 amount) public view returns (uint256) { uint256 decimals = 18; if(incomeToken != address(0)) { decimals = uint256(IERC20Detail(incomeToken).decimals()); } if(decimals < 18) { uint diff = 18 - decimals; amount = amount.div(10**diff); } else if(decimals > 18) { uint diff = decimals - 18; amount = amount.mul(10**diff); } return amount; } function remainingAmount() public view returns(uint256) { return totalHashRate.mul(1e18).sub(totalSupply); } function mint(address to, uint value) external whenNotPaused { require(msg.sender == minter, "!minter"); require(value <= remainingAmount(), "not sufficient supply."); _mint(to, value); updateStakingPoolsIncome(); } function setMinter(address _minter) external onlyParamSetter { require(minter != _minter, "same minter."); minter = _minter; } function addHashRate(uint256 hashRate) external onlyParamSetter { require(hashRate > 0, "hashRate cannot be 0"); // should keep current workingRate and incomeRate unchanged. totalHashRate = totalHashRate.add(hashRate.mul(totalHashRate).div(workingHashRate)); workingHashRate = workingHashRate.add(hashRate); } function setMineParam(address _mineParam) external onlyParamSetter { require(mineParam != _mineParam, "same mineParam."); mineParam = _mineParam; updateIncomeRate(); } function setStartMiningTime(uint256 _startMiningTime) external onlyParamSetter { require(startMiningTime != _startMiningTime, "same startMiningTime."); require(startMiningTime > block.timestamp, "already start mining."); require(_startMiningTime > block.timestamp, "nonlegal startMiningTime."); startMiningTime = _startMiningTime; workerNumLastUpdateTime = _startMiningTime; } function setElectricCharge(uint256 _electricCharge) external onlyParamSetter { require(electricCharge != _electricCharge, "same electricCharge."); electricCharge = _electricCharge; updateIncomeRate(); } function setMinerPoolFeeNumerator(uint256 _minerPoolFeeNumerator) external onlyParamSetter { require(minerPoolFeeNumerator != _minerPoolFeeNumerator, "same minerPoolFee."); require(_minerPoolFeeNumerator < 1000000, "nonlegal minerPoolFee."); minerPoolFeeNumerator = _minerPoolFeeNumerator; updateIncomeRate(); } function setDepreciationNumerator(uint256 _depreciationNumerator) external onlyParamSetter { require(depreciationNumerator != _depreciationNumerator, "same depreciationNumerator."); require(_depreciationNumerator <= 1000000, "nonlegal depreciation."); depreciationNumerator = _depreciationNumerator; updateIncomeRate(); } function setWorkingHashRate(uint256 _workingHashRate) external onlyParamSetter { require(workingHashRate != _workingHashRate, "same workingHashRate."); //require(totalHashRate >= _workingHashRate, "param workingHashRate not legal."); if (block.timestamp > startMiningTime) { workingRateNumerator = getHistoryWorkingRate(); workerNumLastUpdateTime = block.timestamp; } workingHashRate = _workingHashRate; updateIncomeRate(); } function getHistoryWorkingRate() public view returns (uint256) { if (block.timestamp > startMiningTime) { uint256 time_interval = block.timestamp.sub(workerNumLastUpdateTime); uint256 totalRate = workerNumLastUpdateTime.sub(startMiningTime).mul(workingRateNumerator).add(time_interval.mul(getCurWorkingRate())); uint256 totalTime = block.timestamp.sub(startMiningTime); return totalRate.div(totalTime); } return 0; } function getCurWorkingRate() public view returns (uint256) { return 1000000 * workingHashRate / totalHashRate; } function getPowerConsumptionMineInWeiPerSec() public view returns(uint256){ uint256 minePrice = IMineParam(mineParam).minePrice(); if (minePrice != 0) { uint256 Base = 1e18; uint256 elecPowerPerTHSecAmplifier = 1000; uint256 powerConsumptionPerHour = elecPowerPerTHSec.mul(Base).div(elecPowerPerTHSecAmplifier).div(1000); uint256 powerConsumptionMineInWeiPerHour = powerConsumptionPerHour.mul(electricCharge).div(1000000).div(minePrice); return powerConsumptionMineInWeiPerHour.div(3600); } return 0; } function getIncomeMineInWeiPerSec() public view returns(uint256){ uint256 paramDenominator = 1000000; uint256 afterMinerPoolFee = 0; { uint256 mineIncomePerTPerSecInWei = IMineParam(mineParam).mineIncomePerTPerSecInWei(); afterMinerPoolFee = mineIncomePerTPerSecInWei.mul(paramDenominator.sub(minerPoolFeeNumerator)).div(paramDenominator); } uint256 afterDepreciation = 0; { afterDepreciation = afterMinerPoolFee.mul(depreciationNumerator).div(paramDenominator); } return afterDepreciation; } function updateIncomeRate() public { //not start mining yet. if (block.timestamp > startMiningTime) { // update income first. updateStakingPoolsIncome(); } uint256 oldValue = incomeRate; //compute electric charge. uint256 powerConsumptionMineInWeiPerSec = getPowerConsumptionMineInWeiPerSec(); //compute mine income uint256 incomeMineInWeiPerSec = getIncomeMineInWeiPerSec(); if (incomeMineInWeiPerSec > powerConsumptionMineInWeiPerSec) { uint256 targetRate = incomeMineInWeiPerSec.sub(powerConsumptionMineInWeiPerSec); incomeRate = targetRate.mul(workingHashRate).div(totalHashRate); } //miner close down. else { incomeRate = 0; } emit IncomeRateChanged(oldValue, incomeRate); } function updateStakingPoolsIncome() public { for (uint256 i; i<stakings.length; i++) { if(msg.sender != stakings[i] && isStakingPool(stakings[i]) && address(this) == IStaking(stakings[i]).hashRateToken()) { IStaking(stakings[i]).incomeRateChanged(); } } } function updateStakingPoolsReward() public { for (uint256 i; i<stakings.length; i++) { if(msg.sender != stakings[i] && isStakingPool(stakings[i]) && address(this) == IStaking(stakings[i]).hashRateToken()) { IStaking(stakings[i]).rewardRateChanged(); } } } function _setRewardRate(uint256 _rewardRate) internal { updateStakingPoolsReward(); emit RewardRateChanged(rewardRate, _rewardRate); rewardRate = _rewardRate; rewardPeriodFinish = block.timestamp.add(rewardsDuration); } function setRewardRate(uint256 _rewardRate) external onlyParamSetter { _setRewardRate(_rewardRate); } function getRewardRateByReward(uint256 reward) public view returns (uint256) { if (block.timestamp >= rewardPeriodFinish) { return reward.div(rewardsDuration); } else { // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow. uint256 remaining = rewardPeriodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); return reward.add(leftover).div(rewardsDuration); } } function notifyRewardAmount(uint256 reward) external onlyParamSetter { uint _rewardRate = getRewardRateByReward(reward); _setRewardRate(_rewardRate); // Ensure the provided reward amount is not more than the balance in the contract. // This keeps the reward rate in the right range, preventing overflows due to // very high values of rewardRate in the earned and rewardsPerToken functions; uint balance = IERC20(rewardsToken).balanceOf(address(this)); require(rewardRate <= balance.div(rewardsDuration), "Provided reward too high"); emit RewardAdded(reward); } function takeFromTreasury(address token, uint256 amount) internal { if(treasury == address(0)) { return; } uint256 balance; if (token == address(0)) { balance = address(this).balance; } else { balance = IERC20(token).balanceOf(address(this)); } if(amount > balance) { ITokenTreasury(treasury).claim(token, amount.sub(balance)); } } function claimIncome(address to, uint256 amount) external payable { require(to != address(0), "to is the zero address"); require(isStakingPool(msg.sender), "No permissions"); takeFromTreasury(incomeToken, amount); if (incomeToken == address(0)) { safeTransferETH(to, amount); } else { IERC20(incomeToken).safeTransfer(to, amount); } } function claimReward(address to, uint256 amount) external { require(to != address(0), "to is the zero address"); require(isStakingPool(msg.sender), "No permissions"); takeFromTreasury(rewardsToken, amount); if (rewardsToken == address(0)) { safeTransferETH(to, amount); } else { IERC20(rewardsToken).safeTransfer(to, amount); } } function inCaseTokensGetStuck(address _token, uint256 _amount) external onlyOwner { if (_token == address(0)) { safeTransferETH(msg.sender, _amount); } else { IERC20(_token).safeTransfer(msg.sender, _amount); } } function depositeETH() external payable { emit DepositedETH(msg.sender, msg.value); } function safeTransferETH(address to, uint amount) internal { address(uint160(to)).transfer(amount); } function () external payable { } event IncomeRateChanged(uint256 oldValue, uint256 newValue); event RewardAdded(uint256 reward); event RewardRateChanged(uint256 oldValue, uint256 newValue); event DepositedETH(address indexed _user, uint256 _amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"DepositedETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"IncomeRateChanged","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":true,"internalType":"address","name":"previousSetter","type":"address"},{"indexed":true,"internalType":"address","name":"newSetter","type":"address"}],"name":"ParamSetterChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"RewardRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"hashRate","type":"uint256"}],"name":"addHashRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimIncome","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"countStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"depositeETH","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"depreciationNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"elecPowerPerTHSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"electricCharge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"foundStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurWorkingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getHistoryWorkingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIncomeMineInWeiPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"getLpStakingReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"getLpStakingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"getLpStakingsReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPowerConsumptionMineInWeiPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"getReserveFromLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"getRewardRateByReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"getStakingRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"incomeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"incomeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_stakingPool","type":"address"},{"internalType":"address","name":"_lpStakingPool","type":"address"},{"internalType":"address","name":"_lpStakingPool2","type":"address"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"address","name":"_mineParam","type":"address"},{"internalType":"address","name":"_incomeToken","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_elecPowerPerTHSec","type":"uint256"},{"internalType":"uint256","name":"_electricCharge","type":"uint256"},{"internalType":"uint256","name":"_minerPoolFeeNumerator","type":"uint256"},{"internalType":"uint256","name":"_totalHashRate","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"isStakingPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpStakingIncomeWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lpStakingIncomeWeightTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mineParam","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minerPoolFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","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":true,"inputs":[],"name":"paramSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"remainingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPeriodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_depreciationNumerator","type":"uint256"}],"name":"setDepreciationNumerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_electricCharge","type":"uint256"}],"name":"setElectricCharge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setLpStakingIncomeWeight","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"setLpStakingIncomeWeights","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_mineParam","type":"address"}],"name":"setMineParam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minerPoolFeeNumerator","type":"uint256"}],"name":"setMinerPoolFeeNumerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_paramSetter","type":"address"}],"name":"setParamSetter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardRate","type":"uint256"}],"name":"setRewardRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setStakingPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"setStakingPools","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setStakingRewardWeight","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"setStakingRewardWeights","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_startMiningTime","type":"uint256"}],"name":"setStartMiningTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_workingHashRate","type":"uint256"}],"name":"setWorkingHashRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingRewardWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingRewardWeightTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakings","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startMiningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalHashRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateIncomeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateStakingPoolsIncome","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateStakingPoolsReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"weiToIncomeTokenValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"workerNumLastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"workingHashRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"workingRateNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260008054336001600160a01b03199182168117835560018054909216179055614ce290819061003390396000f3fe6080604052600436106104b55760003560e01c806375033a841161026b578063bc66ce0a1161014f578063dd62ed3e116100c1578063f45b242f11610085578063f45b242f14611419578063f6e15f0414611452578063f8463b2114611467578063fa7be18c1461147c578063fca3b5aa14611491578063ff8b74d7146114c4576104b5565b8063dd62ed3e1461132a578063e0c891b114611365578063eb6ee0a11461139e578063f0f44260146113b3578063f2fde38b146113e6576104b5565b8063d1af0c7d11610113578063d1af0c7d14611230578063d505accf14611245578063d7b44d02146112a3578063d840ce0e146112d6578063da13285714611300578063da3b6b3514611315576104b5565b8063bc66ce0a14611179578063c232e1c81461118e578063c4f0c1fc146111a3578063c6d758cb146111cd578063ca0e192d14611206576104b5565b80639e447fc6116101e8578063aa3166b4116101ac578063aa3166b4146110a1578063b0eb1093146110d4578063b48ffbb1146110e9578063b62bda15146110fe578063b728926214611131578063b826595d14611146576104b5565b80639e447fc614610fff578063a50a1fe614611029578063a77bce9d1461103e578063a9059cbb14611053578063aa3119ee1461108c576104b5565b80638456cb591161022f5780638456cb5914610f815780638da5cb5b14610f9657806395d89b4114610fab5780639a29160914610fc05780639dabe39d14610fd5576104b5565b806375033a8414610ebe5780637a776b5114610ef15780637b0a47ee14610f245780637ecebe0014610f39578063836ee4f514610f6c576104b5565b80633437a7f71161039d578063481d0fb41161030f5780636117d0a9116102d35780636117d0a914610d5557806361d027b314610d81578063627ec05214610d965780636b9e499c14610dab5780636d32641b14610dc057806370a0823114610e8b576104b5565b8063481d0fb414610c18578063549b768814610c2d5780635b4d997114610cf85780635c975abb14610d0d5780635ea06e5e14610d22576104b5565b80633f4ba83a116103615780633f4ba83a14610b4357806340c10f1914610b58578063415e2f2c14610b915780634430dfce14610ba65780634460b4df14610bbb578063465656fa14610be5576104b5565b80633437a7f7146108915780633497d5a614610a245780633644e51514610aef578063386a952514610b045780633c6b16ab14610b19576104b5565b806317e0ab8911610436578063252ac138116103fa578063252ac1381461079c578063279084a6146107e85780632a5a771d146107fd57806330adf81f14610827578063313ce5671461083c57806331d9cbf814610867576104b5565b806317e0ab89146106f057806317fd06a21461070557806318160ddd1461072f5780631b75fbe81461074457806323b872dd14610759576104b5565b80630c56ae3b1161047d5780630c56ae3b14610637578063104a41a71461064c57806310a3bae914610685578063132c2614146106af578063174e31c4146106b7576104b5565b806304fcbe0e146104b7578063069b0822146104fc57806306fdde031461054357806307546172146105cd578063095ea7b3146105fe575b005b3480156104c357600080fd5b506104ea600480360360208110156104da57600080fd5b50356001600160a01b03166114f7565b60408051918252519081900360200190f35b34801561050857600080fd5b5061052f6004803603602081101561051f57600080fd5b50356001600160a01b0316611509565b604080519115158252519081900360200190f35b34801561054f57600080fd5b5061055861152a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561059257818101518382015260200161057a565b50505050905090810190601f1680156105bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105d957600080fd5b506105e26115b5565b604080516001600160a01b039092168252519081900360200190f35b34801561060a57600080fd5b5061052f6004803603604081101561062157600080fd5b506001600160a01b0381351690602001356115c9565b34801561064357600080fd5b506105e26115e0565b34801561065857600080fd5b506104b56004803603604081101561066f57600080fd5b506001600160a01b0381351690602001356115ef565b34801561069157600080fd5b506104ea600480360360208110156106a857600080fd5b5035611668565b6104b5611756565b3480156106c357600080fd5b506104b5600480360360408110156106da57600080fd5b506001600160a01b03813516906020013561178e565b3480156106fc57600080fd5b506104ea61187f565b34801561071157600080fd5b506104b56004803603602081101561072857600080fd5b5035611885565b34801561073b57600080fd5b506104ea611961565b34801561075057600080fd5b506104b5611967565b34801561076557600080fd5b5061052f6004803603606081101561077c57600080fd5b506001600160a01b03813581169160208101359091169060400135611a29565b3480156107a857600080fd5b506107cf600480360360208110156107bf57600080fd5b50356001600160a01b0316611b18565b6040805192835260208301919091528051918290030190f35b3480156107f457600080fd5b506104ea611bed565b34801561080957600080fd5b506104b56004803603602081101561082057600080fd5b5035611bf3565b34801561083357600080fd5b506104ea611ceb565b34801561084857600080fd5b50610851611d0f565b6040805160ff9092168252519081900360200190f35b34801561087357600080fd5b506104b56004803603602081101561088a57600080fd5b5035611d14565b34801561089d57600080fd5b506104b560048036036101c08110156108b557600080fd5b810190602081018135600160201b8111156108cf57600080fd5b8201836020820111156108e157600080fd5b803590602001918460018302840111600160201b8311171561090257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561095457600080fd5b82018360208201111561096657600080fd5b803590602001918460018302840111600160201b8311171561098757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335811694506020840135811693604081013582169350606081013582169250608081013582169160a082013581169160c081013582169160e082013516906101008101359061012081013590610140810135906101600135611e72565b348015610a3057600080fd5b506104b560048036036040811015610a4757600080fd5b810190602081018135600160201b811115610a6157600080fd5b820183602082011115610a7357600080fd5b803590602001918460208302840111600160201b83111715610a9457600080fd5b919390929091602081019035600160201b811115610ab157600080fd5b820183602082011115610ac357600080fd5b803590602001918460208302840111600160201b83111715610ae457600080fd5b50909250905061202a565b348015610afb57600080fd5b506104ea61212f565b348015610b1057600080fd5b506104ea612135565b348015610b2557600080fd5b506104b560048036036020811015610b3c57600080fd5b503561213b565b348015610b4f57600080fd5b506104b56122d0565b348015610b6457600080fd5b506104b560048036036040811015610b7b57600080fd5b506001600160a01b03813516906020013561232e565b348015610b9d57600080fd5b506104ea612435565b348015610bb257600080fd5b506104ea61243c565b348015610bc757600080fd5b506104b560048036036020811015610bde57600080fd5b5035612442565b348015610bf157600080fd5b506104ea60048036036020811015610c0857600080fd5b50356001600160a01b031661255a565b348015610c2457600080fd5b506105e261256c565b348015610c3957600080fd5b506104b560048036036040811015610c5057600080fd5b810190602081018135600160201b811115610c6a57600080fd5b820183602082011115610c7c57600080fd5b803590602001918460208302840111600160201b83111715610c9d57600080fd5b919390929091602081019035600160201b811115610cba57600080fd5b820183602082011115610ccc57600080fd5b803590602001918460208302840111600160201b83111715610ced57600080fd5b50909250905061257b565b348015610d0457600080fd5b506104ea612679565b348015610d1957600080fd5b5061052f61267f565b348015610d2e57600080fd5b506104b560048036036020811015610d4557600080fd5b50356001600160a01b031661268f565b6104b560048036036040811015610d6b57600080fd5b506001600160a01b03813516906020013561276a565b348015610d8d57600080fd5b506105e2612856565b348015610da257600080fd5b506104ea612865565b348015610db757600080fd5b506104ea612917565b348015610dcc57600080fd5b506104b560048036036040811015610de357600080fd5b810190602081018135600160201b811115610dfd57600080fd5b820183602082011115610e0f57600080fd5b803590602001918460208302840111600160201b83111715610e3057600080fd5b919390929091602081019035600160201b811115610e4d57600080fd5b820183602082011115610e5f57600080fd5b803590602001918460208302840111600160201b83111715610e8057600080fd5b50909250905061291d565b348015610e9757600080fd5b506104ea60048036036020811015610eae57600080fd5b50356001600160a01b0316612a1b565b348015610eca57600080fd5b506104ea60048036036020811015610ee157600080fd5b50356001600160a01b0316612a2d565b348015610efd57600080fd5b506104ea60048036036020811015610f1457600080fd5b50356001600160a01b0316612bde565b348015610f3057600080fd5b506104ea612bf0565b348015610f4557600080fd5b506104ea60048036036020811015610f5c57600080fd5b50356001600160a01b0316612bf6565b348015610f7857600080fd5b506104b5612c08565b348015610f8d57600080fd5b506104b5612d7b565b348015610fa257600080fd5b506105e2612dd7565b348015610fb757600080fd5b50610558612de6565b348015610fcc57600080fd5b506104ea612e41565b348015610fe157600080fd5b506104b560048036036020811015610ff857600080fd5b5035612e5b565b34801561100b57600080fd5b506104b56004803603602081101561102257600080fd5b5035612f19565b34801561103557600080fd5b506104ea612f85565b34801561104a57600080fd5b506104ea612fbb565b34801561105f57600080fd5b5061052f6004803603604081101561107657600080fd5b506001600160a01b0381351690602001356130ba565b34801561109857600080fd5b506104ea61311a565b3480156110ad57600080fd5b506104b5600480360360208110156110c457600080fd5b50356001600160a01b0316613120565b3480156110e057600080fd5b506104ea61322b565b3480156110f557600080fd5b506104ea613231565b34801561110a57600080fd5b5061052f6004803603602081101561112157600080fd5b50356001600160a01b0316613237565b34801561113d57600080fd5b506104ea613292565b34801561115257600080fd5b506104ea6004803603602081101561116957600080fd5b50356001600160a01b0316613298565b34801561118557600080fd5b506105e261340b565b34801561119a57600080fd5b506104ea61341a565b3480156111af57600080fd5b506105e2600480360360208110156111c657600080fd5b5035613420565b3480156111d957600080fd5b506104b5600480360360408110156111f057600080fd5b506001600160a01b038135169060200135613447565b34801561121257600080fd5b506104ea6004803603602081101561122957600080fd5b50356134cd565b34801561123c57600080fd5b506105e2613545565b34801561125157600080fd5b506104b5600480360360e081101561126857600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613554565b3480156112af57600080fd5b506104ea600480360360208110156112c657600080fd5b50356001600160a01b031661375a565b3480156112e257600080fd5b506104b5600480360360208110156112f957600080fd5b5035613915565b34801561130c57600080fd5b506104ea613a21565b34801561132157600080fd5b506104ea613ae5565b34801561133657600080fd5b506104ea6004803603604081101561134d57600080fd5b506001600160a01b0381358116916020013516613aeb565b34801561137157600080fd5b506104b56004803603604081101561138857600080fd5b506001600160a01b038135169060200135613b08565b3480156113aa57600080fd5b506105e2613b76565b3480156113bf57600080fd5b506104b5600480360360208110156113d657600080fd5b50356001600160a01b0316613b85565b3480156113f257600080fd5b506104b56004803603602081101561140957600080fd5b50356001600160a01b0316613bfb565b34801561142557600080fd5b506104b56004803603604081101561143c57600080fd5b506001600160a01b038135169060200135613d05565b34801561145e57600080fd5b506104ea613d7a565b34801561147357600080fd5b506104b5613d80565b34801561148857600080fd5b506104ea613ed9565b34801561149d57600080fd5b506104b5600480360360208110156114b457600080fd5b50356001600160a01b0316613edf565b3480156114d057600080fd5b506104ea600480360360208110156114e757600080fd5b50356001600160a01b0316613fc1565b601f6020526000908152604090205481565b6001600160a01b03811660009081526021602052604090205415155b919050565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156115ad5780601f10611582576101008083540402835291602001916115ad565b820191906000526020600020905b81548152906001019060200180831161159057829003601f168201915b505050505081565b60095461010090046001600160a01b031681565b60006115d633848461400a565b5060015b92915050565b600a546001600160a01b031681565b6000546001600160a01b031633148061161257506001546001600160a01b031633145b611652576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b61165a613d80565b611664828261406c565b5050565b6016546000906012906001600160a01b0316156116ff57601660009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116cd57600080fd5b505afa1580156116e1573d6000803e3d6000fd5b505050506040513d60208110156116f757600080fd5b505160ff1690505b601281101561172957601281900361172184600a83900a63ffffffff61411d16565b93505061174f565b601281111561174f57601119810161174b84600a83900a63ffffffff61416616565b9350505b5090919050565b60408051348152905133917f81ad7215cbec0a1d55a48f38b34525d2b677147ee7ceb872ac23ecca5ec966e5919081900360200190a2565b6001600160a01b0382166117e2576040805162461bcd60e51b8152602060048201526016602482015275746f20697320746865207a65726f206164647265737360501b604482015290519081900360640190fd5b6117eb33611509565b61182d576040805162461bcd60e51b815260206004820152600e60248201526d4e6f207065726d697373696f6e7360901b604482015290519081900360640190fd5b601854611843906001600160a01b0316826141bf565b6018546001600160a01b03166118625761185d82826142f7565b611664565b601854611664906001600160a01b0316838363ffffffff61432d16565b60105481565b6000546001600160a01b03163314806118a857506001546001600160a01b031633145b6118e8576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b806013541415611937576040805162461bcd60e51b815260206004820152601560248201527439b0b6b2903bb7b935b4b733a430b9b42930ba329760591b604482015290519081900360640190fd5b600e5442111561195157611949612865565b601255426015555b601381905561195e611967565b50565b60045481565b600e5442111561197957611979613d80565b6017546000611986612fbb565b90506000611992613a21565b9050818111156119e05760006119ae828463ffffffff61437f16565b90506119d76014546119cb6013548461416690919063ffffffff16565b9063ffffffff61411d16565b601755506119e6565b60006017555b60175460408051858152602081019290925280517fbcdc19a9d06e9389ef3cac53244ab619448a240601652339b4adf14f6a844c2b9281900390910190a1505050565b600154600090600160a01b900460ff1615611a7e576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001600160a01b038416600090815260066020908152604080832033845290915290205460001914611b03576001600160a01b0384166000908152600660209081526040808320338452909152902054611ade908363ffffffff61437f16565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b611b0e8484846143c1565b5060019392505050565b60008060008060005b601c54811015611be35760216000601c8381548110611b3c57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460021415611bdb576000611b95601c8381548110611b7b57fe5b6000918252602090912001546001600160a01b031661375a565b9050611ba7848263ffffffff61447b16565b9350601c8281548110611bb657fe5b6000918252602090912001546001600160a01b0388811691161415611bd9578092505b505b600101611b21565b5092509050915091565b601b5481565b6000546001600160a01b0316331480611c1657506001546001600160a01b031633145b611c56576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b60008111611ca2576040805162461bcd60e51b8152602060048201526014602482015273068617368526174652063616e6e6f7420626520360641b604482015290519081900360640190fd5b611ccf611cc06013546119cb6014548561416690919063ffffffff16565b6014549063ffffffff61447b16565b601455601354611ce5908263ffffffff61447b16565b60135550565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000546001600160a01b0316331480611d3757506001546001600160a01b031633145b611d77576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b80600e541415611dc6576040805162461bcd60e51b815260206004820152601560248201527439b0b6b29039ba30b93a26b4b734b733aa34b6b29760591b604482015290519081900360640190fd5b42600e5411611e14576040805162461bcd60e51b815260206004820152601560248201527430b63932b0b23c9039ba30b93a1036b4b734b7339760591b604482015290519081900360640190fd5b428111611e68576040805162461bcd60e51b815260206004820152601960248201527f6e6f6e6c6567616c2073746172744d696e696e6754696d652e00000000000000604482015290519081900360640190fd5b600e819055601555565b60095460ff1615611eca576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c726561647920696e697469616c697a656400000000000000604482015290519081900360640190fd5b620f42408210611f21576040805162461bcd60e51b815260206004820152601f60248201527f6e6f6e6c6567616c206d696e6572506f6f6c4665654e756d657261746f722e00604482015290519081900360640190fd5b6009805460ff19166001179055611f388e8e6144d5565b600a80546001600160a01b0319166001600160a01b038e81169190911791829055611f65911660016145f9565b611f708b60026145f9565b611f7b8a60026145f9565b60098054610100600160a81b0319166101006001600160a01b038c81169190910291909117909155600b80546001600160a01b03199081168b8416179091556016805482168a8416179055601880548216898416179055600c8054909116918716919091179055600d84905542600e819055600f8490556010839055601482905562278d00601a55620f4240601155601382905560155561201a611967565b5050505050505050505050505050565b6000546001600160a01b031633148061204d57506001546001600160a01b031633145b61208d576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8281146120d6576040805162461bcd60e51b8152602060048201526012602482015271696c6c6567616c20706172616d657465727360701b604482015290519081900360640190fd5b6120de613d80565b60005b83811015612128576121208585838181106120f857fe5b905060200201356001600160a01b031684848481811061211457fe5b9050602002013561406c565b6001016120e1565b5050505050565b60075481565b601a5481565b6000546001600160a01b031633148061215e57506001546001600160a01b031633145b61219e576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b60006121a9826134cd565b90506121b481614681565b601854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156121ff57600080fd5b505afa158015612213573d6000803e3d6000fd5b505050506040513d602081101561222957600080fd5b5051601a5490915061224290829063ffffffff61411d16565b6019541115612298576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b6040805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b6000546001600160a01b03163314612324576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b61232c6146e5565b565b600154600160a01b900460ff1615612380576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60095461010090046001600160a01b031633146123ce576040805162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b604482015290519081900360640190fd5b6123d6612f85565b811115612423576040805162461bcd60e51b81526020600482015260166024820152753737ba1039bab33334b1b4b2b73a1039bab838363c9760511b604482015290519081900360640190fd5b61242d828261471d565b611664613d80565b601c545b90565b60135481565b6000546001600160a01b031633148061246557506001546001600160a01b031633145b6124a5576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8060115414156124fc576040805162461bcd60e51b815260206004820152601b60248201527f73616d6520646570726563696174696f6e4e756d657261746f722e0000000000604482015290519081900360640190fd5b620f424081111561254d576040805162461bcd60e51b81526020600482015260166024820152753737b73632b3b0b6103232b83932b1b4b0ba34b7b71760511b604482015290519081900360640190fd5b601181905561195e611967565b60216020526000908152604090205481565b600b546001600160a01b031681565b6000546001600160a01b031633146125cf576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b828114612618576040805162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172616d657465727360701b604482015290519081900360640190fd5b60005b838110156126625761265a85858381811061263257fe5b905060200201356001600160a01b031684848481811061264e57fe5b905060200201356145f9565b60010161261b565b5061266b613d80565b612673612c08565b50505050565b601e5481565b600154600160a01b900460ff1690565b6000546001600160a01b03163314806126b257506001546001600160a01b031633145b6126f2576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b600b546001600160a01b0382811691161415612747576040805162461bcd60e51b815260206004820152600f60248201526e39b0b6b29036b4b732a830b930b69760891b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b03831617905561195e611967565b6001600160a01b0382166127be576040805162461bcd60e51b8152602060048201526016602482015275746f20697320746865207a65726f206164647265737360501b604482015290519081900360640190fd5b6127c733611509565b612809576040805162461bcd60e51b815260206004820152600e60248201526d4e6f207065726d697373696f6e7360901b604482015290519081900360640190fd5b60165461281f906001600160a01b0316826141bf565b6016546001600160a01b03166128395761185d82826142f7565b601654611664906001600160a01b0316838363ffffffff61432d16565b600c546001600160a01b031681565b6000600e544211156129115760006128886015544261437f90919063ffffffff16565b905060006128dc6128a761289a612e41565b849063ffffffff61416616565b6128d06012546128c4600e5460155461437f90919063ffffffff16565b9063ffffffff61416616565b9063ffffffff61447b16565b905060006128f5600e544261437f90919063ffffffff16565b9050612907828263ffffffff61411d16565b9350505050612439565b50600090565b600f5481565b6000546001600160a01b031633148061294057506001546001600160a01b031633145b612980576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8281146129c9576040805162461bcd60e51b8152602060048201526012602482015271696c6c6567616c20706172616d657465727360701b604482015290519081900360640190fd5b6129d1612c08565b60005b8381101561212857612a138585838181106129eb57fe5b905060200201356001600160a01b0316848484818110612a0757fe5b905060200201356147b4565b6001016129d4565b60056020526000908152604090205481565b600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6957600080fd5b505afa158015612a7d573d6000803e3d6000fd5b505050506040513d6020811015612a9357600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0386169163d21220a7916004808301926020929190829003018186803b158015612adb57600080fd5b505afa158015612aef573d6000803e3d6000fd5b505050506040513d6020811015612b0557600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03881691630902f1ac91600480820192606092909190829003018186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6060811015612b7a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b038416301415612bb657509250611525915050565b6001600160a01b038316301415612bd257935061152592505050565b50600095945050505050565b601d6020526000908152604090205481565b60195481565b60086020526000908152604090205481565b60005b601c5481101561195e57601c8181548110612c2257fe5b6000918252602090912001546001600160a01b03163314801590612c6b5750612c6b601c8281548110612c5157fe5b6000918252602090912001546001600160a01b0316611509565b8015612d005750601c8181548110612c7f57fe5b6000918252602091829020015460408051638f72d54560e01b815290516001600160a01b0390921692638f72d54592600480840193829003018186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d6020811015612cf257600080fd5b50516001600160a01b031630145b15612d7357601c8181548110612d1257fe5b6000918252602082200154604080516390d0936960e01b815290516001600160a01b03909216926390d093699260048084019382900301818387803b158015612d5a57600080fd5b505af1158015612d6e573d6000803e3d6000fd5b505050505b600101612c0b565b6000546001600160a01b03163314612dcf576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b61232c61484d565b6000546001600160a01b031681565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156115ad5780601f10611582576101008083540402835291602001916115ad565b6000601454601354620f42400281612e5557fe5b04905090565b6000546001600160a01b0316331480612e7e57506001546001600160a01b031633145b612ebe576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b80600f541415612f0c576040805162461bcd60e51b815260206004820152601460248201527339b0b6b29032b632b1ba3934b1a1b430b933b29760611b604482015290519081900360640190fd5b600f81905561195e611967565b6000546001600160a01b0316331480612f3c57506001546001600160a01b031633145b612f7c576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b61195e81614681565b6000612fb6600454612faa670de0b6b3a764000060145461416690919063ffffffff16565b9063ffffffff61437f16565b905090565b600080600b60009054906101000a90046001600160a01b03166001600160a01b03166378f6e9986040518163ffffffff1660e01b815260040160206040518083038186803b15801561300c57600080fd5b505afa158015613020573d6000803e3d6000fd5b505050506040513d602081101561303657600080fd5b5051905080156130b257600d54670de0b6b3a7640000906103e89060009061306e9083906119cb90829082908863ffffffff61416616565b90506000613092856119cb620f42406119cb600f548761416690919063ffffffff16565b90506130a681610e1063ffffffff61411d16565b95505050505050612439565b600091505090565b600154600090600160a01b900460ff161561310f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6115d63384846143c1565b60175481565b6000546001600160a01b03163314613174576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b0381166131cf576040805162461bcd60e51b815260206004820181905260248201527f706172616d2073657474657220697320746865207a65726f2061646472657373604482015290519081900360640190fd5b6001546040516001600160a01b038084169216907fbdb27c45e7cebea53416bc78c5bfc5014c1efa4cfd3a2cc9398aeb9aaa617fb590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600e5481565b600d5481565b6000805b601c5481101561328957826001600160a01b0316601c828154811061325c57fe5b6000918252602090912001546001600160a01b03161415613281576001915050611525565b60010161323b565b50600092915050565b60155481565b6000600454600014806132c457506001600160a01b038216600090815260216020526040902054600214155b806132cf5750602054155b156132dc57506000611525565b600a54600090819081906001600160a01b03161561337157600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561334257600080fd5b505afa158015613356573d6000803e3d6000fd5b505050506040513d602081101561336c57600080fd5b505190505b60008061337d87611b18565b9095509150613392838363ffffffff61447b16565b60045411156133b7576133b482612faa8560045461437f90919063ffffffff16565b90505b602080546001600160a01b0389166000908152601f9092526040909120546133eb91906119cb90849063ffffffff61416616565b9350505050613403818361447b90919063ffffffff16565b949350505050565b6016546001600160a01b031681565b60125481565b601c818154811061342d57fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461349b576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b0382166134b35761185d33826142f7565b6116646001600160a01b038316338363ffffffff61432d16565b6000601b5442106134f357601a546134ec90839063ffffffff61411d16565b9050611525565b601b54600090613509904263ffffffff61437f16565b905060006135226019548361416690919063ffffffff16565b601a5490915061353c906119cb868463ffffffff61447b16565b92505050611525565b6018546001600160a01b031681565b428410156135a2576040805162461bcd60e51b815260206004820152601660248201527512185cda14985d19515490cc8c0e881156141254915160521b604482015290519081900360640190fd5b6007546001600160a01b0380891660008181526008602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa1580156136bd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906136f35750886001600160a01b0316816001600160a01b0316145b613744576040805162461bcd60e51b815260206004820181905260248201527f486173685261746545524332303a20494e56414c49445f5349474e4154555245604482015290519081900360640190fd5b61374f89898961400a565b505050505050505050565b600080826001600160a01b03166397b1c96c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561379657600080fd5b505afa1580156137aa573d6000803e3d6000fd5b505050506040513d60208110156137c057600080fd5b505190506001600160a01b0381166137dc576000915050611525565b60006137e782612a2d565b9050806137f957600092505050611525565b6000846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561383457600080fd5b505afa158015613848573d6000803e3d6000fd5b505050506040513d602081101561385e57600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038616916318160ddd916004808301926020929190829003018186803b1580156138a657600080fd5b505afa1580156138ba573d6000803e3d6000fd5b505050506040513d60208110156138d057600080fd5b5051905080158015906138f15750806138ef848463ffffffff61416616565b115b15612bd25761390a816119cb858563ffffffff61416616565b945050505050611525565b6000546001600160a01b031633148061393857506001546001600160a01b031633145b613978576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8060105414156139c4576040805162461bcd60e51b815260206004820152601260248201527139b0b6b29036b4b732b92837b7b62332b29760711b604482015290519081900360640190fd5b620f42408110613a14576040805162461bcd60e51b81526020600482015260166024820152753737b73632b3b0b61036b4b732b92837b7b62332b29760511b604482015290519081900360640190fd5b601081905561195e611967565b600b5460408051630478ebcb60e41b81529051600092620f424092849283926001600160a01b03169163478ebcb0916004808301926020929190829003018186803b158015613a6f57600080fd5b505afa158015613a83573d6000803e3d6000fd5b505050506040513d6020811015613a9957600080fd5b5051601054909150613abc9084906119cb9061289a90839063ffffffff61437f16565b9150506000809050613add836119cb6011548561416690919063ffffffff16565b935050505090565b60145481565b600660209081526000928352604080842090915290825290205481565b6000546001600160a01b03163314613b5c576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b613b6682826145f9565b613b6e613d80565b611664612c08565b6001546001600160a01b031681565b6000546001600160a01b03163314613bd9576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314613c4f576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b038116613caa576040805162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480613d2857506001546001600160a01b031633145b613d68576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b613d70612c08565b61166482826147b4565b60115481565b60005b601c5481101561195e57601c8181548110613d9a57fe5b6000918252602090912001546001600160a01b03163314801590613dc95750613dc9601c8281548110612c5157fe5b8015613e5e5750601c8181548110613ddd57fe5b6000918252602091829020015460408051638f72d54560e01b815290516001600160a01b0390921692638f72d54592600480840193829003018186803b158015613e2657600080fd5b505afa158015613e3a573d6000803e3d6000fd5b505050506040513d6020811015613e5057600080fd5b50516001600160a01b031630145b15613ed157601c8181548110613e7057fe5b6000918252602082200154604080516378898b1b60e11b815290516001600160a01b039092169263f11316369260048084019382900301818387803b158015613eb857600080fd5b505af1158015613ecc573d6000803e3d6000fd5b505050505b600101613d83565b60205481565b6000546001600160a01b0316331480613f0257506001546001600160a01b031633145b613f42576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b6009546001600160a01b03828116610100909204161415613f99576040805162461bcd60e51b815260206004820152600c60248201526b39b0b6b29036b4b73a32b91760a11b604482015290519081900360640190fd5b600980546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000601e5460001415613fd657506000611525565b601e546001600160a01b0383166000908152601d60205260409020546019546115da92916119cb919063ffffffff61416616565b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0382166000908152602160205260409020546002146140c8576040805162461bcd60e51b815260206004820152600c60248201526b1a5b1b1959d85b081c1bdbdb60a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152601f602090815260409091205490546140fb9183916128d09163ffffffff61437f16565b60209081556001600160a01b039092166000908152601f909252604090912055565b600061415f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061488b565b9392505050565b600082614175575060006115da565b8282028284828161418257fe5b041461415f5760405162461bcd60e51b8152600401808060200182810382526021815260200180614c636021913960400191505060405180910390fd5b600c546001600160a01b03166141d457611664565b60006001600160a01b0383166141eb575047614260565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561423157600080fd5b505afa158015614245573d6000803e3d6000fd5b505050506040513d602081101561425b57600080fd5b505190505b808211156142f257600c546001600160a01b031663aad3ec968461428a858563ffffffff61437f16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156142d957600080fd5b505af11580156142ed573d6000803e3d6000fd5b505050505b505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156142f2573d6000803e3d6000fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526142f290849061492d565b600061415f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614ae5565b6001600160a01b0383166000908152600560205260409020546143ea908263ffffffff61437f16565b6001600160a01b03808516600090815260056020526040808220939093559084168152205461441f908263ffffffff61447b16565b6001600160a01b0380841660008181526005602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008282018381101561415f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b81516144e8906002906020850190614b78565b5080516144fc906003906020840190614b78565b506040514690806052614c11823960520190506040518091039020600260405180828054600181600116156101000203166002900480156145745780601f10614552576101008083540402835291820191614574565b820191906000526020600020905b815481529060010190602001808311614560575b505060408051918290038220828201825260018352603160f81b602093840152815180840196909652858201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606086015260808501959095523060a0808601919091528551808603909101815260c0909401909452505080519101206007555050565b6001600160a01b03821615611664576001600160a01b038216600090815260216020526040902081905561462c82613237565b61166457601c80546001810182556000919091527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0384166001600160a01b03199091161790555050565b614689612c08565b601954604080519182526020820183905280517fc8a368e74acfd5086c83fce19caf792cd058ba8ed9b923eea75fcd0d730a4ebb9281900390910190a16019819055601a546146df90429063ffffffff61447b16565b601b5550565b6001805460ff60a01b191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600454614730908263ffffffff61447b16565b6004556001600160a01b03821660009081526005602052604090205461475c908263ffffffff61447b16565b6001600160a01b03831660008181526005602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6147bd82611509565b6147fd576040805162461bcd60e51b815260206004820152600c60248201526b1a5b1b1959d85b081c1bdbdb60a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152601d6020526040902054601e5461482e9183916128d09163ffffffff61437f16565b601e556001600160a01b039091166000908152601d6020526040902055565b6001805460ff60a01b1916600160a01b1790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600081836149175760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148dc5781810151838201526020016148c4565b50505050905090810190601f1680156149095780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161492357fe5b0495945050505050565b61493f826001600160a01b0316614b3f565b614990576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106149ce5780518252601f1990920191602091820191016149af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614a30576040519150601f19603f3d011682016040523d82523d6000602084013e614a35565b606091505b509150915081614a8c576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561267357808060200190516020811015614aa857600080fd5b50516126735760405162461bcd60e51b815260040180806020018281038252602a815260200180614c84602a913960400191505060405180910390fd5b60008184841115614b375760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148dc5781810151838201526020016148c4565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613403575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bb957805160ff1916838001178555614be6565b82800160010185558215614be6579182015b82811115614be6578251825591602001919060010190614bcb565b50614bf2929150614bf6565b5090565b61243991905b80821115614bf25760008155600101614bfc56fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a7231582016682c689614e27f73f7adc02680ccbdaea89db88d1292a1cd31a9fabe93a33864736f6c63430005100032
Deployed Bytecode
0x6080604052600436106104b55760003560e01c806375033a841161026b578063bc66ce0a1161014f578063dd62ed3e116100c1578063f45b242f11610085578063f45b242f14611419578063f6e15f0414611452578063f8463b2114611467578063fa7be18c1461147c578063fca3b5aa14611491578063ff8b74d7146114c4576104b5565b8063dd62ed3e1461132a578063e0c891b114611365578063eb6ee0a11461139e578063f0f44260146113b3578063f2fde38b146113e6576104b5565b8063d1af0c7d11610113578063d1af0c7d14611230578063d505accf14611245578063d7b44d02146112a3578063d840ce0e146112d6578063da13285714611300578063da3b6b3514611315576104b5565b8063bc66ce0a14611179578063c232e1c81461118e578063c4f0c1fc146111a3578063c6d758cb146111cd578063ca0e192d14611206576104b5565b80639e447fc6116101e8578063aa3166b4116101ac578063aa3166b4146110a1578063b0eb1093146110d4578063b48ffbb1146110e9578063b62bda15146110fe578063b728926214611131578063b826595d14611146576104b5565b80639e447fc614610fff578063a50a1fe614611029578063a77bce9d1461103e578063a9059cbb14611053578063aa3119ee1461108c576104b5565b80638456cb591161022f5780638456cb5914610f815780638da5cb5b14610f9657806395d89b4114610fab5780639a29160914610fc05780639dabe39d14610fd5576104b5565b806375033a8414610ebe5780637a776b5114610ef15780637b0a47ee14610f245780637ecebe0014610f39578063836ee4f514610f6c576104b5565b80633437a7f71161039d578063481d0fb41161030f5780636117d0a9116102d35780636117d0a914610d5557806361d027b314610d81578063627ec05214610d965780636b9e499c14610dab5780636d32641b14610dc057806370a0823114610e8b576104b5565b8063481d0fb414610c18578063549b768814610c2d5780635b4d997114610cf85780635c975abb14610d0d5780635ea06e5e14610d22576104b5565b80633f4ba83a116103615780633f4ba83a14610b4357806340c10f1914610b58578063415e2f2c14610b915780634430dfce14610ba65780634460b4df14610bbb578063465656fa14610be5576104b5565b80633437a7f7146108915780633497d5a614610a245780633644e51514610aef578063386a952514610b045780633c6b16ab14610b19576104b5565b806317e0ab8911610436578063252ac138116103fa578063252ac1381461079c578063279084a6146107e85780632a5a771d146107fd57806330adf81f14610827578063313ce5671461083c57806331d9cbf814610867576104b5565b806317e0ab89146106f057806317fd06a21461070557806318160ddd1461072f5780631b75fbe81461074457806323b872dd14610759576104b5565b80630c56ae3b1161047d5780630c56ae3b14610637578063104a41a71461064c57806310a3bae914610685578063132c2614146106af578063174e31c4146106b7576104b5565b806304fcbe0e146104b7578063069b0822146104fc57806306fdde031461054357806307546172146105cd578063095ea7b3146105fe575b005b3480156104c357600080fd5b506104ea600480360360208110156104da57600080fd5b50356001600160a01b03166114f7565b60408051918252519081900360200190f35b34801561050857600080fd5b5061052f6004803603602081101561051f57600080fd5b50356001600160a01b0316611509565b604080519115158252519081900360200190f35b34801561054f57600080fd5b5061055861152a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561059257818101518382015260200161057a565b50505050905090810190601f1680156105bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105d957600080fd5b506105e26115b5565b604080516001600160a01b039092168252519081900360200190f35b34801561060a57600080fd5b5061052f6004803603604081101561062157600080fd5b506001600160a01b0381351690602001356115c9565b34801561064357600080fd5b506105e26115e0565b34801561065857600080fd5b506104b56004803603604081101561066f57600080fd5b506001600160a01b0381351690602001356115ef565b34801561069157600080fd5b506104ea600480360360208110156106a857600080fd5b5035611668565b6104b5611756565b3480156106c357600080fd5b506104b5600480360360408110156106da57600080fd5b506001600160a01b03813516906020013561178e565b3480156106fc57600080fd5b506104ea61187f565b34801561071157600080fd5b506104b56004803603602081101561072857600080fd5b5035611885565b34801561073b57600080fd5b506104ea611961565b34801561075057600080fd5b506104b5611967565b34801561076557600080fd5b5061052f6004803603606081101561077c57600080fd5b506001600160a01b03813581169160208101359091169060400135611a29565b3480156107a857600080fd5b506107cf600480360360208110156107bf57600080fd5b50356001600160a01b0316611b18565b6040805192835260208301919091528051918290030190f35b3480156107f457600080fd5b506104ea611bed565b34801561080957600080fd5b506104b56004803603602081101561082057600080fd5b5035611bf3565b34801561083357600080fd5b506104ea611ceb565b34801561084857600080fd5b50610851611d0f565b6040805160ff9092168252519081900360200190f35b34801561087357600080fd5b506104b56004803603602081101561088a57600080fd5b5035611d14565b34801561089d57600080fd5b506104b560048036036101c08110156108b557600080fd5b810190602081018135600160201b8111156108cf57600080fd5b8201836020820111156108e157600080fd5b803590602001918460018302840111600160201b8311171561090257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561095457600080fd5b82018360208201111561096657600080fd5b803590602001918460018302840111600160201b8311171561098757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335811694506020840135811693604081013582169350606081013582169250608081013582169160a082013581169160c081013582169160e082013516906101008101359061012081013590610140810135906101600135611e72565b348015610a3057600080fd5b506104b560048036036040811015610a4757600080fd5b810190602081018135600160201b811115610a6157600080fd5b820183602082011115610a7357600080fd5b803590602001918460208302840111600160201b83111715610a9457600080fd5b919390929091602081019035600160201b811115610ab157600080fd5b820183602082011115610ac357600080fd5b803590602001918460208302840111600160201b83111715610ae457600080fd5b50909250905061202a565b348015610afb57600080fd5b506104ea61212f565b348015610b1057600080fd5b506104ea612135565b348015610b2557600080fd5b506104b560048036036020811015610b3c57600080fd5b503561213b565b348015610b4f57600080fd5b506104b56122d0565b348015610b6457600080fd5b506104b560048036036040811015610b7b57600080fd5b506001600160a01b03813516906020013561232e565b348015610b9d57600080fd5b506104ea612435565b348015610bb257600080fd5b506104ea61243c565b348015610bc757600080fd5b506104b560048036036020811015610bde57600080fd5b5035612442565b348015610bf157600080fd5b506104ea60048036036020811015610c0857600080fd5b50356001600160a01b031661255a565b348015610c2457600080fd5b506105e261256c565b348015610c3957600080fd5b506104b560048036036040811015610c5057600080fd5b810190602081018135600160201b811115610c6a57600080fd5b820183602082011115610c7c57600080fd5b803590602001918460208302840111600160201b83111715610c9d57600080fd5b919390929091602081019035600160201b811115610cba57600080fd5b820183602082011115610ccc57600080fd5b803590602001918460208302840111600160201b83111715610ced57600080fd5b50909250905061257b565b348015610d0457600080fd5b506104ea612679565b348015610d1957600080fd5b5061052f61267f565b348015610d2e57600080fd5b506104b560048036036020811015610d4557600080fd5b50356001600160a01b031661268f565b6104b560048036036040811015610d6b57600080fd5b506001600160a01b03813516906020013561276a565b348015610d8d57600080fd5b506105e2612856565b348015610da257600080fd5b506104ea612865565b348015610db757600080fd5b506104ea612917565b348015610dcc57600080fd5b506104b560048036036040811015610de357600080fd5b810190602081018135600160201b811115610dfd57600080fd5b820183602082011115610e0f57600080fd5b803590602001918460208302840111600160201b83111715610e3057600080fd5b919390929091602081019035600160201b811115610e4d57600080fd5b820183602082011115610e5f57600080fd5b803590602001918460208302840111600160201b83111715610e8057600080fd5b50909250905061291d565b348015610e9757600080fd5b506104ea60048036036020811015610eae57600080fd5b50356001600160a01b0316612a1b565b348015610eca57600080fd5b506104ea60048036036020811015610ee157600080fd5b50356001600160a01b0316612a2d565b348015610efd57600080fd5b506104ea60048036036020811015610f1457600080fd5b50356001600160a01b0316612bde565b348015610f3057600080fd5b506104ea612bf0565b348015610f4557600080fd5b506104ea60048036036020811015610f5c57600080fd5b50356001600160a01b0316612bf6565b348015610f7857600080fd5b506104b5612c08565b348015610f8d57600080fd5b506104b5612d7b565b348015610fa257600080fd5b506105e2612dd7565b348015610fb757600080fd5b50610558612de6565b348015610fcc57600080fd5b506104ea612e41565b348015610fe157600080fd5b506104b560048036036020811015610ff857600080fd5b5035612e5b565b34801561100b57600080fd5b506104b56004803603602081101561102257600080fd5b5035612f19565b34801561103557600080fd5b506104ea612f85565b34801561104a57600080fd5b506104ea612fbb565b34801561105f57600080fd5b5061052f6004803603604081101561107657600080fd5b506001600160a01b0381351690602001356130ba565b34801561109857600080fd5b506104ea61311a565b3480156110ad57600080fd5b506104b5600480360360208110156110c457600080fd5b50356001600160a01b0316613120565b3480156110e057600080fd5b506104ea61322b565b3480156110f557600080fd5b506104ea613231565b34801561110a57600080fd5b5061052f6004803603602081101561112157600080fd5b50356001600160a01b0316613237565b34801561113d57600080fd5b506104ea613292565b34801561115257600080fd5b506104ea6004803603602081101561116957600080fd5b50356001600160a01b0316613298565b34801561118557600080fd5b506105e261340b565b34801561119a57600080fd5b506104ea61341a565b3480156111af57600080fd5b506105e2600480360360208110156111c657600080fd5b5035613420565b3480156111d957600080fd5b506104b5600480360360408110156111f057600080fd5b506001600160a01b038135169060200135613447565b34801561121257600080fd5b506104ea6004803603602081101561122957600080fd5b50356134cd565b34801561123c57600080fd5b506105e2613545565b34801561125157600080fd5b506104b5600480360360e081101561126857600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613554565b3480156112af57600080fd5b506104ea600480360360208110156112c657600080fd5b50356001600160a01b031661375a565b3480156112e257600080fd5b506104b5600480360360208110156112f957600080fd5b5035613915565b34801561130c57600080fd5b506104ea613a21565b34801561132157600080fd5b506104ea613ae5565b34801561133657600080fd5b506104ea6004803603604081101561134d57600080fd5b506001600160a01b0381358116916020013516613aeb565b34801561137157600080fd5b506104b56004803603604081101561138857600080fd5b506001600160a01b038135169060200135613b08565b3480156113aa57600080fd5b506105e2613b76565b3480156113bf57600080fd5b506104b5600480360360208110156113d657600080fd5b50356001600160a01b0316613b85565b3480156113f257600080fd5b506104b56004803603602081101561140957600080fd5b50356001600160a01b0316613bfb565b34801561142557600080fd5b506104b56004803603604081101561143c57600080fd5b506001600160a01b038135169060200135613d05565b34801561145e57600080fd5b506104ea613d7a565b34801561147357600080fd5b506104b5613d80565b34801561148857600080fd5b506104ea613ed9565b34801561149d57600080fd5b506104b5600480360360208110156114b457600080fd5b50356001600160a01b0316613edf565b3480156114d057600080fd5b506104ea600480360360208110156114e757600080fd5b50356001600160a01b0316613fc1565b601f6020526000908152604090205481565b6001600160a01b03811660009081526021602052604090205415155b919050565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156115ad5780601f10611582576101008083540402835291602001916115ad565b820191906000526020600020905b81548152906001019060200180831161159057829003601f168201915b505050505081565b60095461010090046001600160a01b031681565b60006115d633848461400a565b5060015b92915050565b600a546001600160a01b031681565b6000546001600160a01b031633148061161257506001546001600160a01b031633145b611652576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b61165a613d80565b611664828261406c565b5050565b6016546000906012906001600160a01b0316156116ff57601660009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116cd57600080fd5b505afa1580156116e1573d6000803e3d6000fd5b505050506040513d60208110156116f757600080fd5b505160ff1690505b601281101561172957601281900361172184600a83900a63ffffffff61411d16565b93505061174f565b601281111561174f57601119810161174b84600a83900a63ffffffff61416616565b9350505b5090919050565b60408051348152905133917f81ad7215cbec0a1d55a48f38b34525d2b677147ee7ceb872ac23ecca5ec966e5919081900360200190a2565b6001600160a01b0382166117e2576040805162461bcd60e51b8152602060048201526016602482015275746f20697320746865207a65726f206164647265737360501b604482015290519081900360640190fd5b6117eb33611509565b61182d576040805162461bcd60e51b815260206004820152600e60248201526d4e6f207065726d697373696f6e7360901b604482015290519081900360640190fd5b601854611843906001600160a01b0316826141bf565b6018546001600160a01b03166118625761185d82826142f7565b611664565b601854611664906001600160a01b0316838363ffffffff61432d16565b60105481565b6000546001600160a01b03163314806118a857506001546001600160a01b031633145b6118e8576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b806013541415611937576040805162461bcd60e51b815260206004820152601560248201527439b0b6b2903bb7b935b4b733a430b9b42930ba329760591b604482015290519081900360640190fd5b600e5442111561195157611949612865565b601255426015555b601381905561195e611967565b50565b60045481565b600e5442111561197957611979613d80565b6017546000611986612fbb565b90506000611992613a21565b9050818111156119e05760006119ae828463ffffffff61437f16565b90506119d76014546119cb6013548461416690919063ffffffff16565b9063ffffffff61411d16565b601755506119e6565b60006017555b60175460408051858152602081019290925280517fbcdc19a9d06e9389ef3cac53244ab619448a240601652339b4adf14f6a844c2b9281900390910190a1505050565b600154600090600160a01b900460ff1615611a7e576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001600160a01b038416600090815260066020908152604080832033845290915290205460001914611b03576001600160a01b0384166000908152600660209081526040808320338452909152902054611ade908363ffffffff61437f16565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b611b0e8484846143c1565b5060019392505050565b60008060008060005b601c54811015611be35760216000601c8381548110611b3c57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460021415611bdb576000611b95601c8381548110611b7b57fe5b6000918252602090912001546001600160a01b031661375a565b9050611ba7848263ffffffff61447b16565b9350601c8281548110611bb657fe5b6000918252602090912001546001600160a01b0388811691161415611bd9578092505b505b600101611b21565b5092509050915091565b601b5481565b6000546001600160a01b0316331480611c1657506001546001600160a01b031633145b611c56576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b60008111611ca2576040805162461bcd60e51b8152602060048201526014602482015273068617368526174652063616e6e6f7420626520360641b604482015290519081900360640190fd5b611ccf611cc06013546119cb6014548561416690919063ffffffff16565b6014549063ffffffff61447b16565b601455601354611ce5908263ffffffff61447b16565b60135550565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000546001600160a01b0316331480611d3757506001546001600160a01b031633145b611d77576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b80600e541415611dc6576040805162461bcd60e51b815260206004820152601560248201527439b0b6b29039ba30b93a26b4b734b733aa34b6b29760591b604482015290519081900360640190fd5b42600e5411611e14576040805162461bcd60e51b815260206004820152601560248201527430b63932b0b23c9039ba30b93a1036b4b734b7339760591b604482015290519081900360640190fd5b428111611e68576040805162461bcd60e51b815260206004820152601960248201527f6e6f6e6c6567616c2073746172744d696e696e6754696d652e00000000000000604482015290519081900360640190fd5b600e819055601555565b60095460ff1615611eca576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c726561647920696e697469616c697a656400000000000000604482015290519081900360640190fd5b620f42408210611f21576040805162461bcd60e51b815260206004820152601f60248201527f6e6f6e6c6567616c206d696e6572506f6f6c4665654e756d657261746f722e00604482015290519081900360640190fd5b6009805460ff19166001179055611f388e8e6144d5565b600a80546001600160a01b0319166001600160a01b038e81169190911791829055611f65911660016145f9565b611f708b60026145f9565b611f7b8a60026145f9565b60098054610100600160a81b0319166101006001600160a01b038c81169190910291909117909155600b80546001600160a01b03199081168b8416179091556016805482168a8416179055601880548216898416179055600c8054909116918716919091179055600d84905542600e819055600f8490556010839055601482905562278d00601a55620f4240601155601382905560155561201a611967565b5050505050505050505050505050565b6000546001600160a01b031633148061204d57506001546001600160a01b031633145b61208d576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8281146120d6576040805162461bcd60e51b8152602060048201526012602482015271696c6c6567616c20706172616d657465727360701b604482015290519081900360640190fd5b6120de613d80565b60005b83811015612128576121208585838181106120f857fe5b905060200201356001600160a01b031684848481811061211457fe5b9050602002013561406c565b6001016120e1565b5050505050565b60075481565b601a5481565b6000546001600160a01b031633148061215e57506001546001600160a01b031633145b61219e576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b60006121a9826134cd565b90506121b481614681565b601854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156121ff57600080fd5b505afa158015612213573d6000803e3d6000fd5b505050506040513d602081101561222957600080fd5b5051601a5490915061224290829063ffffffff61411d16565b6019541115612298576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b6040805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b6000546001600160a01b03163314612324576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b61232c6146e5565b565b600154600160a01b900460ff1615612380576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60095461010090046001600160a01b031633146123ce576040805162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b604482015290519081900360640190fd5b6123d6612f85565b811115612423576040805162461bcd60e51b81526020600482015260166024820152753737ba1039bab33334b1b4b2b73a1039bab838363c9760511b604482015290519081900360640190fd5b61242d828261471d565b611664613d80565b601c545b90565b60135481565b6000546001600160a01b031633148061246557506001546001600160a01b031633145b6124a5576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8060115414156124fc576040805162461bcd60e51b815260206004820152601b60248201527f73616d6520646570726563696174696f6e4e756d657261746f722e0000000000604482015290519081900360640190fd5b620f424081111561254d576040805162461bcd60e51b81526020600482015260166024820152753737b73632b3b0b6103232b83932b1b4b0ba34b7b71760511b604482015290519081900360640190fd5b601181905561195e611967565b60216020526000908152604090205481565b600b546001600160a01b031681565b6000546001600160a01b031633146125cf576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b828114612618576040805162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172616d657465727360701b604482015290519081900360640190fd5b60005b838110156126625761265a85858381811061263257fe5b905060200201356001600160a01b031684848481811061264e57fe5b905060200201356145f9565b60010161261b565b5061266b613d80565b612673612c08565b50505050565b601e5481565b600154600160a01b900460ff1690565b6000546001600160a01b03163314806126b257506001546001600160a01b031633145b6126f2576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b600b546001600160a01b0382811691161415612747576040805162461bcd60e51b815260206004820152600f60248201526e39b0b6b29036b4b732a830b930b69760891b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b03831617905561195e611967565b6001600160a01b0382166127be576040805162461bcd60e51b8152602060048201526016602482015275746f20697320746865207a65726f206164647265737360501b604482015290519081900360640190fd5b6127c733611509565b612809576040805162461bcd60e51b815260206004820152600e60248201526d4e6f207065726d697373696f6e7360901b604482015290519081900360640190fd5b60165461281f906001600160a01b0316826141bf565b6016546001600160a01b03166128395761185d82826142f7565b601654611664906001600160a01b0316838363ffffffff61432d16565b600c546001600160a01b031681565b6000600e544211156129115760006128886015544261437f90919063ffffffff16565b905060006128dc6128a761289a612e41565b849063ffffffff61416616565b6128d06012546128c4600e5460155461437f90919063ffffffff16565b9063ffffffff61416616565b9063ffffffff61447b16565b905060006128f5600e544261437f90919063ffffffff16565b9050612907828263ffffffff61411d16565b9350505050612439565b50600090565b600f5481565b6000546001600160a01b031633148061294057506001546001600160a01b031633145b612980576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8281146129c9576040805162461bcd60e51b8152602060048201526012602482015271696c6c6567616c20706172616d657465727360701b604482015290519081900360640190fd5b6129d1612c08565b60005b8381101561212857612a138585838181106129eb57fe5b905060200201356001600160a01b0316848484818110612a0757fe5b905060200201356147b4565b6001016129d4565b60056020526000908152604090205481565b600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6957600080fd5b505afa158015612a7d573d6000803e3d6000fd5b505050506040513d6020811015612a9357600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0386169163d21220a7916004808301926020929190829003018186803b158015612adb57600080fd5b505afa158015612aef573d6000803e3d6000fd5b505050506040513d6020811015612b0557600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03881691630902f1ac91600480820192606092909190829003018186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6060811015612b7a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b038416301415612bb657509250611525915050565b6001600160a01b038316301415612bd257935061152592505050565b50600095945050505050565b601d6020526000908152604090205481565b60195481565b60086020526000908152604090205481565b60005b601c5481101561195e57601c8181548110612c2257fe5b6000918252602090912001546001600160a01b03163314801590612c6b5750612c6b601c8281548110612c5157fe5b6000918252602090912001546001600160a01b0316611509565b8015612d005750601c8181548110612c7f57fe5b6000918252602091829020015460408051638f72d54560e01b815290516001600160a01b0390921692638f72d54592600480840193829003018186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d6020811015612cf257600080fd5b50516001600160a01b031630145b15612d7357601c8181548110612d1257fe5b6000918252602082200154604080516390d0936960e01b815290516001600160a01b03909216926390d093699260048084019382900301818387803b158015612d5a57600080fd5b505af1158015612d6e573d6000803e3d6000fd5b505050505b600101612c0b565b6000546001600160a01b03163314612dcf576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b61232c61484d565b6000546001600160a01b031681565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156115ad5780601f10611582576101008083540402835291602001916115ad565b6000601454601354620f42400281612e5557fe5b04905090565b6000546001600160a01b0316331480612e7e57506001546001600160a01b031633145b612ebe576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b80600f541415612f0c576040805162461bcd60e51b815260206004820152601460248201527339b0b6b29032b632b1ba3934b1a1b430b933b29760611b604482015290519081900360640190fd5b600f81905561195e611967565b6000546001600160a01b0316331480612f3c57506001546001600160a01b031633145b612f7c576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b61195e81614681565b6000612fb6600454612faa670de0b6b3a764000060145461416690919063ffffffff16565b9063ffffffff61437f16565b905090565b600080600b60009054906101000a90046001600160a01b03166001600160a01b03166378f6e9986040518163ffffffff1660e01b815260040160206040518083038186803b15801561300c57600080fd5b505afa158015613020573d6000803e3d6000fd5b505050506040513d602081101561303657600080fd5b5051905080156130b257600d54670de0b6b3a7640000906103e89060009061306e9083906119cb90829082908863ffffffff61416616565b90506000613092856119cb620f42406119cb600f548761416690919063ffffffff16565b90506130a681610e1063ffffffff61411d16565b95505050505050612439565b600091505090565b600154600090600160a01b900460ff161561310f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6115d63384846143c1565b60175481565b6000546001600160a01b03163314613174576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b0381166131cf576040805162461bcd60e51b815260206004820181905260248201527f706172616d2073657474657220697320746865207a65726f2061646472657373604482015290519081900360640190fd5b6001546040516001600160a01b038084169216907fbdb27c45e7cebea53416bc78c5bfc5014c1efa4cfd3a2cc9398aeb9aaa617fb590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600e5481565b600d5481565b6000805b601c5481101561328957826001600160a01b0316601c828154811061325c57fe5b6000918252602090912001546001600160a01b03161415613281576001915050611525565b60010161323b565b50600092915050565b60155481565b6000600454600014806132c457506001600160a01b038216600090815260216020526040902054600214155b806132cf5750602054155b156132dc57506000611525565b600a54600090819081906001600160a01b03161561337157600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561334257600080fd5b505afa158015613356573d6000803e3d6000fd5b505050506040513d602081101561336c57600080fd5b505190505b60008061337d87611b18565b9095509150613392838363ffffffff61447b16565b60045411156133b7576133b482612faa8560045461437f90919063ffffffff16565b90505b602080546001600160a01b0389166000908152601f9092526040909120546133eb91906119cb90849063ffffffff61416616565b9350505050613403818361447b90919063ffffffff16565b949350505050565b6016546001600160a01b031681565b60125481565b601c818154811061342d57fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461349b576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b0382166134b35761185d33826142f7565b6116646001600160a01b038316338363ffffffff61432d16565b6000601b5442106134f357601a546134ec90839063ffffffff61411d16565b9050611525565b601b54600090613509904263ffffffff61437f16565b905060006135226019548361416690919063ffffffff16565b601a5490915061353c906119cb868463ffffffff61447b16565b92505050611525565b6018546001600160a01b031681565b428410156135a2576040805162461bcd60e51b815260206004820152601660248201527512185cda14985d19515490cc8c0e881156141254915160521b604482015290519081900360640190fd5b6007546001600160a01b0380891660008181526008602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa1580156136bd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906136f35750886001600160a01b0316816001600160a01b0316145b613744576040805162461bcd60e51b815260206004820181905260248201527f486173685261746545524332303a20494e56414c49445f5349474e4154555245604482015290519081900360640190fd5b61374f89898961400a565b505050505050505050565b600080826001600160a01b03166397b1c96c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561379657600080fd5b505afa1580156137aa573d6000803e3d6000fd5b505050506040513d60208110156137c057600080fd5b505190506001600160a01b0381166137dc576000915050611525565b60006137e782612a2d565b9050806137f957600092505050611525565b6000846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561383457600080fd5b505afa158015613848573d6000803e3d6000fd5b505050506040513d602081101561385e57600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038616916318160ddd916004808301926020929190829003018186803b1580156138a657600080fd5b505afa1580156138ba573d6000803e3d6000fd5b505050506040513d60208110156138d057600080fd5b5051905080158015906138f15750806138ef848463ffffffff61416616565b115b15612bd25761390a816119cb858563ffffffff61416616565b945050505050611525565b6000546001600160a01b031633148061393857506001546001600160a01b031633145b613978576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b8060105414156139c4576040805162461bcd60e51b815260206004820152601260248201527139b0b6b29036b4b732b92837b7b62332b29760711b604482015290519081900360640190fd5b620f42408110613a14576040805162461bcd60e51b81526020600482015260166024820152753737b73632b3b0b61036b4b732b92837b7b62332b29760511b604482015290519081900360640190fd5b601081905561195e611967565b600b5460408051630478ebcb60e41b81529051600092620f424092849283926001600160a01b03169163478ebcb0916004808301926020929190829003018186803b158015613a6f57600080fd5b505afa158015613a83573d6000803e3d6000fd5b505050506040513d6020811015613a9957600080fd5b5051601054909150613abc9084906119cb9061289a90839063ffffffff61437f16565b9150506000809050613add836119cb6011548561416690919063ffffffff16565b935050505090565b60145481565b600660209081526000928352604080842090915290825290205481565b6000546001600160a01b03163314613b5c576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b613b6682826145f9565b613b6e613d80565b611664612c08565b6001546001600160a01b031681565b6000546001600160a01b03163314613bd9576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314613c4f576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b038116613caa576040805162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480613d2857506001546001600160a01b031633145b613d68576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b613d70612c08565b61166482826147b4565b60115481565b60005b601c5481101561195e57601c8181548110613d9a57fe5b6000918252602090912001546001600160a01b03163314801590613dc95750613dc9601c8281548110612c5157fe5b8015613e5e5750601c8181548110613ddd57fe5b6000918252602091829020015460408051638f72d54560e01b815290516001600160a01b0390921692638f72d54592600480840193829003018186803b158015613e2657600080fd5b505afa158015613e3a573d6000803e3d6000fd5b505050506040513d6020811015613e5057600080fd5b50516001600160a01b031630145b15613ed157601c8181548110613e7057fe5b6000918252602082200154604080516378898b1b60e11b815290516001600160a01b039092169263f11316369260048084019382900301818387803b158015613eb857600080fd5b505af1158015613ecc573d6000803e3d6000fd5b505050505b600101613d83565b60205481565b6000546001600160a01b0316331480613f0257506001546001600160a01b031633145b613f42576040805162461bcd60e51b815260206004820152600c60248201526b10b830b930b6a9b2ba3a32b960a11b604482015290519081900360640190fd5b6009546001600160a01b03828116610100909204161415613f99576040805162461bcd60e51b815260206004820152600c60248201526b39b0b6b29036b4b73a32b91760a11b604482015290519081900360640190fd5b600980546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000601e5460001415613fd657506000611525565b601e546001600160a01b0383166000908152601d60205260409020546019546115da92916119cb919063ffffffff61416616565b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0382166000908152602160205260409020546002146140c8576040805162461bcd60e51b815260206004820152600c60248201526b1a5b1b1959d85b081c1bdbdb60a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152601f602090815260409091205490546140fb9183916128d09163ffffffff61437f16565b60209081556001600160a01b039092166000908152601f909252604090912055565b600061415f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061488b565b9392505050565b600082614175575060006115da565b8282028284828161418257fe5b041461415f5760405162461bcd60e51b8152600401808060200182810382526021815260200180614c636021913960400191505060405180910390fd5b600c546001600160a01b03166141d457611664565b60006001600160a01b0383166141eb575047614260565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561423157600080fd5b505afa158015614245573d6000803e3d6000fd5b505050506040513d602081101561425b57600080fd5b505190505b808211156142f257600c546001600160a01b031663aad3ec968461428a858563ffffffff61437f16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156142d957600080fd5b505af11580156142ed573d6000803e3d6000fd5b505050505b505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156142f2573d6000803e3d6000fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526142f290849061492d565b600061415f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614ae5565b6001600160a01b0383166000908152600560205260409020546143ea908263ffffffff61437f16565b6001600160a01b03808516600090815260056020526040808220939093559084168152205461441f908263ffffffff61447b16565b6001600160a01b0380841660008181526005602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008282018381101561415f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b81516144e8906002906020850190614b78565b5080516144fc906003906020840190614b78565b506040514690806052614c11823960520190506040518091039020600260405180828054600181600116156101000203166002900480156145745780601f10614552576101008083540402835291820191614574565b820191906000526020600020905b815481529060010190602001808311614560575b505060408051918290038220828201825260018352603160f81b602093840152815180840196909652858201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606086015260808501959095523060a0808601919091528551808603909101815260c0909401909452505080519101206007555050565b6001600160a01b03821615611664576001600160a01b038216600090815260216020526040902081905561462c82613237565b61166457601c80546001810182556000919091527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0384166001600160a01b03199091161790555050565b614689612c08565b601954604080519182526020820183905280517fc8a368e74acfd5086c83fce19caf792cd058ba8ed9b923eea75fcd0d730a4ebb9281900390910190a16019819055601a546146df90429063ffffffff61447b16565b601b5550565b6001805460ff60a01b191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600454614730908263ffffffff61447b16565b6004556001600160a01b03821660009081526005602052604090205461475c908263ffffffff61447b16565b6001600160a01b03831660008181526005602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6147bd82611509565b6147fd576040805162461bcd60e51b815260206004820152600c60248201526b1a5b1b1959d85b081c1bdbdb60a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152601d6020526040902054601e5461482e9183916128d09163ffffffff61437f16565b601e556001600160a01b039091166000908152601d6020526040902055565b6001805460ff60a01b1916600160a01b1790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600081836149175760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148dc5781810151838201526020016148c4565b50505050905090810190601f1680156149095780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161492357fe5b0495945050505050565b61493f826001600160a01b0316614b3f565b614990576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106149ce5780518252601f1990920191602091820191016149af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614a30576040519150601f19603f3d011682016040523d82523d6000602084013e614a35565b606091505b509150915081614a8c576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561267357808060200190516020811015614aa857600080fd5b50516126735760405162461bcd60e51b815260040180806020018281038252602a815260200180614c84602a913960400191505060405180910390fd5b60008184841115614b375760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148dc5781810151838201526020016148c4565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613403575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bb957805160ff1916838001178555614be6565b82800160010185558215614be6579182015b82811115614be6578251825591602001919060010190614bcb565b50614bf2929150614bf6565b5090565b61243991905b80821115614bf25760008155600101614bfc56fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a7231582016682c689614e27f73f7adc02680ccbdaea89db88d1292a1cd31a9fabe93a33864736f6c63430005100032
Deployed Bytecode Sourcemap
24723:19386:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25707:56;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25707:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25707:56:0;-1:-1:-1;;;;;25707:56:0;;:::i;:::-;;;;;;;;;;;;;;;;27340:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27340:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27340:115:0;-1:-1:-1;;;;;27340:115:0;;:::i;:::-;;;;;;;;;;;;;;;;;;18387:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18387:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18387:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24871:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24871:21:0;;;:::i;:::-;;;;-1:-1:-1;;;;;24871:21:0;;;;;;;;;;;;;;20517:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20517:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20517:147:0;;;;;;;;:::i;24899:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24899:26:0;;;:::i;30137:186::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30137:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30137:186:0;;;;;;;;:::i;33430:508::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33430:508:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33430:508:0;;:::i;43592:99::-;;;:::i;42882:424::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42882:424:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42882:424:0;;;;;;;;:::i;25109:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25109:36:0;;;:::i;36470:514::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36470:514:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36470:514:0;;:::i;18481:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18481:24:0;;;:::i;38875:885::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38875:885:0;;;:::i;20833:315::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20833:315:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20833:315:0;;;;;;;;;;;;;;;;;:::i;31581:516::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31581:516:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31581:516:0;-1:-1:-1;;;;;31581:516:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25524:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25524:33:0;;;:::i;34497:352::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34497:352:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34497:352:0;;:::i;18773:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18773:108:0;;;:::i;18439:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18439:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35064:426;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35064:426:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35064:426:0;;:::i;25926:1406::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25926:1406:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;25926:1406:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;25926:1406:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25926:1406:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25926:1406:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;25926:1406:0;;;;;;;;-1:-1:-1;25926:1406:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;25926:1406:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25926:1406:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25926:1406:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;25926:1406:0;;-1:-1:-1;;;;;;;25926:1406:0;;;;;-1:-1:-1;25926:1406:0;;;;;;;;;;;;;;-1:-1:-1;25926:1406:0;;;;;;;-1:-1:-1;25926:1406:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29774:355::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29774:355:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29774:355:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;29774:355:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29774:355:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29774:355:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;29774:355:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29774:355:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;29774:355:0;;-1:-1:-1;29774:355:0;-1:-1:-1;29774:355:0;:::i;18630:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18630:31:0;;;:::i;25487:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25487:30:0;;;:::i;41324:641::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41324:641:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41324:641:0;;:::i;33355:67::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33355:67:0;;;:::i;34076:256::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34076:256:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;34076:256:0;;;;;;;;:::i;28565:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28565:96:0;;;:::i;25237:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25237:30:0;;;:::i;36100:362::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36100:362:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36100:362:0;;:::i;25820:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25820:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25820:46:0;-1:-1:-1;;;;;25820:46:0;;:::i;24932:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24932:24:0;;;:::i;27463:367::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27463:367:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27463:367:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27463:367:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27463:367:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27463:367:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27463:367:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27463:367:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;27463:367:0;;-1:-1:-1;27463:367:0;-1:-1:-1;27463:367:0;:::i;25661:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25661:39:0;;;:::i;17274:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17274:78:0;;;:::i;34857:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34857:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34857:199:0;-1:-1:-1;;;;;34857:199:0;;:::i;42443:431::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42443:431:0;;;;;;;;:::i;24963:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24963:23:0;;;:::i;36992:504::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36992:504:0;;;:::i;25073:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25073:29:0;;;:::i;28669:351::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28669:351:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28669:351:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;28669:351:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28669:351:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28669:351:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;28669:351:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28669:351:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;28669:351:0;;-1:-1:-1;28669:351:0;-1:-1:-1;28669:351:0;:::i;18512:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18512:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18512:41:0;-1:-1:-1;;;;;18512:41:0;;:::i;32726:444::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32726:444:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32726:444:0;-1:-1:-1;;;;;32726:444:0;;:::i;25600:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25600:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25600:54:0;-1:-1:-1;;;;;25600:54:0;;:::i;25455:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25455:25:0;;;:::i;18888:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18888:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18888:38:0;-1:-1:-1;;;;;18888:38:0;;:::i;40097:321::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40097:321:0;;;:::i;33284:63::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33284:63:0;;;:::i;21953:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21953:20:0;;;:::i;18412:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18412:20:0;;;:::i;37504:127::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37504:127:0;;;:::i;35498:234::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35498:234:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35498:234:0;;:::i;40694:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40694:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40694:116:0;;:::i;33946:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33946:122:0;;;:::i;37639:608::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37639:608:0;;;:::i;20672:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20672:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20672:153:0;;;;;;;;:::i;25389:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25389:25:0;;;:::i;22995:253::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22995:253:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22995:253:0;-1:-1:-1;;;;;22995:253:0;;:::i;25034:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25034:30:0;;;:::i;24995:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24995:32:0;;;:::i;28315:242::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28315:242:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28315:242:0;-1:-1:-1;;;;;28315:242:0;;:::i;25309:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25309:38:0;;;:::i;30649:924::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30649:924:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30649:924:0;-1:-1:-1;;;;;30649:924:0;;:::i;25356:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25356:26:0;;;:::i;25195:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25195:35:0;;;:::i;25568:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25568:25:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25568:25:0;;:::i;43314:270::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43314:270:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43314:270:0;;;;;;;;:::i;40818:498::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40818:498:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40818:498:0;;:::i;25421:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25421:27:0;;;:::i;21156:682::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21156:682:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21156:682:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32105:613::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32105:613:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32105:613:0;-1:-1:-1;;;;;32105:613:0;;:::i;35740:352::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35740:352:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35740:352:0;;:::i;38255:612::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38255:612:0;;;:::i;25274:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25274:28:0;;;:::i;18560:61::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18560:61:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18560:61:0;;;;;;;;;;:::i;27838:197::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27838:197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27838:197:0;;;;;;;;:::i;22657:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22657:26:0;;;:::i;33178:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33178:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33178:98:0;-1:-1:-1;;;;;33178:98:0;;:::i;22250:227::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22250:227:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22250:227:0;-1:-1:-1;;;;;22250:227:0;;:::i;29028:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29028:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29028:182:0;;;;;;;;:::i;25152:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25152:36:0;;;:::i;39768:321::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39768:321:0;;;:::i;25770:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25770:41:0;;;:::i;34340:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34340:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34340:149:0;-1:-1:-1;;;;;34340:149:0;;:::i;29515:251::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29515:251:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29515:251:0;-1:-1:-1;;;;;29515:251:0;;:::i;25707:56::-;;;;;;;;;;;;;:::o;27340:115::-;-1:-1:-1;;;;;27424:18:0;;27400:4;27424:18;;;:11;:18;;;;;;:23;;27340:115;;;;:::o;18387:18::-;;;;;;;;;;;;;;-1:-1:-1;;18387:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24871:21::-;;;;;;-1:-1:-1;;;;;24871:21:0;;:::o;20517:147::-;20581:4;20598:36;20607:10;20619:7;20628:5;20598:8;:36::i;:::-;-1:-1:-1;20652:4:0;20517:147;;;;;:::o;24899:26::-;;;-1:-1:-1;;;;;24899:26:0;;:::o;30137:186::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;30238:26;:24;:26::i;:::-;30275:40;30301:5;30308:6;30275:25;:40::i;:::-;30137:186;;:::o;33430:508::-;33553:11;;33498:7;;33537:2;;-1:-1:-1;;;;;33553:11:0;:25;33550:113;;33627:11;;;;;;;;;-1:-1:-1;;;;;33627:11:0;-1:-1:-1;;;;;33614:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33614:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33614:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33614:36:0;33606:45;;;-1:-1:-1;33550:113:0;33687:2;33676:8;:13;33673:234;;;33718:2;:13;;;33755:20;:6;33766:2;:8;;;33755:20;:10;:20;:::i;:::-;33746:29;;33673:234;;;;33807:2;33796:8;:13;33793:114;;;-1:-1:-1;;33838:13:0;;33875:20;:6;33886:2;:8;;;33875:20;:10;:20;:::i;:::-;33866:29;;33793:114;;-1:-1:-1;33924:6:0;;33430:508;-1:-1:-1;33430:508:0:o;43592:99::-;43648:35;;;43673:9;43648:35;;;;43661:10;;43648:35;;;;;;;;;;43592:99::o;42882:424::-;-1:-1:-1;;;;;42959:16:0;;42951:51;;;;;-1:-1:-1;;;42951:51:0;;;;;;;;;;;;-1:-1:-1;;;42951:51:0;;;;;;;;;;;;;;;43021:25;43035:10;43021:13;:25::i;:::-;43013:52;;;;;-1:-1:-1;;;43013:52:0;;;;;;;;;;;;-1:-1:-1;;;43013:52:0;;;;;;;;;;;;;;;43103:12;;43086:38;;-1:-1:-1;;;;;43103:12:0;43117:6;43086:16;:38::i;:::-;43139:12;;-1:-1:-1;;;;;43139:12:0;43135:164;;43182:27;43198:2;43202:6;43182:15;:27::i;:::-;43135:164;;;43249:12;;43242:45;;-1:-1:-1;;;;;43249:12:0;43276:2;43280:6;43242:45;:33;:45;:::i;25109:36::-;;;;:::o;36470:514::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;36587:16;36568:15;;:35;;36560:69;;;;;-1:-1:-1;;;36560:69:0;;;;;;;;;;;;-1:-1:-1;;;36560:69:0;;;;;;;;;;;;;;;36755:15;;36737;:33;36733:168;;;36810:23;:21;:23::i;:::-;36787:20;:46;36874:15;36848:23;:41;36733:168;36913:15;:34;;;36958:18;:16;:18::i;:::-;36470:514;:::o;18481:24::-;;;;:::o;38875:885::-;38976:15;;38958;:33;38954:129;;;39045:26;:24;:26::i;:::-;39114:10;;39095:16;39215:36;:34;:36::i;:::-;39173:78;;39295:29;39327:26;:24;:26::i;:::-;39295:58;;39394:31;39370:21;:55;39366:330;;;39442:18;39463:58;:21;39489:31;39463:58;:25;:58;:::i;:::-;39442:79;;39549:50;39585:13;;39549:31;39564:15;;39549:10;:14;;:31;;;;:::i;:::-;:35;:50;:35;:50;:::i;:::-;39536:10;:63;-1:-1:-1;39366:330:0;;;39683:1;39670:10;:14;39366:330;39741:10;;39713:39;;;;;;;;;;;;;;;;;;;;;;;;;38875:885;;;:::o;20833:315::-;17511:7;;20925:4;;-1:-1:-1;;;17511:7:0;;;;17510:8;17502:37;;;;;-1:-1:-1;;;17502:37:0;;;;;;;;;;;;-1:-1:-1;;;17502:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20946:15:0;;;;;;:9;:15;;;;;;;;20962:10;20946:27;;;;;;;;-1:-1:-1;;20946:39:0;20942:140;;-1:-1:-1;;;;;21032:15:0;;;;;;:9;:15;;;;;;;;21048:10;21032:27;;;;;;;;:38;;21064:5;21032:38;:31;:38;:::i;:::-;-1:-1:-1;;;;;21002:15:0;;;;;;:9;:15;;;;;;;;21018:10;21002:27;;;;;;;:68;20942:140;21092:26;21102:4;21108:2;21112:5;21092:9;:26::i;:::-;-1:-1:-1;21136:4:0;20833:315;;;;;:::o;31581:516::-;31647:7;31656;31676:13;31700:14;31730:9;31725:332;31743:8;:15;31741:17;;31725:332;;;31783:11;:24;31795:8;31804:1;31795:11;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31795:11:0;31783:24;;;;;;;;;;;;;31811:1;31783:29;31780:266;;;31833:15;31851:32;31871:8;31880:1;31871:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31871:11:0;31851:19;:32::i;:::-;31833:50;-1:-1:-1;31910:18:0;:5;31833:50;31910:18;:9;:18;:::i;:::-;31902:26;;31959:8;31968:1;31959:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31950:20:0;;;31959:11;;31950:20;31947:84;;;32004:7;31995:16;;31947:84;31780:266;;31760:3;;31725:332;;;-1:-1:-1;32075:6:0;-1:-1:-1;32083:5:0;-1:-1:-1;31581:516:0;;;:::o;25524:33::-;;;;:::o;34497:352::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;34591:1;34580:8;:12;34572:45;;;;;-1:-1:-1;;;34572:45:0;;;;;;;;;;;;-1:-1:-1;;;34572:45:0;;;;;;;;;;;;;;;34716:67;34734:48;34766:15;;34734:27;34747:13;;34734:8;:12;;:27;;;;:::i;:48::-;34716:13;;;:67;:17;:67;:::i;:::-;34700:13;:83;34812:15;;:29;;34832:8;34812:29;:19;:29;:::i;:::-;34794:15;:47;-1:-1:-1;34497:352:0:o;18773:108::-;18815:66;18773:108;:::o;18439:35::-;18472:2;18439:35;:::o;35064:426::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;35181:16;35162:15;;:35;;35154:69;;;;;-1:-1:-1;;;35154:69:0;;;;;;;;;;;;-1:-1:-1;;;35154:69:0;;;;;;;;;;;;;;;35260:15;35242;;:33;35234:67;;;;;-1:-1:-1;;;35234:67:0;;;;;;;;;;;;-1:-1:-1;;;35234:67:0;;;;;;;;;;;;;;;35339:15;35320:16;:34;35312:72;;;;;-1:-1:-1;;;35312:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35395:15;:34;;;35440:23;:42;35064:426::o;25926:1406::-;26296:11;;;;26295:12;26287:50;;;;;-1:-1:-1;;;26287:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26381:7;26356:22;:32;26348:76;;;;;-1:-1:-1;;;26348:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26437:11;:18;;-1:-1:-1;;26437:18:0;26451:4;26437:18;;;26466:29;26482:4;26488:6;26466:15;:29::i;:::-;26508:11;:26;;-1:-1:-1;;;;;;26508:26:0;-1:-1:-1;;;;;26508:26:0;;;;;;;;;;;26567:31;;26583:11;-1:-1:-1;26567:15:0;:31::i;:::-;26609:34;26625:14;26641:1;26609:15;:34::i;:::-;26654:35;26670:15;26687:1;26654:15;:35::i;:::-;26702:6;:16;;-1:-1:-1;;;;;;26702:16:0;;-1:-1:-1;;;;;26702:16:0;;;;;;;;;;;;;;26754:9;:22;;-1:-1:-1;;;;;;26754:22:0;;;;;;;;;;26787:11;:26;;;;;;;;;;26824:12;:28;;;;;;;;;;26863:8;:20;;;;;;;;;;;;;;26894:17;:38;;;26962:15;26943;:34;;;26988:14;:32;;;27031:21;:46;;;27088:13;:30;;;27149:7;27131:15;:25;27191:7;27167:21;:31;27209:15;:32;;;27252:23;:41;27306:18;:16;:18::i;:::-;25926:1406;;;;;;;;;;;;;;:::o;29774:355::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;29908:31;;;29900:62;;;;;-1:-1:-1;;;29900:62:0;;;;;;;;;;;;-1:-1:-1;;;29900:62:0;;;;;;;;;;;;;;;29973:26;:24;:26::i;:::-;30014:9;30010:112;30025:15;;;30010:112;;;30062:48;30088:6;;30095:1;30088:9;;;;;;;;;;;;;-1:-1:-1;;;;;30088:9:0;30099:7;;30107:1;30099:10;;;;;;;;;;;;;30062:25;:48::i;:::-;30042:3;;30010:112;;;;29774:355;;;;:::o;18630:31::-;;;;:::o;25487:30::-;;;;:::o;41324:641::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;41404:16;41423:29;41445:6;41423:21;:29::i;:::-;41404:48;;41463:27;41478:11;41463:14;:27::i;:::-;41792:12;;41785:45;;;-1:-1:-1;;;41785:45:0;;41824:4;41785:45;;;;;;41770:12;;-1:-1:-1;;;;;41792:12:0;;41785:30;;:45;;;;;;;;;;;;;;41792:12;41785:45;;;5:2:-1;;;;30:1;27;20:12;5:2;41785:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41785:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41785:45:0;41875:15;;41785:45;;-1:-1:-1;41863:28:0;;41785:45;;41863:28;:11;:28;:::i;:::-;41849:10;;:42;;41841:79;;;;;-1:-1:-1;;;41841:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41938:19;;;;;;;;;;;;;;;;;22978:1;;41324:641;:::o;33355:67::-;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;33404:10;:8;:10::i;:::-;33355:67::o;34076:256::-;17511:7;;-1:-1:-1;;;17511:7:0;;;;17510:8;17502:37;;;;;-1:-1:-1;;;17502:37:0;;;;;;;;;;;;-1:-1:-1;;;17502:37:0;;;;;;;;;;;;;;;34170:6;;;;;-1:-1:-1;;;;;34170:6:0;34156:10;:20;34148:40;;;;;-1:-1:-1;;;34148:40:0;;;;;;;;;;;;-1:-1:-1;;;34148:40:0;;;;;;;;;;;;;;;34216:17;:15;:17::i;:::-;34207:5;:26;;34199:61;;;;;-1:-1:-1;;;34199:61:0;;;;;;;;;;;;-1:-1:-1;;;34199:61:0;;;;;;;;;;;;;;;34271:16;34277:2;34281:5;34271;:16::i;:::-;34298:26;:24;:26::i;28565:96::-;28638:8;:15;28565:96;;:::o;25237:30::-;;;;:::o;36100:362::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;36235:22;36210:21;;:47;;36202:87;;;;;-1:-1:-1;;;36202:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36334:7;36308:22;:33;;36300:68;;;;;-1:-1:-1;;;36300:68:0;;;;;;;;;;;;-1:-1:-1;;;36300:68:0;;;;;;;;;;;;;;;36379:21;:46;;;36436:18;:16;:18::i;25820:46::-;;;;;;;;;;;;;:::o;24932:24::-;;;-1:-1:-1;;;;;24932:24:0;;:::o;27463:367::-;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;27581:31;;;27573:62;;;;;-1:-1:-1;;;27573:62:0;;;;;;;;;;;;-1:-1:-1;;;27573:62:0;;;;;;;;;;;;;;;27650:9;27646:103;27661:16;;;27646:103;;;27699:38;27715:6;;27722:1;27715:9;;;;;;;;;;;;;-1:-1:-1;;;;;27715:9:0;27726:7;;27734:1;27726:10;;;;;;;;;;;;;27699:15;:38::i;:::-;27679:3;;27646:103;;;;27759:26;:24;:26::i;:::-;27796;:24;:26::i;:::-;27463:367;;;;:::o;25661:39::-;;;;:::o;17274:78::-;17337:7;;-1:-1:-1;;;17337:7:0;;;;;17274:78::o;34857:199::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;34943:9;;-1:-1:-1;;;;;34943:23:0;;;:9;;:23;;34935:51;;;;;-1:-1:-1;;;34935:51:0;;;;;;;;;;;;-1:-1:-1;;;34935:51:0;;;;;;;;;;;;;;;34997:9;:22;;-1:-1:-1;;;;;;34997:22:0;-1:-1:-1;;;;;34997:22:0;;;;;35030:18;:16;:18::i;42443:431::-;-1:-1:-1;;;;;42528:16:0;;42520:51;;;;;-1:-1:-1;;;42520:51:0;;;;;;;;;;;;-1:-1:-1;;;42520:51:0;;;;;;;;;;;;;;;42590:25;42604:10;42590:13;:25::i;:::-;42582:52;;;;;-1:-1:-1;;;42582:52:0;;;;;;;;;;;;-1:-1:-1;;;42582:52:0;;;;;;;;;;;;;;;42672:11;;42655:37;;-1:-1:-1;;;;;42672:11:0;42685:6;42655:16;:37::i;:::-;42707:11;;-1:-1:-1;;;;;42707:11:0;42703:162;;42749:27;42765:2;42769:6;42749:15;:27::i;42703:162::-;42816:11;;42809:44;;-1:-1:-1;;;;;42816:11:0;42842:2;42846:6;42809:44;:32;:44;:::i;24963:23::-;;;-1:-1:-1;;;;;24963:23:0;;:::o;36992:504::-;37046:7;37088:15;;37070;:33;37066:402;;;37120:21;37144:44;37164:23;;37144:15;:19;;:44;;;;:::i;:::-;37120:68;;37203:17;37223:114;37298:38;37316:19;:17;:19::i;:::-;37298:13;;:38;:17;:38;:::i;:::-;37223:70;37272:20;;37223:44;37251:15;;37223:23;;:27;;:44;;;;:::i;:::-;:48;:70;:48;:70;:::i;:::-;:74;:114;:74;:114;:::i;:::-;37203:134;;37352:17;37372:36;37392:15;;37372;:19;;:36;;;;:::i;:::-;37352:56;-1:-1:-1;37432:24:0;:9;37352:56;37432:24;:13;:24;:::i;:::-;37425:31;;;;;;;37066:402;-1:-1:-1;37487:1:0;36992:504;:::o;25073:29::-;;;;:::o;28669:351::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;28801:31;;;28793:62;;;;;-1:-1:-1;;;28793:62:0;;;;;;;;;;;;-1:-1:-1;;;28793:62:0;;;;;;;;;;;;;;;28866:26;:24;:26::i;:::-;28907:9;28903:110;28918:15;;;28903:110;;;28955:46;28979:6;;28986:1;28979:9;;;;;;;;;;;;;-1:-1:-1;;;;;28979:9:0;28990:7;;28998:1;28990:10;;;;;;;;;;;;;28955:23;:46::i;:::-;28935:3;;28903:110;;18512:41;;;;;;;;;;;;;:::o;32726:444::-;32788:7;32808:14;32835:5;-1:-1:-1;;;;;32825:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32825:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32825:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32825:25:0;32878;;;-1:-1:-1;;;32878:25:0;;;;32825;;-1:-1:-1;32861:14:0;;-1:-1:-1;;;;;32878:23:0;;;;;:25;;;;;32825;;32878;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;32878:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32878:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32878:25:0;32955:30;;;-1:-1:-1;;;32955:30:0;;;;32878:25;;-1:-1:-1;32915:16:0;;;;-1:-1:-1;;;;;32955:28:0;;;;;:30;;;;;;;;;;;;;;;:28;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32955:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32955:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32955:30:0;;;;;;;32914:71;;;;;-1:-1:-1;32914:71:0;;-1:-1:-1;;;;;;33000:23:0;;33018:4;33000:23;32996:148;;;-1:-1:-1;33047:8:0;-1:-1:-1;33040:15:0;;-1:-1:-1;;33040:15:0;32996:148;-1:-1:-1;;;;;33077:23:0;;33095:4;33077:23;33073:71;;;33124:8;-1:-1:-1;33117:15:0;;-1:-1:-1;;;33117:15:0;33073:71;-1:-1:-1;33161:1:0;;32726:444;-1:-1:-1;;;;;32726:444:0:o;25600:54::-;;;;;;;;;;;;;:::o;25455:25::-;;;;:::o;18888:38::-;;;;;;;;;;;;;:::o;40097:321::-;40156:9;40151:260;40169:8;:15;40167:17;;40151:260;;;40223:8;40232:1;40223:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40223:11:0;40209:10;:25;;;;:55;;;40238:26;40252:8;40261:1;40252:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40252:11:0;40238:13;:26::i;:::-;40209:113;;;;;40294:8;40303:1;40294:11;;;;;;;;;;;;;;;;;;;40285:37;;;-1:-1:-1;;;40285:37:0;;;;-1:-1:-1;;;;;40294:11:0;;;;40285:35;;:37;;;;;;;;;;40294:11;40285:37;;;5:2:-1;;;;30:1;27;20:12;5:2;40285:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40285:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40285:37:0;-1:-1:-1;;;;;40268:54:0;40276:4;40268:54;40209:113;40206:194;;;40352:8;40361:1;40352:11;;;;;;;;;;;;;;;;;40343:41;;;-1:-1:-1;;;40343:41:0;;;;-1:-1:-1;;;;;40352:11:0;;;;40343:39;;:41;;;;;;;;;;40352:11;;40343:41;;;5:2:-1;;;;30:1;27;20:12;5:2;40343:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40343:41:0;;;;40206:194;40186:3;;40151:260;;33284:63;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;33331:8;:6;:8::i;21953:20::-;;;-1:-1:-1;;;;;21953:20:0;;:::o;18412:::-;;;;;;;;;;;;;;;-1:-1:-1;;18412:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37504:127;37555:7;37610:13;;37592:15;;37582:7;:25;:41;;;;;;37575:48;;37504:127;:::o;35498:234::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;35612:15;35594:14;;:33;;35586:66;;;;;-1:-1:-1;;;35586:66:0;;;;;;;;;;;;-1:-1:-1;;;35586:66:0;;;;;;;;;;;;;;;35663:14;:32;;;35706:18;:16;:18::i;40694:116::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;40775:27;40790:11;40775:14;:27::i;33946:122::-;33993:7;34020:40;34048:11;;34020:23;34038:4;34020:13;;:17;;:23;;;;:::i;:::-;:27;:40;:27;:40;:::i;:::-;34013:47;;33946:122;:::o;37639:608::-;37705:7;37724:17;37755:9;;;;;;;;;-1:-1:-1;;;;;37755:9:0;-1:-1:-1;;;;;37744:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37744:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37744:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37744:33:0;;-1:-1:-1;37792:14:0;;37788:433;;37947:17;;37838:4;;37894;;37823:12;;37947:69;;37894:4;;37947:59;;37894:4;;37947:59;;37838:4;37947:27;:21;:27;:::i;:69::-;37913:103;;38031:40;38074:71;38135:9;38074:56;38122:7;38074:43;38102:14;;38074:23;:27;;:43;;;;:::i;:71::-;38031:114;-1:-1:-1;38167:42:0;38031:114;38204:4;38167:42;:36;:42;:::i;:::-;38160:49;;;;;;;;;37788:433;38238:1;38231:8;;;37639:608;:::o;20672:153::-;17511:7;;20746:4;;-1:-1:-1;;;17511:7:0;;;;17510:8;17502:37;;;;;-1:-1:-1;;;17502:37:0;;;;;;;;;;;;-1:-1:-1;;;17502:37:0;;;;;;;;;;;;;;;20763:32;20773:10;20785:2;20789:5;20763:9;:32::i;25389:25::-;;;;:::o;22995:253::-;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23079:26:0;;23071:71;;;;;-1:-1:-1;;;23071:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23177:11;;23158:45;;-1:-1:-1;;;;;23158:45:0;;;;23177:11;;23158:45;;23177:11;;23158:45;23214:11;:26;;-1:-1:-1;;;;;;23214:26:0;-1:-1:-1;;;;;23214:26:0;;;;;;;;;;22995:253::o;25034:30::-;;;;:::o;24995:32::-;;;;:::o;28315:242::-;28373:4;28394:9;28390:137;28408:8;:15;28405:18;;28390:137;;;28463:5;-1:-1:-1;;;;;28448:20:0;:8;28457:1;28448:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28448:11:0;:20;28445:71;;;28496:4;28489:11;;;;;28445:71;28425:3;;28390:137;;;-1:-1:-1;28544:5:0;;28315:242;-1:-1:-1;;28315:242:0:o;25309:38::-;;;;:::o;30649:924::-;30712:7;30735:11;;30750:1;30735:16;:43;;;-1:-1:-1;;;;;;30755:18:0;;;;;;:11;:18;;;;;;30777:1;30755:23;;30735:43;:78;;;-1:-1:-1;30782:26:0;;:31;30735:78;30732:118;;;-1:-1:-1;30837:1:0;30830:8;;30732:118;30983:11;;30862:18;;;;;;-1:-1:-1;;;;;30983:11:0;:25;30979:121;;31058:11;;;;;;;;;-1:-1:-1;;;;;31058:11:0;-1:-1:-1;;;;;31049:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31049:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31049:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31049:35:0;;-1:-1:-1;30979:121:0;31114:18;31147:15;31204:27;31225:5;31204:20;:27::i;:::-;31177:54;;-1:-1:-1;31177:54:0;-1:-1:-1;31263:33:0;:17;31177:54;31263:33;:21;:33;:::i;:::-;31249:11;;:47;31246:147;;;31327:50;31366:10;31327:34;31343:17;31327:11;;:15;;:34;;;;:::i;:50::-;31317:60;;31246:147;31470:26;;;-1:-1:-1;;;;;31436:28:0;;;;;;:21;:28;;;;;;;;31424:73;;31470:26;31424:41;;:7;;:41;:11;:41;:::i;:73::-;31407:90;;30649:924;;;31535:30;31550:14;31535:10;:14;;:30;;;;:::i;:::-;31528:37;30649:924;-1:-1:-1;;;;30649:924:0:o;25356:26::-;;;-1:-1:-1;;;;;25356:26:0;;:::o;25195:35::-;;;;:::o;25568:25::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25568:25:0;;-1:-1:-1;25568:25:0;:::o;43314:270::-;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43411:20:0;;43407:170;;43448:36;43464:10;43476:7;43448:15;:36::i;43407:170::-;43517:48;-1:-1:-1;;;;;43517:27:0;;43545:10;43557:7;43517:48;:27;:48;:::i;40818:498::-;40886:7;40929:18;;40910:15;:37;40906:403;;40982:15;;40971:27;;:6;;:27;:10;:27;:::i;:::-;40964:34;;;;40906:403;41136:18;;41116:17;;41136:39;;41159:15;41136:39;:22;:39;:::i;:::-;41116:59;;41190:16;41209:25;41223:10;;41209:9;:13;;:25;;;;:::i;:::-;41281:15;;41190:44;;-1:-1:-1;41256:41:0;;:20;:6;41190:44;41256:20;:10;:20;:::i;:41::-;41249:48;;;;;;25421:27;;;-1:-1:-1;;;;;25421:27:0;;:::o;21156:682::-;21302:15;21290:8;:27;;21282:62;;;;;-1:-1:-1;;;21282:62:0;;;;;;;;;;;;-1:-1:-1;;;21282:62:0;;;;;;;;;;;;;;;21460:16;;-1:-1:-1;;;;;21556:13:0;;;21355:14;21556:13;;;:6;:13;;;;;;;;:15;;;;;;;;;21505:77;;18815:66;21505:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21505:77:0;;;;;21495:88;;;;;;-1:-1:-1;;;21396:202:0;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21396:202:0;;;;;;21372:237;;;;;;;;;21647:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21355:14;;21556:15;21647:26;;;;;-1:-1:-1;;21647:26:0;;;;;;;;;;21556:15;21647:26;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21647:26:0;;-1:-1:-1;;21647:26:0;;;-1:-1:-1;;;;;;;21692:30:0;;;;;;:59;;;21746:5;-1:-1:-1;;;;;21726:25:0;:16;-1:-1:-1;;;;;21726:25:0;;21692:59;21684:104;;;;;-1:-1:-1;;;21684:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21799:31;21808:5;21815:7;21824:5;21799:8;:31::i;:::-;21156:682;;;;;;;;;:::o;32105:613::-;32170:7;32190:12;32216:5;-1:-1:-1;;;;;32205:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32205:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32205:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32205:34:0;;-1:-1:-1;;;;;;32253:18:0;;32250:58;;32295:1;32288:8;;;;;32250:58;32318:15;32336:22;32353:4;32336:16;:22::i;:::-;32318:40;-1:-1:-1;32372:12:0;32369:52;;32408:1;32401:8;;;;;;32369:52;32431:21;32466:5;-1:-1:-1;;;;;32455:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32455:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32455:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32455:31:0;32517:29;;;-1:-1:-1;;;32517:29:0;;;;32455:31;;-1:-1:-1;32497:17:0;;-1:-1:-1;;;;;32517:27:0;;;;;:29;;;;;32455:31;;32517:29;;;;;;;:27;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;32517:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32517:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32517:29:0;;-1:-1:-1;32560:13:0;;;;;:55;;-1:-1:-1;32606:9:0;32577:26;:7;32589:13;32577:26;:11;:26;:::i;:::-;:38;32560:55;32557:135;;;32639:41;32670:9;32639:26;:7;32651:13;32639:26;:11;:26;:::i;:41::-;32632:48;;;;;;;;35740:352;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;35875:22;35850:21;;:47;;35842:78;;;;;-1:-1:-1;;;35842:78:0;;;;;;;;;;;;-1:-1:-1;;;35842:78:0;;;;;;;;;;;;;;;35964:7;35939:22;:32;35931:67;;;;;-1:-1:-1;;;35931:67:0;;;;;;;;;;;;-1:-1:-1;;;35931:67:0;;;;;;;;;;;;;;;36009:21;:46;;;36066:18;:16;:18::i;38255:612::-;38477:9;;38466:49;;;-1:-1:-1;;;38466:49:0;;;;38311:7;;38357;;38311;;;;-1:-1:-1;;;;;38477:9:0;;38466:47;;:49;;;;;;;;;;;;;;38477:9;38466:49;;;5:2:-1;;;;30:1;27;20:12;5:2;38466:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38466:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38466:49:0;38601:21;;38466:49;;-1:-1:-1;38550:96:0;;38629:16;;38550:74;;38580:43;;38629:16;;38580:43;:20;:43;:::i;38550:96::-;38530:116;;38255:612;38670:25;38698:1;38670:29;;38745:66;38794:16;38745:44;38767:21;;38745:17;:21;;:44;;;;:::i;:66::-;38725:86;-1:-1:-1;;;;38255:612:0;:::o;25274:28::-;;;;:::o;18560:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;27838:197::-;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;27923:30;27939:5;27946:6;27923:15;:30::i;:::-;27964:26;:24;:26::i;:::-;28001;:24;:26::i;22657:::-;;;-1:-1:-1;;;;;22657:26:0;;:::o;33178:98::-;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;33248:8;:20;;-1:-1:-1;;;;;;33248:20:0;-1:-1:-1;;;;;33248:20:0;;;;;;;;;;33178:98::o;22250:227::-;22194:5;;-1:-1:-1;;;;;22194:5:0;22180:10;:19;22172:50;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;-1:-1:-1;;;22172:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22333:22:0;;22325:64;;;;;-1:-1:-1;;;22325:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22426:5;;;22405:37;;-1:-1:-1;;;;;22405:37:0;;;;22426:5;;;22405:37;;;22453:5;:16;;-1:-1:-1;;;;;;22453:16:0;-1:-1:-1;;;;;22453:16:0;;;;;;;;;;22250:227::o;29028:182::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;29127:26;:24;:26::i;:::-;29164:38;29188:5;29195:6;29164:23;:38::i;25152:36::-;;;;:::o;39768:321::-;39827:9;39822:260;39840:8;:15;39838:17;;39822:260;;;39894:8;39903:1;39894:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39894:11:0;39880:10;:25;;;;:55;;;39909:26;39923:8;39932:1;39923:11;;;;;;;39909:26;39880:113;;;;;39965:8;39974:1;39965:11;;;;;;;;;;;;;;;;;;;39956:37;;;-1:-1:-1;;;39956:37:0;;;;-1:-1:-1;;;;;39965:11:0;;;;39956:35;;:37;;;;;;;;;;39965:11;39956:37;;;5:2:-1;;;;30:1;27;20:12;5:2;39956:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39956:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39956:37:0;-1:-1:-1;;;;;39939:54:0;39947:4;39939:54;39880:113;39877:194;;;40023:8;40032:1;40023:11;;;;;;;;;;;;;;;;;40014:41;;;-1:-1:-1;;;40014:41:0;;;;-1:-1:-1;;;;;40023:11:0;;;;40014:39;;:41;;;;;;;;;;40023:11;;40014:41;;;5:2:-1;;;;30:1;27;20:12;5:2;40014:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40014:41:0;;;;39877:194;39857:3;;39822:260;;25770:41;;;;:::o;34340:149::-;22916:5;;-1:-1:-1;;;;;22916:5:0;22902:10;:19;;:48;;-1:-1:-1;22939:11:0;;-1:-1:-1;;;;;22939:11:0;22925:10;:25;22902:48;22894:73;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;-1:-1:-1;;;22894:73:0;;;;;;;;;;;;;;;34420:6;;-1:-1:-1;;;;;34420:17:0;;;:6;;;;;:17;;34412:42;;;;;-1:-1:-1;;;34412:42:0;;;;;;;;;;;;-1:-1:-1;;;34412:42:0;;;;;;;;;;;;;;;34465:6;:16;;-1:-1:-1;;;;;34465:16:0;;;;;-1:-1:-1;;;;;;34465:16:0;;;;;;;;;34340:149::o;29515:251::-;29580:7;29603:24;;29631:1;29603:29;29600:69;;;-1:-1:-1;29656:1:0;29649:8;;29600:69;29733:24;;-1:-1:-1;;;;;29701:26:0;;;;;;:19;:26;;;;;;29686:10;;:72;;29733:24;29686:42;;:10;:42;:14;:42;:::i;20112:169::-;-1:-1:-1;;;;;20193:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;20242:31;;;;;;;;;;;;;;;;;20112:169;;;:::o;30339:302::-;-1:-1:-1;;;;;30433:18:0;;;;;;:11;:18;;;;;;30455:1;30433:23;30425:48;;;;;-1:-1:-1;;;30425:48:0;;;;;;;;;;;;-1:-1:-1;;;30425:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30544:28:0;;;;;;:21;:28;;;;;;;;;30513:26;;:72;;30578:6;;30513:60;;;:30;:60;:::i;:72::-;30484:26;:101;;;-1:-1:-1;;;;;30596:28:0;;;;;;;:21;:28;;;;;;;:37;30339:302::o;6137:132::-;6195:7;6222:39;6226:1;6229;6222:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6215:46;6137:132;-1:-1:-1;;;6137:132:0:o;5198:471::-;5256:7;5501:6;5497:47;;-1:-1:-1;5531:1:0;5524:8;;5497:47;5568:5;;;5572:1;5568;:5;:1;5592:5;;;;;:10;5584:56;;;;-1:-1:-1;;;5584:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41973:462;42053:8;;-1:-1:-1;;;;;42053:8:0;42050:60;;42092:7;;42050:60;42122:15;-1:-1:-1;;;;;42152:19:0;;42148:164;;-1:-1:-1;42198:21:0;42148:164;;;42262:38;;;-1:-1:-1;;;42262:38:0;;42294:4;42262:38;;;;;;-1:-1:-1;;;;;42262:23:0;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;42262:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42262:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42262:38:0;;-1:-1:-1;42148:164:0;42334:7;42325:6;:16;42322:106;;;42373:8;;-1:-1:-1;;;;;42373:8:0;42358:30;42389:5;42396:19;:6;42407:7;42396:19;:10;:19;:::i;:::-;42358:58;;;;;;;;;;;;;-1:-1:-1;;;;;42358:58:0;-1:-1:-1;;;;;42358:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42358:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42358:58:0;;;;42322:106;41973:462;;;:::o;43699:115::-;43769:37;;-1:-1:-1;;;;;43769:29:0;;;:37;;;;;43799:6;;43769:37;;;;43799:6;43769:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;12364:176:0;12473:58;;;-1:-1:-1;;;;;12473:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12473:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;12447:85:0;;12466:5;;12447:18;:85::i;4282:136::-;4340:7;4367:43;4371:1;4374;4367:43;;;;;;;;;;;;;;;;;:3;:43::i;20289:220::-;-1:-1:-1;;;;;20383:15:0;;;;;;:9;:15;;;;;;:26;;20403:5;20383:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;20365:15:0;;;;;;;:9;:15;;;;;;:44;;;;20436:13;;;;;;;:24;;20454:5;20436:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;20420:13:0;;;;;;;:9;:13;;;;;;;;;:40;;;;20476:25;;;;;;;20420:13;;20476:25;;;;;;;;;;;;;20289:220;;;:::o;3826:181::-;3884:7;3916:5;;;3940:6;;;;3932:46;;;;;-1:-1:-1;;;3932:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19093:585;19190:16;;;;:4;;:16;;;;;:::i;:::-;-1:-1:-1;19217:20:0;;;;:6;;:20;;;;;:::i;:::-;-1:-1:-1;19410:95:0;;19308:9;;19410:95;;;;;;;;;;;;;;;;19540:4;19524:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19524:22:0;;;;;;;;;19575:10;;;;;;;;-1:-1:-1;;;19575:10:0;;;;;19381:278;;;;;;;;;;;;;19565:21;19381:278;;;;;;;;;;;19639:4;19381:278;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19381:278:0;;;;;;;-1:-1:-1;;19357:313:0;;;;;19338:16;:332;-1:-1:-1;;19093:585:0:o;28043:264::-;-1:-1:-1;;;;;28122:19:0;;;28119:181;;-1:-1:-1;;;;;28158:18:0;;;;;;:11;:18;;;;;:27;;;28203:19;28170:5;28203:12;:19::i;:::-;28200:88;;28252:8;27:10:-1;;39:1;23:18;;45:23;;-1:-1;28252:20:0;;;;;;;;-1:-1:-1;;;;;28252:20:0;;-1:-1:-1;;;;;;28252:20:0;;;;;;28043:264;;:::o;40426:260::-;40491:26;:24;:26::i;:::-;40551:10;;40533:42;;;;;;;;;;;;;;;;;;;;;;;;40586:10;:24;;;40662:15;;40642:36;;:15;;:36;:19;:36;:::i;:::-;40621:18;:57;-1:-1:-1;40426:260:0:o;18033:89::-;18073:7;:15;;-1:-1:-1;;;;18073:15:0;;;18104:10;;;;18083:5;;18104:10;18033:89::o;19686:201::-;19759:11;;:22;;19775:5;19759:22;:15;:22;:::i;:::-;19745:11;:36;-1:-1:-1;;;;;19808:13:0;;;;;;:9;:13;;;;;;:24;;19826:5;19808:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;19792:13:0;;;;;;:9;:13;;;;;;;;:40;;;;19848:31;;;;;;;19792:13;;;;19848:31;;;;;;;;;;19686:201;;:::o;29218:289::-;29310:20;29324:5;29310:13;:20::i;:::-;29302:45;;;;;-1:-1:-1;;;29302:45:0;;;;;;;;;;;;-1:-1:-1;;;29302:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29414:26:0;;;;;;:19;:26;;;;;;29385:24;;:68;;29446:6;;29385:56;;;:28;:56;:::i;:68::-;29358:24;:95;-1:-1:-1;;;;;29464:26:0;;;;;;;:19;:26;;;;;:35;29218:289::o;17854:84::-;17902:4;17892:14;;-1:-1:-1;;;;17892:14:0;-1:-1:-1;;;17892:14:0;;;17922:8;;;;17892:14;;17922:8;17854:84::o;6799:345::-;6885:7;6987:12;6980:5;6972:28;;;;-1:-1:-1;;;6972:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6972:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7011:9;7027:1;7023;:5;;;;;;;6799:345;-1:-1:-1;;;;;6799:345:0:o;14403:1114::-;15007:27;15015:5;-1:-1:-1;;;;;15007:25:0;;:27::i;:::-;14999:71;;;;;-1:-1:-1;;;14999:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15144:12;15158:23;15193:5;-1:-1:-1;;;;;15185:19:0;15205:4;15185:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15185:25:0;;;;;;;;;;;;;;;;;;;;;;;;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;;15143:67:0;;;;15229:7;15221:52;;;;;-1:-1:-1;;;15221:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15290:17;;:21;15286:224;;15432:10;15421:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15421:30:0;15413:85;;;;-1:-1:-1;;;15413:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4755:192;4841:7;4877:12;4869:6;;;;4861:29;;;;-1:-1:-1;;;4861:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4861:29:0;-1:-1:-1;;;4913:5:0;;;4755:192::o;9205:619::-;9265:4;9733:20;;9576:66;9773:23;;;;;;:42;;-1:-1:-1;;9800:15:0;;;9205:619;-1:-1:-1;;9205:619:0:o;24723:19386::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24723:19386:0;;;-1:-1:-1;24723:19386:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://16682c689614e27f73f7adc02680ccbdaea89db88d1292a1cd31a9fabe93a338
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.