Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 11758526 | 1287 days ago | IN | 0 ETH | 0.0080834 | ||||
Claim And Restak... | 11758519 | 1287 days ago | IN | 0 ETH | 0.00715426 | ||||
Claim | 11757843 | 1287 days ago | IN | 0 ETH | 0.00583327 | ||||
Claim | 11753101 | 1288 days ago | IN | 0 ETH | 0.00395157 | ||||
Stake | 11753084 | 1288 days ago | IN | 0 ETH | 0.02370882 | ||||
0x60806040 | 11752370 | 1288 days ago | IN | 0 ETH | 0.3560575 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingV1t
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-29 */ /** * Copyright 2017-2020, bZeroX, LLC <https://bzx.network/>. All Rights Reserved. * Licensed under the Apache License, Version 2.0. */ pragma solidity 0.5.17; pragma experimental ABIEncoderV2; contract IERC20 { string public name; uint8 public decimals; string public symbol; function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function allowance(address _owner, address _spender) public view returns (uint256); function approve(address _spender, uint256 _value) public returns (bool); function transfer(address _to, uint256 _value) public returns (bool); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "unauthorized"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @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 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"); } } /** * @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 Integer division of two numbers, rounding up and truncating the quotient */ function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { return divCeil(a, b, "SafeMath: division by zero"); } /** * @dev Integer division of two numbers, rounding up and truncating the quotient */ function divCeil(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, errorMessage); if (a == 0) { return 0; } uint256 c = ((a - 1) / b) + 1; 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; } function min256(uint256 _a, uint256 _b) internal pure returns (uint256) { return _a < _b ? _a : _b; } } /** * @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"); } } } /** * @dev Library for managing loan sets * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * Include with `using EnumerableBytes32Set for EnumerableBytes32Set.Bytes32Set;`. * */ library EnumerableBytes32Set { struct Bytes32Set { // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) index; bytes32[] values; } /** * @dev Add an address value to a set. O(1). * Returns false if the value was already in the set. */ function addAddress(Bytes32Set storage set, address addrvalue) internal returns (bool) { bytes32 value; assembly { value := addrvalue } return addBytes32(set, value); } /** * @dev Add a value to a set. O(1). * Returns false if the value was already in the set. */ function addBytes32(Bytes32Set storage set, bytes32 value) internal returns (bool) { if (!contains(set, value)){ set.index[value] = set.values.push(value); return true; } else { return false; } } /** * @dev Removes an address value from a set. O(1). * Returns false if the value was not present in the set. */ function removeAddress(Bytes32Set storage set, address addrvalue) internal returns (bool) { bytes32 value; assembly { value := addrvalue } return removeBytes32(set, value); } /** * @dev Removes a value from a set. O(1). * Returns false if the value was not present in the set. */ function removeBytes32(Bytes32Set storage set, bytes32 value) internal returns (bool) { if (contains(set, value)){ uint256 toDeleteIndex = set.index[value] - 1; uint256 lastIndex = set.values.length - 1; // If the element we're deleting is the last one, we can just remove it without doing a swap if (lastIndex != toDeleteIndex) { bytes32 lastValue = set.values[lastIndex]; // Move the last value to the index where the deleted value is set.values[toDeleteIndex] = lastValue; // Update the index for the moved value set.index[lastValue] = toDeleteIndex + 1; // All indexes are 1-based } // Delete the index entry for the deleted value delete set.index[value]; // Delete the old entry for the moved value set.values.pop(); return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return set.index[value] != 0; } /** * @dev Returns true if the value is in the set. O(1). */ function containsAddress(Bytes32Set storage set, address addrvalue) internal view returns (bool) { bytes32 value; assembly { value := addrvalue } return set.index[value] != 0; } /** * @dev Returns an array with all values in the set. O(N). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * WARNING: This function may run out of gas on large sets: use {length} and * {get} instead in these cases. */ function enumerate(Bytes32Set storage set, uint256 start, uint256 count) internal view returns (bytes32[] memory output) { uint256 end = start + count; require(end >= start, "addition overflow"); end = set.values.length < end ? set.values.length : end; if (end == 0 || start >= end) { return output; } output = new bytes32[](end-start); for (uint256 i = start; i < end; i++) { output[i-start] = set.values[i]; } return output; } /** * @dev Returns the number of elements on the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return set.values.length; } /** @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function get(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return set.values[index]; } /** @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function getAddress(Bytes32Set storage set, uint256 index) internal view returns (address) { bytes32 value = set.values[index]; address addrvalue; assembly { addrvalue := value } return addrvalue; } } contract StakingUpgradeable is Ownable { address public implementation; } contract StakingState is StakingUpgradeable { using SafeMath for uint256; using SafeERC20 for IERC20; using EnumerableBytes32Set for EnumerableBytes32Set.Bytes32Set; uint256 public constant initialCirculatingSupply = 1030000000e18 - 889389933e18; address internal constant ZERO_ADDRESS = address(0); bool public isPaused; address public fundsWallet; mapping(address => uint256) internal _totalSupplyPerToken; // token => value mapping(address => mapping(address => uint256)) internal _balancesPerToken; // token => account => value mapping(address => address) public delegate; // user => delegate mapping(address => mapping(address => uint256)) public delegatedPerToken; // token => user => value uint256 public bzrxPerTokenStored; mapping(address => uint256) public bzrxRewardsPerTokenPaid; // user => value mapping(address => uint256) public bzrxRewards; // user => value mapping(address => uint256) public bzrxVesting; // user => value uint256 public stableCoinPerTokenStored; mapping(address => uint256) public stableCoinRewardsPerTokenPaid; // user => value mapping(address => uint256) public stableCoinRewards; // user => value mapping(address => uint256) public stableCoinVesting; // user => value uint256 public vBZRXWeightStored; uint256 public iBZRXWeightStored; uint256 public LPTokenWeightStored; EnumerableBytes32Set.Bytes32Set internal _delegatedSet; uint256 public lastRewardsAddTime; mapping(address => uint256) internal _vestingLastSync; mapping(address => address[]) public swapPaths; mapping(address => uint256) public stakingRewards; uint256 public rewardPercent = 50e18; uint256 public maxUniswapDisagreement = 3e18; uint256 public maxCurveDisagreement = 3e18; uint256 public callerRewardDivisor = 100; address[] public currentFeeTokens; } interface IUniswapV2Router { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); function getAmountsOut( uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB); } interface ICurve3Pool { function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount) external; function get_virtual_price() external view returns (uint256); } interface IBZxPartial { enum FeeClaimType { All, Lending, Trading, Borrowing } function withdrawFees( address[] calldata tokens, address receiver, FeeClaimType feeType) external returns (uint256[] memory amounts); function queryFees( address[] calldata tokens, FeeClaimType feeType) external view returns (uint256[] memory amountsHeld, uint256[] memory amountsPaid); function priceFeeds() external view returns (address); } contract StakingConstants { address public constant BZRX = 0x56d811088235F11C8920698a204A5010a788f4b3; address public constant vBZRX = 0xB72B31907C1C95F3650b64b2469e08EdACeE5e8F; address public constant iBZRX = 0x18240BD9C07fA6156Ce3F3f61921cC82b2619157; address public constant LPToken = 0xe26A220a341EAca116bDa64cF9D5638A935ae629; IERC20 public constant curve3Crv = IERC20(0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490); address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; IUniswapV2Router public constant uniswapRouter = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); ICurve3Pool public constant curve3pool = ICurve3Pool(0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7); IBZxPartial public constant bZx = IBZxPartial(0xD8Ee69652E4e4838f2531732a46d1f7F584F0b7f); uint256 public constant cliffDuration = 15768000; // 86400 * 365 * 0.5 uint256 public constant vestingDuration = 126144000; // 86400 * 365 * 4 uint256 internal constant vestingDurationAfterCliff = 110376000; // 86400 * 365 * 3.5 uint256 internal constant vestingStartTimestamp = 1594648800; // start_time uint256 internal constant vestingCliffTimestamp = vestingStartTimestamp + cliffDuration; uint256 internal constant vestingEndTimestamp = vestingStartTimestamp + vestingDuration; uint256 internal constant _startingVBZRXBalance = 889389933e18; // 889,389,933 BZRX uint256 public constant BZRXWeightStored = 1e18; struct DelegatedTokens { address user; uint256 BZRX; uint256 vBZRX; uint256 iBZRX; uint256 LPToken; uint256 totalVotes; } event Stake( address indexed user, address indexed token, address indexed delegate, uint256 amount ); event Unstake( address indexed user, address indexed token, address indexed delegate, uint256 amount ); event AddRewards( address indexed sender, uint256 bzrxAmount, uint256 stableCoinAmount ); event Claim( address indexed user, uint256 bzrxAmount, uint256 stableCoinAmount ); event ChangeDelegate( address indexed user, address indexed oldDelegate, address indexed newDelegate ); event WithdrawFees( address indexed sender ); event ConvertFees( address indexed sender, uint256 bzrxOutput, uint256 stableCoinOutput ); event DistributeFees( address indexed sender, uint256 bzrxRewards, uint256 stableCoinRewards ); } contract IVestingToken is IERC20 { function claim() external; function vestedBalanceOf( address _owner) external view returns (uint256); function claimedBalanceOf( address _owner) external view returns (uint256); function totalVested() external view returns (uint256); } interface ILoanPool { function tokenPrice() external view returns (uint256 price); function borrowInterestRate() external view returns (uint256); function totalAssetSupply() external view returns (uint256); function assetBalanceOf( address _owner) external view returns (uint256); } contract StakingV1t is StakingState, StakingConstants { modifier checkPause() { require(!isPaused, "paused"); _; } function stake( address[] calldata tokens, uint256[] calldata values) external checkPause updateRewards(msg.sender) { require(tokens.length == values.length, "count mismatch"); address currentDelegate = delegate[msg.sender]; if (currentDelegate == address(0)) { currentDelegate = msg.sender; delegate[msg.sender] = currentDelegate; _delegatedSet.addAddress(msg.sender); } address token; uint256 stakeAmount; for (uint256 i = 0; i < tokens.length; i++) { token = tokens[i]; require(token == BZRX || token == vBZRX || token == iBZRX || token == LPToken, "invalid token"); stakeAmount = values[i]; if (stakeAmount == 0) { continue; } _balancesPerToken[token][msg.sender] = _balancesPerToken[token][msg.sender].add(stakeAmount); _totalSupplyPerToken[token] = _totalSupplyPerToken[token].add(stakeAmount); delegatedPerToken[currentDelegate][token] = delegatedPerToken[currentDelegate][token] .add(stakeAmount); IERC20(token).safeTransferFrom(msg.sender, address(this), stakeAmount); emit Stake( msg.sender, token, currentDelegate, stakeAmount ); } } function unstake( address[] memory tokens, uint256[] memory values) public checkPause updateRewards(msg.sender) { require(tokens.length == values.length, "count mismatch"); address currentDelegate = delegate[msg.sender]; address token; uint256 unstakeAmount; uint256 stakedAmount; for (uint256 i = 0; i < tokens.length; i++) { token = tokens[i]; require(token == BZRX || token == vBZRX || token == iBZRX || token == LPToken, "invalid token"); unstakeAmount = values[i]; stakedAmount = _balancesPerToken[token][msg.sender]; if (unstakeAmount == 0 || stakedAmount == 0) { continue; } if (unstakeAmount > stakedAmount) { unstakeAmount = stakedAmount; } _balancesPerToken[token][msg.sender] = stakedAmount - unstakeAmount; // will not overflow _totalSupplyPerToken[token] = _totalSupplyPerToken[token] - unstakeAmount; // will not overflow delegatedPerToken[currentDelegate][token] = delegatedPerToken[currentDelegate][token] .sub(unstakeAmount); IERC20(token).safeTransfer(msg.sender, unstakeAmount); emit Unstake( msg.sender, token, currentDelegate, unstakeAmount ); } } function claim() external checkPause returns (uint256 bzrxRewardsEarned, uint256 stableCoinRewardsEarned) { return _claim(false); } function claimAndRestake() external checkPause returns (uint256 bzrxRewardsEarned, uint256 stableCoinRewardsEarned) { return _claim(true); } function _claim( bool restake) internal updateRewards(msg.sender) returns (uint256 bzrxRewardsEarned, uint256 stableCoinRewardsEarned) { (bzrxRewardsEarned, stableCoinRewardsEarned,,) = _earned( msg.sender, 0, 0, 0 // vesting BZRX already handled in updateRewards ); if (bzrxRewardsEarned != 0) { bzrxRewards[msg.sender] = 0; if (restake) { _restakeBZRX( msg.sender, bzrxRewardsEarned ); } else { // settle vested BZRX if needed IVestingToken(vBZRX).claim(); IERC20(BZRX).transfer(msg.sender, bzrxRewardsEarned); } } if (stableCoinRewardsEarned != 0) { stableCoinRewards[msg.sender] = 0; curve3Crv.transfer(msg.sender, stableCoinRewardsEarned); } emit Claim( msg.sender, bzrxRewardsEarned, stableCoinRewardsEarned ); } function _restakeBZRX( address account, uint256 amount) internal { address currentDelegate = delegate[account]; _balancesPerToken[BZRX][account] = _balancesPerToken[BZRX][account] .add(amount); _totalSupplyPerToken[BZRX] = _totalSupplyPerToken[BZRX] .add(amount); delegatedPerToken[currentDelegate][BZRX] = delegatedPerToken[currentDelegate][BZRX] .add(amount); emit Stake( account, BZRX, currentDelegate, amount ); } function exit() public // unstake() does a checkPause { address[] memory tokens = new address[](4); uint256[] memory values = new uint256[](4); tokens[0] = iBZRX; tokens[1] = LPToken; tokens[2] = vBZRX; tokens[3] = BZRX; values[0] = uint256(-1); values[1] = uint256(-1); values[2] = uint256(-1); values[3] = uint256(-1); unstake(tokens, values); _claim(false); } modifier updateRewards(address account) { uint256 vBZRXBalance = _balancesPerToken[vBZRX][account]; (bzrxRewards[account], stableCoinRewards[account],,) = _earned( account, 0, 0, vBZRXBalance ); _vestingLastSync[account] = block.timestamp; _; } function earned( address account) public view returns (uint256 bzrxRewardsEarned, uint256 stableCoinRewardsEarned, uint256 bzrxRewardsVesting, uint256 stableCoinRewardsVesting) { (bzrxRewardsEarned, stableCoinRewardsEarned,,) = _earned( account, 0, 0, _balancesPerToken[vBZRX][account] ); } function _earned( address account, uint256 _bzrxPerToken, uint256 _stableCoinPerToken, uint256 _vBZRXBalance) internal view returns (uint256 bzrxRewardsEarned, uint256 stableCoinRewardsEarned, uint256 bzrxRewardsVesting, uint256 stableCoinRewardsVesting) { bzrxRewardsEarned = bzrxRewards[account]; stableCoinRewardsEarned = stableCoinRewards[account]; // add vested fees to rewards balances uint256 rewardsVested; uint256 _lastVestingSync = _vestingLastSync[account]; if (_lastVestingSync != block.timestamp) { if (_vBZRXBalance != 0) { // add vested BZRX to rewards balance rewardsVested = _vestedBalance( _vBZRXBalance, _lastVestingSync, block.timestamp ); bzrxRewardsEarned += rewardsVested; } } } // note: anyone can contribute rewards to the contract function addDirectRewards( address[] calldata accounts, uint256[] calldata bzrxAmounts, uint256[] calldata stableCoinAmounts) external checkPause returns (uint256 bzrxTotal, uint256 stableCoinTotal) { require(accounts.length == bzrxAmounts.length && accounts.length == stableCoinAmounts.length, "count mismatch"); for (uint256 i = 0; i < accounts.length; i++) { bzrxRewards[accounts[i]] = bzrxRewards[accounts[i]].add(bzrxAmounts[i]); bzrxTotal = bzrxTotal.add(bzrxAmounts[i]); stableCoinRewards[accounts[i]] = stableCoinRewards[accounts[i]].add(stableCoinAmounts[i]); stableCoinTotal = stableCoinTotal.add(stableCoinAmounts[i]); } if (bzrxTotal != 0) { IERC20(BZRX).transferFrom(msg.sender, address(this), bzrxTotal); } if (stableCoinTotal != 0) { curve3Crv.transferFrom(msg.sender, address(this), stableCoinTotal); } } function balanceOfByAsset( address token, address account) public view returns (uint256 balance) { balance = _balancesPerToken[token][account]; } function balanceOfByAssets( address account) external view returns ( uint256 bzrxBalance, uint256 iBZRXBalance, uint256 vBZRXBalance, uint256 LPTokenBalance ) { return ( balanceOfByAsset(BZRX, account), balanceOfByAsset(iBZRX, account), balanceOfByAsset(vBZRX, account), balanceOfByAsset(LPToken, account) ); } function balanceOfStored( address account) public view returns (uint256 vestedBalance, uint256 vestingBalance) { vestingBalance = _balancesPerToken[vBZRX][account] .mul(vBZRXWeightStored) .div(1e18); vestedBalance = _balancesPerToken[BZRX][account]; vestedBalance = _balancesPerToken[iBZRX][account] .mul(iBZRXWeightStored) .div(1e18) .add(vestedBalance); vestedBalance = _balancesPerToken[LPToken][account] .mul(LPTokenWeightStored) .div(1e18) .add(vestedBalance); } function delegateBalanceOf( address account) public view returns (uint256 totalVotes) { uint256 vBZRXBalance = _balancesPerToken[vBZRX][account]; if (vBZRXBalance != 0) { // staked vBZRX counts has 1/2 a vote, that's prorated based on total vested totalVotes = vBZRXBalance .mul(_startingVBZRXBalance - _vestedBalance( // overflow not possible _startingVBZRXBalance, 0, block.timestamp ) ).div(_startingVBZRXBalance) / 2; // user is attributed a staked balance of vested BZRX, from their last update to the present totalVotes = _vestedBalance( vBZRXBalance, _vestingLastSync[account], block.timestamp ).add(totalVotes); } totalVotes = _balancesPerToken[BZRX][account] .add(bzrxRewards[account]) // unclaimed BZRX rewards count as votes .add(totalVotes); totalVotes = _balancesPerToken[iBZRX][account] .mul(ILoanPool(iBZRX).tokenPrice()) .div(1e18) .add(totalVotes); // LPToken votes are measured based on amount of underlying BZRX staked totalVotes = IERC20(BZRX).balanceOf(LPToken) .mul(_balancesPerToken[LPToken][account]) .div(IERC20(LPToken).totalSupply()) .add(totalVotes); } function totalSupplyByAsset( address token) external view returns (uint256) { return _totalSupplyPerToken[token]; } function totalSupplyStored() public view returns (uint256 supply) { supply = _totalSupplyPerToken[vBZRX] .mul(vBZRXWeightStored) .div(1e18); supply = _totalSupplyPerToken[BZRX] .add(supply); supply = _totalSupplyPerToken[iBZRX] .mul(iBZRXWeightStored) .div(1e18) .add(supply); supply = _totalSupplyPerToken[LPToken] .mul(LPTokenWeightStored) .div(1e18) .add(supply); } function _vestedBalance( uint256 tokenBalance, uint256 lastUpdate, uint256 vestingTimeNow) internal view returns (uint256 vested) { vestingTimeNow = vestingTimeNow.min256(block.timestamp); if (vestingTimeNow > lastUpdate) { if (vestingTimeNow <= vestingCliffTimestamp || lastUpdate >= vestingEndTimestamp) { // time cannot be before vesting starts // OR all vested token has already been claimed return 0; } if (lastUpdate < vestingCliffTimestamp) { // vesting starts at the cliff timestamp lastUpdate = vestingCliffTimestamp; } if (vestingTimeNow > vestingEndTimestamp) { // vesting ends at the end timestamp vestingTimeNow = vestingEndTimestamp; } uint256 timeSinceClaim = vestingTimeNow.sub(lastUpdate); vested = tokenBalance.mul(timeSinceClaim) / vestingDurationAfterCliff; // will never divide by 0 } } // OnlyOwner functions function pause() external onlyOwner { isPaused = true; } function unPause() external onlyOwner { isPaused = false; } function setFundsWallet( address _fundsWallet) external onlyOwner { fundsWallet = _fundsWallet; } function setFeeTokens( address[] calldata tokens) external onlyOwner { currentFeeTokens = tokens; } // path should start with the asset to swap and end with BZRX // only one path allowed per asset // ex: asset -> WETH -> BZRX function setPaths( address[][] calldata paths) external onlyOwner { address[] memory path; for (uint256 i = 0; i < paths.length; i++) { path = paths[i]; require(path.length >= 2 && path[0] != path[path.length - 1] && path[path.length - 1] == BZRX, "invalid path" ); // check that the path exists uint256[] memory amountsOut = uniswapRouter.getAmountsOut(1e10, path); require(amountsOut[amountsOut.length - 1] != 0, "path does not exist"); swapPaths[path[0]] = path; setUniswapApproval(IERC20(path[0])); } } function setUniswapApproval( IERC20 asset) public onlyOwner { asset.safeApprove(address(uniswapRouter), 0); asset.safeApprove(address(uniswapRouter), uint256(-1)); } function setCurveApproval() external onlyOwner { IERC20(DAI).safeApprove(address(curve3pool), 0); IERC20(DAI).safeApprove(address(curve3pool), uint256(-1)); IERC20(USDC).safeApprove(address(curve3pool), 0); IERC20(USDC).safeApprove(address(curve3pool), uint256(-1)); IERC20(USDT).safeApprove(address(curve3pool), 0); IERC20(USDT).safeApprove(address(curve3pool), uint256(-1)); } function setRewardPercent( uint256 _rewardPercent) external onlyOwner { require(_rewardPercent <= 1e20, "value too high"); rewardPercent = _rewardPercent; } function setMaxUniswapDisagreement( uint256 _maxUniswapDisagreement) external onlyOwner { require(_maxUniswapDisagreement != 0, "invalid param"); maxUniswapDisagreement = _maxUniswapDisagreement; } function setMaxCurveDisagreement( uint256 _maxCurveDisagreement) external onlyOwner { require(_maxCurveDisagreement != 0, "invalid param"); maxCurveDisagreement = _maxCurveDisagreement; } function setCallerRewardDivisor( uint256 _callerRewardDivisor) external onlyOwner { require(_callerRewardDivisor != 0, "invalid param"); callerRewardDivisor = _callerRewardDivisor; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"bzrxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stableCoinAmount","type":"uint256"}],"name":"AddRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"oldDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"newDelegate","type":"address"}],"name":"ChangeDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bzrxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stableCoinAmount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"bzrxOutput","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stableCoinOutput","type":"uint256"}],"name":"ConvertFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"bzrxRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stableCoinRewards","type":"uint256"}],"name":"DistributeFees","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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"WithdrawFees","type":"event"},{"constant":true,"inputs":[],"name":"BZRX","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BZRXWeightStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LPTokenWeightStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"bzrxAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"stableCoinAmounts","type":"uint256[]"}],"name":"addDirectRewards","outputs":[{"internalType":"uint256","name":"bzrxTotal","type":"uint256"},{"internalType":"uint256","name":"stableCoinTotal","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bZx","outputs":[{"internalType":"contract IBZxPartial","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfByAsset","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfByAssets","outputs":[{"internalType":"uint256","name":"bzrxBalance","type":"uint256"},{"internalType":"uint256","name":"iBZRXBalance","type":"uint256"},{"internalType":"uint256","name":"vBZRXBalance","type":"uint256"},{"internalType":"uint256","name":"LPTokenBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfStored","outputs":[{"internalType":"uint256","name":"vestedBalance","type":"uint256"},{"internalType":"uint256","name":"vestingBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bzrxPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bzrxRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bzrxRewardsPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bzrxVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"callerRewardDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claim","outputs":[{"internalType":"uint256","name":"bzrxRewardsEarned","type":"uint256"},{"internalType":"uint256","name":"stableCoinRewardsEarned","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimAndRestake","outputs":[{"internalType":"uint256","name":"bzrxRewardsEarned","type":"uint256"},{"internalType":"uint256","name":"stableCoinRewardsEarned","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cliffDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"currentFeeTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curve3Crv","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curve3pool","outputs":[{"internalType":"contract ICurve3Pool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegate","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegateBalanceOf","outputs":[{"internalType":"uint256","name":"totalVotes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"delegatedPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"bzrxRewardsEarned","type":"uint256"},{"internalType":"uint256","name":"stableCoinRewardsEarned","type":"uint256"},{"internalType":"uint256","name":"bzrxRewardsVesting","type":"uint256"},{"internalType":"uint256","name":"stableCoinRewardsVesting","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fundsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"iBZRX","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"iBZRXWeightStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRewardsAddTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxCurveDisagreement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxUniswapDisagreement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","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":"rewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_callerRewardDivisor","type":"uint256"}],"name":"setCallerRewardDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setCurveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"setFeeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_fundsWallet","type":"address"}],"name":"setFundsWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_maxCurveDisagreement","type":"uint256"}],"name":"setMaxCurveDisagreement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_maxUniswapDisagreement","type":"uint256"}],"name":"setMaxUniswapDisagreement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[][]","name":"paths","type":"address[][]"}],"name":"setPaths","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardPercent","type":"uint256"}],"name":"setRewardPercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"asset","type":"address"}],"name":"setUniswapApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stableCoinPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stableCoinRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stableCoinRewardsPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stableCoinVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"totalSupplyByAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupplyStored","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unPause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"unstake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vBZRX","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vBZRXWeightStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vestingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526802b5e3af16b18800006018556729a2241af62c00006019819055601a556064601b55600061003a6001600160e01b0361008916565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061008d565b3390565b613bad806200009d6000396000f3fe608060405234801561001057600080fd5b50600436106103f05760003560e01c806366067a9511610215578063b6d6d88d11610125578063db8bb3a1116100b8578063ef1c243a11610087578063ef1c243a14610776578063f2fde38b1461077e578063f30127a514610791578063f755d8c314610799578063f7b188a5146107a1576103f0565b8063db8bb3a11461074b578063e0bab4c41461075e578063e9fad8ee14610766578063eb0e8d1a1461076e576103f0565b8063cf86add5116100f4578063cf86add514610720578063d030205114610733578063d85349f71461073b578063dae607db14610743576103f0565b8063b6d6d88d146106df578063bcca1e04146106f2578063c1c5dd2714610705578063c54e44eb14610718576103f0565b806389ffc781116101a8578063a5795eba11610177578063a5795eba14610696578063ad5c4648146106a9578063b02eba05146106b1578063b187bd26146106c4578063b293fdc5146106cc576103f0565b806389ffc7811461065e5780638caaf9e6146106665780638da5cb5b146106795780638f32d59b14610681576103f0565b806382a8af15116101e457806382a8af15146106285780638456cb591461063b57806387359ebe1461064357806389a3027114610656576103f0565b806366067a95146105fd5780636b87f99014610605578063735de9f714610618578063802971a614610620576103f0565b80633bb20ece1161031057806353a8f1ec116102a357806359dcf5221161027257806359dcf522146105b45780635c19a95c146105c75780635c60da1b146105da578063633e9470146105e257806364e39b87146105ea576103f0565b806353a8f1ec14610589578063547d0738146105915780635877b3dd1461059957806359d99805146105ac576103f0565b806343a468c8116102df57806343a468c814610545578063499d7f96146105585780634e71d92d1461056b57806352fb1c9d14610581576103f0565b80633bb20ece1461050f5780633e9a990a1461051757806341adca421461051f5780634330c26314610532576103f0565b806319e772c2116103885780632194f3a2116103575780632194f3a2146104d95780632d06e5bf146104e15780632ee1a86e146104e9578063307e85a4146104fc576103f0565b806319e772c2146104a15780631c9c4408146104a95780631ca97a2d146104b15780631d3e3955146104c4576103f0565b806302dd19d9116103c457806302dd19d9146104695780630da47e0a146104715780631514617e1461048457806317a1d0121461048c576103f0565b80628cc262146103f55780630114a05e14610421578063011cee361461044157806302baf1b014610456575b600080fd5b6104086104033660046130d0565b6107a9565b60405161041894939291906139cc565b60405180910390f35b61043461042f3660046130d0565b6107f3565b60405161041891906139b0565b610449610805565b60405161041891906137eb565b6104346104643660046130d0565b61081d565b610434610838565b61043461047f3660046130d0565b61083e565b610434610850565b610494610858565b6040516104189190613881565b610434610870565b610434610876565b6104346104bf3660046130d0565b61087c565b6104d76104d2366004613372565b61088e565b005b6104496108dd565b6104346108ec565b6104086104f73660046130d0565b6108fb565b6104d761050a366004613372565b610982565b6104346109c8565b6104d76109ce565b61043461052d3660046130d0565b610b53565b6104346105403660046130d0565b610b65565b6104346105533660046130d0565b610b77565b6104346105663660046130d0565b610ed7565b610573610ee9565b6040516104189291906139be565b610434610f2a565b610434610f30565b610449610f36565b6104d76105a7366004613158565b610f4e565b610434611201565b6105736105c23660046130d0565b611207565b6104496105d53660046130d0565b611330565b61044961134b565b61049461135a565b6104d76105f83660046130d0565b611372565b6104346113b8565b6104d7610613366004613354565b6113be565b610494611444565b61044961145c565b610449610636366004613372565b611474565b6104d761149b565b6104346106513660046130ee565b6114d4565b6104496114ff565b610494611517565b6104d7610674366004613372565b61152f565b610449611575565b610689611585565b6040516104189190613873565b6105736106a4366004613207565b6115a9565b610449611898565b6104346106bf3660046130d0565b6118b0565b6106896118c2565b6104d76106da366004613158565b6118d2565b6104346106ed3660046130ee565b611907565b6104d76107003660046132a5565b611924565b6104d7610713366004613372565b611c26565b610449611c78565b6104d761072e366004613199565b611c90565b610434611fe8565b610434611fee565b610434611ff5565b610449610759366004613128565b612001565b610449612036565b6104d761204e565b61043461221b565b610434612221565b6104d761078c3660046130d0565b6123a8565b6104496123d5565b6105736123e7565b6104d7612420565b6001600160a01b0381166000908152600080516020613b4b83398151915260205260408120548190819081906107e490869083908190612453565b50919790965092945090925050565b60086020526000908152604090205481565b73e26a220a341eaca116bda64cf9d5638a935ae62981565b6001600160a01b031660009081526003602052604090205490565b601b5481565b600d6020526000908152604090205481565b630784ce0081565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b600f5481565b60105481565b60096020526000908152604090205481565b610896611585565b6108bb5760405162461bcd60e51b81526004016108b290613940565b60405180910390fd5b806108d85760405162461bcd60e51b81526004016108b290613950565b601a55565b6002546001600160a01b031681565b6a744f570177f475546c000081565b600080600080610919600080516020613b0b833981519152866114d4565b6109377318240bd9c07fa6156ce3f3f61921cc82b2619157876114d4565b61095573b72b31907c1c95f3650b64b2469e08edacee5e8f886114d4565b61097373e26a220a341eaca116bda64cf9d5638a935ae629896114d4565b93509350935093509193509193565b61098a611585565b6109a65760405162461bcd60e51b81526004016108b290613940565b806109c35760405162461bcd60e51b81526004016108b290613950565b601b55565b600b5481565b6109d6611585565b6109f25760405162461bcd60e51b81526004016108b290613940565b610a2c736b175474e89094c44da98b954eedeac495271d0f73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600063ffffffff6124b316565b610a67736b175474e89094c44da98b954eedeac495271d0f73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff6124b316565b610aa173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600063ffffffff6124b316565b610adc73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff6124b316565b610b1673dac17f958d2ee523a2206206994597c13d831ec773bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600063ffffffff6124b316565b610b5173dac17f958d2ee523a2206206994597c13d831ec773bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff6124b316565b565b600e6020526000908152604090205481565b600a6020526000908152604090205481565b6001600160a01b0381166000908152600080516020613b4b83398151915260205260408120548015610c44576002610bf76b02dfafa4e0948fa071940000610beb610bd06b02dfafa4e0948fa0719400006000426125b0565b85906b02dfafa4e0948fa0719400000363ffffffff61265216565b9063ffffffff61269516565b81610bfe57fe5b049150610c4182610c358360156000886001600160a01b03166001600160a01b0316815260200190815260200160002054426125b0565b9063ffffffff6126d716565b91505b6001600160a01b038316600090815260096020908152604080832054600080516020613b2b83398151915290925290912054610c85918491610c35916126d7565b9150610d6382610c35670de0b6b3a7640000610beb7318240bd9c07fa6156ce3f3f61921cc82b26191576001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b158015610ce757600080fd5b505afa158015610cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d1f9190810190613390565b6001600160a01b03891660009081527fe09f1b989ce5e55474fdfb6ab6036e5e02e6f44d8729816a39308c55c71b13c760205260409020549063ffffffff61265216565b9150610ed082610c3573e26a220a341eaca116bda64cf9d5638a935ae6296001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db957600080fd5b505afa158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610df19190810190613390565b6001600160a01b03871660009081527f2b99f9ddbab8aac550ca8d7e4f266bf08c26f285c5c72de065cbb397b67b82486020526040908190205490516370a0823160e01b8152610beb9190600080516020613b0b833981519152906370a0823190610e749073e26a220a341eaca116bda64cf9d5638a935ae629906004016137eb565b60206040518083038186803b158015610e8c57600080fd5b505afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ec49190810190613390565b9063ffffffff61265216565b9392505050565b60176020526000908152604090205481565b6001546000908190600160a01b900460ff1615610f185760405162461bcd60e51b81526004016108b290613980565b610f2260006126fc565b915091509091565b60115481565b601a5481565b73b72b31907c1c95f3650b64b2469e08edacee5e8f81565b610f56611585565b610f725760405162461bcd60e51b81526004016108b290613940565b606060005b828110156111fb57838382818110610f8b57fe5b602002820190508035601e1936849003018112610fa757600080fd5b909101602081019150356001600160401b03811115610fc557600080fd5b602081023603821315610fd757600080fd5b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250508251929450505060021180159061105a57508160018351038151811061102857fe5b60200260200101516001600160a01b03168260008151811061104657fe5b60200260200101516001600160a01b031614155b801561109c5750600080516020613b0b8339815191526001600160a01b03168260018451038151811061108957fe5b60200260200101516001600160a01b0316145b6110b85760405162461bcd60e51b81526004016108b290613900565b60405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f906110f9906402540be40090879060040161388f565b60006040518083038186803b15801561111157600080fd5b505afa158015611125573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261114d9190810190613302565b90508060018251038151811061115f57fe5b6020026020010151600014156111875760405162461bcd60e51b81526004016108b290613970565b82601660008560008151811061119957fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090805190602001906111d4929190612e16565b506111f2836000815181106111e557fe5b60200260200101516113be565b50600101610f77565b50505050565b60195481565b600f546001600160a01b0382166000908152600080516020613b4b83398151915260205260408120549091829161125191670de0b6b3a764000091610beb9163ffffffff61265216565b6001600160a01b0384166000908152600080516020613b2b83398151915260209081526040808320546010547fe09f1b989ce5e55474fdfb6ab6036e5e02e6f44d8729816a39308c55c71b13c79093529220549194509192506112c7918491610c3591670de0b6b3a764000091610beb91612652565b6011546001600160a01b03851660009081527f2b99f9ddbab8aac550ca8d7e4f266bf08c26f285c5c72de065cbb397b67b82486020526040902054919350611329918491610c3591670de0b6b3a764000091610beb919063ffffffff61265216565b9150915091565b6005602052600090815260409020546001600160a01b031681565b6001546001600160a01b031681565b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f81565b61137a611585565b6113965760405162461bcd60e51b81526004016108b290613940565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60145481565b6113c6611585565b6113e25760405162461bcd60e51b81526004016108b290613940565b6114116001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d600063ffffffff6124b316565b6114416001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d60001963ffffffff6124b316565b50565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b7318240bd9c07fa6156ce3f3f61921cc82b261915781565b601c818154811061148157fe5b6000918252602090912001546001600160a01b0316905081565b6114a3611585565b6114bf5760405162461bcd60e51b81526004016108b290613940565b6001805460ff60a01b1916600160a01b179055565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b736c3f90f043a72fa612cbac8115ee7e52bde6e49081565b611537611585565b6115535760405162461bcd60e51b81526004016108b290613940565b806115705760405162461bcd60e51b81526004016108b290613950565b601955565b6000546001600160a01b03165b90565b600080546001600160a01b031661159a61297b565b6001600160a01b031614905090565b6001546000908190600160a01b900460ff16156115d85760405162461bcd60e51b81526004016108b290613980565b86851480156115e657508683145b6116025760405162461bcd60e51b81526004016108b2906138f0565b60005b878110156117685761166e87878381811061161c57fe5b90506020020135600960008c8c8681811061163357fe5b905060200201602061164891908101906130d0565b6001600160a01b031681526020810191909152604001600020549063ffffffff6126d716565b600960008b8b8581811061167e57fe5b905060200201602061169391908101906130d0565b6001600160a01b031681526020810191909152604001600020556116d28787838181106116bc57fe5b90506020020135846126d790919063ffffffff16565b92506116fa8585838181106116e357fe5b90506020020135600d60008c8c8681811061163357fe5b600d60008b8b8581811061170a57fe5b905060200201602061171f91908101906130d0565b6001600160a01b0316815260208101919091526040016000205561175e85858381811061174857fe5b90506020020135836126d790919063ffffffff16565b9150600101611605565b5081156117f8576040516323b872dd60e01b8152600080516020613b0b833981519152906323b872dd906117a4903390309087906004016137f9565b602060405180830381600087803b1580156117be57600080fd5b505af11580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117f69190810190613336565b505b801561188d576040516323b872dd60e01b8152736c3f90f043a72fa612cbac8115ee7e52bde6e490906323b872dd90611839903390309086906004016137f9565b602060405180830381600087803b15801561185357600080fd5b505af1158015611867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061188b9190810190613336565b505b965096945050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600c6020526000908152604090205481565b600154600160a01b900460ff1681565b6118da611585565b6118f65760405162461bcd60e51b81526004016108b290613940565b611902601c8383612e7b565b505050565b600660209081526000928352604080842090915290825290205481565b600154600160a01b900460ff161561194e5760405162461bcd60e51b81526004016108b290613980565b336000818152600080516020613b4b8339815191526020526040812054906119799083908084612453565b50506001600160a01b0384166000908152600960209081526040808320600d8352818420949094559390925560159091522042905582518451146119cf5760405162461bcd60e51b81526004016108b2906138f0565b336000908152600560205260408120546001600160a01b0316908080805b8851811015611c1b57888181518110611a0257fe5b60200260200101519350600080516020613b0b8339815191526001600160a01b0316846001600160a01b03161480611a5657506001600160a01b03841673b72b31907c1c95f3650b64b2469e08edacee5e8f145b80611a7d57506001600160a01b0384167318240bd9c07fa6156ce3f3f61921cc82b2619157145b80611aa457506001600160a01b03841673e26a220a341eaca116bda64cf9d5638a935ae629145b611ac05760405162461bcd60e51b81526004016108b290613930565b878181518110611acc57fe5b6020908102919091018101516001600160a01b038616600090815260048352604080822033835290935291909120549093509150821580611b0b575081155b15611b1557611c13565b81831115611b21578192505b6001600160a01b038085166000818152600460209081526040808320338452825280832088880390558383526003825280832080548990039055938916825260068152838220928252919091522054611b80908463ffffffff61297f16565b6001600160a01b03808716600090815260066020908152604080832093891680845293909152902091909155611bbd90338563ffffffff6129c116565b846001600160a01b0316846001600160a01b0316336001600160a01b03167f2cbcd809a4c90d11f8d12c4b6d09986b255ae1e68f54f076c145fbb2185904e186604051611c0a91906139b0565b60405180910390a45b6001016119ed565b505050505050505050565b611c2e611585565b611c4a5760405162461bcd60e51b81526004016108b290613940565b68056bc75e2d63100000811115611c735760405162461bcd60e51b81526004016108b290613910565b601855565b73dac17f958d2ee523a2206206994597c13d831ec781565b600154600160a01b900460ff1615611cba5760405162461bcd60e51b81526004016108b290613980565b336000818152600080516020613b4b833981519152602052604081205490611ce59083908084612453565b50506001600160a01b0384166000908152600960209081526040808320600d83528184209490945593909255601590915220429055848314611d395760405162461bcd60e51b81526004016108b2906138f0565b336000908152600560205260409020546001600160a01b031680611d8a575033600081815260056020526040902080546001600160a01b03191682179055611d8860128263ffffffff6129e316565b505b600080805b88811015611fdc57898982818110611da357fe5b9050602002016020611db891908101906130d0565b92506001600160a01b038316600080516020613b0b8339815191521480611dfb57506001600160a01b03831673b72b31907c1c95f3650b64b2469e08edacee5e8f145b80611e2257506001600160a01b0383167318240bd9c07fa6156ce3f3f61921cc82b2619157145b80611e4957506001600160a01b03831673e26a220a341eaca116bda64cf9d5638a935ae629145b611e655760405162461bcd60e51b81526004016108b290613930565b878782818110611e7157fe5b9050602002013591508160001415611e8857611fd4565b6001600160a01b0383166000908152600460209081526040808320338452909152902054611ebc908363ffffffff6126d716565b6001600160a01b038416600081815260046020908152604080832033845282528083209490945591815260039091522054611efd908363ffffffff6126d716565b6001600160a01b0380851660008181526003602090815260408083209590955592881681526006835283812091815291522054611f40908363ffffffff6126d716565b6001600160a01b03808616600090815260066020908152604080832093881680845293909152902091909155611f7e9033308563ffffffff6129f816565b836001600160a01b0316836001600160a01b0316336001600160a01b03167fc5017594d2723c038bb216e5bcef3ac65910ade839c0e63253bf5b59efbf0fd785604051611fcb91906139b0565b60405180910390a45b600101611d8f565b50505050505050505050565b60185481565b62f099c081565b670de0b6b3a764000081565b6016602052816000526040600020818154811061201a57fe5b6000918252602090912001546001600160a01b03169150829050565b736b175474e89094c44da98b954eedeac495271d0f81565b60408051600480825260a0820190925260609160208201608080388339505060408051600480825260a082019092529293506060929150602082016080803883390190505090507318240bd9c07fa6156ce3f3f61921cc82b2619157826000815181106120b757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073e26a220a341eaca116bda64cf9d5638a935ae629826001815181106120f957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073b72b31907c1c95f3650b64b2469e08edacee5e8f8260028151811061213b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613b0b8339815191528260038151811061217757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600019816000815181106121a757fe5b602002602001018181525050600019816001815181106121c357fe5b602002602001018181525050600019816002815181106121df57fe5b602002602001018181525050600019816003815181106121fb57fe5b6020026020010181815250506122118282611924565b6111fb60006126fc565b60075481565b600f5473b72b31907c1c95f3650b64b2469e08edacee5e8f600090815260036020527ffcfc5d57a009157202436965eb7c01b14f1b51f705a3b4f08296120160c5e10954909161228591670de0b6b3a764000091610beb919063ffffffff61265216565b600080516020613b0b83398151915260005260036020527f26822d1429e81ba812c5218f96710c8923c00dbf3bebc27a2dcc389411621671549091506122d1908263ffffffff6126d716565b6010547318240bd9c07fa6156ce3f3f61921cc82b261915760005260036020527f91de0462b01273d0819ee89d2f822b745d4b4dcc3d05d8e0d13f841abd34e4a25491925061233a918391610c3591670de0b6b3a764000091610beb919063ffffffff61265216565b60115473e26a220a341eaca116bda64cf9d5638a935ae62960005260036020527f8341f36a1c413f2034fb483b56344c972362456414155a77c5d31e601f1c02a4549192506123a3918391610c3591670de0b6b3a764000091610beb919063ffffffff61265216565b905090565b6123b0611585565b6123cc5760405162461bcd60e51b81526004016108b290613940565b61144181612a1c565b600080516020613b0b83398151915281565b6001546000908190600160a01b900460ff16156124165760405162461bcd60e51b81526004016108b290613980565b610f2260016126fc565b612428611585565b6124445760405162461bcd60e51b81526004016108b290613940565b6001805460ff60a01b19169055565b6001600160a01b038416600090815260096020908152604080832054600d835281842054601590935290832054909290819081904281146124a65786156124a65761249f8782426125b0565b9586019591505b5050945094509450949050565b80158061253b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906124e9903090869060040161383c565b60206040518083038186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125399190810190613390565b155b6125575760405162461bcd60e51b81526004016108b290613990565b60405161190290849063095ea7b360e01b906125799086908690602401613865565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a9d565b60006125c2824263ffffffff612b8216565b915082821115610ed057635ffd02a0821115806125e3575063669136e08310155b156125f057506000610ed0565b635ffd02a083101561260457635ffd02a092505b63669136e08211156126185763669136e091505b600061262a838563ffffffff61297f16565b90506306943440612641868363ffffffff61265216565b8161264857fe5b0495945050505050565b6000826126615750600061268f565b8282028284828161266e57fe5b041461268c5760405162461bcd60e51b81526004016108b290613920565b90505b92915050565b600061268c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b98565b60008282018381101561268c5760405162461bcd60e51b81526004016108b2906138d0565b336000818152600080516020613b4b83398151915260205260408120549091829161272982848084612453565b50506001600160a01b0384166000908152600960209081526040808320600d83528184209490945593909255601590915290812042905561276d9033908080612453565b50919550935050831561288d5733600090815260096020526040812055841561279f5761279a3385612bc5565b61288d565b73b72b31907c1c95f3650b64b2469e08edacee5e8f6001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156127ee57600080fd5b505af1158015612802573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152600080516020613b0b833981519152925063a9059cbb91506128399033908890600401613821565b602060405180830381600087803b15801561285357600080fd5b505af1158015612867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061288b9190810190613336565b505b821561293157336000818152600d6020526040808220919091555163a9059cbb60e01b8152736c3f90f043a72fa612cbac8115ee7e52bde6e4909163a9059cbb916128dd91908790600401613821565b602060405180830381600087803b1580156128f757600080fd5b505af115801561290b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061292f9190810190613336565b505b336001600160a01b03167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7858560405161296c9291906139be565b60405180910390a25050915091565b3390565b600061268c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612d54565b60405161190290849063a9059cbb60e01b906125799086908690602401613865565b6000816129f08482612d80565b949350505050565b6040516111fb9085906323b872dd60e01b9061257990879087908790602401613857565b6001600160a01b038116612a425760405162461bcd60e51b81526004016108b2906138c0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612aaf826001600160a01b0316612dc8565b612acb5760405162461bcd60e51b81526004016108b2906139a0565b60006060836001600160a01b031683604051612ae791906137df565b6000604051808303816000865af19150503d8060008114612b24576040519150601f19603f3d011682016040523d82523d6000602084013e612b29565b606091505b509150915081612b4b5760405162461bcd60e51b81526004016108b2906138e0565b8051156111fb5780806020019051612b669190810190613336565b6111fb5760405162461bcd60e51b81526004016108b290613960565b6000818310612b91578161268c565b5090919050565b60008183612bb95760405162461bcd60e51b81526004016108b291906138af565b50600083858161264857fe5b6001600160a01b03828116600090815260056020908152604080832054600080516020613b2b83398151915290925290912054911690612c0590836126d7565b6001600160a01b0384166000908152600080516020613b2b83398151915260209081526040822092909255600080516020613b0b8339815191529052600390527f26822d1429e81ba812c5218f96710c8923c00dbf3bebc27a2dcc38941162167154612c77908363ffffffff6126d716565b7f26822d1429e81ba812c5218f96710c8923c00dbf3bebc27a2dcc389411621671556001600160a01b0381166000908152600660209081526040808320600080516020613b0b8339815191528452909152902054612cdb908363ffffffff6126d716565b6001600160a01b038083166000818152600660209081526040808320600080516020613b0b83398151915280855292529182902094909455519092918616907fc5017594d2723c038bb216e5bcef3ac65910ade839c0e63253bf5b59efbf0fd790612d479087906139b0565b60405180910390a4505050565b60008184841115612d785760405162461bcd60e51b81526004016108b291906138af565b505050900390565b6000612d8c8383612e01565b612dc0575060018083018054808301808355600092835260208084209092018590558483529085905260409091205561268f565b50600061268f565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906129f0575050151592915050565b60009081526020919091526040902054151590565b828054828255906000526020600020908101928215612e6b579160200282015b82811115612e6b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612e36565b50612e77929150612ece565b5090565b828054828255906000526020600020908101928215612e6b579160200282015b82811115612e6b5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612e9b565b61158291905b80821115612e775780546001600160a01b0319168155600101612ed4565b803561268f81613adb565b60008083601f840112612f0f57600080fd5b5081356001600160401b03811115612f2657600080fd5b602083019150836020820283011115612f3e57600080fd5b9250929050565b600082601f830112612f5657600080fd5b8135612f69612f6482613a30565b613a0a565b91508181835260208401935060208101905083856020840282011115612f8e57600080fd5b60005b83811015612fba5781612fa48882612ef2565b8452506020928301929190910190600101612f91565b5050505092915050565b600082601f830112612fd557600080fd5b8135612fe3612f6482613a30565b9150818183526020840193506020810190508385602084028201111561300857600080fd5b60005b83811015612fba578161301e88826130ba565b845250602092830192919091019060010161300b565b600082601f83011261304557600080fd5b8151613053612f6482613a30565b9150818183526020840193506020810190508385602084028201111561307857600080fd5b60005b83811015612fba578161308e88826130c5565b845250602092830192919091019060010161307b565b805161268f81613aef565b803561268f81613af8565b803561268f81613b01565b805161268f81613b01565b6000602082840312156130e257600080fd5b60006129f08484612ef2565b6000806040838503121561310157600080fd5b600061310d8585612ef2565b925050602061311e85828601612ef2565b9150509250929050565b6000806040838503121561313b57600080fd5b60006131478585612ef2565b925050602061311e858286016130ba565b6000806020838503121561316b57600080fd5b82356001600160401b0381111561318157600080fd5b61318d85828601612efd565b92509250509250929050565b600080600080604085870312156131af57600080fd5b84356001600160401b038111156131c557600080fd5b6131d187828801612efd565b945094505060208501356001600160401b038111156131ef57600080fd5b6131fb87828801612efd565b95989497509550505050565b6000806000806000806060878903121561322057600080fd5b86356001600160401b0381111561323657600080fd5b61324289828a01612efd565b965096505060208701356001600160401b0381111561326057600080fd5b61326c89828a01612efd565b945094505060408701356001600160401b0381111561328a57600080fd5b61329689828a01612efd565b92509250509295509295509295565b600080604083850312156132b857600080fd5b82356001600160401b038111156132ce57600080fd5b6132da85828601612f45565b92505060208301356001600160401b038111156132f657600080fd5b61311e85828601612fc4565b60006020828403121561331457600080fd5b81516001600160401b0381111561332a57600080fd5b6129f084828501613034565b60006020828403121561334857600080fd5b60006129f084846130a4565b60006020828403121561336657600080fd5b60006129f084846130af565b60006020828403121561338457600080fd5b60006129f084846130ba565b6000602082840312156133a257600080fd5b60006129f084846130c5565b60006133ba83836133d1565b505060200190565b6133cb81613a8f565b82525050565b6133cb81613a68565b60006133e582613a56565b6133ef8185613a5a565b93506133fa83613a50565b8060005b8381101561342857815161341288826133ae565b975061341d83613a50565b9250506001016133fe565b509495945050505050565b6133cb81613a73565b600061344782613a56565b6134518185613a63565b9350613461818560208601613aa5565b9290920192915050565b6133cb81613a78565b6133cb81613a9a565b600061348882613a56565b6134928185613a5a565b93506134a2818560208601613aa5565b6134ab81613ad1565b9093019392505050565b60006134c2602683613a5a565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061350a601b83613a5a565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000613543602083613a5a565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b600061357c600e83613a5a565b6d0c6deeadce840dad2e6dac2e8c6d60931b815260200192915050565b60006135a6600c83613a5a565b6b0d2dcecc2d8d2c840e0c2e8d60a31b815260200192915050565b60006135ce600e83613a5a565b6d0ecc2d8eaca40e8dede40d0d2ced60931b815260200192915050565b60006135f8602183613a5a565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061363b600d83613a5a565b6c34b73b30b634b2103a37b5b2b760991b815260200192915050565b6000613664600c83613a5a565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b600061368c600d83613a5a565b6c696e76616c696420706172616d60981b815260200192915050565b60006136b5602a83613a5a565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000613701601383613a5a565b721c185d1a08191bd95cc81b9bdd08195e1a5cdd606a1b815260200192915050565b6000613730600683613a5a565b651c185d5cd95960d21b815260200192915050565b6000613752603683613a5a565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f81527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b602082015260400192915050565b60006137aa601f83613a5a565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6133cb81611582565b6000610ed0828461343c565b6020810161268f82846133d1565b6060810161380782866133c2565b61381460208301856133d1565b6129f060408301846137d6565b6040810161382f82856133c2565b610ed060208301846137d6565b6040810161384a82856133d1565b610ed060208301846133d1565b6060810161380782866133d1565b6040810161382f82856133d1565b6020810161268f8284613433565b6020810161268f828461346b565b6040810161389d8285613474565b81810360208301526129f081846133da565b6020808252810161268c818461347d565b6020808252810161268f816134b5565b6020808252810161268f816134fd565b6020808252810161268f81613536565b6020808252810161268f8161356f565b6020808252810161268f81613599565b6020808252810161268f816135c1565b6020808252810161268f816135eb565b6020808252810161268f8161362e565b6020808252810161268f81613657565b6020808252810161268f8161367f565b6020808252810161268f816136a8565b6020808252810161268f816136f4565b6020808252810161268f81613723565b6020808252810161268f81613745565b6020808252810161268f8161379d565b6020810161268f82846137d6565b6040810161382f82856137d6565b608081016139da82876137d6565b6139e760208301866137d6565b6139f460408301856137d6565b613a0160608301846137d6565b95945050505050565b6040518181016001600160401b0381118282101715613a2857600080fd5b604052919050565b60006001600160401b03821115613a4657600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b919050565b600061268f82613a83565b151590565b600061268f82613a68565b6001600160a01b031690565b600061268f82613a78565b600061268f82611582565b60005b83811015613ac0578181015183820152602001613aa8565b838111156111fb5750506000910152565b601f01601f191690565b613ae481613a68565b811461144157600080fd5b613ae481613a73565b613ae481613a78565b613ae48161158256fe00000000000000000000000056d811088235f11c8920698a204a5010a788f4b31e38d77566003d7f728cfa677ad07e8283e5607bd89a929ee98c93eba12048732ce56405c0c0b7d532a6d76ebaf14a8d190d60f3be61dae6890d68141a9cc6f8a365627a7a723158201f7aaa80bce3c096848883605f539f249377ba7762a3b1818f11f32cf1fae9de6c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103f05760003560e01c806366067a9511610215578063b6d6d88d11610125578063db8bb3a1116100b8578063ef1c243a11610087578063ef1c243a14610776578063f2fde38b1461077e578063f30127a514610791578063f755d8c314610799578063f7b188a5146107a1576103f0565b8063db8bb3a11461074b578063e0bab4c41461075e578063e9fad8ee14610766578063eb0e8d1a1461076e576103f0565b8063cf86add5116100f4578063cf86add514610720578063d030205114610733578063d85349f71461073b578063dae607db14610743576103f0565b8063b6d6d88d146106df578063bcca1e04146106f2578063c1c5dd2714610705578063c54e44eb14610718576103f0565b806389ffc781116101a8578063a5795eba11610177578063a5795eba14610696578063ad5c4648146106a9578063b02eba05146106b1578063b187bd26146106c4578063b293fdc5146106cc576103f0565b806389ffc7811461065e5780638caaf9e6146106665780638da5cb5b146106795780638f32d59b14610681576103f0565b806382a8af15116101e457806382a8af15146106285780638456cb591461063b57806387359ebe1461064357806389a3027114610656576103f0565b806366067a95146105fd5780636b87f99014610605578063735de9f714610618578063802971a614610620576103f0565b80633bb20ece1161031057806353a8f1ec116102a357806359dcf5221161027257806359dcf522146105b45780635c19a95c146105c75780635c60da1b146105da578063633e9470146105e257806364e39b87146105ea576103f0565b806353a8f1ec14610589578063547d0738146105915780635877b3dd1461059957806359d99805146105ac576103f0565b806343a468c8116102df57806343a468c814610545578063499d7f96146105585780634e71d92d1461056b57806352fb1c9d14610581576103f0565b80633bb20ece1461050f5780633e9a990a1461051757806341adca421461051f5780634330c26314610532576103f0565b806319e772c2116103885780632194f3a2116103575780632194f3a2146104d95780632d06e5bf146104e15780632ee1a86e146104e9578063307e85a4146104fc576103f0565b806319e772c2146104a15780631c9c4408146104a95780631ca97a2d146104b15780631d3e3955146104c4576103f0565b806302dd19d9116103c457806302dd19d9146104695780630da47e0a146104715780631514617e1461048457806317a1d0121461048c576103f0565b80628cc262146103f55780630114a05e14610421578063011cee361461044157806302baf1b014610456575b600080fd5b6104086104033660046130d0565b6107a9565b60405161041894939291906139cc565b60405180910390f35b61043461042f3660046130d0565b6107f3565b60405161041891906139b0565b610449610805565b60405161041891906137eb565b6104346104643660046130d0565b61081d565b610434610838565b61043461047f3660046130d0565b61083e565b610434610850565b610494610858565b6040516104189190613881565b610434610870565b610434610876565b6104346104bf3660046130d0565b61087c565b6104d76104d2366004613372565b61088e565b005b6104496108dd565b6104346108ec565b6104086104f73660046130d0565b6108fb565b6104d761050a366004613372565b610982565b6104346109c8565b6104d76109ce565b61043461052d3660046130d0565b610b53565b6104346105403660046130d0565b610b65565b6104346105533660046130d0565b610b77565b6104346105663660046130d0565b610ed7565b610573610ee9565b6040516104189291906139be565b610434610f2a565b610434610f30565b610449610f36565b6104d76105a7366004613158565b610f4e565b610434611201565b6105736105c23660046130d0565b611207565b6104496105d53660046130d0565b611330565b61044961134b565b61049461135a565b6104d76105f83660046130d0565b611372565b6104346113b8565b6104d7610613366004613354565b6113be565b610494611444565b61044961145c565b610449610636366004613372565b611474565b6104d761149b565b6104346106513660046130ee565b6114d4565b6104496114ff565b610494611517565b6104d7610674366004613372565b61152f565b610449611575565b610689611585565b6040516104189190613873565b6105736106a4366004613207565b6115a9565b610449611898565b6104346106bf3660046130d0565b6118b0565b6106896118c2565b6104d76106da366004613158565b6118d2565b6104346106ed3660046130ee565b611907565b6104d76107003660046132a5565b611924565b6104d7610713366004613372565b611c26565b610449611c78565b6104d761072e366004613199565b611c90565b610434611fe8565b610434611fee565b610434611ff5565b610449610759366004613128565b612001565b610449612036565b6104d761204e565b61043461221b565b610434612221565b6104d761078c3660046130d0565b6123a8565b6104496123d5565b6105736123e7565b6104d7612420565b6001600160a01b0381166000908152600080516020613b4b83398151915260205260408120548190819081906107e490869083908190612453565b50919790965092945090925050565b60086020526000908152604090205481565b73e26a220a341eaca116bda64cf9d5638a935ae62981565b6001600160a01b031660009081526003602052604090205490565b601b5481565b600d6020526000908152604090205481565b630784ce0081565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b600f5481565b60105481565b60096020526000908152604090205481565b610896611585565b6108bb5760405162461bcd60e51b81526004016108b290613940565b60405180910390fd5b806108d85760405162461bcd60e51b81526004016108b290613950565b601a55565b6002546001600160a01b031681565b6a744f570177f475546c000081565b600080600080610919600080516020613b0b833981519152866114d4565b6109377318240bd9c07fa6156ce3f3f61921cc82b2619157876114d4565b61095573b72b31907c1c95f3650b64b2469e08edacee5e8f886114d4565b61097373e26a220a341eaca116bda64cf9d5638a935ae629896114d4565b93509350935093509193509193565b61098a611585565b6109a65760405162461bcd60e51b81526004016108b290613940565b806109c35760405162461bcd60e51b81526004016108b290613950565b601b55565b600b5481565b6109d6611585565b6109f25760405162461bcd60e51b81526004016108b290613940565b610a2c736b175474e89094c44da98b954eedeac495271d0f73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600063ffffffff6124b316565b610a67736b175474e89094c44da98b954eedeac495271d0f73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff6124b316565b610aa173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600063ffffffff6124b316565b610adc73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff6124b316565b610b1673dac17f958d2ee523a2206206994597c13d831ec773bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600063ffffffff6124b316565b610b5173dac17f958d2ee523a2206206994597c13d831ec773bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff6124b316565b565b600e6020526000908152604090205481565b600a6020526000908152604090205481565b6001600160a01b0381166000908152600080516020613b4b83398151915260205260408120548015610c44576002610bf76b02dfafa4e0948fa071940000610beb610bd06b02dfafa4e0948fa0719400006000426125b0565b85906b02dfafa4e0948fa0719400000363ffffffff61265216565b9063ffffffff61269516565b81610bfe57fe5b049150610c4182610c358360156000886001600160a01b03166001600160a01b0316815260200190815260200160002054426125b0565b9063ffffffff6126d716565b91505b6001600160a01b038316600090815260096020908152604080832054600080516020613b2b83398151915290925290912054610c85918491610c35916126d7565b9150610d6382610c35670de0b6b3a7640000610beb7318240bd9c07fa6156ce3f3f61921cc82b26191576001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b158015610ce757600080fd5b505afa158015610cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d1f9190810190613390565b6001600160a01b03891660009081527fe09f1b989ce5e55474fdfb6ab6036e5e02e6f44d8729816a39308c55c71b13c760205260409020549063ffffffff61265216565b9150610ed082610c3573e26a220a341eaca116bda64cf9d5638a935ae6296001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db957600080fd5b505afa158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610df19190810190613390565b6001600160a01b03871660009081527f2b99f9ddbab8aac550ca8d7e4f266bf08c26f285c5c72de065cbb397b67b82486020526040908190205490516370a0823160e01b8152610beb9190600080516020613b0b833981519152906370a0823190610e749073e26a220a341eaca116bda64cf9d5638a935ae629906004016137eb565b60206040518083038186803b158015610e8c57600080fd5b505afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ec49190810190613390565b9063ffffffff61265216565b9392505050565b60176020526000908152604090205481565b6001546000908190600160a01b900460ff1615610f185760405162461bcd60e51b81526004016108b290613980565b610f2260006126fc565b915091509091565b60115481565b601a5481565b73b72b31907c1c95f3650b64b2469e08edacee5e8f81565b610f56611585565b610f725760405162461bcd60e51b81526004016108b290613940565b606060005b828110156111fb57838382818110610f8b57fe5b602002820190508035601e1936849003018112610fa757600080fd5b909101602081019150356001600160401b03811115610fc557600080fd5b602081023603821315610fd757600080fd5b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250508251929450505060021180159061105a57508160018351038151811061102857fe5b60200260200101516001600160a01b03168260008151811061104657fe5b60200260200101516001600160a01b031614155b801561109c5750600080516020613b0b8339815191526001600160a01b03168260018451038151811061108957fe5b60200260200101516001600160a01b0316145b6110b85760405162461bcd60e51b81526004016108b290613900565b60405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f906110f9906402540be40090879060040161388f565b60006040518083038186803b15801561111157600080fd5b505afa158015611125573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261114d9190810190613302565b90508060018251038151811061115f57fe5b6020026020010151600014156111875760405162461bcd60e51b81526004016108b290613970565b82601660008560008151811061119957fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090805190602001906111d4929190612e16565b506111f2836000815181106111e557fe5b60200260200101516113be565b50600101610f77565b50505050565b60195481565b600f546001600160a01b0382166000908152600080516020613b4b83398151915260205260408120549091829161125191670de0b6b3a764000091610beb9163ffffffff61265216565b6001600160a01b0384166000908152600080516020613b2b83398151915260209081526040808320546010547fe09f1b989ce5e55474fdfb6ab6036e5e02e6f44d8729816a39308c55c71b13c79093529220549194509192506112c7918491610c3591670de0b6b3a764000091610beb91612652565b6011546001600160a01b03851660009081527f2b99f9ddbab8aac550ca8d7e4f266bf08c26f285c5c72de065cbb397b67b82486020526040902054919350611329918491610c3591670de0b6b3a764000091610beb919063ffffffff61265216565b9150915091565b6005602052600090815260409020546001600160a01b031681565b6001546001600160a01b031681565b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f81565b61137a611585565b6113965760405162461bcd60e51b81526004016108b290613940565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60145481565b6113c6611585565b6113e25760405162461bcd60e51b81526004016108b290613940565b6114116001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d600063ffffffff6124b316565b6114416001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d60001963ffffffff6124b316565b50565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b7318240bd9c07fa6156ce3f3f61921cc82b261915781565b601c818154811061148157fe5b6000918252602090912001546001600160a01b0316905081565b6114a3611585565b6114bf5760405162461bcd60e51b81526004016108b290613940565b6001805460ff60a01b1916600160a01b179055565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b736c3f90f043a72fa612cbac8115ee7e52bde6e49081565b611537611585565b6115535760405162461bcd60e51b81526004016108b290613940565b806115705760405162461bcd60e51b81526004016108b290613950565b601955565b6000546001600160a01b03165b90565b600080546001600160a01b031661159a61297b565b6001600160a01b031614905090565b6001546000908190600160a01b900460ff16156115d85760405162461bcd60e51b81526004016108b290613980565b86851480156115e657508683145b6116025760405162461bcd60e51b81526004016108b2906138f0565b60005b878110156117685761166e87878381811061161c57fe5b90506020020135600960008c8c8681811061163357fe5b905060200201602061164891908101906130d0565b6001600160a01b031681526020810191909152604001600020549063ffffffff6126d716565b600960008b8b8581811061167e57fe5b905060200201602061169391908101906130d0565b6001600160a01b031681526020810191909152604001600020556116d28787838181106116bc57fe5b90506020020135846126d790919063ffffffff16565b92506116fa8585838181106116e357fe5b90506020020135600d60008c8c8681811061163357fe5b600d60008b8b8581811061170a57fe5b905060200201602061171f91908101906130d0565b6001600160a01b0316815260208101919091526040016000205561175e85858381811061174857fe5b90506020020135836126d790919063ffffffff16565b9150600101611605565b5081156117f8576040516323b872dd60e01b8152600080516020613b0b833981519152906323b872dd906117a4903390309087906004016137f9565b602060405180830381600087803b1580156117be57600080fd5b505af11580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117f69190810190613336565b505b801561188d576040516323b872dd60e01b8152736c3f90f043a72fa612cbac8115ee7e52bde6e490906323b872dd90611839903390309086906004016137f9565b602060405180830381600087803b15801561185357600080fd5b505af1158015611867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061188b9190810190613336565b505b965096945050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600c6020526000908152604090205481565b600154600160a01b900460ff1681565b6118da611585565b6118f65760405162461bcd60e51b81526004016108b290613940565b611902601c8383612e7b565b505050565b600660209081526000928352604080842090915290825290205481565b600154600160a01b900460ff161561194e5760405162461bcd60e51b81526004016108b290613980565b336000818152600080516020613b4b8339815191526020526040812054906119799083908084612453565b50506001600160a01b0384166000908152600960209081526040808320600d8352818420949094559390925560159091522042905582518451146119cf5760405162461bcd60e51b81526004016108b2906138f0565b336000908152600560205260408120546001600160a01b0316908080805b8851811015611c1b57888181518110611a0257fe5b60200260200101519350600080516020613b0b8339815191526001600160a01b0316846001600160a01b03161480611a5657506001600160a01b03841673b72b31907c1c95f3650b64b2469e08edacee5e8f145b80611a7d57506001600160a01b0384167318240bd9c07fa6156ce3f3f61921cc82b2619157145b80611aa457506001600160a01b03841673e26a220a341eaca116bda64cf9d5638a935ae629145b611ac05760405162461bcd60e51b81526004016108b290613930565b878181518110611acc57fe5b6020908102919091018101516001600160a01b038616600090815260048352604080822033835290935291909120549093509150821580611b0b575081155b15611b1557611c13565b81831115611b21578192505b6001600160a01b038085166000818152600460209081526040808320338452825280832088880390558383526003825280832080548990039055938916825260068152838220928252919091522054611b80908463ffffffff61297f16565b6001600160a01b03808716600090815260066020908152604080832093891680845293909152902091909155611bbd90338563ffffffff6129c116565b846001600160a01b0316846001600160a01b0316336001600160a01b03167f2cbcd809a4c90d11f8d12c4b6d09986b255ae1e68f54f076c145fbb2185904e186604051611c0a91906139b0565b60405180910390a45b6001016119ed565b505050505050505050565b611c2e611585565b611c4a5760405162461bcd60e51b81526004016108b290613940565b68056bc75e2d63100000811115611c735760405162461bcd60e51b81526004016108b290613910565b601855565b73dac17f958d2ee523a2206206994597c13d831ec781565b600154600160a01b900460ff1615611cba5760405162461bcd60e51b81526004016108b290613980565b336000818152600080516020613b4b833981519152602052604081205490611ce59083908084612453565b50506001600160a01b0384166000908152600960209081526040808320600d83528184209490945593909255601590915220429055848314611d395760405162461bcd60e51b81526004016108b2906138f0565b336000908152600560205260409020546001600160a01b031680611d8a575033600081815260056020526040902080546001600160a01b03191682179055611d8860128263ffffffff6129e316565b505b600080805b88811015611fdc57898982818110611da357fe5b9050602002016020611db891908101906130d0565b92506001600160a01b038316600080516020613b0b8339815191521480611dfb57506001600160a01b03831673b72b31907c1c95f3650b64b2469e08edacee5e8f145b80611e2257506001600160a01b0383167318240bd9c07fa6156ce3f3f61921cc82b2619157145b80611e4957506001600160a01b03831673e26a220a341eaca116bda64cf9d5638a935ae629145b611e655760405162461bcd60e51b81526004016108b290613930565b878782818110611e7157fe5b9050602002013591508160001415611e8857611fd4565b6001600160a01b0383166000908152600460209081526040808320338452909152902054611ebc908363ffffffff6126d716565b6001600160a01b038416600081815260046020908152604080832033845282528083209490945591815260039091522054611efd908363ffffffff6126d716565b6001600160a01b0380851660008181526003602090815260408083209590955592881681526006835283812091815291522054611f40908363ffffffff6126d716565b6001600160a01b03808616600090815260066020908152604080832093881680845293909152902091909155611f7e9033308563ffffffff6129f816565b836001600160a01b0316836001600160a01b0316336001600160a01b03167fc5017594d2723c038bb216e5bcef3ac65910ade839c0e63253bf5b59efbf0fd785604051611fcb91906139b0565b60405180910390a45b600101611d8f565b50505050505050505050565b60185481565b62f099c081565b670de0b6b3a764000081565b6016602052816000526040600020818154811061201a57fe5b6000918252602090912001546001600160a01b03169150829050565b736b175474e89094c44da98b954eedeac495271d0f81565b60408051600480825260a0820190925260609160208201608080388339505060408051600480825260a082019092529293506060929150602082016080803883390190505090507318240bd9c07fa6156ce3f3f61921cc82b2619157826000815181106120b757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073e26a220a341eaca116bda64cf9d5638a935ae629826001815181106120f957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073b72b31907c1c95f3650b64b2469e08edacee5e8f8260028151811061213b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613b0b8339815191528260038151811061217757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600019816000815181106121a757fe5b602002602001018181525050600019816001815181106121c357fe5b602002602001018181525050600019816002815181106121df57fe5b602002602001018181525050600019816003815181106121fb57fe5b6020026020010181815250506122118282611924565b6111fb60006126fc565b60075481565b600f5473b72b31907c1c95f3650b64b2469e08edacee5e8f600090815260036020527ffcfc5d57a009157202436965eb7c01b14f1b51f705a3b4f08296120160c5e10954909161228591670de0b6b3a764000091610beb919063ffffffff61265216565b600080516020613b0b83398151915260005260036020527f26822d1429e81ba812c5218f96710c8923c00dbf3bebc27a2dcc389411621671549091506122d1908263ffffffff6126d716565b6010547318240bd9c07fa6156ce3f3f61921cc82b261915760005260036020527f91de0462b01273d0819ee89d2f822b745d4b4dcc3d05d8e0d13f841abd34e4a25491925061233a918391610c3591670de0b6b3a764000091610beb919063ffffffff61265216565b60115473e26a220a341eaca116bda64cf9d5638a935ae62960005260036020527f8341f36a1c413f2034fb483b56344c972362456414155a77c5d31e601f1c02a4549192506123a3918391610c3591670de0b6b3a764000091610beb919063ffffffff61265216565b905090565b6123b0611585565b6123cc5760405162461bcd60e51b81526004016108b290613940565b61144181612a1c565b600080516020613b0b83398151915281565b6001546000908190600160a01b900460ff16156124165760405162461bcd60e51b81526004016108b290613980565b610f2260016126fc565b612428611585565b6124445760405162461bcd60e51b81526004016108b290613940565b6001805460ff60a01b19169055565b6001600160a01b038416600090815260096020908152604080832054600d835281842054601590935290832054909290819081904281146124a65786156124a65761249f8782426125b0565b9586019591505b5050945094509450949050565b80158061253b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906124e9903090869060040161383c565b60206040518083038186803b15801561250157600080fd5b505afa158015612515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125399190810190613390565b155b6125575760405162461bcd60e51b81526004016108b290613990565b60405161190290849063095ea7b360e01b906125799086908690602401613865565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a9d565b60006125c2824263ffffffff612b8216565b915082821115610ed057635ffd02a0821115806125e3575063669136e08310155b156125f057506000610ed0565b635ffd02a083101561260457635ffd02a092505b63669136e08211156126185763669136e091505b600061262a838563ffffffff61297f16565b90506306943440612641868363ffffffff61265216565b8161264857fe5b0495945050505050565b6000826126615750600061268f565b8282028284828161266e57fe5b041461268c5760405162461bcd60e51b81526004016108b290613920565b90505b92915050565b600061268c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b98565b60008282018381101561268c5760405162461bcd60e51b81526004016108b2906138d0565b336000818152600080516020613b4b83398151915260205260408120549091829161272982848084612453565b50506001600160a01b0384166000908152600960209081526040808320600d83528184209490945593909255601590915290812042905561276d9033908080612453565b50919550935050831561288d5733600090815260096020526040812055841561279f5761279a3385612bc5565b61288d565b73b72b31907c1c95f3650b64b2469e08edacee5e8f6001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156127ee57600080fd5b505af1158015612802573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152600080516020613b0b833981519152925063a9059cbb91506128399033908890600401613821565b602060405180830381600087803b15801561285357600080fd5b505af1158015612867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061288b9190810190613336565b505b821561293157336000818152600d6020526040808220919091555163a9059cbb60e01b8152736c3f90f043a72fa612cbac8115ee7e52bde6e4909163a9059cbb916128dd91908790600401613821565b602060405180830381600087803b1580156128f757600080fd5b505af115801561290b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061292f9190810190613336565b505b336001600160a01b03167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7858560405161296c9291906139be565b60405180910390a25050915091565b3390565b600061268c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612d54565b60405161190290849063a9059cbb60e01b906125799086908690602401613865565b6000816129f08482612d80565b949350505050565b6040516111fb9085906323b872dd60e01b9061257990879087908790602401613857565b6001600160a01b038116612a425760405162461bcd60e51b81526004016108b2906138c0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612aaf826001600160a01b0316612dc8565b612acb5760405162461bcd60e51b81526004016108b2906139a0565b60006060836001600160a01b031683604051612ae791906137df565b6000604051808303816000865af19150503d8060008114612b24576040519150601f19603f3d011682016040523d82523d6000602084013e612b29565b606091505b509150915081612b4b5760405162461bcd60e51b81526004016108b2906138e0565b8051156111fb5780806020019051612b669190810190613336565b6111fb5760405162461bcd60e51b81526004016108b290613960565b6000818310612b91578161268c565b5090919050565b60008183612bb95760405162461bcd60e51b81526004016108b291906138af565b50600083858161264857fe5b6001600160a01b03828116600090815260056020908152604080832054600080516020613b2b83398151915290925290912054911690612c0590836126d7565b6001600160a01b0384166000908152600080516020613b2b83398151915260209081526040822092909255600080516020613b0b8339815191529052600390527f26822d1429e81ba812c5218f96710c8923c00dbf3bebc27a2dcc38941162167154612c77908363ffffffff6126d716565b7f26822d1429e81ba812c5218f96710c8923c00dbf3bebc27a2dcc389411621671556001600160a01b0381166000908152600660209081526040808320600080516020613b0b8339815191528452909152902054612cdb908363ffffffff6126d716565b6001600160a01b038083166000818152600660209081526040808320600080516020613b0b83398151915280855292529182902094909455519092918616907fc5017594d2723c038bb216e5bcef3ac65910ade839c0e63253bf5b59efbf0fd790612d479087906139b0565b60405180910390a4505050565b60008184841115612d785760405162461bcd60e51b81526004016108b291906138af565b505050900390565b6000612d8c8383612e01565b612dc0575060018083018054808301808355600092835260208084209092018590558483529085905260409091205561268f565b50600061268f565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906129f0575050151592915050565b60009081526020919091526040902054151590565b828054828255906000526020600020908101928215612e6b579160200282015b82811115612e6b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612e36565b50612e77929150612ece565b5090565b828054828255906000526020600020908101928215612e6b579160200282015b82811115612e6b5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612e9b565b61158291905b80821115612e775780546001600160a01b0319168155600101612ed4565b803561268f81613adb565b60008083601f840112612f0f57600080fd5b5081356001600160401b03811115612f2657600080fd5b602083019150836020820283011115612f3e57600080fd5b9250929050565b600082601f830112612f5657600080fd5b8135612f69612f6482613a30565b613a0a565b91508181835260208401935060208101905083856020840282011115612f8e57600080fd5b60005b83811015612fba5781612fa48882612ef2565b8452506020928301929190910190600101612f91565b5050505092915050565b600082601f830112612fd557600080fd5b8135612fe3612f6482613a30565b9150818183526020840193506020810190508385602084028201111561300857600080fd5b60005b83811015612fba578161301e88826130ba565b845250602092830192919091019060010161300b565b600082601f83011261304557600080fd5b8151613053612f6482613a30565b9150818183526020840193506020810190508385602084028201111561307857600080fd5b60005b83811015612fba578161308e88826130c5565b845250602092830192919091019060010161307b565b805161268f81613aef565b803561268f81613af8565b803561268f81613b01565b805161268f81613b01565b6000602082840312156130e257600080fd5b60006129f08484612ef2565b6000806040838503121561310157600080fd5b600061310d8585612ef2565b925050602061311e85828601612ef2565b9150509250929050565b6000806040838503121561313b57600080fd5b60006131478585612ef2565b925050602061311e858286016130ba565b6000806020838503121561316b57600080fd5b82356001600160401b0381111561318157600080fd5b61318d85828601612efd565b92509250509250929050565b600080600080604085870312156131af57600080fd5b84356001600160401b038111156131c557600080fd5b6131d187828801612efd565b945094505060208501356001600160401b038111156131ef57600080fd5b6131fb87828801612efd565b95989497509550505050565b6000806000806000806060878903121561322057600080fd5b86356001600160401b0381111561323657600080fd5b61324289828a01612efd565b965096505060208701356001600160401b0381111561326057600080fd5b61326c89828a01612efd565b945094505060408701356001600160401b0381111561328a57600080fd5b61329689828a01612efd565b92509250509295509295509295565b600080604083850312156132b857600080fd5b82356001600160401b038111156132ce57600080fd5b6132da85828601612f45565b92505060208301356001600160401b038111156132f657600080fd5b61311e85828601612fc4565b60006020828403121561331457600080fd5b81516001600160401b0381111561332a57600080fd5b6129f084828501613034565b60006020828403121561334857600080fd5b60006129f084846130a4565b60006020828403121561336657600080fd5b60006129f084846130af565b60006020828403121561338457600080fd5b60006129f084846130ba565b6000602082840312156133a257600080fd5b60006129f084846130c5565b60006133ba83836133d1565b505060200190565b6133cb81613a8f565b82525050565b6133cb81613a68565b60006133e582613a56565b6133ef8185613a5a565b93506133fa83613a50565b8060005b8381101561342857815161341288826133ae565b975061341d83613a50565b9250506001016133fe565b509495945050505050565b6133cb81613a73565b600061344782613a56565b6134518185613a63565b9350613461818560208601613aa5565b9290920192915050565b6133cb81613a78565b6133cb81613a9a565b600061348882613a56565b6134928185613a5a565b93506134a2818560208601613aa5565b6134ab81613ad1565b9093019392505050565b60006134c2602683613a5a565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061350a601b83613a5a565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000613543602083613a5a565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b600061357c600e83613a5a565b6d0c6deeadce840dad2e6dac2e8c6d60931b815260200192915050565b60006135a6600c83613a5a565b6b0d2dcecc2d8d2c840e0c2e8d60a31b815260200192915050565b60006135ce600e83613a5a565b6d0ecc2d8eaca40e8dede40d0d2ced60931b815260200192915050565b60006135f8602183613a5a565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061363b600d83613a5a565b6c34b73b30b634b2103a37b5b2b760991b815260200192915050565b6000613664600c83613a5a565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b600061368c600d83613a5a565b6c696e76616c696420706172616d60981b815260200192915050565b60006136b5602a83613a5a565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000613701601383613a5a565b721c185d1a08191bd95cc81b9bdd08195e1a5cdd606a1b815260200192915050565b6000613730600683613a5a565b651c185d5cd95960d21b815260200192915050565b6000613752603683613a5a565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f81527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b602082015260400192915050565b60006137aa601f83613a5a565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6133cb81611582565b6000610ed0828461343c565b6020810161268f82846133d1565b6060810161380782866133c2565b61381460208301856133d1565b6129f060408301846137d6565b6040810161382f82856133c2565b610ed060208301846137d6565b6040810161384a82856133d1565b610ed060208301846133d1565b6060810161380782866133d1565b6040810161382f82856133d1565b6020810161268f8284613433565b6020810161268f828461346b565b6040810161389d8285613474565b81810360208301526129f081846133da565b6020808252810161268c818461347d565b6020808252810161268f816134b5565b6020808252810161268f816134fd565b6020808252810161268f81613536565b6020808252810161268f8161356f565b6020808252810161268f81613599565b6020808252810161268f816135c1565b6020808252810161268f816135eb565b6020808252810161268f8161362e565b6020808252810161268f81613657565b6020808252810161268f8161367f565b6020808252810161268f816136a8565b6020808252810161268f816136f4565b6020808252810161268f81613723565b6020808252810161268f81613745565b6020808252810161268f8161379d565b6020810161268f82846137d6565b6040810161382f82856137d6565b608081016139da82876137d6565b6139e760208301866137d6565b6139f460408301856137d6565b613a0160608301846137d6565b95945050505050565b6040518181016001600160401b0381118282101715613a2857600080fd5b604052919050565b60006001600160401b03821115613a4657600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b919050565b600061268f82613a83565b151590565b600061268f82613a68565b6001600160a01b031690565b600061268f82613a78565b600061268f82611582565b60005b83811015613ac0578181015183820152602001613aa8565b838111156111fb5750506000910152565b601f01601f191690565b613ae481613a68565b811461144157600080fd5b613ae481613a73565b613ae481613a78565b613ae48161158256fe00000000000000000000000056d811088235f11c8920698a204a5010a788f4b31e38d77566003d7f728cfa677ad07e8283e5607bd89a929ee98c93eba12048732ce56405c0c0b7d532a6d76ebaf14a8d190d60f3be61dae6890d68141a9cc6f8a365627a7a723158201f7aaa80bce3c096848883605f539f249377ba7762a3b1818f11f32cf1fae9de6c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode Sourcemap
30874:16634:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30874:16634:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37024:406;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23786:58;;;;;;;;;:::i;:::-;;;;;;;;27294:76;;;:::i;:::-;;;;;;;;42502:170;;;;;;;;;:::i;24988:40::-;;;:::i;24242:52::-;;;;;;;;;:::i;28200:64::-;;;:::i;27908:96::-;;;:::i;:::-;;;;;;;;24448:32;;;:::i;24487:::-;;;:::i;23888:46::-;;;;;;;;;:::i;47018:242::-;;;;;;;;;:::i;:::-;;23274:26;;;:::i;23099:79::-;;;:::i;39756:487::-;;;;;;;;;:::i;47268:237::-;;;;;;;;;:::i;24094:39::-;;;:::i;46071:460::-;;;:::i;24344:52::-;;;;;;;;;:::i;23990:46::-;;;;;;;;;:::i;40926:1568::-;;;;;;;;;:::i;24789:49::-;;;;;;;;;:::i;34014:177::-;;;:::i;:::-;;;;;;;;;24526:34;;;:::i;24939:42::-;;;:::i;27132:74::-;;;:::i;45082:753::-;;;;;;;;;:::i;24888:44::-;;;:::i;40251:667::-;;;;;;;;;:::i;23528:43::-;;;;;;;;;:::i;22874:29::-;;;:::i;28011:89::-;;;:::i;44637:143::-;;;;;;;;;:::i;24632:33::-;;;:::i;45843:220::-;;;;;;;;;:::i;27792:109::-;;;:::i;27213:74::-;;;:::i;25037:33::-;;;;;;;;;:::i;44432:93::-;;;:::i;39539:209::-;;;;;;;;;:::i;27630:73::-;;;:::i;27377:85::-;;;:::i;46758:252::-;;;;;;;;;:::i;2929:79::-;;;:::i;3275:94::-;;;:::i;:::-;;;;;;;;38504:1027;;;;;;;;;:::i;27471:73::-;;;:::i;24140:64::-;;;;;;;;;:::i;23245:20::-;;;:::i;44788:145::-;;;;;;;;;:::i;23633:72::-;;;;;;;;;:::i;32505:1501::-;;;;;;;;;:::i;46539:211::-;;;;;;;;;:::i;27710:73::-;;;:::i;31026:1471::-;;;;;;;;;:::i;24845:36::-;;;:::i;28109:63::-;;;:::i;28764:47::-;;;:::i;24736:46::-;;;;;;;;;:::i;27551:72::-;;;:::i;36152:508::-;;;:::i;23746:33::-;;;:::i;42680:564::-;;;:::i;3524:109::-;;;;;;;;;:::i;27052:73::-;;;:::i;34199:186::-;;;:::i;44533:96::-;;;:::i;37024:406::-;-1:-1:-1;;;;;37378:33:0;;37115:25;37378:33;;;-1:-1:-1;;;;;;;;;;;37378:24:0;:33;:24;:33;;;37115:25;;;;;;37302:120;;37324:7;;37115:25;;;;37302:7;:120::i;:::-;-1:-1:-1;37253:169:0;;;;-1:-1:-1;37024:406:0;;-1:-1:-1;37024:406:0;;-1:-1:-1;;37024:406:0:o;23786:58::-;;;;;;;;;;;;;:::o;27294:76::-;27328:42;27294:76;:::o;42502:170::-;-1:-1:-1;;;;;42637:27:0;42605:7;42637:27;;;:20;:27;;;;;;;42502:170::o;24988:40::-;;;;:::o;24242:52::-;;;;;;;;;;;;;:::o;28200:64::-;28255:9;28200:64;:::o;27908:96::-;27961:42;27908:96;:::o;24448:32::-;;;;:::o;24487:::-;;;;:::o;23888:46::-;;;;;;;;;;;;;:::o;47018:242::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;;;;;;;;;47153:26;47145:52;;;;-1:-1:-1;;;47145:52:0;;;;;;;;;47208:20;:44;47018:242::o;23274:26::-;;;-1:-1:-1;;;;;23274:26:0;;:::o;23099:79::-;23150:28;23099:79;:::o;39756:487::-;39874:19;39908:20;39943;39978:22;40050:31;-1:-1:-1;;;;;;;;;;;40073:7:0;40050:16;:31::i;:::-;40096:32;27245:42;40120:7;40096:16;:32::i;:::-;40143;27164:42;40167:7;40143:16;:32::i;:::-;40190:34;27328:42;40216:7;40190:16;:34::i;:::-;40028:207;;;;;;;;39756:487;;;;;:::o;47268:237::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;47401:25;47393:51;;;;-1:-1:-1;;;47393:51:0;;;;;;;;;47455:19;:42;47268:237::o;24094:39::-;;;;:::o;46071:460::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;46152:47;27581:42;27961;46197:1;46152:47;:23;:47;:::i;:::-;46210:57;27581:42;27961;-1:-1:-1;;46210:57:0;:23;:57;:::i;:::-;46278:48;27661:42;27961;46324:1;46278:48;:24;:48;:::i;:::-;46337:58;27661:42;27961;-1:-1:-1;;46337:58:0;:24;:58;:::i;:::-;46406:48;27741:42;27961;46452:1;46406:48;:24;:48;:::i;:::-;46465:58;27741:42;27961;-1:-1:-1;;46465:58:0;:24;:58;:::i;:::-;46071:460::o;24344:52::-;;;;;;;;;;;;;:::o;23990:46::-;;;;;;;;;;;;;:::o;40926:1568::-;-1:-1:-1;;;;;41087:33:0;;41028:18;41087:33;;;-1:-1:-1;;;;;;;;;;;41087:24:0;:33;:24;:33;;;41135:17;;41131:753;;41581:1;41272:306;28723:12;41272:279;41352:180;28723:12;41466:1;41494:15;41352:14;:180::i;:::-;41272:12;;28723;41307:225;41272:279;:34;:279;:::i;:::-;:283;:306;:283;:306;:::i;:::-;:310;;;;;;41259:323;;41718:154;41861:10;41718:138;41751:12;41782:16;:25;41799:7;-1:-1:-1;;;;;41782:25:0;-1:-1:-1;;;;;41782:25:0;;;;;;;;;;;;;41826:15;41718:14;:138::i;:::-;:142;:154;:142;:154;:::i;:::-;41705:167;;41131:753;-1:-1:-1;;;;;41960:20:0;;;;;;:11;:20;;;;;;;;;-1:-1:-1;;;;;;;;;;;41909:32:0;;;;;;;:143;;42041:10;;41909:72;;:50;:72::i;:143::-;41896:156;;42078:136;42203:10;42078:106;42179:4;42078:82;27245:42;-1:-1:-1;;;;;42130:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42130:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42130:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42130:29:0;;;;;;;;;-1:-1:-1;;;;;42078:33:0;;:24;:33;;;:24;;:33;:24;:33;;;;:82;:51;:82;:::i;:136::-;42065:149;;42321:165;42475:10;42321:135;27328:42;-1:-1:-1;;;;;42426:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42426:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42426:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42426:29:0;;;;;;;;;-1:-1:-1;;;;;42371:35:0;;:26;:35;;;:26;;:35;:26;:35;;;;;42321:31;;-1:-1:-1;;;42321:31:0;;:86;;42371:35;-1:-1:-1;;;;;;;;;;;27083:42:0;42321:22;;:31;;27328:42;;42371:17;42321:31;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42321:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42321:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42321:31:0;;;;;;;;;:49;:86;:49;:86;:::i;:165::-;42308:178;40926:1568;-1:-1:-1;;;40926:1568:0:o;24789:49::-;;;;;;;;;;;;;:::o;34014:177::-;30979:8;;34087:25;;;;-1:-1:-1;;;30979:8:0;;;;30978:9;30970:28;;;;-1:-1:-1;;;30970:28:0;;;;;;;;;34170:13;34177:5;34170:6;:13::i;:::-;34163:20;;;;34014:177;;:::o;24526:34::-;;;;:::o;24939:42::-;;;;:::o;27132:74::-;27164:42;27132:74;:::o;45082:753::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;45191:21;45228:9;45223:605;45243:16;;;45223:605;;;45288:5;;45294:1;45288:8;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;-1:-1;;;;;82:30;;79:2;;;125:1;122;115:12;79:2;183:4;175:6;171:17;155:14;151:38;141:8;137:53;134:2;;;203:1;200;193:12;134:2;45281:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;45319:11:0;;45281:15;;-1:-1:-1;;;45334:1:0;-1:-1:-1;45319:16:0;;;:69;;;45367:4;45386:1;45372:4;:11;:15;45367:21;;;;;;;;;;;;;;-1:-1:-1;;;;;45356:32:0;:4;45361:1;45356:7;;;;;;;;;;;;;;-1:-1:-1;;;;;45356:32:0;;;45319:69;:119;;;;;-1:-1:-1;;;;;;;;;;;;;;;;45409:29:0;:4;45428:1;45414:4;:11;:15;45409:21;;;;;;;;;;;;;;-1:-1:-1;;;;;45409:29:0;;45319:119;45311:175;;;;-1:-1:-1;;;45311:175:0;;;;;;;;;45588:39;;-1:-1:-1;;;45588:39:0;;45558:27;;27858:42;;45588:27;;:39;;45616:4;;45622;;45588:39;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45588:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45588:39:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45588:39:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;45588:39:0;;;;;;;;;45558:69;;45650:10;45681:1;45661:10;:17;:21;45650:33;;;;;;;;;;;;;;45687:1;45650:38;;45642:70;;;;-1:-1:-1;;;45642:70:0;;;;;;;;;45762:4;45741:9;:18;45751:4;45756:1;45751:7;;;;;;;;;;;;;;-1:-1:-1;;;;;45741:18:0;-1:-1:-1;;;;;45741:18:0;;;;;;;;;;;;:25;;;;;;;;;;;;:::i;:::-;;45781:35;45807:4;45812:1;45807:7;;;;;;;;;;;;;;45781:18;:35::i;:::-;-1:-1:-1;45261:3:0;;45223:605;;;;3178:1;45082:753;;:::o;24888:44::-;;;;:::o;40251:667::-;40487:17;;-1:-1:-1;;;;;40431:33:0;;40351:21;40431:33;;;-1:-1:-1;;;;;;;;;;;40431:24:0;:33;:24;:33;;;40351:21;;;;40431:102;;40528:4;;40431:74;;;:55;:74;:::i;:102::-;-1:-1:-1;;;;;40562:32:0;;:23;:32;;;-1:-1:-1;;;;;;;;;;;40562:23:0;:32;;;:23;:32;;;;40675:17;;40623:24;:33;;;;;;40562:32;;-1:-1:-1;40414:119:0;;-1:-1:-1;40623:127:0;;40562:32;;40623:94;;40712:4;;40623:70;;:51;:70::i;:127::-;40833:19;;-1:-1:-1;;;;;40779:35:0;;:26;:35;;;:26;;:35;:26;:35;;;40607:143;;-1:-1:-1;40779:131:0;;40607:143;;40779:98;;40872:4;;40779:74;;:35;:74;:53;:74;:::i;:131::-;40763:147;;40251:667;;;:::o;23528:43::-;;;;;;;;;;;;-1:-1:-1;;;;;23528:43:0;;:::o;22874:29::-;;;-1:-1:-1;;;;;22874:29:0;;:::o;28011:89::-;28057:42;28011:89;:::o;44637:143::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;44746:11;:26;;-1:-1:-1;;;;;;44746:26:0;-1:-1:-1;;;;;44746:26:0;;;;;;;;;;44637:143::o;24632:33::-;;;;:::o;45843:220::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;45946:44;-1:-1:-1;;;;;45946:17:0;;27858:42;45988:1;45946:44;:17;:44;:::i;:::-;46001:54;-1:-1:-1;;;;;46001:17:0;;27858:42;-1:-1:-1;;46001:54:0;:17;:54;:::i;:::-;45843:220;:::o;27792:109::-;27858:42;27792:109;:::o;27213:74::-;27245:42;27213:74;:::o;25037:33::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25037:33:0;;-1:-1:-1;25037:33:0;:::o;44432:93::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;44513:4;44502:15;;-1:-1:-1;;;;44502:15:0;-1:-1:-1;;;44502:15:0;;;44432:93::o;39539:209::-;-1:-1:-1;;;;;39707:24:0;;;39664:15;39707:24;;;:17;:24;;;;;;;;:33;;;;;;;;;;;;;39539:209::o;27630:73::-;27661:42;27630:73;:::o;27377:85::-;27419:42;27377:85;:::o;46758:252::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;46897:28;46889:54;;;;-1:-1:-1;;;46889:54:0;;;;;;;;;46954:22;:48;46758:252::o;2929:79::-;2967:7;2994:6;-1:-1:-1;;;;;2994:6:0;2929:79;;:::o;3275:94::-;3315:4;3355:6;;-1:-1:-1;;;;;3355:6:0;3339:12;:10;:12::i;:::-;-1:-1:-1;;;;;3339:22:0;;3332:29;;3275:94;:::o;38504:1027::-;30979:8;;38713:17;;;;-1:-1:-1;;;30979:8:0;;;;30978:9;30970:28;;;;-1:-1:-1;;;30970:28:0;;;;;;;;;38781:37;;;:84;;;;-1:-1:-1;38822:43:0;;;38781:84;38773:111;;;;-1:-1:-1;;;38773:111:0;;;;;;;;;38902:9;38897:378;38917:19;;;38897:378;;;38985:44;39014:11;;39026:1;39014:14;;;;;;;;;;;;;38985:11;:24;38997:8;;39006:1;38997:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38985:24:0;;;;;;;;;;;;-1:-1:-1;38985:24:0;;;:44;:28;:44;:::i;:::-;38958:11;:24;38970:8;;38979:1;38970:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38958:24:0;;;;;;;;;;;;-1:-1:-1;38958:24:0;:71;39056:29;39070:11;;39082:1;39070:14;;;;;;;;;;;;;39056:9;:13;;:29;;;;:::i;:::-;39044:41;;39133:56;39168:17;;39186:1;39168:20;;;;;;;;;;;;;39133:17;:30;39151:8;;39160:1;39151:11;;;;;;39133:56;39100:17;:30;39118:8;;39127:1;39118:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39100:30:0;;;;;;;;;;;;-1:-1:-1;39100:30:0;:89;39222:41;39242:17;;39260:1;39242:20;;;;;;;;;;;;;39222:15;:19;;:41;;;;:::i;:::-;39204:59;-1:-1:-1;38938:3:0;;38897:378;;;-1:-1:-1;39289:14:0;;39285:110;;39320:63;;-1:-1:-1;;;39320:63:0;;-1:-1:-1;;;;;;;;;;;27083:42:0;39320:25;;:63;;39346:10;;39366:4;;39373:9;;39320:63;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39320:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39320:63:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39320:63:0;;;;;;;;;;39285:110;39409:20;;39405:119;;39446:66;;-1:-1:-1;;;39446:66:0;;27419:42;;39446:22;;:66;;39469:10;;39489:4;;39496:15;;39446:66;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39446:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39446:66:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39446:66:0;;;;;;;;;;39405:119;38504:1027;;;;;;;;;:::o;27471:73::-;27502:42;27471:73;:::o;24140:64::-;;;;;;;;;;;;;:::o;23245:20::-;;;-1:-1:-1;;;23245:20:0;;;;;:::o;44788:145::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;44900:25;:16;44919:6;;44900:25;:::i;:::-;;44788:145;;:::o;23633:72::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;32505:1501::-;30979:8;;-1:-1:-1;;;30979:8:0;;;;30978:9;30970:28;;;;-1:-1:-1;;;30970:28:0;;;;;;;;;32650:10;36719:20;36742:33;;;-1:-1:-1;;;;;;;;;;;36742:24:0;:33;:24;:33;;;;36841:99;;32650:10;;36719:20;36742:33;36841:7;:99::i;:::-;-1:-1:-1;;;;;;;36787:20:0;;;;;;:11;:20;;;;;;;;36809:17;:26;;;;;36786:154;;;;;;;;36951:16;:25;;;;36979:15;36951:43;;32703:13;;32686;;:30;32678:57;;;;-1:-1:-1;;;32678:57:0;;;;;;;;;32783:10;32748:23;32774:20;;;:8;:20;;;;;;-1:-1:-1;;;;;32774:20:0;;32748:23;;;32894:1105;32918:6;:13;32914:1;:17;32894:1105;;;32961:6;32968:1;32961:9;;;;;;;;;;;;;;32953:17;;-1:-1:-1;;;;;;;;;;;;;;;;32993:13:0;:5;-1:-1:-1;;;;;32993:13:0;;:31;;;-1:-1:-1;;;;;;33010:14:0;;27164:42;33010:14;32993:31;:49;;;-1:-1:-1;;;;;;33028:14:0;;27245:42;33028:14;32993:49;:69;;;-1:-1:-1;;;;;;33046:16:0;;27328:42;33046:16;32993:69;32985:95;;;;-1:-1:-1;;;32985:95:0;;;;;;;;;33113:6;33120:1;33113:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33152:24:0;;;;;;:17;:24;;;;;;33177:10;33152:36;;;;;;;;;;33113:9;;-1:-1:-1;33152:36:0;-1:-1:-1;33207:18:0;;;:39;;-1:-1:-1;33229:17:0;;33207:39;33203:88;;;33267:8;;33203:88;33325:12;33309:13;:28;33305:97;;;33374:12;33358:28;;33305:97;-1:-1:-1;;;;;33418:24:0;;;;;;;:17;:24;;;;;;;;33443:10;33418:36;;;;;;;33457:28;;;33418:67;;33551:27;;;:20;:27;;;;;;;:43;;;33521:73;;33676:34;;;;;:17;:34;;;;;:41;;;;;;;;;:78;;33472:13;33676:78;:63;:78;:::i;:::-;-1:-1:-1;;;;;33632:34:0;;;;;;;:17;:34;;;;;;;;:41;;;;;;;;;;;;:122;;;;33771:53;;33798:10;33810:13;33771:53;:26;:53;:::i;:::-;33925:15;-1:-1:-1;;;;;33846:141:0;33901:5;-1:-1:-1;;;;;33846:141:0;33872:10;-1:-1:-1;;;;;33846:141:0;;33959:13;33846:141;;;;;;;;;;;;;;;32894:1105;32933:3;;32894:1105;;;;37007:1;;;;31009;;32505:1501;;:::o;46539:211::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;46678:4;46660:14;:22;;46652:49;;;;-1:-1:-1;;;46652:49:0;;;;;;;;;46712:13;:30;46539:211::o;27710:73::-;27741:42;27710:73;:::o;31026:1471::-;30979:8;;-1:-1:-1;;;30979:8:0;;;;30978:9;30970:28;;;;-1:-1:-1;;;30970:28:0;;;;;;;;;31175:10;36719:20;36742:33;;;-1:-1:-1;;;;;;;;;;;36742:24:0;:33;:24;:33;;;;36841:99;;31175:10;;36719:20;36742:33;36841:7;:99::i;:::-;-1:-1:-1;;;;;;;36787:20:0;;;;;;:11;:20;;;;;;;;36809:17;:26;;;;;36786:154;;;;;;;;36951:16;:25;;;;36979:15;36951:43;;31211:30;;;31203:57;;;;-1:-1:-1;;;31203:57:0;;;;;;;;;31308:10;31273:23;31299:20;;;:8;:20;;;;;;-1:-1:-1;;;;;31299:20:0;31334:29;31330:194;;-1:-1:-1;31398:10:0;31423:20;;;;:8;:20;;;;;:38;;-1:-1:-1;;;;;;31423:38:0;;;;;31476:36;:13;31398:10;31476:36;:24;:36;:::i;:::-;;31330:194;31536:13;;;31592:898;31612:17;;;31592:898;;;31659:6;;31666:1;31659:9;;;;;;;;;;;;;;;;;;;;;;31651:17;-1:-1:-1;;;;;;31691:13:0;;-1:-1:-1;;;;;;;;;;;31691:13:0;;:31;;-1:-1:-1;;;;;;31708:14:0;;27164:42;31708:14;31691:31;:49;;;-1:-1:-1;;;;;;31726:14:0;;27245:42;31726:14;31691:49;:69;;;-1:-1:-1;;;;;;31744:16:0;;27328:42;31744:16;31691:69;31683:95;;;;-1:-1:-1;;;31683:95:0;;;;;;;;;31809:6;;31816:1;31809:9;;;;;;;;;;;;;31795:23;;31837:11;31852:1;31837:16;31833:65;;;31874:8;;31833:65;-1:-1:-1;;;;;31953:24:0;;;;;;:17;:24;;;;;;;;31978:10;31953:36;;;;;;;;:53;;31994:11;31953:53;:40;:53;:::i;:::-;-1:-1:-1;;;;;31914:24:0;;;;;;:17;:24;;;;;;;;31939:10;31914:36;;;;;;;:92;;;;32051:27;;;:20;:27;;;;;:44;;32083:11;32051:44;:31;:44;:::i;:::-;-1:-1:-1;;;;;32021:27:0;;;;;;;:20;:27;;;;;;;;:74;;;;32156:34;;;;;:17;:34;;;;;:41;;;;;;;:76;;32220:11;32156:76;:63;:76;:::i;:::-;-1:-1:-1;;;;;32112:34:0;;;;;;;:17;:34;;;;;;;;:41;;;;;;;;;;;;:120;;;;32249:70;;32280:10;32300:4;32307:11;32249:70;:30;:70;:::i;:::-;32418:15;-1:-1:-1;;;;;32341:137:0;32394:5;-1:-1:-1;;;;;32341:137:0;32365:10;-1:-1:-1;;;;;32341:137:0;;32452:11;32341:137;;;;;;;;;;;;;;;31592:898;31631:3;;31592:898;;;;37007:1;;;31009;;31026:1471;;;;:::o;24845:36::-;;;;:::o;28109:63::-;28164:8;28109:63;:::o;28764:47::-;28807:4;28764:47;:::o;24736:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24736:46:0;;-1:-1:-1;24736:46:0;;-1:-1:-1;24736:46:0:o;27551:72::-;27581:42;27551:72;:::o;36152:508::-;36266:16;;;36280:1;36266:16;;;;;;;;;36240:23;;36266:16;;;17:15:-1;;105:10;36266:16:0;88:34:-1;-1:-1;;36319:16:0;;;36333:1;36319:16;;;;;;;;;36240:42;;-1:-1:-1;36293:23:0;;36319:16;-1:-1:-1;36319:16:0;;;17:15:-1;;105:10;36319:16:0;88:34:-1;136:17;;-1:-1;36319:16:0;36293:42;;27245;36346:6;36353:1;36346:9;;;;;;;;;;;;;:17;-1:-1:-1;;;;;36346:17:0;;;-1:-1:-1;;;;;36346:17:0;;;;;27328:42;36374:6;36381:1;36374:9;;;;;;;;;;;;;:19;-1:-1:-1;;;;;36374:19:0;;;-1:-1:-1;;;;;36374:19:0;;;;;27164:42;36404:6;36411:1;36404:9;;;;;;;;;;;;;:17;-1:-1:-1;;;;;36404:17:0;;;-1:-1:-1;;;;;36404:17:0;;;;;-1:-1:-1;;;;;;;;;;;36432:6:0;36439:1;36432:9;;;;;;;;;;;;;:16;-1:-1:-1;;;;;36432:16:0;;;-1:-1:-1;;;;;36432:16:0;;;;;-1:-1:-1;;36459:6:0;36466:1;36459:9;;;;;;;;;;;;;:23;;;;;-1:-1:-1;;36493:6:0;36500:1;36493:9;;;;;;;;;;;;;:23;;;;;-1:-1:-1;;36527:6:0;36534:1;36527:9;;;;;;;;;;;;;:23;;;;;-1:-1:-1;;36561:6:0;36568:1;36561:9;;;;;;;;;;;;;:23;;;;;36605;36613:6;36621;36605:7;:23::i;:::-;36639:13;36646:5;36639:6;:13::i;23746:33::-;;;;:::o;42680:564::-;42844:17;;27164:42;42757:14;42798:27;;;:20;:27;;;;42757:14;;42798:88;;42881:4;;42798:64;;:27;:64;:45;:64;:::i;:88::-;-1:-1:-1;;;;;;;;;;;42908:26:0;;:20;:26;;;;42789:97;;-1:-1:-1;42908:52:0;;42789:97;42908:52;:44;:52;:::i;:::-;43028:17;;27245:42;42982:27;;:20;:27;;;;42899:61;;-1:-1:-1;42982:114:0;;42899:61;;42982:88;;43065:4;;42982:64;;:27;:64;:45;:64;:::i;:114::-;43166:19;;27328:42;43118:29;;:20;:29;;;;42973:123;;-1:-1:-1;43118:118:0;;42973:123;;43118:92;;43205:4;;43118:68;;:29;:68;:47;:68;:::i;:118::-;43109:127;;42680:564;:::o;3524:109::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;3597:28;3616:8;3597:18;:28::i;27052:73::-;-1:-1:-1;;;;;;;;;;;27052:73:0;:::o;34199:186::-;30979:8;;34282:25;;;;-1:-1:-1;;;30979:8:0;;;;30978:9;30970:28;;;;-1:-1:-1;;;30970:28:0;;;;;;;;;34365:12;34372:4;34365:6;:12::i;44533:96::-;3141:9;:7;:9::i;:::-;3133:34;;;;-1:-1:-1;;;3133:34:0;;;;;;;;;44605:8;:16;;-1:-1:-1;;;;44605:16:0;;;44533:96::o;37438:998::-;-1:-1:-1;;;;;37792:20:0;;37634:25;37792:20;;;:11;:20;;;;;;;;;37849:17;:26;;;;;;37995:16;:25;;;;;;;37792:20;;37634:25;;;;;38057:15;38037:35;;38033:396;;38093:18;;38089:329;;38203:146;38240:13;38276:16;38315:15;38203:14;:146::i;:::-;38368:34;;;;38187:162;-1:-1:-1;38089:329:0;37438:998;;;;;;;;;;;:::o;14168:621::-;14538:10;;;14537:62;;-1:-1:-1;14554:39:0;;-1:-1:-1;;;14554:39:0;;-1:-1:-1;;;;;14554:15:0;;;;;:39;;14578:4;;14585:7;;14554:39;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14554:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14554:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;14554:39:0;;;;;;;;;:44;14537:62;14529:152;;;;-1:-1:-1;;;14529:152:0;;;;;;;;;14718:62;;14692:89;;14711:5;;-1:-1:-1;;;14741:22:0;14718:62;;14765:7;;14774:5;;14718:62;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;14718:62:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;14718:62:0;;;179:29:-1;;;;160:49;;;14692:18:0;:89::i;43252:1140::-;43420:14;43469:38;:14;43491:15;43469:38;:21;:38;:::i;:::-;43452:55;;43539:10;43522:14;:27;43518:867;;;28523:37;43570:39;;;;:93;;-1:-1:-1;28622:39:0;43630:33;;;43570:93;43566:264;;;-1:-1:-1;43813:1:0;43806:8;;43566:264;28523:37;43848:34;;43844:167;;;28523:37;;-1:-1:-1;43844:167:0;28622:39;44029:36;;44025:167;;;28622:39;;-1:-1:-1;44025:167:0;44208:22;44233:30;:14;44252:10;44233:30;:18;:30;:::i;:::-;44208:55;-1:-1:-1;28345:9:0;44287:32;:12;44208:55;44287:32;:16;:32;:::i;:::-;:60;;;;;;;43252:1140;-1:-1:-1;;;;;43252:1140:0:o;9171:471::-;9229:7;9474:6;9470:47;;-1:-1:-1;9504:1:0;9497:8;;9470:47;9541:5;;;9545:1;9541;:5;:1;9565:5;;;;;:10;9557:56;;;;-1:-1:-1;;;9557:56:0;;;;;;;;;9633:1;-1:-1:-1;9171:471:0;;;;;:::o;10110:132::-;10168:7;10195:39;10199:1;10202;10195:39;;;;;;;;;;;;;;;;;:3;:39::i;7799:181::-;7857:7;7889:5;;;7913:6;;;;7905:46;;;;-1:-1:-1;;;7905:46:0;;;;;;;;34393:1138;34474:10;34504:25;36742:33;;;-1:-1:-1;;;;;;;;;;;36742:24:0;:33;:24;:33;;;34504:25;;;;36841:99;34474:10;34504:25;;36742:33;36841:7;:99::i;:::-;-1:-1:-1;;;;;;;36787:20:0;;;;;;:11;:20;;;;;;;;36809:17;:26;;;;;36786:154;;;;;;;;36951:16;:25;;;;;;36979:15;36951:43;;34629:140;;34651:10;;36787:20;;34629:7;:140::i;:::-;-1:-1:-1;34580:189:0;;-1:-1:-1;34580:189:0;-1:-1:-1;;34786:22:0;;34782:439;;34837:10;34851:1;34825:23;;;:11;:23;;;;;:27;34867:343;;;;34899:104;34934:10;34967:17;34899:12;:104::i;:::-;34867:343;;;27164:42;-1:-1:-1;;;;;35093:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35093:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;35142:52:0;;-1:-1:-1;;;35142:52:0;;-1:-1:-1;;;;;;;;;;;27083:42:0;-1:-1:-1;35142:21:0;;-1:-1:-1;35142:52:0;;35164:10;;35176:17;;35142:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35142:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35142:52:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35142:52:0;;;;;;;;;;34867:343;35235:28;;35231:164;;35298:10;35312:1;35280:29;;;:17;:29;;;;;;:33;;;;35328:55;-1:-1:-1;;;35328:55:0;;27419:42;;35328:18;;:55;;35298:10;35359:23;;35328:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35328:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35328:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35328:55:0;;;;;;;;;;35231:164;35432:10;-1:-1:-1;;;;;35412:111:0;;35457:17;35489:23;35412:111;;;;;;;;;;;;;;;;34393:1138;;;;;:::o;1720:98::-;1800:10;1720:98;:::o;8255:136::-;8313:7;8340:43;8344:1;8347;8340:43;;;;;;;;;;;;;;;;;:3;:43::i;13772:176::-;13881:58;;13855:85;;13874:5;;-1:-1:-1;;;13904:23:0;13881:58;;13929:2;;13933:5;;13881:58;;;;17687:245;17786:4;17865:9;17902:22;17913:3;17865:9;17902:10;:22::i;:::-;17895:29;17687:245;-1:-1:-1;;;;17687:245:0:o;13956:204::-;14083:68;;14057:95;;14076:5;;-1:-1:-1;;;14106:27:0;14083:68;;14135:4;;14141:2;;14145:5;;14083:68;;;;3739:229;-1:-1:-1;;;;;3813:22:0;;3805:73;;;;-1:-1:-1;;;3805:73:0;;;;;;;;;3915:6;;;3894:38;;-1:-1:-1;;;;;3894:38:0;;;;3915:6;;;3894:38;;;3943:6;:17;;-1:-1:-1;;;;;;3943:17:0;-1:-1:-1;;;;;3943:17:0;;;;;;;;;;3739:229::o;15811:1114::-;16415:27;16423:5;-1:-1:-1;;;;;16415:25:0;;:27::i;:::-;16407:71;;;;-1:-1:-1;;;16407:71:0;;;;;;;;;16552:12;16566:23;16601:5;-1:-1:-1;;;;;16593:19:0;16613:4;16593:25;;;;;;;;;;;;;;;;;;;;;;;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;;16551:67:0;;;;16637:7;16629:52;;;;-1:-1:-1;;;16629:52:0;;;;;;;;;16698:17;;:21;16694:224;;16840:10;16829:30;;;;;;;;;;;;;;16821:85;;;;-1:-1:-1;;;16821:85:0;;;;;;;;13092:115;13155:7;13187:2;13182;:7;:17;;13197:2;13182:17;;;-1:-1:-1;13192:2:0;;13092:115;-1:-1:-1;13092:115:0:o;10772:346::-;10858:7;10961:12;10953:6;10945:29;;;;-1:-1:-1;;;10945:29:0;;;;;;;;;;;10985:9;11001:1;10997;:5;;;;35539:605;-1:-1:-1;;;;;35673:17:0;;;35647:23;35673:17;;;:8;:17;;;;;;;;;-1:-1:-1;;;;;;;;;;;35736:32:0;;;;;;;35673:17;;;35736:58;;35787:6;35736:50;:58::i;:::-;-1:-1:-1;;;;;35701:32:0;;:23;:32;;;-1:-1:-1;;;;;;;;;;;35701:23:0;:32;;;:23;:32;;:93;;;;-1:-1:-1;;;;;;;;;;;35836:26:0;;:20;:26;;;;:52;;35881:6;35836:52;:44;:52;:::i;:::-;35807:26;:81;-1:-1:-1;;;;;35944:34:0;;35807:26;35944:34;;;:17;35807:26;35944:34;;;35807:26;35944:34;;;-1:-1:-1;;;;;;;;;;;35944:40:0;;;;;;;;:66;;36003:6;35944:66;:58;:66;:::i;:::-;-1:-1:-1;;;;;35901:34:0;;;;;;;:17;:34;;;;;;;;-1:-1:-1;;;;;;;;;;;35901:40:0;;;;;;;;;:109;;;;36028:108;35901:34;;27083:42;36028:108;;;;;;;36119:6;;36028:108;;;;;;;;;;35539:605;;;:::o;8728:192::-;8814:7;8850:12;8842:6;;;;8834:29;;;;-1:-1:-1;;;8834:29:0;;;;;;;;;;-1:-1:-1;;;8886:5:0;;;8728:192::o;18058:289::-;18153:4;18180:20;18189:3;18194:5;18180:8;:20::i;:::-;18175:165;;-1:-1:-1;18235:10:0;;;;27::-1;;23:18;;;45:23;;;-1:-1;18235:22:0;;;;;;;;;;;;;18216:16;;;;;;;;;;;:41;18272:11;;18175:165;-1:-1:-1;18323:5:0;18316:12;;4657:619;4717:4;5185:20;;5028:66;5225:23;;;;;;:42;;-1:-1:-1;;5252:15:0;;;5217:51;-1:-1:-1;;4657:619:0:o;20019:165::-;20126:4;20155:16;;;;;;;;;;;;:21;;;20019:165::o;30874:16634::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30874:16634:0;-1:-1:-1;;;;;30874:16634:0;;;;;;;;;;;-1:-1:-1;30874:16634:0;;;;;;;-1:-1:-1;30874:16634:0;;;-1:-1:-1;30874:16634:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30874:16634:0;-1:-1:-1;;;;;30874:16634:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30874:16634:0;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;160:352;;;290:3;283:4;275:6;271:17;267:27;257:2;;308:1;305;298:12;257:2;-1:-1;328:20;;-1:-1;;;;;357:30;;354:2;;;400:1;397;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;477:4;469:6;465:17;455:8;451:32;448:41;445:2;;;502:1;499;492:12;445:2;250:262;;;;;;538:707;;655:3;648:4;640:6;636:17;632:27;622:2;;673:1;670;663:12;622:2;710:6;697:20;732:80;747:64;804:6;747:64;;;732:80;;;723:89;;829:5;854:6;847:5;840:21;884:4;876:6;872:17;862:27;;906:4;901:3;897:14;890:21;;959:6;1006:3;998:4;990:6;986:17;981:3;977:27;974:36;971:2;;;1023:1;1020;1013:12;971:2;1048:1;1033:206;1058:6;1055:1;1052:13;1033:206;;;1116:3;1138:37;1171:3;1159:10;1138:37;;;1126:50;;-1:-1;1199:4;1190:14;;;;1218;;;;;1080:1;1073:9;1033:206;;;1037:14;615:630;;;;;;;;2052:707;;2169:3;2162:4;2154:6;2150:17;2146:27;2136:2;;2187:1;2184;2177:12;2136:2;2224:6;2211:20;2246:80;2261:64;2318:6;2261:64;;2246:80;2237:89;;2343:5;2368:6;2361:5;2354:21;2398:4;2390:6;2386:17;2376:27;;2420:4;2415:3;2411:14;2404:21;;2473:6;2520:3;2512:4;2504:6;2500:17;2495:3;2491:27;2488:36;2485:2;;;2537:1;2534;2527:12;2485:2;2562:1;2547:206;2572:6;2569:1;2566:13;2547:206;;;2630:3;2652:37;2685:3;2673:10;2652:37;;;2640:50;;-1:-1;2713:4;2704:14;;;;2732;;;;;2594:1;2587:9;2547:206;;2785:722;;2913:3;2906:4;2898:6;2894:17;2890:27;2880:2;;2931:1;2928;2921:12;2880:2;2961:6;2955:13;2983:80;2998:64;3055:6;2998:64;;2983:80;2974:89;;3080:5;3105:6;3098:5;3091:21;3135:4;3127:6;3123:17;3113:27;;3157:4;3152:3;3148:14;3141:21;;3210:6;3257:3;3249:4;3241:6;3237:17;3232:3;3228:27;3225:36;3222:2;;;3274:1;3271;3264:12;3222:2;3299:1;3284:217;3309:6;3306:1;3303:13;3284:217;;;3367:3;3389:48;3433:3;3421:10;3389:48;;;3377:61;;-1:-1;3461:4;3452:14;;;;3480;;;;;3331:1;3324:9;3284:217;;3515:128;3590:13;;3608:30;3590:13;3608:30;;3650:156;3730:20;;3755:46;3730:20;3755:46;;3813:130;3880:20;;3905:33;3880:20;3905:33;;3950:134;4028:13;;4046:33;4028:13;4046:33;;4091:241;;4195:2;4183:9;4174:7;4170:23;4166:32;4163:2;;;4211:1;4208;4201:12;4163:2;4246:1;4263:53;4308:7;4288:9;4263:53;;4339:366;;;4460:2;4448:9;4439:7;4435:23;4431:32;4428:2;;;4476:1;4473;4466:12;4428:2;4511:1;4528:53;4573:7;4553:9;4528:53;;;4518:63;;4490:97;4618:2;4636:53;4681:7;4672:6;4661:9;4657:22;4636:53;;;4626:63;;4597:98;4422:283;;;;;;4712:366;;;4833:2;4821:9;4812:7;4808:23;4804:32;4801:2;;;4849:1;4846;4839:12;4801:2;4884:1;4901:53;4946:7;4926:9;4901:53;;;4891:63;;4863:97;4991:2;5009:53;5054:7;5045:6;5034:9;5030:22;5009:53;;5085:397;;;5224:2;5212:9;5203:7;5199:23;5195:32;5192:2;;;5240:1;5237;5230:12;5192:2;5275:31;;-1:-1;;;;;5315:30;;5312:2;;;5358:1;5355;5348:12;5312:2;5386:80;5458:7;5449:6;5438:9;5434:22;5386:80;;;5376:90;;;;5254:218;5186:296;;;;;;5489:678;;;;;5680:2;5668:9;5659:7;5655:23;5651:32;5648:2;;;5696:1;5693;5686:12;5648:2;5731:31;;-1:-1;;;;;5771:30;;5768:2;;;5814:1;5811;5804:12;5768:2;5842:80;5914:7;5905:6;5894:9;5890:22;5842:80;;;5832:90;;;;5710:218;5987:2;5976:9;5972:18;5959:32;-1:-1;;;;;6003:6;6000:30;5997:2;;;6043:1;6040;6033:12;5997:2;6071:80;6143:7;6134:6;6123:9;6119:22;6071:80;;;5642:525;;;;-1:-1;6061:90;-1:-1;;;;5642:525;6174:959;;;;;;;6417:2;6405:9;6396:7;6392:23;6388:32;6385:2;;;6433:1;6430;6423:12;6385:2;6468:31;;-1:-1;;;;;6508:30;;6505:2;;;6551:1;6548;6541:12;6505:2;6579:80;6651:7;6642:6;6631:9;6627:22;6579:80;;;6569:90;;;;6447:218;6724:2;6713:9;6709:18;6696:32;-1:-1;;;;;6740:6;6737:30;6734:2;;;6780:1;6777;6770:12;6734:2;6808:80;6880:7;6871:6;6860:9;6856:22;6808:80;;;6798:90;;;;6675:219;6953:2;6942:9;6938:18;6925:32;-1:-1;;;;;6969:6;6966:30;6963:2;;;7009:1;7006;6999:12;6963:2;7037:80;7109:7;7100:6;7089:9;7085:22;7037:80;;;7027:90;;;;6904:219;6379:754;;;;;;;;;7140:638;;;7311:2;7299:9;7290:7;7286:23;7282:32;7279:2;;;7327:1;7324;7317:12;7279:2;7362:31;;-1:-1;;;;;7402:30;;7399:2;;;7445:1;7442;7435:12;7399:2;7465:78;7535:7;7526:6;7515:9;7511:22;7465:78;;;7455:88;;7341:208;7608:2;7597:9;7593:18;7580:32;-1:-1;;;;;7624:6;7621:30;7618:2;;;7664:1;7661;7654:12;7618:2;7684:78;7754:7;7745:6;7734:9;7730:22;7684:78;;8235:392;;8375:2;8363:9;8354:7;8350:23;8346:32;8343:2;;;8391:1;8388;8381:12;8343:2;8426:24;;-1:-1;;;;;8459:30;;8456:2;;;8502:1;8499;8492:12;8456:2;8522:89;8603:7;8594:6;8583:9;8579:22;8522:89;;8634:257;;8746:2;8734:9;8725:7;8721:23;8717:32;8714:2;;;8762:1;8759;8752:12;8714:2;8797:1;8814:61;8867:7;8847:9;8814:61;;8898:267;;9015:2;9003:9;8994:7;8990:23;8986:32;8983:2;;;9031:1;9028;9021:12;8983:2;9066:1;9083:66;9141:7;9121:9;9083:66;;9172:241;;9276:2;9264:9;9255:7;9251:23;9247:32;9244:2;;;9292:1;9289;9282:12;9244:2;9327:1;9344:53;9389:7;9369:9;9344:53;;9420:263;;9535:2;9523:9;9514:7;9510:23;9506:32;9503:2;;;9551:1;9548;9541:12;9503:2;9586:1;9603:64;9659:7;9639:9;9603:64;;9691:173;;9778:46;9820:3;9812:6;9778:46;;;-1:-1;;9853:4;9844:14;;9771:93;9872:142;9963:45;10002:5;9963:45;;;9958:3;9951:58;9945:69;;;10021:103;10094:24;10112:5;10094:24;;10282:690;;10427:54;10475:5;10427:54;;;10494:86;10573:6;10568:3;10494:86;;;10487:93;;10601:56;10651:5;10601:56;;;10677:7;10705:1;10690:260;10715:6;10712:1;10709:13;10690:260;;;10782:6;10776:13;10803:63;10862:3;10847:13;10803:63;;;10796:70;;10883:60;10936:6;10883:60;;;10873:70;-1:-1;;10737:1;10730:9;10690:260;;;-1:-1;10963:3;;10406:566;-1:-1;;;;;10406:566;10980:104;11057:21;11072:5;11057:21;;11091:356;;11219:38;11251:5;11219:38;;;11269:88;11350:6;11345:3;11269:88;;;11262:95;;11362:52;11407:6;11402:3;11395:4;11388:5;11384:16;11362:52;;;11426:16;;;;;11199:248;-1:-1;;11199:248;11454:166;11557:57;11608:5;11557:57;;12142:162;12243:55;12292:5;12243:55;;12311:347;;12423:39;12456:5;12423:39;;;12474:71;12538:6;12533:3;12474:71;;;12467:78;;12550:52;12595:6;12590:3;12583:4;12576:5;12572:16;12550:52;;;12623:29;12645:6;12623:29;;;12614:39;;;;12403:255;-1:-1;;;12403:255;12666:375;;12826:67;12890:2;12885:3;12826:67;;;12926:34;12906:55;;-1:-1;;;12990:2;12981:12;;12974:30;13032:2;13023:12;;12812:229;-1:-1;;12812:229;13050:327;;13210:67;13274:2;13269:3;13210:67;;;13310:29;13290:50;;13368:2;13359:12;;13196:181;-1:-1;;13196:181;13386:332;;13546:67;13610:2;13605:3;13546:67;;;13646:34;13626:55;;13709:2;13700:12;;13532:186;-1:-1;;13532:186;13727:314;;13887:67;13951:2;13946:3;13887:67;;;-1:-1;;;13967:37;;14032:2;14023:12;;13873:168;-1:-1;;13873:168;14050:312;;14210:67;14274:2;14269:3;14210:67;;;-1:-1;;;14290:35;;14353:2;14344:12;;14196:166;-1:-1;;14196:166;14371:314;;14531:67;14595:2;14590:3;14531:67;;;-1:-1;;;14611:37;;14676:2;14667:12;;14517:168;-1:-1;;14517:168;14694:370;;14854:67;14918:2;14913:3;14854:67;;;14954:34;14934:55;;-1:-1;;;15018:2;15009:12;;15002:25;15055:2;15046:12;;14840:224;-1:-1;;14840:224;15073:313;;15233:67;15297:2;15292:3;15233:67;;;-1:-1;;;15313:36;;15377:2;15368:12;;15219:167;-1:-1;;15219:167;15395:312;;15555:67;15619:2;15614:3;15555:67;;;-1:-1;;;15635:35;;15698:2;15689:12;;15541:166;-1:-1;;15541:166;15716:313;;15876:67;15940:2;15935:3;15876:67;;;-1:-1;;;15956:36;;16020:2;16011:12;;15862:167;-1:-1;;15862:167;16038:379;;16198:67;16262:2;16257:3;16198:67;;;16298:34;16278:55;;-1:-1;;;16362:2;16353:12;;16346:34;16408:2;16399:12;;16184:233;-1:-1;;16184:233;16426:319;;16586:67;16650:2;16645:3;16586:67;;;-1:-1;;;16666:42;;16736:2;16727:12;;16572:173;-1:-1;;16572:173;16754:305;;16914:66;16978:1;16973:3;16914:66;;;-1:-1;;;16993:29;;17050:2;17041:12;;16900:159;-1:-1;;16900:159;17068:391;;17228:67;17292:2;17287:3;17228:67;;;17328:34;17308:55;;-1:-1;;;17392:2;17383:12;;17376:46;17450:2;17441:12;;17214:245;-1:-1;;17214:245;17468:331;;17628:67;17692:2;17687:3;17628:67;;;17728:33;17708:54;;17790:2;17781:12;;17614:185;-1:-1;;17614:185;17807:113;17890:24;17908:5;17890:24;;17927:262;;18071:93;18160:3;18151:6;18071:93;;18196:213;18314:2;18299:18;;18328:71;18303:9;18372:6;18328:71;;18416:451;18598:2;18583:18;;18612:79;18587:9;18664:6;18612:79;;;18702:72;18770:2;18759:9;18755:18;18746:6;18702:72;;;18785;18853:2;18842:9;18838:18;18829:6;18785:72;;18874:340;19028:2;19013:18;;19042:79;19017:9;19094:6;19042:79;;;19132:72;19200:2;19189:9;19185:18;19176:6;19132:72;;19221:324;19367:2;19352:18;;19381:71;19356:9;19425:6;19381:71;;;19463:72;19531:2;19520:9;19516:18;19507:6;19463:72;;19552:435;19726:2;19711:18;;19740:71;19715:9;19784:6;19740:71;;19994:324;20140:2;20125:18;;20154:71;20129:9;20198:6;20154:71;;20325:201;20437:2;20422:18;;20451:65;20426:9;20489:6;20451:65;;20533:253;20671:2;20656:18;;20685:91;20660:9;20749:6;20685:91;;21569:508;21783:2;21768:18;;21797:89;21772:9;21859:6;21797:89;;;21934:9;21928:4;21924:20;21919:2;21908:9;21904:18;21897:48;21959:108;22062:4;22053:6;21959:108;;22084:301;22222:2;22236:47;;;22207:18;;22297:78;22207:18;22361:6;22297:78;;22392:407;22583:2;22597:47;;;22568:18;;22658:131;22568:18;22658:131;;22806:407;22997:2;23011:47;;;22982:18;;23072:131;22982:18;23072:131;;23220:407;23411:2;23425:47;;;23396:18;;23486:131;23396:18;23486:131;;23634:407;23825:2;23839:47;;;23810:18;;23900:131;23810:18;23900:131;;24048:407;24239:2;24253:47;;;24224:18;;24314:131;24224:18;24314:131;;24462:407;24653:2;24667:47;;;24638:18;;24728:131;24638:18;24728:131;;24876:407;25067:2;25081:47;;;25052:18;;25142:131;25052:18;25142:131;;25290:407;25481:2;25495:47;;;25466:18;;25556:131;25466:18;25556:131;;25704:407;25895:2;25909:47;;;25880:18;;25970:131;25880:18;25970:131;;26118:407;26309:2;26323:47;;;26294:18;;26384:131;26294:18;26384:131;;26532:407;26723:2;26737:47;;;26708:18;;26798:131;26708:18;26798:131;;26946:407;27137:2;27151:47;;;27122:18;;27212:131;27122:18;27212:131;;27360:407;27551:2;27565:47;;;27536:18;;27626:131;27536:18;27626:131;;27774:407;27965:2;27979:47;;;27950:18;;28040:131;27950:18;28040:131;;28188:407;28379:2;28393:47;;;28364:18;;28454:131;28364:18;28454:131;;28602:213;28720:2;28705:18;;28734:71;28709:9;28778:6;28734:71;;28822:324;28968:2;28953:18;;28982:71;28957:9;29026:6;28982:71;;29153:547;29355:3;29340:19;;29370:71;29344:9;29414:6;29370:71;;;29452:72;29520:2;29509:9;29505:18;29496:6;29452:72;;;29535;29603:2;29592:9;29588:18;29579:6;29535:72;;;29618;29686:2;29675:9;29671:18;29662:6;29618:72;;;29326:374;;;;;;;;29707:256;29769:2;29763:9;29795:17;;;-1:-1;;;;;29855:34;;29891:22;;;29852:62;29849:2;;;29927:1;29924;29917:12;29849:2;29943;29936:22;29747:216;;-1:-1;29747:216;29970:304;;-1:-1;;;;;30121:6;30118:30;30115:2;;;30161:1;30158;30151:12;30115:2;-1:-1;30196:4;30184:17;;;30249:15;;30052:222;30592:151;30716:4;30707:14;;30664:79;30750:137;30853:12;;30824:63;31267:178;31385:19;;;31434:4;31425:14;;31378:67;31454:144;31589:3;31567:31;-1:-1;31567:31;31778:91;;31840:24;31858:5;31840:24;;31876:85;31942:13;31935:21;;31918:43;31968:104;;32043:24;32061:5;32043:24;;32079:121;-1:-1;;;;;32141:54;;32124:76;32286:129;;32373:37;32404:5;32373:37;;33628:126;;33725:24;33743:5;33725:24;;34005:268;34070:1;34077:101;34091:6;34088:1;34085:13;34077:101;;;34158:11;;;34152:18;34139:11;;;34132:39;34113:2;34106:10;34077:101;;;34193:6;34190:1;34187:13;34184:2;;;-1:-1;;34258:1;34240:16;;34233:27;34054:219;34281:97;34369:2;34349:14;-1:-1;;34345:28;;34329:49;34386:117;34455:24;34473:5;34455:24;;;34448:5;34445:35;34435:2;;34494:1;34491;34484:12;34510:111;34576:21;34591:5;34576:21;;34628:143;34710:37;34741:5;34710:37;;34778:117;34847:24;34865:5;34847:24;
Swarm Source
bzzr://1f7aaa80bce3c096848883605f539f249377ba7762a3b1818f11f32cf1fae9de
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.