Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Burn | 17200608 | 3 days ago | IN | 0 ETH | 0.0000797 | ||||
Burn | 17199230 | 3 days ago | IN | 0 ETH | 0.0000797 | ||||
Burn | 17197415 | 3 days ago | IN | 0 ETH | 0.00004869 | ||||
Burn | 17197188 | 3 days ago | IN | 0 ETH | 0.0000797 | ||||
Burn | 17196120 | 3 days ago | IN | 0 ETH | 0.0000797 | ||||
Burn | 17196120 | 3 days ago | IN | 0 ETH | 0.00016152 | ||||
Burn | 17195445 | 3 days ago | IN | 0 ETH | 0.0000797 | ||||
Burn | 17195444 | 3 days ago | IN | 0 ETH | 0.0002128 | ||||
Sync | 1092135 | 474 days ago | IN | 0 ETH | 0.00026574 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314679 | 38 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17314678 | 40 secs ago | 0 ETH | ||||
17313834 | 34 mins ago | 0 ETH | ||||
17313834 | 34 mins ago | 0 ETH | ||||
17313834 | 34 mins ago | 0 ETH | ||||
17313834 | 34 mins ago | 0 ETH | ||||
17313834 | 34 mins ago | 0 ETH | ||||
17313834 | 34 mins ago | 0 ETH | ||||
17313834 | 34 mins ago | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
XfaiV0Core
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; import './Math.sol'; import './XfaiLibrary.sol'; import './IXfaiV0Core.sol'; import './IXfaiFactory.sol'; import './IXfaiPool.sol'; import './IXfaiV0FlashLoan.sol'; import './IERC20.sol'; /** * @title Xfai's Core Contract * @author Xfai * @notice XfaiV0Core manages the core AMM logic of Xfai. It does not store any pool state. */ contract XfaiV0Core is IXfaiV0Core { /** * @notice The factory address of Xfai */ address private immutable factory; /** * @notice The INFT address of Xfai */ address private immutable infinityNFT; /** * @notice The address of the wETH token */ address private immutable wETH; /** * @notice The liquidity provider fee for swaps and burns */ uint public override lpFee; /** * @notice The infinity NFT fee for swaps and burns */ uint public override infinityNFTFee; uint private constant MAX_FEE = 100; uint private constant NOT_ENTERED = 1; uint private constant ENTERED = 2; uint private constant MINIMUM_LIQUIDITY = 10 ** 3; /** * @notice The code hash od XfaiPool * @dev keccak256(type(XfaiPool).creationCode) */ bytes32 private immutable poolCodeHash; /** * @notice determines if swap/mint/burn functionality is paused or not */ bool private paused; /** * @notice Mapping used to lock individual Xfai pools * @dev used to prevent reentrancy attacks */ mapping(address => uint) private poolLock; modifier singleLock(address _token) { require(_token != wETH, 'XfaiV0Core: INVALID_TOKEN'); require(poolLock[_token] != ENTERED, 'XfaiV0Core: REENTRANT_CALL'); poolLock[_token] = ENTERED; _; poolLock[_token] = NOT_ENTERED; } modifier doubleLock(address _token0, address _token1) { require(poolLock[_token0] != ENTERED, 'XfaiV0Core: REENTRANT_CALL'); require(poolLock[_token1] != ENTERED, 'XfaiV0Core: REENTRANT_CALL'); require(_token0 != _token1, 'XfaiV0Core: IDENTICAL_POOLS'); address _wETH = wETH; if (_token0 != _wETH) { poolLock[_token0] = ENTERED; } if (_token1 != _wETH) { poolLock[_token1] = ENTERED; } _; poolLock[_token0] = NOT_ENTERED; poolLock[_token1] = NOT_ENTERED; } modifier pausable() { require(paused == false, 'XfaiV0Core: PAUSED'); _; } modifier onlyOwner() { require(msg.sender == IXfaiFactory(factory).getOwner(), 'XfaiV0Core: NOT_OWNER'); _; } /** * @notice Construct XfaiV0Core * @param _factory The factory contract address of the XfaiV0Core contract * @param _infinityNFT The INFT address of Xfai * @param _wETH The address of the wETH token * @param _lpFee The liquidity provider fee for swaps and burns * @param _infinityNFTFee The infinity staking / boosting fee for INFT holders */ constructor( address _factory, address _infinityNFT, address _wETH, uint _lpFee, uint _infinityNFTFee ) { factory = _factory; infinityNFT = _infinityNFT; wETH = _wETH; lpFee = _lpFee; infinityNFTFee = _infinityNFTFee; poolCodeHash = IXfaiFactory(_factory).poolCodeHash(); } /** * @notice Changes the lpFee of the XfaiV0Core contract * @dev Only the owner of the XfaiV0Core contract can call this function * @param _newLpFee The new lpFee */ function changeLpFee(uint _newLpFee) external override onlyOwner { require(_newLpFee + infinityNFTFee <= MAX_FEE, 'XfaiV0Core: FEE_EXCEEDS_LIMIT'); lpFee = _newLpFee; emit LpFeeChange(_newLpFee); } /** * @notice Changes the infinityNFTFee of the XfaiV0Core contract * @dev Only the owner of the XfaiV0Core contract can call this function * @param _newLnftFee The new infinityNFTFee */ function changeInfinityNFTFee(uint _newLnftFee) external override onlyOwner { require(lpFee + _newLnftFee <= MAX_FEE, 'XfaiV0Core: FEE_EXCEEDS_LIMIT'); infinityNFTFee = _newLnftFee; emit InfinityNFTFeeChange(_newLnftFee); } /** * @notice Returns the total fee of the XfaiV0Core contract for swaps and burns * @dev The total fee of the XfaiV0Core represents the sum of the infinityNFTFee and lpFee */ function getTotalFee() public view override returns (uint) { return infinityNFTFee + lpFee; } function _swap0( address _pool, address _token, address _to ) private returns (uint amountIn, uint amountOut) { address _wETH = wETH; // gas saving IXfaiPool pool = IXfaiPool(_pool); (uint reserve, uint weight) = pool.getStates(); uint tokenBalance = IERC20(_token).balanceOf(_pool); amountIn = tokenBalance - reserve; amountOut = XfaiLibrary.getAmountOut(reserve, weight, amountIn, getTotalFee()); pool.linkedTransfer(_token, infinityNFT, (amountIn * infinityNFTFee) / 10000); // send infinityNFTFee to the INFT contract pool.linkedTransfer(_wETH, _to, amountOut); // optimistically transfer tokens uint wETHBalance = IERC20(_wETH).balanceOf(_pool); tokenBalance = IERC20(_token).balanceOf(_pool); pool.update(tokenBalance, wETHBalance); } function _swap1( address _pool, address _token, address _to, bool _withFee ) private returns (uint amountIn, uint amountOut) { address _wETH = wETH; // gas saving IXfaiPool pool = IXfaiPool(_pool); (uint reserve, uint weight) = pool.getStates(); uint wETHBalance = IERC20(_wETH).balanceOf(_pool); amountIn = wETHBalance - weight; if (_withFee == true) { amountOut = XfaiLibrary.getAmountOut(weight, reserve, amountIn, getTotalFee()); pool.linkedTransfer(_wETH, infinityNFT, (amountIn * infinityNFTFee) / 10000); // send infinityNFTFee to the INFT contract } else { amountOut = XfaiLibrary.getAdjustedOutput(amountIn, weight, reserve); } pool.linkedTransfer(_token, _to, amountOut); // optimistically transfer tokens wETHBalance = IERC20(_wETH).balanceOf(_pool); uint tokenBalance = IERC20(_token).balanceOf(_pool); pool.update(tokenBalance, wETHBalance); } function _swap( address _token0, address _token1, address _to ) private returns (uint amount0In, uint amount1Out) { address _wETH = wETH; // gas saving address _factory = factory; // gas saving require(_to != _token0, 'XfaiV0Core: INVALID_TO'); require(_to != _token1, 'XfaiV0Core: INVALID_TO'); if (_token0 != _wETH && _token1 != _wETH) { address pool0 = XfaiLibrary.poolFor(_token0, _factory, poolCodeHash); address pool1 = XfaiLibrary.poolFor(_token1, _factory, poolCodeHash); (amount0In, ) = _swap0(pool0, _token0, pool1); (, amount1Out) = _swap1(pool1, _token1, _to, false); } else if (_token0 == _wETH) { address pool1 = XfaiLibrary.poolFor(_token1, _factory, poolCodeHash); (amount0In, amount1Out) = _swap1(pool1, _token1, _to, true); } else { address pool0 = XfaiLibrary.poolFor(_token0, _factory, poolCodeHash); (amount0In, amount1Out) = _swap0(pool0, _token0, _to); } } /** * @notice Swaps one hosted ERC20 token for another hosted ERC20 token * @dev This low-level function should be called from a contract which performs important safety checks. * This function locks the pool of _token0 and _token1 to prevent reentrancy attacks. * @param _token0 An ERC20 token address. Token must have already a pool * @param _token1 An ERC20 token address. Token must have already a pool * @param _to The address of the recipient that receives the _amount1Out tokens */ function swap( address _token0, address _token1, address _to ) external override pausable doubleLock(_token0, _token1) returns (uint amount0In, uint amount1Out) { (amount0In, amount1Out) = _swap(_token0, _token1, _to); emit Swap(msg.sender, amount0In, amount1Out, _to); } /** * @notice Performs two-sided liquidity provisioning and mints in return liquidity tokens for a given pool. The amount of liquidity tokens minted depend on the amount of _token and wETH provided * @dev This low-level function should be called from a contract which performs important safety checks. * This function locks the pool of _token to prevent reentrancy attacks. * @param _token An ERC20 token address. Token must have already a pool * @param _to The address of the recipient that receives the minted liquidity tokens * @return liquidity The amount of liquidity tokens minted */ function mint( address _token, address _to ) external override pausable singleLock(_token) returns (uint liquidity) { address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash); (uint reserve, uint weight) = IXfaiPool(pool).getStates(); uint tokenBalance = IERC20(_token).balanceOf(pool); uint wETHBalance = IERC20(wETH).balanceOf(pool); uint tokenIn = tokenBalance - reserve; uint weightIn = wETHBalance - weight; uint _totalSupply = IERC20(pool).totalSupply(); if (_totalSupply == 0) { liquidity = Math.sqrt(tokenIn * weightIn) - MINIMUM_LIQUIDITY; IXfaiPool(pool).mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min((tokenIn * _totalSupply) / reserve, (weightIn * _totalSupply) / weight); } require(liquidity > 0, 'XfaiV0Core: INSUFFICIENT_LIQUIDITY_MINTED'); IXfaiPool(pool).mint(_to, liquidity); IXfaiPool(pool).update(tokenBalance, wETHBalance); emit Mint(msg.sender, liquidity); } /** * @notice Burns existing liquidity tokens for a given pool. The amount of _token0 and _token1 returned depend on the amount of liquidity tokens burned and on the reserves & weights of pool0 and / or pool1 * @dev This low-level function should be called from a contract which performs important safety checks. * This function locks the pool of _token0 and _token1 to prevent reentrancy attacks. * @param _token0 An ERC20 token address. Token must have already a pool * @param _token1 An ERC20 token address. Token must have already a pool * @param _to The address of the recipient that receives the redeemed liquidity * @return amount0Out The amount of tokens0 that one receives * @return amount1Out THe amount of tokens1 that one receives */ function burn( address _token0, address _token1, address _to ) external override pausable doubleLock(_token0, _token1) returns (uint amount0Out, uint amount1Out) { address _wETH = wETH; // gas saving require(_token0 != _wETH, 'XfaiV0Core: INVALID_PRIMARY_TOKEN'); address pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash); address pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash); uint liquidity = IERC20(pool0).balanceOf(address(this)); uint totalSupply = IERC20(pool0).totalSupply(); amount0Out = (liquidity * IERC20(_token0).balanceOf(pool0)) / totalSupply; // using balances ensures pro-rata distribution amount1Out = (liquidity * IERC20(_wETH).balanceOf(pool0)) / totalSupply; // using balances ensures pro-rata distribution require(amount0Out > 0 && amount1Out > 0, 'XfaiV0Core: INSUFFICIENT_LIQUIDITY_BURNED'); IXfaiPool(pool0).linkedTransfer(_token0, _to, amount0Out); if (_token1 == _wETH) { IXfaiPool(pool0).linkedTransfer(_wETH, _to, amount1Out); IXfaiPool(pool0).update(IERC20(_token0).balanceOf(pool0), IERC20(_wETH).balanceOf(pool0)); } else { IXfaiPool(pool0).linkedTransfer(_wETH, pool1, amount1Out); IXfaiPool(pool0).update(IERC20(_token0).balanceOf(pool0), IERC20(_wETH).balanceOf(pool0)); (, amount1Out) = _swap1(pool1, _token1, _to, true); } IXfaiPool(pool0).burn(address(this), liquidity); emit Burn(msg.sender, amount0Out, amount1Out, _to); } /** * @notice Enables users to request flash loans from Xfai * @dev The recipient _to of the flash loan needs to be a smart contract that supports the IDeXFaiV0FlashLoan functions. * This function locks the pool of _token to prevent reentrancy attacks. * @param _token An ERC20 token address. Token must have already a pool * @param _tokenAmount The token amount for the flash loan. * @param _wethAmount The weth amount for the flash loan. * @param _to The address of the recipient that receives the flash loan * @param _data the additional bytes data used for the flash loan */ function flashLoan( address _token, uint _tokenAmount, uint _wethAmount, address _to, bytes calldata _data ) external override pausable singleLock(_token) { require(_to != address(0), 'XfaiV0Core INVALID_TO'); address _weth = wETH; address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash); uint tokenBalance = IERC20(_token).balanceOf(pool); uint wethBalance = IERC20(_weth).balanceOf(pool); require( _tokenAmount <= tokenBalance && _wethAmount <= wethBalance, 'XfaiV0Core: INSUFFICIENT_AMOUNT' ); if (_tokenAmount > 0) IXfaiPool(pool).linkedTransfer(_token, _to, _tokenAmount); // optimistically transfer tokens if (_wethAmount > 0) IXfaiPool(pool).linkedTransfer(_weth, _to, _wethAmount); // optimistically transfer tokens IXfaiV0FlashLoan(_to).flashLoan(pool, _tokenAmount, _wethAmount, _data); require( IERC20(_token).balanceOf(pool) * IERC20(_weth).balanceOf(pool) >= (tokenBalance + ((_tokenAmount * getTotalFee()) / 10000)) * (wethBalance + ((_wethAmount * getTotalFee()) / 10000)), 'XfaiV0Core: INSUFFICIENT_AMOUNT_RETURNED' ); if (_tokenAmount > 0) IXfaiPool(pool).linkedTransfer(_token, infinityNFT, (_tokenAmount * infinityNFTFee) / 10000); // send lnft fee to fee collecting contract if (_wethAmount > 0) IXfaiPool(pool).linkedTransfer(_weth, infinityNFT, (_wethAmount * infinityNFTFee) / 10000); // send lnft fee to fee collecting contract IXfaiPool(pool).update(IERC20(_token).balanceOf(pool), IERC20(_weth).balanceOf(pool)); emit FlashLoan(_to, _tokenAmount, _wethAmount); } /** * @notice Force the token balance of a pool to match its reserves * @dev This function locks the pool of _token to prevent reentrancy attacks. * @param _token An ERC20 token address. Token must have already a pool * @param _to The recipient of the skim */ function skim(address _token, address _to) external override pausable singleLock(_token) { address _wETH = wETH; // gas saving address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash); (uint reserve, uint weight) = IXfaiPool(pool).getStates(); uint tokenBalanceDif = IERC20(_token).balanceOf(pool) - reserve; uint wETHBalanceDif = IERC20(_wETH).balanceOf(pool) - weight; if (tokenBalanceDif > 0) { IXfaiPool(pool).linkedTransfer(_token, _to, tokenBalanceDif); } if (wETHBalanceDif > 0) { IXfaiPool(pool).linkedTransfer(_wETH, _to, wETHBalanceDif); } } /** * @notice Force the reserves of a pool to match its token balance * @dev This function locks the pool of _token to prevent reentrancy attacks. * @param _token An ERC20 token address. Token must have already a pool */ function sync(address _token) external override pausable singleLock(_token) { address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash); uint tokenBalance = IERC20(_token).balanceOf(pool); uint wETHBalance = IERC20(wETH).balanceOf(pool); IXfaiPool(pool).update(tokenBalance, wETHBalance); } /** * @notice Pause any function that can change the state of a pool within Xfai * @dev Only the owner of the XfaiV0Core contract can call this function * @param _p the boolean to determine if XfaiV0Core is paused or not */ function pause(bool _p) external override onlyOwner { paused = _p; emit Paused(_p); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import './IERC20.sol'; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; interface IXfaiFactory { function getPool(address _token) external view returns (address pool); function allPools(uint256) external view returns (address pool); function poolCodeHash() external pure returns (bytes32); function allPoolsLength() external view returns (uint); function createPool(address _token) external returns (address pool); function setXfaiCore(address _core) external; function getXfaiCore() external view returns (address); function setOwner(address _owner) external; function getOwner() external view returns (address); event ChangedOwner(address indexed owner); event ChangedCore(address indexed core); event Whitelisting(bool state); event PoolCreated(address indexed token, address indexed pool, uint allPoolsSize); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; import './IERC20Metadata.sol'; interface IXfaiPool is IERC20Metadata { function getXfaiCore() external view returns (address); function poolToken() external view returns (address); function initialize(address _token, address _xfaiFactory) external; function getStates() external view returns (uint, uint); function update(uint _reserveBalance, uint _weightBalance) external; function mint(address _to, uint _amount) external; function burn(address _to, uint _amount) external; function linkedTransfer(address _token, address _to, uint256 _value) external; event Sync(uint _reserve, uint _weight); event Write(uint _reserve, uint _weight, uint _blockTimestamp); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; interface IXfaiV0Core { function lpFee() external view returns (uint); function changeLpFee(uint _newFee) external; function infinityNFTFee() external view returns (uint); function changeInfinityNFTFee(uint _newFee) external; function getTotalFee() external view returns (uint); function pause(bool _p) external; function swap( address _token0, address _token1, address _to ) external returns (uint input, uint output); function flashLoan( address _token, uint _tokenAmount, uint _wethAmount, address _to, bytes calldata _data ) external; function mint(address _token, address _to) external returns (uint liquidity); function burn( address _token0, address _token1, address _to ) external returns (uint amount0, uint amount1); function skim(address _token, address _to) external; function sync(address _token) external; event ChangedOwner(address indexed owner); event Mint(address indexed sender, uint liquidity); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap(address indexed sender, uint input, uint output, address indexed to); event FlashLoan(address indexed sender, uint tokenAmount, uint wethAmount); event LpFeeChange(uint newFee); event InfinityNFTFeeChange(uint newFee); event Paused(bool p); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; interface IXfaiV0FlashLoan { function flashLoan( address sender, uint tokenAmount, uint wethAmount, bytes calldata data ) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.19; library Math { function min(uint _a, uint _b) internal pure returns (uint) { return _a < _b ? _a : _b; } function sqrt(uint _y) internal pure returns (uint z) { if (_y > 3) { z = _y; uint x = _y / 2 + 1; while (x < z) { z = x; x = (_y / x + x) / 2; } } else if (_y != 0) { z = 1; } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; import './IXfaiPool.sol'; library XfaiLibrary { /** * @notice Calculates the CREATE2 address for a pool without making any external calls * @param _token An ERC20 token address * @param _factory The factory contract of Xfai * @param _poolCodeHash The codehash of the Xfai pool contract * @return pool The deterministic pool address for a given _token */ function poolFor( address _token, address _factory, bytes32 _poolCodeHash ) internal pure returns (address pool) { pool = address( uint160( uint256( keccak256( abi.encodePacked( hex'ff', _factory, keccak256(abi.encodePacked(_token)), _poolCodeHash // init code hash ) ) ) ) ); } function getAdjustedOutput(uint _amountIn, uint _r, uint _w) internal pure returns (uint out) { out = (_amountIn * _w) / (_r + _amountIn); } function getAdjustedInput(uint _amountOut, uint _r, uint _w) internal pure returns (uint input) { input = ((_amountOut * _r) / (_w - _amountOut)) + 1; } function quote(uint _amountIn, uint _a, uint _b) internal pure returns (uint out) { out = (_amountIn * _a) / _b; } /** * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1 * @dev either token0 or token1 must be xfETH * @param _reserve0 The reserve of _token0 (can be xfETH) * @param _reserve1 The reserve of _token1 (can be xfETH) * @param _amountIn The token input amount to _pool0 * @return output The token output between a token - xfETH interaction */ function getAmountOut( uint _reserve0, uint _reserve1, uint _amountIn, uint _totalFee ) public pure returns (uint output) { require(_amountIn > 0, 'Xfai: INSUFFICIENT_AMOUNT'); require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); uint amountInWithFee = _amountIn * (10000 - _totalFee); uint numerator = amountInWithFee * _reserve1; output = numerator / (_reserve0 * 10000 + amountInWithFee); } /** * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0 * @param _reserve0 The reserve of _token0 (can be xfETH) * @param _reserve1 The reserve of _token1 (can be xfETH) * @param _amountOut The token output amount from _pool0 * @return input The token input amount to _pool0 */ function getAmountIn( uint _reserve0, uint _reserve1, uint _amountOut, uint _totalFee ) public pure returns (uint input) { require(_amountOut > 0, 'Xfai: INSUFFICIENT_AMOUNT'); require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); uint numerator = _amountOut * _reserve0 * 10000; uint denominator = (_reserve1 - _amountOut) * (10000 - _totalFee); input = (numerator / denominator) + 1; } /** * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1 * @param _pool0 A pool address * @param _pool1 A pool address * @param _amountIn The token input amount to _pool0 * @return out1 The token output amount from _pool1 */ function getAmountsOut( address _pool0, address _pool1, uint _amountIn, uint _totalFee ) public view returns (uint out1) { (uint r0, uint w0) = IXfaiPool(_pool0).getStates(); (uint r1, uint w1) = IXfaiPool(_pool1).getStates(); uint weight0Out = getAmountOut(r0, w0, _amountIn, _totalFee); out1 = getAdjustedOutput(weight0Out, w1, r1); } /** * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0 * @param _pool0 A pool address * @param _pool1 A pool address * @param _amountOut The token output amount from _pool1 * @return inp0 The token input amount to _pool0 */ function getAmountsIn( address _pool0, address _pool1, uint _amountOut, uint _totalFee ) public view returns (uint inp0) { (uint r0, uint w0) = IXfaiPool(_pool0).getStates(); (uint r1, uint w1) = IXfaiPool(_pool1).getStates(); uint weight0Out = getAdjustedInput(_amountOut, w1, r1); inp0 = getAmountIn(r0, w0, weight0Out, _totalFee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_infinityNFT","type":"address"},{"internalType":"address","name":"_wETH","type":"address"},{"internalType":"uint256","name":"_lpFee","type":"uint256"},{"internalType":"uint256","name":"_infinityNFTFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ChangedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethAmount","type":"uint256"}],"name":"FlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"InfinityNFTFeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"LpFeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"p","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"input","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"output","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLnftFee","type":"uint256"}],"name":"changeInfinityNFTFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLpFee","type":"uint256"}],"name":"changeLpFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint256","name":"_wethAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"flashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"infinityNFTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_p","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amount0In","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162004ba238038062004ba28339810160408190526200003591620000e9565b6001600160a01b03808616608081905285821660a05290841660c052600083905560018290556040805163554dcae760e01b8152905163554dcae7916004808201926020929091908290030181865afa15801562000097573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000bd919062000146565b60e05250620001609350505050565b80516001600160a01b0381168114620000e457600080fd5b919050565b600080600080600060a086880312156200010257600080fd5b6200010d86620000cc565b94506200011d60208701620000cc565b93506200012d60408701620000cc565b6060870151608090970151959894975095949392505050565b6000602082840312156200015957600080fd5b5051919050565b60805160a05160c05160e05161491a6200028860003960008181610777015281816107c6015281816113a101528181612092015281816124e001528181612cfd01528181613e9c01528181613ecb01528181613f530152613f9b0152600081816105bf01528181610687015281816111ce0152818161135a01528181611d0401528181611ee1015281816121970152818161232f0152818161265b01528181612ac001528181612cb50152818161378a01528181613ccf01526140960152600081816132b8015281816133a4015281816139a201526142a40152600081816101ca01528181610756015281816107a501528181611380015281816116fd015281816118cd01528181612071015281816124bf01528181612cdc0152613cf0015261491a6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063917c060e11610081578063a58411941161005b578063a58411941461018f578063ee1fe2ad146101a2578063f859ddd7146101b557600080fd5b8063917c060e146101605780639246f76a14610169578063933162121461017c57600080fd5b8063712b772f116100b2578063712b772f146101325780637ae316d014610145578063890305d31461014d57600080fd5b806302329a29146100d957806345a11cec146100ee578063704ce43e1461011b575b600080fd5b6100ec6100e73660046145b9565b6101c8565b005b6101016100fc366004614607565b610356565b604080519283526020830191909152015b60405180910390f35b61012460005481565b604051908152602001610112565b6100ec610140366004614652565b61115e565b6101246116e5565b6100ec61015b36600461468b565b6116fb565b61012460015481565b6100ec61017736600461468b565b6118cb565b61010161018a366004614607565b611a9b565b6100ec61019d3660046146a4565b611e71565b6101246101b0366004614652565b6122bc565b6100ec6101c33660046146c1565b612a50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610233573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610257919061476b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906020015b60405180910390a150565b600254600090819060ff16156103c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff838116908216146106285773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146106855773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff808216908a160361074e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f586661695630436f72653a20494e56414c49445f5052494d4152595f544f4b4560448201527f4e0000000000000000000000000000000000000000000000000000000000000060648201526084016102e7565b600061079b8a7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613687565b905060006107ea8a7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613687565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa15801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e9190614788565b905060008373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f19190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291925082918f16906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190614788565b61099090846147d0565b61099a91906147e7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152919b5082918716906370a0823190602401602060405180830381865afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614788565b610a3990846147d0565b610a4391906147e7565b985060008a118015610a555750600089115b610ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4255524e4544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e811660048301528c81166024830152604482018c905285169063341ce0cc90606401600060405180830381600087803b158015610b5957600080fd5b505af1158015610b6d573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610de9576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528c81166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610ca5919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d769190614788565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610dcc57600080fd5b505af1158015610de0573d6000803e3d6000fd5b5050505061103a565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528481166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610eea919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190614788565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b50505050611036838d8d6001613783565b9950505b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523060048201526024810183905273ffffffffffffffffffffffffffffffffffffffff851690639dc29fac90604401600060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b5050604080518d8152602081018d905273ffffffffffffffffffffffffffffffffffffffff8f1693503392507fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505073ffffffffffffffffffffffffffffffffffffffff938416600090815260036020526040808220600190819055949095168152939093209190915550919590945092505050565b60025460ff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290557f0000000000000000000000000000000000000000000000000000000000000000906113c5857f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613687565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114389190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918491908a16906370a0823190602401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190614788565b6114de9190614846565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000918491908816906370a0823190602401602060405180830381865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614788565b6115819190614846565b9050811561161a576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301526044820184905286169063341ce0cc90606401600060405180830381600087803b15801561160157600080fd5b505af1158015611615573d6000803e3d6000fd5b505050505b80156116b1576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015289811660248301526044820183905286169063341ce0cc90606401600060405180830381600087803b15801561169857600080fd5b505af11580156116ac573d6000803e3d6000fd5b505050505b50505073ffffffffffffffffffffffffffffffffffffffff9093166000908152600360205260409020600190555050505050565b600080546001546116f69190614859565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a919061476b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b60646001548261182e9190614859565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60008190556040518181527f6dd92a0ab9d55ea4d1c74eccd145752cd4a8b993732f2b1ba98a9c2a674cc17a9060200161034b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a919061476b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b6064816000546119fe9190614859565b1115611a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60018190556040518181527f16614206cdcb6d0d0b4c49641090b66d8bb3a213d268188947929d52c18990489060200161034b565b600254600090819060ff1615611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff83811690821614611d6d5773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611dca5773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b611dd5888888613cca565b604080518381526020810183905292975090955073ffffffffffffffffffffffffffffffffffffffff88169133917f2a9237ff5aa599ef4c5ee4b1142b53429d5755e2685fe6288b2e3320202115f5910160405180910390a35073ffffffffffffffffffffffffffffffffffffffff91821660009081526003602052604080822060019081905592909316815291909120559094909350915050565b60025460ff1615611ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290556120b6837f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613687565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000918516906370a0823190602401602060405180830381865afa158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190614788565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018490526024810182905290915073ffffffffffffffffffffffffffffffffffffffff841690632fb565e890604401600060405180830381600087803b15801561227457600080fd5b505af1158015612288573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff9094166000908152600360205260409020600190555050505050565b60025460009060ff161561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812060029055612504857f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613687565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015612553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125779190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918916906370a0823190602401602060405180830381865afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126109190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c69190614788565b905060006126d48584614846565b905060006126e28584614846565b905060008773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612731573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127559190614788565b90508060000361280e576103e861277461276f84866147d0565b613fdd565b61277e9190614846565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152600060048201526103e86024820152909a5073ffffffffffffffffffffffffffffffffffffffff8916906340c10f1990604401600060405180830381600087803b1580156127f157600080fd5b505af1158015612805573d6000803e3d6000fd5b50505050612843565b6128408761281c83866147d0565b61282691906147e7565b8761283184866147d0565b61283b91906147e7565b61404d565b99505b60008a116128d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4d494e544544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c90528916906340c10f1990604401600060405180830381600087803b15801561294357600080fd5b505af1158015612957573d6000803e3d6000fd5b50506040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018890526024810187905273ffffffffffffffffffffffffffffffffffffffff8b169250632fb565e89150604401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b50506040518c81523392507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885915060200160405180910390a250505073ffffffffffffffffffffffffffffffffffffffff90951660009081526003602052604090206001905550939695505050505050565b60025460ff1615612abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600360205260409020600290558416612cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f726520494e56414c49445f544f000000000000000000000060448201526064016102e7565b7f00000000000000000000000000000000000000000000000000000000000000006000612d21897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613687565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000918b16906370a0823190602401602060405180830381865afa158015612d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db79190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192506000918516906370a0823190602401602060405180830381865afa158015612e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4d9190614788565b9050818a11158015612e5f5750808911155b612ec5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f586661695630436f72653a20494e53554646494349454e545f414d4f554e540060448201526064016102e7565b8915612f5c576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301528981166024830152604482018c905284169063341ce0cc90606401600060405180830381600087803b158015612f4357600080fd5b505af1158015612f57573d6000803e3d6000fd5b505050505b8815612ff3576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528981166024830152604482018b905284169063341ce0cc90606401600060405180830381600087803b158015612fda57600080fd5b505af1158015612fee573d6000803e3d6000fd5b505050505b6040517f679f057900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063679f05799061304d9086908e908e908d908d9060040161486c565b600060405180830381600087803b15801561306757600080fd5b505af115801561307b573d6000803e3d6000fd5b5050505061271061308a6116e5565b613094908b6147d0565b61309e91906147e7565b6130a89082614859565b6127106130b36116e5565b6130bd908d6147d0565b6130c791906147e7565b6130d19084614859565b6130db91906147d0565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528616906370a0823190602401602060405180830381865afa158015613147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316b9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528e16906370a0823190602401602060405180830381865afa1580156131d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fb9190614788565b61320591906147d0565b1015613293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f586661695630436f72653a20494e53554646494349454e545f414d4f554e545f60448201527f52455455524e454400000000000000000000000000000000000000000000000060648201526084016102e7565b891561337f578273ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8c7f00000000000000000000000000000000000000000000000000000000000000006127106001548f6132e891906147d0565b6132f291906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050505b881561346b578273ffffffffffffffffffffffffffffffffffffffff1663341ce0cc857f00000000000000000000000000000000000000000000000000000000000000006127106001548e6133d491906147d0565b6133de91906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561345257600080fd5b505af1158015613466573d6000803e3d6000fd5b505050505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830181905291632fb565e8918e16906370a0823190602401602060405180830381865afa1580156134e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135049190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528816906370a0823190602401602060405180830381865afa158015613570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135949190614788565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b1580156135ea57600080fd5b505af11580156135fe573d6000803e3d6000fd5b5050604080518d8152602081018d905273ffffffffffffffffffffffffffffffffffffffff8c1693507f31aaad38f00845a242d16ae90d7bd72fc68f0e22581470f9dc0de241210c288692500160405180910390a25050505073ffffffffffffffffffffffffffffffffffffffff16600090815260036020526040902060019055505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009083906034016040516020818303038152906040528051906020012083604051602001613745939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60008060007f0000000000000000000000000000000000000000000000000000000000000000905060008790506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156137fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138219190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529294509092506000918616906370a0823190602401602060405180830381865afa158015613896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ba9190614788565b90506138c68282614846565b9650871515600103613a6d577359eaeb942af4b7025481e3ef46265c5dad50d3156352707d8c83858a6138f76116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561395d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139819190614788565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc867f00000000000000000000000000000000000000000000000000000000000000006127106001548c6139d291906147d0565b6139dc91906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b158015613a5057600080fd5b505af1158015613a64573d6000803e3d6000fd5b50505050613a7b565b613a78878385614067565b95505b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a811660248301526044820188905285169063341ce0cc90606401600060405180830381600087803b158015613af357600080fd5b505af1158015613b07573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e81166004830152881692506370a082319150602401602060405180830381865afa158015613b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9b9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529192506000918c16906370a0823190602401602060405180830381865afa158015613c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c319190614788565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810184905290915073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b158015613ca357600080fd5b505af1158015613cb7573d6000803e3d6000fd5b5050505050505050505094509492505050565b6000807f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff80881690861603613d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015613e8e57508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15613f17576000613ec088837f0000000000000000000000000000000000000000000000000000000000000000613687565b90506000613eef88847f0000000000000000000000000000000000000000000000000000000000000000613687565b9050613efc828a8361408f565b509550613f0c8189896000613783565b9550613fd392505050565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603613f92576000613f7787837f0000000000000000000000000000000000000000000000000000000000000000613687565b9050613f868188886001613783565b9095509350613fd39050565b6000613fbf88837f0000000000000000000000000000000000000000000000000000000000000000613687565b9050613fcc81898861408f565b9095509350505b5050935093915050565b6000600382111561403e5750806000613ff76002836147e7565b614002906001614859565b90505b818110156140385790508060028161401d81866147e7565b6140279190614859565b61403191906147e7565b9050614005565b50919050565b8115614048575060015b919050565b600081831061405c578161405e565b825b90505b92915050565b60006140738484614859565b61407d83866147d0565b61408791906147e7565b949350505050565b60008060007f0000000000000000000000000000000000000000000000000000000000000000905060008690506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015614109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412d9190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301529294509092506000918a16906370a0823190602401602060405180830381865afa1580156141a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c69190614788565b90506141d28382614846565b96507359eaeb942af4b7025481e3ef46265c5dad50d3156352707d8c84848a6141f96116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561425f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142839190614788565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8a7f00000000000000000000000000000000000000000000000000000000000000006127106001548c6142d491906147d0565b6142de91906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561435257600080fd5b505af1158015614366573d6000803e3d6000fd5b50506040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528b81166024830152604482018a90528716925063341ce0cc9150606401600060405180830381600087803b1580156143e257600080fd5b505af11580156143f6573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d8116600483015260009350881691506370a0823190602401602060405180830381865afa158015614469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061448d9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d81166004830152919250908b16906370a0823190602401602060405180830381865afa1580156144fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145219190614788565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810183905290925073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b15801561459357600080fd5b505af11580156145a7573d6000803e3d6000fd5b50505050505050505050935093915050565b6000602082840312156145cb57600080fd5b813580151581146145db57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461460457600080fd5b50565b60008060006060848603121561461c57600080fd5b8335614627816145e2565b92506020840135614637816145e2565b91506040840135614647816145e2565b809150509250925092565b6000806040838503121561466557600080fd5b8235614670816145e2565b91506020830135614680816145e2565b809150509250929050565b60006020828403121561469d57600080fd5b5035919050565b6000602082840312156146b657600080fd5b81356145db816145e2565b60008060008060008060a087890312156146da57600080fd5b86356146e5816145e2565b955060208701359450604087013593506060870135614703816145e2565b9250608087013567ffffffffffffffff8082111561472057600080fd5b818901915089601f83011261473457600080fd5b81358181111561474357600080fd5b8a602082850101111561475557600080fd5b6020830194508093505050509295509295509295565b60006020828403121561477d57600080fd5b81516145db816145e2565b60006020828403121561479a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417614061576140616147a1565b60008261481d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000806040838503121561483557600080fd5b505080516020909101519092909150565b81810381811115614061576140616147a1565b80820180821115614061576140616147a1565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea26469706673582212208b82843cd564717e7b18ecd9426f92b9443b074392d5057df8cb7aa22dd6045064736f6c63430008130033000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca26000000000000000000000000a155f12d3be29bf20b615e1e7f066ae9e3c5239a000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100d45760003560e01c8063917c060e11610081578063a58411941161005b578063a58411941461018f578063ee1fe2ad146101a2578063f859ddd7146101b557600080fd5b8063917c060e146101605780639246f76a14610169578063933162121461017c57600080fd5b8063712b772f116100b2578063712b772f146101325780637ae316d014610145578063890305d31461014d57600080fd5b806302329a29146100d957806345a11cec146100ee578063704ce43e1461011b575b600080fd5b6100ec6100e73660046145b9565b6101c8565b005b6101016100fc366004614607565b610356565b604080519283526020830191909152015b60405180910390f35b61012460005481565b604051908152602001610112565b6100ec610140366004614652565b61115e565b6101246116e5565b6100ec61015b36600461468b565b6116fb565b61012460015481565b6100ec61017736600461468b565b6118cb565b61010161018a366004614607565b611a9b565b6100ec61019d3660046146a4565b611e71565b6101246101b0366004614652565b6122bc565b6100ec6101c33660046146c1565b612a50565b7f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca2673ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610233573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610257919061476b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906020015b60405180910390a150565b600254600090819060ff16156103c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff838116908216146106285773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146106855773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff808216908a160361074e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f586661695630436f72653a20494e56414c49445f5052494d4152595f544f4b4560448201527f4e0000000000000000000000000000000000000000000000000000000000000060648201526084016102e7565b600061079b8a7f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b905060006107ea8a7f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa15801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e9190614788565b905060008373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f19190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291925082918f16906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190614788565b61099090846147d0565b61099a91906147e7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152919b5082918716906370a0823190602401602060405180830381865afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614788565b610a3990846147d0565b610a4391906147e7565b985060008a118015610a555750600089115b610ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4255524e4544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e811660048301528c81166024830152604482018c905285169063341ce0cc90606401600060405180830381600087803b158015610b5957600080fd5b505af1158015610b6d573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610de9576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528c81166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610ca5919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d769190614788565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610dcc57600080fd5b505af1158015610de0573d6000803e3d6000fd5b5050505061103a565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528481166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610eea919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190614788565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b50505050611036838d8d6001613783565b9950505b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523060048201526024810183905273ffffffffffffffffffffffffffffffffffffffff851690639dc29fac90604401600060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b5050604080518d8152602081018d905273ffffffffffffffffffffffffffffffffffffffff8f1693503392507fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505073ffffffffffffffffffffffffffffffffffffffff938416600090815260036020526040808220600190819055949095168152939093209190915550919590945092505050565b60025460ff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b817f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290557f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f906113c5857f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114389190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918491908a16906370a0823190602401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190614788565b6114de9190614846565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000918491908816906370a0823190602401602060405180830381865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614788565b6115819190614846565b9050811561161a576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301526044820184905286169063341ce0cc90606401600060405180830381600087803b15801561160157600080fd5b505af1158015611615573d6000803e3d6000fd5b505050505b80156116b1576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015289811660248301526044820183905286169063341ce0cc90606401600060405180830381600087803b15801561169857600080fd5b505af11580156116ac573d6000803e3d6000fd5b505050505b50505073ffffffffffffffffffffffffffffffffffffffff9093166000908152600360205260409020600190555050505050565b600080546001546116f69190614859565b905090565b7f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca2673ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a919061476b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b60646001548261182e9190614859565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60008190556040518181527f6dd92a0ab9d55ea4d1c74eccd145752cd4a8b993732f2b1ba98a9c2a674cc17a9060200161034b565b7f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca2673ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a919061476b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b6064816000546119fe9190614859565b1115611a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60018190556040518181527f16614206cdcb6d0d0b4c49641090b66d8bb3a213d268188947929d52c18990489060200161034b565b600254600090819060ff1615611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff83811690821614611d6d5773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611dca5773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b611dd5888888613cca565b604080518381526020810183905292975090955073ffffffffffffffffffffffffffffffffffffffff88169133917f2a9237ff5aa599ef4c5ee4b1142b53429d5755e2685fe6288b2e3320202115f5910160405180910390a35073ffffffffffffffffffffffffffffffffffffffff91821660009081526003602052604080822060019081905592909316815291909120559094909350915050565b60025460ff1615611ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b807f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290556120b6837f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000918516906370a0823190602401602060405180830381865afa158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192506000917f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16906370a0823190602401602060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190614788565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018490526024810182905290915073ffffffffffffffffffffffffffffffffffffffff841690632fb565e890604401600060405180830381600087803b15801561227457600080fd5b505af1158015612288573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff9094166000908152600360205260409020600190555050505050565b60025460009060ff161561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b827f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812060029055612504857f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015612553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125779190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918916906370a0823190602401602060405180830381865afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126109190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000917f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c69190614788565b905060006126d48584614846565b905060006126e28584614846565b905060008773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612731573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127559190614788565b90508060000361280e576103e861277461276f84866147d0565b613fdd565b61277e9190614846565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152600060048201526103e86024820152909a5073ffffffffffffffffffffffffffffffffffffffff8916906340c10f1990604401600060405180830381600087803b1580156127f157600080fd5b505af1158015612805573d6000803e3d6000fd5b50505050612843565b6128408761281c83866147d0565b61282691906147e7565b8761283184866147d0565b61283b91906147e7565b61404d565b99505b60008a116128d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4d494e544544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c90528916906340c10f1990604401600060405180830381600087803b15801561294357600080fd5b505af1158015612957573d6000803e3d6000fd5b50506040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018890526024810187905273ffffffffffffffffffffffffffffffffffffffff8b169250632fb565e89150604401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b50506040518c81523392507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885915060200160405180910390a250505073ffffffffffffffffffffffffffffffffffffffff90951660009081526003602052604090206001905550939695505050505050565b60025460ff1615612abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b857f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600360205260409020600290558416612cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f726520494e56414c49445f544f000000000000000000000060448201526064016102e7565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6000612d21897f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000918b16906370a0823190602401602060405180830381865afa158015612d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db79190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192506000918516906370a0823190602401602060405180830381865afa158015612e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4d9190614788565b9050818a11158015612e5f5750808911155b612ec5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f586661695630436f72653a20494e53554646494349454e545f414d4f554e540060448201526064016102e7565b8915612f5c576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301528981166024830152604482018c905284169063341ce0cc90606401600060405180830381600087803b158015612f4357600080fd5b505af1158015612f57573d6000803e3d6000fd5b505050505b8815612ff3576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528981166024830152604482018b905284169063341ce0cc90606401600060405180830381600087803b158015612fda57600080fd5b505af1158015612fee573d6000803e3d6000fd5b505050505b6040517f679f057900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063679f05799061304d9086908e908e908d908d9060040161486c565b600060405180830381600087803b15801561306757600080fd5b505af115801561307b573d6000803e3d6000fd5b5050505061271061308a6116e5565b613094908b6147d0565b61309e91906147e7565b6130a89082614859565b6127106130b36116e5565b6130bd908d6147d0565b6130c791906147e7565b6130d19084614859565b6130db91906147d0565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528616906370a0823190602401602060405180830381865afa158015613147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316b9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528e16906370a0823190602401602060405180830381865afa1580156131d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fb9190614788565b61320591906147d0565b1015613293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f586661695630436f72653a20494e53554646494349454e545f414d4f554e545f60448201527f52455455524e454400000000000000000000000000000000000000000000000060648201526084016102e7565b891561337f578273ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8c7f000000000000000000000000a155f12d3be29bf20b615e1e7f066ae9e3c5239a6127106001548f6132e891906147d0565b6132f291906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050505b881561346b578273ffffffffffffffffffffffffffffffffffffffff1663341ce0cc857f000000000000000000000000a155f12d3be29bf20b615e1e7f066ae9e3c5239a6127106001548e6133d491906147d0565b6133de91906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561345257600080fd5b505af1158015613466573d6000803e3d6000fd5b505050505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830181905291632fb565e8918e16906370a0823190602401602060405180830381865afa1580156134e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135049190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528816906370a0823190602401602060405180830381865afa158015613570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135949190614788565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b1580156135ea57600080fd5b505af11580156135fe573d6000803e3d6000fd5b5050604080518d8152602081018d905273ffffffffffffffffffffffffffffffffffffffff8c1693507f31aaad38f00845a242d16ae90d7bd72fc68f0e22581470f9dc0de241210c288692500160405180910390a25050505073ffffffffffffffffffffffffffffffffffffffff16600090815260036020526040902060019055505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009083906034016040516020818303038152906040528051906020012083604051602001613745939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60008060007f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f905060008790506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156137fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138219190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529294509092506000918616906370a0823190602401602060405180830381865afa158015613896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ba9190614788565b90506138c68282614846565b9650871515600103613a6d577359eaeb942af4b7025481e3ef46265c5dad50d3156352707d8c83858a6138f76116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561395d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139819190614788565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc867f000000000000000000000000a155f12d3be29bf20b615e1e7f066ae9e3c5239a6127106001548c6139d291906147d0565b6139dc91906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b158015613a5057600080fd5b505af1158015613a64573d6000803e3d6000fd5b50505050613a7b565b613a78878385614067565b95505b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a811660248301526044820188905285169063341ce0cc90606401600060405180830381600087803b158015613af357600080fd5b505af1158015613b07573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e81166004830152881692506370a082319150602401602060405180830381865afa158015613b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9b9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529192506000918c16906370a0823190602401602060405180830381865afa158015613c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c319190614788565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810184905290915073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b158015613ca357600080fd5b505af1158015613cb7573d6000803e3d6000fd5b5050505050505050505094509492505050565b6000807f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f7f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca2673ffffffffffffffffffffffffffffffffffffffff80881690861603613d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015613e8e57508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15613f17576000613ec088837fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b90506000613eef88847fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b9050613efc828a8361408f565b509550613f0c8189896000613783565b9550613fd392505050565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603613f92576000613f7787837fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b9050613f868188886001613783565b9095509350613fd39050565b6000613fbf88837fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330613687565b9050613fcc81898861408f565b9095509350505b5050935093915050565b6000600382111561403e5750806000613ff76002836147e7565b614002906001614859565b90505b818110156140385790508060028161401d81866147e7565b6140279190614859565b61403191906147e7565b9050614005565b50919050565b8115614048575060015b919050565b600081831061405c578161405e565b825b90505b92915050565b60006140738484614859565b61407d83866147d0565b61408791906147e7565b949350505050565b60008060007f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f905060008690506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015614109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412d9190614822565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301529294509092506000918a16906370a0823190602401602060405180830381865afa1580156141a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c69190614788565b90506141d28382614846565b96507359eaeb942af4b7025481e3ef46265c5dad50d3156352707d8c84848a6141f96116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561425f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142839190614788565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8a7f000000000000000000000000a155f12d3be29bf20b615e1e7f066ae9e3c5239a6127106001548c6142d491906147d0565b6142de91906147e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561435257600080fd5b505af1158015614366573d6000803e3d6000fd5b50506040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528b81166024830152604482018a90528716925063341ce0cc9150606401600060405180830381600087803b1580156143e257600080fd5b505af11580156143f6573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d8116600483015260009350881691506370a0823190602401602060405180830381865afa158015614469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061448d9190614788565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d81166004830152919250908b16906370a0823190602401602060405180830381865afa1580156144fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145219190614788565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810183905290925073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b15801561459357600080fd5b505af11580156145a7573d6000803e3d6000fd5b50505050505050505050935093915050565b6000602082840312156145cb57600080fd5b813580151581146145db57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461460457600080fd5b50565b60008060006060848603121561461c57600080fd5b8335614627816145e2565b92506020840135614637816145e2565b91506040840135614647816145e2565b809150509250925092565b6000806040838503121561466557600080fd5b8235614670816145e2565b91506020830135614680816145e2565b809150509250929050565b60006020828403121561469d57600080fd5b5035919050565b6000602082840312156146b657600080fd5b81356145db816145e2565b60008060008060008060a087890312156146da57600080fd5b86356146e5816145e2565b955060208701359450604087013593506060870135614703816145e2565b9250608087013567ffffffffffffffff8082111561472057600080fd5b818901915089601f83011261473457600080fd5b81358181111561474357600080fd5b8a602082850101111561475557600080fd5b6020830194508093505050509295509295509295565b60006020828403121561477d57600080fd5b81516145db816145e2565b60006020828403121561479a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417614061576140616147a1565b60008261481d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000806040838503121561483557600080fd5b505080516020909101519092909150565b81810381811115614061576140616147a1565b80820180821115614061576140616147a1565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea26469706673582212208b82843cd564717e7b18ecd9426f92b9443b074392d5057df8cb7aa22dd6045064736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca26000000000000000000000000a155f12d3be29bf20b615e1e7f066ae9e3c5239a000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a
-----Decoded View---------------
Arg [0] : _factory (address): 0xa5136eAd459F0E61C99Cec70fe8F5C24cF3ecA26
Arg [1] : _infinityNFT (address): 0xa155f12D3Be29BF20b615e1e7F066aE9E3C5239a
Arg [2] : _wETH (address): 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f
Arg [3] : _lpFee (uint256): 10
Arg [4] : _infinityNFTFee (uint256): 10
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca26
Arg [1] : 000000000000000000000000a155f12d3be29bf20b615e1e7f066ae9e3c5239a
Arg [2] : 000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode Sourcemap
400:15463:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15766:95;;;;;;:::i;:::-;;:::i;:::-;;10307:1513;;;;;;:::i;:::-;;:::i;:::-;;;;1159:25:9;;;1215:2;1200:18;;1193:34;;;;1132:18;10307:1513:8;;;;;;;;784:26;;;;;;;;;1384:25:9;;;1372:2;1357:18;784:26:8;1238:177:9;14359:610:8;;;;;;:::i;:::-;;:::i;4200:99::-;;;:::i;3356:211::-;;;;;;:::i;:::-;;:::i;881:35::-;;;;;;3772:237;;;;;;:::i;:::-;;:::i;7544:317::-;;;;;;:::i;:::-;;:::i;15208:316::-;;;;;;:::i;:::-;;:::i;8478:1050::-;;;;;;:::i;:::-;;:::i;12432:1646::-;;;;;;:::i;:::-;;:::i;15766:95::-;2421:7;2408:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2394:46;;:10;:46;;;2386:80;;;;;;;3718:2:9;2386:80:8;;;3700:21:9;3757:2;3737:18;;;3730:30;3796:23;3776:18;;;3769:51;3837:18;;2386:80:8;;;;;;;;;15824:6:::1;:11:::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;15846:10:::1;::::0;4006:41:9;;;15846:10:8::1;::::0;3994:2:9;3979:18;15846:10:8::1;;;;;;;;15766:95:::0;:::o;10307:1513::-;2305:6;;10469:15;;;;2305:6;;:15;2297:46;;;;;;;4260:2:9;2297:46:8;;;4242:21:9;4299:2;4279:18;;;4272:30;4338:20;4318:18;;;4311:48;4376:18;;2297:46:8;4058:342:9;2297:46:8;1821:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;10438:7;;10447;;1821:28;;1813:67:::1;;;::::0;::::1;::::0;;4607:2:9;1813:67:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1813:67:8::1;4405:350:9::0;1813:67:8::1;1894:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;:28;;1886:67:::1;;;::::0;::::1;::::0;;4607:2:9;1886:67:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1886:67:8::1;4405:350:9::0;1886:67:8::1;1978:7;1967:18;;:7;:18;;::::0;1959:58:::1;;;::::0;::::1;::::0;;4962:2:9;1959:58:8::1;::::0;::::1;4944:21:9::0;5001:2;4981:18;;;4974:30;5040:29;5020:18;;;5013:57;5087:18;;1959:58:8::1;4760:351:9::0;1959:58:8::1;2039:4;2053:16;::::0;;::::1;::::0;;::::1;;2049:64;;2079:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1033:1:::1;2079:27:::0;;2049:64:::1;2133:5;2122:16;;:7;:16;;;2118:64;;2148:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1033:1:::1;2148:27:::0;;2118:64:::1;10527:4:::2;10559:16;::::0;;::::2;::::0;;::::2;::::0;10551:62:::2;;;::::0;::::2;::::0;;5318:2:9;10551:62:8::2;::::0;::::2;5300:21:9::0;5357:2;5337:18;;;5330:30;5396:34;5376:18;;;5369:62;5467:3;5447:18;;;5440:31;5488:19;;10551:62:8::2;5116:397:9::0;10551:62:8::2;10619:13;10635:51;10655:7;10664;10673:12;10635:19;:51::i;:::-;10619:67;;10692:13;10708:51;10728:7;10737;10746:12;10708:19;:51::i;:::-;10782:38;::::0;;;;10814:4:::2;10782:38;::::0;::::2;5664:74:9::0;10692:67:8;;-1:-1:-1;10765:14:8::2;::::0;10782:23:::2;::::0;::::2;::::0;::::2;::::0;5637:18:9;;10782:38:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10765:55;;10826:16;10852:5;10845:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10904:32;::::0;;;;:25:::2;5682:55:9::0;;;10904:32:8::2;::::0;::::2;5664:74:9::0;10826:46:8;;-1:-1:-1;10826:46:8;;10904:25;::::2;::::0;::::2;::::0;5637:18:9;;10904:32:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10892:44;::::0;:9;:44:::2;:::i;:::-;10891:60;;;;:::i;:::-;11031:30;::::0;;;;:23:::2;5682:55:9::0;;;11031:30:8::2;::::0;::::2;5664:74:9::0;10878:73:8;;-1:-1:-1;11065:11:8;;11031:23;::::2;::::0;::::2;::::0;5637:18:9;;11031:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11019:42;::::0;:9;:42:::2;:::i;:::-;11018:58;;;;:::i;:::-;11005:71;;11151:1;11138:10;:14;:32;;;;;11169:1;11156:10;:14;11138:32;11130:86;;;::::0;::::2;::::0;;6781:2:9;11130:86:8::2;::::0;::::2;6763:21:9::0;6820:2;6800:18;;;6793:30;6859:34;6839:18;;;6832:62;6930:11;6910:18;;;6903:39;6959:19;;11130:86:8::2;6579:405:9::0;11130:86:8::2;11222:57;::::0;;;;:31:::2;7270:15:9::0;;;11222:57:8::2;::::0;::::2;7252:34:9::0;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;11222:31:8;::::2;::::0;::::2;::::0;7164:18:9;;11222:57:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11300:5;11289:16;;:7;:16;;::::0;11285:422:::2;;11315:55;::::0;;;;:31:::2;7270:15:9::0;;;11315:55:8::2;::::0;::::2;7252:34:9::0;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;11315:31:8;::::2;::::0;::::2;::::0;7164:18:9;;11315:55:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11388:5;11378:23;;;11409:7;11402:25;;;11428:5;11402:32;;;;;;;;;;;;;;5694:42:9::0;5682:55;;;;5664:74;;5652:2;5637:18;;5518:226;11402:32:8::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11436:30;::::0;;;;:23:::2;5682:55:9::0;;;11436:30:8::2;::::0;::::2;5664:74:9::0;11436:23:8;::::2;::::0;::::2;::::0;5637:18:9;;11436:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11378:89;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;1159:25:9::0;;;;1200:18;;;1193:34;1132:18;;11378:89:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11285:422;;;11488:57;::::0;;;;:31:::2;7270:15:9::0;;;11488:57:8::2;::::0;::::2;7252:34:9::0;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;11488:31:8;::::2;::::0;::::2;::::0;7164:18:9;;11488:57:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11563:5;11553:23;;;11584:7;11577:25;;;11603:5;11577:32;;;;;;;;;;;;;;5694:42:9::0;5682:55;;;;5664:74;;5652:2;5637:18;;5518:226;11577:32:8::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11611:30;::::0;;;;:23:::2;5682:55:9::0;;;11611:30:8::2;::::0;::::2;5664:74:9::0;11611:23:8;::::2;::::0;::::2;::::0;5637:18:9;;11611:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11553:89;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;1159:25:9::0;;;;1200:18;;;1193:34;1132:18;;11553:89:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11667:33;11674:5;11681:7;11690:3;11695:4;11667:6;:33::i;:::-;11650:50:::0;-1:-1:-1;;11285:422:8::2;11712:47;::::0;;;;11742:4:::2;11712:47;::::0;::::2;7566:74:9::0;7656:18;;;7649:34;;;11712:21:8::2;::::0;::::2;::::0;::::2;::::0;7539:18:9;;11712:47:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;11770:45:8::2;::::0;;1159:25:9;;;1215:2;1200:18;;1193:34;;;11770:45:8::2;::::0;::::2;::::0;-1:-1:-1;11775:10:8::2;::::0;-1:-1:-1;11770:45:8::2;::::0;1132:18:9;11770:45:8::2;;;;;;;-1:-1:-1::0;;;;2194:17:8::1;::::0;;::::1;;::::0;;;:8:::1;:17;::::0;;;;;996:1:::1;2194:31:::0;;;;2231:17;;;::::1;::::0;;;;;;:31;;;;-1:-1:-1;10307:1513:8;;;;-1:-1:-1;10307:1513:8;-1:-1:-1;;;10307:1513:8:o;14359:610::-;2305:6;;;;:15;2297:46;;;;;;;4260:2:9;2297:46:8;;;4242:21:9;4299:2;4279:18;;;4272:30;4338:20;4318:18;;;4311:48;4376:18;;2297:46:8;4058:342:9;2297:46:8;14440:6:::1;1563:4;1553:14;;:6;:14;;::::0;1545:52:::1;;;::::0;::::1;::::0;;7896:2:9;1545:52:8::1;::::0;::::1;7878:21:9::0;7935:2;7915:18;;;7908:30;7974:27;7954:18;;;7947:55;8019:18;;1545:52:8::1;7694:349:9::0;1545:52:8::1;1611:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1603:66:::1;;;::::0;::::1;::::0;;4607:2:9;1603:66:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1603:66:8::1;4405:350:9::0;1603:66:8::1;1675:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;1033:1:::1;1675:26:::0;;14470:4:::2;::::0;14509:50:::2;14529:6:::0;14537:7:::2;14546:12;14509:19;:50::i;:::-;14494:65;;14566:12;14580:11:::0;14605:4:::2;14595:25;;;:27;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14651:30;::::0;;;;:24:::2;5682:55:9::0;;;14651:30:8::2;::::0;::::2;5664:74:9::0;14565:57:8;;-1:-1:-1;14565:57:8;;-1:-1:-1;14628:20:8::2;::::0;14565:57;;14651:24;;::::2;::::0;::::2;::::0;5637:18:9;;14651:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;;:::i;:::-;14719:29;::::0;;;;:23:::2;5682:55:9::0;;;14719:29:8::2;::::0;::::2;5664:74:9::0;14628:63:8;;-1:-1:-1;14697:19:8::2;::::0;14751:6;;14719:23;;::::2;::::0;::::2;::::0;5637:18:9;;14719:29:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;;:::i;:::-;14697:60:::0;-1:-1:-1;14767:19:8;;14763:100:::2;;14796:60;::::0;;;;:30:::2;7270:15:9::0;;;14796:60:8::2;::::0;::::2;7252:34:9::0;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;14796:30:8;::::2;::::0;::::2;::::0;7164:18:9;;14796:60:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;14763:100;14872:18:::0;;14868:97:::2;;14900:58;::::0;;;;:30:::2;7270:15:9::0;;;14900:58:8::2;::::0;::::2;7252:34:9::0;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;14900:30:8;::::2;::::0;::::2;::::0;7164:18:9;;14900:58:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;14868:97;-1:-1:-1::0;;;1714:16:8::1;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;996:1:::1;1714:30:::0;;-1:-1:-1;;;;;14359:610:8:o;4200:99::-;4253:4;4289:5;;4272:14;;:22;;;;:::i;:::-;4265:29;;4200:99;:::o;3356:211::-;2421:7;2408:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2394:46;;:10;:46;;;2386:80;;;;;;;3718:2:9;2386:80:8;;;3700:21:9;3757:2;3737:18;;;3730:30;3796:23;3776:18;;;3769:51;3837:18;;2386:80:8;3516:345:9;2386:80:8;953:3:::1;3447:14;;3435:9;:26;;;;:::i;:::-;:37;;3427:79;;;::::0;::::1;::::0;;8763:2:9;3427:79:8::1;::::0;::::1;8745:21:9::0;8802:2;8782:18;;;8775:30;8841:31;8821:18;;;8814:59;8890:18;;3427:79:8::1;8561:353:9::0;3427:79:8::1;3512:5;:17:::0;;;3540:22:::1;::::0;1384:25:9;;;3540:22:8::1;::::0;1372:2:9;1357:18;3540:22:8::1;1238:177:9::0;3772:237:8;2421:7;2408:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2394:46;;:10;:46;;;2386:80;;;;;;;3718:2:9;2386:80:8;;;3700:21:9;3757:2;3737:18;;;3730:30;3796:23;3776:18;;;3769:51;3837:18;;2386:80:8;3516:345:9;2386:80:8;953:3:::1;3870:11;3862:5;;:19;;;;:::i;:::-;:30;;3854:72;;;::::0;::::1;::::0;;8763:2:9;3854:72:8::1;::::0;::::1;8745:21:9::0;8802:2;8782:18;;;8775:30;8841:31;8821:18;;;8814:59;8890:18;;3854:72:8::1;8561:353:9::0;3854:72:8::1;3932:14;:28:::0;;;3971:33:::1;::::0;1384:25:9;;;3971:33:8::1;::::0;1372:2:9;1357:18;3971:33:8::1;1238:177:9::0;7544:317:8;2305:6;;7706:14;;;;2305:6;;:15;2297:46;;;;;;;4260:2:9;2297:46:8;;;4242:21:9;4299:2;4279:18;;;4272:30;4338:20;4318:18;;;4311:48;4376:18;;2297:46:8;4058:342:9;2297:46:8;1821:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;7675:7;;7684;;1821:28;;1813:67:::1;;;::::0;::::1;::::0;;4607:2:9;1813:67:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1813:67:8::1;4405:350:9::0;1813:67:8::1;1894:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;:28;;1886:67:::1;;;::::0;::::1;::::0;;4607:2:9;1886:67:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1886:67:8::1;4405:350:9::0;1886:67:8::1;1978:7;1967:18;;:7;:18;;::::0;1959:58:::1;;;::::0;::::1;::::0;;4962:2:9;1959:58:8::1;::::0;::::1;4944:21:9::0;5001:2;4981:18;;;4974:30;5040:29;5020:18;;;5013:57;5087:18;;1959:58:8::1;4760:351:9::0;1959:58:8::1;2039:4;2053:16;::::0;;::::1;::::0;;::::1;;2049:64;;2079:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1033:1:::1;2079:27:::0;;2049:64:::1;2133:5;2122:16;;:7;:16;;;2118:64;;2148:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1033:1:::1;2148:27:::0;;2118:64:::1;7773:28:::2;7779:7;7788;7797:3;7773:5;:28::i;:::-;7812:44;::::0;;1159:25:9;;;1215:2;1200:18;;1193:34;;;7747:54:8;;-1:-1:-1;7747:54:8;;-1:-1:-1;7812:44:8::2;::::0;::::2;::::0;7817:10:::2;::::0;7812:44:::2;::::0;1132:18:9;7812:44:8::2;;;;;;;-1:-1:-1::0;2194:17:8::1;::::0;;::::1;;::::0;;;:8:::1;:17;::::0;;;;;996:1:::1;2194:31:::0;;;;2231:17;;;::::1;::::0;;;;;;:31;7544:317;;;;-1:-1:-1;7544:317:8;-1:-1:-1;;7544:317:8:o;15208:316::-;2305:6;;;;:15;2297:46;;;;;;;4260:2:9;2297:46:8;;;4242:21:9;4299:2;4279:18;;;4272:30;4338:20;4318:18;;;4311:48;4376:18;;2297:46:8;4058:342:9;2297:46:8;15276:6:::1;1563:4;1553:14;;:6;:14;;::::0;1545:52:::1;;;::::0;::::1;::::0;;7896:2:9;1545:52:8::1;::::0;::::1;7878:21:9::0;7935:2;7915:18;;;7908:30;7974:27;7954:18;;;7947:55;8019:18;;1545:52:8::1;7694:349:9::0;1545:52:8::1;1611:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1603:66:::1;;;::::0;::::1;::::0;;4607:2:9;1603:66:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1603:66:8::1;4405:350:9::0;1603:66:8::1;1675:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;1033:1:::1;1675:26:::0;;15305:50:::2;15325:6:::0;15333:7:::2;15342:12;15305:19;:50::i;:::-;15381:30;::::0;;;;:24:::2;5682:55:9::0;;;15381:30:8::2;::::0;::::2;5664:74:9::0;15290:65:8;;-1:-1:-1;15361:17:8::2;::::0;15381:24;::::2;::::0;::::2;::::0;5637:18:9;;15381:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15436:28;::::0;;;;:22:::2;5682:55:9::0;;;15436:28:8::2;::::0;::::2;5664:74:9::0;15361:50:8;;-1:-1:-1;15417:16:8::2;::::0;15443:4:::2;15436:22;::::0;::::2;::::0;5637:18:9;;15436:28:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15470:49;::::0;;;;::::2;::::0;::::2;1159:25:9::0;;;1200:18;;;1193:34;;;15417:47:8;;-1:-1:-1;15470:22:8::2;::::0;::::2;::::0;::::2;::::0;1132:18:9;;15470:49:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;1714:16:8::1;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;996:1:::1;1714:30:::0;;-1:-1:-1;;;;;15208:316:8:o;8478:1050::-;2305:6;;8588:14;;2305:6;;:15;2297:46;;;;;;;4260:2:9;2297:46:8;;;4242:21:9;4299:2;4279:18;;;4272:30;4338:20;4318:18;;;4311:48;4376:18;;2297:46:8;4058:342:9;2297:46:8;8571:6:::1;1563:4;1553:14;;:6;:14;;::::0;1545:52:::1;;;::::0;::::1;::::0;;7896:2:9;1545:52:8::1;::::0;::::1;7878:21:9::0;7935:2;7915:18;;;7908:30;7974:27;7954:18;;;7947:55;8019:18;;1545:52:8::1;7694:349:9::0;1545:52:8::1;1611:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1603:66:::1;;;::::0;::::1;::::0;;4607:2:9;1603:66:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1603:66:8::1;4405:350:9::0;1603:66:8::1;1675:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;1033:1:::1;1675:26:::0;;8625:50:::2;8645:6:::0;8653:7:::2;8662:12;8625:19;:50::i;:::-;8610:65;;8682:12;8696:11:::0;8721:4:::2;8711:25;;;:27;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8764:30;::::0;;;;:24:::2;5682:55:9::0;;;8764:30:8::2;::::0;::::2;5664:74:9::0;8681:57:8;;-1:-1:-1;8681:57:8;;-1:-1:-1;8744:17:8::2;::::0;8764:24;::::2;::::0;::::2;::::0;5637:18:9;;8764:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8819:28;::::0;;;;:22:::2;5682:55:9::0;;;8819:28:8::2;::::0;::::2;5664:74:9::0;8744:50:8;;-1:-1:-1;8800:16:8::2;::::0;8826:4:::2;8819:22;::::0;::::2;::::0;5637:18:9;;8819:28:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8800:47:::0;-1:-1:-1;8853:12:8::2;8868:22;8883:7:::0;8868:12;:22:::2;:::i;:::-;8853:37:::0;-1:-1:-1;8896:13:8::2;8912:20;8926:6:::0;8912:11;:20:::2;:::i;:::-;8896:36;;8938:17;8965:4;8958:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8938:46;;8994:12;9010:1;8994:17:::0;8990:326:::2;;1080:7;9033:29;9043:18;9053:8:::0;9043:7;:18:::2;:::i;:::-;9033:9;:29::i;:::-;:49;;;;:::i;:::-;9090:51;::::0;;;;9119:1:::2;9090:51;::::0;::::2;7566:74:9::0;1080:7:8::2;7656:18:9::0;;;7649:34;9021:61:8;;-1:-1:-1;9090:20:8::2;::::0;::::2;::::0;::::2;::::0;7539:18:9;;9090:51:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;8990:326;;;9229:80;9265:7:::0;9239:22:::2;9249:12:::0;9239:7;:22:::2;:::i;:::-;9238:34;;;;:::i;:::-;9302:6:::0;9275:23:::2;9286:12:::0;9275:8;:23:::2;:::i;:::-;9274:34;;;;:::i;:::-;9229:8;:80::i;:::-;9217:92;;8990:326;9341:1;9329:9;:13;9321:67;;;::::0;::::2;::::0;;9121:2:9;9321:67:8::2;::::0;::::2;9103:21:9::0;9160:2;9140:18;;;9133:30;9199:34;9179:18;;;9172:62;9270:11;9250:18;;;9243:39;9299:19;;9321:67:8::2;8919:405:9::0;9321:67:8::2;9394:36;::::0;;;;:20:::2;7584:55:9::0;;;9394:36:8::2;::::0;::::2;7566:74:9::0;7656:18;;;7649:34;;;9394:20:8;::::2;::::0;::::2;::::0;7539:18:9;;9394:36:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;9436:49:8::2;::::0;;;;::::2;::::0;::::2;1159:25:9::0;;;1200:18;;;1193:34;;;9436:22:8::2;::::0;::::2;::::0;-1:-1:-1;9436:22:8::2;::::0;-1:-1:-1;1132:18:9;;9436:49:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;9496:27:8::2;::::0;1384:25:9;;;9501:10:8::2;::::0;-1:-1:-1;9496:27:8::2;::::0;-1:-1:-1;1372:2:9;1357:18;9496:27:8::2;;;;;;;-1:-1:-1::0;;;1714:16:8::1;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;996:1:::1;1714:30:::0;;-1:-1:-1;8478:1050:8;;;-1:-1:-1;;;;;;8478:1050:8:o;12432:1646::-;2305:6;;;;:15;2297:46;;;;;;;4260:2:9;2297:46:8;;;4242:21:9;4299:2;4279:18;;;4272:30;4338:20;4318:18;;;4311:48;4376:18;;2297:46:8;4058:342:9;2297:46:8;12601:6:::1;1563:4;1553:14;;:6;:14;;::::0;1545:52:::1;;;::::0;::::1;::::0;;7896:2:9;1545:52:8::1;::::0;::::1;7878:21:9::0;7935:2;7915:18;;;7908:30;7974:27;7954:18;;;7947:55;8019:18;;1545:52:8::1;7694:349:9::0;1545:52:8::1;1611:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1603:66:::1;;;::::0;::::1;::::0;;4607:2:9;1603:66:8::1;::::0;::::1;4589:21:9::0;4646:2;4626:18;;;4619:30;4685:28;4665:18;;;4658:56;4731:18;;1603:66:8::1;4405:350:9::0;1603:66:8::1;1675:16;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;1033:1:::1;1675:26:::0;;12623:17;::::2;12615:51;;;::::0;::::2;::::0;;9531:2:9;12615:51:8::2;::::0;::::2;9513:21:9::0;9570:2;9550:18;;;9543:30;9609:23;9589:18;;;9582:51;9650:18;;12615:51:8::2;9329:345:9::0;12615:51:8::2;12688:4;12672:13;12713:50;12733:6:::0;12741:7:::2;12750:12;12713:19;:50::i;:::-;12790:30;::::0;;;;:24:::2;5682:55:9::0;;;12790:30:8::2;::::0;::::2;5664:74:9::0;12698:65:8;;-1:-1:-1;12770:17:8::2;::::0;12790:24;::::2;::::0;::::2;::::0;5637:18:9;;12790:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12845:29;::::0;;;;:23:::2;5682:55:9::0;;;12845:29:8::2;::::0;::::2;5664:74:9::0;12770:50:8;;-1:-1:-1;12826:16:8::2;::::0;12845:23;::::2;::::0;::::2;::::0;5637:18:9;;12845:29:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12826:48;;12911:12;12895;:28;;:58;;;;;12942:11;12927;:26;;12895:58;12880:120;;;::::0;::::2;::::0;;9881:2:9;12880:120:8::2;::::0;::::2;9863:21:9::0;9920:2;9900:18;;;9893:30;9959:33;9939:18;;;9932:61;10010:18;;12880:120:8::2;9679:355:9::0;12880:120:8::2;13011:16:::0;;13007:79:::2;;13029:57;::::0;;;;:30:::2;7270:15:9::0;;;13029:57:8::2;::::0;::::2;7252:34:9::0;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;13029:30:8;::::2;::::0;::::2;::::0;7164:18:9;;13029:57:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13007:79;13130:15:::0;;13126:76:::2;;13147:55;::::0;;;;:30:::2;7270:15:9::0;;;13147:55:8::2;::::0;::::2;7252:34:9::0;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;13147:30:8;::::2;::::0;::::2;::::0;7164:18:9;;13147:55:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13126:76;13243:71;::::0;;;;:31:::2;::::0;::::2;::::0;::::2;::::0;:71:::2;::::0;13275:4;;13281:12;;13295:11;;13308:5;;;;13243:71:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13528:5;13511:13;:11;:13::i;:::-;13497:27;::::0;:11;:27:::2;:::i;:::-;13496:37;;;;:::i;:::-;13481:53;::::0;:11;:53:::2;:::i;:::-;13460:5;13443:13;:11;:13::i;:::-;13428:28;::::0;:12;:28:::2;:::i;:::-;13427:38;;;;:::i;:::-;13411:55;::::0;:12;:55:::2;:::i;:::-;13410:125;;;;:::i;:::-;13369:29;::::0;;;;:23:::2;5682:55:9::0;;;13369:29:8::2;::::0;::::2;5664:74:9::0;13369:23:8;::::2;::::0;::::2;::::0;5637:18:9;;13369:29:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13336:30;::::0;;;;:24:::2;5682:55:9::0;;;13336:30:8::2;::::0;::::2;5664:74:9::0;13336:24:8;::::2;::::0;::::2;::::0;5637:18:9;;13336:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;:199;;13321:270;;;::::0;::::2;::::0;;10960:2:9;13321:270:8::2;::::0;::::2;10942:21:9::0;10999:2;10979:18;;;10972:30;11038:34;11018:18;;;11011:62;11109:10;11089:18;;;11082:38;11137:19;;13321:270:8::2;10758:404:9::0;13321:270:8::2;13602:16:::0;;13598:120:::2;;13636:4;13626:30;;;13657:6;13665:11;13712:5;13694:14;;13679:12;:29;;;;:::i;:::-;13678:39;;;;:::i;:::-;13626:92;::::0;;::::2;::::0;;;;;;7201:42:9;7270:15;;;13626:92:8::2;::::0;::::2;7252:34:9::0;7322:15;;;;7302:18;;;7295:43;7354:18;;;7347:34;7164:18;;13626:92:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13598:120;13772:15:::0;;13768:117:::2;;13805:4;13795:30;;;13826:5;13833:11;13879:5;13861:14;;13847:11;:28;;;;:::i;:::-;13846:38;;;;:::i;:::-;13795:90;::::0;;::::2;::::0;;;;;;7201:42:9;7270:15;;;13795:90:8::2;::::0;::::2;7252:34:9::0;7322:15;;;;7302:18;;;7295:43;7354:18;;;7347:34;7164:18;;13795:90:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13768:117;13959:30;::::0;;;;13936:22:::2;::::0;;::::2;13959:30;::::0;::::2;5664:74:9::0;;;13936:22:8;::::2;::::0;13959:24;::::2;::::0;::::2;::::0;5637:18:9;;13959:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13991:29;::::0;;;;:23:::2;5682:55:9::0;;;13991:29:8::2;::::0;::::2;5664:74:9::0;13991:23:8;::::2;::::0;::::2;::::0;5637:18:9;;13991:29:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13936:85;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;1159:25:9::0;;;;1200:18;;;1193:34;1132:18;;13936:85:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;14032:41:8::2;::::0;;1159:25:9;;;1215:2;1200:18;;1193:34;;;14032:41:8::2;::::0;::::2;::::0;-1:-1:-1;14032:41:8::2;::::0;-1:-1:-1;1132:18:9;14032:41:8::2;;;;;;;-1:-1:-1::0;;;;1714:16:8::1;;;::::0;;;:8:::1;:16;::::0;;;;996:1:::1;1714:30:::0;;-1:-1:-1;;;;;;12432:1646:8:o;440:430:7:-;743:24;;11329:66:9;11316:2;11312:15;;;11308:88;743:24:7;;;11296:101:9;553:12:7;;709:8;;11413:12:9;;743:24:7;;;;;;;;;;;;733:35;;;;;;784:13;654:175;;;;;;;;;11734:66:9;11722:79;;11838:2;11834:15;;;;11851:66;11830:88;11826:1;11817:11;;11810:109;11944:2;11935:12;;11928:28;;;;11981:2;11972:12;;11965:28;12018:2;12009:12;;11436:591;654:175:7;;;;;;;;;;;;;;631:210;;654:175;631:210;;;;;440:430;-1:-1:-1;;;;440:430:7:o;5107:942:8:-;5219:13;5234:14;5256:13;5272:4;5256:20;;5296:14;5323:5;5296:33;;5336:12;5350:11;5365:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5406:30;;;;;:23;5682:55:9;;;5406:30:8;;;5664:74:9;5335:46:8;;-1:-1:-1;5335:46:8;;-1:-1:-1;5387:16:8;;5406:23;;;;;5637:18:9;;5406:30:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5387:49;-1:-1:-1;5453:20:8;5467:6;5387:49;5453:20;:::i;:::-;5442:31;-1:-1:-1;5483:16:8;;;5495:4;5483:16;5479:332;;5521:11;:24;5546:6;5554:7;5563:8;5573:13;:11;:13::i;:::-;5521:66;;;;;;;;;;;;;12271:25:9;;;;12312:18;;;12305:34;;;;12355:18;;;12348:34;12398:18;;;12391:34;12243:19;;5521:66:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5509:78;;5595:4;:19;;;5615:5;5622:11;5665:5;5647:14;;5636:8;:25;;;;:::i;:::-;5635:35;;;;:::i;:::-;5595:76;;;;;;;;;;7201:42:9;7270:15;;;5595:76:8;;;7252:34:9;7322:15;;;;7302:18;;;7295:43;7354:18;;;7347:34;7164:18;;5595:76:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5479:332;;;5748:56;5778:8;5788:6;5796:7;5748:29;:56::i;:::-;5736:68;;5479:332;5816:43;;;;;:19;7270:15:9;;;5816:43:8;;;7252:34:9;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;5816:19:8;;;;;7164:18:9;;5816:43:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5913:30:8;;;;;:23;5682:55:9;;;5913:30:8;;;5664:74:9;5913:23:8;;;-1:-1:-1;5913:23:8;;-1:-1:-1;5637:18:9;;5913:30:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5969:31;;;;;:24;5682:55:9;;;5969:31:8;;;5664:74:9;5899:44:8;;-1:-1:-1;5949:17:8;;5969:24;;;;;5637:18:9;;5969:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6006:38;;;;;;;;1159:25:9;;;1200:18;;;1193:34;;;5949:51:8;;-1:-1:-1;6006:11:8;;;;;;1132:18:9;;6006:38:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5250:799;;;;;;5107:942;;;;;;;:::o;6053:975::-;6148:14;;6203:4;6246:7;6281:14;;;;;;;;6273:49;;;;;;;12638:2:9;6273:49:8;;;12620:21:9;12677:2;12657:18;;;12650:30;12716:24;12696:18;;;12689:52;12758:18;;6273:49:8;12436:346:9;6273:49:8;6343:7;6336:14;;:3;:14;;;6328:49;;;;;;;12638:2:9;6328:49:8;;;12620:21:9;12677:2;12657:18;;;12650:30;12716:24;12696:18;;;12689:52;12758:18;;6328:49:8;12436:346:9;6328:49:8;6398:5;6387:16;;:7;:16;;;;:36;;;;;6418:5;6407:16;;:7;:16;;;;6387:36;6383:641;;;6433:13;6449:52;6469:7;6478:8;6488:12;6449:19;:52::i;:::-;6433:68;;6509:13;6525:52;6545:7;6554:8;6564:12;6525:19;:52::i;:::-;6509:68;;6601:29;6608:5;6615:7;6624:5;6601:6;:29::i;:::-;-1:-1:-1;6585:45:8;-1:-1:-1;6655:34:8;6662:5;6669:7;6678:3;6683:5;6655:6;:34::i;:::-;6638:51;-1:-1:-1;6383:641:8;;-1:-1:-1;;;6383:641:8;;6717:5;6706:16;;:7;:16;;;6702:322;;6732:13;6748:52;6768:7;6777:8;6787:12;6748:19;:52::i;:::-;6732:68;;6834:33;6841:5;6848:7;6857:3;6862:4;6834:6;:33::i;:::-;6808:59;;-1:-1:-1;6808:59:8;-1:-1:-1;6702:322:8;;-1:-1:-1;6702:322:8;;6888:13;6904:52;6924:7;6933:8;6943:12;6904:19;:52::i;:::-;6888:68;;6990:27;6997:5;7004:7;7013:3;6990:6;:27::i;:::-;6964:53;;-1:-1:-1;6964:53:8;-1:-1:-1;;6702:322:8;6181:847;;6053:975;;;;;;:::o;187:238:6:-;233:6;256:1;251:2;:6;247:174;;;-1:-1:-1;271:2:6;281:6;290;295:1;271:2;290:6;:::i;:::-;:10;;299:1;290:10;:::i;:::-;281:19;;308:68;319:1;315;:5;308:68;;;336:1;-1:-1:-1;336:1:6;366;336;352:6;336:1;352:2;:6;:::i;:::-;:10;;;;:::i;:::-;351:16;;;;:::i;:::-;347:20;;308:68;;;259:123;187:238;;;:::o;247:174::-;392:7;;388:33;;-1:-1:-1;413:1:6;388:33;187:238;;;:::o;88:95::-;142:4;166:2;161;:7;:17;;176:2;161:17;;;171:2;161:17;154:24;;88:95;;;;;:::o;874:146:7:-;958:8;1000:14;1005:9;1000:2;:14;:::i;:::-;981;993:2;981:9;:14;:::i;:::-;980:35;;;;:::i;:::-;974:41;874:146;-1:-1:-1;;;;874:146:7:o;4303:800:8:-;4396:13;4411:14;4433:13;4449:4;4433:20;;4473:14;4500:5;4473:33;;4513:12;4527:11;4542:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4584:31;;;;;:24;5682:55:9;;;4584:31:8;;;5664:74:9;4512:46:8;;-1:-1:-1;4512:46:8;;-1:-1:-1;4564:17:8;;4584:24;;;;;5637:18:9;;4584:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4564:51;-1:-1:-1;4632:22:8;4647:7;4564:51;4632:22;:::i;:::-;4621:33;;4672:11;:24;4697:7;4706:6;4714:8;4724:13;:11;:13::i;:::-;4672:66;;;;;;;;;;;;;12271:25:9;;;;12312:18;;;12305:34;;;;12355:18;;;12348:34;12398:18;;;12391:34;12243:19;;4672:66:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4660:78;;4744:4;:19;;;4764:6;4772:11;4815:5;4797:14;;4786:8;:25;;;;:::i;:::-;4785:35;;;;:::i;:::-;4744:77;;;;;;;;;;7201:42:9;7270:15;;;4744:77:8;;;7252:34:9;7322:15;;;;7302:18;;;7295:43;7354:18;;;7347:34;7164:18;;4744:77:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4871:42:8;;;;;:19;7270:15:9;;;4871:42:8;;;7252:34:9;7322:15;;;7302:18;;;7295:43;7354:18;;;7347:34;;;4871:19:8;;;-1:-1:-1;4871:19:8;;-1:-1:-1;7164:18:9;;4871:42:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4972:30:8;;;;;:23;5682:55:9;;;4972:30:8;;;5664:74:9;4953:16:8;;-1:-1:-1;4972:23:8;;;-1:-1:-1;4972:23:8;;5637:18:9;;4972:30:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5023:31;;;;;:24;5682:55:9;;;5023:31:8;;;5664:74:9;4953:49:8;;-1:-1:-1;5023:24:8;;;;;;5637:18:9;;5023:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5060:38;;;;;;;;1159:25:9;;;1200:18;;;1193:34;;;5008:46:8;;-1:-1:-1;5060:11:8;;;;;;1132:18:9;;5060:38:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4427:676;;;;;;4303:800;;;;;;:::o;14:273:9:-;70:6;123:2;111:9;102:7;98:23;94:32;91:52;;;139:1;136;129:12;91:52;178:9;165:23;231:5;224:13;217:21;210:5;207:32;197:60;;253:1;250;243:12;197:60;276:5;14:273;-1:-1:-1;;;14:273:9:o;292:154::-;378:42;371:5;367:54;360:5;357:65;347:93;;436:1;433;426:12;347:93;292:154;:::o;451:529::-;528:6;536;544;597:2;585:9;576:7;572:23;568:32;565:52;;;613:1;610;603:12;565:52;652:9;639:23;671:31;696:5;671:31;:::i;:::-;721:5;-1:-1:-1;778:2:9;763:18;;750:32;791:33;750:32;791:33;:::i;:::-;843:7;-1:-1:-1;902:2:9;887:18;;874:32;915:33;874:32;915:33;:::i;:::-;967:7;957:17;;;451:529;;;;;:::o;1420:388::-;1488:6;1496;1549:2;1537:9;1528:7;1524:23;1520:32;1517:52;;;1565:1;1562;1555:12;1517:52;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1730:2:9;1715:18;;1702:32;1743:33;1702:32;1743:33;:::i;:::-;1795:7;1785:17;;;1420:388;;;;;:::o;1813:180::-;1872:6;1925:2;1913:9;1904:7;1900:23;1896:32;1893:52;;;1941:1;1938;1931:12;1893:52;-1:-1:-1;1964:23:9;;1813:180;-1:-1:-1;1813:180:9:o;1998:247::-;2057:6;2110:2;2098:9;2089:7;2085:23;2081:32;2078:52;;;2126:1;2123;2116:12;2078:52;2165:9;2152:23;2184:31;2209:5;2184:31;:::i;2250:1005::-;2356:6;2364;2372;2380;2388;2396;2449:3;2437:9;2428:7;2424:23;2420:33;2417:53;;;2466:1;2463;2456:12;2417:53;2505:9;2492:23;2524:31;2549:5;2524:31;:::i;:::-;2574:5;-1:-1:-1;2626:2:9;2611:18;;2598:32;;-1:-1:-1;2677:2:9;2662:18;;2649:32;;-1:-1:-1;2733:2:9;2718:18;;2705:32;2746:33;2705:32;2746:33;:::i;:::-;2798:7;-1:-1:-1;2856:3:9;2841:19;;2828:33;2880:18;2910:14;;;2907:34;;;2937:1;2934;2927:12;2907:34;2975:6;2964:9;2960:22;2950:32;;3020:7;3013:4;3009:2;3005:13;3001:27;2991:55;;3042:1;3039;3032:12;2991:55;3082:2;3069:16;3108:2;3100:6;3097:14;3094:34;;;3124:1;3121;3114:12;3094:34;3169:7;3164:2;3155:6;3151:2;3147:15;3143:24;3140:37;3137:57;;;3190:1;3187;3180:12;3137:57;3221:2;3217;3213:11;3203:21;;3243:6;3233:16;;;;;2250:1005;;;;;;;;:::o;3260:251::-;3330:6;3383:2;3371:9;3362:7;3358:23;3354:32;3351:52;;;3399:1;3396;3389:12;3351:52;3431:9;3425:16;3450:31;3475:5;3450:31;:::i;5749:184::-;5819:6;5872:2;5860:9;5851:7;5847:23;5843:32;5840:52;;;5888:1;5885;5878:12;5840:52;-1:-1:-1;5911:16:9;;5749:184;-1:-1:-1;5749:184:9:o;5938:::-;5990:77;5987:1;5980:88;6087:4;6084:1;6077:15;6111:4;6108:1;6101:15;6127:168;6200:9;;;6231;;6248:15;;;6242:22;;6228:37;6218:71;;6269:18;;:::i;6300:274::-;6340:1;6366;6356:189;;6401:77;6398:1;6391:88;6502:4;6499:1;6492:15;6530:4;6527:1;6520:15;6356:189;-1:-1:-1;6559:9:9;;6300:274::o;8048:245::-;8127:6;8135;8188:2;8176:9;8167:7;8163:23;8159:32;8156:52;;;8204:1;8201;8194:12;8156:52;-1:-1:-1;;8227:16:9;;8283:2;8268:18;;;8262:25;8227:16;;8262:25;;-1:-1:-1;8048:245:9:o;8298:128::-;8365:9;;;8386:11;;;8383:37;;;8400:18;;:::i;8431:125::-;8496:9;;;8517:10;;;8514:36;;;8530:18;;:::i;10039:714::-;10292:42;10284:6;10280:55;10269:9;10262:74;10372:6;10367:2;10356:9;10352:18;10345:34;10415:6;10410:2;10399:9;10395:18;10388:34;10458:3;10453:2;10442:9;10438:18;10431:31;10499:6;10493:3;10482:9;10478:19;10471:35;10557:6;10549;10543:3;10532:9;10528:19;10515:49;10614:1;10584:22;;;10608:3;10580:32;;;10573:43;;;;10668:2;10656:15;;;10673:66;10652:88;10637:104;10633:114;;10039:714;-1:-1:-1;;;;10039:714:9:o
Swarm Source
ipfs://8b82843cd564717e7b18ecd9426f92b9443b074392d5057df8cb7aa22dd60450
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.