ERC-20
Overview
Max Total Supply
888,888,888,888,888 HOOTY
Holders
166
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.614925811342700379 HOOTYValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Hooty
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-22 */ /** *Submitted for verification at Etherscan.io on 2022-04-22 */ // Verified using https://dapp.tools // https://hooty.fi/ // hevm: flattened sources of src/Hooty.sol // SPDX-License-Identifier: MIT pragma solidity 0.8.10 >=0.8.10 >=0.8.0 <0.9.0; pragma experimental ABIEncoderV2; ////// lib/openzeppelin-contracts/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (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; } } ////// lib/openzeppelin-contracts/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) /* pragma solidity ^0.8.0; */ /* import "../utils/Context.sol"; */ /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } } ////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) /* pragma solidity ^0.8.0; */ /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } ////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) /* pragma solidity ^0.8.0; */ /* import "../IERC20.sol"; */ /** * @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); } ////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) /* pragma solidity ^0.8.0; */ /* import "./IERC20.sol"; */ /* import "./extensions/IERC20Metadata.sol"; */ /* import "../../utils/Context.sol"; */ /** * @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: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, 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}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, 'ERC20: transfer amount exceeds allowance' ); unchecked { _approve(sender, _msgSender(), currentAllowance - 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) { _approve( _msgSender(), spender, _allowances[_msgSender()][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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero' ); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), 'ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20: transfer to the zero address'); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, 'ERC20: transfer amount exceeds balance' ); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `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 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 {} } ////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.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 substraction 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; } } } ////// src/IUniswapV2Factory.sol /* pragma solidity 0.8.10; */ /* pragma experimental ABIEncoderV2; */ interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } ////// src/IUniswapV2Pair.sol /* pragma solidity 0.8.10; */ /* pragma experimental ABIEncoderV2; */ interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } ////// src/IUniswapV2Router02.sol /* pragma solidity 0.8.10; */ /* pragma experimental ABIEncoderV2; */ interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } ////// src/Hooty.sol /* pragma solidity >=0.8.10; */ /* import {IUniswapV2Router02} from "./IUniswapV2Router02.sol"; */ /* import {IUniswapV2Factory} from "./IUniswapV2Factory.sol"; */ /* import {IUniswapV2Pair} from "./IUniswapV2Pair.sol"; */ /* import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; */ /* import {ERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; */ /* import {Ownable} from "lib/openzeppelin-contracts/contracts/access/Ownable.sol"; */ /* import {SafeMath} from "lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol"; */ contract Hooty is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool private swapping; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; uint256 public buyMoonbirdsFee = 5; uint256 public sellMoonbirdsFee = 5; uint256 public buyBuybackFee = 0; uint256 public sellBuybackFee = 2; uint256 public buyTotalFees = buyMoonbirdsFee.add(buyBuybackFee); uint256 public sellTotalFees = sellMoonbirdsFee.add(sellBuybackFee); uint256 public tokensForMAW; uint256 public tokensForBuyback; address public moonbirdsFeeRecipient = 0xb6aaAa1d77E27F7D1f7851f3D5eDC0446d4b3350; address public buybackFeeRecipient = 0xF5a7e92a393Af97bc7A2e001b92d6a282cF5ED21; // exclude from fees and max transaction amount mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransactionAmount; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping(address => bool) public automatedMarketMakerPairs; event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); constructor() public ERC20('Hooty', 'HOOTY') { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); excludeFromMaxTransaction(address(_uniswapV2Router), true); uniswapV2Router = _uniswapV2Router; // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); excludeFromMaxTransaction(address(uniswapV2Pair), true); _setAutomatedMarketMakerPair(_uniswapV2Pair, true); uniswapV2Pair = _uniswapV2Pair; // 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); uint256 totalSupply = 888_888_888_888_888 * 1e18; maxTransactionAmount = 8_888_888_888_888 * 1e18; // 1% from total supply maxTransactionAmountTxn maxWallet = 17_777_777_777_777 * 1e18; // 2% from total supply maxWallet swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swap wallet /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(msg.sender, totalSupply); } receive() external payable {} function updateUniswapV2Router(address newAddress) public onlyOwner { require( newAddress != address(uniswapV2Router), 'HOOTY: The router already has that address' ); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()) .createPair(address(this), uniswapV2Router.WETH()); uniswapV2Pair = _uniswapV2Pair; } function excludeFromFees(address account, bool excluded) public onlyOwner { require( _isExcludedFromFees[account] != excluded, "HOOTY: Account is already the value of 'excluded'" ); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeMultipleAccountsFromFees( address[] calldata accounts, bool excluded ) public onlyOwner { for (uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setMoonbirdsFee(uint256 _buyFee, uint256 _sellFee) external onlyOwner { require(_buyFee >= 0 && _buyFee <= 7); require(_sellFee >= 0 && _sellFee <= 7); buyMoonbirdsFee = _buyFee; sellMoonbirdsFee = _sellFee; buyTotalFees = buyMoonbirdsFee.add(buyBuybackFee); sellTotalFees = sellMoonbirdsFee.add(sellBuybackFee); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require( pair != uniswapV2Pair, 'HOOTY: The UniSwap pair cannot be removed from automatedMarketMakerPairs' ); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require( automatedMarketMakerPairs[pair] != value, 'HOOTY: Automated market maker pair is already set to that value' ); automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } 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'); if (amount == 0) { super._transfer(from, to, 0); return; } //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; // @dev if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; if (takeFee) { // on sell if (automatedMarketMakerPairs[to] && sellTotalFees > 0) { fees = amount.mul(sellTotalFees).div(100); tokensForMAW += (fees * sellMoonbirdsFee) / sellTotalFees; tokensForBuyback += (fees * sellBuybackFee) / sellTotalFees; } // on buy else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) { fees = amount.mul(buyTotalFees).div(100); tokensForMAW += (fees * buyMoonbirdsFee) / buyTotalFees; tokensForBuyback += (fees * buyBuybackFee) / buyTotalFees; } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForMAW + tokensForBuyback; bool success; if (contractBalance == 0 || totalTokensToSwap == 0) { return; } if (contractBalance > swapTokensAtAmount * 20) { contractBalance = swapTokensAtAmount * 20; } swapTokensForEth(totalTokensToSwap); uint256 ethBalance = address(this).balance; uint256 ethForMAW = ethBalance.mul(tokensForMAW).div(totalTokensToSwap); tokensForMAW = 0; tokensForBuyback = 0; (success, ) = address(moonbirdsFeeRecipient).call{value: ethForMAW}(''); (success, ) = address(buybackFeeRecipient).call{ value: address(this).balance }(''); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } // 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 * (10**18); } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 5) / 1000) / 1e18, 'Cannot set maxWallet lower than 0.5%' ); maxWallet = newNum * (10**18); } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } function setMoonbirdsFeeRecipient(address _moonbirdsFeeRecipient) external onlyOwner { moonbirdsFeeRecipient = _moonbirdsFeeRecipient; } function setBuybackFeeRecipient(address _buybackFeeRecipient) external onlyOwner { buybackFeeRecipient = _buybackFeeRecipient; } function setSwapTokensAtAmount(uint256 _tokenAmount) external onlyOwner { swapTokensAtAmount = _tokenAmount; } }
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":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMoonbirdsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","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":[],"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":"moonbirdsFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMoonbirdsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_buybackFeeRecipient","type":"address"}],"name":"setBuybackFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setMoonbirdsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_moonbirdsFeeRecipient","type":"address"}],"name":"setMoonbirdsFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","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":"tokensForBuyback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMAW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526005600b556005600c556000600d556002600e5562000036600d54600b54620003e360201b620014f71790919060201c565b600f5562000057600e54600c54620003e360201b620014f71790919060201c565b601055601380546001600160a01b031990811673b6aaaa1d77e27f7d1f7851f3d5edc0446d4b3350179091556014805490911673f5a7e92a393af97bc7a2e001b92d6a282cf5ed21179055348015620000af57600080fd5b5060405180604001604052806005815260200164486f6f747960d81b81525060405180604001604052806005815260200164484f4f545960d81b815250816003908051906020019062000104929190620007cd565b5080516200011a906004906020840190620007cd565b5050506200013762000131620003f860201b60201c565b620003fc565b737a250d5630b4cf539739df2c5dacb4c659f2488d620001598160016200044e565b600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa158015620001b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001dc919062000873565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000873565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200029e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c4919062000873565b600754909150620002e0906001600160a01b031660016200044e565b620002ed816001620004c8565b600780546001600160a01b0319166001600160a01b038316179055620003276200031f6005546001600160a01b031690565b6001620005b3565b62000334306001620005b3565b6200034361dead6001620005b3565b620003626200035a6005546001600160a01b031690565b60016200044e565b6200036f3060016200044e565b6200037e61dead60016200044e565b6c70318c8e57bb47a06615e000006008556ce063191caf846ff77fd3240000600a556d2bd35ae79a49ed3975a215e00000612710620003bf826005620008b4565b620003cb9190620008d6565b600955620003da3382620006e8565b50505062000951565b6000620003f18284620008f9565b9392505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b031633146200049d5760405162461bcd60e51b8152602060048201819052602482015260008051602062002f5f83398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b6001600160a01b03821660009081526017602052604090205460ff16151581151514156200055f5760405162461bcd60e51b815260206004820152603f60248201527f484f4f54593a204175746f6d61746564206d61726b6574206d616b657220706160448201527f697220697320616c72656164792073657420746f20746861742076616c756500606482015260840162000494565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620005fe5760405162461bcd60e51b8152602060048201819052602482015260008051602062002f5f833981519152604482015260640162000494565b6001600160a01b03821660009081526015602052604090205460ff1615158115151415620006895760405162461bcd60e51b815260206004820152603160248201527f484f4f54593a204163636f756e7420697320616c7265616479207468652076616044820152706c7565206f6620276578636c756465642760781b606482015260840162000494565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620007405760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000494565b8060026000828254620007549190620008f9565b90915550506001600160a01b0382166000908152602081905260408120805483929062000783908490620008f9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620007db9062000914565b90600052602060002090601f016020900481019282620007ff57600085556200084a565b82601f106200081a57805160ff19168380011785556200084a565b828001600101855582156200084a579182015b828111156200084a5782518255916020019190600101906200082d565b50620008589291506200085c565b5090565b5b808211156200085857600081556001016200085d565b6000602082840312156200088657600080fd5b81516001600160a01b0381168114620003f157600080fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620008d157620008d16200089e565b500290565b600082620008f457634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156200090f576200090f6200089e565b500190565b600181811c908216806200092957607f821691505b602082108114156200094b57634e487b7160e01b600052602260045260246000fd5b50919050565b6125fe80620009616000396000f3fe60806040526004361061026b5760003560e01c80638da5cb5b11610144578063c18bc195116100b6578063d4090d2a1161007a578063d4090d2a14610758578063d85ba0631461076e578063dd62ed3e14610784578063e2f45605146107ca578063f2fde38b146107e0578063f8b45b051461080057600080fd5b8063c18bc195146106c2578063c492f046146106e2578063c8c8ebe414610702578063d0c75bc314610718578063d257b34f1461073857600080fd5b8063a6319aa711610108578063a6319aa7146105fc578063a9059cbb14610612578063afa4f3b214610632578063b62496f514610652578063bff325c314610682578063c0246668146106a257600080fd5b80638da5cb5b146105735780638e169de81461059157806395d89b41146105a75780639a7a23d6146105bc578063a457c2d7146105dc57600080fd5b80634fbee193116101dd5780636e493976116101a15780636e493976146104b257806370a08231146104d2578063715018a61461050857806371a515221461051d5780637571336a14610533578063810ae3231461055357600080fd5b80634fbee1931461041757806353b9b8f314610450578063540ba5521461046657806365b8dbc01461047c5780636a486a8e1461049c57600080fd5b8063203e727e1161022f578063203e727e1461035957806323b872dd1461037b578063313ce5671461039b57806339509351146103b75780633d9c3e91146103d757806349bd5a5e146103f757600080fd5b806306fdde0314610277578063095ea7b3146102a257806310d5de53146102d25780631694505e1461030257806318160ddd1461033a57600080fd5b3661027257005b600080fd5b34801561028357600080fd5b5061028c610816565b6040516102999190612101565b60405180910390f35b3480156102ae57600080fd5b506102c26102bd36600461216b565b6108a8565b6040519015158152602001610299565b3480156102de57600080fd5b506102c26102ed366004612197565b60166020526000908152604090205460ff1681565b34801561030e57600080fd5b50600654610322906001600160a01b031681565b6040516001600160a01b039091168152602001610299565b34801561034657600080fd5b506002545b604051908152602001610299565b34801561036557600080fd5b506103796103743660046121b4565b6108be565b005b34801561038757600080fd5b506102c26103963660046121cd565b6109a4565b3480156103a757600080fd5b5060405160128152602001610299565b3480156103c357600080fd5b506102c26103d236600461216b565b610a4e565b3480156103e357600080fd5b506103796103f236600461220e565b610a8a565b34801561040357600080fd5b50600754610322906001600160a01b031681565b34801561042357600080fd5b506102c2610432366004612197565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561045c57600080fd5b5061034b600b5481565b34801561047257600080fd5b5061034b600d5481565b34801561048857600080fd5b50610379610497366004612197565b610b01565b3480156104a857600080fd5b5061034b60105481565b3480156104be57600080fd5b506103796104cd366004612197565b610d72565b3480156104de57600080fd5b5061034b6104ed366004612197565b6001600160a01b031660009081526020819052604090205490565b34801561051457600080fd5b50610379610dbe565b34801561052957600080fd5b5061034b600e5481565b34801561053f57600080fd5b5061037961054e366004612240565b610df4565b34801561055f57600080fd5b5061037961056e366004612197565b610e49565b34801561057f57600080fd5b506005546001600160a01b0316610322565b34801561059d57600080fd5b5061034b600c5481565b3480156105b357600080fd5b5061028c610e95565b3480156105c857600080fd5b506103796105d7366004612240565b610ea4565b3480156105e857600080fd5b506102c26105f736600461216b565b610f71565b34801561060857600080fd5b5061034b60115481565b34801561061e57600080fd5b506102c261062d36600461216b565b61100a565b34801561063e57600080fd5b5061037961064d3660046121b4565b611017565b34801561065e57600080fd5b506102c261066d366004612197565b60176020526000908152604090205460ff1681565b34801561068e57600080fd5b50601454610322906001600160a01b031681565b3480156106ae57600080fd5b506103796106bd366004612240565b611046565b3480156106ce57600080fd5b506103796106dd3660046121b4565b611158565b3480156106ee57600080fd5b506103796106fd366004612275565b611229565b34801561070e57600080fd5b5061034b60085481565b34801561072457600080fd5b50601354610322906001600160a01b031681565b34801561074457600080fd5b506102c26107533660046121b4565b611305565b34801561076457600080fd5b5061034b60125481565b34801561077a57600080fd5b5061034b600f5481565b34801561079057600080fd5b5061034b61079f3660046122f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156107d657600080fd5b5061034b60095481565b3480156107ec57600080fd5b506103796107fb366004612197565b61145c565b34801561080c57600080fd5b5061034b600a5481565b60606003805461082590612332565b80601f016020809104026020016040519081016040528092919081815260200182805461085190612332565b801561089e5780601f106108735761010080835404028352916020019161089e565b820191906000526020600020905b81548152906001019060200180831161088157829003601f168201915b5050505050905090565b60006108b533848461150a565b50600192915050565b6005546001600160a01b031633146108f15760405162461bcd60e51b81526004016108e89061236d565b60405180910390fd5b670de0b6b3a76400006103e861090660025490565b6109119060016123b8565b61091b91906123d7565b61092591906123d7565b81101561098c5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084016108e8565b61099e81670de0b6b3a76400006123b8565b60085550565b60006109b184848461162e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610a365760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108e8565b610a43853385840361150a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108b5918590610a859086906123f9565b61150a565b6005546001600160a01b03163314610ab45760405162461bcd60e51b81526004016108e89061236d565b6007821115610ac257600080fd5b6007811115610ad057600080fd5b600b829055600c819055600d54610ae89083906114f7565b600f55600e54600c54610afa916114f7565b6010555050565b6005546001600160a01b03163314610b2b5760405162461bcd60e51b81526004016108e89061236d565b6006546001600160a01b0382811691161415610b9c5760405162461bcd60e51b815260206004820152602a60248201527f484f4f54593a2054686520726f7574657220616c7265616479206861732074686044820152696174206164647265737360b01b60648201526084016108e8565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa158015610c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c579190612411565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdd9190612411565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4e9190612411565b600780546001600160a01b0319166001600160a01b03929092169190911790555050565b6005546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016108e89061236d565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610de85760405162461bcd60e51b81526004016108e89061236d565b610df26000611bb7565b565b6005546001600160a01b03163314610e1e5760405162461bcd60e51b81526004016108e89061236d565b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610e735760405162461bcd60e51b81526004016108e89061236d565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461082590612332565b6005546001600160a01b03163314610ece5760405162461bcd60e51b81526004016108e89061236d565b6007546001600160a01b0383811691161415610f635760405162461bcd60e51b815260206004820152604860248201527f484f4f54593a2054686520556e695377617020706169722063616e6e6f74206260448201527f652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616064820152676b6572506169727360c01b608482015260a4016108e8565b610f6d8282611c09565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ff35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108e8565b611000338585840361150a565b5060019392505050565b60006108b533848461162e565b6005546001600160a01b031633146110415760405162461bcd60e51b81526004016108e89061236d565b600955565b6005546001600160a01b031633146110705760405162461bcd60e51b81526004016108e89061236d565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156110f95760405162461bcd60e51b815260206004820152603160248201527f484f4f54593a204163636f756e7420697320616c7265616479207468652076616044820152706c7565206f6620276578636c756465642760781b60648201526084016108e8565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146111825760405162461bcd60e51b81526004016108e89061236d565b670de0b6b3a76400006103e861119760025490565b6111a29060056123b8565b6111ac91906123d7565b6111b691906123d7565b8110156112115760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b60648201526084016108e8565b61122381670de0b6b3a76400006123b8565b600a5550565b6005546001600160a01b031633146112535760405162461bcd60e51b81526004016108e89061236d565b60005b828110156112c45781601560008686858181106112755761127561242e565b905060200201602081019061128a9190612197565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806112bc81612444565b915050611256565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516112f89392919061245f565b60405180910390a1505050565b6005546000906001600160a01b031633146113325760405162461bcd60e51b81526004016108e89061236d565b620186a061133f60025490565b61134a9060016123b8565b61135491906123d7565b8210156113c15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b60648201526084016108e8565b6103e86113cd60025490565b6113d89060056123b8565b6113e291906123d7565b82111561144e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b60648201526084016108e8565b50600981905560015b919050565b6005546001600160a01b031633146114865760405162461bcd60e51b81526004016108e89061236d565b6001600160a01b0381166114eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e8565b6114f481611bb7565b50565b600061150382846123f9565b9392505050565b6001600160a01b03831661156c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108e8565b6001600160a01b0382166115cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108e8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116545760405162461bcd60e51b81526004016108e8906124b8565b6001600160a01b03821661167a5760405162461bcd60e51b81526004016108e8906124fd565b806116905761168b83836000611cf2565b505050565b6001600160a01b03831660009081526017602052604090205460ff1680156116d157506001600160a01b03821660009081526016602052604090205460ff16155b156117b5576008548111156117465760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b60648201526084016108e8565b600a546001600160a01b03831660009081526020819052604090205461176c90836123f9565b11156117b05760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108e8565b6118f6565b6001600160a01b03821660009081526017602052604090205460ff1680156117f657506001600160a01b03831660009081526016602052604090205460ff16155b1561186c576008548111156117b05760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b60648201526084016108e8565b6001600160a01b03821660009081526016602052604090205460ff166118f657600a546001600160a01b0383166000908152602081905260409020546118b290836123f9565b11156118f65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108e8565b30600090815260208190526040902054600954811080159081906119245750600754600160a01b900460ff16155b801561194957506001600160a01b03851660009081526017602052604090205460ff16155b801561196e57506001600160a01b03851660009081526015602052604090205460ff16155b801561199357506001600160a01b03841660009081526015602052604090205460ff16155b156119c1576007805460ff60a01b1916600160a01b1790556119b3611e47565b6007805460ff60a01b191690555b6007546001600160a01b03861660009081526015602052604090205460ff600160a01b909204821615911680611a0f57506001600160a01b03851660009081526015602052604090205460ff165b15611a18575060005b60008115611ba3576001600160a01b03861660009081526017602052604090205460ff168015611a4a57506000601054115b15611ad857611a6f6064611a6960105488611f8f90919063ffffffff16565b90611f9b565b9050601054600c5482611a8291906123b8565b611a8c91906123d7565b60116000828254611a9d91906123f9565b9091555050601054600e54611ab290836123b8565b611abc91906123d7565b60126000828254611acd91906123f9565b90915550611b859050565b6001600160a01b03871660009081526017602052604090205460ff168015611b0257506000600f54115b15611b8557611b216064611a69600f5488611f8f90919063ffffffff16565b9050600f54600b5482611b3491906123b8565b611b3e91906123d7565b60116000828254611b4f91906123f9565b9091555050600f54600d54611b6490836123b8565b611b6e91906123d7565b60126000828254611b7f91906123f9565b90915550505b8015611b9657611b96873083611cf2565b611ba08186612540565b94505b611bae878787611cf2565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526017602052604090205460ff1615158115151415611c9e5760405162461bcd60e51b815260206004820152603f60248201527f484f4f54593a204175746f6d61746564206d61726b6574206d616b657220706160448201527f697220697320616c72656164792073657420746f20746861742076616c75650060648201526084016108e8565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611d185760405162461bcd60e51b81526004016108e8906124b8565b6001600160a01b038216611d3e5760405162461bcd60e51b81526004016108e8906124fd565b6001600160a01b03831660009081526020819052604090205481811015611db65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108e8565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611ded9084906123f9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e3991815260200190565b60405180910390a350505050565b3060009081526020819052604081205490506000601254601154611e6b91906123f9565b90506000821580611e7a575081155b15611e8457505050565b600954611e929060146123b8565b831115611eaa57600954611ea79060146123b8565b92505b611eb382611fa7565b60004790506000611ed384611a6960115485611f8f90919063ffffffff16565b6000601181905560128190556013546040519293506001600160a01b031691839181818185875af1925050503d8060008114611f2b576040519150601f19603f3d011682016040523d82523d6000602084013e611f30565b606091505b50506014546040519194506001600160a01b0316904790600081818185875af1925050503d8060008114611f80576040519150601f19603f3d011682016040523d82523d6000602084013e611f85565b606091505b5050505050505050565b600061150382846123b8565b600061150382846123d7565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fdc57611fdc61242e565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120599190612411565b8160018151811061206c5761206c61242e565b6001600160a01b039283166020918202929092010152600654612092913091168461150a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120cb908590600090869030904290600401612557565b600060405180830381600087803b1580156120e557600080fd5b505af11580156120f9573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b8181101561212e57858101830151858201604001528201612112565b81811115612140576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146114f457600080fd5b6000806040838503121561217e57600080fd5b823561218981612156565b946020939093013593505050565b6000602082840312156121a957600080fd5b813561150381612156565b6000602082840312156121c657600080fd5b5035919050565b6000806000606084860312156121e257600080fd5b83356121ed81612156565b925060208401356121fd81612156565b929592945050506040919091013590565b6000806040838503121561222157600080fd5b50508035926020909101359150565b8035801515811461145757600080fd5b6000806040838503121561225357600080fd5b823561225e81612156565b915061226c60208401612230565b90509250929050565b60008060006040848603121561228a57600080fd5b833567ffffffffffffffff808211156122a257600080fd5b818601915086601f8301126122b657600080fd5b8135818111156122c557600080fd5b8760208260051b85010111156122da57600080fd5b6020928301955093506122f09186019050612230565b90509250925092565b6000806040838503121561230c57600080fd5b823561231781612156565b9150602083013561232781612156565b809150509250929050565b600181811c9082168061234657607f821691505b6020821081141561236757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156123d2576123d26123a2565b500290565b6000826123f457634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561240c5761240c6123a2565b500190565b60006020828403121561242357600080fd5b815161150381612156565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612458576124586123a2565b5060010190565b6040808252810183905260008460608301825b868110156124a257823561248581612156565b6001600160a01b0316825260209283019290910190600101612472565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015612552576125526123a2565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156125a75784516001600160a01b031683529383019391830191600101612582565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220670c244d267c3d789fdb4a736f9191398c885d0c62aee2a36c896cea5720215364736f6c634300080a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x60806040526004361061026b5760003560e01c80638da5cb5b11610144578063c18bc195116100b6578063d4090d2a1161007a578063d4090d2a14610758578063d85ba0631461076e578063dd62ed3e14610784578063e2f45605146107ca578063f2fde38b146107e0578063f8b45b051461080057600080fd5b8063c18bc195146106c2578063c492f046146106e2578063c8c8ebe414610702578063d0c75bc314610718578063d257b34f1461073857600080fd5b8063a6319aa711610108578063a6319aa7146105fc578063a9059cbb14610612578063afa4f3b214610632578063b62496f514610652578063bff325c314610682578063c0246668146106a257600080fd5b80638da5cb5b146105735780638e169de81461059157806395d89b41146105a75780639a7a23d6146105bc578063a457c2d7146105dc57600080fd5b80634fbee193116101dd5780636e493976116101a15780636e493976146104b257806370a08231146104d2578063715018a61461050857806371a515221461051d5780637571336a14610533578063810ae3231461055357600080fd5b80634fbee1931461041757806353b9b8f314610450578063540ba5521461046657806365b8dbc01461047c5780636a486a8e1461049c57600080fd5b8063203e727e1161022f578063203e727e1461035957806323b872dd1461037b578063313ce5671461039b57806339509351146103b75780633d9c3e91146103d757806349bd5a5e146103f757600080fd5b806306fdde0314610277578063095ea7b3146102a257806310d5de53146102d25780631694505e1461030257806318160ddd1461033a57600080fd5b3661027257005b600080fd5b34801561028357600080fd5b5061028c610816565b6040516102999190612101565b60405180910390f35b3480156102ae57600080fd5b506102c26102bd36600461216b565b6108a8565b6040519015158152602001610299565b3480156102de57600080fd5b506102c26102ed366004612197565b60166020526000908152604090205460ff1681565b34801561030e57600080fd5b50600654610322906001600160a01b031681565b6040516001600160a01b039091168152602001610299565b34801561034657600080fd5b506002545b604051908152602001610299565b34801561036557600080fd5b506103796103743660046121b4565b6108be565b005b34801561038757600080fd5b506102c26103963660046121cd565b6109a4565b3480156103a757600080fd5b5060405160128152602001610299565b3480156103c357600080fd5b506102c26103d236600461216b565b610a4e565b3480156103e357600080fd5b506103796103f236600461220e565b610a8a565b34801561040357600080fd5b50600754610322906001600160a01b031681565b34801561042357600080fd5b506102c2610432366004612197565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561045c57600080fd5b5061034b600b5481565b34801561047257600080fd5b5061034b600d5481565b34801561048857600080fd5b50610379610497366004612197565b610b01565b3480156104a857600080fd5b5061034b60105481565b3480156104be57600080fd5b506103796104cd366004612197565b610d72565b3480156104de57600080fd5b5061034b6104ed366004612197565b6001600160a01b031660009081526020819052604090205490565b34801561051457600080fd5b50610379610dbe565b34801561052957600080fd5b5061034b600e5481565b34801561053f57600080fd5b5061037961054e366004612240565b610df4565b34801561055f57600080fd5b5061037961056e366004612197565b610e49565b34801561057f57600080fd5b506005546001600160a01b0316610322565b34801561059d57600080fd5b5061034b600c5481565b3480156105b357600080fd5b5061028c610e95565b3480156105c857600080fd5b506103796105d7366004612240565b610ea4565b3480156105e857600080fd5b506102c26105f736600461216b565b610f71565b34801561060857600080fd5b5061034b60115481565b34801561061e57600080fd5b506102c261062d36600461216b565b61100a565b34801561063e57600080fd5b5061037961064d3660046121b4565b611017565b34801561065e57600080fd5b506102c261066d366004612197565b60176020526000908152604090205460ff1681565b34801561068e57600080fd5b50601454610322906001600160a01b031681565b3480156106ae57600080fd5b506103796106bd366004612240565b611046565b3480156106ce57600080fd5b506103796106dd3660046121b4565b611158565b3480156106ee57600080fd5b506103796106fd366004612275565b611229565b34801561070e57600080fd5b5061034b60085481565b34801561072457600080fd5b50601354610322906001600160a01b031681565b34801561074457600080fd5b506102c26107533660046121b4565b611305565b34801561076457600080fd5b5061034b60125481565b34801561077a57600080fd5b5061034b600f5481565b34801561079057600080fd5b5061034b61079f3660046122f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156107d657600080fd5b5061034b60095481565b3480156107ec57600080fd5b506103796107fb366004612197565b61145c565b34801561080c57600080fd5b5061034b600a5481565b60606003805461082590612332565b80601f016020809104026020016040519081016040528092919081815260200182805461085190612332565b801561089e5780601f106108735761010080835404028352916020019161089e565b820191906000526020600020905b81548152906001019060200180831161088157829003601f168201915b5050505050905090565b60006108b533848461150a565b50600192915050565b6005546001600160a01b031633146108f15760405162461bcd60e51b81526004016108e89061236d565b60405180910390fd5b670de0b6b3a76400006103e861090660025490565b6109119060016123b8565b61091b91906123d7565b61092591906123d7565b81101561098c5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084016108e8565b61099e81670de0b6b3a76400006123b8565b60085550565b60006109b184848461162e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610a365760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108e8565b610a43853385840361150a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108b5918590610a859086906123f9565b61150a565b6005546001600160a01b03163314610ab45760405162461bcd60e51b81526004016108e89061236d565b6007821115610ac257600080fd5b6007811115610ad057600080fd5b600b829055600c819055600d54610ae89083906114f7565b600f55600e54600c54610afa916114f7565b6010555050565b6005546001600160a01b03163314610b2b5760405162461bcd60e51b81526004016108e89061236d565b6006546001600160a01b0382811691161415610b9c5760405162461bcd60e51b815260206004820152602a60248201527f484f4f54593a2054686520726f7574657220616c7265616479206861732074686044820152696174206164647265737360b01b60648201526084016108e8565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa158015610c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c579190612411565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdd9190612411565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4e9190612411565b600780546001600160a01b0319166001600160a01b03929092169190911790555050565b6005546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016108e89061236d565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610de85760405162461bcd60e51b81526004016108e89061236d565b610df26000611bb7565b565b6005546001600160a01b03163314610e1e5760405162461bcd60e51b81526004016108e89061236d565b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610e735760405162461bcd60e51b81526004016108e89061236d565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461082590612332565b6005546001600160a01b03163314610ece5760405162461bcd60e51b81526004016108e89061236d565b6007546001600160a01b0383811691161415610f635760405162461bcd60e51b815260206004820152604860248201527f484f4f54593a2054686520556e695377617020706169722063616e6e6f74206260448201527f652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616064820152676b6572506169727360c01b608482015260a4016108e8565b610f6d8282611c09565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ff35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108e8565b611000338585840361150a565b5060019392505050565b60006108b533848461162e565b6005546001600160a01b031633146110415760405162461bcd60e51b81526004016108e89061236d565b600955565b6005546001600160a01b031633146110705760405162461bcd60e51b81526004016108e89061236d565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156110f95760405162461bcd60e51b815260206004820152603160248201527f484f4f54593a204163636f756e7420697320616c7265616479207468652076616044820152706c7565206f6620276578636c756465642760781b60648201526084016108e8565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146111825760405162461bcd60e51b81526004016108e89061236d565b670de0b6b3a76400006103e861119760025490565b6111a29060056123b8565b6111ac91906123d7565b6111b691906123d7565b8110156112115760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b60648201526084016108e8565b61122381670de0b6b3a76400006123b8565b600a5550565b6005546001600160a01b031633146112535760405162461bcd60e51b81526004016108e89061236d565b60005b828110156112c45781601560008686858181106112755761127561242e565b905060200201602081019061128a9190612197565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806112bc81612444565b915050611256565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516112f89392919061245f565b60405180910390a1505050565b6005546000906001600160a01b031633146113325760405162461bcd60e51b81526004016108e89061236d565b620186a061133f60025490565b61134a9060016123b8565b61135491906123d7565b8210156113c15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b60648201526084016108e8565b6103e86113cd60025490565b6113d89060056123b8565b6113e291906123d7565b82111561144e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b60648201526084016108e8565b50600981905560015b919050565b6005546001600160a01b031633146114865760405162461bcd60e51b81526004016108e89061236d565b6001600160a01b0381166114eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e8565b6114f481611bb7565b50565b600061150382846123f9565b9392505050565b6001600160a01b03831661156c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108e8565b6001600160a01b0382166115cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108e8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116545760405162461bcd60e51b81526004016108e8906124b8565b6001600160a01b03821661167a5760405162461bcd60e51b81526004016108e8906124fd565b806116905761168b83836000611cf2565b505050565b6001600160a01b03831660009081526017602052604090205460ff1680156116d157506001600160a01b03821660009081526016602052604090205460ff16155b156117b5576008548111156117465760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b60648201526084016108e8565b600a546001600160a01b03831660009081526020819052604090205461176c90836123f9565b11156117b05760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108e8565b6118f6565b6001600160a01b03821660009081526017602052604090205460ff1680156117f657506001600160a01b03831660009081526016602052604090205460ff16155b1561186c576008548111156117b05760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b60648201526084016108e8565b6001600160a01b03821660009081526016602052604090205460ff166118f657600a546001600160a01b0383166000908152602081905260409020546118b290836123f9565b11156118f65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108e8565b30600090815260208190526040902054600954811080159081906119245750600754600160a01b900460ff16155b801561194957506001600160a01b03851660009081526017602052604090205460ff16155b801561196e57506001600160a01b03851660009081526015602052604090205460ff16155b801561199357506001600160a01b03841660009081526015602052604090205460ff16155b156119c1576007805460ff60a01b1916600160a01b1790556119b3611e47565b6007805460ff60a01b191690555b6007546001600160a01b03861660009081526015602052604090205460ff600160a01b909204821615911680611a0f57506001600160a01b03851660009081526015602052604090205460ff165b15611a18575060005b60008115611ba3576001600160a01b03861660009081526017602052604090205460ff168015611a4a57506000601054115b15611ad857611a6f6064611a6960105488611f8f90919063ffffffff16565b90611f9b565b9050601054600c5482611a8291906123b8565b611a8c91906123d7565b60116000828254611a9d91906123f9565b9091555050601054600e54611ab290836123b8565b611abc91906123d7565b60126000828254611acd91906123f9565b90915550611b859050565b6001600160a01b03871660009081526017602052604090205460ff168015611b0257506000600f54115b15611b8557611b216064611a69600f5488611f8f90919063ffffffff16565b9050600f54600b5482611b3491906123b8565b611b3e91906123d7565b60116000828254611b4f91906123f9565b9091555050600f54600d54611b6490836123b8565b611b6e91906123d7565b60126000828254611b7f91906123f9565b90915550505b8015611b9657611b96873083611cf2565b611ba08186612540565b94505b611bae878787611cf2565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526017602052604090205460ff1615158115151415611c9e5760405162461bcd60e51b815260206004820152603f60248201527f484f4f54593a204175746f6d61746564206d61726b6574206d616b657220706160448201527f697220697320616c72656164792073657420746f20746861742076616c75650060648201526084016108e8565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611d185760405162461bcd60e51b81526004016108e8906124b8565b6001600160a01b038216611d3e5760405162461bcd60e51b81526004016108e8906124fd565b6001600160a01b03831660009081526020819052604090205481811015611db65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108e8565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611ded9084906123f9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e3991815260200190565b60405180910390a350505050565b3060009081526020819052604081205490506000601254601154611e6b91906123f9565b90506000821580611e7a575081155b15611e8457505050565b600954611e929060146123b8565b831115611eaa57600954611ea79060146123b8565b92505b611eb382611fa7565b60004790506000611ed384611a6960115485611f8f90919063ffffffff16565b6000601181905560128190556013546040519293506001600160a01b031691839181818185875af1925050503d8060008114611f2b576040519150601f19603f3d011682016040523d82523d6000602084013e611f30565b606091505b50506014546040519194506001600160a01b0316904790600081818185875af1925050503d8060008114611f80576040519150601f19603f3d011682016040523d82523d6000602084013e611f85565b606091505b5050505050505050565b600061150382846123b8565b600061150382846123d7565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fdc57611fdc61242e565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120599190612411565b8160018151811061206c5761206c61242e565b6001600160a01b039283166020918202929092010152600654612092913091168461150a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120cb908590600090869030904290600401612557565b600060405180830381600087803b1580156120e557600080fd5b505af11580156120f9573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b8181101561212e57858101830151858201604001528201612112565b81811115612140576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146114f457600080fd5b6000806040838503121561217e57600080fd5b823561218981612156565b946020939093013593505050565b6000602082840312156121a957600080fd5b813561150381612156565b6000602082840312156121c657600080fd5b5035919050565b6000806000606084860312156121e257600080fd5b83356121ed81612156565b925060208401356121fd81612156565b929592945050506040919091013590565b6000806040838503121561222157600080fd5b50508035926020909101359150565b8035801515811461145757600080fd5b6000806040838503121561225357600080fd5b823561225e81612156565b915061226c60208401612230565b90509250929050565b60008060006040848603121561228a57600080fd5b833567ffffffffffffffff808211156122a257600080fd5b818601915086601f8301126122b657600080fd5b8135818111156122c557600080fd5b8760208260051b85010111156122da57600080fd5b6020928301955093506122f09186019050612230565b90509250925092565b6000806040838503121561230c57600080fd5b823561231781612156565b9150602083013561232781612156565b809150509250929050565b600181811c9082168061234657607f821691505b6020821081141561236757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156123d2576123d26123a2565b500290565b6000826123f457634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561240c5761240c6123a2565b500190565b60006020828403121561242357600080fd5b815161150381612156565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612458576124586123a2565b5060010190565b6040808252810183905260008460608301825b868110156124a257823561248581612156565b6001600160a01b0316825260209283019290910190600101612472565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015612552576125526123a2565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156125a75784516001600160a01b031683529383019391830191600101612582565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220670c244d267c3d789fdb4a736f9191398c885d0c62aee2a36c896cea5720215364736f6c634300080a0033
Deployed Bytecode Sourcemap
33637:11922:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9876:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12184:210;;;;;;;;;;-1:-1:-1;12184:210:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;12184:210:0;1072:187:1;34613:63:0;;;;;;;;;;-1:-1:-1;34613:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33712:41;;;;;;;;;;-1:-1:-1;33712:41:0;;;;-1:-1:-1;;;;;33712:41:0;;;;;;-1:-1:-1;;;;;1707:32:1;;;1689:51;;1677:2;1662:18;33712:41:0;1516:230:1;10996:108:0;;;;;;;;;;-1:-1:-1;11084:12:0;;10996:108;;;1897:25:1;;;1885:2;1870:18;10996:108:0;1751:177:1;44356:275:0;;;;;;;;;;-1:-1:-1;44356:275:0;;;;;:::i;:::-;;:::i;:::-;;12876:529;;;;;;;;;;-1:-1:-1;12876:529:0;;;;;:::i;:::-;;:::i;10838:93::-;;;;;;;;;;-1:-1:-1;10838:93:0;;10921:2;2721:36:1;;2709:2;2694:18;10838:93:0;2579:184:1;13814:297:0;;;;;;;;;;-1:-1:-1;13814:297:0;;;;;:::i;:::-;;:::i;38235:405::-;;;;;;;;;;-1:-1:-1;38235:405:0;;;;;:::i;:::-;;:::i;33760:28::-;;;;;;;;;;-1:-1:-1;33760:28:0;;;;-1:-1:-1;;;;;33760:28:0;;;39335:126;;;;;;;;;;-1:-1:-1;39335:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;39425:28:0;39401:4;39425:28;;;:19;:28;;;;;;;;;39335:126;33942:34;;;;;;;;;;;;;;;;34025:32;;;;;;;;;;;;;;;;37011:536;;;;;;;;;;-1:-1:-1;37011:536:0;;;;;:::i;:::-;;:::i;34175:67::-;;;;;;;;;;;;;;;;45078:173;;;;;;;;;;-1:-1:-1;45078:173:0;;;;;:::i;:::-;;:::i;11167:177::-;;;;;;;;;;-1:-1:-1;11167:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;11318:18:0;11286:7;11318:18;;;;;;;;;;;;11167:177;2995:103;;;;;;;;;;;;;:::i;34064:33::-;;;;;;;;;;;;;;;;44903:167;;;;;;;;;;-1:-1:-1;44903:167:0;;;;;:::i;:::-;;:::i;45259:165::-;;;;;;;;;;-1:-1:-1;45259:165:0;;;;;:::i;:::-;;:::i;2344:87::-;;;;;;;;;;-1:-1:-1;2417:6:0;;-1:-1:-1;;;;;2417:6:0;2344:87;;33983:35;;;;;;;;;;;;;;;;10095:104;;;;;;;;;;;;;:::i;38648:319::-;;;;;;;;;;-1:-1:-1;38648:319:0;;;;;:::i;:::-;;:::i;14614:482::-;;;;;;;;;;-1:-1:-1;14614:482:0;;;;;:::i;:::-;;:::i;34251:27::-;;;;;;;;;;;;;;;;11557:216;;;;;;;;;;-1:-1:-1;11557:216:0;;;;;:::i;:::-;;:::i;45432:124::-;;;;;;;;;;-1:-1:-1;45432:124:0;;;;;:::i;:::-;;:::i;34834:57::-;;;;;;;;;;-1:-1:-1;34834:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34413:79;;;;;;;;;;-1:-1:-1;34413:79:0;;;;-1:-1:-1;;;;;34413:79:0;;;37555:334;;;;;;;;;;-1:-1:-1;37555:334:0;;;;;:::i;:::-;;:::i;44639:256::-;;;;;;;;;;-1:-1:-1;44639:256:0;;;;;:::i;:::-;;:::i;37897:330::-;;;;;;;;;;-1:-1:-1;37897:330:0;;;;;:::i;:::-;;:::i;33827:35::-;;;;;;;;;;;;;;;;34325:81;;;;;;;;;;-1:-1:-1;34325:81:0;;;;-1:-1:-1;;;;;34325:81:0;;;43851:497;;;;;;;;;;-1:-1:-1;43851:497:0;;;;;:::i;:::-;;:::i;34285:31::-;;;;;;;;;;;;;;;;34104:64;;;;;;;;;;;;;;;;11836:201;;;;;;;;;;-1:-1:-1;11836:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;12002:18:0;;;11970:7;12002:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11836:201;33869:33;;;;;;;;;;;;;;;;3253:238;;;;;;;;;;-1:-1:-1;3253:238:0;;;;;:::i;:::-;;:::i;33909:24::-;;;;;;;;;;;;;;;;9876:100;9930:13;9963:5;9956:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9876:100;:::o;12184:210::-;12303:4;12325:39;1072:10;12348:7;12357:6;12325:8;:39::i;:::-;-1:-1:-1;12382:4:0;12184:210;;;;:::o;44356:275::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;;;;;;;;;44493:4:::1;44485;44464:13;11084:12:::0;;;10996:108;44464:13:::1;:17;::::0;44480:1:::1;44464:17;:::i;:::-;44463:26;;;;:::i;:::-;44462:35;;;;:::i;:::-;44452:6;:45;;44430:142;;;::::0;-1:-1:-1;;;44430:142:0;;6276:2:1;44430:142:0::1;::::0;::::1;6258:21:1::0;6315:2;6295:18;;;6288:30;6354:34;6334:18;;;6327:62;-1:-1:-1;;;6405:18:1;;;6398:45;6460:19;;44430:142:0::1;6074:411:1::0;44430:142:0::1;44606:17;:6:::0;44616::::1;44606:17;:::i;:::-;44583:20;:40:::0;-1:-1:-1;44356:275:0:o;12876:529::-;13016:4;13033:36;13043:6;13051:9;13062:6;13033:9;:36::i;:::-;-1:-1:-1;;;;;13109:19:0;;13082:24;13109:19;;;:11;:19;;;;;;;;1072:10;13109:33;;;;;;;;13175:26;;;;13153:116;;;;-1:-1:-1;;;13153:116:0;;6692:2:1;13153:116:0;;;6674:21:1;6731:2;6711:18;;;6704:30;6770:34;6750:18;;;6743:62;-1:-1:-1;;;6821:18:1;;;6814:38;6869:19;;13153:116:0;6490:404:1;13153:116:0;13305:57;13314:6;1072:10;13355:6;13336:16;:25;13305:8;:57::i;:::-;-1:-1:-1;13393:4:0;;12876:529;-1:-1:-1;;;;12876:529:0:o;13814:297::-;1072:10;13929:4;14023:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14023:34:0;;;;;;;;;;13929:4;;13951:130;;14001:7;;14023:47;;14060:10;;14023:47;:::i;:::-;13951:8;:130::i;38235:405::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;38383:1:::1;38372:7;:12;;38348:37;;;::::0;::::1;;38433:1;38421:8;:13;;38396:39;;;::::0;::::1;;38446:15;:25:::0;;;38482:16:::1;:27:::0;;;38555:13:::1;::::0;38535:34:::1;::::0;38464:7;;38535:19:::1;:34::i;:::-;38520:12;:49:::0;38617:14:::1;::::0;38596:16:::1;::::0;:36:::1;::::0;:20:::1;:36::i;:::-;38580:13;:52:::0;-1:-1:-1;;38235:405:0:o;37011:536::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;37134:15:::1;::::0;-1:-1:-1;;;;;37112:38:0;;::::1;37134:15:::0;::::1;37112:38;;37090:130;;;::::0;-1:-1:-1;;;37090:130:0;;7234:2:1;37090:130:0::1;::::0;::::1;7216:21:1::0;7273:2;7253:18;;;7246:30;7312:34;7292:18;;;7285:62;-1:-1:-1;;;7363:18:1;;;7356:40;7413:19;;37090:130:0::1;7032:406:1::0;37090:130:0::1;37278:15;::::0;37236:59:::1;::::0;-1:-1:-1;;;;;37278:15:0;;::::1;::::0;37236:59;::::1;::::0;::::1;::::0;37278:15:::1;::::0;37236:59:::1;37306:15;:48:::0;;-1:-1:-1;;;;;;37306:48:0::1;-1:-1:-1::0;;;;;37306:48:0;::::1;::::0;;::::1;::::0;;;37408:25:::1;::::0;;-1:-1:-1;;;37408:25:0;;;;-1:-1:-1;;37306:48:0;37408:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;37306:48;37408:25:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37390:69:0::1;;37468:4;37475:15;;;;;;;;;-1:-1:-1::0;;;;;37475:15:0::1;-1:-1:-1::0;;;;;37475:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37390:108;::::0;-1:-1:-1;;;;;;37390:108:0::1;::::0;;;;;;-1:-1:-1;;;;;7929:15:1;;;37390:108:0::1;::::0;::::1;7911:34:1::0;7981:15;;7961:18;;;7954:43;7846:18;;37390:108:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37509:13;:30:::0;;-1:-1:-1;;;;;;37509:30:0::1;-1:-1:-1::0;;;;;37509:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;37011:536:0:o;45078:173::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;45197:21:::1;:46:::0;;-1:-1:-1;;;;;;45197:46:0::1;-1:-1:-1::0;;;;;45197:46:0;;;::::1;::::0;;;::::1;::::0;;45078:173::o;2995:103::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;3060:30:::1;3087:1;3060:18;:30::i;:::-;2995:103::o:0;44903:167::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45016:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;45016:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44903:167::o;45259:165::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;45374:19:::1;:42:::0;;-1:-1:-1;;;;;;45374:42:0::1;-1:-1:-1::0;;;;;45374:42:0;;;::::1;::::0;;;::::1;::::0;;45259:165::o;10095:104::-;10151:13;10184:7;10177:14;;;;;:::i;38648:319::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;38792:13:::1;::::0;-1:-1:-1;;;;;38784:21:0;;::::1;38792:13:::0;::::1;38784:21;;38762:143;;;::::0;-1:-1:-1;;;38762:143:0;;8210:2:1;38762:143:0::1;::::0;::::1;8192:21:1::0;8249:2;8229:18;;;8222:30;8288:34;8268:18;;;8261:62;8359:34;8339:18;;;8332:62;-1:-1:-1;;;8410:19:1;;;8403:39;8459:19;;38762:143:0::1;8008:476:1::0;38762:143:0::1;38918:41;38947:4;38953:5;38918:28;:41::i;:::-;38648:319:::0;;:::o;14614:482::-;1072:10;14734:4;14783:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14783:34:0;;;;;;;;;;14850:35;;;;14828:122;;;;-1:-1:-1;;;14828:122:0;;8691:2:1;14828:122:0;;;8673:21:1;8730:2;8710:18;;;8703:30;8769:34;8749:18;;;8742:62;-1:-1:-1;;;8820:18:1;;;8813:35;8865:19;;14828:122:0;8489:401:1;14828:122:0;14986:67;1072:10;15009:7;15037:15;15018:16;:34;14986:8;:67::i;:::-;-1:-1:-1;15084:4:0;;14614:482;-1:-1:-1;;;14614:482:0:o;11557:216::-;11679:4;11701:42;1072:10;11725:9;11736:6;11701:9;:42::i;45432:124::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;45515:18:::1;:33:::0;45432:124::o;37555:334::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37662:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;37640:139;;;::::0;-1:-1:-1;;;37640:139:0;;9097:2:1;37640:139:0::1;::::0;::::1;9079:21:1::0;9136:2;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;-1:-1:-1;;;9226:18:1;;;9219:47;9283:19;;37640:139:0::1;8895:413:1::0;37640:139:0::1;-1:-1:-1::0;;;;;37790:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;37790:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37847:34;;1212:41:1;;;37847:34:0::1;::::0;1185:18:1;37847:34:0::1;;;;;;;37555:334:::0;;:::o;44639:256::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;44779:4:::1;44771;44750:13;11084:12:::0;;;10996:108;44750:13:::1;:17;::::0;44766:1:::1;44750:17;:::i;:::-;44749:26;;;;:::i;:::-;44748:35;;;;:::i;:::-;44738:6;:45;;44716:131;;;::::0;-1:-1:-1;;;44716:131:0;;9515:2:1;44716:131:0::1;::::0;::::1;9497:21:1::0;9554:2;9534:18;;;9527:30;9593:34;9573:18;;;9566:62;-1:-1:-1;;;9644:18:1;;;9637:34;9688:19;;44716:131:0::1;9313:400:1::0;44716:131:0::1;44870:17;:6:::0;44880::::1;44870:17;:::i;:::-;44858:9;:29:::0;-1:-1:-1;44639:256:0:o;37897:330::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;38040:9:::1;38035:116;38055:19:::0;;::::1;38035:116;;;38131:8;38096:19;:32;38116:8;;38125:1;38116:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38096:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;38096:32:0;:43;;-1:-1:-1;;38096:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38076:3;::::1;::::0;::::1;:::i;:::-;;;;38035:116;;;;38168:51;38200:8;;38210;38168:51;;;;;;;;:::i;:::-;;;;;;;;37897:330:::0;;;:::o;43851:497::-;2417:6;;43959:4;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;44038:6:::1;44017:13;11084:12:::0;;;10996:108;44017:13:::1;:17;::::0;44033:1:::1;44017:17;:::i;:::-;44016:28;;;;:::i;:::-;44003:9;:41;;43981:144;;;::::0;-1:-1:-1;;;43981:144:0;;10991:2:1;43981:144:0::1;::::0;::::1;10973:21:1::0;11030:2;11010:18;;;11003:30;11069:34;11049:18;;;11042:62;-1:-1:-1;;;11120:18:1;;;11113:51;11181:19;;43981:144:0::1;10789:417:1::0;43981:144:0::1;44193:4;44172:13;11084:12:::0;;;10996:108;44172:13:::1;:17;::::0;44188:1:::1;44172:17;:::i;:::-;44171:26;;;;:::i;:::-;44158:9;:39;;44136:141;;;::::0;-1:-1:-1;;;44136:141:0;;11413:2:1;44136:141:0::1;::::0;::::1;11395:21:1::0;11452:2;11432:18;;;11425:30;11491:34;11471:18;;;11464:62;-1:-1:-1;;;11542:18:1;;;11535:50;11602:19;;44136:141:0::1;11211:416:1::0;44136:141:0::1;-1:-1:-1::0;44288:18:0::1;:30:::0;;;44336:4:::1;2635:1;43851:497:::0;;;:::o;3253:238::-;2417:6;;-1:-1:-1;;;;;2417:6:0;1072:10;2564:23;2556:68;;;;-1:-1:-1;;;2556:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3356:22:0;::::1;3334:110;;;::::0;-1:-1:-1;;;3334:110:0;;11834:2:1;3334:110:0::1;::::0;::::1;11816:21:1::0;11873:2;11853:18;;;11846:30;11912:34;11892:18;;;11885:62;-1:-1:-1;;;11963:18:1;;;11956:36;12009:19;;3334:110:0::1;11632:402:1::0;3334:110:0::1;3455:28;3474:8;3455:18;:28::i;:::-;3253:238:::0;:::o;23279:98::-;23337:7;23364:5;23368:1;23364;:5;:::i;:::-;23357:12;23279:98;-1:-1:-1;;;23279:98:0:o;18404:380::-;-1:-1:-1;;;;;18540:19:0;;18532:68;;;;-1:-1:-1;;;18532:68:0;;12241:2:1;18532:68:0;;;12223:21:1;12280:2;12260:18;;;12253:30;12319:34;12299:18;;;12292:62;-1:-1:-1;;;12370:18:1;;;12363:34;12414:19;;18532:68:0;12039:400:1;18532:68:0;-1:-1:-1;;;;;18619:21:0;;18611:68;;;;-1:-1:-1;;;18611:68:0;;12646:2:1;18611:68:0;;;12628:21:1;12685:2;12665:18;;;12658:30;12724:34;12704:18;;;12697:62;-1:-1:-1;;;12775:18:1;;;12768:32;12817:19;;18611:68:0;12444:398:1;18611:68:0;-1:-1:-1;;;;;18692:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18744:32;;1897:25:1;;;18744:32:0;;1870:18:1;18744:32:0;;;;;;;18404:380;;;:::o;39469:2840::-;-1:-1:-1;;;;;39601:18:0;;39593:68;;;;-1:-1:-1;;;39593:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39680:16:0;;39672:64;;;;-1:-1:-1;;;39672:64:0;;;;;;;:::i;:::-;39753:11;39749:93;;39781:28;39797:4;39803:2;39807:1;39781:15;:28::i;:::-;39469:2840;;;:::o;39749:93::-;-1:-1:-1;;;;;39892:31:0;;;;;;:25;:31;;;;;;;;:84;;;;-1:-1:-1;;;;;;39941:35:0;;;;;;:31;:35;;;;;;;;39940:36;39892:84;39874:833;;;40039:20;;40029:6;:30;;40003:145;;;;-1:-1:-1;;;40003:145:0;;13859:2:1;40003:145:0;;;13841:21:1;13898:2;13878:18;;;13871:30;13937:34;13917:18;;;13910:62;-1:-1:-1;;;13988:18:1;;;13981:51;14049:19;;40003:145:0;13657:417:1;40003:145:0;40197:9;;-1:-1:-1;;;;;11318:18:0;;11286:7;11318:18;;;;;;;;;;;40171:22;;:6;:22;:::i;:::-;:35;;40163:67;;;;-1:-1:-1;;;40163:67:0;;14281:2:1;40163:67:0;;;14263:21:1;14320:2;14300:18;;;14293:30;-1:-1:-1;;;14339:18:1;;;14332:49;14398:18;;40163:67:0;14079:343:1;40163:67:0;39874:833;;;-1:-1:-1;;;;;40296:29:0;;;;;;:25;:29;;;;;;;;:84;;;;-1:-1:-1;;;;;;40343:37:0;;;;;;:31;:37;;;;;;;;40342:38;40296:84;40278:429;;;40443:20;;40433:6;:30;;40407:146;;;;-1:-1:-1;;;40407:146:0;;14629:2:1;40407:146:0;;;14611:21:1;14668:2;14648:18;;;14641:30;14707:34;14687:18;;;14680:62;-1:-1:-1;;;14758:18:1;;;14751:52;14820:19;;40407:146:0;14427:418:1;40278:429:0;-1:-1:-1;;;;;40576:35:0;;;;;;:31;:35;;;;;;;;40571:136;;40662:9;;-1:-1:-1;;;;;11318:18:0;;11286:7;11318:18;;;;;;;;;;;40636:22;;:6;:22;:::i;:::-;:35;;40628:67;;;;-1:-1:-1;;;40628:67:0;;14281:2:1;40628:67:0;;;14263:21:1;14320:2;14300:18;;;14293:30;-1:-1:-1;;;14339:18:1;;;14332:49;14398:18;;40628:67:0;14079:343:1;40628:67:0;40768:4;40719:28;11318:18;;;;;;;;;;;40826;;40802:42;;;;;;;40875:33;;-1:-1:-1;40900:8:0;;-1:-1:-1;;;40900:8:0;;;;40899:9;40875:33;:82;;;;-1:-1:-1;;;;;;40926:31:0;;;;;;:25;:31;;;;;;;;40925:32;40875:82;:125;;;;-1:-1:-1;;;;;;40975:25:0;;;;;;:19;:25;;;;;;;;40974:26;40875:125;:166;;;;-1:-1:-1;;;;;;41018:23:0;;;;;;:19;:23;;;;;;;;41017:24;40875:166;40857:298;;;41068:8;:15;;-1:-1:-1;;;;41068:15:0;-1:-1:-1;;;41068:15:0;;;41100:10;:8;:10::i;:::-;41127:8;:16;;-1:-1:-1;;;;41127:16:0;;;40857:298;41183:8;;-1:-1:-1;;;;;41298:25:0;;41167:12;41298:25;;;:19;:25;;;;;;41183:8;-1:-1:-1;;;41183:8:0;;;;;41182:9;;41298:25;;:52;;-1:-1:-1;;;;;;41327:23:0;;;;;;:19;:23;;;;;;;;41298:52;41294:100;;;-1:-1:-1;41377:5:0;41294:100;41408:12;41449:7;41445:811;;;-1:-1:-1;;;;;41501:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;41550:1;41534:13;;:17;41501:50;41497:610;;;41579:34;41609:3;41579:25;41590:13;;41579:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;41572:41;;41676:13;;41656:16;;41649:4;:23;;;;:::i;:::-;41648:41;;;;:::i;:::-;41632:12;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;41754:13:0;;41736:14;;41729:21;;:4;:21;:::i;:::-;41728:39;;;;:::i;:::-;41708:16;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;41497:610:0;;-1:-1:-1;41497:610:0;;-1:-1:-1;;;;;41829:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;41879:1;41864:12;;:16;41829:51;41825:282;;;41908:33;41937:3;41908:24;41919:12;;41908:6;:10;;:24;;;;:::i;:33::-;41901:40;;42003:12;;41984:15;;41977:4;:22;;;;:::i;:::-;41976:39;;;;:::i;:::-;41960:12;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;42079:12:0;;42062:13;;42055:20;;:4;:20;:::i;:::-;42054:37;;;;:::i;:::-;42034:16;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;41825:282:0;42127:8;;42123:91;;42156:42;42172:4;42186;42193;42156:15;:42::i;:::-;42230:14;42240:4;42230:14;;:::i;:::-;;;41445:811;42268:33;42284:4;42290:2;42294:6;42268:15;:33::i;:::-;39582:2727;;;;39469:2840;;;:::o;3651:191::-;3744:6;;;-1:-1:-1;;;;;3761:17:0;;;-1:-1:-1;;;;;;3761:17:0;;;;;;;3794:40;;3744:6;;;3761:17;3744:6;;3794:40;;3725:16;;3794:40;3714:128;3651:191;:::o;38975:352::-;-1:-1:-1;;;;;39080:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;39058:153;;;;-1:-1:-1;;;39058:153:0;;15182:2:1;39058:153:0;;;15164:21:1;15221:2;15201:18;;;15194:30;15260:34;15240:18;;;15233:62;15331:33;15311:18;;;15304:61;15382:19;;39058:153:0;14980:427:1;39058:153:0;-1:-1:-1;;;;;39222:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;39222:39:0;;;;;;;;;;39279:40;;39222:39;;:31;39279:40;;;38975:352;;:::o;15586:770::-;-1:-1:-1;;;;;15726:20:0;;15718:70;;;;-1:-1:-1;;;15718:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15807:23:0;;15799:71;;;;-1:-1:-1;;;15799:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15967:17:0;;15943:21;15967:17;;;;;;;;;;;16017:23;;;;15995:111;;;;-1:-1:-1;;;15995:111:0;;15614:2:1;15995:111:0;;;15596:21:1;15653:2;15633:18;;;15626:30;15692:34;15672:18;;;15665:62;-1:-1:-1;;;15743:18:1;;;15736:36;15789:19;;15995:111:0;15412:402:1;15995:111:0;-1:-1:-1;;;;;16142:17:0;;;:9;:17;;;;;;;;;;;16162:22;;;16142:42;;16206:20;;;;;;;;:30;;16178:6;;16142:9;16206:30;;16178:6;;16206:30;:::i;:::-;;;;;;;;16271:9;-1:-1:-1;;;;;16254:35:0;16263:6;-1:-1:-1;;;;;16254:35:0;;16282:6;16254:35;;;;1897:25:1;;1885:2;1870:18;;1751:177;16254:35:0;;;;;;;;15707:649;15586:770;;;:::o;42317:867::-;42400:4;42356:23;11318:18;;;;;;;;;;;42356:50;;42417:25;42460:16;;42445:12;;:31;;;;:::i;:::-;42417:59;-1:-1:-1;42487:12:0;42516:20;;;:46;;-1:-1:-1;42540:22:0;;42516:46;42512:85;;;42579:7;;;42317:867::o;42512:85::-;42631:18;;:23;;42652:2;42631:23;:::i;:::-;42613:15;:41;42609:115;;;42689:18;;:23;;42710:2;42689:23;:::i;:::-;42671:41;;42609:115;42736:35;42753:17;42736:16;:35::i;:::-;42784:18;42805:21;42784:42;;42839:17;42859:51;42892:17;42859:28;42874:12;;42859:10;:14;;:28;;;;:::i;:51::-;42942:1;42927:12;:16;;;42954;:20;;;43009:21;;43001:57;;42839:71;;-1:-1:-1;;;;;;43009:21:0;;42839:71;;43001:57;42942:1;43001:57;42839:71;43009:21;43001:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43093:19:0;;43085:91;;42987:71;;-1:-1:-1;;;;;;43093:19:0;;43140:21;;43085:91;;;;43140:21;43093:19;43085:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;42317:867:0:o;24017:98::-;24075:7;24102:5;24106:1;24102;:5;:::i;24416:98::-;24474:7;24501:5;24505:1;24501;:5;:::i;43192:589::-;43342:16;;;43356:1;43342:16;;;;;;;;43318:21;;43342:16;;;;;;;;;;-1:-1:-1;43342:16:0;43318:40;;43387:4;43369;43374:1;43369:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43369:23:0;;;:7;;;;;;;;;;:23;;;;43413:15;;:22;;;-1:-1:-1;;;43413:22:0;;;;:15;;;;;:20;;:22;;;;;43369:7;;43413:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43403:4;43408:1;43403:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43403:32:0;;;:7;;;;;;;;;:32;43480:15;;43448:62;;43465:4;;43480:15;43498:11;43448:8;:62::i;:::-;43549:15;;:224;;-1:-1:-1;;;43549:224:0;;-1:-1:-1;;;;;43549:15:0;;;;:66;;:224;;43630:11;;43549:15;;43700:4;;43727;;43747:15;;43549:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43247:534;43192:589;:::o;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:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:247::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;1431:9;1418:23;1450:31;1475:5;1450:31;:::i;1933:180::-;1992:6;2045:2;2033:9;2024:7;2020:23;2016:32;2013:52;;;2061:1;2058;2051:12;2013:52;-1:-1:-1;2084:23:1;;1933:180;-1:-1:-1;1933:180:1:o;2118:456::-;2195:6;2203;2211;2264:2;2252:9;2243:7;2239:23;2235:32;2232:52;;;2280:1;2277;2270:12;2232:52;2319:9;2306:23;2338:31;2363:5;2338:31;:::i;:::-;2388:5;-1:-1:-1;2445:2:1;2430:18;;2417:32;2458:33;2417:32;2458:33;:::i;:::-;2118:456;;2510:7;;-1:-1:-1;;;2564:2:1;2549:18;;;;2536:32;;2118:456::o;2768:248::-;2836:6;2844;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;-1:-1:-1;;2936:23:1;;;3006:2;2991:18;;;2978:32;;-1:-1:-1;2768:248:1:o;3229:160::-;3294:20;;3350:13;;3343:21;3333:32;;3323:60;;3379:1;3376;3369:12;3394:315;3459:6;3467;3520:2;3508:9;3499:7;3495:23;3491:32;3488:52;;;3536:1;3533;3526:12;3488:52;3575:9;3562:23;3594:31;3619:5;3594:31;:::i;:::-;3644:5;-1:-1:-1;3668:35:1;3699:2;3684:18;;3668:35;:::i;:::-;3658:45;;3394:315;;;;;:::o;3714:689::-;3806:6;3814;3822;3875:2;3863:9;3854:7;3850:23;3846:32;3843:52;;;3891:1;3888;3881:12;3843:52;3931:9;3918:23;3960:18;4001:2;3993:6;3990:14;3987:34;;;4017:1;4014;4007:12;3987:34;4055:6;4044:9;4040:22;4030:32;;4100:7;4093:4;4089:2;4085:13;4081:27;4071:55;;4122:1;4119;4112:12;4071:55;4162:2;4149:16;4188:2;4180:6;4177:14;4174:34;;;4204:1;4201;4194:12;4174:34;4259:7;4252:4;4242:6;4239:1;4235:14;4231:2;4227:23;4223:34;4220:47;4217:67;;;4280:1;4277;4270:12;4217:67;4311:4;4303:13;;;;-1:-1:-1;4335:6:1;-1:-1:-1;4360:37:1;;4376:20;;;-1:-1:-1;4360:37:1;:::i;:::-;4350:47;;3714:689;;;;;:::o;4408:388::-;4476:6;4484;4537:2;4525:9;4516:7;4512:23;4508:32;4505:52;;;4553:1;4550;4543:12;4505:52;4592:9;4579:23;4611:31;4636:5;4611:31;:::i;:::-;4661:5;-1:-1:-1;4718:2:1;4703:18;;4690:32;4731:33;4690:32;4731:33;:::i;:::-;4783:7;4773:17;;;4408:388;;;;;:::o;4801:380::-;4880:1;4876:12;;;;4923;;;4944:61;;4998:4;4990:6;4986:17;4976:27;;4944:61;5051:2;5043:6;5040:14;5020:18;5017:38;5014:161;;;5097:10;5092:3;5088:20;5085:1;5078:31;5132:4;5129:1;5122:15;5160:4;5157:1;5150:15;5014:161;;4801:380;;;:::o;5186:356::-;5388:2;5370:21;;;5407:18;;;5400:30;5466:34;5461:2;5446:18;;5439:62;5533:2;5518:18;;5186:356::o;5547:127::-;5608:10;5603:3;5599:20;5596:1;5589:31;5639:4;5636:1;5629:15;5663:4;5660:1;5653:15;5679:168;5719:7;5785:1;5781;5777:6;5773:14;5770:1;5767:21;5762:1;5755:9;5748:17;5744:45;5741:71;;;5792:18;;:::i;:::-;-1:-1:-1;5832:9:1;;5679:168::o;5852:217::-;5892:1;5918;5908:132;;5962:10;5957:3;5953:20;5950:1;5943:31;5997:4;5994:1;5987:15;6025:4;6022:1;6015:15;5908:132;-1:-1:-1;6054:9:1;;5852:217::o;6899:128::-;6939:3;6970:1;6966:6;6963:1;6960:13;6957:39;;;6976:18;;:::i;:::-;-1:-1:-1;7012:9:1;;6899:128::o;7443:251::-;7513:6;7566:2;7554:9;7545:7;7541:23;7537:32;7534:52;;;7582:1;7579;7572:12;7534:52;7614:9;7608:16;7633:31;7658:5;7633:31;:::i;9718:127::-;9779:10;9774:3;9770:20;9767:1;9760:31;9810:4;9807:1;9800:15;9834:4;9831:1;9824:15;9850:135;9889:3;-1:-1:-1;;9910:17:1;;9907:43;;;9930:18;;:::i;:::-;-1:-1:-1;9977:1:1;9966:13;;9850:135::o;9990:794::-;10212:2;10224:21;;;10197:18;;10280:22;;;10164:4;10359:6;10333:2;10318:18;;10164:4;10393:304;10407:6;10404:1;10401:13;10393:304;;;10482:6;10469:20;10502:31;10527:5;10502:31;:::i;:::-;-1:-1:-1;;;;;10558:31:1;10546:44;;10613:4;10672:15;;;;10637:12;;;;10586:1;10422:9;10393:304;;;10397:3;10714;10706:11;;;;10769:6;10762:14;10755:22;10748:4;10737:9;10733:20;10726:52;9990:794;;;;;;:::o;12847:401::-;13049:2;13031:21;;;13088:2;13068:18;;;13061:30;13127:34;13122:2;13107:18;;13100:62;-1:-1:-1;;;13193:2:1;13178:18;;13171:35;13238:3;13223:19;;12847:401::o;13253:399::-;13455:2;13437:21;;;13494:2;13474:18;;;13467:30;13533:34;13528:2;13513:18;;13506:62;-1:-1:-1;;;13599:2:1;13584:18;;13577:33;13642:3;13627:19;;13253:399::o;14850:125::-;14890:4;14918:1;14915;14912:8;14909:34;;;14923:18;;:::i;:::-;-1:-1:-1;14960:9:1;;14850:125::o;16161:980::-;16423:4;16471:3;16460:9;16456:19;16502:6;16491:9;16484:25;16528:2;16566:6;16561:2;16550:9;16546:18;16539:34;16609:3;16604:2;16593:9;16589:18;16582:31;16633:6;16668;16662:13;16699:6;16691;16684:22;16737:3;16726:9;16722:19;16715:26;;16776:2;16768:6;16764:15;16750:29;;16797:1;16807:195;16821:6;16818:1;16815:13;16807:195;;;16886:13;;-1:-1:-1;;;;;16882:39:1;16870:52;;16977:15;;;;16942:12;;;;16918:1;16836:9;16807:195;;;-1:-1:-1;;;;;;;17058:32:1;;;;17053:2;17038:18;;17031:60;-1:-1:-1;;;17122:3:1;17107:19;17100:35;17019:3;16161:980;-1:-1:-1;;;16161:980:1:o
Swarm Source
ipfs://670c244d267c3d789fdb4a736f9191398c885d0c62aee2a36c896cea57202153
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.