ERC-20
Overview
Max Total Supply
100,000,000 Felix
Holders
157
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
767,657.976736203381696432 FelixValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Felix
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-03 */ /** *Submitted for verification at Etherscan.io on 2022-07-21 */ // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * 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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } pragma solidity ^0.8.0; contract Felix is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; mapping(address => bool) private _isBlacklisted; bool private _swapping; uint256 private _launchTime; uint256 private _launchBlock; address private feeWallet; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; bool public limitsInEffect = true; bool public tradingActive = false; bool public _reduceFee = false; uint256 private _reduceTime; uint256 deadBlocks = 0; mapping(address => uint256) private _holderLastTransferTimestamp; bool public transferDelayEnabled = false; uint256 private _marketingFee; mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) private _isExcludedMaxTransactionAmount; mapping(address => uint256) private _holderFirstBuyTimestamp; mapping(address => bool) private automatedMarketMakerPairs; event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event feeWalletUpdated( address indexed newWallet, address indexed oldWallet ); address DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; constructor() ERC20("Felix", "Felix") { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); excludeFromMaxTransaction(address(_uniswapV2Router), true); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), DAI); excludeFromMaxTransaction(address(uniswapV2Pair), true); _setAutomatedMarketMakerPair(address(uniswapV2Pair), true); uint256 totalSupply = 100_000_000 * 1e18; maxTransactionAmount = (totalSupply * 1) / 100; maxWallet = (totalSupply * 2) / 100; swapTokensAtAmount = (totalSupply * 15) / 10000; _marketingFee = 9; feeWallet = address(owner()); // set as fee wallet // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromMaxTransaction(owner(), true); excludeFromMaxTransaction(address(this), true); excludeFromMaxTransaction(address(0xdead), true); _approve(owner(), address(_uniswapV2Router), type(uint256).max); ERC20(DAI).approve(address(_uniswapV2Router), type(uint256).max); ERC20(DAI).approve(address(this), type(uint256).max); _mint(owner(), totalSupply); } function readySteadyGo() external onlyOwner { deadBlocks = 0; tradingActive = true; _launchTime = block.timestamp; _launchBlock = block.number; } // remove limits after token is stable function removeLimits() external onlyOwner returns (bool) { limitsInEffect = false; return true; } // disable Transfer delay - cannot be reenabled function disableTransferDelay() external onlyOwner returns (bool) { transferDelayEnabled = false; return true; } // change the minimum amount of tokens to sell from fees function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){ require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply."); require(newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply."); swapTokensAtAmount = newAmount; return true; } function updateMaxTxnAmount(uint256 newNum) external onlyOwner { require(newNum >= ((totalSupply() * 1) / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.1%"); maxTransactionAmount = newNum * 1e18; } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require(newNum >= ((totalSupply() * 5) / 1000) / 1e18, "Cannot set maxWallet lower than 0.5%"); maxWallet = newNum * 1e18; } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } function updateFees(uint256 marketingFee) external onlyOwner { _marketingFee = marketingFee; _reduceFee = false; require(_marketingFee <= 10, "Must keep fees at 10% or less"); } function updateReduceFee(bool reduceFee) external onlyOwner { _reduceFee = reduceFee; } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function updateFeeWallet(address newWallet) external onlyOwner { emit feeWalletUpdated(newWallet, feeWallet); feeWallet = newWallet; } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function getFee() public view returns (uint256) { return _getReducedFee(_marketingFee, 1); } function setBlacklisted(address[] memory blacklisted_) public onlyOwner { for (uint256 i = 0; i < blacklisted_.length; i++) { if (blacklisted_[i] != uniswapV2Pair && blacklisted_[i] != address(uniswapV2Router)) { _isBlacklisted[blacklisted_[i]] = false; } } } function delBlacklisted(address[] memory blacklisted_) public onlyOwner { for (uint256 i = 0; i < blacklisted_.length; i++) { _isBlacklisted[blacklisted_[i]] = false; } } function isSniper(address addr) public view returns (bool) { return _isBlacklisted[addr]; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(!_isBlacklisted[from], "Your address has been marked as a sniper, you are unable to transfer or swap."); if (amount == 0) { super._transfer(from, to, 0); return; } if (tradingActive) { require(block.number >= _launchBlock + deadBlocks, "NOT BOT"); } if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_swapping ) { if (!tradingActive) { require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active."); } if (balanceOf(to) == 0 && _holderFirstBuyTimestamp[to] == 0) { _holderFirstBuyTimestamp[to] = block.timestamp; } if (transferDelayEnabled) { if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)) { require( _holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed." ); _holderLastTransferTimestamp[tx.origin] = block.number; } } // when buy if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) { require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount."); require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded"); } // when sell else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) { require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount."); } else if (!_isExcludedMaxTransactionAmount[to]) { require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded"); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && !_swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { _swapping = true; swapBack(); _swapping = false; } bool takeFee = !_swapping; if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; if (takeFee) { uint256 totalFees = _getReducedFee(_marketingFee, 1); if (totalFees > 0) { fees = amount.mul(totalFees).div(100); if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } } super._transfer(from, to, amount); } function _getReducedFee(uint256 initial, uint256 minFee) private view returns (uint256){ if (!_reduceFee) { return initial; } uint256 time = block.timestamp - _launchTime; uint256 amountToReduce = time / 10 / 60; if (amountToReduce >= initial) { return minFee; } uint256 reducedAmount = initial - amountToReduce; return reducedAmount > minFee ? reducedAmount : minFee; } function _swapTokensForDai(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = DAI; _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount, 0, path, owner(), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); if (contractBalance == 0) return; if (contractBalance > swapTokensAtAmount) { contractBalance = swapTokensAtAmount; } uint256 amountToSwapForDAI = contractBalance; _swapTokensForDai(contractBalance); } function importantMessageFromTeam(string memory input) external onlyOwner {} function forceSwap() external onlyOwner { _swapTokensForDai(balanceOf(address(this))); } function forceSend() external onlyOwner { uint256 balance = ERC20(DAI).balanceOf(address(this)); _approve(address(this), address(uniswapV2Router), balance); ERC20(DAI).transfer(msg.sender, balance); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"feeWalletUpdated","type":"event"},{"inputs":[],"name":"_reduceFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"delBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"input","type":"string"}],"name":"importantMessageFromTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readySteadyGo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"reduceFee","type":"bool"}],"name":"updateReduceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526010805462ffffff1916600117905560006012556014805460ff19169055601a80546001600160a01b031916736b175474e89094c44da98b954eedeac495271d0f1790553480156200005557600080fd5b5060408051808201825260058082526408ccad8d2f60db1b6020808401829052845180860190955291845290830152906003620000938382620008af565b506004620000a28282620008af565b505050620000bf620000b96200044f60201b60201c565b62000453565b737a250d5630b4cf539739df2c5dacb4c659f2488d620000e1816001620004a5565b600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200013b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016191906200097b565b601a546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620001b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d991906200097b565b600780546001600160a01b0319166001600160a01b0392909216918217905562000205906001620004a5565b6007546200021e906001600160a01b03166001620004da565b6a52b7d2dcc80cd2e4000000606462000239826001620009c3565b620002459190620009e5565b600d55606462000257826002620009c3565b620002639190620009e5565b600f9081556127109062000279908390620009c3565b620002859190620009e5565b600e556009601555600554600c80546001600160a01b0319166001600160a01b039092169182179055620002bb9060016200052e565b620002c83060016200052e565b620002d761dead60016200052e565b620002f6620002ee6005546001600160a01b031690565b6001620004a5565b62000303306001620004a5565b6200031261dead6001620004a5565b62000333620003296005546001600160a01b031690565b8360001962000597565b601a5460405163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af115801562000388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ae919062000a08565b50601a5460405163095ea7b360e01b815230600482015260001960248201526001600160a01b039091169063095ea7b3906044016020604051808303816000875af115801562000402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000428919062000a08565b5062000447620004406005546001600160a01b031690565b82620006c3565b505062000a47565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620004af620007a8565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b62000538620007a8565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038316620005ff5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620006625760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620005f6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166200071b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005f6565b80600260008282546200072f919062000a2c565b90915550506001600160a01b038216600090815260208190526040812080548392906200075e90849062000a2c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620008045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620005f6565b565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200083657607f821691505b6020821081036200085757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200080657600081815260208120601f850160051c81016020861015620008865750805b601f850160051c820191505b81811015620008a75782815560010162000892565b505050505050565b81516001600160401b03811115620008cb57620008cb6200080b565b620008e381620008dc845462000821565b846200085d565b602080601f8311600181146200091b5760008415620009025750858301515b600019600386901b1c1916600185901b178555620008a7565b600085815260208120601f198616915b828110156200094c578886015182559484019460019091019084016200092b565b50858210156200096b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200098e57600080fd5b81516001600160a01b0381168114620009a657600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620009e057620009e0620009ad565b500290565b60008262000a0357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121562000a1b57600080fd5b81518015158114620009a657600080fd5b6000821982111562000a425762000a42620009ad565b500190565b61241b8062000a576000396000f3fe60806040526004361061024a5760003560e01c80638da5cb5b11610139578063c8c8ebe4116100b6578063e2f456051161007a578063e2f45605146106a4578063e884f260146106ba578063eca224ee146106cf578063f1973575146106ef578063f2fde38b1461070f578063f8b45b051461072f57600080fd5b8063c8c8ebe414610624578063ced72f871461063a578063d257b34f1461064f578063dd62ed3e1461066f578063df778d261461068f57600080fd5b8063bbc0c742116100fd578063bbc0c7421461058b578063c0246668146105aa578063c18bc195146105ca578063c8125e45146105ea578063c876d0b91461060a57600080fd5b80638da5cb5b146104ee57806395d89b41146105165780639a7a23d61461052b578063a457c2d71461054b578063a9059cbb1461056b57600080fd5b806339509351116101c757806370a082311161018b57806370a0823114610464578063715018a614610484578063751039fc146104995780637571336a146104ae57806378dacee1146104ce57600080fd5b806339509351146103bc5780634a62bb65146103dc5780634fbee193146103f6578063667185241461042f57806367f61d0b1461044f57600080fd5b806318160ddd1161020e57806318160ddd14610321578063203e727e1461034057806323b872dd14610360578063313ce56714610380578063327fbb5e1461039c57600080fd5b806306fdde0314610256578063095ea7b3146102815780630b559c6f146102b15780630f3a325f146102d357806312b77e8a1461030c57600080fd5b3661025157005b600080fd5b34801561026257600080fd5b5061026b610745565b6040516102789190611ea3565b60405180910390f35b34801561028d57600080fd5b506102a161029c366004611f0f565b6107d7565b6040519015158152602001610278565b3480156102bd57600080fd5b506102d16102cc366004611f80565b6107f1565b005b3480156102df57600080fd5b506102a16102ee36600461202d565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561031857600080fd5b506102d16108ec565b34801561032d57600080fd5b506002545b604051908152602001610278565b34801561034c57600080fd5b506102d161035b366004612048565b6109f1565b34801561036c57600080fd5b506102a161037b366004612061565b610ab1565b34801561038c57600080fd5b5060405160128152602001610278565b3480156103a857600080fd5b506102d16103b73660046120ab565b610ad5565b3480156103c857600080fd5b506102a16103d7366004611f0f565b610af9565b3480156103e857600080fd5b506010546102a19060ff1681565b34801561040257600080fd5b506102a161041136600461202d565b6001600160a01b031660009081526016602052604090205460ff1690565b34801561043b57600080fd5b506102d161044a36600461202d565b610b1b565b34801561045b57600080fd5b506102d1610b80565b34801561047057600080fd5b5061033261047f36600461202d565b610ba6565b34801561049057600080fd5b506102d1610bc1565b3480156104a557600080fd5b506102a1610bd5565b3480156104ba57600080fd5b506102d16104c93660046120c8565b610bef565b3480156104da57600080fd5b506102d16104e9366004612048565b610c22565b3480156104fa57600080fd5b506005546040516001600160a01b039091168152602001610278565b34801561052257600080fd5b5061026b610c8f565b34801561053757600080fd5b506102d16105463660046120c8565b610c9e565b34801561055757600080fd5b506102a1610566366004611f0f565b610d34565b34801561057757600080fd5b506102a1610586366004611f0f565b610daf565b34801561059757600080fd5b506010546102a190610100900460ff1681565b3480156105b657600080fd5b506102d16105c53660046120c8565b610dbd565b3480156105d657600080fd5b506102d16105e5366004612048565b610e24565b3480156105f657600080fd5b506102d1610605366004611f80565b610ed3565b34801561061657600080fd5b506014546102a19060ff1681565b34801561063057600080fd5b50610332600d5481565b34801561064657600080fd5b50610332610f43565b34801561065b57600080fd5b506102a161066a366004612048565b610f57565b34801561067b57600080fd5b5061033261068a3660046120ff565b61108b565b34801561069b57600080fd5b506102d16110b6565b3480156106b057600080fd5b50610332600e5481565b3480156106c657600080fd5b506102a16110cf565b3480156106db57600080fd5b506102d16106ea366004612132565b6110e9565b3480156106fb57600080fd5b506010546102a19062010000900460ff1681565b34801561071b57600080fd5b506102d161072a36600461202d565b6110f1565b34801561073b57600080fd5b50610332600f5481565b606060038054610754906121c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610780906121c7565b80156107cd5780601f106107a2576101008083540402835291602001916107cd565b820191906000526020600020905b8154815290600101906020018083116107b057829003601f168201915b5050505050905090565b6000336107e5818585611167565b60019150505b92915050565b6107f961128b565b60005b81518110156108e85760075482516001600160a01b039091169083908390811061082857610828612201565b60200260200101516001600160a01b031614158015610879575060065482516001600160a01b039091169083908390811061086557610865612201565b60200260200101516001600160a01b031614155b156108d65760006008600084848151811061089657610896612201565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806108e08161222d565b9150506107fc565b5050565b6108f461128b565b601a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561093d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109619190612246565b60065490915061097c9030906001600160a01b031683611167565b601a5460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e8919061225f565b6109f961128b565b670de0b6b3a76400006103e8610a0e60025490565b610a1990600161227c565b610a23919061229b565b610a2d919061229b565b811015610a995760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b610aab81670de0b6b3a764000061227c565b600d5550565b600033610abf8582856112e5565b610aca85858561135f565b506001949350505050565b610add61128b565b60108054911515620100000262ff000019909216919091179055565b6000336107e5818585610b0c838361108b565b610b1691906122bd565b611167565b610b2361128b565b600c546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492890600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b610b8861128b565b60006012556010805461ff00191661010017905542600a5543600b55565b6001600160a01b031660009081526020819052604090205490565b610bc961128b565b610bd36000611ad0565b565b6000610bdf61128b565b506010805460ff19169055600190565b610bf761128b565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b610c2a61128b565b60158190556010805462ff000019169055600a811115610c8c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610a90565b50565b606060048054610754906121c7565b610ca661128b565b6007546001600160a01b0390811690831603610d2a5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a90565b6108e88282611b22565b60003381610d42828661108b565b905083811015610da25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a90565b610aca8286868403611167565b6000336107e581858561135f565b610dc561128b565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610e2c61128b565b670de0b6b3a76400006103e8610e4160025490565b610e4c90600561227c565b610e56919061229b565b610e60919061229b565b811015610ebb5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610a90565b610ecd81670de0b6b3a764000061227c565b600f5550565b610edb61128b565b60005b81518110156108e857600060086000848481518110610eff57610eff612201565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f3b8161222d565b915050610ede565b6000610f526015546001611b76565b905090565b6000610f6161128b565b620186a0610f6e60025490565b610f7990600161227c565b610f83919061229b565b821015610ff05760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a90565b6103e8610ffc60025490565b61100790600561227c565b611011919061229b565b82111561107d5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a90565b50600e81905560015b919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110be61128b565b610bd36110ca30610ba6565b611bf5565b60006110d961128b565b506014805460ff19169055600190565b610c8c61128b565b6110f961128b565b6001600160a01b03811661115e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a90565b610c8c81611ad0565b6001600160a01b0383166111c95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a90565b6001600160a01b03821661122a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a90565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610bd35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a90565b60006112f1848461108b565b90506000198114611359578181101561134c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a90565b6113598484848403611167565b50505050565b6001600160a01b0383166113855760405162461bcd60e51b8152600401610a90906122d5565b6001600160a01b0382166113ab5760405162461bcd60e51b8152600401610a909061231a565b6001600160a01b03831660009081526008602052604090205460ff16156114505760405162461bcd60e51b815260206004820152604d60248201527f596f7572206164647265737320686173206265656e206d61726b65642061732060448201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60648201526c39b332b91037b91039bbb0b81760991b608482015260a401610a90565b806000036114695761146483836000611cff565b505050565b601054610100900460ff16156114c257601254600b5461148991906122bd565b4310156114c25760405162461bcd60e51b81526020600482015260076024820152661393d5081093d560ca1b6044820152606401610a90565b60105460ff161561195d576005546001600160a01b038481169116148015906114f957506005546001600160a01b03838116911614155b801561150d57506001600160a01b03821615155b801561152457506001600160a01b03821661dead14155b8015611533575060095460ff16155b1561195d57601054610100900460ff166115cb576001600160a01b03831660009081526016602052604090205460ff168061158657506001600160a01b03821660009081526016602052604090205460ff165b6115cb5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610a90565b6115d482610ba6565b1580156115f757506001600160a01b038216600090815260186020526040902054155b15611618576001600160a01b03821660009081526018602052604090204290555b60145460ff1615611717576005546001600160a01b0383811691161480159061164f57506006546001600160a01b03838116911614155b801561166957506007546001600160a01b03838116911614155b15611717573260009081526013602052604090205443116117045760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610a90565b3260009081526013602052604090204390555b6001600160a01b03831660009081526019602052604090205460ff16801561175857506001600160a01b03821660009081526017602052604090205460ff16155b1561182c57600d548111156117cd5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610a90565b600f546117d983610ba6565b6117e390836122bd565b11156118275760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a90565b61195d565b6001600160a01b03821660009081526019602052604090205460ff16801561186d57506001600160a01b03831660009081526017602052604090205460ff16155b156118e357600d548111156118275760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610a90565b6001600160a01b03821660009081526017602052604090205460ff1661195d57600f5461190f83610ba6565b61191990836122bd565b111561195d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a90565b600061196830610ba6565b600e5490915081108015908190611982575060095460ff16155b80156119a757506001600160a01b03851660009081526019602052604090205460ff16155b80156119cc57506001600160a01b03851660009081526016602052604090205460ff16155b80156119f157506001600160a01b03841660009081526016602052604090205460ff16155b15611a16576009805460ff19166001179055611a0b611e53565b6009805460ff191690555b6009546001600160a01b03861660009081526016602052604090205460ff91821615911680611a5d57506001600160a01b03851660009081526016602052604090205460ff165b15611a66575060005b60008115611abc576000611a7d6015546001611b76565b90508015611aba57611a9a6064611a948884611e84565b90611e97565b91508115611aad57611aad883084611cff565b611ab7828761235d565b95505b505b611ac7878787611cff565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60105460009062010000900460ff16611b905750816107eb565b6000600a5442611ba0919061235d565b90506000603c611bb1600a8461229b565b611bbb919061229b565b9050848110611bce5783925050506107eb565b6000611bda828761235d565b9050848111611be95784611beb565b805b9695505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611c2a57611c2a612201565b6001600160a01b039283166020918202929092010152601a54825191169082906001908110611c5b57611c5b612201565b6001600160a01b039283166020918202929092010152600654611c819130911684611167565b6006546001600160a01b0316635c11d79583600084611ca86005546001600160a01b031690565b426040518663ffffffff1660e01b8152600401611cc9959493929190612374565b600060405180830381600087803b158015611ce357600080fd5b505af1158015611cf7573d6000803e3d6000fd5b505050505050565b6001600160a01b038316611d255760405162461bcd60e51b8152600401610a90906122d5565b6001600160a01b038216611d4b5760405162461bcd60e51b8152600401610a909061231a565b6001600160a01b03831660009081526020819052604090205481811015611dc35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a90565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611dfa9084906122bd565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e4691815260200190565b60405180910390a3611359565b6000611e5e30610ba6565b905080600003611e6b5750565b600e54811115611e7a5750600e545b806108e881611bf5565b6000611e90828461227c565b9392505050565b6000611e90828461229b565b600060208083528351808285015260005b81811015611ed057858101830151858201604001528201611eb4565b81811115611ee2576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461108657600080fd5b60008060408385031215611f2257600080fd5b611f2b83611ef8565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f7857611f78611f39565b604052919050565b60006020808385031215611f9357600080fd5b823567ffffffffffffffff80821115611fab57600080fd5b818501915085601f830112611fbf57600080fd5b813581811115611fd157611fd1611f39565b8060051b9150611fe2848301611f4f565b8181529183018401918481019088841115611ffc57600080fd5b938501935b838510156120215761201285611ef8565b82529385019390850190612001565b98975050505050505050565b60006020828403121561203f57600080fd5b611e9082611ef8565b60006020828403121561205a57600080fd5b5035919050565b60008060006060848603121561207657600080fd5b61207f84611ef8565b925061208d60208501611ef8565b9150604084013590509250925092565b8015158114610c8c57600080fd5b6000602082840312156120bd57600080fd5b8135611e908161209d565b600080604083850312156120db57600080fd5b6120e483611ef8565b915060208301356120f48161209d565b809150509250929050565b6000806040838503121561211257600080fd5b61211b83611ef8565b915061212960208401611ef8565b90509250929050565b6000602080838503121561214557600080fd5b823567ffffffffffffffff8082111561215d57600080fd5b818501915085601f83011261217157600080fd5b81358181111561218357612183611f39565b612195601f8201601f19168501611f4f565b915080825286848285010111156121ab57600080fd5b8084840185840137600090820190930192909252509392505050565b600181811c908216806121db57607f821691505b6020821081036121fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161223f5761223f612217565b5060010190565b60006020828403121561225857600080fd5b5051919050565b60006020828403121561227157600080fd5b8151611e908161209d565b600081600019048311821515161561229657612296612217565b500290565b6000826122b857634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156122d0576122d0612217565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561236f5761236f612217565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123c45784516001600160a01b03168352938301939183019160010161239f565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212209f3e952d85b528621f0bc499a6e35cbbafc8a8bc5be9468b7380d4c00f61c88764736f6c634300080f0033
Deployed Bytecode
0x60806040526004361061024a5760003560e01c80638da5cb5b11610139578063c8c8ebe4116100b6578063e2f456051161007a578063e2f45605146106a4578063e884f260146106ba578063eca224ee146106cf578063f1973575146106ef578063f2fde38b1461070f578063f8b45b051461072f57600080fd5b8063c8c8ebe414610624578063ced72f871461063a578063d257b34f1461064f578063dd62ed3e1461066f578063df778d261461068f57600080fd5b8063bbc0c742116100fd578063bbc0c7421461058b578063c0246668146105aa578063c18bc195146105ca578063c8125e45146105ea578063c876d0b91461060a57600080fd5b80638da5cb5b146104ee57806395d89b41146105165780639a7a23d61461052b578063a457c2d71461054b578063a9059cbb1461056b57600080fd5b806339509351116101c757806370a082311161018b57806370a0823114610464578063715018a614610484578063751039fc146104995780637571336a146104ae57806378dacee1146104ce57600080fd5b806339509351146103bc5780634a62bb65146103dc5780634fbee193146103f6578063667185241461042f57806367f61d0b1461044f57600080fd5b806318160ddd1161020e57806318160ddd14610321578063203e727e1461034057806323b872dd14610360578063313ce56714610380578063327fbb5e1461039c57600080fd5b806306fdde0314610256578063095ea7b3146102815780630b559c6f146102b15780630f3a325f146102d357806312b77e8a1461030c57600080fd5b3661025157005b600080fd5b34801561026257600080fd5b5061026b610745565b6040516102789190611ea3565b60405180910390f35b34801561028d57600080fd5b506102a161029c366004611f0f565b6107d7565b6040519015158152602001610278565b3480156102bd57600080fd5b506102d16102cc366004611f80565b6107f1565b005b3480156102df57600080fd5b506102a16102ee36600461202d565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561031857600080fd5b506102d16108ec565b34801561032d57600080fd5b506002545b604051908152602001610278565b34801561034c57600080fd5b506102d161035b366004612048565b6109f1565b34801561036c57600080fd5b506102a161037b366004612061565b610ab1565b34801561038c57600080fd5b5060405160128152602001610278565b3480156103a857600080fd5b506102d16103b73660046120ab565b610ad5565b3480156103c857600080fd5b506102a16103d7366004611f0f565b610af9565b3480156103e857600080fd5b506010546102a19060ff1681565b34801561040257600080fd5b506102a161041136600461202d565b6001600160a01b031660009081526016602052604090205460ff1690565b34801561043b57600080fd5b506102d161044a36600461202d565b610b1b565b34801561045b57600080fd5b506102d1610b80565b34801561047057600080fd5b5061033261047f36600461202d565b610ba6565b34801561049057600080fd5b506102d1610bc1565b3480156104a557600080fd5b506102a1610bd5565b3480156104ba57600080fd5b506102d16104c93660046120c8565b610bef565b3480156104da57600080fd5b506102d16104e9366004612048565b610c22565b3480156104fa57600080fd5b506005546040516001600160a01b039091168152602001610278565b34801561052257600080fd5b5061026b610c8f565b34801561053757600080fd5b506102d16105463660046120c8565b610c9e565b34801561055757600080fd5b506102a1610566366004611f0f565b610d34565b34801561057757600080fd5b506102a1610586366004611f0f565b610daf565b34801561059757600080fd5b506010546102a190610100900460ff1681565b3480156105b657600080fd5b506102d16105c53660046120c8565b610dbd565b3480156105d657600080fd5b506102d16105e5366004612048565b610e24565b3480156105f657600080fd5b506102d1610605366004611f80565b610ed3565b34801561061657600080fd5b506014546102a19060ff1681565b34801561063057600080fd5b50610332600d5481565b34801561064657600080fd5b50610332610f43565b34801561065b57600080fd5b506102a161066a366004612048565b610f57565b34801561067b57600080fd5b5061033261068a3660046120ff565b61108b565b34801561069b57600080fd5b506102d16110b6565b3480156106b057600080fd5b50610332600e5481565b3480156106c657600080fd5b506102a16110cf565b3480156106db57600080fd5b506102d16106ea366004612132565b6110e9565b3480156106fb57600080fd5b506010546102a19062010000900460ff1681565b34801561071b57600080fd5b506102d161072a36600461202d565b6110f1565b34801561073b57600080fd5b50610332600f5481565b606060038054610754906121c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610780906121c7565b80156107cd5780601f106107a2576101008083540402835291602001916107cd565b820191906000526020600020905b8154815290600101906020018083116107b057829003601f168201915b5050505050905090565b6000336107e5818585611167565b60019150505b92915050565b6107f961128b565b60005b81518110156108e85760075482516001600160a01b039091169083908390811061082857610828612201565b60200260200101516001600160a01b031614158015610879575060065482516001600160a01b039091169083908390811061086557610865612201565b60200260200101516001600160a01b031614155b156108d65760006008600084848151811061089657610896612201565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806108e08161222d565b9150506107fc565b5050565b6108f461128b565b601a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561093d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109619190612246565b60065490915061097c9030906001600160a01b031683611167565b601a5460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e8919061225f565b6109f961128b565b670de0b6b3a76400006103e8610a0e60025490565b610a1990600161227c565b610a23919061229b565b610a2d919061229b565b811015610a995760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b610aab81670de0b6b3a764000061227c565b600d5550565b600033610abf8582856112e5565b610aca85858561135f565b506001949350505050565b610add61128b565b60108054911515620100000262ff000019909216919091179055565b6000336107e5818585610b0c838361108b565b610b1691906122bd565b611167565b610b2361128b565b600c546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492890600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b610b8861128b565b60006012556010805461ff00191661010017905542600a5543600b55565b6001600160a01b031660009081526020819052604090205490565b610bc961128b565b610bd36000611ad0565b565b6000610bdf61128b565b506010805460ff19169055600190565b610bf761128b565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b610c2a61128b565b60158190556010805462ff000019169055600a811115610c8c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610a90565b50565b606060048054610754906121c7565b610ca661128b565b6007546001600160a01b0390811690831603610d2a5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a90565b6108e88282611b22565b60003381610d42828661108b565b905083811015610da25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a90565b610aca8286868403611167565b6000336107e581858561135f565b610dc561128b565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610e2c61128b565b670de0b6b3a76400006103e8610e4160025490565b610e4c90600561227c565b610e56919061229b565b610e60919061229b565b811015610ebb5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610a90565b610ecd81670de0b6b3a764000061227c565b600f5550565b610edb61128b565b60005b81518110156108e857600060086000848481518110610eff57610eff612201565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f3b8161222d565b915050610ede565b6000610f526015546001611b76565b905090565b6000610f6161128b565b620186a0610f6e60025490565b610f7990600161227c565b610f83919061229b565b821015610ff05760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a90565b6103e8610ffc60025490565b61100790600561227c565b611011919061229b565b82111561107d5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a90565b50600e81905560015b919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110be61128b565b610bd36110ca30610ba6565b611bf5565b60006110d961128b565b506014805460ff19169055600190565b610c8c61128b565b6110f961128b565b6001600160a01b03811661115e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a90565b610c8c81611ad0565b6001600160a01b0383166111c95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a90565b6001600160a01b03821661122a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a90565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610bd35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a90565b60006112f1848461108b565b90506000198114611359578181101561134c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a90565b6113598484848403611167565b50505050565b6001600160a01b0383166113855760405162461bcd60e51b8152600401610a90906122d5565b6001600160a01b0382166113ab5760405162461bcd60e51b8152600401610a909061231a565b6001600160a01b03831660009081526008602052604090205460ff16156114505760405162461bcd60e51b815260206004820152604d60248201527f596f7572206164647265737320686173206265656e206d61726b65642061732060448201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60648201526c39b332b91037b91039bbb0b81760991b608482015260a401610a90565b806000036114695761146483836000611cff565b505050565b601054610100900460ff16156114c257601254600b5461148991906122bd565b4310156114c25760405162461bcd60e51b81526020600482015260076024820152661393d5081093d560ca1b6044820152606401610a90565b60105460ff161561195d576005546001600160a01b038481169116148015906114f957506005546001600160a01b03838116911614155b801561150d57506001600160a01b03821615155b801561152457506001600160a01b03821661dead14155b8015611533575060095460ff16155b1561195d57601054610100900460ff166115cb576001600160a01b03831660009081526016602052604090205460ff168061158657506001600160a01b03821660009081526016602052604090205460ff165b6115cb5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610a90565b6115d482610ba6565b1580156115f757506001600160a01b038216600090815260186020526040902054155b15611618576001600160a01b03821660009081526018602052604090204290555b60145460ff1615611717576005546001600160a01b0383811691161480159061164f57506006546001600160a01b03838116911614155b801561166957506007546001600160a01b03838116911614155b15611717573260009081526013602052604090205443116117045760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610a90565b3260009081526013602052604090204390555b6001600160a01b03831660009081526019602052604090205460ff16801561175857506001600160a01b03821660009081526017602052604090205460ff16155b1561182c57600d548111156117cd5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610a90565b600f546117d983610ba6565b6117e390836122bd565b11156118275760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a90565b61195d565b6001600160a01b03821660009081526019602052604090205460ff16801561186d57506001600160a01b03831660009081526017602052604090205460ff16155b156118e357600d548111156118275760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610a90565b6001600160a01b03821660009081526017602052604090205460ff1661195d57600f5461190f83610ba6565b61191990836122bd565b111561195d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a90565b600061196830610ba6565b600e5490915081108015908190611982575060095460ff16155b80156119a757506001600160a01b03851660009081526019602052604090205460ff16155b80156119cc57506001600160a01b03851660009081526016602052604090205460ff16155b80156119f157506001600160a01b03841660009081526016602052604090205460ff16155b15611a16576009805460ff19166001179055611a0b611e53565b6009805460ff191690555b6009546001600160a01b03861660009081526016602052604090205460ff91821615911680611a5d57506001600160a01b03851660009081526016602052604090205460ff165b15611a66575060005b60008115611abc576000611a7d6015546001611b76565b90508015611aba57611a9a6064611a948884611e84565b90611e97565b91508115611aad57611aad883084611cff565b611ab7828761235d565b95505b505b611ac7878787611cff565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60105460009062010000900460ff16611b905750816107eb565b6000600a5442611ba0919061235d565b90506000603c611bb1600a8461229b565b611bbb919061229b565b9050848110611bce5783925050506107eb565b6000611bda828761235d565b9050848111611be95784611beb565b805b9695505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611c2a57611c2a612201565b6001600160a01b039283166020918202929092010152601a54825191169082906001908110611c5b57611c5b612201565b6001600160a01b039283166020918202929092010152600654611c819130911684611167565b6006546001600160a01b0316635c11d79583600084611ca86005546001600160a01b031690565b426040518663ffffffff1660e01b8152600401611cc9959493929190612374565b600060405180830381600087803b158015611ce357600080fd5b505af1158015611cf7573d6000803e3d6000fd5b505050505050565b6001600160a01b038316611d255760405162461bcd60e51b8152600401610a90906122d5565b6001600160a01b038216611d4b5760405162461bcd60e51b8152600401610a909061231a565b6001600160a01b03831660009081526020819052604090205481811015611dc35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a90565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611dfa9084906122bd565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e4691815260200190565b60405180910390a3611359565b6000611e5e30610ba6565b905080600003611e6b5750565b600e54811115611e7a5750600e545b806108e881611bf5565b6000611e90828461227c565b9392505050565b6000611e90828461229b565b600060208083528351808285015260005b81811015611ed057858101830151858201604001528201611eb4565b81811115611ee2576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461108657600080fd5b60008060408385031215611f2257600080fd5b611f2b83611ef8565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f7857611f78611f39565b604052919050565b60006020808385031215611f9357600080fd5b823567ffffffffffffffff80821115611fab57600080fd5b818501915085601f830112611fbf57600080fd5b813581811115611fd157611fd1611f39565b8060051b9150611fe2848301611f4f565b8181529183018401918481019088841115611ffc57600080fd5b938501935b838510156120215761201285611ef8565b82529385019390850190612001565b98975050505050505050565b60006020828403121561203f57600080fd5b611e9082611ef8565b60006020828403121561205a57600080fd5b5035919050565b60008060006060848603121561207657600080fd5b61207f84611ef8565b925061208d60208501611ef8565b9150604084013590509250925092565b8015158114610c8c57600080fd5b6000602082840312156120bd57600080fd5b8135611e908161209d565b600080604083850312156120db57600080fd5b6120e483611ef8565b915060208301356120f48161209d565b809150509250929050565b6000806040838503121561211257600080fd5b61211b83611ef8565b915061212960208401611ef8565b90509250929050565b6000602080838503121561214557600080fd5b823567ffffffffffffffff8082111561215d57600080fd5b818501915085601f83011261217157600080fd5b81358181111561218357612183611f39565b612195601f8201601f19168501611f4f565b915080825286848285010111156121ab57600080fd5b8084840185840137600090820190930192909252509392505050565b600181811c908216806121db57607f821691505b6020821081036121fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161223f5761223f612217565b5060010190565b60006020828403121561225857600080fd5b5051919050565b60006020828403121561227157600080fd5b8151611e908161209d565b600081600019048311821515161561229657612296612217565b500290565b6000826122b857634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156122d0576122d0612217565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561236f5761236f612217565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123c45784516001600160a01b03168352938301939183019160010161239f565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212209f3e952d85b528621f0bc499a6e35cbbafc8a8bc5be9468b7380d4c00f61c88764736f6c634300080f0033
Deployed Bytecode Sourcemap
35670:11920:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24839:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27190:201;;;;;;;;;;-1:-1:-1;27190:201:0;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;27190:201:0;1053:187:1;41589:325:0;;;;;;;;;;-1:-1:-1;41589:325:0;;;;;:::i;:::-;;:::i;:::-;;42136:105;;;;;;;;;;-1:-1:-1;42136:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;42213:20:0;42189:4;42213:20;;;:14;:20;;;;;;;;;42136:105;47318:232;;;;;;;;;;;;;:::i;25959:108::-;;;;;;;;;;-1:-1:-1;26047:12:0;;25959:108;;;2951:25:1;;;2939:2;2924:18;25959:108:0;2805:177:1;39599:234:0;;;;;;;;;;-1:-1:-1;39599:234:0;;;;;:::i;:::-;;:::i;27971:295::-;;;;;;;;;;-1:-1:-1;27971:295:0;;;;;:::i;:::-;;:::i;25801:93::-;;;;;;;;;;-1:-1:-1;25801:93:0;;25884:2;3647:36:1;;3635:2;3620:18;25801:93:0;3505:184:1;40433:101:0;;;;;;;;;;-1:-1:-1;40433:101:0;;;;;:::i;:::-;;:::i;28675:238::-;;;;;;;;;;-1:-1:-1;28675:238:0;;;;;:::i;:::-;;:::i;36135:33::-;;;;;;;;;;-1:-1:-1;36135:33:0;;;;;;;;41341:126;;;;;;;;;;-1:-1:-1;41341:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;41431:28:0;41407:4;41431:28;;;:19;:28;;;;;;;;;41341:126;41176:157;;;;;;;;;;-1:-1:-1;41176:157:0;;;;;:::i;:::-;;:::i;38576:186::-;;;;;;;;;;;;;:::i;26130:127::-;;;;;;;;;;-1:-1:-1;26130:127:0;;;;;:::i;:::-;;:::i;18262:103::-;;;;;;;;;;;;;:::i;38814:121::-;;;;;;;;;;;;;:::i;40064:144::-;;;;;;;;;;-1:-1:-1;40064:144:0;;;;;:::i;:::-;;:::i;40216:209::-;;;;;;;;;;-1:-1:-1;40216:209:0;;;;;:::i;:::-;;:::i;17614:87::-;;;;;;;;;;-1:-1:-1;17687:6:0;;17614:87;;-1:-1:-1;;;;;17687:6:0;;;4529:51:1;;4517:2;4502:18;17614:87:0;4383:203:1;25058:104:0;;;;;;;;;;;;;:::i;40732:242::-;;;;;;;;;;-1:-1:-1;40732:242:0;;;;;:::i;:::-;;:::i;29416:436::-;;;;;;;;;;-1:-1:-1;29416:436:0;;;;;:::i;:::-;;:::i;26463:193::-;;;;;;;;;;-1:-1:-1;26463:193:0;;;;;:::i;:::-;;:::i;36175:33::-;;;;;;;;;;-1:-1:-1;36175:33:0;;;;;;;;;;;40542:182;;;;;;;;;;-1:-1:-1;40542:182:0;;;;;:::i;:::-;;:::i;39841:215::-;;;;;;;;;;-1:-1:-1;39841:215:0;;;;;:::i;:::-;;:::i;41922:206::-;;;;;;;;;;-1:-1:-1;41922:206:0;;;;;:::i;:::-;;:::i;36388:40::-;;;;;;;;;;-1:-1:-1;36388:40:0;;;;;;;;36020:35;;;;;;;;;;;;;;;;41475:106;;;;;;;;;;;;;:::i;39201:390::-;;;;;;;;;;-1:-1:-1;39201:390:0;;;;;:::i;:::-;;:::i;26719:151::-;;;;;;;;;;-1:-1:-1;26719:151:0;;;;;:::i;:::-;;:::i;47208:102::-;;;;;;;;;;;;;:::i;36062:33::-;;;;;;;;;;;;;;;;38996:135;;;;;;;;;;;;;:::i;47124:76::-;;;;;;;;;;-1:-1:-1;47124:76:0;;;;;:::i;:::-;;:::i;36215:30::-;;;;;;;;;;-1:-1:-1;36215:30:0;;;;;;;;;;;18520:201;;;;;;;;;;-1:-1:-1;18520:201:0;;;;;:::i;:::-;;:::i;36102:24::-;;;;;;;;;;;;;;;;24839:100;24893:13;24926:5;24919:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24839:100;:::o;27190:201::-;27273:4;16245:10;27329:32;16245:10;27345:7;27354:6;27329:8;:32::i;:::-;27379:4;27372:11;;;27190:201;;;;;:::o;41589:325::-;17500:13;:11;:13::i;:::-;41677:9:::1;41672:235;41696:12;:19;41692:1;:23;41672:235;;;41760:13;::::0;41741:15;;-1:-1:-1;;;;;41760:13:0;;::::1;::::0;41741:12;;41754:1;;41741:15;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41741:32:0::1;;;:79;;;;-1:-1:-1::0;41804:15:0::1;::::0;41777;;-1:-1:-1;;;;;41804:15:0;;::::1;::::0;41777:12;;41790:1;;41777:15;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41777:43:0::1;;;41741:79;41737:159;;;41875:5;41841:14;:31;41856:12;41869:1;41856:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41841:31:0::1;-1:-1:-1::0;;;;;41841:31:0::1;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;41737:159;41717:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41672:235;;;;41589:325:::0;:::o;47318:232::-;17500:13;:11;:13::i;:::-;47393:3:::1;::::0;47387:35:::1;::::0;-1:-1:-1;;;47387:35:0;;47416:4:::1;47387:35;::::0;::::1;4529:51:1::0;47369:15:0::1;::::0;-1:-1:-1;;;;;47393:3:0::1;::::0;47387:20:::1;::::0;4502:18:1;;47387:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47465:15;::::0;47369:53;;-1:-1:-1;47433:58:0::1;::::0;47450:4:::1;::::0;-1:-1:-1;;;;;47465:15:0::1;47369:53:::0;47433:8:::1;:58::i;:::-;47508:3;::::0;47502:40:::1;::::0;-1:-1:-1;;;47502:40:0;;47522:10:::1;47502:40;::::0;::::1;6777:51:1::0;6844:18;;;6837:34;;;-1:-1:-1;;;;;47508:3:0;;::::1;::::0;47502:19:::1;::::0;6750:18:1;;47502:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39599:234::-:0;17500:13;:11;:13::i;:::-;39722:4:::1;39714;39693:13;26047:12:::0;;;25959:108;39693:13:::1;:17;::::0;39709:1:::1;39693:17;:::i;:::-;39692:26;;;;:::i;:::-;39691:35;;;;:::i;:::-;39681:6;:45;;39673:105;;;::::0;-1:-1:-1;;;39673:105:0;;7729:2:1;39673:105:0::1;::::0;::::1;7711:21:1::0;7768:2;7748:18;;;7741:30;7807:34;7787:18;;;7780:62;-1:-1:-1;;;7858:18:1;;;7851:45;7913:19;;39673:105:0::1;;;;;;;;;39812:13;:6:::0;39821:4:::1;39812:13;:::i;:::-;39789:20;:36:::0;-1:-1:-1;39599:234:0:o;27971:295::-;28102:4;16245:10;28160:38;28176:4;16245:10;28191:6;28160:15;:38::i;:::-;28209:27;28219:4;28225:2;28229:6;28209:9;:27::i;:::-;-1:-1:-1;28254:4:0;;27971:295;-1:-1:-1;;;;27971:295:0:o;40433:101::-;17500:13;:11;:13::i;:::-;40504:10:::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;40504:22:0;;::::1;::::0;;;::::1;::::0;;40433:101::o;28675:238::-;28763:4;16245:10;28819:64;16245:10;28835:7;28872:10;28844:25;16245:10;28835:7;28844:9;:25::i;:::-;:38;;;;:::i;:::-;28819:8;:64::i;41176:157::-;17500:13;:11;:13::i;:::-;41283:9:::1;::::0;41255:38:::1;::::0;-1:-1:-1;;;;;41283:9:0;;::::1;::::0;41255:38;::::1;::::0;::::1;::::0;41283:9:::1;::::0;41255:38:::1;41304:9;:21:::0;;-1:-1:-1;;;;;;41304:21:0::1;-1:-1:-1::0;;;;;41304:21:0;;;::::1;::::0;;;::::1;::::0;;41176:157::o;38576:186::-;17500:13;:11;:13::i;:::-;38644:1:::1;38631:10;:14:::0;38656:13:::1;:20:::0;;-1:-1:-1;;38656:20:0::1;;;::::0;;38701:15:::1;38687:11;:29:::0;38742:12:::1;38727;:27:::0;38576:186::o;26130:127::-;-1:-1:-1;;;;;26231:18:0;26204:7;26231:18;;;;;;;;;;;;26130:127::o;18262:103::-;17500:13;:11;:13::i;:::-;18327:30:::1;18354:1;18327:18;:30::i;:::-;18262:103::o:0;38814:121::-;38866:4;17500:13;:11;:13::i;:::-;-1:-1:-1;38883:14:0::1;:22:::0;;-1:-1:-1;;38883:22:0::1;::::0;;;38814:121;:::o;40064:144::-;17500:13;:11;:13::i;:::-;-1:-1:-1;;;;;40154:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;40154:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40064:144::o;40216:209::-;17500:13;:11;:13::i;:::-;40288::::1;:28:::0;;;40327:10:::1;:18:::0;;-1:-1:-1;;40327:18:0::1;::::0;;40381:2:::1;40364:19:::0;::::1;;40356:61;;;::::0;-1:-1:-1;;;40356:61:0;;8278:2:1;40356:61:0::1;::::0;::::1;8260:21:1::0;8317:2;8297:18;;;8290:30;8356:31;8336:18;;;8329:59;8405:18;;40356:61:0::1;8076:353:1::0;40356:61:0::1;40216:209:::0;:::o;25058:104::-;25114:13;25147:7;25140:14;;;;;:::i;40732:242::-;17500:13;:11;:13::i;:::-;40839::::1;::::0;-1:-1:-1;;;;;40839:13:0;;::::1;40831:21:::0;;::::1;::::0;40823:91:::1;;;::::0;-1:-1:-1;;;40823:91:0;;8636:2:1;40823:91:0::1;::::0;::::1;8618:21:1::0;8675:2;8655:18;;;8648:30;8714:34;8694:18;;;8687:62;8785:27;8765:18;;;8758:55;8830:19;;40823:91:0::1;8434:421:1::0;40823:91:0::1;40925:41;40954:4;40960:5;40925:28;:41::i;29416:436::-:0;29509:4;16245:10;29509:4;29592:25;16245:10;29609:7;29592:9;:25::i;:::-;29565:52;;29656:15;29636:16;:35;;29628:85;;;;-1:-1:-1;;;29628:85:0;;9062:2:1;29628:85:0;;;9044:21:1;9101:2;9081:18;;;9074:30;9140:34;9120:18;;;9113:62;-1:-1:-1;;;9191:18:1;;;9184:35;9236:19;;29628:85:0;8860:401:1;29628:85:0;29749:60;29758:5;29765:7;29793:15;29774:16;:34;29749:8;:60::i;26463:193::-;26542:4;16245:10;26598:28;16245:10;26615:2;26619:6;26598:9;:28::i;40542:182::-;17500:13;:11;:13::i;:::-;-1:-1:-1;;;;;40627:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;40627:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;40682:34;;1193:41:1;;;40682:34:0::1;::::0;1166:18:1;40682:34:0::1;;;;;;;40542:182:::0;;:::o;39841:215::-;17500:13;:11;:13::i;:::-;39967:4:::1;39959;39938:13;26047:12:::0;;;25959:108;39938:13:::1;:17;::::0;39954:1:::1;39938:17;:::i;:::-;39937:26;;;;:::i;:::-;39936:35;;;;:::i;:::-;39926:6;:45;;39918:94;;;::::0;-1:-1:-1;;;39918:94:0;;9468:2:1;39918:94:0::1;::::0;::::1;9450:21:1::0;9507:2;9487:18;;;9480:30;9546:34;9526:18;;;9519:62;-1:-1:-1;;;9597:18:1;;;9590:34;9641:19;;39918:94:0::1;9266:400:1::0;39918:94:0::1;40035:13;:6:::0;40044:4:::1;40035:13;:::i;:::-;40023:9;:25:::0;-1:-1:-1;39841:215:0:o;41922:206::-;17500:13;:11;:13::i;:::-;42010:9:::1;42005:116;42029:12;:19;42025:1;:23;42005:116;;;42104:5;42070:14;:31;42085:12;42098:1;42085:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;42070:31:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;42070:31:0;:39;;-1:-1:-1;;42070:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42050:3;::::1;::::0;::::1;:::i;:::-;;;;42005:116;;41475:106:::0;41514:7;41541:32;41556:13;;41571:1;41541:14;:32::i;:::-;41534:39;;41475:106;:::o;39201:390::-;39282:4;17500:13;:11;:13::i;:::-;39341:6:::1;39320:13;26047:12:::0;;;25959:108;39320:13:::1;:17;::::0;39336:1:::1;39320:17;:::i;:::-;39319:28;;;;:::i;:::-;39306:9;:41;;39298:107;;;::::0;-1:-1:-1;;;39298:107:0;;9873:2:1;39298:107:0::1;::::0;::::1;9855:21:1::0;9912:2;9892:18;;;9885:30;9951:34;9931:18;;;9924:62;-1:-1:-1;;;10002:18:1;;;9995:51;10063:19;;39298:107:0::1;9671:417:1::0;39298:107:0::1;39459:4;39438:13;26047:12:::0;;;25959:108;39438:13:::1;:17;::::0;39454:1:::1;39438:17;:::i;:::-;39437:26;;;;:::i;:::-;39424:9;:39;;39416:104;;;::::0;-1:-1:-1;;;39416:104:0;;10295:2:1;39416:104:0::1;::::0;::::1;10277:21:1::0;10334:2;10314:18;;;10307:30;10373:34;10353:18;;;10346:62;-1:-1:-1;;;10424:18:1;;;10417:50;10484:19;;39416:104:0::1;10093:416:1::0;39416:104:0::1;-1:-1:-1::0;39531:18:0::1;:30:::0;;;39579:4:::1;17524:1;39201:390:::0;;;:::o;26719:151::-;-1:-1:-1;;;;;26835:18:0;;;26808:7;26835:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;26719:151::o;47208:102::-;17500:13;:11;:13::i;:::-;47259:43:::1;47277:24;47295:4;47277:9;:24::i;:::-;47259:17;:43::i;38996:135::-:0;39056:4;17500:13;:11;:13::i;:::-;-1:-1:-1;39073:20:0::1;:28:::0;;-1:-1:-1;;39073:28:0::1;::::0;;;38996:135;:::o;47124:76::-;17500:13;:11;:13::i;18520:201::-;17500:13;:11;:13::i;:::-;-1:-1:-1;;;;;18609:22:0;::::1;18601:73;;;::::0;-1:-1:-1;;;18601:73:0;;10716:2:1;18601:73:0::1;::::0;::::1;10698:21:1::0;10755:2;10735:18;;;10728:30;10794:34;10774:18;;;10767:62;-1:-1:-1;;;10845:18:1;;;10838:36;10891:19;;18601:73:0::1;10514:402:1::0;18601:73:0::1;18685:28;18704:8;18685:18;:28::i;33041:380::-:0;-1:-1:-1;;;;;33177:19:0;;33169:68;;;;-1:-1:-1;;;33169:68:0;;11123:2:1;33169:68:0;;;11105:21:1;11162:2;11142:18;;;11135:30;11201:34;11181:18;;;11174:62;-1:-1:-1;;;11252:18:1;;;11245:34;11296:19;;33169:68:0;10921:400:1;33169:68:0;-1:-1:-1;;;;;33256:21:0;;33248:68;;;;-1:-1:-1;;;33248:68:0;;11528:2:1;33248:68:0;;;11510:21:1;11567:2;11547:18;;;11540:30;11606:34;11586:18;;;11579:62;-1:-1:-1;;;11657:18:1;;;11650:32;11699:19;;33248:68:0;11326:398:1;33248:68:0;-1:-1:-1;;;;;33329:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;33381:32;;2951:25:1;;;33381:32:0;;2924:18:1;33381:32:0;;;;;;;33041:380;;;:::o;17779:132::-;17687:6;;-1:-1:-1;;;;;17687:6:0;16245:10;17843:23;17835:68;;;;-1:-1:-1;;;17835:68:0;;11931:2:1;17835:68:0;;;11913:21:1;;;11950:18;;;11943:30;12009:34;11989:18;;;11982:62;12061:18;;17835:68:0;11729:356:1;33712:453:0;33847:24;33874:25;33884:5;33891:7;33874:9;:25::i;:::-;33847:52;;-1:-1:-1;;33914:16:0;:37;33910:248;;33996:6;33976:16;:26;;33968:68;;;;-1:-1:-1;;;33968:68:0;;12292:2:1;33968:68:0;;;12274:21:1;12331:2;12311:18;;;12304:30;12370:31;12350:18;;;12343:59;12419:18;;33968:68:0;12090:353:1;33968:68:0;34080:51;34089:5;34096:7;34124:6;34105:16;:25;34080:8;:51::i;:::-;33836:329;33712:453;;;:::o;42249:3563::-;-1:-1:-1;;;;;42381:18:0;;42373:68;;;;-1:-1:-1;;;42373:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42460:16:0;;42452:64;;;;-1:-1:-1;;;42452:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42536:20:0;;;;;;:14;:20;;;;;;;;42535:21;42527:111;;;;-1:-1:-1;;;42527:111:0;;13460:2:1;42527:111:0;;;13442:21:1;13499:2;13479:18;;;13472:30;13538:34;13518:18;;;13511:62;13609:34;13589:18;;;13582:62;-1:-1:-1;;;13660:19:1;;;13653:44;13714:19;;42527:111:0;13258:481:1;42527:111:0;42653:6;42663:1;42653:11;42649:93;;42681:28;42697:4;42703:2;42707:1;42681:15;:28::i;:::-;42249:3563;;;:::o;42649:93::-;42756:13;;;;;;;42752:107;;;42825:10;;42810:12;;:25;;;;:::i;:::-;42794:12;:41;;42786:61;;;;-1:-1:-1;;;42786:61:0;;13946:2:1;42786:61:0;;;13928:21:1;13985:1;13965:18;;;13958:29;-1:-1:-1;;;14003:18:1;;;13996:37;14050:18;;42786:61:0;13744:330:1;42786:61:0;42873:14;;;;42869:1910;;;17687:6;;-1:-1:-1;;;;;42926:15:0;;;17687:6;;42926:15;;;;:49;;-1:-1:-1;17687:6:0;;-1:-1:-1;;;;;42962:13:0;;;17687:6;;42962:13;;42926:49;:86;;;;-1:-1:-1;;;;;;42996:16:0;;;;42926:86;:128;;;;-1:-1:-1;;;;;;43033:21:0;;43047:6;43033:21;;42926:128;:159;;;;-1:-1:-1;43076:9:0;;;;43075:10;42926:159;42904:1864;;;43125:13;;;;;;;43120:150;;-1:-1:-1;;;;;43171:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;43200:23:0;;;;;;:19;:23;;;;;;;;43171:52;43163:87;;;;-1:-1:-1;;;43163:87:0;;14281:2:1;43163:87:0;;;14263:21:1;14320:2;14300:18;;;14293:30;-1:-1:-1;;;14339:18:1;;;14332:52;14401:18;;43163:87:0;14079:346:1;43163:87:0;43294:13;43304:2;43294:9;:13::i;:::-;:18;:55;;;;-1:-1:-1;;;;;;43316:28:0;;;;;;:24;:28;;;;;;:33;43294:55;43290:150;;;-1:-1:-1;;;;;43374:28:0;;;;;;:24;:28;;;;;43405:15;43374:46;;43290:150;43464:20;;;;43460:510;;;17687:6;;-1:-1:-1;;;;;43513:13:0;;;17687:6;;43513:13;;;;:47;;-1:-1:-1;43544:15:0;;-1:-1:-1;;;;;43530:30:0;;;43544:15;;43530:30;;43513:47;:79;;;;-1:-1:-1;43578:13:0;;-1:-1:-1;;;;;43564:28:0;;;43578:13;;43564:28;;43513:79;43509:442;;;43688:9;43659:39;;;;:28;:39;;;;;;43701:12;-1:-1:-1;43621:225:0;;;;-1:-1:-1;;;43621:225:0;;14632:2:1;43621:225:0;;;14614:21:1;14671:2;14651:18;;;14644:30;14710:34;14690:18;;;14683:62;14781:34;14761:18;;;14754:62;-1:-1:-1;;;14832:19:1;;;14825:40;14882:19;;43621:225:0;14430:477:1;43621:225:0;43902:9;43873:39;;;;:28;:39;;;;;43915:12;43873:54;;43509:442;-1:-1:-1;;;;;44023:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;44059:35:0;;;;;;:31;:35;;;;;;;;44058:36;44023:71;44019:734;;;44137:20;;44127:6;:30;;44119:96;;;;-1:-1:-1;;;44119:96:0;;15114:2:1;44119:96:0;;;15096:21:1;15153:2;15133:18;;;15126:30;15192:34;15172:18;;;15165:62;-1:-1:-1;;;15243:18:1;;;15236:51;15304:19;;44119:96:0;14912:417:1;44119:96:0;44272:9;;44255:13;44265:2;44255:9;:13::i;:::-;44246:22;;:6;:22;:::i;:::-;:35;;44238:67;;;;-1:-1:-1;;;44238:67:0;;15536:2:1;44238:67:0;;;15518:21:1;15575:2;15555:18;;;15548:30;-1:-1:-1;;;15594:18:1;;;15587:49;15653:18;;44238:67:0;15334:343:1;44238:67:0;44019:734;;;-1:-1:-1;;;;;44382:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;44416:37:0;;;;;;:31;:37;;;;;;;;44415:38;44382:71;44378:375;;;44496:20;;44486:6;:30;;44478:97;;;;-1:-1:-1;;;44478:97:0;;15884:2:1;44478:97:0;;;15866:21:1;15923:2;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;-1:-1:-1;;;16013:18:1;;;16006:52;16075:19;;44478:97:0;15682:418:1;44378:375:0;-1:-1:-1;;;;;44606:35:0;;;;;;:31;:35;;;;;;;;44601:152;;44700:9;;44683:13;44693:2;44683:9;:13::i;:::-;44674:22;;:6;:22;:::i;:::-;:35;;44666:67;;;;-1:-1:-1;;;44666:67:0;;15536:2:1;44666:67:0;;;15518:21:1;15575:2;15555:18;;;15548:30;-1:-1:-1;;;15594:18:1;;;15587:49;15653:18;;44666:67:0;15334:343:1;44666:67:0;44791:28;44822:24;44840:4;44822:9;:24::i;:::-;44896:18;;44791:55;;-1:-1:-1;44872:42:0;;;;;;;44943:34;;-1:-1:-1;44968:9:0;;;;44967:10;44943:34;:83;;;;-1:-1:-1;;;;;;44995:31:0;;;;;;:25;:31;;;;;;;;44994:32;44943:83;:126;;;;-1:-1:-1;;;;;;45044:25:0;;;;;;:19;:25;;;;;;;;45043:26;44943:126;:167;;;;-1:-1:-1;;;;;;45087:23:0;;;;;;:19;:23;;;;;;;;45086:24;44943:167;44925:297;;;45137:9;:16;;-1:-1:-1;;45137:16:0;45149:4;45137:16;;;45168:10;:8;:10::i;:::-;45193:9;:17;;-1:-1:-1;;45193:17:0;;;44925:297;45250:9;;-1:-1:-1;;;;;45276:25:0;;45234:12;45276:25;;;:19;:25;;;;;;45250:9;;;;45249:10;;45276:25;;:52;;-1:-1:-1;;;;;;45305:23:0;;;;;;:19;:23;;;;;;;;45276:52;45272:100;;;-1:-1:-1;45355:5:0;45272:100;45384:12;45415:7;45411:348;;;45439:17;45460:32;45475:13;;45490:1;45460:14;:32::i;:::-;45439:53;-1:-1:-1;45511:13:0;;45507:241;;45552:30;45578:3;45552:21;:6;45563:9;45552:10;:21::i;:::-;:25;;:30::i;:::-;45545:37;-1:-1:-1;45605:8:0;;45601:99;;45638:42;45654:4;45668;45675;45638:15;:42::i;:::-;45718:14;45728:4;45718:14;;:::i;:::-;;;45507:241;45424:335;45411:348;45771:33;45787:4;45793:2;45797:6;45771:15;:33::i;:::-;42362:3450;;;;42249:3563;;;:::o;18881:191::-;18974:6;;;-1:-1:-1;;;;;18991:17:0;;;-1:-1:-1;;;;;;18991:17:0;;;;;;;19024:40;;18974:6;;;18991:17;18974:6;;19024:40;;18955:16;;19024:40;18944:128;18881:191;:::o;40982:186::-;-1:-1:-1;;;;;41065:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;41065:39:0;;;;;;;;;;41120:40;;41065:39;;:31;41120:40;;;40982:186;;:::o;45820:473::-;45923:10;;45899:7;;45923:10;;;;;45918:58;;-1:-1:-1;45957:7:0;45950:14;;45918:58;45986:12;46019:11;;46001:15;:29;;;;:::i;:::-;45986:44;-1:-1:-1;46041:22:0;46078:2;46066:9;46073:2;45986:44;46066:9;:::i;:::-;:14;;;;:::i;:::-;46041:39;;46113:7;46095:14;:25;46091:71;;46144:6;46137:13;;;;;;46091:71;46172:21;46196:24;46206:14;46196:7;:24;:::i;:::-;46172:48;;46254:6;46238:13;:22;:47;;46279:6;46238:47;;;46263:13;46238:47;46231:54;45820:473;-1:-1:-1;;;;;;45820:473:0:o;46301:452::-;46392:16;;;46406:1;46392:16;;;;;;;;46368:21;;46392:16;;;;;;;;;;-1:-1:-1;46392:16:0;46368:40;;46437:4;46419;46424:1;46419:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46419:23:0;;;:7;;;;;;;;;:23;46463:3;;46453:7;;46463:3;;;46453:4;;46463:3;;46453:7;;;;;;:::i;:::-;-1:-1:-1;;;;;46453:13:0;;;:7;;;;;;;;;:13;46511:15;;46479:62;;46496:4;;46511:15;46529:11;46479:8;:62::i;:::-;46552:15;;-1:-1:-1;;;;;46552:15:0;:69;46636:11;46552:15;46678:4;46697:7;17687:6;;-1:-1:-1;;;;;17687:6:0;;17614:87;46697:7;46719:15;46552:193;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46357:396;46301:452;:::o;30322:671::-;-1:-1:-1;;;;;30453:18:0;;30445:68;;;;-1:-1:-1;;;30445:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30532:16:0;;30524:64;;;;-1:-1:-1;;;30524:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30674:15:0;;30652:19;30674:15;;;;;;;;;;;30708:21;;;;30700:72;;;;-1:-1:-1;;;30700:72:0;;17422:2:1;30700:72:0;;;17404:21:1;17461:2;17441:18;;;17434:30;17500:34;17480:18;;;17473:62;-1:-1:-1;;;17551:18:1;;;17544:36;17597:19;;30700:72:0;17220:402:1;30700:72:0;-1:-1:-1;;;;;30808:15:0;;;:9;:15;;;;;;;;;;;30826:20;;;30808:38;;30868:13;;;;;;;;:23;;30840:6;;30808:9;30868:23;;30840:6;;30868:23;:::i;:::-;;;;;;;;30924:2;-1:-1:-1;;;;;30909:26:0;30918:4;-1:-1:-1;;;;;30909:26:0;;30928:6;30909:26;;;;2951:25:1;;2939:2;2924:18;;2805:177;30909:26:0;;;;;;;;30948:37;42249:3563;46761:355;46800:23;46826:24;46844:4;46826:9;:24::i;:::-;46800:50;;46865:15;46884:1;46865:20;46861:33;;46887:7;46761:355::o;46861:33::-;46926:18;;46908:15;:36;46904:105;;;-1:-1:-1;46979:18:0;;46904:105;47048:15;47074:34;47048:15;47074:17;:34::i;12059:98::-;12117:7;12144:5;12148:1;12144;:5;:::i;:::-;12137:12;12059:98;-1:-1:-1;;;12059:98:0:o;12458:::-;12516:7;12543:5;12547:1;12543;:5;:::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:1;;723:42;;713:70;;779:1;776;769:12;794:254;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:1:o;1245:127::-;1306:10;1301:3;1297:20;1294:1;1287:31;1337:4;1334:1;1327:15;1361:4;1358:1;1351:15;1377:275;1448:2;1442:9;1513:2;1494:13;;-1:-1:-1;;1490:27:1;1478:40;;1548:18;1533:34;;1569:22;;;1530:62;1527:88;;;1595:18;;:::i;:::-;1631:2;1624:22;1377:275;;-1:-1:-1;1377:275:1:o;1657:952::-;1741:6;1772:2;1815;1803:9;1794:7;1790:23;1786:32;1783:52;;;1831:1;1828;1821:12;1783:52;1871:9;1858:23;1900:18;1941:2;1933:6;1930:14;1927:34;;;1957:1;1954;1947:12;1927:34;1995:6;1984:9;1980:22;1970:32;;2040:7;2033:4;2029:2;2025:13;2021:27;2011:55;;2062:1;2059;2052:12;2011:55;2098:2;2085:16;2120:2;2116;2113:10;2110:36;;;2126:18;;:::i;:::-;2172:2;2169:1;2165:10;2155:20;;2195:28;2219:2;2215;2211:11;2195:28;:::i;:::-;2257:15;;;2327:11;;;2323:20;;;2288:12;;;;2355:19;;;2352:39;;;2387:1;2384;2377:12;2352:39;2411:11;;;;2431:148;2447:6;2442:3;2439:15;2431:148;;;2513:23;2532:3;2513:23;:::i;:::-;2501:36;;2464:12;;;;2557;;;;2431:148;;;2598:5;1657:952;-1:-1:-1;;;;;;;;1657:952:1:o;2614:186::-;2673:6;2726:2;2714:9;2705:7;2701:23;2697:32;2694:52;;;2742:1;2739;2732:12;2694:52;2765:29;2784:9;2765:29;:::i;2987:180::-;3046:6;3099:2;3087:9;3078:7;3074:23;3070:32;3067:52;;;3115:1;3112;3105:12;3067:52;-1:-1:-1;3138:23:1;;2987:180;-1:-1:-1;2987:180:1:o;3172:328::-;3249:6;3257;3265;3318:2;3306:9;3297:7;3293:23;3289:32;3286:52;;;3334:1;3331;3324:12;3286:52;3357:29;3376:9;3357:29;:::i;:::-;3347:39;;3405:38;3439:2;3428:9;3424:18;3405:38;:::i;:::-;3395:48;;3490:2;3479:9;3475:18;3462:32;3452:42;;3172:328;;;;;:::o;3694:118::-;3780:5;3773:13;3766:21;3759:5;3756:32;3746:60;;3802:1;3799;3792:12;3817:241;3873:6;3926:2;3914:9;3905:7;3901:23;3897:32;3894:52;;;3942:1;3939;3932:12;3894:52;3981:9;3968:23;4000:28;4022:5;4000:28;:::i;4063:315::-;4128:6;4136;4189:2;4177:9;4168:7;4164:23;4160:32;4157:52;;;4205:1;4202;4195:12;4157:52;4228:29;4247:9;4228:29;:::i;:::-;4218:39;;4307:2;4296:9;4292:18;4279:32;4320:28;4342:5;4320:28;:::i;:::-;4367:5;4357:15;;;4063:315;;;;;:::o;4591:260::-;4659:6;4667;4720:2;4708:9;4699:7;4695:23;4691:32;4688:52;;;4736:1;4733;4726:12;4688:52;4759:29;4778:9;4759:29;:::i;:::-;4749:39;;4807:38;4841:2;4830:9;4826:18;4807:38;:::i;:::-;4797:48;;4591:260;;;;;:::o;4856:764::-;4925:6;4956:2;4999;4987:9;4978:7;4974:23;4970:32;4967:52;;;5015:1;5012;5005:12;4967:52;5055:9;5042:23;5084:18;5125:2;5117:6;5114:14;5111:34;;;5141:1;5138;5131:12;5111:34;5179:6;5168:9;5164:22;5154:32;;5224:7;5217:4;5213:2;5209:13;5205:27;5195:55;;5246:1;5243;5236:12;5195:55;5282:2;5269:16;5304:2;5300;5297:10;5294:36;;;5310:18;;:::i;:::-;5352:53;5395:2;5376:13;;-1:-1:-1;;5372:27:1;5368:36;;5352:53;:::i;:::-;5339:66;;5428:2;5421:5;5414:17;5468:7;5463:2;5458;5454;5450:11;5446:20;5443:33;5440:53;;;5489:1;5486;5479:12;5440:53;5544:2;5539;5535;5531:11;5526:2;5519:5;5515:14;5502:45;5588:1;5567:14;;;5563:23;;;5556:34;;;;-1:-1:-1;5571:5:1;4856:764;-1:-1:-1;;;4856:764:1:o;5625:380::-;5704:1;5700:12;;;;5747;;;5768:61;;5822:4;5814:6;5810:17;5800:27;;5768:61;5875:2;5867:6;5864:14;5844:18;5841:38;5838:161;;5921:10;5916:3;5912:20;5909:1;5902:31;5956:4;5953:1;5946:15;5984:4;5981:1;5974:15;5838:161;;5625:380;;;:::o;6010:127::-;6071:10;6066:3;6062:20;6059:1;6052:31;6102:4;6099:1;6092:15;6126:4;6123:1;6116:15;6142:127;6203:10;6198:3;6194:20;6191:1;6184:31;6234:4;6231:1;6224:15;6258:4;6255:1;6248:15;6274:135;6313:3;6334:17;;;6331:43;;6354:18;;:::i;:::-;-1:-1:-1;6401:1:1;6390:13;;6274:135::o;6414:184::-;6484:6;6537:2;6525:9;6516:7;6512:23;6508:32;6505:52;;;6553:1;6550;6543:12;6505:52;-1:-1:-1;6576:16:1;;6414:184;-1:-1:-1;6414:184:1:o;6882:245::-;6949:6;7002:2;6990:9;6981:7;6977:23;6973:32;6970:52;;;7018:1;7015;7008:12;6970:52;7050:9;7044:16;7069:28;7091:5;7069:28;:::i;7132:168::-;7172:7;7238:1;7234;7230:6;7226:14;7223:1;7220:21;7215:1;7208:9;7201:17;7197:45;7194:71;;;7245:18;;:::i;:::-;-1:-1:-1;7285:9:1;;7132:168::o;7305:217::-;7345:1;7371;7361:132;;7415:10;7410:3;7406:20;7403:1;7396:31;7450:4;7447:1;7440:15;7478:4;7475:1;7468:15;7361:132;-1:-1:-1;7507:9:1;;7305:217::o;7943:128::-;7983:3;8014:1;8010:6;8007:1;8004:13;8001:39;;;8020:18;;:::i;:::-;-1:-1:-1;8056:9:1;;7943:128::o;12448:401::-;12650:2;12632:21;;;12689:2;12669:18;;;12662:30;12728:34;12723:2;12708:18;;12701:62;-1:-1:-1;;;12794:2:1;12779:18;;12772:35;12839:3;12824:19;;12448:401::o;12854:399::-;13056:2;13038:21;;;13095:2;13075:18;;;13068:30;13134:34;13129:2;13114:18;;13107:62;-1:-1:-1;;;13200:2:1;13185:18;;13178:33;13243:3;13228:19;;12854:399::o;16105:125::-;16145:4;16173:1;16170;16167:8;16164:34;;;16178:18;;:::i;:::-;-1:-1:-1;16215:9:1;;16105:125::o;16235:980::-;16497:4;16545:3;16534:9;16530:19;16576:6;16565:9;16558:25;16602:2;16640:6;16635:2;16624:9;16620:18;16613:34;16683:3;16678:2;16667:9;16663:18;16656:31;16707:6;16742;16736:13;16773:6;16765;16758:22;16811:3;16800:9;16796:19;16789:26;;16850:2;16842:6;16838:15;16824:29;;16871:1;16881:195;16895:6;16892:1;16889:13;16881:195;;;16960:13;;-1:-1:-1;;;;;16956:39:1;16944:52;;17051:15;;;;17016:12;;;;16992:1;16910:9;16881:195;;;-1:-1:-1;;;;;;;17132:32:1;;;;17127:2;17112:18;;17105:60;-1:-1:-1;;;17196:3:1;17181:19;17174:35;17093:3;16235:980;-1:-1:-1;;;16235:980:1:o
Swarm Source
ipfs://9f3e952d85b528621f0bc499a6e35cbbafc8a8bc5be9468b7380d4c00f61c887
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.