More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,874 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Cancel Order | 20700214 | 141 days ago | IN | 0 ETH | 0.00102044 | ||||
Execute Order | 15421568 | 883 days ago | IN | 0 ETH | 0.00168887 | ||||
Execute Order | 15242440 | 911 days ago | IN | 0 ETH | 0.00014067 | ||||
Cancel Order | 15065183 | 939 days ago | IN | 0 ETH | 0.00100686 | ||||
Cancel Order | 14420044 | 1043 days ago | IN | 0 ETH | 0.00197942 | ||||
Place Order | 14419502 | 1043 days ago | IN | 0.31426104 ETH | 0.01990128 | ||||
Cancel Order | 14334312 | 1057 days ago | IN | 0 ETH | 0.00317588 | ||||
Cancel Order | 14294839 | 1063 days ago | IN | 0 ETH | 0.00397309 | ||||
Place Order | 14269233 | 1067 days ago | IN | 0.04788 ETH | 0.02932698 | ||||
Place Order | 14243185 | 1071 days ago | IN | 0.0228353 ETH | 0.01147779 | ||||
Cancel Order | 14116813 | 1090 days ago | IN | 0 ETH | 0.01711837 | ||||
Place Order | 14116727 | 1090 days ago | IN | 3.5643125 ETH | 0.04141934 | ||||
Cancel Order | 14048695 | 1101 days ago | IN | 0 ETH | 0.01243174 | ||||
Cancel Order | 13998525 | 1109 days ago | IN | 0 ETH | 0.01867501 | ||||
Cancel Order | 13998518 | 1109 days ago | IN | 0 ETH | 0.02466165 | ||||
Cancel Order | 13989990 | 1110 days ago | IN | 0 ETH | 0.01321381 | ||||
Cancel Order | 13985201 | 1111 days ago | IN | 0 ETH | 0.01815643 | ||||
Place Order | 13979158 | 1112 days ago | IN | 2.06491479 ETH | 0.10964541 | ||||
Place Order | 13979146 | 1112 days ago | IN | 1.0463677 ETH | 0.10794401 | ||||
Place Order | 13979095 | 1112 days ago | IN | 1.06491479 ETH | 0.0759781 | ||||
Place Order | 13940846 | 1118 days ago | IN | 0.23728958 ETH | 0.04709046 | ||||
Cancel Order | 13940592 | 1118 days ago | IN | 0 ETH | 0.01212643 | ||||
Cancel Order | 13936510 | 1118 days ago | IN | 0 ETH | 0.01442847 | ||||
Cancel Order | 13936470 | 1118 days ago | IN | 0 ETH | 0.01704852 | ||||
Place Order | 13920301 | 1121 days ago | IN | 0.0458252 ETH | 0.02503998 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20700214 | 141 days ago | 0.01900791 ETH | ||||
20245305 | 204 days ago | 0.00484312 ETH | ||||
20245305 | 204 days ago | 0.000012 ETH | ||||
20245305 | 204 days ago | 0.000018 ETH | ||||
20245305 | 204 days ago | 0.01497 ETH | ||||
20245305 | 204 days ago | 0.05807083 ETH | ||||
20245305 | 204 days ago | 0.00024 ETH | ||||
20245305 | 204 days ago | 0.00036 ETH | ||||
20245305 | 204 days ago | 0.2994 ETH | ||||
20245305 | 204 days ago | 0.01927574 ETH | ||||
20245305 | 204 days ago | 0.00016 ETH | ||||
20245305 | 204 days ago | 0.00024 ETH | ||||
20245305 | 204 days ago | 0.1996 ETH | ||||
18180471 | 493 days ago | 0.06219937 ETH | ||||
18180471 | 493 days ago | 0.00015999 ETH | ||||
18180471 | 493 days ago | 0.00023999 ETH | ||||
18180471 | 493 days ago | 0.19959447 ETH | ||||
16745669 | 695 days ago | 0.00932502 ETH | ||||
16745669 | 695 days ago | 0.00000098 ETH | ||||
16745669 | 695 days ago | 0.00000147 ETH | ||||
16745669 | 695 days ago | 0.00122404 ETH | ||||
16745669 | 695 days ago | 0.0012265 ETH | ||||
16745669 | 695 days ago | 0.03967395 ETH | ||||
16745669 | 695 days ago | 0.0002546 ETH | ||||
16745669 | 695 days ago | 0.00038191 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
UniTradeOrderBook
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-27 */ // Dependency file: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT // pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Dependency file: @openzeppelin/contracts/GSN/Context.sol // pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // Dependency file: @openzeppelin/contracts/access/Ownable.sol // pragma solidity ^0.6.0; // import "@openzeppelin/contracts/GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // Dependency file: @openzeppelin/contracts/utils/ReentrancyGuard.sol // pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol // pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * // importANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Dependency file: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol // pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // Dependency file: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol // pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // Dependency file: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol // pragma solidity >=0.6.2; // import '/Users/train/Documents/Work/Decent/unitrade/unitrade/node_modules/@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // Dependency file: @uniswap/lib/contracts/libraries/TransferHelper.sol // pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // Dependency file: contracts/UniTradeIncinerator.sol // pragma solidity ^0.6.6; // import "@openzeppelin/contracts/math/SafeMath.sol"; // import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; // import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; contract UniTradeIncinerator { using SafeMath for uint256; uint256 constant UINT256_MAX = ~uint256(0); IUniswapV2Router02 public immutable uniswapV2Router; address public immutable unitrade; uint256 lastIncinerated; event UniTradeToBurn(uint256 etherIn); event UniTradeBurned(uint256 etherIn, uint256 tokensBurned); constructor(IUniswapV2Router02 _uniswapV2Router, address _unitrade) public { uniswapV2Router = _uniswapV2Router; unitrade = _unitrade; lastIncinerated = block.timestamp; } function burn() external payable returns (bool) { require(msg.value > 0, "Nothing to burn"); emit UniTradeToBurn(msg.value); if (block.timestamp < lastIncinerated + 1 days) { return true; } lastIncinerated = block.timestamp; address[] memory _tokenPair = new address[](2); _tokenPair[0] = uniswapV2Router.WETH(); _tokenPair[1] = unitrade; uint256[] memory _swapResult = uniswapV2Router.swapExactETHForTokens{ value: address(this).balance }( 0, // take any _tokenPair, address(this), UINT256_MAX ); emit UniTradeBurned(_swapResult[0], _swapResult[1]); return true; } } // Dependency file: contracts/IUniTradeStaker.sol // pragma solidity ^0.6.6; interface IUniTradeStaker { function deposit() external payable; } // Root file: contracts/UniTradeOrderBook.sol pragma solidity ^0.6.6; // import "@openzeppelin/contracts/math/SafeMath.sol"; // import "@openzeppelin/contracts/access/Ownable.sol"; // import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; // import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; // import "@uniswap/lib/contracts/libraries/TransferHelper.sol"; // import "contracts/UniTradeIncinerator.sol"; // import "contracts/IUniTradeStaker.sol"; contract UniTradeOrderBook is Ownable, ReentrancyGuard { using SafeMath for uint256; uint256 constant UINT256_MAX = ~uint256(0); IUniswapV2Router02 public immutable uniswapV2Router; IUniswapV2Factory public immutable uniswapV2Factory; UniTradeIncinerator public immutable incinerator; IUniTradeStaker public staker; uint16 public feeMul; uint16 public feeDiv; uint16 public splitMul; uint16 public splitDiv; enum OrderType {TokensForTokens, EthForTokens, TokensForEth} enum OrderState {Placed, Cancelled, Executed} struct Order { OrderType orderType; address payable maker; address tokenIn; address tokenOut; uint256 amountInOffered; uint256 amountOutExpected; uint256 executorFee; uint256 totalEthDeposited; uint256 activeOrderIndex; OrderState orderState; bool deflationary; } uint256 private orderNumber; uint256[] private activeOrders; mapping(uint256 => Order) private orders; mapping(address => uint256[]) private ordersForAddress; event OrderPlaced( uint256 indexed orderId, OrderType orderType, address payable indexed maker, address tokenIn, address tokenOut, uint256 amountInOffered, uint256 amountOutExpected, uint256 executorFee, uint256 totalEthDeposited ); event OrderUpdated( uint256 indexed orderId, uint256 amountInOffered, uint256 amountOutExpected, uint256 executorFee ); event OrderCancelled(uint256 indexed orderId); event OrderExecuted( uint256 indexed orderId, address indexed executor, uint256[] amounts, uint256 unitradeFee ); event StakerUpdated(address newStaker); modifier exists(uint256 orderId) { require(orders[orderId].maker != address(0), "Order not found"); _; } constructor( IUniswapV2Router02 _uniswapV2Router, UniTradeIncinerator _incinerator, IUniTradeStaker _staker, uint16 _feeMul, uint16 _feeDiv, uint16 _splitMul, uint16 _splitDiv ) public { uniswapV2Router = _uniswapV2Router; uniswapV2Factory = IUniswapV2Factory(_uniswapV2Router.factory()); incinerator = _incinerator; staker = _staker; feeMul = _feeMul; feeDiv = _feeDiv; splitMul = _splitMul; splitDiv = _splitDiv; } function placeOrder( OrderType orderType, address tokenIn, address tokenOut, uint256 amountInOffered, uint256 amountOutExpected, uint256 executorFee ) external payable nonReentrant returns (uint256) { require(amountInOffered > 0, "Invalid offered amount"); require(amountOutExpected > 0, "Invalid expected amount"); require(executorFee > 0, "Invalid executor fee"); address _wethAddress = uniswapV2Router.WETH(); bool deflationary = false; if (orderType != OrderType.EthForTokens) { require( msg.value == executorFee, "Transaction value must match executor fee" ); if (orderType == OrderType.TokensForEth) { require(tokenOut == _wethAddress, "Token out must be WETH"); } else { getPair(tokenIn, _wethAddress); } uint256 beforeBalance = IERC20(tokenIn).balanceOf(address(this)); // transfer tokenIn funds in necessary for order execution TransferHelper.safeTransferFrom( tokenIn, msg.sender, address(this), amountInOffered ); uint256 afterBalance = IERC20(tokenIn).balanceOf(address(this)); if (afterBalance.sub(beforeBalance) != amountInOffered) { amountInOffered = afterBalance.sub(beforeBalance); deflationary = true; } require(amountInOffered > 0, "Invalid final offered amount"); } else { require(tokenIn == _wethAddress, "Token in must be WETH"); require( msg.value == amountInOffered.add(executorFee), "Transaction value must match offer and fee" ); } // get canonical uniswap pair address address _pairAddress = getPair(tokenIn, tokenOut); (uint256 _orderId, Order memory _order) = registerOrder( orderType, msg.sender, tokenIn, tokenOut, _pairAddress, amountInOffered, amountOutExpected, executorFee, msg.value, deflationary ); emit OrderPlaced( _orderId, _order.orderType, _order.maker, _order.tokenIn, _order.tokenOut, _order.amountInOffered, _order.amountOutExpected, _order.executorFee, _order.totalEthDeposited ); return _orderId; } function updateOrder( uint256 orderId, uint256 amountInOffered, uint256 amountOutExpected, uint256 executorFee ) external payable exists(orderId) nonReentrant returns (bool) { Order memory _updatingOrder = orders[orderId]; require(msg.sender == _updatingOrder.maker, "Permission denied"); require( _updatingOrder.orderState == OrderState.Placed, "Cannot update order" ); require(amountInOffered > 0, "Invalid offered amount"); require(amountOutExpected > 0, "Invalid expected amount"); require(executorFee > 0, "Invalid executor fee"); if (_updatingOrder.orderType == OrderType.EthForTokens) { uint256 newTotal = amountInOffered.add(executorFee); if (newTotal > _updatingOrder.totalEthDeposited) { require( msg.value == newTotal.sub(_updatingOrder.totalEthDeposited), "Additional deposit must match" ); } else if (newTotal < _updatingOrder.totalEthDeposited) { TransferHelper.safeTransferETH( _updatingOrder.maker, _updatingOrder.totalEthDeposited.sub(newTotal) ); } _updatingOrder.totalEthDeposited = newTotal; } else { if (executorFee > _updatingOrder.executorFee) { require( msg.value == executorFee.sub(_updatingOrder.executorFee), "Additional fee must match" ); } else if (executorFee < _updatingOrder.executorFee) { TransferHelper.safeTransferETH( _updatingOrder.maker, _updatingOrder.executorFee.sub(executorFee) ); } _updatingOrder.totalEthDeposited = executorFee; if (amountInOffered > _updatingOrder.amountInOffered) { uint256 beforeBalance = IERC20(_updatingOrder.tokenIn) .balanceOf(address(this)); TransferHelper.safeTransferFrom( _updatingOrder.tokenIn, msg.sender, address(this), amountInOffered.sub(_updatingOrder.amountInOffered) ); uint256 afterBalance = IERC20(_updatingOrder.tokenIn).balanceOf( address(this) ); amountInOffered = _updatingOrder.amountInOffered.add( afterBalance.sub(beforeBalance) ); } else if (amountInOffered < _updatingOrder.amountInOffered) { TransferHelper.safeTransfer( _updatingOrder.tokenIn, _updatingOrder.maker, _updatingOrder.amountInOffered.sub(amountInOffered) ); } } // update order record _updatingOrder.amountInOffered = amountInOffered; _updatingOrder.amountOutExpected = amountOutExpected; _updatingOrder.executorFee = executorFee; orders[orderId] = _updatingOrder; emit OrderUpdated( orderId, amountInOffered, amountOutExpected, executorFee ); return true; } function cancelOrder(uint256 orderId) external exists(orderId) nonReentrant returns (bool) { Order memory _cancellingOrder = orders[orderId]; require(msg.sender == _cancellingOrder.maker, "Permission denied"); require( _cancellingOrder.orderState == OrderState.Placed, "Cannot cancel order" ); proceedOrder(orderId, OrderState.Cancelled); // Revert token allocation, funds, and fees if (_cancellingOrder.orderType != OrderType.EthForTokens) { TransferHelper.safeTransfer( _cancellingOrder.tokenIn, _cancellingOrder.maker, _cancellingOrder.amountInOffered ); } TransferHelper.safeTransferETH( _cancellingOrder.maker, _cancellingOrder.totalEthDeposited ); emit OrderCancelled(orderId); return true; } function executeOrder(uint256 orderId) external exists(orderId) nonReentrant returns (uint256[] memory amounts) { Order memory _executingOrder = orders[orderId]; require( _executingOrder.orderState == OrderState.Placed, "Cannot execute order" ); proceedOrder(orderId, OrderState.Executed); address[] memory _addressPair = createPair( _executingOrder.tokenIn, _executingOrder.tokenOut ); uint256 unitradeFee = 0; if (_executingOrder.orderType == OrderType.TokensForTokens) { TransferHelper.safeApprove( _executingOrder.tokenIn, address(uniswapV2Router), _executingOrder.amountInOffered ); uint256 _tokenFee = _executingOrder.amountInOffered.mul(feeMul).div( feeDiv ); if (_executingOrder.deflationary) { uint256 beforeBalance = IERC20(_executingOrder.tokenOut) .balanceOf(_executingOrder.maker); uniswapV2Router .swapExactTokensForTokensSupportingFeeOnTransferTokens( _executingOrder.amountInOffered.sub(_tokenFee), _executingOrder.amountOutExpected, _addressPair, _executingOrder.maker, UINT256_MAX ); uint256 afterBalance = IERC20(_executingOrder.tokenOut) .balanceOf(_executingOrder.maker); amounts = new uint256[](2); amounts[0] = _executingOrder.amountInOffered.sub(_tokenFee); amounts[1] = afterBalance.sub(beforeBalance); } else { amounts = uniswapV2Router.swapExactTokensForTokens( _executingOrder.amountInOffered.sub(_tokenFee), _executingOrder.amountOutExpected, _addressPair, _executingOrder.maker, UINT256_MAX ); } if (_tokenFee > 0) { // Convert x% of tokens to ETH as fee address[] memory _wethPair = createPair( _executingOrder.tokenIn, uniswapV2Router.WETH() ); if (_executingOrder.deflationary) { uint256 beforeBalance = IERC20(uniswapV2Router.WETH()) .balanceOf(address(this)); uniswapV2Router .swapExactTokensForETHSupportingFeeOnTransferTokens( _tokenFee, 0, //take any _wethPair, address(this), UINT256_MAX ); uint256 afterBalance = IERC20(uniswapV2Router.WETH()) .balanceOf(address(this)); unitradeFee = afterBalance.sub(beforeBalance); } else { uint256[] memory _ethSwapResult = uniswapV2Router .swapExactTokensForETH( _tokenFee, 0, //take any _wethPair, address(this), UINT256_MAX ); unitradeFee = _ethSwapResult[1]; } } } else if (_executingOrder.orderType == OrderType.TokensForEth) { TransferHelper.safeApprove( _executingOrder.tokenIn, address(uniswapV2Router), _executingOrder.amountInOffered ); if (_executingOrder.deflationary) { uint256 beforeBalance = address(this).balance; uniswapV2Router .swapExactTokensForETHSupportingFeeOnTransferTokens( _executingOrder.amountInOffered, _executingOrder.amountOutExpected, _addressPair, address(this), UINT256_MAX ); uint256 afterBalance = address(this).balance; amounts = new uint256[](2); amounts[0] = _executingOrder.amountInOffered; amounts[1] = afterBalance.sub(beforeBalance); } else { amounts = uniswapV2Router.swapExactTokensForETH( _executingOrder.amountInOffered, _executingOrder.amountOutExpected, _addressPair, address(this), UINT256_MAX ); } unitradeFee = amounts[1].mul(feeMul).div(feeDiv); if (amounts[1].sub(unitradeFee) > 0) { // Transfer to maker after post swap fee split TransferHelper.safeTransferETH( _executingOrder.maker, amounts[1].sub(unitradeFee) ); } } else if (_executingOrder.orderType == OrderType.EthForTokens) { // Subtract fee from initial swap uint256 amountEthOffered = _executingOrder.totalEthDeposited.sub( _executingOrder.executorFee ); unitradeFee = amountEthOffered.mul(feeMul).div(feeDiv); uint256 beforeBalance = IERC20(_executingOrder.tokenOut).balanceOf( _executingOrder.maker ); uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: amountEthOffered.sub(unitradeFee) }( _executingOrder.amountOutExpected, _addressPair, _executingOrder.maker, UINT256_MAX ); uint256 afterBalance = IERC20(_executingOrder.tokenOut).balanceOf( _executingOrder.maker ); amounts = new uint256[](2); amounts[0] = amountEthOffered.sub(unitradeFee); amounts[1] = afterBalance.sub(beforeBalance); } // Transfer fee to incinerator/staker if (unitradeFee > 0) { uint256 burnAmount = unitradeFee.mul(splitMul).div(splitDiv); if (burnAmount > 0) { incinerator.burn{value: burnAmount}(); //no require } staker.deposit{value: unitradeFee.sub(burnAmount)}(); //no require } // transfer fee to executor TransferHelper.safeTransferETH(msg.sender, _executingOrder.executorFee); emit OrderExecuted(orderId, msg.sender, amounts, unitradeFee); } function registerOrder( OrderType orderType, address payable maker, address tokenIn, address tokenOut, address pairAddress, uint256 amountInOffered, uint256 amountOutExpected, uint256 executorFee, uint256 totalEthDeposited, bool deflationary ) internal returns (uint256 orderId, Order memory) { uint256 _orderId = orderNumber; orderNumber++; // create order entries Order memory _order = Order({ orderType: orderType, maker: maker, tokenIn: tokenIn, tokenOut: tokenOut, amountInOffered: amountInOffered, amountOutExpected: amountOutExpected, executorFee: executorFee, totalEthDeposited: totalEthDeposited, activeOrderIndex: activeOrders.length, orderState: OrderState.Placed, deflationary: deflationary }); activeOrders.push(_orderId); orders[_orderId] = _order; ordersForAddress[maker].push(_orderId); ordersForAddress[pairAddress].push(_orderId); return (_orderId, _order); } function proceedOrder(uint256 orderId, OrderState nextState) internal returns (bool) { Order memory _proceedingOrder = orders[orderId]; require( _proceedingOrder.orderState == OrderState.Placed, "Cannot proceed order" ); if (activeOrders.length > 1) { uint256 _availableIndex = _proceedingOrder.activeOrderIndex; uint256 _lastOrderId = activeOrders[activeOrders.length - 1]; Order memory _lastOrder = orders[_lastOrderId]; _lastOrder.activeOrderIndex = _availableIndex; orders[_lastOrderId] = _lastOrder; activeOrders[_availableIndex] = _lastOrderId; } activeOrders.pop(); _proceedingOrder.orderState = nextState; _proceedingOrder.activeOrderIndex = UINT256_MAX; // indicate that it's not active orders[orderId] = _proceedingOrder; return true; } function getPair(address tokenA, address tokenB) internal view returns (address) { address _pairAddress = uniswapV2Factory.getPair(tokenA, tokenB); require(_pairAddress != address(0), "Unavailable pair address"); return _pairAddress; } function getOrder(uint256 orderId) external view exists(orderId) returns ( OrderType orderType, address payable maker, address tokenIn, address tokenOut, uint256 amountInOffered, uint256 amountOutExpected, uint256 executorFee, uint256 totalEthDeposited, OrderState orderState, bool deflationary ) { Order memory _order = orders[orderId]; return ( _order.orderType, _order.maker, _order.tokenIn, _order.tokenOut, _order.amountInOffered, _order.amountOutExpected, _order.executorFee, _order.totalEthDeposited, _order.orderState, _order.deflationary ); } function updateStaker(IUniTradeStaker newStaker) external onlyOwner { staker = newStaker; emit StakerUpdated(address(newStaker)); } function updateFee(uint16 _feeMul, uint16 _feeDiv) external onlyOwner { require(_feeMul < _feeDiv, "!fee"); feeMul = _feeMul; feeDiv = _feeDiv; } function updateSplit(uint16 _splitMul, uint16 _splitDiv) external onlyOwner { require(_splitMul < _splitDiv, "!split"); splitMul = _splitMul; splitDiv = _splitDiv; } function createPair(address tokenA, address tokenB) internal pure returns (address[] memory) { address[] memory _addressPair = new address[](2); _addressPair[0] = tokenA; _addressPair[1] = tokenB; return _addressPair; } function getActiveOrdersLength() external view returns (uint256) { return activeOrders.length; } function getActiveOrderId(uint256 index) external view returns (uint256) { return activeOrders[index]; } function getOrdersForAddressLength(address _address) external view returns (uint256) { return ordersForAddress[_address].length; } function getOrderIdForAddress(address _address, uint256 index) external view returns (uint256) { return ordersForAddress[_address][index]; } receive() external payable {} // to receive ETH from Uniswap }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IUniswapV2Router02","name":"_uniswapV2Router","type":"address"},{"internalType":"contract UniTradeIncinerator","name":"_incinerator","type":"address"},{"internalType":"contract IUniTradeStaker","name":"_staker","type":"address"},{"internalType":"uint16","name":"_feeMul","type":"uint16"},{"internalType":"uint16","name":"_feeDiv","type":"uint16"},{"internalType":"uint16","name":"_splitMul","type":"uint16"},{"internalType":"uint16","name":"_splitDiv","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"unitradeFee","type":"uint256"}],"name":"OrderExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"enum UniTradeOrderBook.OrderType","name":"orderType","type":"uint8"},{"indexed":true,"internalType":"address payable","name":"maker","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInOffered","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutExpected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executorFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalEthDeposited","type":"uint256"}],"name":"OrderPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInOffered","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutExpected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executorFee","type":"uint256"}],"name":"OrderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStaker","type":"address"}],"name":"StakerUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"cancelOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"executeOrder","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDiv","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeMul","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getActiveOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveOrdersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"getOrder","outputs":[{"internalType":"enum UniTradeOrderBook.OrderType","name":"orderType","type":"uint8"},{"internalType":"address payable","name":"maker","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountInOffered","type":"uint256"},{"internalType":"uint256","name":"amountOutExpected","type":"uint256"},{"internalType":"uint256","name":"executorFee","type":"uint256"},{"internalType":"uint256","name":"totalEthDeposited","type":"uint256"},{"internalType":"enum UniTradeOrderBook.OrderState","name":"orderState","type":"uint8"},{"internalType":"bool","name":"deflationary","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOrderIdForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getOrdersForAddressLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incinerator","outputs":[{"internalType":"contract UniTradeIncinerator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniTradeOrderBook.OrderType","name":"orderType","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountInOffered","type":"uint256"},{"internalType":"uint256","name":"amountOutExpected","type":"uint256"},{"internalType":"uint256","name":"executorFee","type":"uint256"}],"name":"placeOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splitDiv","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"splitMul","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staker","outputs":[{"internalType":"contract IUniTradeStaker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_feeMul","type":"uint16"},{"internalType":"uint16","name":"_feeDiv","type":"uint16"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"uint256","name":"amountInOffered","type":"uint256"},{"internalType":"uint256","name":"amountOutExpected","type":"uint256"},{"internalType":"uint256","name":"executorFee","type":"uint256"}],"name":"updateOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_splitMul","type":"uint16"},{"internalType":"uint16","name":"_splitDiv","type":"uint16"}],"name":"updateSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUniTradeStaker","name":"newStaker","type":"address"}],"name":"updateStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200458838038062004588833981810160405260e08110156200003757600080fd5b508051602082015160408301516060840151608085015160a086015160c0909601519495939492939192909190600062000070620001db565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160601b0319606088901b166080526040805163c45a015560e01b815290516001600160a01b0389169163c45a0155916004808301926020929190829003018186803b1580156200011157600080fd5b505afa15801562000126573d6000803e3d6000fd5b505050506040513d60208110156200013d57600080fd5b5051606090811b6001600160601b031990811660a05296901b90951660c052600280546001600160a01b0319166001600160a01b03959095169490941761ffff60a01b1916600160a01b61ffff948516021761ffff60b01b1916600160b01b928416929092029190911761ffff60c01b1916600160c01b918316919091021761ffff60d01b1916600160d01b919093160291909117905550620001df565b3390565b60805160601c60a05160601c60c05160601c61432862000260600039806105f052806123a95250806109af52806138b85250806105cc5280610beb52806112c452806113c452806115ad5280611776528061180f528061195452806119f25280611b025280611cdb5280611d165280611e6f528061219952506143286000f3fe6080604052600436106101445760003560e01c806383ab2898116100b6578063d09ef2411161006f578063d09ef2411461042b578063d3b46393146104dd578063d89dd46d14610516578063d9e83bf01461052b578063f2fde38b14610561578063f57b860a146105945761014b565b806383ab2898146102f85780638977e3941461034357806389a447e0146103585780638da5cb5b1461036d57806394f6113414610382578063cefdb8b6146103fc5761014b565b806353e1a7a01161010857806353e1a7a01461024e57806359d0f7131461027a5780635ebaf1db1461028f5780636e4ca4ab146102a4578063715018a6146102ce5780637e5a7187146102e35761014b565b80631694505e146101505780631d44810d1461018157806320a493e5146101965780632465b556146101db578063514fcac7146102105761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b506101656105ca565b604080516001600160a01b039092168252519081900360200190f35b34801561018d57600080fd5b506101656105ee565b3480156101a257600080fd5b506101c9600480360360208110156101b957600080fd5b50356001600160a01b0316610612565b60408051918252519081900360200190f35b3480156101e757600080fd5b5061020e600480360360208110156101fe57600080fd5b50356001600160a01b031661062d565b005b34801561021c57600080fd5b5061023a6004803603602081101561023357600080fd5b50356106d9565b604080519115158252519081900360200190f35b34801561025a57600080fd5b5061026361099c565b6040805161ffff9092168252519081900360200190f35b34801561028657600080fd5b506101656109ad565b34801561029b57600080fd5b506101656109d1565b3480156102b057600080fd5b506101c9600480360360208110156102c757600080fd5b50356109e0565b3480156102da57600080fd5b5061020e610a01565b3480156102ef57600080fd5b50610263610aa3565b6101c9600480360360c081101561030e57600080fd5b5060ff813516906001600160a01b03602082013581169160408101359091169060608101359060808101359060a00135610ab4565b34801561034f57600080fd5b5061026361105f565b34801561036457600080fd5b50610263611070565b34801561037957600080fd5b50610165611081565b34801561038e57600080fd5b506103ac600480360360208110156103a557600080fd5b5035611090565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103e85781810151838201526020016103d0565b505050509050019250505060405180910390f35b61023a6004803603608081101561041257600080fd5b5080359060208101359060408101359060600135612535565b34801561043757600080fd5b506104556004803603602081101561044e57600080fd5b5035612ccc565b604051808b600281111561046557fe5b81526020018a6001600160a01b03168152602001896001600160a01b03168152602001886001600160a01b031681526020018781526020018681526020018581526020018481526020018360028111156104bb57fe5b815260200182151581526020019a505050505050505050505060405180910390f35b3480156104e957600080fd5b506101c96004803603604081101561050057600080fd5b506001600160a01b038135169060200135612e83565b34801561052257600080fd5b506101c9612ebb565b34801561053757600080fd5b5061020e6004803603604081101561054e57600080fd5b5061ffff81358116916020013516612ec1565b34801561056d57600080fd5b5061020e6004803603602081101561058457600080fd5b50356001600160a01b0316612f93565b3480156105a057600080fd5b5061020e600480360360408110156105b757600080fd5b5061ffff8135811691602001351661308b565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b031660009081526006602052604090205490565b61063561315d565b6000546001600160a01b03908116911614610685576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f24251a0d9c6d6d02b2d9a514a10840d36cf43cc631283d5908d0125619753caa9181900360200190a150565b600081815260056020526040812054829061010090046001600160a01b031661073b576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b60026001541415610781576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b600260015561078e614175565b60008481526005602052604090819020815161016081019092528054829060ff1660028111156107ba57fe5b60028111156107c557fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561084657fe5b600281111561085157fe5b815260089190910154610100900460ff1615156020918201528101519091506001600160a01b031633146108c0576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b600081610120015160028111156108d357fe5b1461091b576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba1031b0b731b2b61037b93232b960691b604482015290519081900360640190fd5b610926846001613161565b5060018151600281111561093657fe5b1461095257610952816040015182602001518360800151613651565b61096481602001518260e001516137bb565b60405184907f61b9399f2f0f32ca39ce8d7be32caed5ec22fe07a6daba3a467ed479ec60658290600090a25050600180805592915050565b600254600160a01b900461ffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6002546001600160a01b031681565b6000600482815481106109ef57fe5b90600052602060002001549050919050565b610a0961315d565b6000546001600160a01b03908116911614610a59576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600254600160d01b900461ffff1681565b600060026001541415610afc576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b600260015583610b4c576040805162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081bd999995c995908185b5bdd5b9d60521b604482015290519081900360640190fd5b60008311610b9b576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a5908195e1c1958dd195908185b5bdd5b9d604a1b604482015290519081900360640190fd5b60008211610be7576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964206578656375746f722066656560601b604482015290519081900360640190fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610c4257600080fd5b505afa158015610c56573d6000803e3d6000fd5b505050506040513d6020811015610c6c57600080fd5b5051905060006001896002811115610c8057fe5b14610eca57833414610cc35760405162461bcd60e51b81526004018080602001828103825260298152602001806142596029913960400191505060405180910390fd5b6002896002811115610cd157fe5b1415610d3b57816001600160a01b0316876001600160a01b031614610d36576040805162461bcd60e51b81526020600482015260166024820152750a8ded6cadc40deeae840daeae6e840c4ca40ae8aa8960531b604482015290519081900360640190fd5b610d47565b610d4588836138b3565b505b6000886001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d9657600080fd5b505afa158015610daa573d6000803e3d6000fd5b505050506040513d6020811015610dc057600080fd5b50519050610dd08933308a6139c4565b6000896001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e1f57600080fd5b505afa158015610e33573d6000803e3d6000fd5b505050506040513d6020811015610e4957600080fd5b5051905087610e588284613b21565b14610e6e57610e678183613b21565b9750600192505b60008811610ec3576040805162461bcd60e51b815260206004820152601c60248201527f496e76616c69642066696e616c206f66666572656420616d6f756e7400000000604482015290519081900360640190fd5b5050610f6f565b816001600160a01b0316886001600160a01b031614610f28576040805162461bcd60e51b81526020600482015260156024820152740a8ded6cadc40d2dc40daeae6e840c4ca40ae8aa89605b1b604482015290519081900360640190fd5b610f328685613b63565b3414610f6f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614282602a913960400191505060405180910390fd5b6000610f7b89896138b3565b90506000610f87614175565b610f998c338d8d878e8e8e348d613bbd565b9150915080602001516001600160a01b0316827f7cd079bfb83a711e49db8c60bdb14cbab28738a2139d55349482cf74d0f2f25d83600001518460400151856060015186608001518760a001518860c001518960e001516040518088600281111561100057fe5b8152602001876001600160a01b03168152602001866001600160a01b0316815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a350600180559a9950505050505050505050565b600254600160c01b900461ffff1681565b600254600160b01b900461ffff1681565b6000546001600160a01b031690565b600081815260056020526040902054606090829061010090046001600160a01b03166110f5576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b6002600154141561113b576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b6002600155611148614175565b60008481526005602052604090819020815161016081019092528054829060ff16600281111561117457fe5b600281111561117f57fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561120057fe5b600281111561120b57fe5b815260089190910154610100900460ff16151560209091015290506000816101200151600281111561123957fe5b14611282576040805162461bcd60e51b815260206004820152601460248201527321b0b73737ba1032bc32b1baba329037b93232b960611b604482015290519081900360640190fd5b61128d846002613161565b5060606112a282604001518360600151613dfb565b9050600080835160028111156112b457fe5b1415611cbc576112ed83604001517f00000000000000000000000000000000000000000000000000000000000000008560800151613e7b565b60025460808401516000916113229161ffff600160b01b830481169261131c9291600160a01b90910416613fde565b90614037565b9050836101400151156115ab57600084606001516001600160a01b03166370a0823186602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561138657600080fd5b505afa15801561139a573d6000803e3d6000fd5b505050506040513d60208110156113b057600080fd5b505160808601519091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635c11d795906113f59085613b21565b8760a001518789602001516000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561147357818101518382015260200161145b565b505050509050019650505050505050600060405180830381600087803b15801561149c57600080fd5b505af11580156114b0573d6000803e3d6000fd5b50505050600085606001516001600160a01b03166370a0823187602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d602081101561153557600080fd5b5051604080516002808252606082018352929350919060208301908036833750505060808701519098506115699084613b21565b8860008151811061157657fe5b602090810291909101015261158b8183613b21565b8860018151811061159857fe5b6020026020010181815250505050611764565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338ed17396115f1838760800151613b2190919063ffffffff16565b8660a001518688602001516000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561166f578181015183820152602001611657565b505050509050019650505050505050600060405180830381600087803b15801561169857600080fd5b505af11580156116ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156116d557600080fd5b81019080805160405193929190846401000000008211156116f557600080fd5b90830190602082018581111561170a57600080fd5b825186602082028301116401000000008211171561172757600080fd5b82525081516020918201928201910280838360005b8381101561175457818101518382015260200161173c565b5050505090500160405250505095505b8015611cb65760606117fe85604001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156117cd57600080fd5b505afa1580156117e1573d6000803e3d6000fd5b505050506040513d60208110156117f757600080fd5b5051613dfb565b905084610140015115611afe5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156118da57600080fd5b505afa1580156118ee573d6000803e3d6000fd5b505050506040513d602081101561190457600080fd5b505160405163791ac94760e01b81526004810185815260006024830181905230606484018190526000196084850181905260a060448601908152885160a487015288519697506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169663791ac947968b968b9594939092909160c40190602087810191028083838b5b838110156119ad578181015183820152602001611995565b505050509050019650505050505050600060405180830381600087803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611a4957600080fd5b505afa158015611a5d573d6000803e3d6000fd5b505050506040513d6020811015611a7357600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611abd57600080fd5b505afa158015611ad1573d6000803e3d6000fd5b505050506040513d6020811015611ae757600080fd5b50519050611af58183613b21565b94505050611cb4565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318cbafe584600085306000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ba7578181015183820152602001611b8f565b505050509050019650505050505050600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c0d57600080fd5b8101908080516040519392919084640100000000821115611c2d57600080fd5b908301906020820185811115611c4257600080fd5b8251866020820283011164010000000082111715611c5f57600080fd5b82525081516020918201928201910280838360005b83811015611c8c578181015183820152602001611c74565b50505050905001604052505050905080600181518110611ca857fe5b60200260200101519350505b505b5061236f565b600283516002811115611ccb57fe5b14156120ac57611d0483604001517f00000000000000000000000000000000000000000000000000000000000000008560800151613e7b565b82610140015115611e6d5760004790507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663791ac94785608001518660a0015186306000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611dc2578181015183820152602001611daa565b505050509050019650505050505050600060405180830381600087803b158015611deb57600080fd5b505af1158015611dff573d6000803e3d6000fd5b505060408051600280825260608201835247945090925090602083019080368337019050509650846080015187600081518110611e3857fe5b6020908102919091010152611e4d8183613b21565b87600181518110611e5a57fe5b6020026020010181815250505050612010565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318cbafe584608001518560a0015185306000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611f1b578181015183820152602001611f03565b505050509050019650505050505050600060405180830381600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f8157600080fd5b8101908080516040519392919084640100000000821115611fa157600080fd5b908301906020820185811115611fb657600080fd5b8251866020820283011164010000000082111715611fd357600080fd5b82525081516020918201928201910280838360005b83811015612000578181015183820152602001611fe8565b5050505090500160405250505094505b60025485516120589161ffff600160b01b820481169261131c92600160a01b9004909116908990600190811061204257fe5b6020026020010151613fde90919063ffffffff16565b90506000612083828760018151811061206d57fe5b6020026020010151613b2190919063ffffffff16565b11156120a7576120a783602001516120a2838860018151811061206d57fe5b6137bb565b61236f565b6001835160028111156120bb57fe5b141561236f5760006120de8460c001518560e00151613b2190919063ffffffff16565b6002549091506121089061ffff600160b01b820481169161131c918591600160a01b900416613fde565b9150600084606001516001600160a01b03166370a0823186602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561216157600080fd5b505afa158015612175573d6000803e3d6000fd5b505050506040513d602081101561218b57600080fd5b505190506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663b6f9de956121c88486613b21565b8760a001518789602001516000196040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612240578181015183820152602001612228565b50505050905001955050505050506000604051808303818588803b15801561226757600080fd5b505af115801561227b573d6000803e3d6000fd5b5050505050600085606001516001600160a01b03166370a0823187602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d602081101561230157600080fd5b505160408051600280825260608201835292935091906020830190803683370190505097506123308385613b21565b8860008151811061233d57fe5b60209081029190910101526123528183613b21565b8860018151811061235f57fe5b6020026020010181815250505050505b80156124915760025460009061239f9061ffff600160d01b820481169161131c918691600160c01b900416613fde565b90508015612430577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344df8e70826040518263ffffffff1660e01b81526004016020604051808303818588803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b50505050506040513d602081101561242d57600080fd5b50505b6002546001600160a01b031663d0e30db061244b8484613b21565b6040518263ffffffff1660e01b81526004016000604051808303818588803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b5050505050505b61249f338460c001516137bb565b336001600160a01b0316867f53bd615f42c1650e29cced525c56e2e29ee5eeb24c10b846ece13b55128d3ea987846040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156125135781810151838201526020016124fb565b50505050905001935050505060405180910390a3505060018055509092915050565b600084815260056020526040812054859061010090046001600160a01b0316612597576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b600260015414156125dd576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b60026001556125ea614175565b60008781526005602052604090819020815161016081019092528054829060ff16600281111561261657fe5b600281111561262157fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff16908111156126a257fe5b60028111156126ad57fe5b815260089190910154610100900460ff1615156020918201528101519091506001600160a01b0316331461271c576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6000816101200151600281111561272f57fe5b14612777576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba103ab83230ba329037b93232b960691b604482015290519081900360640190fd5b600086116127c5576040805162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081bd999995c995908185b5bdd5b9d60521b604482015290519081900360640190fd5b60008511612814576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a5908195e1c1958dd195908185b5bdd5b9d604a1b604482015290519081900360640190fd5b60008411612860576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964206578656375746f722066656560601b604482015290519081900360640190fd5b60018151600281111561286f57fe5b141561292c5760006128818786613b63565b90508160e001518111156128f75760e082015161289f908290613b21565b34146128f2576040805162461bcd60e51b815260206004820152601d60248201527f4164646974696f6e616c206465706f736974206d757374206d61746368000000604482015290519081900360640190fd5b612922565b8160e001518110156129225761292282602001516120a2838560e00151613b2190919063ffffffff16565b60e0820152612b59565b8060c001518411156129a05760c0810151612948908590613b21565b341461299b576040805162461bcd60e51b815260206004820152601960248201527f4164646974696f6e616c20666565206d757374206d6174636800000000000000604482015290519081900360640190fd5b6129cb565b8060c001518410156129cb576129cb81602001516120a2868460c00151613b2190919063ffffffff16565b60e081018490526080810151861115612b2457600081604001516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612a3157600080fd5b505afa158015612a45573d6000803e3d6000fd5b505050506040513d6020811015612a5b57600080fd5b505160408301516080840151919250612a829133903090612a7d908c90613b21565b6139c4565b600082604001516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ad557600080fd5b505afa158015612ae9573d6000803e3d6000fd5b505050506040513d6020811015612aff57600080fd5b50519050612b1b612b108284613b21565b608085015190613b63565b97505050612b59565b8060800151861015612b5957612b5981604001518260200151612b54898560800151613b2190919063ffffffff16565b613651565b6080810186905260a0810185905260c0810184905260008781526005602052604090208151815483929190829060ff19166001836002811115612b9857fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff19909216918490811115612c5157fe5b02179055506101409190910151600890910180549115156101000261ff00199092169190911790556040805187815260208101879052808201869052905188917fc09b83a84e12d34205843b66304e0c22f1ce62c86672c3446b0a06d9b057d179919081900360600190a25050600180805595945050505050565b6000818152600560205260408120548190819081908190819081908190819081908b9061010090046001600160a01b0316612d40576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b612d48614175565b60008d81526005602052604090819020815161016081019092528054829060ff166002811115612d7457fe5b6002811115612d7f57fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff1690811115612e0057fe5b6002811115612e0b57fe5b81526020016008820160019054906101000a900460ff1615151515815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861012001518961014001519b509b509b509b509b509b509b509b509b509b5050509193959799509193959799565b6001600160a01b0382166000908152600660205260408120805483908110612ea757fe5b906000526020600020015490505b92915050565b60045490565b612ec961315d565b6000546001600160a01b03908116911614612f19576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b8061ffff168261ffff1610612f5e576040805162461bcd60e51b815260206004808301919091526024820152632166656560e01b604482015290519081900360640190fd5b6002805461ffff928316600160b01b0261ffff60b01b1994909316600160a01b0261ffff60a01b199091161792909216179055565b612f9b61315d565b6000546001600160a01b03908116911614612feb576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b6001600160a01b0381166130305760405162461bcd60e51b81526004018080602001828103825260268152602001806141f26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61309361315d565b6000546001600160a01b039081169116146130e3576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b8061ffff168261ffff1610613128576040805162461bcd60e51b8152602060048201526006602482015265085cdc1b1a5d60d21b604482015290519081900360640190fd5b6002805461ffff928316600160d01b0261ffff60d01b1994909316600160c01b0261ffff60c01b199091161792909216179055565b3390565b600061316b614175565b60008481526005602052604090819020815161016081019092528054829060ff16600281111561319757fe5b60028111156131a257fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561322357fe5b600281111561322e57fe5b815260089190910154610100900460ff16151560209091015290506000816101200151600281111561325c57fe5b146132a5576040805162461bcd60e51b815260206004820152601460248201527321b0b73737ba10383937b1b2b2b21037b93232b960611b604482015290519081900360640190fd5b600454600110156134ef57610100810151600480546000919060001981019081106132cc57fe5b906000526020600020015490506132e1614175565b60008281526005602052604090819020815161016081019092528054829060ff16600281111561330d57fe5b600281111561331857fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561339957fe5b60028111156133a457fe5b81526008919091015460ff6101009182900416151560209283015282018590526000848152600590915260409020815181549293508392829060ff191660018360028111156133ef57fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff199092169184908111156134a857fe5b02179055506101408201518160080160016101000a81548160ff02191690831515021790555090505081600484815481106134df57fe5b6000918252602090912001555050505b60048054806134fa57fe5b6001900381819060005260206000200160009055905582816101200190600281111561352257fe5b9081600281111561352f57fe5b90525060001961010082015260008481526005602052604090208151815483929190829060ff1916600183600281111561356557fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff1990921691849081111561361e57fe5b02179055506101409190910151600890910180549115156101000261ff0019909216919091179055506001905092915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106136ce5780518252601f1990920191602091820191016136af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613730576040519150601f19603f3d011682016040523d82523d6000602084013e613735565b606091505b5091509150818015613763575080511580613763575080806020019051602081101561376057600080fd5b50515b6137b4576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106138075780518252601f1990920191602091820191016137e8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613869576040519150601f19603f3d011682016040523d82523d6000602084013e61386e565b606091505b50509050806138ae5760405162461bcd60e51b81526004018080602001828103825260238152602001806142ac6023913960400191505060405180910390fd5b505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a4390585856040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d602081101561395e57600080fd5b505190506001600160a01b0381166139bd576040805162461bcd60e51b815260206004820152601860248201527f556e617661696c61626c65207061697220616464726573730000000000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310613a495780518252601f199092019160209182019101613a2a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613aab576040519150601f19603f3d011682016040523d82523d6000602084013e613ab0565b606091505b5091509150818015613ade575080511580613ade5750808060200190516020811015613adb57600080fd5b50515b613b195760405162461bcd60e51b81526004018080602001828103825260248152602001806142cf6024913960400191505060405180910390fd5b505050505050565b60006139bd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614079565b6000828201838110156139bd576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000613bc7614175565b6003805460018101909155613bda614175565b6040518061016001604052808f6002811115613bf257fe5b81526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018a8152602001898152602001888152602001878152602001600480549050815260200160006002811115613c5457fe5b81528615156020918201526004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0185905560008581526005909252604090912082518154939450849391929091839160ff1990911690836002811115613cc157fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff19909216918490811115613d7a57fe5b02179055506101409190910151600890910180549115156101000261ff00199092169190911790556001600160a01b03808e16600090815260066020908152604080832080546001818101835591855283852001879055938e168352822080549384018155825290200182905590925090509a509a98505050505050505050565b6040805160028082526060808301845292839291906020830190803683370190505090508381600081518110613e2d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110613e5b57fe5b6001600160a01b0390921660209283029190910190910152905092915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310613ef85780518252601f199092019160209182019101613ed9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f5a576040519150601f19603f3d011682016040523d82523d6000602084013e613f5f565b606091505b5091509150818015613f8d575080511580613f8d5750808060200190516020811015613f8a57600080fd5b50515b6137b4576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b600082613fed57506000612eb5565b82820282848281613ffa57fe5b04146139bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806142186021913960400191505060405180910390fd5b60006139bd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614110565b600081848411156141085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140cd5781810151838201526020016140b5565b50505050905090810190601f1680156140fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361415f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156140cd5781810151838201526020016140b5565b50600083858161416b57fe5b0495945050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905290610120820190815260006020909101529056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e73616374696f6e2076616c7565206d757374206d61746368206578656375746f72206665655472616e73616374696f6e2076616c7565206d757374206d61746368206f6666657220616e64206665655472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220da47cafd9878ac3d44fa0e88577d205caf6db2b052e7773be8fefdb0502f617664736f6c634300060c00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c54fa7403b020e78828886becd99b6caaa1433cb0000000000000000000000005b32cdda19ea68f8e3a8511455ef39a9d178c5ca000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode
0x6080604052600436106101445760003560e01c806383ab2898116100b6578063d09ef2411161006f578063d09ef2411461042b578063d3b46393146104dd578063d89dd46d14610516578063d9e83bf01461052b578063f2fde38b14610561578063f57b860a146105945761014b565b806383ab2898146102f85780638977e3941461034357806389a447e0146103585780638da5cb5b1461036d57806394f6113414610382578063cefdb8b6146103fc5761014b565b806353e1a7a01161010857806353e1a7a01461024e57806359d0f7131461027a5780635ebaf1db1461028f5780636e4ca4ab146102a4578063715018a6146102ce5780637e5a7187146102e35761014b565b80631694505e146101505780631d44810d1461018157806320a493e5146101965780632465b556146101db578063514fcac7146102105761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b506101656105ca565b604080516001600160a01b039092168252519081900360200190f35b34801561018d57600080fd5b506101656105ee565b3480156101a257600080fd5b506101c9600480360360208110156101b957600080fd5b50356001600160a01b0316610612565b60408051918252519081900360200190f35b3480156101e757600080fd5b5061020e600480360360208110156101fe57600080fd5b50356001600160a01b031661062d565b005b34801561021c57600080fd5b5061023a6004803603602081101561023357600080fd5b50356106d9565b604080519115158252519081900360200190f35b34801561025a57600080fd5b5061026361099c565b6040805161ffff9092168252519081900360200190f35b34801561028657600080fd5b506101656109ad565b34801561029b57600080fd5b506101656109d1565b3480156102b057600080fd5b506101c9600480360360208110156102c757600080fd5b50356109e0565b3480156102da57600080fd5b5061020e610a01565b3480156102ef57600080fd5b50610263610aa3565b6101c9600480360360c081101561030e57600080fd5b5060ff813516906001600160a01b03602082013581169160408101359091169060608101359060808101359060a00135610ab4565b34801561034f57600080fd5b5061026361105f565b34801561036457600080fd5b50610263611070565b34801561037957600080fd5b50610165611081565b34801561038e57600080fd5b506103ac600480360360208110156103a557600080fd5b5035611090565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103e85781810151838201526020016103d0565b505050509050019250505060405180910390f35b61023a6004803603608081101561041257600080fd5b5080359060208101359060408101359060600135612535565b34801561043757600080fd5b506104556004803603602081101561044e57600080fd5b5035612ccc565b604051808b600281111561046557fe5b81526020018a6001600160a01b03168152602001896001600160a01b03168152602001886001600160a01b031681526020018781526020018681526020018581526020018481526020018360028111156104bb57fe5b815260200182151581526020019a505050505050505050505060405180910390f35b3480156104e957600080fd5b506101c96004803603604081101561050057600080fd5b506001600160a01b038135169060200135612e83565b34801561052257600080fd5b506101c9612ebb565b34801561053757600080fd5b5061020e6004803603604081101561054e57600080fd5b5061ffff81358116916020013516612ec1565b34801561056d57600080fd5b5061020e6004803603602081101561058457600080fd5b50356001600160a01b0316612f93565b3480156105a057600080fd5b5061020e600480360360408110156105b757600080fd5b5061ffff8135811691602001351661308b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b7f000000000000000000000000c54fa7403b020e78828886becd99b6caaa1433cb81565b6001600160a01b031660009081526006602052604090205490565b61063561315d565b6000546001600160a01b03908116911614610685576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f24251a0d9c6d6d02b2d9a514a10840d36cf43cc631283d5908d0125619753caa9181900360200190a150565b600081815260056020526040812054829061010090046001600160a01b031661073b576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b60026001541415610781576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b600260015561078e614175565b60008481526005602052604090819020815161016081019092528054829060ff1660028111156107ba57fe5b60028111156107c557fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561084657fe5b600281111561085157fe5b815260089190910154610100900460ff1615156020918201528101519091506001600160a01b031633146108c0576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b600081610120015160028111156108d357fe5b1461091b576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba1031b0b731b2b61037b93232b960691b604482015290519081900360640190fd5b610926846001613161565b5060018151600281111561093657fe5b1461095257610952816040015182602001518360800151613651565b61096481602001518260e001516137bb565b60405184907f61b9399f2f0f32ca39ce8d7be32caed5ec22fe07a6daba3a467ed479ec60658290600090a25050600180805592915050565b600254600160a01b900461ffff1681565b7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6002546001600160a01b031681565b6000600482815481106109ef57fe5b90600052602060002001549050919050565b610a0961315d565b6000546001600160a01b03908116911614610a59576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600254600160d01b900461ffff1681565b600060026001541415610afc576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b600260015583610b4c576040805162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081bd999995c995908185b5bdd5b9d60521b604482015290519081900360640190fd5b60008311610b9b576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a5908195e1c1958dd195908185b5bdd5b9d604a1b604482015290519081900360640190fd5b60008211610be7576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964206578656375746f722066656560601b604482015290519081900360640190fd5b60007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610c4257600080fd5b505afa158015610c56573d6000803e3d6000fd5b505050506040513d6020811015610c6c57600080fd5b5051905060006001896002811115610c8057fe5b14610eca57833414610cc35760405162461bcd60e51b81526004018080602001828103825260298152602001806142596029913960400191505060405180910390fd5b6002896002811115610cd157fe5b1415610d3b57816001600160a01b0316876001600160a01b031614610d36576040805162461bcd60e51b81526020600482015260166024820152750a8ded6cadc40deeae840daeae6e840c4ca40ae8aa8960531b604482015290519081900360640190fd5b610d47565b610d4588836138b3565b505b6000886001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d9657600080fd5b505afa158015610daa573d6000803e3d6000fd5b505050506040513d6020811015610dc057600080fd5b50519050610dd08933308a6139c4565b6000896001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e1f57600080fd5b505afa158015610e33573d6000803e3d6000fd5b505050506040513d6020811015610e4957600080fd5b5051905087610e588284613b21565b14610e6e57610e678183613b21565b9750600192505b60008811610ec3576040805162461bcd60e51b815260206004820152601c60248201527f496e76616c69642066696e616c206f66666572656420616d6f756e7400000000604482015290519081900360640190fd5b5050610f6f565b816001600160a01b0316886001600160a01b031614610f28576040805162461bcd60e51b81526020600482015260156024820152740a8ded6cadc40d2dc40daeae6e840c4ca40ae8aa89605b1b604482015290519081900360640190fd5b610f328685613b63565b3414610f6f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614282602a913960400191505060405180910390fd5b6000610f7b89896138b3565b90506000610f87614175565b610f998c338d8d878e8e8e348d613bbd565b9150915080602001516001600160a01b0316827f7cd079bfb83a711e49db8c60bdb14cbab28738a2139d55349482cf74d0f2f25d83600001518460400151856060015186608001518760a001518860c001518960e001516040518088600281111561100057fe5b8152602001876001600160a01b03168152602001866001600160a01b0316815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a350600180559a9950505050505050505050565b600254600160c01b900461ffff1681565b600254600160b01b900461ffff1681565b6000546001600160a01b031690565b600081815260056020526040902054606090829061010090046001600160a01b03166110f5576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b6002600154141561113b576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b6002600155611148614175565b60008481526005602052604090819020815161016081019092528054829060ff16600281111561117457fe5b600281111561117f57fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561120057fe5b600281111561120b57fe5b815260089190910154610100900460ff16151560209091015290506000816101200151600281111561123957fe5b14611282576040805162461bcd60e51b815260206004820152601460248201527321b0b73737ba1032bc32b1baba329037b93232b960611b604482015290519081900360640190fd5b61128d846002613161565b5060606112a282604001518360600151613dfb565b9050600080835160028111156112b457fe5b1415611cbc576112ed83604001517f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8560800151613e7b565b60025460808401516000916113229161ffff600160b01b830481169261131c9291600160a01b90910416613fde565b90614037565b9050836101400151156115ab57600084606001516001600160a01b03166370a0823186602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561138657600080fd5b505afa15801561139a573d6000803e3d6000fd5b505050506040513d60208110156113b057600080fd5b505160808601519091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690635c11d795906113f59085613b21565b8760a001518789602001516000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561147357818101518382015260200161145b565b505050509050019650505050505050600060405180830381600087803b15801561149c57600080fd5b505af11580156114b0573d6000803e3d6000fd5b50505050600085606001516001600160a01b03166370a0823187602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d602081101561153557600080fd5b5051604080516002808252606082018352929350919060208301908036833750505060808701519098506115699084613b21565b8860008151811061157657fe5b602090810291909101015261158b8183613b21565b8860018151811061159857fe5b6020026020010181815250505050611764565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17396115f1838760800151613b2190919063ffffffff16565b8660a001518688602001516000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561166f578181015183820152602001611657565b505050509050019650505050505050600060405180830381600087803b15801561169857600080fd5b505af11580156116ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156116d557600080fd5b81019080805160405193929190846401000000008211156116f557600080fd5b90830190602082018581111561170a57600080fd5b825186602082028301116401000000008211171561172757600080fd5b82525081516020918201928201910280838360005b8381101561175457818101518382015260200161173c565b5050505090500160405250505095505b8015611cb65760606117fe85604001517f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156117cd57600080fd5b505afa1580156117e1573d6000803e3d6000fd5b505050506040513d60208110156117f757600080fd5b5051613dfb565b905084610140015115611afe5760007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156118da57600080fd5b505afa1580156118ee573d6000803e3d6000fd5b505050506040513d602081101561190457600080fd5b505160405163791ac94760e01b81526004810185815260006024830181905230606484018190526000196084850181905260a060448601908152885160a487015288519697506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169663791ac947968b968b9594939092909160c40190602087810191028083838b5b838110156119ad578181015183820152602001611995565b505050509050019650505050505050600060405180830381600087803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b5050505060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611a4957600080fd5b505afa158015611a5d573d6000803e3d6000fd5b505050506040513d6020811015611a7357600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611abd57600080fd5b505afa158015611ad1573d6000803e3d6000fd5b505050506040513d6020811015611ae757600080fd5b50519050611af58183613b21565b94505050611cb4565b60607f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166318cbafe584600085306000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ba7578181015183820152602001611b8f565b505050509050019650505050505050600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c0d57600080fd5b8101908080516040519392919084640100000000821115611c2d57600080fd5b908301906020820185811115611c4257600080fd5b8251866020820283011164010000000082111715611c5f57600080fd5b82525081516020918201928201910280838360005b83811015611c8c578181015183820152602001611c74565b50505050905001604052505050905080600181518110611ca857fe5b60200260200101519350505b505b5061236f565b600283516002811115611ccb57fe5b14156120ac57611d0483604001517f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8560800151613e7b565b82610140015115611e6d5760004790507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663791ac94785608001518660a0015186306000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611dc2578181015183820152602001611daa565b505050509050019650505050505050600060405180830381600087803b158015611deb57600080fd5b505af1158015611dff573d6000803e3d6000fd5b505060408051600280825260608201835247945090925090602083019080368337019050509650846080015187600081518110611e3857fe5b6020908102919091010152611e4d8183613b21565b87600181518110611e5a57fe5b6020026020010181815250505050612010565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166318cbafe584608001518560a0015185306000196040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611f1b578181015183820152602001611f03565b505050509050019650505050505050600060405180830381600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f8157600080fd5b8101908080516040519392919084640100000000821115611fa157600080fd5b908301906020820185811115611fb657600080fd5b8251866020820283011164010000000082111715611fd357600080fd5b82525081516020918201928201910280838360005b83811015612000578181015183820152602001611fe8565b5050505090500160405250505094505b60025485516120589161ffff600160b01b820481169261131c92600160a01b9004909116908990600190811061204257fe5b6020026020010151613fde90919063ffffffff16565b90506000612083828760018151811061206d57fe5b6020026020010151613b2190919063ffffffff16565b11156120a7576120a783602001516120a2838860018151811061206d57fe5b6137bb565b61236f565b6001835160028111156120bb57fe5b141561236f5760006120de8460c001518560e00151613b2190919063ffffffff16565b6002549091506121089061ffff600160b01b820481169161131c918591600160a01b900416613fde565b9150600084606001516001600160a01b03166370a0823186602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561216157600080fd5b505afa158015612175573d6000803e3d6000fd5b505050506040513d602081101561218b57600080fd5b505190506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663b6f9de956121c88486613b21565b8760a001518789602001516000196040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612240578181015183820152602001612228565b50505050905001955050505050506000604051808303818588803b15801561226757600080fd5b505af115801561227b573d6000803e3d6000fd5b5050505050600085606001516001600160a01b03166370a0823187602001516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d602081101561230157600080fd5b505160408051600280825260608201835292935091906020830190803683370190505097506123308385613b21565b8860008151811061233d57fe5b60209081029190910101526123528183613b21565b8860018151811061235f57fe5b6020026020010181815250505050505b80156124915760025460009061239f9061ffff600160d01b820481169161131c918691600160c01b900416613fde565b90508015612430577f000000000000000000000000c54fa7403b020e78828886becd99b6caaa1433cb6001600160a01b03166344df8e70826040518263ffffffff1660e01b81526004016020604051808303818588803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b50505050506040513d602081101561242d57600080fd5b50505b6002546001600160a01b031663d0e30db061244b8484613b21565b6040518263ffffffff1660e01b81526004016000604051808303818588803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b5050505050505b61249f338460c001516137bb565b336001600160a01b0316867f53bd615f42c1650e29cced525c56e2e29ee5eeb24c10b846ece13b55128d3ea987846040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156125135781810151838201526020016124fb565b50505050905001935050505060405180910390a3505060018055509092915050565b600084815260056020526040812054859061010090046001600160a01b0316612597576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b600260015414156125dd576040805162461bcd60e51b815260206004820152601f60248201526000805160206141d2833981519152604482015290519081900360640190fd5b60026001556125ea614175565b60008781526005602052604090819020815161016081019092528054829060ff16600281111561261657fe5b600281111561262157fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff16908111156126a257fe5b60028111156126ad57fe5b815260089190910154610100900460ff1615156020918201528101519091506001600160a01b0316331461271c576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6000816101200151600281111561272f57fe5b14612777576040805162461bcd60e51b815260206004820152601360248201527221b0b73737ba103ab83230ba329037b93232b960691b604482015290519081900360640190fd5b600086116127c5576040805162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081bd999995c995908185b5bdd5b9d60521b604482015290519081900360640190fd5b60008511612814576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a5908195e1c1958dd195908185b5bdd5b9d604a1b604482015290519081900360640190fd5b60008411612860576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964206578656375746f722066656560601b604482015290519081900360640190fd5b60018151600281111561286f57fe5b141561292c5760006128818786613b63565b90508160e001518111156128f75760e082015161289f908290613b21565b34146128f2576040805162461bcd60e51b815260206004820152601d60248201527f4164646974696f6e616c206465706f736974206d757374206d61746368000000604482015290519081900360640190fd5b612922565b8160e001518110156129225761292282602001516120a2838560e00151613b2190919063ffffffff16565b60e0820152612b59565b8060c001518411156129a05760c0810151612948908590613b21565b341461299b576040805162461bcd60e51b815260206004820152601960248201527f4164646974696f6e616c20666565206d757374206d6174636800000000000000604482015290519081900360640190fd5b6129cb565b8060c001518410156129cb576129cb81602001516120a2868460c00151613b2190919063ffffffff16565b60e081018490526080810151861115612b2457600081604001516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612a3157600080fd5b505afa158015612a45573d6000803e3d6000fd5b505050506040513d6020811015612a5b57600080fd5b505160408301516080840151919250612a829133903090612a7d908c90613b21565b6139c4565b600082604001516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ad557600080fd5b505afa158015612ae9573d6000803e3d6000fd5b505050506040513d6020811015612aff57600080fd5b50519050612b1b612b108284613b21565b608085015190613b63565b97505050612b59565b8060800151861015612b5957612b5981604001518260200151612b54898560800151613b2190919063ffffffff16565b613651565b6080810186905260a0810185905260c0810184905260008781526005602052604090208151815483929190829060ff19166001836002811115612b9857fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff19909216918490811115612c5157fe5b02179055506101409190910151600890910180549115156101000261ff00199092169190911790556040805187815260208101879052808201869052905188917fc09b83a84e12d34205843b66304e0c22f1ce62c86672c3446b0a06d9b057d179919081900360600190a25050600180805595945050505050565b6000818152600560205260408120548190819081908190819081908190819081908b9061010090046001600160a01b0316612d40576040805162461bcd60e51b815260206004820152600f60248201526e13dc99195c881b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b612d48614175565b60008d81526005602052604090819020815161016081019092528054829060ff166002811115612d7457fe5b6002811115612d7f57fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff1690811115612e0057fe5b6002811115612e0b57fe5b81526020016008820160019054906101000a900460ff1615151515815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e001518861012001518961014001519b509b509b509b509b509b509b509b509b509b5050509193959799509193959799565b6001600160a01b0382166000908152600660205260408120805483908110612ea757fe5b906000526020600020015490505b92915050565b60045490565b612ec961315d565b6000546001600160a01b03908116911614612f19576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b8061ffff168261ffff1610612f5e576040805162461bcd60e51b815260206004808301919091526024820152632166656560e01b604482015290519081900360640190fd5b6002805461ffff928316600160b01b0261ffff60b01b1994909316600160a01b0261ffff60a01b199091161792909216179055565b612f9b61315d565b6000546001600160a01b03908116911614612feb576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b6001600160a01b0381166130305760405162461bcd60e51b81526004018080602001828103825260268152602001806141f26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61309361315d565b6000546001600160a01b039081169116146130e3576040805162461bcd60e51b81526020600482018190526024820152600080516020614239833981519152604482015290519081900360640190fd5b8061ffff168261ffff1610613128576040805162461bcd60e51b8152602060048201526006602482015265085cdc1b1a5d60d21b604482015290519081900360640190fd5b6002805461ffff928316600160d01b0261ffff60d01b1994909316600160c01b0261ffff60c01b199091161792909216179055565b3390565b600061316b614175565b60008481526005602052604090819020815161016081019092528054829060ff16600281111561319757fe5b60028111156131a257fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561322357fe5b600281111561322e57fe5b815260089190910154610100900460ff16151560209091015290506000816101200151600281111561325c57fe5b146132a5576040805162461bcd60e51b815260206004820152601460248201527321b0b73737ba10383937b1b2b2b21037b93232b960611b604482015290519081900360640190fd5b600454600110156134ef57610100810151600480546000919060001981019081106132cc57fe5b906000526020600020015490506132e1614175565b60008281526005602052604090819020815161016081019092528054829060ff16600281111561330d57fe5b600281111561331857fe5b815281546001600160a01b036101009182900481166020840152600184015481166040840152600280850154909116606084015260038401546080840152600484015460a0840152600584015460c0840152600684015460e084015260078401549183019190915260088301546101209092019160ff169081111561339957fe5b60028111156133a457fe5b81526008919091015460ff6101009182900416151560209283015282018590526000848152600590915260409020815181549293508392829060ff191660018360028111156133ef57fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff199092169184908111156134a857fe5b02179055506101408201518160080160016101000a81548160ff02191690831515021790555090505081600484815481106134df57fe5b6000918252602090912001555050505b60048054806134fa57fe5b6001900381819060005260206000200160009055905582816101200190600281111561352257fe5b9081600281111561352f57fe5b90525060001961010082015260008481526005602052604090208151815483929190829060ff1916600183600281111561356557fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff1990921691849081111561361e57fe5b02179055506101409190910151600890910180549115156101000261ff0019909216919091179055506001905092915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106136ce5780518252601f1990920191602091820191016136af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613730576040519150601f19603f3d011682016040523d82523d6000602084013e613735565b606091505b5091509150818015613763575080511580613763575080806020019051602081101561376057600080fd5b50515b6137b4576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106138075780518252601f1990920191602091820191016137e8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613869576040519150601f19603f3d011682016040523d82523d6000602084013e61386e565b606091505b50509050806138ae5760405162461bcd60e51b81526004018080602001828103825260238152602001806142ac6023913960400191505060405180910390fd5b505050565b6000807f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f6001600160a01b031663e6a4390585856040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d602081101561395e57600080fd5b505190506001600160a01b0381166139bd576040805162461bcd60e51b815260206004820152601860248201527f556e617661696c61626c65207061697220616464726573730000000000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310613a495780518252601f199092019160209182019101613a2a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613aab576040519150601f19603f3d011682016040523d82523d6000602084013e613ab0565b606091505b5091509150818015613ade575080511580613ade5750808060200190516020811015613adb57600080fd5b50515b613b195760405162461bcd60e51b81526004018080602001828103825260248152602001806142cf6024913960400191505060405180910390fd5b505050505050565b60006139bd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614079565b6000828201838110156139bd576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000613bc7614175565b6003805460018101909155613bda614175565b6040518061016001604052808f6002811115613bf257fe5b81526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018a8152602001898152602001888152602001878152602001600480549050815260200160006002811115613c5457fe5b81528615156020918201526004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0185905560008581526005909252604090912082518154939450849391929091839160ff1990911690836002811115613cc157fe5b0217905550602082015181546001600160a01b03918216610100908102610100600160a81b03199092169190911783556040840151600180850180549285166001600160a01b03199384161790556060860151600280870180549290961691909316179093556080850151600385015560a0850151600485015560c0850151600585015560e085015160068501559084015160078401556101208401516008840180549193909260ff19909216918490811115613d7a57fe5b02179055506101409190910151600890910180549115156101000261ff00199092169190911790556001600160a01b03808e16600090815260066020908152604080832080546001818101835591855283852001879055938e168352822080549384018155825290200182905590925090509a509a98505050505050505050565b6040805160028082526060808301845292839291906020830190803683370190505090508381600081518110613e2d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110613e5b57fe5b6001600160a01b0390921660209283029190910190910152905092915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310613ef85780518252601f199092019160209182019101613ed9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f5a576040519150601f19603f3d011682016040523d82523d6000602084013e613f5f565b606091505b5091509150818015613f8d575080511580613f8d5750808060200190516020811015613f8a57600080fd5b50515b6137b4576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b600082613fed57506000612eb5565b82820282848281613ffa57fe5b04146139bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806142186021913960400191505060405180910390fd5b60006139bd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614110565b600081848411156141085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140cd5781810151838201526020016140b5565b50505050905090810190601f1680156140fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361415f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156140cd5781810151838201526020016140b5565b50600083858161416b57fe5b0495945050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905290610120820190815260006020909101529056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e73616374696f6e2076616c7565206d757374206d61746368206578656375746f72206665655472616e73616374696f6e2076616c7565206d757374206d61746368206f6666657220616e64206665655472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220da47cafd9878ac3d44fa0e88577d205caf6db2b052e7773be8fefdb0502f617664736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c54fa7403b020e78828886becd99b6caaa1433cb0000000000000000000000005b32cdda19ea68f8e3a8511455ef39a9d178c5ca000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a
-----Decoded View---------------
Arg [0] : _uniswapV2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _incinerator (address): 0xc54fA7403B020e78828886becD99B6caaa1433Cb
Arg [2] : _staker (address): 0x5b32CDda19EA68f8E3A8511455EF39a9d178c5ca
Arg [3] : _feeMul (uint16): 2
Arg [4] : _feeDiv (uint16): 1000
Arg [5] : _splitMul (uint16): 6
Arg [6] : _splitDiv (uint16): 10
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000c54fa7403b020e78828886becd99b6caaa1433cb
Arg [2] : 0000000000000000000000005b32cdda19ea68f8e3a8511455ef39a9d178c5ca
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode Sourcemap
24368:21641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24514:51;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;24514:51:0;;;;;;;;;;;;;;24630:48;;;;;;;;;;;;;:::i;45568:176::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45568:176:0;-1:-1:-1;;;;;45568:176:0;;:::i;:::-;;;;;;;;;;;;;;;;44449:154;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44449:154:0;-1:-1:-1;;;;;44449:154:0;;:::i;:::-;;33125:989;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33125:989:0;;:::i;:::-;;;;;;;;;;;;;;;;;;24721:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24572:51;;;;;;;;;;;;;:::i;24685:29::-;;;;;;;;;;;;;:::i;45442:118::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45442:118:0;;:::i;8224:148::-;;;;;;;;;;;;;:::i;24804:22::-;;;;;;;;;;;;;:::i;26963:2715::-;;;;;;;;;;;;;;;;-1:-1:-1;26963:2715:0;;;;;-1:-1:-1;;;;;26963:2715:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24775:22::-;;;;;;;;;;;;;:::i;24748:20::-;;;;;;;;;;;;;:::i;7582:79::-;;;;;;;;;;;;;:::i;34122:6905::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34122:6905:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29686:3431;;;;;;;;;;;;;;;;-1:-1:-1;29686:3431:0;;;;;;;;;;;;;;;;;:::i;43548:893::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43548:893:0;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43548:893:0;;;;;;-1:-1:-1;;;;;43548:893:0;;;;;;-1:-1:-1;;;;;43548:893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45752:186;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45752:186:0;;;;;;;;:::i;45324:110::-;;;;;;;;;;;;;:::i;44611:177::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44611:177:0;;;;;;;;;;;:::i;8527:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8527:244:0;-1:-1:-1;;;;;8527:244:0;;:::i;44796:220::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44796:220:0;;;;;;;;;;;:::i;24514:51::-;;;:::o;24630:48::-;;;:::o;45568:176::-;-1:-1:-1;;;;;45703:26:0;45671:7;45703:26;;;:16;:26;;;;;:33;;45568:176::o;44449:154::-;7804:12;:10;:12::i;:::-;7794:6;;-1:-1:-1;;;;;7794:6:0;;;:22;;;7786:67;;;;;-1:-1:-1;;;7786:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7786:67:0;;;;;;;;;;;;;;;44528:6:::1;:18:::0;;-1:-1:-1;;;;;44528:18:0;::::1;-1:-1:-1::0;;;;;;44528:18:0;;::::1;::::0;::::1;::::0;;;44562:33:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;44449:154:::0;:::o;33125:989::-;33246:4;26311:15;;;:6;:15;;;;;:21;33197:7;;26311:21;;;-1:-1:-1;;;;;26311:21:0;26303:63;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;;;;10525:1:::1;11131:7;;:19;;11123:63;;;::::0;;-1:-1:-1;;;11123:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;11123:63:0;;;;;;;;;;;;;::::1;;10525:1;11264:7;:18:::0;33268:29:::2;;:::i;:::-;33300:15;::::0;;;:6:::2;:15;::::0;;;;;;33268:47;;::::2;::::0;::::2;::::0;;;;;;;::::2;;;::::0;::::2;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;;;;33268:47:0::2;::::0;;;::::2;::::0;::::2;;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;;::::2;;::::0;;::::2;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;;;;;;::::0;;::::2;::::0;33348:22;::::2;::::0;;;-1:-1:-1;;;;;;33334:36:0::2;:10;:36;33326:66;;;::::0;;-1:-1:-1;;;33326:66:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33326:66:0;;;;;;;;;;;;;::::2;;33456:17;33425:16;:27;;;:48;;;;;;;;;33403:117;;;::::0;;-1:-1:-1;;;33403:117:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33403:117:0;;;;;;;;;;;;;::::2;;33533:43;33546:7;33555:20;33533:12;:43::i;:::-;-1:-1:-1::0;33676:22:0::2;33646:26:::0;;:52:::2;::::0;::::2;;;;;;;33642:262;;33715:177;33761:16;:24;;;33804:16;:22;;;33845:16;:32;;;33715:27;:177::i;:::-;33916:127;33961:16;:22;;;33998:16;:34;;;33916:30;:127::i;:::-;34061:23;::::0;34076:7;;34061:23:::2;::::0;;;::::2;-1:-1:-1::0;;34102:4:0::2;11443:22:::0;;;34102:4;33125:989;-1:-1:-1;;33125:989:0:o;24721:20::-;;;-1:-1:-1;;;24721:20:0;;;;;:::o;24572:51::-;;;:::o;24685:29::-;;;-1:-1:-1;;;;;24685:29:0;;:::o;45442:118::-;45506:7;45533:12;45546:5;45533:19;;;;;;;;;;;;;;;;45526:26;;45442:118;;;:::o;8224:148::-;7804:12;:10;:12::i;:::-;7794:6;;-1:-1:-1;;;;;7794:6:0;;;:22;;;7786:67;;;;;-1:-1:-1;;;7786:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7786:67:0;;;;;;;;;;;;;;;8331:1:::1;8315:6:::0;;8294:40:::1;::::0;-1:-1:-1;;;;;8315:6:0;;::::1;::::0;8294:40:::1;::::0;8331:1;;8294:40:::1;8362:1;8345:19:::0;;-1:-1:-1;;;;;;8345:19:0::1;::::0;;8224:148::o;24804:22::-;;;-1:-1:-1;;;24804:22:0;;;;;:::o;26963:2715::-;27212:7;10525:1;11131:7;;:19;;11123:63;;;;;-1:-1:-1;;;11123:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11123:63:0;;;;;;;;;;;;;;;10525:1;11264:7;:18;27240:19;27232:54:::1;;;::::0;;-1:-1:-1;;;27232:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27232:54:0;;;;;;;;;;;;;::::1;;27325:1;27305:17;:21;27297:57;;;::::0;;-1:-1:-1;;;27297:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27297:57:0;;;;;;;;;;;;;::::1;;27387:1;27373:11;:15;27365:48;;;::::0;;-1:-1:-1;;;27365:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27365:48:0;;;;;;;;;;;;;::::1;;27426:20;27449:15;-1:-1:-1::0;;;;;27449:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27449:22:0;;-1:-1:-1;27482:17:0::1;27537:22;27524:9;:35;;;;;;;;;27520:1347;;27615:11;27602:9;:24;27576:127;;;;-1:-1:-1::0;;;27576:127:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27735:22;27722:9;:35;;;;;;;;;27718:206;;;27798:12;-1:-1:-1::0;;;;;27786:24:0::1;:8;-1:-1:-1::0;;;;;27786:24:0::1;;27778:59;;;::::0;;-1:-1:-1;;;27778:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27778:59:0;;;;;;;;;;;;;::::1;;27718:206;;;27878:30;27886:7;27895:12;27878:7;:30::i;:::-;;27718:206;27938:21;27969:7;-1:-1:-1::0;;;;;27962:25:0::1;;27996:4;27962:40;;;;;;;;;;;;;-1:-1:-1::0;;;;;27962:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27962:40:0;;-1:-1:-1;28089:167:0::1;28139:7:::0;28165:10:::1;28202:4;28226:15:::0;28089:31:::1;:167::i;:::-;28271:20;28301:7;-1:-1:-1::0;;;;;28294:25:0::1;;28328:4;28294:40;;;;;;;;;;;;;-1:-1:-1::0;;;;;28294:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28294:40:0;;-1:-1:-1;28388:15:0;28353:31:::1;28294:40:::0;28370:13;28353:16:::1;:31::i;:::-;:50;28349:178;;28442:31;:12:::0;28459:13;28442:16:::1;:31::i;:::-;28424:49;;28507:4;28492:19;;28349:178;28567:1;28549:15;:19;28541:60;;;::::0;;-1:-1:-1;;;28541:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27520:1347;;;;;28653:12;-1:-1:-1::0;;;;;28642:23:0::1;:7;-1:-1:-1::0;;;;;28642:23:0::1;;28634:57;;;::::0;;-1:-1:-1;;;28634:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28634:57:0;;;;;;;;;;;;;::::1;;28745:32;:15:::0;28765:11;28745:19:::1;:32::i;:::-;28732:9;:45;28706:149;;;;-1:-1:-1::0;;;28706:149:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28926:20;28949:26;28957:7;28966:8;28949:7;:26::i;:::-;28926:49;;28989:16;29007:19;;:::i;:::-;29030:284;29058:9;29082:10;29107:7;29129:8;29152:12;29179:15;29209:17;29241:11;29267:9;29291:12;29030:13;:284::i;:::-;28988:326;;;;29412:6;:12;;;-1:-1:-1::0;;;;;29332:310:0::1;29358:8;29332:310;29381:6;:16;;;29439:6;:14;;;29468:6;:15;;;29498:6;:22;;;29535:6;:24;;;29574:6;:18;;;29607:6;:24;;;29332:310;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;29332:310:0::1;;;;;;-1:-1:-1::0;;;;;29332:310:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;10481:1:0;11443:22;;29662:8;26963:2715;-1:-1:-1;;;;;;;;;;26963:2715:0:o;24775:22::-;;;-1:-1:-1;;;24775:22:0;;;;;:::o;24748:20::-;;;-1:-1:-1;;;24748:20:0;;;;;:::o;7582:79::-;7620:7;7647:6;-1:-1:-1;;;;;7647:6:0;7582:79;:::o;34122:6905::-;26344:1;26311:15;;;:6;:15;;;;;:21;34244:24;;34195:7;;26311:21;;;-1:-1:-1;;;;;26311:21:0;26303:63;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;;;;10525:1:::1;11131:7;;:19;;11123:63;;;::::0;;-1:-1:-1;;;11123:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;11123:63:0;;;;;;;;;;;;;::::1;;10525:1;11264:7;:18:::0;34286:28:::2;;:::i;:::-;34317:15;::::0;;;:6:::2;:15;::::0;;;;;;34286:46;;::::2;::::0;::::2;::::0;;;;;;;::::2;;;::::0;::::2;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;;;;34286:46:0::2;::::0;;;::::2;::::0;::::2;;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;;::::2;;::::0;;::::2;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;;;;;;::::0;;::::2;::::0;;-1:-1:-1;;34365:15:0::2;:26;;;:47;;;;;;;;;34343:117;;;::::0;;-1:-1:-1;;;34343:117:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34343:117:0;;;;;;;;;;;;;::::2;;34473:42;34486:7;34495:19;34473:12;:42::i;:::-;;34528:29;34560:98;34585:15;:23;;;34623:15;:24;;;34560:10;:98::i;:::-;34528:130:::0;-1:-1:-1;34669:19:0::2;::::0;34709:25;;:54:::2;::::0;::::2;;;;;;;34705:5754;;;34780:176;34825:15;:23;;;34875:15;34910;:31;;;34780:26;:176::i;:::-;35057:6;::::0;34991:31:::2;::::0;::::2;::::0;34971:17:::2;::::0;34991:87:::2;::::0;35057:6:::2;-1:-1:-1::0;;;35057:6:0;::::2;::::0;::::2;::::0;34991:43:::2;::::0;:31;-1:-1:-1;;;35027:6:0;;::::2;;34991:35;:43::i;:::-;:47:::0;::::2;:87::i;:::-;34971:107;;35097:15;:28;;;35093:1210;;;35146:21;35177:15;:24;;;-1:-1:-1::0;;;;;35170:64:0::2;;35235:15;:21;;;35170:87;;;;;;;;;;;;;-1:-1:-1::0;;;;;35170:87:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35170:87:0;35390:31:::2;::::0;::::2;::::0;35170:87;;-1:-1:-1;;;;;;35276:15:0::2;:91;::::0;::::2;::::0;35390:46:::2;::::0;35426:9;35390:35:::2;:46::i;:::-;35459:15;:33;;;35515:12;35550:15;:21;;;24505:1;24496:11;35276:348;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35276:348:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;35643:20;35673:15;:24;;;-1:-1:-1::0;;;;;35666:64:0::2;;35731:15;:21;;;35666:87;;;;;;;;;;;;;-1:-1:-1::0;;;;;35666:87:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35666:87:0;35782:16:::2;::::0;;35796:1:::2;35782:16:::0;;;;;::::2;::::0;;35666:87;;-1:-1:-1;35782:16:0;35796:1;35782:16:::2;::::0;::::2;::::0;;::::2;::::0;::::2;-1:-1:-1::0;;;35830:31:0::2;::::0;::::2;::::0;35772:26;;-1:-1:-1;35830:46:0::2;::::0;35866:9;35830:35:::2;:46::i;:::-;35817:7;35825:1;35817:10;;;;;;;;;::::0;;::::2;::::0;;;;;:59;35908:31:::2;:12:::0;35925:13;35908:16:::2;:31::i;:::-;35895:7;35903:1;35895:10;;;;;;;;;;;;;:44;;;::::0;::::2;35093:1210;;;;;35990:15;-1:-1:-1::0;;;;;35990:40:0::2;;36053:46;36089:9;36053:15;:31;;;:35;;:46;;;;:::i;:::-;36122:15;:33;;;36178:12;36213:15;:21;;;24505:1;24496:11;35990:297;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35990:297:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;35990:297:0::2;::::0;::::2;;::::0;::::2;::::0;::::2;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;::::0;;-1:-1:-1;35990:297:0;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;::::0;::::2;;35980:307;;35093:1210;36323:13:::0;;36319:1392:::2;;36412:26;36441:120;36474:15;:23;;;36520:15;-1:-1:-1::0;;;;;36520:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36520:22:0;36441:10:::2;:120::i;:::-;36412:149;;36584:15;:28;;;36580:1116;;;36637:21;36668:15;-1:-1:-1::0;;;;;36668:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36668:22:0;36661:81:::2;::::0;;-1:-1:-1;;;36661:81:0;;36736:4:::2;36661:81;::::0;::::2;::::0;;;-1:-1:-1;;;;;36661:66:0;;::::2;::::0;::::2;::::0;:81;;;;;36668:22:::2;::::0;36661:81;;;;;;;;:66;:81;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36661:81:0;36765:304:::2;::::0;-1:-1:-1;;;36765:304:0;;::::2;::::0;::::2;::::0;;;36920:1:::2;36765:304:::0;;;;;;37003:4:::2;36765:304:::0;;;;;;-1:-1:-1;;36765:304:0;;;;;;;;;;;;;;;;;;;;;36661:81;;-1:-1:-1;;;;;;36765:15:0::2;:92;::::0;::::2;::::0;36884:9;;36959;;37003:4;24496:11;36765:304;;;;;;;36661:81:::2;36765:304:::0;;::::2;::::0;::::2;::::0;;;36920:1;36765:304:::2;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;37092:20;37122:15;-1:-1:-1::0;;;;;37122:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37122:22:0;37115:81:::2;::::0;;-1:-1:-1;;;37115:81:0;;37190:4:::2;37115:81;::::0;::::2;::::0;;;-1:-1:-1;;;;;37115:66:0;;::::2;::::0;::::2;::::0;:81;;;;;37122:22:::2;::::0;37115:81;;;;;;;;:66;:81;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37115:81:0;;-1:-1:-1;37233:31:0::2;37115:81:::0;37250:13;37233:16:::2;:31::i;:::-;37219:45;;36580:1116;;;;;37313:31;37347:15;-1:-1:-1::0;;;;;37347:63:0::2;;37437:9;37473:1;37512:9;37556:4;24505:1;24496:11;37347:275;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;37347:275:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;37347:275:0::2;::::0;::::2;;::::0;::::2;::::0;::::2;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;::::0;;-1:-1:-1;37347:275:0;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;::::0;::::2;;37313:309;;37659:14;37674:1;37659:17;;;;;;;;;;;;;;37645:31;;36580:1116;;36319:1392;;34705:5754;;;;37761:22;37732:25:::0;;:51:::2;::::0;::::2;;;;;;;37728:2731;;;37800:176;37845:15;:23;;;37895:15;37930;:31;;;37800:26;:176::i;:::-;37995:15;:28;;;37991:1011;;;38044:21;38068;38044:45;;38108:15;-1:-1:-1::0;;;;;38108:88:0::2;;38219:15;:31;;;38273:15;:33;;;38329:12;38372:4;24505:1;24496:11;38108:322;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;38108:322:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;38522:16:0::2;::::0;;38536:1:::2;38522:16:::0;;;;;::::2;::::0;;38472:21:::2;::::0;-1:-1:-1;38522:16:0;;-1:-1:-1;38536:1:0;38522:16:::2;::::0;::::2;::::0;;::::2;::::0;::::2;;::::0;-1:-1:-1;38522:16:0::2;38512:26;;38570:15;:31;;;38557:7;38565:1;38557:10;;;;;;;;;::::0;;::::2;::::0;;;;;:44;38633:31:::2;:12:::0;38650:13;38633:16:::2;:31::i;:::-;38620:7;38628:1;38620:10;;;;;;;;;;;;;:44;;;::::0;::::2;37991:1011;;;;;38715:15;-1:-1:-1::0;;;;;38715:37:0::2;;38775:15;:31;;;38829:15;:33;;;38885:12;38928:4;24505:1;24496:11;38715:271;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;38715:271:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;38715:271:0::2;::::0;::::2;;::::0;::::2;::::0;::::2;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;::::0;;-1:-1:-1;38715:271:0;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;::::0;::::2;;38705:281;;37991:1011;39059:6;::::0;39032:10;;:34:::2;::::0;39059:6:::2;-1:-1:-1::0;;;39059:6:0;::::2;::::0;::::2;::::0;39032:22:::2;::::0;-1:-1:-1;;;39047:6:0;::::2;::::0;;::::2;::::0;39032:7;;39040:1:::2;::::0;39032:10;::::2;;;;;;;;;;;:14;;:22;;;;:::i;:34::-;39018:48;;39115:1;39085:27;39100:11;39085:7;39093:1;39085:10;;;;;;;;;;;;;;:14;;:27;;;;:::i;:::-;:31;39081:279;;;39201:143;39254:15;:21;;;39298:27;39313:11;39298:7;39306:1;39298:10;;;;;;;:27;39201:30;:143::i;:::-;37728:2731;;;39410:22;39381:25:::0;;:51:::2;::::0;::::2;;;;;;;39377:1082;;;39496:24;39523:98;39579:15;:27;;;39523:15;:33;;;:37;;:98;;;;:::i;:::-;39683:6;::::0;39496:125;;-1:-1:-1;39650:40:0::2;::::0;39683:6:::2;-1:-1:-1::0;;;39683:6:0;::::2;::::0;::::2;::::0;39650:28:::2;::::0;39496:125;;-1:-1:-1;;;39671:6:0;::::2;;39650:20;:28::i;:40::-;39636:54;;39707:21;39738:15;:24;;;-1:-1:-1::0;;;;;39731:42:0::2;;39792:15;:21;;;39731:97;;;;;;;;;;;;;-1:-1:-1::0;;;;;39731:97:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;39731:97:0;;-1:-1:-1;;;;;;39843:15:0::2;:66;;39935:33;:16:::0;39956:11;39935:20:::2;:33::i;:::-;40002:15;:33;;;40054:12;40085:15;:21;;;24505:1;24496:11;39843:308;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39843:308:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;40166:20;40196:15;:24;;;-1:-1:-1::0;;;;;40189:42:0::2;;40250:15;:21;;;40189:97;;;;;;;;;;;;;-1:-1:-1::0;;;;;40189:97:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40189:97:0;40311:16:::2;::::0;;40325:1:::2;40311:16:::0;;;;;::::2;::::0;;40189:97;;-1:-1:-1;40311:16:0;40325:1;40311:16:::2;::::0;::::2;::::0;;::::2;::::0;::::2;;::::0;-1:-1:-1;;40301:26:0;-1:-1:-1;40355:33:0::2;:16:::0;40376:11;40355:20:::2;:33::i;:::-;40342:7;40350:1;40342:10;;;;;;;;;::::0;;::::2;::::0;;;;;:46;40416:31:::2;:12:::0;40433:13;40416:16:::2;:31::i;:::-;40403:7;40411:1;40403:10;;;;;;;;;;;;;:44;;;::::0;::::2;39377:1082;;;;40522:15:::0;;40518:307:::2;;40605:8;::::0;40554:18:::2;::::0;40575:39:::2;::::0;40605:8:::2;-1:-1:-1::0;;;40605:8:0;::::2;::::0;::::2;::::0;40575:25:::2;::::0;:11;;-1:-1:-1;;;40591:8:0;::::2;;40575:15;:25::i;:39::-;40554:60:::0;-1:-1:-1;40633:14:0;;40629:105:::2;;40668:11;-1:-1:-1::0;;;;;40668:16:0::2;;40692:10;40668:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;40629:105:0::2;40748:6;::::0;-1:-1:-1;;;;;40748:6:0::2;:14;40770:27;:11:::0;40786:10;40770:15:::2;:27::i;:::-;40748:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;40518:307;;40874:71;40905:10;40917:15;:27;;;40874:30;:71::i;:::-;40986:10;-1:-1:-1::0;;;;;40963:56:0::2;40977:7;40963:56;40998:7;41007:11;40963:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;10481:1:0::1;11443:22:::0;;-1:-1:-1;34122:6905:0;;;-1:-1:-1;;34122:6905:0:o;29686:3431::-;29895:4;26311:15;;;:6;:15;;;;;:21;29864:7;;26311:21;;;-1:-1:-1;;;;;26311:21:0;26303:63;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;;;;10525:1:::1;11131:7;;:19;;11123:63;;;::::0;;-1:-1:-1;;;11123:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;11123:63:0;;;;;;;;;;;;;::::1;;10525:1;11264:7;:18:::0;29912:27:::2;;:::i;:::-;29942:15;::::0;;;:6:::2;:15;::::0;;;;;;29912:45;;::::2;::::0;::::2;::::0;;;;;;;::::2;;;::::0;::::2;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;;;;29912:45:0::2;::::0;;;::::2;::::0;::::2;;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;;::::2;;::::0;;::::2;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;;;;;;::::0;;::::2;::::0;29990:20;::::2;::::0;;;-1:-1:-1;;;;;;29976:34:0::2;:10;:34;29968:64;;;::::0;;-1:-1:-1;;;29968:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;29968:64:0;;;;;;;;;;;;;::::2;;30094:17;30065:14;:25;;;:46;;;;;;;;;30043:115;;;::::0;;-1:-1:-1;;;30043:115:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;30043:115:0;;;;;;;;;;;;;::::2;;30195:1;30177:15;:19;30169:54;;;::::0;;-1:-1:-1;;;30169:54:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;30169:54:0;;;;;;;;;;;;;::::2;;30262:1;30242:17;:21;30234:57;;;::::0;;-1:-1:-1;;;30234:57:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;30234:57:0;;;;;;;;;;;;;::::2;;30324:1;30310:11;:15;30302:48;;;::::0;;-1:-1:-1;;;30302:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;30302:48:0;;;;;;;;;;;;;::::2;;30395:22;30367:24:::0;;:50:::2;::::0;::::2;;;;;;;30363:2322;;;30434:16;30453:32;:15:::0;30473:11;30453:19:::2;:32::i;:::-;30434:51;;30515:14;:32;;;30504:8;:43;30500:497;;;30624:32;::::0;::::2;::::0;30611:46:::2;::::0;:8;;:12:::2;:46::i;:::-;30598:9;:59;30568:162;;;::::0;;-1:-1:-1;;;30568:162:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;30500:497;;;30767:14;:32;;;30756:8;:43;30752:245;;;30820:161;30873:14;:20;;;30916:46;30953:8;30916:14;:32;;;:36;;:46;;;;:::i;30820:161::-;31011:32;::::0;::::2;:43:::0;30363:2322:::2;;;31105:14;:26;;;31091:11;:40;31087:481;;;31211:26;::::0;::::2;::::0;31195:43:::2;::::0;:11;;:15:::2;:43::i;:::-;31182:9;:56;31152:155;;;::::0;;-1:-1:-1;;;31152:155:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;31087:481;;;31347:14;:26;;;31333:11;:40;31329:239;;;31394:158;31447:14;:20;;;31490:43;31521:11;31490:14;:26;;;:30;;:43;;;;:::i;31394:158::-;31582:32;::::0;::::2;:46:::0;;;31665:30:::2;::::0;::::2;::::0;31647:48;::::2;31643:1031;;;31716:21;31747:14;:22;;;-1:-1:-1::0;;;;;31740:62:0::2;;31811:4;31740:77;;;;;;;;;;;;;-1:-1:-1::0;;;;;31740:77:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;31740:77:0;31890:22:::2;::::0;::::2;::::0;32024:30:::2;::::0;::::2;::::0;31740:77;;-1:-1:-1;31836:238:0::2;::::0;31935:10:::2;::::0;31976:4:::2;::::0;32004:51:::2;::::0;:15;;:19:::2;:51::i;:::-;31836:31;:238::i;:::-;32093:20;32123:14;:22;;;-1:-1:-1::0;;;;;32116:40:0::2;;32187:4;32116:95;;;;;;;;;;;;;-1:-1:-1::0;;;;;32116:95:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;32116:95:0;;-1:-1:-1;32248:107:0::2;32305:31;32116:95:::0;32322:13;32305:16:::2;:31::i;:::-;32248:30;::::0;::::2;::::0;;:34:::2;:107::i;:::-;32230:125;;31643:1031;;;;;32399:14;:30;;;32381:15;:48;32377:297;;;32450:208;32500:14;:22;;;32545:14;:20;;;32588:51;32623:15;32588:14;:30;;;:34;;:51;;;;:::i;:::-;32450:27;:208::i;:::-;32729:30;::::0;::::2;:48:::0;;;32788:32:::2;::::0;::::2;:52:::0;;;32851:26:::2;::::0;::::2;:40:::0;;;-1:-1:-1;32902:15:0;;;:6:::2;:15;::::0;;;;:32;;;;32729:14;;32902:15;:32;:15;;-1:-1:-1;;32902:32:0::2;::::0;;::::2;::::0;::::2;;;;;;;;::::0;;-1:-1:-1;32902:32:0::2;::::0;::::2;::::0;;;-1:-1:-1;;;;;32902:32:0;;::::2;;::::0;;::::2;-1:-1:-1::0;;;;;;32902:32:0;;::::2;::::0;;;::::2;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;::::2;-1:-1:-1::0;;;;;;32902:32:0;;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;::::2;::::0;;;::::2;;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;;32902:32:0;;::::2;::::0;;;;::::2;;;;;;;;::::0;;-1:-1:-1;32902:32:0::2;::::0;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;;;;-1:-1:-1::0;;32902:32:0;;::::2;::::0;;;::::2;::::0;;32952:133:::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;32979:7;;32952:133:::2;::::0;;;;;;;;::::2;-1:-1:-1::0;;33105:4:0::2;11443:22:::0;;;33105:4;29686:3431;-1:-1:-1;;;;;29686:3431:0:o;43548:893::-;43672:19;26311:15;;;:6;:15;;;;;:21;43672:19;;;;;;;;;;;;;;;;;;43631:7;;26311:21;;;-1:-1:-1;;;;;26311:21:0;26303:63;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;-1:-1:-1;;;26303:63:0;;;;;;;;;;;;;;;44036:19:::1;;:::i;:::-;44058:15;::::0;;;:6:::1;:15;::::0;;;;;;44036:37;;::::1;::::0;::::1;::::0;;;;;;;::::1;;;::::0;::::1;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;;;;44036:37:0::1;::::0;;;::::1;::::0;::::1;;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;44106:6;:16;;;44137:6;:12;;;44164:6;:14;;;44193:6;:15;;;44223:6;:22;;;44260:6;:24;;;44299:6;:18;;;44332:6;:24;;;44371:6;:17;;;44403:6;:19;;;44084:349;;;;;;;;;;;;;;;;;;;;;43548:893:::0;;;;;;;;;;;;:::o;45752:186::-;-1:-1:-1;;;;;45897:26:0;;45865:7;45897:26;;;:16;:26;;;;;:33;;45924:5;;45897:33;;;;;;;;;;;;;;45890:40;;45752:186;;;;;:::o;45324:110::-;45407:12;:19;45324:110;:::o;44611:177::-;7804:12;:10;:12::i;:::-;7794:6;;-1:-1:-1;;;;;7794:6:0;;;:22;;;7786:67;;;;;-1:-1:-1;;;7786:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7786:67:0;;;;;;;;;;;;;;;44710:7:::1;44700:17;;:7;:17;;;44692:34;;;::::0;;-1:-1:-1;;;44692:34:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;44692:34:0;;;;;;;;;;;;;::::1;;44737:6;:16:::0;;::::1;44764::::0;;::::1;-1:-1:-1::0;;;44764:16:0::1;-1:-1:-1::0;;;;44737:16:0;;;::::1;-1:-1:-1::0;;;44737:16:0::1;-1:-1:-1::0;;;;44737:16:0;;::::1;;44764::::0;;;::::1;;::::0;;44611:177::o;8527:244::-;7804:12;:10;:12::i;:::-;7794:6;;-1:-1:-1;;;;;7794:6:0;;;:22;;;7786:67;;;;;-1:-1:-1;;;7786:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7786:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;8616:22:0;::::1;8608:73;;;;-1:-1:-1::0;;;8608:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8718:6;::::0;;8697:38:::1;::::0;-1:-1:-1;;;;;8697:38:0;;::::1;::::0;8718:6;::::1;::::0;8697:38:::1;::::0;::::1;8746:6;:17:::0;;-1:-1:-1;;;;;;8746:17:0::1;-1:-1:-1::0;;;;;8746:17:0;;;::::1;::::0;;;::::1;::::0;;8527:244::o;44796:220::-;7804:12;:10;:12::i;:::-;7794:6;;-1:-1:-1;;;;;7794:6:0;;;:22;;;7786:67;;;;;-1:-1:-1;;;7786:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7786:67:0;;;;;;;;;;;;;;;44926:9:::1;44914:21;;:9;:21;;;44906:40;;;::::0;;-1:-1:-1;;;44906:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44906:40:0;;;;;;;;;;;;;::::1;;44957:8;:20:::0;;::::1;44988::::0;;::::1;-1:-1:-1::0;;;44988:20:0::1;-1:-1:-1::0;;;;44957:20:0;;;::::1;-1:-1:-1::0;;;44957:20:0::1;-1:-1:-1::0;;;;44957:20:0;;::::1;;44988::::0;;;::::1;;::::0;;44796:220::o;6068:106::-;6156:10;6068:106;:::o;42259:974::-;42356:4;42378:29;;:::i;:::-;42410:15;;;;:6;:15;;;;;;;42378:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42378:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42458:16:0;:27;;;:48;;;;;;;;;42436:118;;;;;-1:-1:-1;;;42436:118:0;;;;;;;;;;;;-1:-1:-1;;;42436:118:0;;;;;;;;;;;;;;;42571:12;:19;42593:1;-1:-1:-1;42567:418:0;;;42637:33;;;;42708:12;42721:19;;42611:23;;42708:12;-1:-1:-1;;42721:23:0;;;42708:37;;;;;;;;;;;;;;42685:60;;42760:23;;:::i;:::-;42786:20;;;;:6;:20;;;;;;;42760:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42760:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42821:27;;:45;;;-1:-1:-1;42881:20:0;;;:6;:20;;;;;;:33;;;;42760:46;;-1:-1:-1;42760:46:0;;42881:20;;-1:-1:-1;;42881:33:0;42760:46;42881:33;;;;;;;;;;;;;-1:-1:-1;42881:33:0;;;;;;-1:-1:-1;;;;;42881:33:0;;;;;;;-1:-1:-1;;;;;;42881:33:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42881:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42881:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42961:12;42929;42942:15;42929:29;;;;;;;;;;;;;;;;;:44;-1:-1:-1;;;42567:418:0;42997:12;:18;;;;;;;;;;;;;;;;;;;;;;;;43056:9;43026:16;:27;;:39;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43076:33:0;;;:47;24505:1;43167:15;;;:6;:15;;;;;:34;;;;43076:16;;43167:15;:34;:15;;-1:-1:-1;;43167:34:0;;;;;;;;;;;;;;;-1:-1:-1;43167:34:0;;;;;;-1:-1:-1;;;;;43167:34:0;;;;;;;-1:-1:-1;;;;;;43167:34:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43167:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43167:34:0;;;;;;;;;;;;;;;;;-1:-1:-1;43167:34:0;;;;;;;;;;;;;;;;;-1:-1:-1;;43167:34:0;;;;;;;;;-1:-1:-1;43167:34:0;;-1:-1:-1;42259:974:0;;;;:::o;20935:361::-;21130:45;;;-1:-1:-1;;;;;21130:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21130:45:0;-1:-1:-1;;;21130:45:0;;;21119:57;;;;21084:12;;21098:17;;21119:10;;;;21130:45;21119:57;;;21130:45;21119:57;;21130:45;21119:57;;;;;;;;;;-1:-1:-1;;21119:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21083:93;;;;21195:7;:57;;;;-1:-1:-1;21207:11:0;;:16;;:44;;;21238:4;21227:24;;;;;;;;;;;;;;;-1:-1:-1;21227:24:0;21207:44;21187:101;;;;;-1:-1:-1;;;21187:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20935:361;;;;;:::o;21714:195::-;21822:12;;;21784;21822;;;;;;;;;-1:-1:-1;;;;;21801:7:0;;;21815:5;;21801:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21801:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21783:52;;;21854:7;21846:55;;;;-1:-1:-1;;;21846:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21714:195;;;:::o;43241:299::-;43340:7;43365:20;43388:16;-1:-1:-1;;;;;43388:24:0;;43413:6;43421;43388:40;;;;;;;;;;;;;-1:-1:-1;;;;;43388:40:0;;;;;;-1:-1:-1;;;;;43388:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43388:40:0;;-1:-1:-1;;;;;;43447:26:0;;43439:63;;;;;-1:-1:-1;;;43439:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43520:12;43241:299;-1:-1:-1;;;43241:299:0:o;21304:402::-;21529:51;;;-1:-1:-1;;;;;21529:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21529:51:0;-1:-1:-1;;;21529:51:0;;;21518:63;;;;21483:12;;21497:17;;21518:10;;;;21529:51;21518:63;;;21529:51;21518:63;;21529:51;21518:63;;;;;;;;;;-1:-1:-1;;21518:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21482:99;;;;21600:7;:57;;;;-1:-1:-1;21612:11:0;;:16;;:44;;;21643:4;21632:24;;;;;;;;;;;;;;;-1:-1:-1;21632:24:0;21612:44;21592:106;;;;-1:-1:-1;;;21592:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21304:402;;;;;;:::o;1434:136::-;1492:7;1519:43;1523:1;1526;1519:43;;;;;;;;;;;;;;;;;:3;:43::i;970:181::-;1028:7;1060:5;;;1084:6;;;;1076:46;;;;;-1:-1:-1;;;1076:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;41035:1216;41392:15;41409:12;;:::i;:::-;41453:11;;;41475:13;;;;;;41534:19;;:::i;:::-;41556:469;;;;;;;;41588:9;41556:469;;;;;;;;;;;;41619:5;-1:-1:-1;;;;;41556:469:0;;;;;41648:7;-1:-1:-1;;;;;41556:469:0;;;;;41680:8;-1:-1:-1;;;;;41556:469:0;;;;;41720:15;41556:469;;;;41769:17;41556:469;;;;41814:11;41556:469;;;;41859:17;41556:469;;;;41909:12;:19;;;;41556:469;;;;41955:17;41556:469;;;;;;;;;;;;;;;;;;42038:12;:27;;;;;;;;;;;;;;-1:-1:-1;42076:16:0;;;:6;:16;;;;;;;:25;;;;41534:491;;-1:-1:-1;41534:491:0;;42076:16;;:25;;:16;;-1:-1:-1;;42076:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;42076:25:0;;;;;;-1:-1:-1;;;;;42076:25:0;;;;;;;-1:-1:-1;;;;;;42076:25:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42076:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42076:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;42076:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;;42076:25:0;;;;;;;;;-1:-1:-1;;;;;42112:23:0;;;-1:-1:-1;42112:23:0;;;:16;:23;;;;;;;;:38;;42076:25;42112:38;;;;;;;;;;;;;;;42161:29;;;;;;;:44;;;;;;;;;;;;;;;42141:8;;-1:-1:-1;42236:6:0;-1:-1:-1;41035:1216:0;;;;;;;;;;;;;:::o;45024:292::-;45192:16;;;45206:1;45192:16;;;45126;45192;;;;;45126;;;45192;45206:1;45192:16;;;;;;;;;;-1:-1:-1;45192:16:0;45160:48;;45237:6;45219:12;45232:1;45219:15;;;;;;;;;;;;;:24;-1:-1:-1;;;;;45219:24:0;;;-1:-1:-1;;;;;45219:24:0;;;;;45272:6;45254:12;45267:1;45254:15;;;;;;;;-1:-1:-1;;;;;45254:24:0;;;:15;;;;;;;;;;;:24;45296:12;-1:-1:-1;45024:292:0;;;;:::o;20569:358::-;20762:45;;;-1:-1:-1;;;;;20762:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20762:45:0;-1:-1:-1;;;20762:45:0;;;20751:57;;;;20716:12;;20730:17;;20751:10;;;;20762:45;20751:57;;;20762:45;20751:57;;20762:45;20751:57;;;;;;;;;;-1:-1:-1;;20751:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20715:93;;;;20827:7;:57;;;;-1:-1:-1;20839:11:0;;:16;;:44;;;20870:4;20859:24;;;;;;;;;;;;;;;-1:-1:-1;20859:24:0;20839:44;20819:100;;;;;-1:-1:-1;;;20819:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2324:471;2382:7;2627:6;2623:47;;-1:-1:-1;2657:1:0;2650:8;;2623:47;2694:5;;;2698:1;2694;:5;:1;2718:5;;;;;:10;2710:56;;;;-1:-1:-1;;;2710:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:132;3329:7;3356:39;3360:1;3363;3356:39;;;;;;;;;;;;;;;;;:3;:39::i;1873:192::-;1959:7;1995:12;1987:6;;;;1979:29;;;;-1:-1:-1;;;1979:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2031:5:0;;;1873:192::o;3899:278::-;3985:7;4020:12;4013:5;4005:28;;;;-1:-1:-1;;;4005:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4044:9;4060:1;4056;:5;;;;;;;3899:278;-1:-1:-1;;;;;3899:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://da47cafd9878ac3d44fa0e88577d205caf6db2b052e7773be8fefdb0502f6176
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 61.46% | $3,335.56 | 2.8879 | $9,632.86 |
ETH | 21.03% | $0.003297 | 1,000,000 | $3,296.8 | |
ETH | 5.72% | $0.448251 | 2,000 | $896.5 | |
ETH | 2.51% | $0.017712 | 22,221.5661 | $393.59 | |
ETH | 2.37% | $3,252.75 | 0.114 | $370.76 | |
ETH | 1.68% | $26.3 | 10 | $263 | |
ETH | 0.96% | $0.999812 | 150 | $149.97 | |
ETH | 0.95% | $3.21 | 46.4204 | $148.91 | |
ETH | 0.62% | $0.063198 | 1,538.46 | $97.23 | |
ETH | 0.41% | $10.83 | 6 | $64.98 | |
ETH | 0.38% | <$0.000001 | 184,879,690,827.5263 | $60.23 | |
ETH | 0.32% | $0.000929 | 53,744.7201 | $49.94 | |
ETH | 0.16% | $0.85107 | 28.6187 | $24.36 | |
ETH | 0.13% | $0.399134 | 49.4365 | $19.73 | |
ETH | 0.12% | $0.00218 | 8,631.2416 | $18.81 | |
ETH | 0.12% | $0.019015 | 980 | $18.63 | |
ETH | 0.10% | $0.999979 | 15.7066 | $15.71 | |
ETH | 0.05% | $0.014242 | 591 | $8.42 | |
ETH | 0.04% | $6,646,478.79 | 0.000001 | $6.65 | |
ETH | 0.04% | $0.625272 | 10.4342 | $6.52 | |
ETH | 0.04% | $0.038185 | 164.934 | $6.3 | |
ETH | 0.04% | $69.27 | 0.0844 | $5.85 | |
ETH | 0.03% | $0.882947 | 5.7293 | $5.06 | |
ETH | 0.03% | $0.191638 | 25.9672 | $4.98 | |
ETH | 0.03% | $0.000001 | 4,000,000 | $4.52 | |
ETH | 0.02% | $0.001884 | 2,000 | $3.77 | |
ETH | 0.01% | $0.025735 | 84.3166 | $2.17 | |
ETH | 0.01% | $1.27 | 1.6901 | $2.15 | |
ETH | 0.01% | $195.54 | 0.01 | $1.96 | |
ETH | 0.01% | $0.126744 | 15 | $1.9 | |
ETH | <0.01% | $0.003614 | 423.76 | $1.53 | |
ETH | <0.01% | $135.92 | 0.01 | $1.36 | |
ETH | <0.01% | $0.059344 | 20.4334 | $1.21 | |
ETH | <0.01% | $0.000001 | 1,000,000 | $1.06 | |
ETH | <0.01% | $0.006843 | 150 | $1.03 | |
ETH | <0.01% | $1.8 | 0.5 | $0.8984 | |
ETH | <0.01% | $0.000014 | 54,220.0196 | $0.7482 | |
ETH | <0.01% | $7.57 | 0.0864 | $0.6537 | |
ETH | <0.01% | $0.000013 | 42,991.2374 | $0.5593 | |
ETH | <0.01% | $0.496902 | 1 | $0.4969 | |
ETH | <0.01% | $0.832226 | 0.4422 | $0.3679 | |
ETH | <0.01% | $0.00044 | 594 | $0.2616 | |
ETH | <0.01% | $0.296983 | 0.8 | $0.2375 | |
BSC | 0.31% | $115.47 | 0.416 | $48.04 | |
POL | 0.21% | $0.000043 | 759,687 | $32.41 | |
POL | <0.01% | $0.445407 | 1 | $0.445407 |
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.