ERC-20
Exchange
Overview
Max Total Supply
1,000,000,000 EHX
Holders
296 ( 0.338%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000837931773757237 EHXValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Token
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-07 */ /** *Submitted for verification at Etherscan.io on 2021-12-03 */ // File: token.sol // File: @openzeppelin/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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } } // File: @openzeppelin/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); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `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) { uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } _transfer(sender, recipient, 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 {} } // File: IUniswapV2Router.sol pragma solidity ^0.8.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: IUniswapV2Factory.sol pragma solidity ^0.8.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: IUniswapV2Pair.sol pragma solidity ^0.8.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: token.sol /* SPDX-License-Identifier: MIT */ pragma solidity ^0.8.0; contract Token is ERC20, Ownable { IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; address public marketingWallet; address public devWallet; address public stakingWallet; address public liquidityWallet; uint256 public marketingFee; uint256 public devFee; uint256 public stakingFee; uint256 public liquidityFee; uint256 public totalFees; bool public noBuyTax; uint256 immutable public maxTotalFees; uint256 public minAmountToSwap; bool private swapping; // Allow swapAndLiquify execution sequence bool canSwapAndLiquify = true; bool canBuyBack = true; uint256 public buyBackAmount = 10**15; address public deadAddress = 0x000000000000000000000000000000000000dEaD; // store addresses that a automatic market maker pairs. mapping (address => bool) public automatedMarketMakerPairs; // exclude from fees // useful if you need to list the token on a CEX or stake it mapping (address => bool) private _isExcludedFromFees; // exclude from fees and swapAndLiquify // Useful for bridges, or when we need to have a clean transfer mapping (address => bool) private _isExcludedFromFeesAndSwapLiquify; // events event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeFromFeesAndSwapLiquify(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet); event DevWalletUpdated(address indexed newDevWalletWallet, address indexed devWalletUpdated); event StakingWalletUpdated(address indexed newStakingWallet, address indexed stakingWalletUpdated); event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed liquidityWalletUpdated); event MarketingFeeUpdated(uint256 indexed newmarketingFee); event DevFeeUpdated(uint256 indexed newDevFee); event StakingFeeUpdated(uint256 indexed newStakingFee); event LiquidityFeeUpdated(uint256 indexed newLiquidityFee); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap { swapping = true; _; swapping = false; } constructor() ERC20("Eterna", "EHX") { marketingFee = 60; devFee = 60; stakingFee = 60; liquidityFee = 70; totalFees = marketingFee + devFee + stakingFee + liquidityFee; maxTotalFees = totalFees; minAmountToSwap = 1_000; marketingWallet = 0xe75A8bdd32aCBbF0F8EA0A31954413132Bb0F4F6; devWallet = 0xbC95F136E7FCA6FeCd1619c7561a6F4Eef9d5936; stakingWallet = 0x7203E6951f7cb4E8089bbD1e556B9E20EB21C3aD; liquidityWallet = 0x14F4366c86ec577c3daE0aDb6abeF0c13c4cfb74; IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // _mint is an internal function in ERC20.sol that is only called here, // and CANNOT be called ever again _mint(owner(), 1_000_000_000 * (10**18)); // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); // exclude from paying fees excludeFromFees(marketingWallet, true); excludeFromFees(devWallet, true); excludeFromFees(stakingWallet, true); excludeFromFees(address(this), true); } // fallback function to receive eth receive() external payable { } // This is needed if we want to change DEX, or if Uniswap goes V4 function updateUniswapV2Router(address newAddress) public onlyOwner { require(newAddress != address(uniswapV2Router), "the router already has that address"); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value, "automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeFromFeesAndSwapLiquify(address account, bool excluded) public onlyOwner { _isExcludedFromFeesAndSwapLiquify[account] = excluded; emit ExcludeFromFeesAndSwapLiquify(account, excluded); } // Update wallets function updateMarketingWallet(address newMarketingWallet) public onlyOwner { require(newMarketingWallet != marketingWallet, "the marketing wallet is already this address"); excludeFromFees(newMarketingWallet, true); emit MarketingWalletUpdated(newMarketingWallet, marketingWallet); marketingWallet = newMarketingWallet; } function updateDevWallet(address newDevWallet) public onlyOwner { require(newDevWallet != devWallet, ": The dev wallet is already this address"); excludeFromFees(newDevWallet, true); emit LiquidityWalletUpdated(newDevWallet, devWallet); devWallet = newDevWallet; } function updateStakingWallet(address newStakingWallet) public onlyOwner { require(newStakingWallet != stakingWallet, ": The liquidity wallet is already this address"); excludeFromFees(newStakingWallet, true); emit LiquidityWalletUpdated(newStakingWallet, stakingWallet); stakingWallet = newStakingWallet; } function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner { require(newLiquidityWallet != liquidityWallet, ": The liquidity wallet is already this address"); excludeFromFees(newLiquidityWallet, true); emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet); liquidityWallet = newLiquidityWallet; } function updateMarketingFee(uint256 newMarketingFee) public onlyOwner { marketingFee = newMarketingFee; totalFees = marketingFee + liquidityFee + devFee + stakingFee; require(totalFees <= maxTotalFees); emit MarketingFeeUpdated(newMarketingFee); } function updateLiquidityFee(uint256 newLiquidityFee) public onlyOwner { liquidityFee = newLiquidityFee; totalFees = marketingFee + liquidityFee + devFee + stakingFee; require(totalFees <= maxTotalFees); emit LiquidityFeeUpdated(newLiquidityFee); } function updateDevFee(uint256 newDevFee) public onlyOwner { devFee = newDevFee; totalFees = marketingFee + liquidityFee + devFee + stakingFee; require(totalFees <= maxTotalFees); emit DevFeeUpdated(newDevFee); } function updatestakingFee(uint256 newStakingFee) public onlyOwner { stakingFee = newStakingFee; totalFees = marketingFee + liquidityFee + devFee + stakingFee; require(totalFees <= maxTotalFees); emit StakingFeeUpdated(newStakingFee); } // Allows to stop the automatic swap of fees function updateCanSwapAndLiquify(bool _canSwapAndLiquify) external onlyOwner { canSwapAndLiquify = _canSwapAndLiquify; } // Allows to stop the automatic buyback of fees function updateCanBuyBack(bool _canBuyBack) external onlyOwner { canBuyBack = _canBuyBack; } function updateBuyBackAmount(uint256 _buyBackAmount) public onlyOwner { buyBackAmount = _buyBackAmount; } // Updates the minimum amount of tokens needed to swapAndLiquidify function updateMinAmountToSwap(uint256 _minAmountToSwap) external onlyOwner { minAmountToSwap = _minAmountToSwap; } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function isExcludedFromFeesAndSwapAndLiquify(address account) public view returns(bool) { return _isExcludedFromFeesAndSwapLiquify[account]; } function removeBuyTax(bool _noBuyTax) external onlyOwner { noBuyTax = _noBuyTax; } 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; } // Remove the buy tax in case we need it if(automatedMarketMakerPairs[from] && noBuyTax) { super._transfer(from, to, amount); return; } // Simple transfer from/to whitelisted addresses if(_isExcludedFromFeesAndSwapLiquify[from] || _isExcludedFromFeesAndSwapLiquify[to]) { super._transfer(from, to, amount); return; } // We don't swap if the contract is empty uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= minAmountToSwap; if( canSwap && !swapping && !automatedMarketMakerPairs[from] && from != devWallet && to != devWallet && from != marketingWallet && to != marketingWallet && from != stakingWallet && to != stakingWallet && canSwapAndLiquify ) { // We avoid a recursion loop swapping = true; uint256 tokensForLiquidity = (contractTokenBalance * liquidityFee / 2) / (totalFees); uint256 tokensForMarketing = (contractTokenBalance * marketingFee) / totalFees; uint256 tokensForDev = (contractTokenBalance * devFee) / totalFees; uint256 tokensForStaking = (contractTokenBalance * stakingFee) / totalFees; //Send tokens to the staking contract super._transfer(address(this), stakingWallet, tokensForStaking); // We swap the tokens for ETH uint256 ETHBefore = address(this).balance; uint256 tokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForDev; swapTokensForEth(tokensToSwap); uint256 EthSwapped = address(this).balance - ETHBefore; // How much did we get? // This is for math purposes uint256 swappedFees = totalFees - liquidityFee/2 - stakingFee; // Eth if we swapped all tokens uint256 hypotheticalEthBalance = (EthSwapped * totalFees) / swappedFees; // We compute the amount of Eth to send to each wallet uint256 ethForLiquidity = (hypotheticalEthBalance * liquidityFee / 2) / totalFees; uint256 ethForMarketing = hypotheticalEthBalance * marketingFee / totalFees; uint256 ethForDev = hypotheticalEthBalance * devFee / totalFees; // We use the eth addLiquidity(tokensForLiquidity, ethForLiquidity); payable(marketingWallet).transfer(ethForMarketing); payable(devWallet).transfer(ethForDev); // We resume normal operations swapping = false; } if(canBuyBack && address(this).balance > buyBackAmount * 10 && !automatedMarketMakerPairs[from] && !swapping){ buyBackTokens(buyBackAmount); } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } if(takeFee) { uint256 fees = amount*totalFees/1000; amount = amount - fees; super._transfer(from, address(this), fees); } super._transfer(from, to, amount); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable liquidityWallet, block.timestamp ); } 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 ); } function buyBackTokens(uint256 amount) private lockTheSwap{ if (amount > 0) { swapETHForTokens(amount); } } function swapETHForTokens(uint256 amount) private { // generate the unisw ap pair path of token -> weth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( 0, // accept any amount of Tokens path, deadAddress, block.timestamp ); } }
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":"uint256","name":"newDevFee","type":"uint256"}],"name":"DevFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newDevWalletWallet","type":"address"},{"indexed":true,"internalType":"address","name":"devWalletUpdated","type":"address"}],"name":"DevWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesAndSwapLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newLiquidityFee","type":"uint256"}],"name":"LiquidityFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"liquidityWalletUpdated","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newmarketingFee","type":"uint256"}],"name":"MarketingFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newStakingFee","type":"uint256"}],"name":"StakingFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newStakingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"stakingWalletUpdated","type":"address"}],"name":"StakingWalletUpdated","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":"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":"buyBackAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","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":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFeesAndSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFeesAndSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noBuyTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_noBuyTax","type":"bool"}],"name":"removeBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"_buyBackAmount","type":"uint256"}],"name":"updateBuyBackAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canBuyBack","type":"bool"}],"name":"updateCanBuyBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canSwapAndLiquify","type":"bool"}],"name":"updateCanSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDevFee","type":"uint256"}],"name":"updateDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidityFee","type":"uint256"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMarketingFee","type":"uint256"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountToSwap","type":"uint256"}],"name":"updateMinAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newStakingWallet","type":"address"}],"name":"updateStakingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStakingFee","type":"uint256"}],"name":"updatestakingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052601380546201010062ffff001990911617905566038d7ea4c68000601455601580546001600160a01b03191661dead1790553480156200004357600080fd5b5060405180604001604052806006815260200165457465726e6160d01b8152506040518060400160405280600381526020016208a90b60eb1b815250816003908051906020019062000097929190620006db565b508051620000ad906004906020840190620006db565b505050620000ca620000c4620003f660201b60201c565b620003fa565b603c600c819055600d819055600e8190556046600f81905590620000ef8180620007b3565b620000fb9190620007b3565b620001079190620007b3565b60108190556080526103e8601255600880546001600160a01b031990811673e75a8bdd32acbbf0f8ea0a31954413132bb0f4f61790915560098054821673bc95f136e7fca6fecd1619c7561a6f4eef9d5936179055600a80548216737203e6951f7cb4e8089bbd1e556b9e20eb21c3ad179055600b80549091167314f4366c86ec577c3dae0adb6abef0c13c4cfb74179055737a250d5630b4cf539739df2c5dacb4c659f2488d620001d8620001c56005546001600160a01b031690565b6b033b2e3c9fd0803ce80000006200044c565b6000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021457600080fd5b505afa15801562000229573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024f919062000781565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029857600080fd5b505afa158015620002ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d3919062000781565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200031c57600080fd5b505af115801562000331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000357919062000781565b600680546001600160a01b038086166001600160a01b031992831617909255600780549284169290911691909117905590506200039681600162000535565b600854620003af906001600160a01b0316600162000620565b600954620003c8906001600160a01b0316600162000620565b600a54620003e1906001600160a01b0316600162000620565b620003ee30600162000620565b505062000817565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004a85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620004bc9190620007b3565b90915550506001600160a01b03821660009081526020819052604081208054839290620004eb908490620007b3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03821660009081526016602052604090205460ff1615158115151415620005cc5760405162461bcd60e51b815260206004820152603860248201527f6175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084016200049f565b6001600160a01b038216600081815260166020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031633146200067c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200049f565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b828054620006e990620007da565b90600052602060002090601f0160209004810192826200070d576000855562000758565b82601f106200072857805160ff191683800117855562000758565b8280016001018555821562000758579182015b82811115620007585782518255916020019190600101906200073b565b50620007669291506200076a565b5090565b5b808211156200076657600081556001016200076b565b6000602082840312156200079457600080fd5b81516001600160a01b0381168114620007ac57600080fd5b9392505050565b60008219821115620007d557634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620007ef57607f821691505b602082108114156200081157634e487b7160e01b600052602260045260246000fd5b50919050565b60805161282c6200084f6000396000818161060901528181610ce101528181610f850152818161104a015261143a015261282c6000f3fe6080604052600436106102cd5760003560e01c80636b67c4df11610175578063a457c2d7116100dc578063d469801611610095578063edbb3b2c1161006f578063edbb3b2c14610901578063eff9884314610921578063effc501d14610937578063f2fde38b1461095757600080fd5b8063d46980161461087b578063dd62ed3e1461089b578063e37ba8f9146108e157600080fd5b8063a457c2d7146107ab578063a9059cbb146107cb578063aacebbe3146107eb578063b62496f51461080b578063c02466681461083b578063cf3828771461085b57600080fd5b80638ea5220f1161012e5780638ea5220f1461070057806395d89b411461072057806398118cb41461073557806399729ec11461074b5780639a7a23d61461076b5780639d24f4af1461078b57600080fd5b80636b67c4df1461064157806370a0823114610657578063715018a61461068d57806375f0a874146106a25780638da5cb5b146106c25780638e675663146106e057600080fd5b80632f2859c91161023457806349bd5a5e116101ed5780635e2c85ff116101c75780635e2c85ff146105b757806365b8dbc0146105d75780636763da8a146105f75780636827e7641461062b57600080fd5b806349bd5a5e1461053e5780634fbee1931461055e57806355fa6a2a1461059757600080fd5b80632f2859c914610479578063313ce567146104b257806339509351146104ce578063395e8ed0146104ee57806339e05341146105045780633e3c1ae31461052457600080fd5b806318160ddd1161028657806318160ddd146103c25780631816467f146103d75780631bae24f1146103f957806323b872dd1461041957806327c8f835146104395780632dc097901461045957600080fd5b806306ee6ad8146102d957806306fdde0314610316578063095ea7b31461033857806313114a9d1461036857806313f43a571461038c5780631694505e146103a257600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b50600a546102f9906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561032257600080fd5b5061032b610977565b60405161030d919061256e565b34801561034457600080fd5b50610358610353366004612467565b610a09565b604051901515815260200161030d565b34801561037457600080fd5b5061037e60105481565b60405190815260200161030d565b34801561039857600080fd5b5061037e60125481565b3480156103ae57600080fd5b506006546102f9906001600160a01b031681565b3480156103ce57600080fd5b5060025461037e565b3480156103e357600080fd5b506103f76103f2366004612377565b610a1f565b005b34801561040557600080fd5b506103f7610414366004612493565b610b29565b34801561042557600080fd5b506103586104343660046123f1565b610b6f565b34801561044557600080fd5b506015546102f9906001600160a01b031681565b34801561046557600080fd5b506103f76104743660046124ae565b610c17565b34801561048557600080fd5b50610358610494366004612377565b6001600160a01b031660009081526018602052604090205460ff1690565b3480156104be57600080fd5b506040516012815260200161030d565b3480156104da57600080fd5b506103586104e9366004612467565b610c46565b3480156104fa57600080fd5b5061037e60145481565b34801561051057600080fd5b506103f761051f3660046124ae565b610c82565b34801561053057600080fd5b506011546103589060ff1681565b34801561054a57600080fd5b506007546102f9906001600160a01b031681565b34801561056a57600080fd5b50610358610579366004612377565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156105a357600080fd5b506103f76105b2366004612493565b610d39565b3480156105c357600080fd5b506103f76105d2366004612432565b610d76565b3480156105e357600080fd5b506103f76105f2366004612377565b610e00565b34801561060357600080fd5b5061037e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561063757600080fd5b5061037e600d5481565b34801561064d57600080fd5b5061037e600c5481565b34801561066357600080fd5b5061037e610672366004612377565b6001600160a01b031660009081526020819052604090205490565b34801561069957600080fd5b506103f7610ef1565b3480156106ae57600080fd5b506008546102f9906001600160a01b031681565b3480156106ce57600080fd5b506005546001600160a01b03166102f9565b3480156106ec57600080fd5b506103f76106fb3660046124ae565b610f27565b34801561070c57600080fd5b506009546102f9906001600160a01b031681565b34801561072c57600080fd5b5061032b610fdd565b34801561074157600080fd5b5061037e600f5481565b34801561075757600080fd5b506103f76107663660046124ae565b610fec565b34801561077757600080fd5b506103f7610786366004612432565b6110a2565b34801561079757600080fd5b506103f76107a6366004612493565b61116c565b3480156107b757600080fd5b506103586107c6366004612467565b6111b0565b3480156107d757600080fd5b506103586107e6366004612467565b611249565b3480156107f757600080fd5b506103f7610806366004612377565b611256565b34801561081757600080fd5b50610358610826366004612377565b60166020526000908152604090205460ff1681565b34801561084757600080fd5b506103f7610856366004612432565b61135b565b34801561086757600080fd5b506103f76108763660046124ae565b6113dd565b34801561088757600080fd5b50600b546102f9906001600160a01b031681565b3480156108a757600080fd5b5061037e6108b63660046123b8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ed57600080fd5b506103f76108fc366004612377565b611492565b34801561090d57600080fd5b506103f761091c366004612377565b611552565b34801561092d57600080fd5b5061037e600e5481565b34801561094357600080fd5b506103f76109523660046124ae565b611612565b34801561096357600080fd5b506103f7610972366004612377565b611641565b6060600380546109869061277a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061277a565b80156109ff5780601f106109d4576101008083540402835291602001916109ff565b820191906000526020600020905b8154815290600101906020018083116109e257829003601f168201915b5050505050905090565b6000610a163384846116dc565b50600192915050565b6005546001600160a01b03163314610a525760405162461bcd60e51b8152600401610a4990612654565b60405180910390fd5b6009546001600160a01b0382811691161415610ac15760405162461bcd60e51b815260206004820152602860248201527f3a20546865206465762077616c6c657420697320616c72656164792074686973604482015267206164647265737360c01b6064820152608401610a49565b610acc81600161135b565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b535760405162461bcd60e51b8152600401610a4990612654565b60138054911515620100000262ff000019909216919091179055565b6001600160a01b038316600090815260016020908152604080832033845290915281205482811015610bf45760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a49565b610c0185338584036116dc565b610c0c858585611800565b506001949350505050565b6005546001600160a01b03163314610c415760405162461bcd60e51b8152600401610a4990612654565b601455565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a16918590610c7d90869061270a565b6116dc565b6005546001600160a01b03163314610cac5760405162461bcd60e51b8152600401610a4990612654565b600e819055600d54600f54600c54839291610cc69161270a565b610cd0919061270a565b610cda919061270a565b60108190557f00000000000000000000000000000000000000000000000000000000000000001015610d0b57600080fd5b60405181907f95e173ed06087159ed2a97fa9dd2dd3669417289e073faffcd5e78855e118f2590600090a250565b6005546001600160a01b03163314610d635760405162461bcd60e51b8152600401610a4990612654565b6011805460ff1916911515919091179055565b6005546001600160a01b03163314610da05760405162461bcd60e51b8152600401610a4990612654565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f3ebb562e29144718bd3df698d295d31b2b09c394ff47ecb43b1465b13619848991015b60405180910390a25050565b6005546001600160a01b03163314610e2a5760405162461bcd60e51b8152600401610a4990612654565b6006546001600160a01b0382811691161415610e945760405162461bcd60e51b815260206004820152602360248201527f74686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610a49565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f1b5760405162461bcd60e51b8152600401610a4990612654565b610f256000611d1f565b565b6005546001600160a01b03163314610f515760405162461bcd60e51b8152600401610a4990612654565b600f819055600e54600d54600c54610f6a90849061270a565b610f74919061270a565b610f7e919061270a565b60108190557f00000000000000000000000000000000000000000000000000000000000000001015610faf57600080fd5b60405181907f5597c0e02a719eddde3b801d7abc15c0023afdcf6880c1e254427559820083c290600090a250565b6060600480546109869061277a565b6005546001600160a01b031633146110165760405162461bcd60e51b8152600401610a4990612654565b600d819055600e54600f54600c54839161102f9161270a565b611039919061270a565b611043919061270a565b60108190557f0000000000000000000000000000000000000000000000000000000000000000101561107457600080fd5b60405181907fd2fcc8c801d1c6ec6267fa3420cc8428c11a8c06f0d110a700fe9ff1e731736090600090a250565b6005546001600160a01b031633146110cc5760405162461bcd60e51b8152600401610a4990612654565b6007546001600160a01b038381169116141561115e5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610a49565b6111688282611d71565b5050565b6005546001600160a01b031633146111965760405162461bcd60e51b8152600401610a4990612654565b601380549115156101000261ff0019909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156112325760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a49565b61123f33858584036116dc565b5060019392505050565b6000610a16338484611800565b6005546001600160a01b031633146112805760405162461bcd60e51b8152600401610a4990612654565b6008546001600160a01b03828116911614156112f35760405162461bcd60e51b815260206004820152602c60248201527f746865206d61726b6574696e672077616c6c657420697320616c72656164792060448201526b74686973206164647265737360a01b6064820152608401610a49565b6112fe81600161135b565b6008546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113855760405162461bcd60e51b8152600401610a4990612654565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610df4565b6005546001600160a01b031633146114075760405162461bcd60e51b8152600401610a4990612654565b600c819055600e54600d54600f5461141f908461270a565b611429919061270a565b611433919061270a565b60108190557f0000000000000000000000000000000000000000000000000000000000000000101561146457600080fd5b60405181907f92e4b8a3e1c3c0607e1f6a0102220cfeac4db4b702b24064e6aee87885885d1b90600090a250565b6005546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610a4990612654565b600b546001600160a01b03828116911614156114ea5760405162461bcd60e51b8152600401610a4990612606565b6114f581600161135b565b600b546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461157c5760405162461bcd60e51b8152600401610a4990612654565b600a546001600160a01b03828116911614156115aa5760405162461bcd60e51b8152600401610a4990612606565b6115b581600161135b565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461163c5760405162461bcd60e51b8152600401610a4990612654565b601255565b6005546001600160a01b0316331461166b5760405162461bcd60e51b8152600401610a4990612654565b6001600160a01b0381166116d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a49565b6116d981611d1f565b50565b6001600160a01b03831661173e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a49565b6001600160a01b03821661179f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a49565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118265760405162461bcd60e51b8152600401610a4990612689565b6001600160a01b03821661184c5760405162461bcd60e51b8152600401610a49906125c3565b806118625761185d83836000611e5a565b505050565b6001600160a01b03831660009081526016602052604090205460ff16801561188c575060115460ff165b1561189c5761185d838383611e5a565b6001600160a01b03831660009081526018602052604090205460ff16806118db57506001600160a01b03821660009081526018602052604090205460ff165b156118eb5761185d838383611e5a565b3060009081526020819052604090205460125481108015908190611912575060135460ff16155b801561193757506001600160a01b03851660009081526016602052604090205460ff16155b801561195157506009546001600160a01b03868116911614155b801561196b57506009546001600160a01b03858116911614155b801561198557506008546001600160a01b03868116911614155b801561199f57506008546001600160a01b03858116911614155b80156119b95750600a546001600160a01b03868116911614155b80156119d35750600a546001600160a01b03858116911614155b80156119e65750601354610100900460ff165b15611c16576013805460ff19166001179055601054600f5460009190600290611a0f9086612744565b611a199190612722565b611a239190612722565b90506000601054600c5485611a389190612744565b611a429190612722565b90506000601054600d5486611a579190612744565b611a619190612722565b90506000601054600e5487611a769190612744565b611a809190612722565b600a54909150611a9b9030906001600160a01b031683611e5a565b47600083611aa9868861270a565b611ab3919061270a565b9050611abe81611faf565b6000611aca8347612763565b90506000600e546002600f54611ae09190612722565b601054611aed9190612763565b611af79190612763565b905060008160105484611b0a9190612744565b611b149190612722565b905060006010546002600f5484611b2b9190612744565b611b359190612722565b611b3f9190612722565b90506000601054600c5484611b549190612744565b611b5e9190612722565b90506000601054600d5485611b739190612744565b611b7d9190612722565b9050611b898c84612110565b6008546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611bc3573d6000803e3d6000fd5b506009546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611bfe573d6000803e3d6000fd5b50506013805460ff1916905550505050505050505050505b60135462010000900460ff168015611c3a5750601454611c3790600a612744565b47115b8015611c5f57506001600160a01b03851660009081526016602052604090205460ff16155b8015611c6e575060135460ff16155b15611c7e57611c7e6014546121d3565b6013546001600160a01b03861660009081526017602052604090205460ff91821615911680611cc557506001600160a01b03851660009081526017602052604090205460ff165b15611cce575060005b8015611d0c5760006103e860105486611ce79190612744565b611cf19190612722565b9050611cfd8186612763565b9450611d0a873083611e5a565b505b611d17868686611e5a565b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526016602052604090205460ff1615158115151415611e065760405162461bcd60e51b815260206004820152603860248201527f6175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610a49565b6001600160a01b038216600081815260166020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611e805760405162461bcd60e51b8152600401610a4990612689565b6001600160a01b038216611ea65760405162461bcd60e51b8152600401610a49906125c3565b6001600160a01b03831660009081526020819052604090205481811015611f1e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a49565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611f5590849061270a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fa191815260200190565b60405180910390a350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fe457611fe46127cb565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561203857600080fd5b505afa15801561204c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612070919061239b565b81600181518110612083576120836127cb565b6001600160a01b0392831660209182029290920101526006546120a991309116846116dc565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120e29085906000908690309042906004016126ce565b600060405180830381600087803b1580156120fc57600080fd5b505af1158015611d17573d6000803e3d6000fd5b6006546121289030906001600160a01b0316846116dc565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561219357600080fd5b505af11580156121a7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121cc91906124c7565b5050505050565b6013805460ff1916600117905580156121ef576121ef816121fc565b506013805460ff19169055565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561226157600080fd5b505afa158015612275573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612299919061239b565b816000815181106122ac576122ac6127cb565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106122e0576122e06127cb565b6001600160a01b03928316602091820292909201015260065460155460405163b6f9de9560e01b81529183169263b6f9de9592869261232c926000928892909116904290600401612539565b6000604051808303818588803b15801561234557600080fd5b505af1158015612359573d6000803e3d6000fd5b50505050505050565b8035801515811461237257600080fd5b919050565b60006020828403121561238957600080fd5b8135612394816127e1565b9392505050565b6000602082840312156123ad57600080fd5b8151612394816127e1565b600080604083850312156123cb57600080fd5b82356123d6816127e1565b915060208301356123e6816127e1565b809150509250929050565b60008060006060848603121561240657600080fd5b8335612411816127e1565b92506020840135612421816127e1565b929592945050506040919091013590565b6000806040838503121561244557600080fd5b8235612450816127e1565b915061245e60208401612362565b90509250929050565b6000806040838503121561247a57600080fd5b8235612485816127e1565b946020939093013593505050565b6000602082840312156124a557600080fd5b61239482612362565b6000602082840312156124c057600080fd5b5035919050565b6000806000606084860312156124dc57600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b8381101561252e5781516001600160a01b031687529582019590820190600101612509565b509495945050505050565b84815260806020820152600061255260808301866124f5565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b8181101561259b5785810183015185820160400152820161257f565b818111156125ad576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602e908201527f3a20546865206c69717569646974792077616c6c657420697320616c7265616460408201526d792074686973206164647265737360901b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b85815284602082015260a0604082015260006126ed60a08301866124f5565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561271d5761271d6127b5565b500190565b60008261273f57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561275e5761275e6127b5565b500290565b600082821015612775576127756127b5565b500390565b600181811c9082168061278e57607f821691505b602082108114156127af57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146116d957600080fdfea26469706673582212208cd12d49286fbe6e113aca45fd33536e5245e66bc2a57c04a0ef29106f666db164736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102cd5760003560e01c80636b67c4df11610175578063a457c2d7116100dc578063d469801611610095578063edbb3b2c1161006f578063edbb3b2c14610901578063eff9884314610921578063effc501d14610937578063f2fde38b1461095757600080fd5b8063d46980161461087b578063dd62ed3e1461089b578063e37ba8f9146108e157600080fd5b8063a457c2d7146107ab578063a9059cbb146107cb578063aacebbe3146107eb578063b62496f51461080b578063c02466681461083b578063cf3828771461085b57600080fd5b80638ea5220f1161012e5780638ea5220f1461070057806395d89b411461072057806398118cb41461073557806399729ec11461074b5780639a7a23d61461076b5780639d24f4af1461078b57600080fd5b80636b67c4df1461064157806370a0823114610657578063715018a61461068d57806375f0a874146106a25780638da5cb5b146106c25780638e675663146106e057600080fd5b80632f2859c91161023457806349bd5a5e116101ed5780635e2c85ff116101c75780635e2c85ff146105b757806365b8dbc0146105d75780636763da8a146105f75780636827e7641461062b57600080fd5b806349bd5a5e1461053e5780634fbee1931461055e57806355fa6a2a1461059757600080fd5b80632f2859c914610479578063313ce567146104b257806339509351146104ce578063395e8ed0146104ee57806339e05341146105045780633e3c1ae31461052457600080fd5b806318160ddd1161028657806318160ddd146103c25780631816467f146103d75780631bae24f1146103f957806323b872dd1461041957806327c8f835146104395780632dc097901461045957600080fd5b806306ee6ad8146102d957806306fdde0314610316578063095ea7b31461033857806313114a9d1461036857806313f43a571461038c5780631694505e146103a257600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b50600a546102f9906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561032257600080fd5b5061032b610977565b60405161030d919061256e565b34801561034457600080fd5b50610358610353366004612467565b610a09565b604051901515815260200161030d565b34801561037457600080fd5b5061037e60105481565b60405190815260200161030d565b34801561039857600080fd5b5061037e60125481565b3480156103ae57600080fd5b506006546102f9906001600160a01b031681565b3480156103ce57600080fd5b5060025461037e565b3480156103e357600080fd5b506103f76103f2366004612377565b610a1f565b005b34801561040557600080fd5b506103f7610414366004612493565b610b29565b34801561042557600080fd5b506103586104343660046123f1565b610b6f565b34801561044557600080fd5b506015546102f9906001600160a01b031681565b34801561046557600080fd5b506103f76104743660046124ae565b610c17565b34801561048557600080fd5b50610358610494366004612377565b6001600160a01b031660009081526018602052604090205460ff1690565b3480156104be57600080fd5b506040516012815260200161030d565b3480156104da57600080fd5b506103586104e9366004612467565b610c46565b3480156104fa57600080fd5b5061037e60145481565b34801561051057600080fd5b506103f761051f3660046124ae565b610c82565b34801561053057600080fd5b506011546103589060ff1681565b34801561054a57600080fd5b506007546102f9906001600160a01b031681565b34801561056a57600080fd5b50610358610579366004612377565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156105a357600080fd5b506103f76105b2366004612493565b610d39565b3480156105c357600080fd5b506103f76105d2366004612432565b610d76565b3480156105e357600080fd5b506103f76105f2366004612377565b610e00565b34801561060357600080fd5b5061037e7f00000000000000000000000000000000000000000000000000000000000000fa81565b34801561063757600080fd5b5061037e600d5481565b34801561064d57600080fd5b5061037e600c5481565b34801561066357600080fd5b5061037e610672366004612377565b6001600160a01b031660009081526020819052604090205490565b34801561069957600080fd5b506103f7610ef1565b3480156106ae57600080fd5b506008546102f9906001600160a01b031681565b3480156106ce57600080fd5b506005546001600160a01b03166102f9565b3480156106ec57600080fd5b506103f76106fb3660046124ae565b610f27565b34801561070c57600080fd5b506009546102f9906001600160a01b031681565b34801561072c57600080fd5b5061032b610fdd565b34801561074157600080fd5b5061037e600f5481565b34801561075757600080fd5b506103f76107663660046124ae565b610fec565b34801561077757600080fd5b506103f7610786366004612432565b6110a2565b34801561079757600080fd5b506103f76107a6366004612493565b61116c565b3480156107b757600080fd5b506103586107c6366004612467565b6111b0565b3480156107d757600080fd5b506103586107e6366004612467565b611249565b3480156107f757600080fd5b506103f7610806366004612377565b611256565b34801561081757600080fd5b50610358610826366004612377565b60166020526000908152604090205460ff1681565b34801561084757600080fd5b506103f7610856366004612432565b61135b565b34801561086757600080fd5b506103f76108763660046124ae565b6113dd565b34801561088757600080fd5b50600b546102f9906001600160a01b031681565b3480156108a757600080fd5b5061037e6108b63660046123b8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ed57600080fd5b506103f76108fc366004612377565b611492565b34801561090d57600080fd5b506103f761091c366004612377565b611552565b34801561092d57600080fd5b5061037e600e5481565b34801561094357600080fd5b506103f76109523660046124ae565b611612565b34801561096357600080fd5b506103f7610972366004612377565b611641565b6060600380546109869061277a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061277a565b80156109ff5780601f106109d4576101008083540402835291602001916109ff565b820191906000526020600020905b8154815290600101906020018083116109e257829003601f168201915b5050505050905090565b6000610a163384846116dc565b50600192915050565b6005546001600160a01b03163314610a525760405162461bcd60e51b8152600401610a4990612654565b60405180910390fd5b6009546001600160a01b0382811691161415610ac15760405162461bcd60e51b815260206004820152602860248201527f3a20546865206465762077616c6c657420697320616c72656164792074686973604482015267206164647265737360c01b6064820152608401610a49565b610acc81600161135b565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b535760405162461bcd60e51b8152600401610a4990612654565b60138054911515620100000262ff000019909216919091179055565b6001600160a01b038316600090815260016020908152604080832033845290915281205482811015610bf45760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a49565b610c0185338584036116dc565b610c0c858585611800565b506001949350505050565b6005546001600160a01b03163314610c415760405162461bcd60e51b8152600401610a4990612654565b601455565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a16918590610c7d90869061270a565b6116dc565b6005546001600160a01b03163314610cac5760405162461bcd60e51b8152600401610a4990612654565b600e819055600d54600f54600c54839291610cc69161270a565b610cd0919061270a565b610cda919061270a565b60108190557f00000000000000000000000000000000000000000000000000000000000000fa1015610d0b57600080fd5b60405181907f95e173ed06087159ed2a97fa9dd2dd3669417289e073faffcd5e78855e118f2590600090a250565b6005546001600160a01b03163314610d635760405162461bcd60e51b8152600401610a4990612654565b6011805460ff1916911515919091179055565b6005546001600160a01b03163314610da05760405162461bcd60e51b8152600401610a4990612654565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f3ebb562e29144718bd3df698d295d31b2b09c394ff47ecb43b1465b13619848991015b60405180910390a25050565b6005546001600160a01b03163314610e2a5760405162461bcd60e51b8152600401610a4990612654565b6006546001600160a01b0382811691161415610e945760405162461bcd60e51b815260206004820152602360248201527f74686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610a49565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f1b5760405162461bcd60e51b8152600401610a4990612654565b610f256000611d1f565b565b6005546001600160a01b03163314610f515760405162461bcd60e51b8152600401610a4990612654565b600f819055600e54600d54600c54610f6a90849061270a565b610f74919061270a565b610f7e919061270a565b60108190557f00000000000000000000000000000000000000000000000000000000000000fa1015610faf57600080fd5b60405181907f5597c0e02a719eddde3b801d7abc15c0023afdcf6880c1e254427559820083c290600090a250565b6060600480546109869061277a565b6005546001600160a01b031633146110165760405162461bcd60e51b8152600401610a4990612654565b600d819055600e54600f54600c54839161102f9161270a565b611039919061270a565b611043919061270a565b60108190557f00000000000000000000000000000000000000000000000000000000000000fa101561107457600080fd5b60405181907fd2fcc8c801d1c6ec6267fa3420cc8428c11a8c06f0d110a700fe9ff1e731736090600090a250565b6005546001600160a01b031633146110cc5760405162461bcd60e51b8152600401610a4990612654565b6007546001600160a01b038381169116141561115e5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610a49565b6111688282611d71565b5050565b6005546001600160a01b031633146111965760405162461bcd60e51b8152600401610a4990612654565b601380549115156101000261ff0019909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156112325760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a49565b61123f33858584036116dc565b5060019392505050565b6000610a16338484611800565b6005546001600160a01b031633146112805760405162461bcd60e51b8152600401610a4990612654565b6008546001600160a01b03828116911614156112f35760405162461bcd60e51b815260206004820152602c60248201527f746865206d61726b6574696e672077616c6c657420697320616c72656164792060448201526b74686973206164647265737360a01b6064820152608401610a49565b6112fe81600161135b565b6008546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113855760405162461bcd60e51b8152600401610a4990612654565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610df4565b6005546001600160a01b031633146114075760405162461bcd60e51b8152600401610a4990612654565b600c819055600e54600d54600f5461141f908461270a565b611429919061270a565b611433919061270a565b60108190557f00000000000000000000000000000000000000000000000000000000000000fa101561146457600080fd5b60405181907f92e4b8a3e1c3c0607e1f6a0102220cfeac4db4b702b24064e6aee87885885d1b90600090a250565b6005546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610a4990612654565b600b546001600160a01b03828116911614156114ea5760405162461bcd60e51b8152600401610a4990612606565b6114f581600161135b565b600b546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461157c5760405162461bcd60e51b8152600401610a4990612654565b600a546001600160a01b03828116911614156115aa5760405162461bcd60e51b8152600401610a4990612606565b6115b581600161135b565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461163c5760405162461bcd60e51b8152600401610a4990612654565b601255565b6005546001600160a01b0316331461166b5760405162461bcd60e51b8152600401610a4990612654565b6001600160a01b0381166116d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a49565b6116d981611d1f565b50565b6001600160a01b03831661173e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a49565b6001600160a01b03821661179f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a49565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118265760405162461bcd60e51b8152600401610a4990612689565b6001600160a01b03821661184c5760405162461bcd60e51b8152600401610a49906125c3565b806118625761185d83836000611e5a565b505050565b6001600160a01b03831660009081526016602052604090205460ff16801561188c575060115460ff165b1561189c5761185d838383611e5a565b6001600160a01b03831660009081526018602052604090205460ff16806118db57506001600160a01b03821660009081526018602052604090205460ff165b156118eb5761185d838383611e5a565b3060009081526020819052604090205460125481108015908190611912575060135460ff16155b801561193757506001600160a01b03851660009081526016602052604090205460ff16155b801561195157506009546001600160a01b03868116911614155b801561196b57506009546001600160a01b03858116911614155b801561198557506008546001600160a01b03868116911614155b801561199f57506008546001600160a01b03858116911614155b80156119b95750600a546001600160a01b03868116911614155b80156119d35750600a546001600160a01b03858116911614155b80156119e65750601354610100900460ff165b15611c16576013805460ff19166001179055601054600f5460009190600290611a0f9086612744565b611a199190612722565b611a239190612722565b90506000601054600c5485611a389190612744565b611a429190612722565b90506000601054600d5486611a579190612744565b611a619190612722565b90506000601054600e5487611a769190612744565b611a809190612722565b600a54909150611a9b9030906001600160a01b031683611e5a565b47600083611aa9868861270a565b611ab3919061270a565b9050611abe81611faf565b6000611aca8347612763565b90506000600e546002600f54611ae09190612722565b601054611aed9190612763565b611af79190612763565b905060008160105484611b0a9190612744565b611b149190612722565b905060006010546002600f5484611b2b9190612744565b611b359190612722565b611b3f9190612722565b90506000601054600c5484611b549190612744565b611b5e9190612722565b90506000601054600d5485611b739190612744565b611b7d9190612722565b9050611b898c84612110565b6008546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611bc3573d6000803e3d6000fd5b506009546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611bfe573d6000803e3d6000fd5b50506013805460ff1916905550505050505050505050505b60135462010000900460ff168015611c3a5750601454611c3790600a612744565b47115b8015611c5f57506001600160a01b03851660009081526016602052604090205460ff16155b8015611c6e575060135460ff16155b15611c7e57611c7e6014546121d3565b6013546001600160a01b03861660009081526017602052604090205460ff91821615911680611cc557506001600160a01b03851660009081526017602052604090205460ff165b15611cce575060005b8015611d0c5760006103e860105486611ce79190612744565b611cf19190612722565b9050611cfd8186612763565b9450611d0a873083611e5a565b505b611d17868686611e5a565b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526016602052604090205460ff1615158115151415611e065760405162461bcd60e51b815260206004820152603860248201527f6175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610a49565b6001600160a01b038216600081815260166020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611e805760405162461bcd60e51b8152600401610a4990612689565b6001600160a01b038216611ea65760405162461bcd60e51b8152600401610a49906125c3565b6001600160a01b03831660009081526020819052604090205481811015611f1e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a49565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611f5590849061270a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fa191815260200190565b60405180910390a350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fe457611fe46127cb565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561203857600080fd5b505afa15801561204c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612070919061239b565b81600181518110612083576120836127cb565b6001600160a01b0392831660209182029290920101526006546120a991309116846116dc565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120e29085906000908690309042906004016126ce565b600060405180830381600087803b1580156120fc57600080fd5b505af1158015611d17573d6000803e3d6000fd5b6006546121289030906001600160a01b0316846116dc565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561219357600080fd5b505af11580156121a7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121cc91906124c7565b5050505050565b6013805460ff1916600117905580156121ef576121ef816121fc565b506013805460ff19169055565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561226157600080fd5b505afa158015612275573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612299919061239b565b816000815181106122ac576122ac6127cb565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106122e0576122e06127cb565b6001600160a01b03928316602091820292909201015260065460155460405163b6f9de9560e01b81529183169263b6f9de9592869261232c926000928892909116904290600401612539565b6000604051808303818588803b15801561234557600080fd5b505af1158015612359573d6000803e3d6000fd5b50505050505050565b8035801515811461237257600080fd5b919050565b60006020828403121561238957600080fd5b8135612394816127e1565b9392505050565b6000602082840312156123ad57600080fd5b8151612394816127e1565b600080604083850312156123cb57600080fd5b82356123d6816127e1565b915060208301356123e6816127e1565b809150509250929050565b60008060006060848603121561240657600080fd5b8335612411816127e1565b92506020840135612421816127e1565b929592945050506040919091013590565b6000806040838503121561244557600080fd5b8235612450816127e1565b915061245e60208401612362565b90509250929050565b6000806040838503121561247a57600080fd5b8235612485816127e1565b946020939093013593505050565b6000602082840312156124a557600080fd5b61239482612362565b6000602082840312156124c057600080fd5b5035919050565b6000806000606084860312156124dc57600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b8381101561252e5781516001600160a01b031687529582019590820190600101612509565b509495945050505050565b84815260806020820152600061255260808301866124f5565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b8181101561259b5785810183015185820160400152820161257f565b818111156125ad576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602e908201527f3a20546865206c69717569646974792077616c6c657420697320616c7265616460408201526d792074686973206164647265737360901b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b85815284602082015260a0604082015260006126ed60a08301866124f5565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561271d5761271d6127b5565b500190565b60008261273f57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561275e5761275e6127b5565b500290565b600082821015612775576127756127b5565b500390565b600181811c9082168061278e57607f821691505b602082108114156127af57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146116d957600080fdfea26469706673582212208cd12d49286fbe6e113aca45fd33536e5245e66bc2a57c04a0ef29106f666db164736f6c63430008070033
Deployed Bytecode Sourcemap
27529:14744:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27728:28;;;;;;;;;;-1:-1:-1;27728:28:0;;;;-1:-1:-1;;;;;27728:28:0;;;;;;-1:-1:-1;;;;;3492:32:1;;;3474:51;;3462:2;3447:18;27728:28:0;;;;;;;;9280:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11447:169::-;;;;;;;;;;-1:-1:-1;11447:169:0;;;;;:::i;:::-;;:::i;:::-;;;4313:14:1;;4306:22;4288:41;;4276:2;4261:18;11447:169:0;4148:187:1;27930:24:0;;;;;;;;;;;;;;;;;;;11990:25:1;;;11978:2;11963:18;27930:24:0;11844:177:1;28038:30:0;;;;;;;;;;;;;;;;27571:41;;;;;;;;;;-1:-1:-1;27571:41:0;;;;-1:-1:-1;;;;;27571:41:0;;;10400:108;;;;;;;;;;-1:-1:-1;10488:12:0;;10400:108;;33369:305;;;;;;;;;;-1:-1:-1;33369:305:0;;;;;:::i;:::-;;:::i;:::-;;35792:106;;;;;;;;;;-1:-1:-1;35792:106:0;;;;;:::i;:::-;;:::i;12098:490::-;;;;;;;;;;-1:-1:-1;12098:490:0;;;;;:::i;:::-;;:::i;28262:71::-;;;;;;;;;;-1:-1:-1;28262:71:0;;;;-1:-1:-1;;;;;28262:71:0;;;35906:119;;;;;;;;;;-1:-1:-1;35906:119:0;;;;;:::i;:::-;;:::i;36375:156::-;;;;;;;;;;-1:-1:-1;36375:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;36481:42:0;36457:4;36481:42;;;:33;:42;;;;;;;;;36375:156;10242:93;;;;;;;;;;-1:-1:-1;10242:93:0;;10325:2;12755:36:1;;12743:2;12728:18;10242:93:0;12613:184:1;12997:215:0;;;;;;;;;;-1:-1:-1;12997:215:0;;;;;:::i;:::-;;:::i;28218:37::-;;;;;;;;;;;;;;;;35262:276;;;;;;;;;;-1:-1:-1;35262:276:0;;;;;:::i;:::-;;:::i;27963:20::-;;;;;;;;;;-1:-1:-1;27963:20:0;;;;;;;;27619:28;;;;;;;;;;-1:-1:-1;27619:28:0;;;;-1:-1:-1;;;;;27619:28:0;;;36242:125;;;;;;;;;;-1:-1:-1;36242:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;36331:28:0;36307:4;36331:28;;;:19;:28;;;;;;;;;36242:125;36539:96;;;;;;;;;;-1:-1:-1;36539:96:0;;;;;:::i;:::-;;:::i;32743:224::-;;;;;;;;;;-1:-1:-1;32743:224:0;;;;;:::i;:::-;;:::i;31658:307::-;;;;;;;;;;-1:-1:-1;31658:307:0;;;;;:::i;:::-;;:::i;27992:37::-;;;;;;;;;;;;;;;27836:21;;;;;;;;;;;;;;;;27802:27;;;;;;;;;;;;;;;;10571:127;;;;;;;;;;-1:-1:-1;10571:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10672:18:0;10645:7;10672:18;;;;;;;;;;;;10571:127;2701:103;;;;;;;;;;;;;:::i;27660:30::-;;;;;;;;;;-1:-1:-1;27660:30:0;;;;-1:-1:-1;;;;;27660:30:0;;;2050:87;;;;;;;;;;-1:-1:-1;2123:6:0;;-1:-1:-1;;;;;2123:6:0;2050:87;;34706:288;;;;;;;;;;-1:-1:-1;34706:288:0;;;;;:::i;:::-;;:::i;27697:24::-;;;;;;;;;;-1:-1:-1;27697:24:0;;;;-1:-1:-1;;;;;27697:24:0;;;9499:104;;;;;;;;;;;;;:::i;27896:27::-;;;;;;;;;;;;;;;;35002:252;;;;;;;;;;-1:-1:-1;35002:252:0;;;;;:::i;:::-;;:::i;31973:256::-;;;;;;;;;;-1:-1:-1;31973:256:0;;;;;:::i;:::-;;:::i;35596:134::-;;;;;;;;;;-1:-1:-1;35596:134:0;;;;;:::i;:::-;;:::i;13715:413::-;;;;;;;;;;-1:-1:-1;13715:413:0;;;;;:::i;:::-;;:::i;10911:175::-;;;;;;;;;;-1:-1:-1;10911:175:0;;;;;:::i;:::-;;:::i;32998:363::-;;;;;;;;;;-1:-1:-1;32998:363:0;;;;;:::i;:::-;;:::i;28403:58::-;;;;;;;;;;-1:-1:-1;28403:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32553:182;;;;;;;;;;-1:-1:-1;32553:182:0;;;;;:::i;:::-;;:::i;34410:288::-;;;;;;;;;;-1:-1:-1;34410:288:0;;;;;:::i;:::-;;:::i;27763:30::-;;;;;;;;;;-1:-1:-1;27763:30:0;;;;-1:-1:-1;;;;;27763:30:0;;;11149:151;;;;;;;;;;-1:-1:-1;11149:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11265:18:0;;;11238:7;11265:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11149:151;34037:365;;;;;;;;;;-1:-1:-1;34037:365:0;;;;;:::i;:::-;;:::i;33682:347::-;;;;;;;;;;-1:-1:-1;33682:347:0;;;;;:::i;:::-;;:::i;27864:25::-;;;;;;;;;;;;;;;;36105:129;;;;;;;;;;-1:-1:-1;36105:129:0;;;;;:::i;:::-;;:::i;2959:201::-;;;;;;;;;;-1:-1:-1;2959:201:0;;;;;:::i;:::-;;:::i;9280:100::-;9334:13;9367:5;9360:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9280:100;:::o;11447:169::-;11530:4;11547:39;854:10;11570:7;11579:6;11547:8;:39::i;:::-;-1:-1:-1;11604:4:0;11447:169;;;;:::o;33369:305::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;;;;;;;;;33468:9:::1;::::0;-1:-1:-1;;;;;33452:25:0;;::::1;33468:9:::0;::::1;33452:25;;33444:78;;;::::0;-1:-1:-1;;;33444:78:0;;8833:2:1;33444:78:0::1;::::0;::::1;8815:21:1::0;8872:2;8852:18;;;8845:30;8911:34;8891:18;;;8884:62;-1:-1:-1;;;8962:18:1;;;8955:38;9010:19;;33444:78:0::1;8631:404:1::0;33444:78:0::1;33533:35;33549:12;33563:4;33533:15;:35::i;:::-;33621:9;::::0;33584:47:::1;::::0;-1:-1:-1;;;;;33621:9:0;;::::1;::::0;33584:47;::::1;::::0;::::1;::::0;33621:9:::1;::::0;33584:47:::1;33642:9;:24:::0;;-1:-1:-1;;;;;;33642:24:0::1;-1:-1:-1::0;;;;;33642:24:0;;;::::1;::::0;;;::::1;::::0;;33369:305::o;35792:106::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;35866:10:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;35866:24:0;;::::1;::::0;;;::::1;::::0;;35792:106::o;12098:490::-;-1:-1:-1;;;;;12282:19:0;;12238:4;12282:19;;;:11;:19;;;;;;;;854:10;12282:33;;;;;;;;12334:26;;;;12326:79;;;;-1:-1:-1;;;12326:79:0;;9242:2:1;12326:79:0;;;9224:21:1;9281:2;9261:18;;;9254:30;9320:34;9300:18;;;9293:62;-1:-1:-1;;;9371:18:1;;;9364:38;9419:19;;12326:79:0;9040:404:1;12326:79:0;12441:57;12450:6;854:10;12491:6;12472:16;:25;12441:8;:57::i;:::-;12520:36;12530:6;12538:9;12549:6;12520:9;:36::i;:::-;-1:-1:-1;12576:4:0;;12098:490;-1:-1:-1;;;;12098:490:0:o;35906:119::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;35987:13:::1;:30:::0;35906:119::o;12997:215::-;854:10;13085:4;13134:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13134:34:0;;;;;;;;;;13085:4;;13102:80;;13125:7;;13134:47;;13171:10;;13134:47;:::i;:::-;13102:8;:80::i;35262:276::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;35339:10:::1;:26:::0;;;35418:6:::1;::::0;35403:12:::1;::::0;35388::::1;::::0;35352:13;;35418:6;35388:27:::1;::::0;::::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;35376:9;:61:::0;;;35469:12:::1;-1:-1:-1::0;35456:25:0::1;35448:34;;;::::0;::::1;;35498:32;::::0;35516:13;;35498:32:::1;::::0;;;::::1;35262:276:::0;:::o;36539:96::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;36607:8:::1;:20:::0;;-1:-1:-1;;36607:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36539:96::o;32743:224::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32842:42:0;::::1;;::::0;;;:33:::1;:42;::::0;;;;;;;;:53;;-1:-1:-1;;32842:53:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32911:48;;4288:41:1;;;32911:48:0::1;::::0;4261:18:1;32911:48:0::1;;;;;;;;32743:224:::0;;:::o;31658:307::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;31767:15:::1;::::0;-1:-1:-1;;;;;31745:38:0;;::::1;31767:15:::0;::::1;31745:38;;31737:86;;;::::0;-1:-1:-1;;;31737:86:0;;10425:2:1;31737:86:0::1;::::0;::::1;10407:21:1::0;10464:2;10444:18;;;10437:30;10503:34;10483:18;;;10476:62;-1:-1:-1;;;10554:18:1;;;10547:33;10597:19;;31737:86:0::1;10223:399:1::0;31737:86:0::1;31881:15;::::0;31839:59:::1;::::0;-1:-1:-1;;;;;31881:15:0;;::::1;::::0;31839:59;::::1;::::0;::::1;::::0;31881:15:::1;::::0;31839:59:::1;31909:15;:48:::0;;-1:-1:-1;;;;;;31909:48:0::1;-1:-1:-1::0;;;;;31909:48:0;;;::::1;::::0;;;::::1;::::0;;31658:307::o;2701:103::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;2766:30:::1;2793:1;2766:18;:30::i;:::-;2701:103::o:0;34706:288::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;34787:12:::1;:30:::0;;;34879:10:::1;::::0;34870:6:::1;::::0;34840:12:::1;::::0;:27:::1;::::0;34802:15;;34840:27:::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;34828:9;:61:::0;;;34921:12:::1;-1:-1:-1::0;34908:25:0::1;34900:34;;;::::0;::::1;;34950:36;::::0;34970:15;;34950:36:::1;::::0;;;::::1;34706:288:::0;:::o;9499:104::-;9555:13;9588:7;9581:14;;;;;:::i;35002:252::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;35071:6:::1;:18:::0;;;35151:10:::1;::::0;35127:12:::1;::::0;35112::::1;::::0;35080:9;;35112:27:::1;::::0;::::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;35100:9;:61:::0;;;35193:12:::1;-1:-1:-1::0;35180:25:0::1;35172:34;;;::::0;::::1;;35222:24;::::0;35236:9;;35222:24:::1;::::0;;;::::1;35002:252:::0;:::o;31973:256::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;32080:13:::1;::::0;-1:-1:-1;;;;;32072:21:0;;::::1;32080:13:::0;::::1;32072:21;;32064:103;;;::::0;-1:-1:-1;;;32064:103:0;;5894:2:1;32064:103:0::1;::::0;::::1;5876:21:1::0;5933:2;5913:18;;;5906:30;5972:34;5952:18;;;5945:62;6043:34;6023:18;;;6016:62;-1:-1:-1;;;6094:19:1;;;6087:36;6140:19;;32064:103:0::1;5692:473:1::0;32064:103:0::1;32180:41;32209:4;32215:5;32180:28;:41::i;:::-;31973:256:::0;;:::o;35596:134::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;35684:17:::1;:38:::0;;;::::1;;;;-1:-1:-1::0;;35684:38:0;;::::1;::::0;;;::::1;::::0;;35596:134::o;13715:413::-;854:10;13808:4;13852:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13852:34:0;;;;;;;;;;13905:35;;;;13897:85;;;;-1:-1:-1;;;13897:85:0;;11640:2:1;13897:85:0;;;11622:21:1;11679:2;11659:18;;;11652:30;11718:34;11698:18;;;11691:62;-1:-1:-1;;;11769:18:1;;;11762:35;11814:19;;13897:85:0;11438:401:1;13897:85:0;14018:67;854:10;14041:7;14069:15;14050:16;:34;14018:8;:67::i;:::-;-1:-1:-1;14116:4:0;;13715:413;-1:-1:-1;;;13715:413:0:o;10911:175::-;10997:4;11014:42;854:10;11038:9;11049:6;11014:9;:42::i;32998:363::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;33115:15:::1;::::0;-1:-1:-1;;;;;33093:37:0;;::::1;33115:15:::0;::::1;33093:37;;33085:94;;;::::0;-1:-1:-1;;;33085:94:0;;10012:2:1;33085:94:0::1;::::0;::::1;9994:21:1::0;10051:2;10031:18;;;10024:30;10090:34;10070:18;;;10063:62;-1:-1:-1;;;10141:18:1;;;10134:42;10193:19;;33085:94:0::1;9810:408:1::0;33085:94:0::1;33190:41;33206:18;33226:4;33190:15;:41::i;:::-;33290:15;::::0;33247:59:::1;::::0;-1:-1:-1;;;;;33290:15:0;;::::1;::::0;33247:59;::::1;::::0;::::1;::::0;33290:15:::1;::::0;33247:59:::1;33317:15;:36:::0;;-1:-1:-1;;;;;;33317:36:0::1;-1:-1:-1::0;;;;;33317:36:0;;;::::1;::::0;;;::::1;::::0;;32998:363::o;32553:182::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32638:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;32638:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32693:34;;4288:41:1;;;32693:34:0::1;::::0;4261:18:1;32693:34:0::1;4148:187:1::0;34410:288:0;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;34491:12:::1;:30:::0;;;34583:10:::1;::::0;34574:6:::1;::::0;34559:12:::1;::::0;34544:27:::1;::::0;34506:15;34544:27:::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;34532:9;:61:::0;;;34625:12:::1;-1:-1:-1::0;34612:25:0::1;34604:34;;;::::0;::::1;;34654:36;::::0;34674:15;;34654:36:::1;::::0;;;::::1;34410:288:::0;:::o;34037:365::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;34154:15:::1;::::0;-1:-1:-1;;;;;34132:37:0;;::::1;34154:15:::0;::::1;34132:37;;34124:96;;;;-1:-1:-1::0;;;34124:96:0::1;;;;;;;:::i;:::-;34231:41;34247:18;34267:4;34231:15;:41::i;:::-;34331:15;::::0;34288:59:::1;::::0;-1:-1:-1;;;;;34331:15:0;;::::1;::::0;34288:59;::::1;::::0;::::1;::::0;34331:15:::1;::::0;34288:59:::1;34358:15;:36:::0;;-1:-1:-1;;;;;;34358:36:0::1;-1:-1:-1::0;;;;;34358:36:0;;;::::1;::::0;;;::::1;::::0;;34037:365::o;33682:347::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;33793:13:::1;::::0;-1:-1:-1;;;;;33773:33:0;;::::1;33793:13:::0;::::1;33773:33;;33765:92;;;;-1:-1:-1::0;;;33765:92:0::1;;;;;;;:::i;:::-;33868:39;33884:16;33902:4;33868:15;:39::i;:::-;33964:13;::::0;33923:55:::1;::::0;-1:-1:-1;;;;;33964:13:0;;::::1;::::0;33923:55;::::1;::::0;::::1;::::0;33964:13:::1;::::0;33923:55:::1;33989:13;:32:::0;;-1:-1:-1;;;;;;33989:32:0::1;-1:-1:-1::0;;;;;33989:32:0;;;::::1;::::0;;;::::1;::::0;;33682:347::o;36105:129::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;36192:15:::1;:34:::0;36105:129::o;2959:201::-;2123:6;;-1:-1:-1;;;;;2123:6:0;854:10;2270:23;2262:68;;;;-1:-1:-1;;;2262:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3048:22:0;::::1;3040:73;;;::::0;-1:-1:-1;;;3040:73:0;;6776:2:1;3040:73:0::1;::::0;::::1;6758:21:1::0;6815:2;6795:18;;;6788:30;6854:34;6834:18;;;6827:62;-1:-1:-1;;;6905:18:1;;;6898:36;6951:19;;3040:73:0::1;6574:402:1::0;3040:73:0::1;3124:28;3143:8;3124:18;:28::i;:::-;2959:201:::0;:::o;17399:380::-;-1:-1:-1;;;;;17535:19:0;;17527:68;;;;-1:-1:-1;;;17527:68:0;;11235:2:1;17527:68:0;;;11217:21:1;11274:2;11254:18;;;11247:30;11313:34;11293:18;;;11286:62;-1:-1:-1;;;11364:18:1;;;11357:34;11408:19;;17527:68:0;11033:400:1;17527:68:0;-1:-1:-1;;;;;17614:21:0;;17606:68;;;;-1:-1:-1;;;17606:68:0;;7183:2:1;17606:68:0;;;7165:21:1;7222:2;7202:18;;;7195:30;7261:34;7241:18;;;7234:62;-1:-1:-1;;;7312:18:1;;;7305:32;7354:19;;17606:68:0;6981:398:1;17606:68:0;-1:-1:-1;;;;;17687:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17739:32;;11990:25:1;;;17739:32:0;;11963:18:1;17739:32:0;;;;;;;17399:380;;;:::o;36643:3820::-;-1:-1:-1;;;;;36775:18:0;;36767:68;;;;-1:-1:-1;;;36767:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36854:16:0;;36846:64;;;;-1:-1:-1;;;36846:64:0;;;;;;;:::i;:::-;36926:11;36923:92;;36954:28;36970:4;36976:2;36980:1;36954:15;:28::i;:::-;36643:3820;;;:::o;36923:92::-;-1:-1:-1;;;;;37080:31:0;;;;;;:25;:31;;;;;;;;:43;;;;-1:-1:-1;37115:8:0;;;;37080:43;37077:129;;;37140:33;37156:4;37162:2;37166:6;37140:15;:33::i;37077:129::-;-1:-1:-1;;;;;37279:39:0;;;;;;:33;:39;;;;;;;;;:80;;-1:-1:-1;;;;;;37322:37:0;;;;;;:33;:37;;;;;;;;37279:80;37276:166;;;37376:33;37392:4;37398:2;37402:6;37376:15;:33::i;37276:166::-;37554:4;37505:28;10672:18;;;;;;;;;;;37610:15;;37586:39;;;;;;;37655:33;;-1:-1:-1;37680:8:0;;;;37679:9;37655:33;:82;;;;-1:-1:-1;;;;;;37706:31:0;;;;;;:25;:31;;;;;;;;37705:32;37655:82;:116;;;;-1:-1:-1;37762:9:0;;-1:-1:-1;;;;;37754:17:0;;;37762:9;;37754:17;;37655:116;:148;;;;-1:-1:-1;37794:9:0;;-1:-1:-1;;;;;37788:15:0;;;37794:9;;37788:15;;37655:148;:188;;;;-1:-1:-1;37828:15:0;;-1:-1:-1;;;;;37820:23:0;;;37828:15;;37820:23;;37655:188;:226;;;;-1:-1:-1;37866:15:0;;-1:-1:-1;;;;;37860:21:0;;;37866:15;;37860:21;;37655:226;:264;;;;-1:-1:-1;37906:13:0;;-1:-1:-1;;;;;37898:21:0;;;37906:13;;37898:21;;37655:264;:300;;;;-1:-1:-1;37942:13:0;;-1:-1:-1;;;;;37936:19:0;;;37942:13;;37936:19;;37655:300;:334;;;;-1:-1:-1;37972:17:0;;;;;;;37655:334;37638:2178;;;38060:8;:15;;-1:-1:-1;;38060:15:0;38071:4;38060:15;;;38178:9;;38157:12;;38060:8;;38178:9;38172:1;;38134:35;;:20;:35;:::i;:::-;:39;;;;:::i;:::-;38133:55;;;;:::i;:::-;38104:84;;38217:26;38286:9;;38270:12;;38247:20;:35;;;;:::i;:::-;38246:49;;;;:::i;:::-;38217:78;;38310:20;38367:9;;38357:6;;38334:20;:29;;;;:::i;:::-;38333:43;;;;:::i;:::-;38310:66;;38391:24;38456:9;;38442:10;;38419:20;:33;;;;:::i;:::-;38418:47;;;;:::i;:::-;38562:13;;38391:74;;-1:-1:-1;38531:63:0;;38555:4;;-1:-1:-1;;;;;38562:13:0;38391:74;38531:15;:63::i;:::-;38674:21;38654:17;38775:12;38733:39;38754:18;38733;:39;:::i;:::-;:54;;;;:::i;:::-;38710:77;;38804:30;38821:12;38804:16;:30::i;:::-;38849:18;38870:33;38894:9;38870:21;:33;:::i;:::-;38849:54;;38986:19;39037:10;;39033:1;39020:12;;:14;;;;:::i;:::-;39008:9;;:26;;;;:::i;:::-;:39;;;;:::i;:::-;38986:61;;39107:30;39167:11;39154:9;;39141:10;:22;;;;:::i;:::-;39140:38;;;;:::i;:::-;39107:71;;39261:23;39333:9;;39328:1;39313:12;;39288:22;:37;;;;:::i;:::-;:41;;;;:::i;:::-;39287:55;;;;:::i;:::-;39261:81;;39357:23;39423:9;;39408:12;;39383:22;:37;;;;:::i;:::-;:49;;;;:::i;:::-;39357:75;;39447:17;39501:9;;39492:6;;39467:22;:31;;;;:::i;:::-;:43;;;;:::i;:::-;39447:63;;39558:49;39571:18;39591:15;39558:12;:49::i;:::-;39632:15;;39624:50;;-1:-1:-1;;;;;39632:15:0;;;;39624:50;;;;;39658:15;;39632;39624:50;39632:15;39624:50;39658:15;39632;39624:50;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39697:9:0;;39689:38;;-1:-1:-1;;;;;39697:9:0;;;;39689:38;;;;;39717:9;;39697;39689:38;39697:9;39689:38;39717:9;39697;39689:38;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39788:8:0;:16;;-1:-1:-1;;39788:16:0;;;-1:-1:-1;;;;;;;;;;;37638:2178:0;39831:10;;;;;;;:56;;;;-1:-1:-1;39869:13:0;;:18;;39885:2;39869:18;:::i;:::-;39845:21;:42;39831:56;:92;;;;-1:-1:-1;;;;;;39892:31:0;;;;;;:25;:31;;;;;;;;39891:32;39831:92;:105;;;;-1:-1:-1;39928:8:0;;;;39927:9;39831:105;39828:168;;;39956:28;39970:13;;39956;:28::i;:::-;40024:8;;-1:-1:-1;;;;;40131:25:0;;40008:12;40131:25;;;:19;:25;;;;;;40024:8;;;;40023:9;;40131:25;;:52;;-1:-1:-1;;;;;;40160:23:0;;;;;;:19;:23;;;;;;;;40131:52;40128:99;;;-1:-1:-1;40210:5:0;40128:99;40242:7;40239:171;;;40266:12;40298:4;40288:9;;40281:6;:16;;;;:::i;:::-;:21;;;;:::i;:::-;40266:36;-1:-1:-1;40326:13:0;40266:36;40326:6;:13;:::i;:::-;40317:22;;40356:42;40372:4;40386;40393;40356:15;:42::i;:::-;40251:159;40239:171;40422:33;40438:4;40444:2;40448:6;40422:15;:33::i;:::-;36756:3707;;;36643:3820;;;:::o;3320:191::-;3413:6;;;-1:-1:-1;;;;;3430:17:0;;;-1:-1:-1;;;;;;3430:17:0;;;;;;;3463:40;;3413:6;;;3430:17;3413:6;;3463:40;;3394:16;;3463:40;3383:128;3320:191;:::o;32237:308::-;-1:-1:-1;;;;;32328:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;32320:109;;;;-1:-1:-1;;;32320:109:0;;8001:2:1;32320:109:0;;;7983:21:1;8040:2;8020:18;;;8013:30;8079:34;8059:18;;;8052:62;8150:26;8130:18;;;8123:54;8194:19;;32320:109:0;7799:420:1;32320:109:0;-1:-1:-1;;;;;32440:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;32440:39:0;;;;;;;;;;32497:40;;32440:39;;:31;32497:40;;;32237:308;;:::o;14618:733::-;-1:-1:-1;;;;;14758:20:0;;14750:70;;;;-1:-1:-1;;;14750:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14839:23:0;;14831:71;;;;-1:-1:-1;;;14831:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14999:17:0;;14975:21;14999:17;;;;;;;;;;;15035:23;;;;15027:74;;;;-1:-1:-1;;;15027:74:0;;8426:2:1;15027:74:0;;;8408:21:1;8465:2;8445:18;;;8438:30;8504:34;8484:18;;;8477:62;-1:-1:-1;;;8555:18:1;;;8548:36;8601:19;;15027:74:0;8224:402:1;15027:74:0;-1:-1:-1;;;;;15137:17:0;;;:9;:17;;;;;;;;;;;15157:22;;;15137:42;;15201:20;;;;;;;;:30;;15173:6;;15137:9;15201:30;;15173:6;;15201:30;:::i;:::-;;;;;;;;15266:9;-1:-1:-1;;;;;15249:35:0;15258:6;-1:-1:-1;;;;;15249:35:0;;15277:6;15249:35;;;;11990:25:1;;11978:2;11963:18;;11844:177;15249:35:0;;;;;;;;14739:612;14618:733;;;:::o;41018:591::-;41170:16;;;41184:1;41170:16;;;;;;;;41146:21;;41170:16;;;;;;;;;;-1:-1:-1;41170:16:0;41146:40;;41215:4;41197;41202:1;41197:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41197:23:0;;;:7;;;;;;;;;;:23;;;;41241:15;;:22;;;-1:-1:-1;;;41241:22:0;;;;:15;;;;;:20;;:22;;;;;41197:7;;41241:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41231:4;41236:1;41231:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41231:32:0;;;:7;;;;;;;;;:32;41308:15;;41276:62;;41293:4;;41308:15;41326:11;41276:8;:62::i;:::-;41377:15;;:224;;-1:-1:-1;;;41377:224:0;;-1:-1:-1;;;;;41377:15:0;;;;:66;;:224;;41458:11;;41377:15;;41528:4;;41555;;41575:15;;41377:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40471:539;40651:15;;40619:62;;40636:4;;-1:-1:-1;;;;;40651:15:0;40669:11;40619:8;:62::i;:::-;40732:15;;40936;;40732:260;;-1:-1:-1;;;40732:260:0;;40804:4;40732:260;;;3877:34:1;3927:18;;;3920:34;;;40732:15:0;3970:18:1;;;3963:34;;;4013:18;;;4006:34;-1:-1:-1;;;;;40936:15:0;;;4056:19:1;;;4049:44;40966:15:0;4109:19:1;;;4102:35;40732:15:0;;;:31;;40771:9;;3811:19:1;;40732:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;40471:539;;:::o;41617:143::-;29982:8;:15;;-1:-1:-1;;29982:15:0;29993:4;29982:15;;;41690:10;;41686:67:::1;;41717:24;41734:6;41717:16;:24::i;:::-;-1:-1:-1::0;30020:8:0;:16;;-1:-1:-1;;30020:16:0;;;41617:143::o;41768:498::-;41912:16;;;41926:1;41912:16;;;;;;;;41888:21;;41912:16;;;;;;;;-1:-1:-1;;41949:15:0;;:22;;;-1:-1:-1;;;41949:22:0;;;;41888:40;;-1:-1:-1;;;;;;41949:15:0;;;;:20;;-1:-1:-1;41949:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41939:4;41944:1;41939:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;41939:32:0;;;-1:-1:-1;;;;;41939:32:0;;;;;42000:4;41982;41987:1;41982:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41982:23:0;;;:7;;;;;;;;;:23;42044:15;;42206:11;;42044:214;;-1:-1:-1;;;42044:214:0;;:15;;;;:66;;42118:6;;42044:214;;:15;;42187:4;;42206:11;;;;42232:15;;42044:214;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41818:448;41768:498;:::o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;:::-;415:5;179:247;-1:-1:-1;;;179:247:1:o;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:52;;;570:1;567;560:12;522:52;602:9;596:16;621:31;646:5;621:31;:::i;687:388::-;755:6;763;816:2;804:9;795:7;791:23;787:32;784:52;;;832:1;829;822:12;784:52;871:9;858:23;890:31;915:5;890:31;:::i;:::-;940:5;-1:-1:-1;997:2:1;982:18;;969:32;1010:33;969:32;1010:33;:::i;:::-;1062:7;1052:17;;;687:388;;;;;:::o;1080:456::-;1157:6;1165;1173;1226:2;1214:9;1205:7;1201:23;1197:32;1194:52;;;1242:1;1239;1232:12;1194:52;1281:9;1268:23;1300:31;1325:5;1300:31;:::i;:::-;1350:5;-1:-1:-1;1407:2:1;1392:18;;1379:32;1420:33;1379:32;1420:33;:::i;:::-;1080:456;;1472:7;;-1:-1:-1;;;1526:2:1;1511:18;;;;1498:32;;1080:456::o;1541:315::-;1606:6;1614;1667:2;1655:9;1646:7;1642:23;1638:32;1635:52;;;1683:1;1680;1673:12;1635:52;1722:9;1709:23;1741:31;1766:5;1741:31;:::i;:::-;1791:5;-1:-1:-1;1815:35:1;1846:2;1831:18;;1815:35;:::i;:::-;1805:45;;1541:315;;;;;:::o;1861:::-;1929:6;1937;1990:2;1978:9;1969:7;1965:23;1961:32;1958:52;;;2006:1;2003;1996:12;1958:52;2045:9;2032:23;2064:31;2089:5;2064:31;:::i;:::-;2114:5;2166:2;2151:18;;;;2138:32;;-1:-1:-1;;;1861:315:1:o;2181:180::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:26;2345:9;2329:26;:::i;2366:180::-;2425:6;2478:2;2466:9;2457:7;2453:23;2449:32;2446:52;;;2494:1;2491;2484:12;2446:52;-1:-1:-1;2517:23:1;;2366:180;-1:-1:-1;2366:180:1:o;2551:306::-;2639:6;2647;2655;2708:2;2696:9;2687:7;2683:23;2679:32;2676:52;;;2724:1;2721;2714:12;2676:52;2753:9;2747:16;2737:26;;2803:2;2792:9;2788:18;2782:25;2772:35;;2847:2;2836:9;2832:18;2826:25;2816:35;;2551:306;;;;;:::o;2862:461::-;2915:3;2953:5;2947:12;2980:6;2975:3;2968:19;3006:4;3035:2;3030:3;3026:12;3019:19;;3072:2;3065:5;3061:14;3093:1;3103:195;3117:6;3114:1;3111:13;3103:195;;;3182:13;;-1:-1:-1;;;;;3178:39:1;3166:52;;3238:12;;;;3273:15;;;;3214:1;3132:9;3103:195;;;-1:-1:-1;3314:3:1;;2862:461;-1:-1:-1;;;;;2862:461:1:o;4575:510::-;4846:6;4835:9;4828:25;4889:3;4884:2;4873:9;4869:18;4862:31;4809:4;4910:57;4962:3;4951:9;4947:19;4939:6;4910:57;:::i;:::-;-1:-1:-1;;;;;5003:32:1;;;;4998:2;4983:18;;4976:60;-1:-1:-1;5067:2:1;5052:18;5045:34;4902:65;4575:510;-1:-1:-1;;4575:510:1:o;5090:597::-;5202:4;5231:2;5260;5249:9;5242:21;5292:6;5286:13;5335:6;5330:2;5319:9;5315:18;5308:34;5360:1;5370:140;5384:6;5381:1;5378:13;5370:140;;;5479:14;;;5475:23;;5469:30;5445:17;;;5464:2;5441:26;5434:66;5399:10;;5370:140;;;5528:6;5525:1;5522:13;5519:91;;;5598:1;5593:2;5584:6;5573:9;5569:22;5565:31;5558:42;5519:91;-1:-1:-1;5671:2:1;5650:15;-1:-1:-1;;5646:29:1;5631:45;;;;5678:2;5627:54;;5090:597;-1:-1:-1;;;5090:597:1:o;6170:399::-;6372:2;6354:21;;;6411:2;6391:18;;;6384:30;6450:34;6445:2;6430:18;;6423:62;-1:-1:-1;;;6516:2:1;6501:18;;6494:33;6559:3;6544:19;;6170:399::o;7384:410::-;7586:2;7568:21;;;7625:2;7605:18;;;7598:30;7664:34;7659:2;7644:18;;7637:62;-1:-1:-1;;;7730:2:1;7715:18;;7708:44;7784:3;7769:19;;7384:410::o;9449:356::-;9651:2;9633:21;;;9670:18;;;9663:30;9729:34;9724:2;9709:18;;9702:62;9796:2;9781:18;;9449:356::o;10627:401::-;10829:2;10811:21;;;10868:2;10848:18;;;10841:30;10907:34;10902:2;10887:18;;10880:62;-1:-1:-1;;;10973:2:1;10958:18;;10951:35;11018:3;11003:19;;10627:401::o;12026:582::-;12325:6;12314:9;12307:25;12368:6;12363:2;12352:9;12348:18;12341:34;12411:3;12406:2;12395:9;12391:18;12384:31;12288:4;12432:57;12484:3;12473:9;12469:19;12461:6;12432:57;:::i;:::-;-1:-1:-1;;;;;12525:32:1;;;;12520:2;12505:18;;12498:60;-1:-1:-1;12589:3:1;12574:19;12567:35;12424:65;12026:582;-1:-1:-1;;;12026:582:1:o;12802:128::-;12842:3;12873:1;12869:6;12866:1;12863:13;12860:39;;;12879:18;;:::i;:::-;-1:-1:-1;12915:9:1;;12802:128::o;12935:217::-;12975:1;13001;12991:132;;13045:10;13040:3;13036:20;13033:1;13026:31;13080:4;13077:1;13070:15;13108:4;13105:1;13098:15;12991:132;-1:-1:-1;13137:9:1;;12935:217::o;13157:168::-;13197:7;13263:1;13259;13255:6;13251:14;13248:1;13245:21;13240:1;13233:9;13226:17;13222:45;13219:71;;;13270:18;;:::i;:::-;-1:-1:-1;13310:9:1;;13157:168::o;13330:125::-;13370:4;13398:1;13395;13392:8;13389:34;;;13403:18;;:::i;:::-;-1:-1:-1;13440:9:1;;13330:125::o;13460:380::-;13539:1;13535:12;;;;13582;;;13603:61;;13657:4;13649:6;13645:17;13635:27;;13603:61;13710:2;13702:6;13699:14;13679:18;13676:38;13673:161;;;13756:10;13751:3;13747:20;13744:1;13737:31;13791:4;13788:1;13781:15;13819:4;13816:1;13809:15;13673:161;;13460:380;;;:::o;13845:127::-;13906:10;13901:3;13897:20;13894:1;13887:31;13937:4;13934:1;13927:15;13961:4;13958:1;13951:15;13977:127;14038:10;14033:3;14029:20;14026:1;14019:31;14069:4;14066:1;14059:15;14093:4;14090:1;14083:15;14241:131;-1:-1:-1;;;;;14316:31:1;;14306:42;;14296:70;;14362:1;14359;14352:12
Swarm Source
ipfs://8cd12d49286fbe6e113aca45fd33536e5245e66bc2a57c04a0ef29106f666db1
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.