ERC-20
Overview
Max Total Supply
100,000,000 ApeIn
Holders
99
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
0.19 ApeInValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ApeIntelligence
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.17; interface IUniswapRouter01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapRouter02 is IUniswapRouter01 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } interface IFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function createPair(address tokenA, address tokenB) external returns (address pair); } abstract contract Context { //function _msgSender() internal view virtual returns (address payable) { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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); } } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } 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); } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( msg.sender, spender, allowance(msg.sender, 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 = allowance(msg.sender, spender); require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(msg.sender, 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } interface IUniswapV2Pair { function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); } contract ApeIntelligence is ERC20, Ownable { address payable public marketingFeeAddress; address payable public devFeeAddress; mapping(address => bool) public isExcludedFromFee; uint16 public buyLiquidityFee = 10; uint16 public buyMarketingFee = 35; uint16 public buyDevFee = 5; uint16 public sellLiquidityFee = 100; uint16 public sellMarketingFee = 600; uint16 public sellDevFee = 299; uint256 private _liquidityTokensToSwap; uint256 private _marketingFeeTokensToSwap; uint256 private _devFeeTokens; uint256 private lpTokens; address deployer; mapping(address => bool) public automatedMarketMakerPairs; mapping(address => bool) public botWallet; uint256 public minLpBeforeSwapping; IUniswapRouter02 public immutable uniswapRouter; address public immutable uniswapPair; bool inSwapAndLiquify; uint256 public maxWallet; modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } // for handling stuck eth/tokens on the contract after renouncing ownership modifier onlyDeployer() { require(msg.sender == deployer, "You are not the deployer"); _; } constructor() ERC20("Ape Intelligence", "ApeIn") { uint256 startingSupply = 1e8 * 10**decimals(); // 1e8 = 8 zeroes, which is 100,000,000 _mint(msg.sender, startingSupply); maxWallet = startingSupply / 100; // 1% of total supply marketingFeeAddress = payable( 0x63fE8B48e2b050a54B7B31c1DA7071BaEB35b40E ); devFeeAddress = payable(0x0fb9A6A9df829f9c107Fad679dF6E90504032602); minLpBeforeSwapping = 100; // this means: 100 / 10000 = 1% of the liquidity pool is the threshold before swapping // uniswap v2 router address routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; uniswapRouter = IUniswapRouter02(payable(routerAddress)); uniswapPair = IFactory(uniswapRouter.factory()).createPair( address(this), uniswapRouter.WETH() ); isExcludedFromFee[msg.sender] = true; isExcludedFromFee[address(this)] = true; isExcludedFromFee[marketingFeeAddress] = true; isExcludedFromFee[devFeeAddress] = true; isExcludedFromFee[routerAddress] = true; deployer = msg.sender; _approve(msg.sender, routerAddress, ~uint256(0)); _setAutomatedMarketMakerPair(uniswapPair, true); _approve(address(this), address(uniswapRouter), type(uint256).max); } function decimals() public pure override returns (uint8) { return 9; } function addBotWallet(address wallet) external onlyOwner { require(!botWallet[wallet], "Wallet already added"); botWallet[wallet] = true; } function addBotWalletBulk(address[] calldata wallets) external onlyOwner { for (uint256 i = 0; i < wallets.length; i++) { botWallet[wallets[i]] = true; } } function removeBotWallet(address wallet) external onlyOwner { require(botWallet[wallet], "Wallet not added"); botWallet[wallet] = false; } function updateMaxWallet(uint256 maxWallet_) external onlyOwner { maxWallet = maxWallet_; } function burn(uint256 amount) external { _burn(msg.sender, amount); } function updateMinLpBeforeSwapping(uint256 minLpBeforeSwapping_) external onlyOwner { minLpBeforeSwapping = minLpBeforeSwapping_; } function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner { require(pair != uniswapPair, "The pair cannot be removed"); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; } function excludeFromFee(address account) external onlyOwner { isExcludedFromFee[account] = true; } function includeInFee(address account) external onlyOwner { isExcludedFromFee[account] = false; } function updateBuyFee( uint16 _buyLiquidityFee, uint16 _buyMarketingFee, uint16 _buyDevFee ) external onlyOwner { buyLiquidityFee = _buyLiquidityFee; buyMarketingFee = _buyMarketingFee; buyDevFee = _buyDevFee; } function updateSellFee( uint16 _sellLiquidityFee, uint16 _sellMarketingFee, uint16 _sellDevFee ) external onlyOwner { sellLiquidityFee = _sellLiquidityFee; sellMarketingFee = _sellMarketingFee; sellDevFee = _sellDevFee; } function updateMarketingAddress(address marketingFeeAddress_) external onlyOwner { require(marketingFeeAddress_ != address(0), "Can't set 0"); marketingFeeAddress = payable(marketingFeeAddress_); } function updateDevAddress(address devFeeAddress_) external onlyOwner { require(devFeeAddress_ != address(0), "Can't set 0"); devFeeAddress = payable(devFeeAddress_); } function _transfer( address from, address to, uint256 amount ) internal override { require(!botWallet[from] && !botWallet[to], "Bot wallet"); checkLiquidity(); if ( hasLiquidity && !inSwapAndLiquify && automatedMarketMakerPairs[to] ) { uint256 contractTokenBalance = balanceOf(address(this)); uint256 threshold = (lpTokens * minLpBeforeSwapping) / 10000; if (contractTokenBalance >= threshold) takeFee(threshold); } uint256 _liquidityFee; uint256 _marketingFee; uint256 _devFee; if (!isExcludedFromFee[from] && !isExcludedFromFee[to]) { // Buy if (automatedMarketMakerPairs[from]) { _liquidityFee = (amount * buyLiquidityFee) / 1000; _marketingFee = (amount * buyMarketingFee) / 1000; _devFee = (amount * buyDevFee) / 1000; require( balanceOf(to) + amount <= maxWallet, "Amount exceeds maxWallet" ); } // Sell else if (automatedMarketMakerPairs[to]) { _liquidityFee = (amount * sellLiquidityFee) / 1000; _marketingFee = (amount * sellMarketingFee) / 1000; _devFee = (amount * sellDevFee) / 1000; } else { require( balanceOf(to) + amount <= maxWallet, "Amount exceeds maxWallet" ); } } uint256 _feeTotal = _liquidityFee + _marketingFee + _devFee; uint256 _transferAmount = amount - _feeTotal; super._transfer(from, to, _transferAmount); if (_feeTotal > 0) { super._transfer(from, address(this), _feeTotal); _liquidityTokensToSwap += _liquidityFee; _marketingFeeTokensToSwap += _marketingFee; _devFeeTokens += _devFee; } } function takeFee(uint256 tokenAmount) private lockTheSwap { uint256 totalTokensTaken = _liquidityTokensToSwap + _marketingFeeTokensToSwap + _devFeeTokens; if (totalTokensTaken == 0) { return; } uint256 tokensForLiquidity = tokenAmount * (_liquidityTokensToSwap / 2) / totalTokensTaken; uint256 initialETHBalance = address(this).balance; uint256 toSwap = tokenAmount - tokensForLiquidity; swapTokensForETH(toSwap); uint256 ethBalance = address(this).balance - initialETHBalance; uint256 ethForMarketing = ethBalance * _marketingFeeTokensToSwap / totalTokensTaken; uint256 ethForDev = ethBalance * _devFeeTokens / totalTokensTaken; uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev; if (tokensForLiquidity > 0 && ethForLiquidity > 0) { addLiquidity(tokensForLiquidity, ethForLiquidity); } bool success; (success, ) = address(marketingFeeAddress).call{ value: ethForMarketing, gas: 30000 }(""); (success, ) = address(devFeeAddress).call{ value: ethForDev, gas: 30000 }(""); uint256 lpPart = tokenAmount * _liquidityTokensToSwap / totalTokensTaken; uint256 marketingPart = tokenAmount * _marketingFeeTokensToSwap / totalTokensTaken; uint256 devPart = tokenAmount - lpPart - marketingPart; _liquidityTokensToSwap -= lpPart > _liquidityTokensToSwap ? _liquidityTokensToSwap : lpPart; _marketingFeeTokensToSwap -= marketingPart > _marketingFeeTokensToSwap ? _marketingFeeTokensToSwap : marketingPart; _devFeeTokens -= devPart > _devFeeTokens ? _devFeeTokens : devPart; } function swapTokensForETH(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapRouter.WETH(); uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { uniswapRouter.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, 0, deployer, block.timestamp ); } receive() external payable {} bool private hasLiquidity; function checkLiquidity() internal { (uint256 r1, uint256 r2, ) = IUniswapV2Pair(uniswapPair).getReserves(); lpTokens = balanceOf(uniswapPair); hasLiquidity = r1 > 0 && r2 > 0 ? true : false; } function withdrawETH() external onlyDeployer { payable(owner()).transfer(address(this).balance); } function withdrawTokens(IERC20 tokenAddress, address walletAddress) external onlyDeployer { require( walletAddress != address(0), "walletAddress can't be 0 address" ); SafeERC20.safeTransfer( tokenAddress, walletAddress, tokenAddress.balanceOf(address(this)) ); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addBotWalletBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"botWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"devFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","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":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLpBeforeSwapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyDevFee","type":"uint16"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devFeeAddress_","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingFeeAddress_","type":"address"}],"name":"updateMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallet_","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minLpBeforeSwapping_","type":"uint256"}],"name":"updateMinLpBeforeSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_sellDevFee","type":"uint16"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052600a600960006101000a81548161ffff021916908361ffff1602179055506023600960026101000a81548161ffff021916908361ffff1602179055506005600960046101000a81548161ffff021916908361ffff1602179055506064600960066101000a81548161ffff021916908361ffff160217905550610258600960086101000a81548161ffff021916908361ffff16021790555061012b6009600a6101000a81548161ffff021916908361ffff160217905550348015620000c757600080fd5b506040518060400160405280601081526020017f41706520496e74656c6c6967656e6365000000000000000000000000000000008152506040518060400160405280600581526020017f417065496e000000000000000000000000000000000000000000000000000000815250816003908162000145919062000e12565b50806004908162000157919062000e12565b5050506200017a6200016e6200071360201b60201c565b6200071b60201b60201c565b60006200018c620007e160201b60201c565b600a6200019a919062001089565b6305f5e100620001ab9190620010da565b9050620001bf3382620007ea60201b60201c565b606481620001ce919062001154565b6013819055507363fe8b48e2b050a54b7b31c1da7071baeb35b40e600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730fb9a6a9df829f9c107fad679df6e90504032602600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060646011819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003479190620011f6565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d79190620011f6565b6040518363ffffffff1660e01b8152600401620003f692919062001239565b6020604051808303816000875af115801562000416573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043c9190620011f6565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006c133826000196200096260201b60201c565b620006d660a051600162000b3360201b60201c565b6200070b306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200096260201b60201c565b505062001482565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200085c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200085390620012c7565b60405180910390fd5b620008706000838362000b8e60201b60201c565b8060026000828254620008849190620012e9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008db9190620012e9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000942919062001335565b60405180910390a36200095e6000838362000b9360201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620009d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009cb90620013c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a3d9062001460565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000b26919062001335565b60405180910390a3505050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c1a57607f821691505b60208210810362000c305762000c2f62000bd2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c9a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c5b565b62000ca6868362000c5b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cf362000ced62000ce78462000cbe565b62000cc8565b62000cbe565b9050919050565b6000819050919050565b62000d0f8362000cd2565b62000d2762000d1e8262000cfa565b84845462000c68565b825550505050565b600090565b62000d3e62000d2f565b62000d4b81848462000d04565b505050565b5b8181101562000d735762000d6760008262000d34565b60018101905062000d51565b5050565b601f82111562000dc25762000d8c8162000c36565b62000d978462000c4b565b8101602085101562000da7578190505b62000dbf62000db68562000c4b565b83018262000d50565b50505b505050565b600082821c905092915050565b600062000de76000198460080262000dc7565b1980831691505092915050565b600062000e02838362000dd4565b9150826002028217905092915050565b62000e1d8262000b98565b67ffffffffffffffff81111562000e395762000e3862000ba3565b5b62000e45825462000c01565b62000e5282828562000d77565b600060209050601f83116001811462000e8a576000841562000e75578287015190505b62000e81858262000df4565b86555062000ef1565b601f19841662000e9a8662000c36565b60005b8281101562000ec45784890151825560018201915060208501945060208101905062000e9d565b8683101562000ee4578489015162000ee0601f89168262000dd4565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000f875780860481111562000f5f5762000f5e62000ef9565b5b600185161562000f6f5780820291505b808102905062000f7f8562000f28565b945062000f3f565b94509492505050565b60008262000fa2576001905062001075565b8162000fb2576000905062001075565b816001811462000fcb576002811462000fd6576200100c565b600191505062001075565b60ff84111562000feb5762000fea62000ef9565b5b8360020a91508482111562001005576200100462000ef9565b5b5062001075565b5060208310610133831016604e8410600b8410161715620010465782820a90508381111562001040576200103f62000ef9565b5b62001075565b62001055848484600162000f35565b925090508184048111156200106f576200106e62000ef9565b5b81810290505b9392505050565b600060ff82169050919050565b6000620010968262000cbe565b9150620010a3836200107c565b9250620010d27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000f90565b905092915050565b6000620010e78262000cbe565b9150620010f48362000cbe565b9250828202620011048162000cbe565b915082820484148315176200111e576200111d62000ef9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620011618262000cbe565b91506200116e8362000cbe565b92508262001181576200118062001125565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620011be8262001191565b9050919050565b620011d081620011b1565b8114620011dc57600080fd5b50565b600081519050620011f081620011c5565b92915050565b6000602082840312156200120f576200120e6200118c565b5b60006200121f84828501620011df565b91505092915050565b6200123381620011b1565b82525050565b600060408201905062001250600083018562001228565b6200125f602083018462001228565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620012af601f8362001266565b9150620012bc8262001277565b602082019050919050565b60006020820190508181036000830152620012e281620012a0565b9050919050565b6000620012f68262000cbe565b9150620013038362000cbe565b92508282019050808211156200131e576200131d62000ef9565b5b92915050565b6200132f8162000cbe565b82525050565b60006020820190506200134c600083018462001324565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000620013b060248362001266565b9150620013bd8262001352565b604082019050919050565b60006020820190508181036000830152620013e381620013a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200144860228362001266565b91506200145582620013ea565b604082019050919050565b600060208201905081810360008301526200147b8162001439565b9050919050565b60805160a051614e44620014d2600039600081816117e101528181611b13015281816129f60152612aad0152600081816114a8015281816132400152818161331d01526133b50152614e446000f3fe60806040526004361061026b5760003560e01c80638503376211610144578063b62496f5116100b6578063e086e5ec1161007a578063e086e5ec1461095f578063ea2f0b3714610976578063f11a24d31461099f578063f2fde38b146109ca578063f6374342146109f3578063f8b45b0514610a1e57610272565b8063b62496f514610864578063c0907099146108a1578063c816841b146108cc578063dbf1cd13146108f7578063dd62ed3e1461092257610272565b80639c3b4fdc116101085780639c3b4fdc1461072e5780639cbc1ad614610759578063a0d82dc514610796578063a457c2d7146107c1578063a522ad25146107fe578063a9059cbb1461082757610272565b8063850337621461065b5780638da5cb5b1461068457806392136913146106af57806395d89b41146106da5780639a7a23d61461070557610272565b806339509351116101dd578063715018a6116101a1578063715018a61461057357806371aadb771461058a57806372bffc89146105b3578063735de9f7146105dc5780637bce5a041461060757806382d58ce91461063257610272565b8063395093511461046a57806342966c68146104a7578063437823ec146104d05780635342acb4146104f957806370a082311461053657610272565b806318160ddd1161022f57806318160ddd1461035c5780631c499ab0146103875780632369bf83146103b057806323b872dd146103d95780632a36063114610416578063313ce5671461043f57610272565b80630305caff14610277578063053e39a3146102a057806306fdde03146102cb578063095ea7b3146102f65780630e460b731461033357610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906136a2565b610a49565b005b3480156102ac57600080fd5b506102b5610bac565b6040516102c291906136f0565b60405180910390f35b3480156102d757600080fd5b506102e0610bd2565b6040516102ed919061379b565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906137f3565b610c64565b60405161032a919061384e565b60405180910390f35b34801561033f57600080fd5b5061035a600480360381019061035591906138ce565b610c7b565b005b34801561036857600080fd5b50610371610d9c565b60405161037e919061392a565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190613945565b610da6565b005b3480156103bc57600080fd5b506103d760048036038101906103d291906136a2565b610e2c565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190613972565b610f5b565b60405161040d919061384e565b60405180910390f35b34801561042257600080fd5b5061043d600480360381019061043891906136a2565b610f8a565b005b34801561044b57600080fd5b506104546110ee565b60405161046191906139e1565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906137f3565b6110f7565b60405161049e919061384e565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613945565b611122565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906136a2565b61112f565b005b34801561050557600080fd5b50610520600480360381019061051b91906136a2565b611206565b60405161052d919061384e565b60405180910390f35b34801561054257600080fd5b5061055d600480360381019061055891906136a2565b611226565b60405161056a919061392a565b60405180910390f35b34801561057f57600080fd5b5061058861126e565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613a36565b6112f6565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613a36565b6113ce565b005b3480156105e857600080fd5b506105f16114a6565b6040516105fe9190613ae8565b60405180910390f35b34801561061357600080fd5b5061061c6114ca565b6040516106299190613b12565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613945565b6114de565b005b34801561066757600080fd5b50610682600480360381019061067d91906136a2565b611564565b005b34801561069057600080fd5b50610699611693565b6040516106a69190613b3c565b60405180910390f35b3480156106bb57600080fd5b506106c46116bd565b6040516106d19190613b12565b60405180910390f35b3480156106e657600080fd5b506106ef6116d1565b6040516106fc919061379b565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613b83565b611763565b005b34801561073a57600080fd5b5061074361187b565b6040516107509190613b12565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906136a2565b61188f565b60405161078d919061384e565b60405180910390f35b3480156107a257600080fd5b506107ab6118af565b6040516107b89190613b12565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e391906137f3565b6118c3565b6040516107f5919061384e565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190613c01565b61192d565b005b34801561083357600080fd5b5061084e600480360381019061084991906137f3565b611ab4565b60405161085b919061384e565b60405180910390f35b34801561087057600080fd5b5061088b600480360381019061088691906136a2565b611acb565b604051610898919061384e565b60405180910390f35b3480156108ad57600080fd5b506108b6611aeb565b6040516108c391906136f0565b60405180910390f35b3480156108d857600080fd5b506108e1611b11565b6040516108ee9190613b3c565b60405180910390f35b34801561090357600080fd5b5061090c611b35565b604051610919919061392a565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613c41565b611b3b565b604051610956919061392a565b60405180910390f35b34801561096b57600080fd5b50610974611bc2565b005b34801561098257600080fd5b5061099d600480360381019061099891906136a2565b611ca2565b005b3480156109ab57600080fd5b506109b4611d79565b6040516109c19190613b12565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906136a2565b611d8d565b005b3480156109ff57600080fd5b50610a08611e84565b604051610a159190613b12565b60405180910390f35b348015610a2a57600080fd5b50610a33611e98565b604051610a40919061392a565b60405180910390f35b610a51611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610a6f611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613d39565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610be190613d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613d88565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c71338484611ea6565b6001905092915050565b610c83611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610ca1611693565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613ccd565b60405180910390fd5b60005b82829050811015610d9757600160106000858585818110610d1e57610d1d613db9565b5b9050602002016020810190610d3391906136a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d8f90613e17565b915050610cfa565b505050565b6000600254905090565b610dae611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610dcc611693565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990613ccd565b60405180910390fd5b8060138190555050565b610e34611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610e52611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613eab565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610f66611e9e565b9050610f7385828561206f565b610f7e8585856120fb565b60019150509392505050565b610f92611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610fb0611693565b73ffffffffffffffffffffffffffffffffffffffff1614611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613f17565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006009905090565b60006111183384846111093388611b3b565b6111139190613f37565b611ea6565b6001905092915050565b61112c3382612674565b50565b611137611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611155611693565b73ffffffffffffffffffffffffffffffffffffffff16146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290613ccd565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60086020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611276611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611294611693565b73ffffffffffffffffffffffffffffffffffffffff16146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190613ccd565b60405180910390fd5b6112f4600061284a565b565b6112fe611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661131c611693565b73ffffffffffffffffffffffffffffffffffffffff1614611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613ccd565b60405180910390fd5b82600960006101000a81548161ffff021916908361ffff16021790555081600960026101000a81548161ffff021916908361ffff16021790555080600960046101000a81548161ffff021916908361ffff160217905550505050565b6113d6611e9e565b73ffffffffffffffffffffffffffffffffffffffff166113f4611693565b73ffffffffffffffffffffffffffffffffffffffff161461144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613ccd565b60405180910390fd5b82600960066101000a81548161ffff021916908361ffff16021790555081600960086101000a81548161ffff021916908361ffff160217905550806009600a6101000a81548161ffff021916908361ffff160217905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600960029054906101000a900461ffff1681565b6114e6611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611504611693565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190613ccd565b60405180910390fd5b8060118190555050565b61156c611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661158a611693565b73ffffffffffffffffffffffffffffffffffffffff16146115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613eab565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960089054906101000a900461ffff1681565b6060600480546116e090613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90613d88565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b61176b611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611789611693565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d690613ccd565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613fb7565b60405180910390fd5b6118778282612910565b5050565b600960049054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6009600a9054906101000a900461ffff1681565b6000806118d03385611b3b565b905082811015611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614049565b60405180910390fd5b6119223385858403611ea6565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906140b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614121565b60405180910390fd5b611ab082828473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6a9190613b3c565b602060405180830381865afa158015611a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aab9190614156565b61296b565b5050565b6000611ac13384846120fb565b6001905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906140b5565b60405180910390fd5b611c5a611693565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611c9f573d6000803e3d6000fd5b50565b611caa611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611cc8611693565b73ffffffffffffffffffffffffffffffffffffffff1614611d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1590613ccd565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600960009054906101000a900461ffff1681565b611d95611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611db3611693565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f906141f5565b60405180910390fd5b611e818161284a565b50565b600960069054906101000a900461ffff1681565b60135481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614287565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b90614319565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612062919061392a565b60405180910390a3505050565b600061207b8484611b3b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120f557818110156120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90614385565b60405180910390fd5b6120f48484848403611ea6565b5b50505050565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561219f5750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906143f1565b60405180910390fd5b6121e66129f1565b601460009054906101000a900460ff16801561220f5750601260009054906101000a900460ff16155b80156122645750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122ab57600061227430611226565b90506000612710601154600d5461228b9190614411565b6122959190614482565b90508082106122a8576122a781612b12565b5b50505b6000806000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123545750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125d457600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612495576103e8600960009054906101000a900461ffff1661ffff16856123ce9190614411565b6123d89190614482565b92506103e8600960029054906101000a900461ffff1661ffff16856123fd9190614411565b6124079190614482565b91506103e8600960049054906101000a900461ffff1661ffff168561242c9190614411565b6124369190614482565b90506013548461244587611226565b61244f9190613f37565b1115612490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612487906144ff565b60405180910390fd5b6125d3565b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612579576103e8600960069054906101000a900461ffff1661ffff168561250a9190614411565b6125149190614482565b92506103e8600960089054906101000a900461ffff1661ffff16856125399190614411565b6125439190614482565b91506103e86009600a9054906101000a900461ffff1661ffff16856125689190614411565b6125729190614482565b90506125d2565b6013548461258687611226565b6125909190613f37565b11156125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906144ff565b60405180910390fd5b5b5b5b60008183856125e39190613f37565b6125ed9190613f37565b9050600081866125fd919061451f565b905061260a888883612e51565b600082111561266a5761261e883084612e51565b84600a60008282546126309190613f37565b9250508190555083600b60008282546126499190613f37565b9250508190555082600c60008282546126629190613f37565b925050819055505b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da906145c5565b60405180910390fd5b6126ef826000836130d0565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614657565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127cc919061451f565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612831919061392a565b60405180910390a3612845836000846130d5565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6129ec8363a9059cbb60e01b848460405160240161298a929190614677565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130da565b505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a839190614722565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150612ad17f0000000000000000000000000000000000000000000000000000000000000000611226565b600d81905550600082118015612ae75750600081115b612af2576000612af5565b60015b601460006101000a81548160ff0219169083151502179055505050565b6001601260006101000a81548160ff0219169083151502179055506000600c54600b54600a54612b429190613f37565b612b4c9190613f37565b905060008103612b5c5750612e33565b6000816002600a54612b6e9190614482565b84612b799190614411565b612b839190614482565b9050600047905060008285612b98919061451f565b9050612ba3816131a1565b60008247612bb1919061451f565b9050600085600b5483612bc49190614411565b612bce9190614482565b9050600086600c5484612be19190614411565b612beb9190614482565b90506000818385612bfc919061451f565b612c06919061451f565b9050600087118015612c185750600081115b15612c2857612c2787826133b3565b5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168461753090604051612c74906147a6565b600060405180830381858888f193505050503d8060008114612cb2576040519150601f19603f3d011682016040523d82523d6000602084013e612cb7565b606091505b505080915050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168361753090604051612d07906147a6565b600060405180830381858888f193505050503d8060008114612d45576040519150601f19603f3d011682016040523d82523d6000602084013e612d4a565b606091505b505080915050600089600a548c612d619190614411565b612d6b9190614482565b905060008a600b548d612d7e9190614411565b612d889190614482565b9050600081838e612d99919061451f565b612da3919061451f565b9050600a548311612db45782612db8565b600a545b600a6000828254612dc9919061451f565b92505081905550600b548211612ddf5781612de3565b600b545b600b6000828254612df4919061451f565b92505081905550600c548111612e0a5780612e0e565b600c545b600c6000828254612e1f919061451f565b925050819055505050505050505050505050505b6000601260006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb79061482d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f26906148bf565b60405180910390fd5b612f3a8383836130d0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb790614951565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130539190613f37565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130b7919061392a565b60405180910390a36130ca8484846130d5565b50505050565b505050565b505050565b600061313c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134849092919063ffffffff16565b905060008151111561319c578080602001905181019061315c9190614986565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614a25565b60405180910390fd5b5b505050565b6000600267ffffffffffffffff8111156131be576131bd614a45565b5b6040519080825280602002602001820160405280156131ec5781602001602082028036833780820191505090505b509050308160008151811061320457613203613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132cd9190614a89565b816001815181106132e1576132e0613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161337d959493929190614baf565b600060405180830381600087803b15801561339757600080fd5b505af11580156133ab573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161343a96959493929190614c09565b60606040518083038185885af1158015613458573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061347d9190614c6a565b5050505050565b6060613493848460008561349c565b90509392505050565b6060824710156134e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d890614d2f565b60405180910390fd5b6134ea856135b0565b613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090614d9b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135529190614df7565b60006040518083038185875af1925050503d806000811461358f576040519150601f19603f3d011682016040523d82523d6000602084013e613594565b606091505b50915091506135a48282866135d3565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156135e357829050613633565b6000835111156135f65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362a919061379b565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366f82613644565b9050919050565b61367f81613664565b811461368a57600080fd5b50565b60008135905061369c81613676565b92915050565b6000602082840312156136b8576136b761363a565b5b60006136c68482850161368d565b91505092915050565b60006136da82613644565b9050919050565b6136ea816136cf565b82525050565b600060208201905061370560008301846136e1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561374557808201518184015260208101905061372a565b60008484015250505050565b6000601f19601f8301169050919050565b600061376d8261370b565b6137778185613716565b9350613787818560208601613727565b61379081613751565b840191505092915050565b600060208201905081810360008301526137b58184613762565b905092915050565b6000819050919050565b6137d0816137bd565b81146137db57600080fd5b50565b6000813590506137ed816137c7565b92915050565b6000806040838503121561380a5761380961363a565b5b60006138188582860161368d565b9250506020613829858286016137de565b9150509250929050565b60008115159050919050565b61384881613833565b82525050565b6000602082019050613863600083018461383f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261388e5761388d613869565b5b8235905067ffffffffffffffff8111156138ab576138aa61386e565b5b6020830191508360208202830111156138c7576138c6613873565b5b9250929050565b600080602083850312156138e5576138e461363a565b5b600083013567ffffffffffffffff8111156139035761390261363f565b5b61390f85828601613878565b92509250509250929050565b613924816137bd565b82525050565b600060208201905061393f600083018461391b565b92915050565b60006020828403121561395b5761395a61363a565b5b6000613969848285016137de565b91505092915050565b60008060006060848603121561398b5761398a61363a565b5b60006139998682870161368d565b93505060206139aa8682870161368d565b92505060406139bb868287016137de565b9150509250925092565b600060ff82169050919050565b6139db816139c5565b82525050565b60006020820190506139f660008301846139d2565b92915050565b600061ffff82169050919050565b613a13816139fc565b8114613a1e57600080fd5b50565b600081359050613a3081613a0a565b92915050565b600080600060608486031215613a4f57613a4e61363a565b5b6000613a5d86828701613a21565b9350506020613a6e86828701613a21565b9250506040613a7f86828701613a21565b9150509250925092565b6000819050919050565b6000613aae613aa9613aa484613644565b613a89565b613644565b9050919050565b6000613ac082613a93565b9050919050565b6000613ad282613ab5565b9050919050565b613ae281613ac7565b82525050565b6000602082019050613afd6000830184613ad9565b92915050565b613b0c816139fc565b82525050565b6000602082019050613b276000830184613b03565b92915050565b613b3681613664565b82525050565b6000602082019050613b516000830184613b2d565b92915050565b613b6081613833565b8114613b6b57600080fd5b50565b600081359050613b7d81613b57565b92915050565b60008060408385031215613b9a57613b9961363a565b5b6000613ba88582860161368d565b9250506020613bb985828601613b6e565b9150509250929050565b6000613bce82613664565b9050919050565b613bde81613bc3565b8114613be957600080fd5b50565b600081359050613bfb81613bd5565b92915050565b60008060408385031215613c1857613c1761363a565b5b6000613c2685828601613bec565b9250506020613c378582860161368d565b9150509250929050565b60008060408385031215613c5857613c5761363a565b5b6000613c668582860161368d565b9250506020613c778582860161368d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cb7602083613716565b9150613cc282613c81565b602082019050919050565b60006020820190508181036000830152613ce681613caa565b9050919050565b7f57616c6c6574206e6f7420616464656400000000000000000000000000000000600082015250565b6000613d23601083613716565b9150613d2e82613ced565b602082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613da057607f821691505b602082108103613db357613db2613d59565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e22826137bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e5457613e53613de8565b5b600182019050919050565b7f43616e2774207365742030000000000000000000000000000000000000000000600082015250565b6000613e95600b83613716565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f57616c6c657420616c7265616479206164646564000000000000000000000000600082015250565b6000613f01601483613716565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b6000613f42826137bd565b9150613f4d836137bd565b9250828201905080821115613f6557613f64613de8565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b6000613fa1601a83613716565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614033602583613716565b915061403e82613fd7565b604082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b7f596f7520617265206e6f7420746865206465706c6f7965720000000000000000600082015250565b600061409f601883613716565b91506140aa82614069565b602082019050919050565b600060208201905081810360008301526140ce81614092565b9050919050565b7f77616c6c6574416464726573732063616e277420626520302061646472657373600082015250565b600061410b602083613716565b9150614116826140d5565b602082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b600081519050614150816137c7565b92915050565b60006020828403121561416c5761416b61363a565b5b600061417a84828501614141565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141df602683613716565b91506141ea82614183565b604082019050919050565b6000602082019050818103600083015261420e816141d2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614271602483613716565b915061427c82614215565b604082019050919050565b600060208201905081810360008301526142a081614264565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614303602283613716565b915061430e826142a7565b604082019050919050565b60006020820190508181036000830152614332816142f6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061436f601d83613716565b915061437a82614339565b602082019050919050565b6000602082019050818103600083015261439e81614362565b9050919050565b7f426f742077616c6c657400000000000000000000000000000000000000000000600082015250565b60006143db600a83613716565b91506143e6826143a5565b602082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b600061441c826137bd565b9150614427836137bd565b9250828202614435816137bd565b9150828204841483151761444c5761444b613de8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061448d826137bd565b9150614498836137bd565b9250826144a8576144a7614453565b5b828204905092915050565b7f416d6f756e742065786365656473206d617857616c6c65740000000000000000600082015250565b60006144e9601883613716565b91506144f4826144b3565b602082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b600061452a826137bd565b9150614535836137bd565b925082820390508181111561454d5761454c613de8565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006145af602183613716565b91506145ba82614553565b604082019050919050565b600060208201905081810360008301526145de816145a2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614641602283613716565b915061464c826145e5565b604082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b600060408201905061468c6000830185613b2d565b614699602083018461391b565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b6146c3816146a0565b81146146ce57600080fd5b50565b6000815190506146e0816146ba565b92915050565b600063ffffffff82169050919050565b6146ff816146e6565b811461470a57600080fd5b50565b60008151905061471c816146f6565b92915050565b60008060006060848603121561473b5761473a61363a565b5b6000614749868287016146d1565b935050602061475a868287016146d1565b925050604061476b8682870161470d565b9150509250925092565b600081905092915050565b50565b6000614790600083614775565b915061479b82614780565b600082019050919050565b60006147b182614783565b9150819050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614817602583613716565b9150614822826147bb565b604082019050919050565b600060208201905081810360008301526148468161480a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006148a9602383613716565b91506148b48261484d565b604082019050919050565b600060208201905081810360008301526148d88161489c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061493b602683613716565b9150614946826148df565b604082019050919050565b6000602082019050818103600083015261496a8161492e565b9050919050565b60008151905061498081613b57565b92915050565b60006020828403121561499c5761499b61363a565b5b60006149aa84828501614971565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614a0f602a83613716565b9150614a1a826149b3565b604082019050919050565b60006020820190508181036000830152614a3e81614a02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614a8381613676565b92915050565b600060208284031215614a9f57614a9e61363a565b5b6000614aad84828501614a74565b91505092915050565b6000819050919050565b6000614adb614ad6614ad184614ab6565b613a89565b6137bd565b9050919050565b614aeb81614ac0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b2681613664565b82525050565b6000614b388383614b1d565b60208301905092915050565b6000602082019050919050565b6000614b5c82614af1565b614b668185614afc565b9350614b7183614b0d565b8060005b83811015614ba2578151614b898882614b2c565b9750614b9483614b44565b925050600181019050614b75565b5085935050505092915050565b600060a082019050614bc4600083018861391b565b614bd16020830187614ae2565b8181036040830152614be38186614b51565b9050614bf26060830185613b2d565b614bff608083018461391b565b9695505050505050565b600060c082019050614c1e6000830189613b2d565b614c2b602083018861391b565b614c386040830187614ae2565b614c456060830186614ae2565b614c526080830185613b2d565b614c5f60a083018461391b565b979650505050505050565b600080600060608486031215614c8357614c8261363a565b5b6000614c9186828701614141565b9350506020614ca286828701614141565b9250506040614cb386828701614141565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614d19602683613716565b9150614d2482614cbd565b604082019050919050565b60006020820190508181036000830152614d4881614d0c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d85601d83613716565b9150614d9082614d4f565b602082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b600081519050919050565b6000614dd182614dbb565b614ddb8185614775565b9350614deb818560208601613727565b80840191505092915050565b6000614e038284614dc6565b91508190509291505056fea264697066735822122008c75b1131936b707e7b519d144a95d7e14ddad9bbcd38aca8f02ca14e56e4c064736f6c63430008110033
Deployed Bytecode
0x60806040526004361061026b5760003560e01c80638503376211610144578063b62496f5116100b6578063e086e5ec1161007a578063e086e5ec1461095f578063ea2f0b3714610976578063f11a24d31461099f578063f2fde38b146109ca578063f6374342146109f3578063f8b45b0514610a1e57610272565b8063b62496f514610864578063c0907099146108a1578063c816841b146108cc578063dbf1cd13146108f7578063dd62ed3e1461092257610272565b80639c3b4fdc116101085780639c3b4fdc1461072e5780639cbc1ad614610759578063a0d82dc514610796578063a457c2d7146107c1578063a522ad25146107fe578063a9059cbb1461082757610272565b8063850337621461065b5780638da5cb5b1461068457806392136913146106af57806395d89b41146106da5780639a7a23d61461070557610272565b806339509351116101dd578063715018a6116101a1578063715018a61461057357806371aadb771461058a57806372bffc89146105b3578063735de9f7146105dc5780637bce5a041461060757806382d58ce91461063257610272565b8063395093511461046a57806342966c68146104a7578063437823ec146104d05780635342acb4146104f957806370a082311461053657610272565b806318160ddd1161022f57806318160ddd1461035c5780631c499ab0146103875780632369bf83146103b057806323b872dd146103d95780632a36063114610416578063313ce5671461043f57610272565b80630305caff14610277578063053e39a3146102a057806306fdde03146102cb578063095ea7b3146102f65780630e460b731461033357610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906136a2565b610a49565b005b3480156102ac57600080fd5b506102b5610bac565b6040516102c291906136f0565b60405180910390f35b3480156102d757600080fd5b506102e0610bd2565b6040516102ed919061379b565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906137f3565b610c64565b60405161032a919061384e565b60405180910390f35b34801561033f57600080fd5b5061035a600480360381019061035591906138ce565b610c7b565b005b34801561036857600080fd5b50610371610d9c565b60405161037e919061392a565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190613945565b610da6565b005b3480156103bc57600080fd5b506103d760048036038101906103d291906136a2565b610e2c565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190613972565b610f5b565b60405161040d919061384e565b60405180910390f35b34801561042257600080fd5b5061043d600480360381019061043891906136a2565b610f8a565b005b34801561044b57600080fd5b506104546110ee565b60405161046191906139e1565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906137f3565b6110f7565b60405161049e919061384e565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613945565b611122565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906136a2565b61112f565b005b34801561050557600080fd5b50610520600480360381019061051b91906136a2565b611206565b60405161052d919061384e565b60405180910390f35b34801561054257600080fd5b5061055d600480360381019061055891906136a2565b611226565b60405161056a919061392a565b60405180910390f35b34801561057f57600080fd5b5061058861126e565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613a36565b6112f6565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613a36565b6113ce565b005b3480156105e857600080fd5b506105f16114a6565b6040516105fe9190613ae8565b60405180910390f35b34801561061357600080fd5b5061061c6114ca565b6040516106299190613b12565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613945565b6114de565b005b34801561066757600080fd5b50610682600480360381019061067d91906136a2565b611564565b005b34801561069057600080fd5b50610699611693565b6040516106a69190613b3c565b60405180910390f35b3480156106bb57600080fd5b506106c46116bd565b6040516106d19190613b12565b60405180910390f35b3480156106e657600080fd5b506106ef6116d1565b6040516106fc919061379b565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613b83565b611763565b005b34801561073a57600080fd5b5061074361187b565b6040516107509190613b12565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906136a2565b61188f565b60405161078d919061384e565b60405180910390f35b3480156107a257600080fd5b506107ab6118af565b6040516107b89190613b12565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e391906137f3565b6118c3565b6040516107f5919061384e565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190613c01565b61192d565b005b34801561083357600080fd5b5061084e600480360381019061084991906137f3565b611ab4565b60405161085b919061384e565b60405180910390f35b34801561087057600080fd5b5061088b600480360381019061088691906136a2565b611acb565b604051610898919061384e565b60405180910390f35b3480156108ad57600080fd5b506108b6611aeb565b6040516108c391906136f0565b60405180910390f35b3480156108d857600080fd5b506108e1611b11565b6040516108ee9190613b3c565b60405180910390f35b34801561090357600080fd5b5061090c611b35565b604051610919919061392a565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613c41565b611b3b565b604051610956919061392a565b60405180910390f35b34801561096b57600080fd5b50610974611bc2565b005b34801561098257600080fd5b5061099d600480360381019061099891906136a2565b611ca2565b005b3480156109ab57600080fd5b506109b4611d79565b6040516109c19190613b12565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906136a2565b611d8d565b005b3480156109ff57600080fd5b50610a08611e84565b604051610a159190613b12565b60405180910390f35b348015610a2a57600080fd5b50610a33611e98565b604051610a40919061392a565b60405180910390f35b610a51611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610a6f611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613d39565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610be190613d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613d88565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c71338484611ea6565b6001905092915050565b610c83611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610ca1611693565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613ccd565b60405180910390fd5b60005b82829050811015610d9757600160106000858585818110610d1e57610d1d613db9565b5b9050602002016020810190610d3391906136a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d8f90613e17565b915050610cfa565b505050565b6000600254905090565b610dae611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610dcc611693565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990613ccd565b60405180910390fd5b8060138190555050565b610e34611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610e52611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613eab565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610f66611e9e565b9050610f7385828561206f565b610f7e8585856120fb565b60019150509392505050565b610f92611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610fb0611693565b73ffffffffffffffffffffffffffffffffffffffff1614611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613f17565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006009905090565b60006111183384846111093388611b3b565b6111139190613f37565b611ea6565b6001905092915050565b61112c3382612674565b50565b611137611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611155611693565b73ffffffffffffffffffffffffffffffffffffffff16146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290613ccd565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60086020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611276611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611294611693565b73ffffffffffffffffffffffffffffffffffffffff16146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190613ccd565b60405180910390fd5b6112f4600061284a565b565b6112fe611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661131c611693565b73ffffffffffffffffffffffffffffffffffffffff1614611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613ccd565b60405180910390fd5b82600960006101000a81548161ffff021916908361ffff16021790555081600960026101000a81548161ffff021916908361ffff16021790555080600960046101000a81548161ffff021916908361ffff160217905550505050565b6113d6611e9e565b73ffffffffffffffffffffffffffffffffffffffff166113f4611693565b73ffffffffffffffffffffffffffffffffffffffff161461144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613ccd565b60405180910390fd5b82600960066101000a81548161ffff021916908361ffff16021790555081600960086101000a81548161ffff021916908361ffff160217905550806009600a6101000a81548161ffff021916908361ffff160217905550505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600960029054906101000a900461ffff1681565b6114e6611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611504611693565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190613ccd565b60405180910390fd5b8060118190555050565b61156c611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661158a611693565b73ffffffffffffffffffffffffffffffffffffffff16146115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613eab565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960089054906101000a900461ffff1681565b6060600480546116e090613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90613d88565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b61176b611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611789611693565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d690613ccd565b60405180910390fd5b7f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613fb7565b60405180910390fd5b6118778282612910565b5050565b600960049054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6009600a9054906101000a900461ffff1681565b6000806118d03385611b3b565b905082811015611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614049565b60405180910390fd5b6119223385858403611ea6565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906140b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614121565b60405180910390fd5b611ab082828473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6a9190613b3c565b602060405180830381865afa158015611a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aab9190614156565b61296b565b5050565b6000611ac13384846120fb565b6001905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c81565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906140b5565b60405180910390fd5b611c5a611693565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611c9f573d6000803e3d6000fd5b50565b611caa611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611cc8611693565b73ffffffffffffffffffffffffffffffffffffffff1614611d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1590613ccd565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600960009054906101000a900461ffff1681565b611d95611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611db3611693565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f906141f5565b60405180910390fd5b611e818161284a565b50565b600960069054906101000a900461ffff1681565b60135481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614287565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b90614319565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612062919061392a565b60405180910390a3505050565b600061207b8484611b3b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120f557818110156120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90614385565b60405180910390fd5b6120f48484848403611ea6565b5b50505050565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561219f5750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906143f1565b60405180910390fd5b6121e66129f1565b601460009054906101000a900460ff16801561220f5750601260009054906101000a900460ff16155b80156122645750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122ab57600061227430611226565b90506000612710601154600d5461228b9190614411565b6122959190614482565b90508082106122a8576122a781612b12565b5b50505b6000806000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123545750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125d457600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612495576103e8600960009054906101000a900461ffff1661ffff16856123ce9190614411565b6123d89190614482565b92506103e8600960029054906101000a900461ffff1661ffff16856123fd9190614411565b6124079190614482565b91506103e8600960049054906101000a900461ffff1661ffff168561242c9190614411565b6124369190614482565b90506013548461244587611226565b61244f9190613f37565b1115612490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612487906144ff565b60405180910390fd5b6125d3565b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612579576103e8600960069054906101000a900461ffff1661ffff168561250a9190614411565b6125149190614482565b92506103e8600960089054906101000a900461ffff1661ffff16856125399190614411565b6125439190614482565b91506103e86009600a9054906101000a900461ffff1661ffff16856125689190614411565b6125729190614482565b90506125d2565b6013548461258687611226565b6125909190613f37565b11156125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906144ff565b60405180910390fd5b5b5b5b60008183856125e39190613f37565b6125ed9190613f37565b9050600081866125fd919061451f565b905061260a888883612e51565b600082111561266a5761261e883084612e51565b84600a60008282546126309190613f37565b9250508190555083600b60008282546126499190613f37565b9250508190555082600c60008282546126629190613f37565b925050819055505b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da906145c5565b60405180910390fd5b6126ef826000836130d0565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614657565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127cc919061451f565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612831919061392a565b60405180910390a3612845836000846130d5565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6129ec8363a9059cbb60e01b848460405160240161298a929190614677565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130da565b505050565b6000807f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a839190614722565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150612ad17f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c611226565b600d81905550600082118015612ae75750600081115b612af2576000612af5565b60015b601460006101000a81548160ff0219169083151502179055505050565b6001601260006101000a81548160ff0219169083151502179055506000600c54600b54600a54612b429190613f37565b612b4c9190613f37565b905060008103612b5c5750612e33565b6000816002600a54612b6e9190614482565b84612b799190614411565b612b839190614482565b9050600047905060008285612b98919061451f565b9050612ba3816131a1565b60008247612bb1919061451f565b9050600085600b5483612bc49190614411565b612bce9190614482565b9050600086600c5484612be19190614411565b612beb9190614482565b90506000818385612bfc919061451f565b612c06919061451f565b9050600087118015612c185750600081115b15612c2857612c2787826133b3565b5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168461753090604051612c74906147a6565b600060405180830381858888f193505050503d8060008114612cb2576040519150601f19603f3d011682016040523d82523d6000602084013e612cb7565b606091505b505080915050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168361753090604051612d07906147a6565b600060405180830381858888f193505050503d8060008114612d45576040519150601f19603f3d011682016040523d82523d6000602084013e612d4a565b606091505b505080915050600089600a548c612d619190614411565b612d6b9190614482565b905060008a600b548d612d7e9190614411565b612d889190614482565b9050600081838e612d99919061451f565b612da3919061451f565b9050600a548311612db45782612db8565b600a545b600a6000828254612dc9919061451f565b92505081905550600b548211612ddf5781612de3565b600b545b600b6000828254612df4919061451f565b92505081905550600c548111612e0a5780612e0e565b600c545b600c6000828254612e1f919061451f565b925050819055505050505050505050505050505b6000601260006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb79061482d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f26906148bf565b60405180910390fd5b612f3a8383836130d0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb790614951565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130539190613f37565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130b7919061392a565b60405180910390a36130ca8484846130d5565b50505050565b505050565b505050565b600061313c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134849092919063ffffffff16565b905060008151111561319c578080602001905181019061315c9190614986565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614a25565b60405180910390fd5b5b505050565b6000600267ffffffffffffffff8111156131be576131bd614a45565b5b6040519080825280602002602001820160405280156131ec5781602001602082028036833780820191505090505b509050308160008151811061320457613203613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132cd9190614a89565b816001815181106132e1576132e0613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161337d959493929190614baf565b600060405180830381600087803b15801561339757600080fd5b505af11580156133ab573d6000803e3d6000fd5b505050505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161343a96959493929190614c09565b60606040518083038185885af1158015613458573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061347d9190614c6a565b5050505050565b6060613493848460008561349c565b90509392505050565b6060824710156134e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d890614d2f565b60405180910390fd5b6134ea856135b0565b613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090614d9b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135529190614df7565b60006040518083038185875af1925050503d806000811461358f576040519150601f19603f3d011682016040523d82523d6000602084013e613594565b606091505b50915091506135a48282866135d3565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156135e357829050613633565b6000835111156135f65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362a919061379b565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366f82613644565b9050919050565b61367f81613664565b811461368a57600080fd5b50565b60008135905061369c81613676565b92915050565b6000602082840312156136b8576136b761363a565b5b60006136c68482850161368d565b91505092915050565b60006136da82613644565b9050919050565b6136ea816136cf565b82525050565b600060208201905061370560008301846136e1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561374557808201518184015260208101905061372a565b60008484015250505050565b6000601f19601f8301169050919050565b600061376d8261370b565b6137778185613716565b9350613787818560208601613727565b61379081613751565b840191505092915050565b600060208201905081810360008301526137b58184613762565b905092915050565b6000819050919050565b6137d0816137bd565b81146137db57600080fd5b50565b6000813590506137ed816137c7565b92915050565b6000806040838503121561380a5761380961363a565b5b60006138188582860161368d565b9250506020613829858286016137de565b9150509250929050565b60008115159050919050565b61384881613833565b82525050565b6000602082019050613863600083018461383f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261388e5761388d613869565b5b8235905067ffffffffffffffff8111156138ab576138aa61386e565b5b6020830191508360208202830111156138c7576138c6613873565b5b9250929050565b600080602083850312156138e5576138e461363a565b5b600083013567ffffffffffffffff8111156139035761390261363f565b5b61390f85828601613878565b92509250509250929050565b613924816137bd565b82525050565b600060208201905061393f600083018461391b565b92915050565b60006020828403121561395b5761395a61363a565b5b6000613969848285016137de565b91505092915050565b60008060006060848603121561398b5761398a61363a565b5b60006139998682870161368d565b93505060206139aa8682870161368d565b92505060406139bb868287016137de565b9150509250925092565b600060ff82169050919050565b6139db816139c5565b82525050565b60006020820190506139f660008301846139d2565b92915050565b600061ffff82169050919050565b613a13816139fc565b8114613a1e57600080fd5b50565b600081359050613a3081613a0a565b92915050565b600080600060608486031215613a4f57613a4e61363a565b5b6000613a5d86828701613a21565b9350506020613a6e86828701613a21565b9250506040613a7f86828701613a21565b9150509250925092565b6000819050919050565b6000613aae613aa9613aa484613644565b613a89565b613644565b9050919050565b6000613ac082613a93565b9050919050565b6000613ad282613ab5565b9050919050565b613ae281613ac7565b82525050565b6000602082019050613afd6000830184613ad9565b92915050565b613b0c816139fc565b82525050565b6000602082019050613b276000830184613b03565b92915050565b613b3681613664565b82525050565b6000602082019050613b516000830184613b2d565b92915050565b613b6081613833565b8114613b6b57600080fd5b50565b600081359050613b7d81613b57565b92915050565b60008060408385031215613b9a57613b9961363a565b5b6000613ba88582860161368d565b9250506020613bb985828601613b6e565b9150509250929050565b6000613bce82613664565b9050919050565b613bde81613bc3565b8114613be957600080fd5b50565b600081359050613bfb81613bd5565b92915050565b60008060408385031215613c1857613c1761363a565b5b6000613c2685828601613bec565b9250506020613c378582860161368d565b9150509250929050565b60008060408385031215613c5857613c5761363a565b5b6000613c668582860161368d565b9250506020613c778582860161368d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cb7602083613716565b9150613cc282613c81565b602082019050919050565b60006020820190508181036000830152613ce681613caa565b9050919050565b7f57616c6c6574206e6f7420616464656400000000000000000000000000000000600082015250565b6000613d23601083613716565b9150613d2e82613ced565b602082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613da057607f821691505b602082108103613db357613db2613d59565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e22826137bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e5457613e53613de8565b5b600182019050919050565b7f43616e2774207365742030000000000000000000000000000000000000000000600082015250565b6000613e95600b83613716565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f57616c6c657420616c7265616479206164646564000000000000000000000000600082015250565b6000613f01601483613716565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b6000613f42826137bd565b9150613f4d836137bd565b9250828201905080821115613f6557613f64613de8565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b6000613fa1601a83613716565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614033602583613716565b915061403e82613fd7565b604082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b7f596f7520617265206e6f7420746865206465706c6f7965720000000000000000600082015250565b600061409f601883613716565b91506140aa82614069565b602082019050919050565b600060208201905081810360008301526140ce81614092565b9050919050565b7f77616c6c6574416464726573732063616e277420626520302061646472657373600082015250565b600061410b602083613716565b9150614116826140d5565b602082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b600081519050614150816137c7565b92915050565b60006020828403121561416c5761416b61363a565b5b600061417a84828501614141565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141df602683613716565b91506141ea82614183565b604082019050919050565b6000602082019050818103600083015261420e816141d2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614271602483613716565b915061427c82614215565b604082019050919050565b600060208201905081810360008301526142a081614264565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614303602283613716565b915061430e826142a7565b604082019050919050565b60006020820190508181036000830152614332816142f6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061436f601d83613716565b915061437a82614339565b602082019050919050565b6000602082019050818103600083015261439e81614362565b9050919050565b7f426f742077616c6c657400000000000000000000000000000000000000000000600082015250565b60006143db600a83613716565b91506143e6826143a5565b602082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b600061441c826137bd565b9150614427836137bd565b9250828202614435816137bd565b9150828204841483151761444c5761444b613de8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061448d826137bd565b9150614498836137bd565b9250826144a8576144a7614453565b5b828204905092915050565b7f416d6f756e742065786365656473206d617857616c6c65740000000000000000600082015250565b60006144e9601883613716565b91506144f4826144b3565b602082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b600061452a826137bd565b9150614535836137bd565b925082820390508181111561454d5761454c613de8565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006145af602183613716565b91506145ba82614553565b604082019050919050565b600060208201905081810360008301526145de816145a2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614641602283613716565b915061464c826145e5565b604082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b600060408201905061468c6000830185613b2d565b614699602083018461391b565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b6146c3816146a0565b81146146ce57600080fd5b50565b6000815190506146e0816146ba565b92915050565b600063ffffffff82169050919050565b6146ff816146e6565b811461470a57600080fd5b50565b60008151905061471c816146f6565b92915050565b60008060006060848603121561473b5761473a61363a565b5b6000614749868287016146d1565b935050602061475a868287016146d1565b925050604061476b8682870161470d565b9150509250925092565b600081905092915050565b50565b6000614790600083614775565b915061479b82614780565b600082019050919050565b60006147b182614783565b9150819050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614817602583613716565b9150614822826147bb565b604082019050919050565b600060208201905081810360008301526148468161480a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006148a9602383613716565b91506148b48261484d565b604082019050919050565b600060208201905081810360008301526148d88161489c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061493b602683613716565b9150614946826148df565b604082019050919050565b6000602082019050818103600083015261496a8161492e565b9050919050565b60008151905061498081613b57565b92915050565b60006020828403121561499c5761499b61363a565b5b60006149aa84828501614971565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614a0f602a83613716565b9150614a1a826149b3565b604082019050919050565b60006020820190508181036000830152614a3e81614a02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614a8381613676565b92915050565b600060208284031215614a9f57614a9e61363a565b5b6000614aad84828501614a74565b91505092915050565b6000819050919050565b6000614adb614ad6614ad184614ab6565b613a89565b6137bd565b9050919050565b614aeb81614ac0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b2681613664565b82525050565b6000614b388383614b1d565b60208301905092915050565b6000602082019050919050565b6000614b5c82614af1565b614b668185614afc565b9350614b7183614b0d565b8060005b83811015614ba2578151614b898882614b2c565b9750614b9483614b44565b925050600181019050614b75565b5085935050505092915050565b600060a082019050614bc4600083018861391b565b614bd16020830187614ae2565b8181036040830152614be38186614b51565b9050614bf26060830185613b2d565b614bff608083018461391b565b9695505050505050565b600060c082019050614c1e6000830189613b2d565b614c2b602083018861391b565b614c386040830187614ae2565b614c456060830186614ae2565b614c526080830185613b2d565b614c5f60a083018461391b565b979650505050505050565b600080600060608486031215614c8357614c8261363a565b5b6000614c9186828701614141565b9350506020614ca286828701614141565b9250506040614cb386828701614141565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614d19602683613716565b9150614d2482614cbd565b604082019050919050565b60006020820190508181036000830152614d4881614d0c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d85601d83613716565b9150614d9082614d4f565b602082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b600081519050919050565b6000614dd182614dbb565b614ddb8185614775565b9350614deb818560208601613727565b80840191505092915050565b6000614e038284614dc6565b91508190509291505056fea264697066735822122008c75b1131936b707e7b519d144a95d7e14ddad9bbcd38aca8f02ca14e56e4c064736f6c63430008110033
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.