Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,246 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12858084 | 1141 days ago | IN | 0 ETH | 0.00115056 | ||||
Multi Exchange S... | 10944244 | 1436 days ago | IN | 0 ETH | 0.01366936 | ||||
Multi Exchange S... | 10944239 | 1436 days ago | IN | 0 ETH | 0.01377743 | ||||
Multi Exchange S... | 10943780 | 1436 days ago | IN | 0 ETH | 0.01405548 | ||||
Multi Exchange S... | 10943607 | 1436 days ago | IN | 0 ETH | 0.0090649 | ||||
Multi Exchange S... | 10943282 | 1437 days ago | IN | 0 ETH | 0.03129202 | ||||
Multi Exchange S... | 10943161 | 1437 days ago | IN | 1.4 ETH | 0.01979978 | ||||
Multi Exchange S... | 10943010 | 1437 days ago | IN | 0 ETH | 0.023595 | ||||
Unwrap | 10942940 | 1437 days ago | IN | 0 ETH | 0.00626124 | ||||
Multi Exchange S... | 10942871 | 1437 days ago | IN | 0 ETH | 0.03512496 | ||||
Multi Exchange S... | 10942750 | 1437 days ago | IN | 5.5 ETH | 0.01395563 | ||||
Multi Exchange S... | 10942622 | 1437 days ago | IN | 0 ETH | 0.02169401 | ||||
Multi Exchange S... | 10942591 | 1437 days ago | IN | 0 ETH | 0.02193939 | ||||
Multi Exchange S... | 10942503 | 1437 days ago | IN | 0 ETH | 0.01548785 | ||||
Multi Exchange S... | 10942414 | 1437 days ago | IN | 0.1 ETH | 0.01029736 | ||||
Multi Exchange S... | 10942407 | 1437 days ago | IN | 0.1 ETH | 0.01122167 | ||||
Multi Exchange S... | 10942401 | 1437 days ago | IN | 0 ETH | 0.01934805 | ||||
Multi Exchange S... | 10942379 | 1437 days ago | IN | 0 ETH | 0.02815393 | ||||
Multi Exchange S... | 10942353 | 1437 days ago | IN | 0 ETH | 0.0115744 | ||||
Multi Exchange S... | 10942309 | 1437 days ago | IN | 0 ETH | 0.02260222 | ||||
Multi Exchange S... | 10942297 | 1437 days ago | IN | 0 ETH | 0.00813876 | ||||
Multi Exchange S... | 10942271 | 1437 days ago | IN | 0 ETH | 0.01777936 | ||||
Multi Exchange S... | 10942250 | 1437 days ago | IN | 0 ETH | 0.0226736 | ||||
Multi Exchange S... | 10942172 | 1437 days ago | IN | 0 ETH | 0.02260222 | ||||
Multi Exchange S... | 10942152 | 1437 days ago | IN | 0 ETH | 0.02384722 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10943607 | 1436 days ago | 0.28342462 ETH | ||||
10943607 | 1436 days ago | 0.28342462 ETH | ||||
10943161 | 1437 days ago | 1.4 ETH | ||||
10942750 | 1437 days ago | 5.5 ETH | ||||
10942503 | 1437 days ago | 13.67344744 ETH | ||||
10942503 | 1437 days ago | 13.67344744 ETH | ||||
10942414 | 1437 days ago | 0.1 ETH | ||||
10942407 | 1437 days ago | 0.1 ETH | ||||
10942379 | 1437 days ago | 1.0280924 ETH | ||||
10942379 | 1437 days ago | 1.0280924 ETH | ||||
10942140 | 1437 days ago | 0.25245641 ETH | ||||
10942140 | 1437 days ago | 0.25245641 ETH | ||||
10941851 | 1437 days ago | 0.07 ETH | ||||
10941671 | 1437 days ago | 2.2 ETH | ||||
10941629 | 1437 days ago | 1.89 ETH | ||||
10941526 | 1437 days ago | 1 ETH | ||||
10941501 | 1437 days ago | 0.02826087 ETH | ||||
10941501 | 1437 days ago | 0.02826087 ETH | ||||
10941454 | 1437 days ago | 2.5 ETH | ||||
10941174 | 1437 days ago | 0.1599421 ETH | ||||
10941174 | 1437 days ago | 0.1599421 ETH | ||||
10941120 | 1437 days ago | 0.00000048 ETH | ||||
10941120 | 1437 days ago | 0.00000048 ETH | ||||
10941118 | 1437 days ago | 2.77602229 ETH | ||||
10941118 | 1437 days ago | 2.77602229 ETH |
Loading...
Loading
Contract Name:
Zapper_Swap_General_V1_1
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-16 */ // ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗ // ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║ // ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║ // ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║ // ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║ // ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝ // Copyright (C) 2020 zapper, nodar, suhail, seb, sumit, apoorv // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // ///@author Zapper ///@notice this contract swaps between two assets utilizing various liquidity pools. // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require( success, "Address: unable to send value, recipient may have reverted" ); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.5.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]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor() internal { // Storing an initial 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 percetange 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. _notEntered = true; } /** * @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(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } interface IBFactory { function isBPool(address b) external view returns (bool); } interface IBpool { function isPublicSwap() external view returns (bool); function isBound(address t) external view returns (bool); function swapExactAmountIn( address tokenIn, uint256 tokenAmountIn, address tokenOut, uint256 minAmountOut, uint256 maxPrice ) external returns (uint256 tokenAmountOut, uint256 spotPriceAfter); function swapExactAmountOut( address tokenIn, uint256 maxAmountIn, address tokenOut, uint256 tokenAmountOut, uint256 maxPrice ) external returns (uint256 tokenAmountIn, uint256 spotPriceAfter); function getSpotPrice(address tokenIn, address tokenOut) external view returns (uint256 spotPrice); } interface IUniswapRouter02 { //get estimated amountOut function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); //token 2 token function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); //eth 2 token function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); //token 2 eth function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } interface ICurve { function underlying_coins(int128 index) external view returns (address); function coins(int128 index) external view returns (address); function get_dy_underlying( int128 i, int128 j, uint256 dx ) external view returns (uint256 dy); function exchange_underlying( int128 i, int128 j, uint256 dx, uint256 minDy ) external; function exchange( int128 i, int128 j, uint256 dx, uint256 minDy ) external; } interface IWETH { function deposit() external payable; function withdraw(uint256 amount) external; } interface ICompound { function markets(address cToken) external view returns (bool isListed, uint256 collateralFactorMantissa); function underlying() external returns (address); } interface ICompoundToken { function underlying() external view returns (address); function exchangeRateStored() external view returns (uint256); function mint(uint256 mintAmount) external returns (uint256); function redeem(uint256 redeemTokens) external returns (uint256); } interface ICompoundEther { function mint() external payable; function redeem(uint256 redeemTokens) external returns (uint256); } interface IIearn { function token() external view returns (address); function calcPoolValueInToken() external view returns (uint256); function deposit(uint256 _amount) external; function withdraw(uint256 _shares) external; } interface IAToken { function redeem(uint256 _amount) external; function underlyingAssetAddress() external returns (address); } interface IAaveLendingPoolAddressesProvider { function getLendingPool() external view returns (address); function getLendingPoolCore() external view returns (address payable); } interface IAaveLendingPool { function deposit( address _reserve, uint256 _amount, uint16 _referralCode ) external payable; } contract Zapper_Swap_General_V1_1 is ReentrancyGuard, Ownable { using SafeMath for uint256; using Address for address; using SafeERC20 for IERC20; IUniswapRouter02 private constant uniswapRouter = IUniswapRouter02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); IAaveLendingPoolAddressesProvider private constant lendingPoolAddressProvider = IAaveLendingPoolAddressesProvider( 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8 ); IBFactory private constant BalancerFactory = IBFactory( 0x9424B1412450D0f8Fc2255FAf6046b98213B76Bd ); address private constant renBTCCurveSwapContract = address( 0x93054188d876f558f4a66B2EF1d97d16eDf0895B ); address private constant sBTCCurveSwapContract = address( 0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714 ); IWETH private constant wethContract = IWETH( 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 ); address private constant ETHAddress = address( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); uint256 private constant deadline = 0xf000000000000000000000000000000000000000000000000000000000000000; mapping(address => address) public cToken; mapping(address => address) public yToken; mapping(address => address) public aToken; constructor() public { //mapping for cETH cToken[address( 0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5 )] = ETHAddress; } /** @notice This function adds c token addresses to a mapping @dev For cETH token, mapping is already added in constructor @param _cToken token address of c-token for given underlying asset */ function addCToken(address[] memory _cToken) public onlyOwner { for (uint256 i = 0; i < _cToken.length; i++) { cToken[_cToken[i]] = ICompound(_cToken[i]).underlying(); } } /** @notice This function adds y token addresses to a mapping @param _yToken token address of y-token */ function addYToken(address[] memory _yToken) public onlyOwner { for (uint256 i = 0; i < _yToken.length; i++) { yToken[_yToken[i]] = IIearn(_yToken[i]).token(); } } /** @notice This function adds a token addresses to a mapping @param _aToken token address of a-token for given underlying asset */ function addAToken(address[] memory _aToken) public onlyOwner { for (uint256 i = 0; i < _aToken.length; i++) { aToken[_aToken[i]] = IAToken(_aToken[i]).underlyingAssetAddress(); } } /** @notice This function is used swap tokens using multiple exchanges @param toWhomToIssue address to which tokens should be sent after swap @param path token addresses indicating the conversion path @param amountIn amount of tokens to swap @param minTokenOut min amount of expected tokens @param withPool indicates the exchange and its sequence we want to swap from @param poolData pool or token addresses needed for swapping tokens according to the exchange @param starts indicates the index of poolData array for each swap @return amount of tokens received after swap */ function MultiExchangeSwap( address payable toWhomToIssue, address[] calldata path, uint256 amountIn, uint256 minTokenOut, uint8[] calldata starts, uint8[] calldata withPool, address[] calldata poolData ) external payable nonReentrant returns (uint256 tokensBought) { require(toWhomToIssue != address(0), "Invalid receiver address"); require(path[0] != path[path.length - 1], "Cannot swap same tokens"); tokensBought = _swap( path, _getTokens(path[0], amountIn), starts, withPool, poolData ); require(tokensBought >= minTokenOut, "High Slippage"); _sendTokens(toWhomToIssue, path[path.length - 1], tokensBought); } //swap function function _swap( address[] memory path, uint256 tokensToSwap, uint8[] memory starts, uint8[] memory withPool, address[] memory poolData ) internal returns (uint256) { address _to; uint8 poolIndex = 0; address[] memory _poolData; address _from = path[starts[0]]; for (uint256 index = 0; index < withPool.length; index++) { uint256 endIndex = index == withPool.length.sub(1) ? path.length - 1 : starts[index + 1]; _to = path[endIndex]; { if (withPool[index] == 2) { _poolData = _getPath(path, starts[index], endIndex + 1); } else { _poolData = new address[](1); _poolData[0] = poolData[poolIndex++]; } } tokensToSwap = _swapFromPool( _from, _to, tokensToSwap, withPool[index], _poolData ); _from = _to; } return tokensToSwap; } /** @notice This function is used swap tokens using multiple exchanges @param fromToken token addresses to swap from @param toToken token addresses to swap into @param amountIn amount of tokens to swap @param withPool indicates the exchange we want to swap from @param poolData pool or token addresses needed for swapping tokens according to the exchange @return amount of tokens received after swap */ function _swapFromPool( address fromToken, address toToken, uint256 amountIn, uint256 withPool, address[] memory poolData ) internal returns (uint256) { require(fromToken != toToken, "Cannot swap same tokens"); require(withPool <= 3, "Invalid Exchange"); if (withPool == 1) { return _swapWithBalancer(poolData[0], fromToken, toToken, amountIn, 1); } else if (withPool == 2) { return _swapWithUniswapV2(fromToken, toToken, poolData, amountIn, 1); } else if (withPool == 3) { return _swapWithCurve(poolData[0], fromToken, toToken, amountIn, 1); } } /** @notice This function returns part of the given array @param addresses address array to copy from @param _start start index @param _end end index @return addressArray copied from given array */ function _getPath( address[] memory addresses, uint256 _start, uint256 _end ) internal pure returns (address[] memory addressArray) { uint256 len = _end.sub(_start); require(len > 1, "ERR_UNIV2_PATH"); addressArray = new address[](len); for (uint256 i = 0; i < len; i++) { if ( addresses[_start + i] == address(0) || addresses[_start + i] == ETHAddress ) { addressArray[i] = address(wethContract); } else { addressArray[i] = addresses[_start + i]; } } } function _sendTokens( address payable toWhomToIssue, address token, uint256 amount ) internal { if (token == ETHAddress || token == address(0)) { toWhomToIssue.transfer(amount); } else { IERC20(token).safeTransfer(toWhomToIssue, amount); } } function _swapWithBalancer( address bpoolAddress, address fromToken, address toToken, uint256 amountIn, uint256 minTokenOut ) internal returns (uint256 tokenBought) { require(BalancerFactory.isBPool(bpoolAddress), "Invalid balancer pool"); IBpool bpool = IBpool(bpoolAddress); require(bpool.isPublicSwap(), "Swap not allowed for this pool"); address _to = toToken; if (fromToken == address(0)) { wethContract.deposit.value(amountIn)(); fromToken = address(wethContract); } else if (toToken == address(0)) { _to = address(wethContract); } require(bpool.isBound(fromToken), "From Token not bound"); require(bpool.isBound(_to), "To Token not bound"); //approve it to exchange address IERC20(fromToken).safeApprove(bpoolAddress, amountIn); //swap tokens (tokenBought, ) = bpool.swapExactAmountIn( fromToken, amountIn, _to, minTokenOut, uint256(-1) ); if (toToken == address(0)) { wethContract.withdraw(tokenBought); } } function _swapWithUniswapV2( address fromToken, address toToken, address[] memory path, uint256 amountIn, uint256 minTokenOut ) internal returns (uint256 tokenBought) { //unwrap & approve it to router contract uint256 tokensUnwrapped = amountIn; address _fromToken = fromToken; if (fromToken != address(0)) { (tokensUnwrapped, _fromToken) = _unwrap(fromToken, amountIn); IERC20(_fromToken).safeApprove( address(uniswapRouter), tokensUnwrapped ); } //swap and transfer tokens if (fromToken == address(0)) { tokenBought = uniswapRouter.swapExactETHForTokens.value( tokensUnwrapped )(minTokenOut, path, address(this), deadline)[path.length - 1]; } else if (toToken == address(0)) { tokenBought = uniswapRouter.swapExactTokensForETH( tokensUnwrapped, minTokenOut, path, address(this), deadline )[path.length - 1]; } else { tokenBought = uniswapRouter.swapExactTokensForTokens( tokensUnwrapped, minTokenOut, path, address(this), deadline )[path.length - 1]; } } function _swapWithCurve( address curveExchangeAddress, address fromToken, address toToken, uint256 amountIn, uint256 minTokenOut ) internal returns (uint256 tokenBought) { require( curveExchangeAddress != address(0), "ERR_Invaid_curve_exchange" ); ICurve curveExchange = ICurve(curveExchangeAddress); (uint256 tokensUnwrapped, address _fromToken) = _unwrap( fromToken, amountIn ); //approve it to exchange address IERC20(_fromToken).safeApprove(curveExchangeAddress, tokensUnwrapped); int128 i; int128 j; //swap tokens if ( curveExchangeAddress == renBTCCurveSwapContract || curveExchangeAddress == sBTCCurveSwapContract ) { int128 length = (curveExchangeAddress == renBTCCurveSwapContract) ? 2 : 3; for (int128 index = 0; index < length; index++) { if (curveExchange.coins(index) == _fromToken) { i = index; } else if (curveExchange.coins(index) == toToken) { j = index; } } curveExchange.exchange(i, j, tokensUnwrapped, minTokenOut); } else { address compCurveSwapContract = address( 0xA2B47E3D5c44877cca798226B7B8118F9BFb7A56 ); address usdtCurveSwapContract = address( 0x52EA46506B9CC5Ef470C5bf89f17Dc28bB35D85C ); int128 length = 4; if (curveExchangeAddress == compCurveSwapContract) { length = 2; } else if (curveExchangeAddress == usdtCurveSwapContract) { length = 3; } for (int128 index = 0; index < length; index++) { if (curveExchange.underlying_coins(index) == _fromToken) { i = index; } else if (curveExchange.underlying_coins(index) == toToken) { j = index; } } curveExchange.exchange_underlying( i, j, tokensUnwrapped, minTokenOut ); } if (toToken == ETHAddress || toToken == address(0)) { tokenBought = address(this).balance; } else { tokenBought = IERC20(toToken).balanceOf(address(this)); } } function unwrap( address payable _toWhomToIssue, address _FromTokenContractAddress, uint256 tokens2Trade, uint256 minTokens ) public returns (uint256 tokensUnwrapped, address toToken) { require(_toWhomToIssue != address(0), "Invalid receiver address"); uint256 tokensToSwap = _getTokens( _FromTokenContractAddress, tokens2Trade ); (tokensUnwrapped, toToken) = _unwrap( _FromTokenContractAddress, tokensToSwap ); require(tokensUnwrapped >= minTokens, "High Slippage"); //transfer _sendTokens(_toWhomToIssue, toToken, tokensUnwrapped); } function _unwrap(address _FromTokenContractAddress, uint256 tokens2Trade) internal returns (uint256 tokensUnwrapped, address toToken) { uint256 initialEthbalance = address(this).balance; if (cToken[_FromTokenContractAddress] != address(0)) { require( ICompoundToken(_FromTokenContractAddress).redeem( tokens2Trade ) == 0, "Error in unwrapping" ); toToken = cToken[_FromTokenContractAddress]; if (toToken == ETHAddress) { tokensUnwrapped = address(this).balance; tokensUnwrapped = tokensUnwrapped.sub(initialEthbalance); } else { tokensUnwrapped = IERC20(toToken).balanceOf(address(this)); } } else if (yToken[_FromTokenContractAddress] != address(0)) { IIearn(_FromTokenContractAddress).withdraw(tokens2Trade); toToken = IIearn(_FromTokenContractAddress).token(); tokensUnwrapped = IERC20(toToken).balanceOf(address(this)); } else if (aToken[_FromTokenContractAddress] != address(0)) { IAToken(_FromTokenContractAddress).redeem(tokens2Trade); toToken = IAToken(_FromTokenContractAddress) .underlyingAssetAddress(); if (toToken == ETHAddress) { tokensUnwrapped = address(this).balance; tokensUnwrapped = tokensUnwrapped.sub(initialEthbalance); } else { tokensUnwrapped = IERC20(toToken).balanceOf(address(this)); } } else { toToken = _FromTokenContractAddress; tokensUnwrapped = tokens2Trade; } } function wrap( address payable _toWhomToIssue, address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade, uint256 minTokens, uint256 _wrapInto ) public payable returns (uint256 tokensWrapped) { require(_toWhomToIssue != address(0), "Invalid receiver address"); require(_wrapInto <= 3, "Invalid to Token"); uint256 tokensToSwap = _getTokens( _FromTokenContractAddress, tokens2Trade ); tokensWrapped = _wrap( _FromTokenContractAddress, _ToTokenContractAddress, tokensToSwap, _wrapInto ); require(tokensWrapped >= minTokens, "High Slippage"); //transfer tokens _sendTokens(_toWhomToIssue, _ToTokenContractAddress, tokensWrapped); } function _wrap( address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade, uint256 _wrapInto ) internal returns (uint256 tokensWrapped) { //weth if (_wrapInto == 0) { require( _FromTokenContractAddress == address(0), "Cannot wrap into WETH" ); require( _ToTokenContractAddress == address(wethContract), "Invalid toToken" ); wethContract.deposit.value(tokens2Trade)(); return tokens2Trade; } else if (_wrapInto == 1) { //Compound if (_FromTokenContractAddress == address(0)) { ICompoundEther(_ToTokenContractAddress).mint.value( tokens2Trade )(); } else { IERC20(_FromTokenContractAddress).safeApprove( address(_ToTokenContractAddress), tokens2Trade ); ICompoundToken(_ToTokenContractAddress).mint(tokens2Trade); } } else if (_wrapInto == 2) { //IEarn IERC20(_FromTokenContractAddress).safeApprove( address(_ToTokenContractAddress), tokens2Trade ); IIearn(_ToTokenContractAddress).deposit(tokens2Trade); } else { // Aave if (_FromTokenContractAddress == address(0)) { IAaveLendingPool(lendingPoolAddressProvider.getLendingPool()) .deposit .value(tokens2Trade)(ETHAddress, tokens2Trade, 0); } else { //approve lending pool core IERC20(_FromTokenContractAddress).safeApprove( address(lendingPoolAddressProvider.getLendingPoolCore()), tokens2Trade ); //get lending pool and call deposit IAaveLendingPool(lendingPoolAddressProvider.getLendingPool()) .deposit(_FromTokenContractAddress, tokens2Trade, 0); } } tokensWrapped = IERC20(_ToTokenContractAddress).balanceOf( address(this) ); } function _getTokens(address token, uint256 amount) internal returns (uint256) { if (token == address(0)) { require(msg.value > 0, "No eth sent"); return msg.value; } require(amount > 0, "Invalid token amount"); require(msg.value == 0, "Eth sent with token"); //transfer token IERC20(token).safeTransferFrom(msg.sender, address(this), amount); return amount; } function() external payable { require(msg.sender != tx.origin, "Do not send ETH directly"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address payable","name":"toWhomToIssue","type":"address"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minTokenOut","type":"uint256"},{"internalType":"uint8[]","name":"starts","type":"uint8[]"},{"internalType":"uint8[]","name":"withPool","type":"uint8[]"},{"internalType":"address[]","name":"poolData","type":"address[]"}],"name":"MultiExchangeSwap","outputs":[{"internalType":"uint256","name":"tokensBought","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"aToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_aToken","type":"address[]"}],"name":"addAToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_cToken","type":"address[]"}],"name":"addCToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_yToken","type":"address[]"}],"name":"addYToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokens2Trade","type":"uint256"},{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"tokensUnwrapped","type":"uint256"},{"internalType":"address","name":"toToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_ToTokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokens2Trade","type":"uint256"},{"internalType":"uint256","name":"minTokens","type":"uint256"},{"internalType":"uint256","name":"_wrapInto","type":"uint256"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"tokensWrapped","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"yToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506000805460ff19166001178155620000326001600160e01b03620000ec16565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350734ddc2d193948926d02f9b1fe9e1daa0718270ed560005260016020527f6c8ad9409b802c0693dd52ba88ebdde11e203fa82eb1565344f45c462809262d80546001600160a01b03191673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee179055620000f0565b3390565b6135a680620001006000396000f3fe6080604052600436106100c25760003560e01c80638da5cb5b1161007f578063ace8a50911610059578063ace8a509146104da578063dcf48ca914610588578063e689eb97146105bb578063f2fde38b14610669576100c2565b80638da5cb5b146103225780638f32d59b146103375780639e4b38c014610360576100c2565b8063108d79fb1461011957806317ba3a31146101685780632b0417e8146101d25780633615fe4e1461022c578063661f799d1461025f578063715018a61461030d575b33321415610117576040805162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c790000000000000000604482015290519081900360640190fd5b005b34801561012557600080fd5b5061014c6004803603602081101561013c57600080fd5b50356001600160a01b031661069c565b604080516001600160a01b039092168252519081900360200190f35b34801561017457600080fd5b506101b16004803603608081101561018b57600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356106b7565b604080519283526001600160a01b0390911660208301528051918290030190f35b61021a600480360360c08110156101e857600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135610787565b60408051918252519081900360200190f35b34801561023857600080fd5b5061014c6004803603602081101561024f57600080fd5b50356001600160a01b031661089f565b34801561026b57600080fd5b506101176004803603602081101561028257600080fd5b810190602081018135600160201b81111561029c57600080fd5b8201836020820111156102ae57600080fd5b803590602001918460208302840111600160201b831117156102cf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506108ba945050505050565b34801561031957600080fd5b506101176109e3565b34801561032e57600080fd5b5061014c610a79565b34801561034357600080fd5b5061034c610a8d565b604080519115158252519081900360200190f35b61021a600480360360e081101561037657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103a057600080fd5b8201836020820111156103b257600080fd5b803590602001918460208302840111600160201b831117156103d357600080fd5b919390928235926020810135929190606081019060400135600160201b8111156103fc57600080fd5b82018360208201111561040e57600080fd5b803590602001918460208302840111600160201b8311171561042f57600080fd5b919390929091602081019035600160201b81111561044c57600080fd5b82018360208201111561045e57600080fd5b803590602001918460208302840111600160201b8311171561047f57600080fd5b919390929091602081019035600160201b81111561049c57600080fd5b8201836020820111156104ae57600080fd5b803590602001918460208302840111600160201b831117156104cf57600080fd5b509092509050610ab6565b3480156104e657600080fd5b50610117600480360360208110156104fd57600080fd5b810190602081018135600160201b81111561051757600080fd5b82018360208201111561052957600080fd5b803590602001918460208302840111600160201b8311171561054a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610d9d945050505050565b34801561059457600080fd5b5061014c600480360360208110156105ab57600080fd5b50356001600160a01b0316610ec2565b3480156105c757600080fd5b50610117600480360360208110156105de57600080fd5b810190602081018135600160201b8111156105f857600080fd5b82018360208201111561060a57600080fd5b803590602001918460208302840111600160201b8311171561062b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610edd945050505050565b34801561067557600080fd5b506101176004803603602081101561068c57600080fd5b50356001600160a01b0316611000565b6001602052600090815260409020546001600160a01b031681565b6000806001600160a01b038616610710576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b600061071c8686611053565b90506107288682611166565b909350915083831015610772576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b61077d87838561156e565b5094509492505050565b60006001600160a01b0387166107df576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b6003821115610828576040805162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103a37902a37b5b2b760811b604482015290519081900360640190fd5b60006108348786611053565b905061084287878386611600565b915083821015610889576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b61089488878461156e565b509695505050505050565b6003602052600090815260409020546001600160a01b031681565b6108c2610a8d565b610901576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b60005b81518110156109df5781818151811061091957fe5b60200260200101516001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561095b57600080fd5b505af115801561096f573d6000803e3d6000fd5b505050506040513d602081101561098557600080fd5b5051825160039060009085908590811061099b57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610904565b5050565b6109eb610a8d565b610a2a576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610aa7611bbe565b6001600160a01b031614905090565b6000805460ff16610b0e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690556001600160a01b038c16610b6e576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b8a8a6000198101818110610b7e57fe5b905060200201356001600160a01b03166001600160a01b03168b8b6000818110610ba457fe5b905060200201356001600160a01b03166001600160a01b03161415610c0a576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b610d108b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610c758d8d6000818110610c5f57fe5b905060200201356001600160a01b03168c611053565b89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a918291850190849080828437600092019190915250611bc292505050565b905087811015610d57576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b610d818c8c8c6000198101818110610d6b57fe5b905060200201356001600160a01b03168361156e565b6000805460ff191660011790559b9a5050505050505050505050565b610da5610a8d565b610de4576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b60005b81518110156109df57818181518110610dfc57fe5b60200260200101516001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b505050506040513d6020811015610e6857600080fd5b50518251600190600090859085908110610e7e57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610de7565b6002602052600090815260409020546001600160a01b031681565b610ee5610a8d565b610f24576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b60005b81518110156109df57818181518110610f3c57fe5b60200260200101516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7c57600080fd5b505afa158015610f90573d6000803e3d6000fd5b505050506040513d6020811015610fa657600080fd5b50518251600290600090859085908110610fbc57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610f27565b611008610a8d565b611047576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b61105081611d5b565b50565b60006001600160a01b0383166110ad57600034116110a6576040805162461bcd60e51b815260206004820152600b60248201526a139bc8195d1a081cd95b9d60aa1b604482015290519081900360640190fd5b5034611160565b600082116110f9576040805162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604482015290519081900360640190fd5b3415611142576040805162461bcd60e51b815260206004820152601360248201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604482015290519081900360640190fd5b61115d6001600160a01b03841633308563ffffffff611e0616565b50805b92915050565b6001600160a01b03828116600090815260016020526040812054909182914791161561131357846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b505050506040513d60208110156111fc57600080fd5b505115611246576040805162461bcd60e51b81526020600482015260136024820152724572726f7220696e20756e7772617070696e6760681b604482015290519081900360640190fd5b6001600160a01b0380861660009081526001602052604090205416915073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82141561129957479250611292838263ffffffff611e6616565b925061130e565b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156112df57600080fd5b505afa1580156112f3573d6000803e3d6000fd5b505050506040513d602081101561130957600080fd5b505192505b611566565b6001600160a01b03858116600090815260026020526040902054161561144057846001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561137957600080fd5b505af115801561138d573d6000803e3d6000fd5b50505050846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ca57600080fd5b505afa1580156113de573d6000803e3d6000fd5b505050506040513d60208110156113f457600080fd5b5051604080516370a0823160e01b815230600482015290519193506001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156112df57600080fd5b6001600160a01b03858116600090815260036020526040902054161561155f57846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114a657600080fd5b505af11580156114ba573d6000803e3d6000fd5b50505050846001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114f957600080fd5b505af115801561150d573d6000803e3d6000fd5b505050506040513d602081101561152357600080fd5b505191506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561129957479250611292838263ffffffff611e6616565b8491508392505b509250929050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14806115a057506001600160a01b038216155b156115e1576040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156115db573d6000803e3d6000fd5b506115fb565b6115fb6001600160a01b038316848363ffffffff611eaf16565b505050565b60008161172e576001600160a01b0385161561165b576040805162461bcd60e51b8152602060048201526015602482015274086c2dcdcdee840eee4c2e040d2dce8de40ae8aa89605b1b604482015290519081900360640190fd5b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146116be576040805162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103a37aa37b5b2b760891b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b5050505050829050611bb6565b8160011415611830576001600160a01b03851661179e57836001600160a01b0316631249c58b846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561178057600080fd5b505af1158015611794573d6000803e3d6000fd5b505050505061182b565b6117b86001600160a01b038616858563ffffffff611f0116565b836001600160a01b031663a0712d68846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b505050506040513d602081101561182857600080fd5b50505b611b41565b81600214156118b6576118536001600160a01b038616858563ffffffff611f0116565b836001600160a01b031663b6b55f25846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b50505050611b41565b6001600160a01b0385166119c5577324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561191157600080fd5b505afa158015611925573d6000803e3d6000fd5b505050506040513d602081101561193b57600080fd5b505160408051636968703360e11b815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60048201526024810186905260006044820181905291516001600160a01b039093169263d2d0e0669287926064808201939182900301818588803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b5050505050611b41565b611a587324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1557600080fd5b505afa158015611a29573d6000803e3d6000fd5b505050506040513d6020811015611a3f57600080fd5b50516001600160a01b038716908563ffffffff611f0116565b7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611aa557600080fd5b505afa158015611ab9573d6000803e3d6000fd5b505050506040513d6020811015611acf57600080fd5b505160408051636968703360e11b81526001600160a01b03888116600483015260248201879052600060448301819052925193169263d2d0e0669260648084019391929182900301818387803b158015611b2857600080fd5b505af1158015611b3c573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611b8757600080fd5b505afa158015611b9b573d6000803e3d6000fd5b505050506040513d6020811015611bb157600080fd5b505190505b949350505050565b3390565b6000806000809050606060008988600081518110611bdc57fe5b602002602001015160ff1681518110611bf157fe5b6020026020010151905060008090505b8751811015611d49578751600090611c2090600163ffffffff611e6616565b8214611c4557898260010181518110611c3557fe5b602002602001015160ff16611c4b565b60018c51035b90508b8181518110611c5957fe5b60200260200101519550888281518110611c6f57fe5b602002602001015160ff1660021415611cad57611ca68c8b8481518110611c9257fe5b602002602001015160ff1683600101612014565b9350611d18565b6040805160018082528183019092529060208083019080388339019050509350878580600101965060ff1681518110611ce257fe5b602002602001015184600081518110611cf757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b611d3b83878d8c8681518110611d2a57fe5b602002602001015160ff16886121b7565b9a5085925050600101611c01565b50889450505050505b95945050505050565b6001600160a01b038116611da05760405162461bcd60e51b81526004018080602001828103825260268152602001806134cc6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611e609085906122d7565b50505050565b6000611ea883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061248f565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115fb9084906122d7565b801580611f87575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611f5957600080fd5b505afa158015611f6d573d6000803e3d6000fd5b505050506040513d6020811015611f8357600080fd5b5051155b611fc25760405162461bcd60e51b815260040180806020018281038252603681526020018061353c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526115fb9084906122d7565b60606000612028838563ffffffff611e6616565b905060018111612070576040805162461bcd60e51b815260206004820152600e60248201526d08aa4a4beaa9c92ac64bea082a8960931b604482015290519081900360640190fd5b8060405190808252806020026020018201604052801561209a578160200160208202803883390190505b50915060005b818110156121ae5760006001600160a01b031686828701815181106120c157fe5b60200260200101516001600160a01b03161480612118575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316868287018151811061210557fe5b60200260200101516001600160a01b0316145b156121635773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc283828151811061213e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506121a6565b858186018151811061217157fe5b602002602001015183828151811061218557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016120a0565b50509392505050565b6000846001600160a01b0316866001600160a01b0316141561221a576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b6003831115612263576040805162461bcd60e51b815260206004820152601060248201526f496e76616c69642045786368616e676560801b604482015290519081900360640190fd5b82600114156122955761228e8260008151811061227c57fe5b60200260200101518787876001612526565b9050611d52565b82600214156122ac5761228e868684876001612a37565b8260031415611d525761228e826000815181106122c557fe5b60200260200101518787876001612ed3565b6122e9826001600160a01b0316613492565b61233a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106123785780518252601f199092019160209182019101612359565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123da576040519150601f19603f3d011682016040523d82523d6000602084013e6123df565b606091505b509150915081612436576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611e605780806020019051602081101561245257600080fd5b5051611e605760405162461bcd60e51b815260040180806020018281038252602a815260200180613512602a913960400191505060405180910390fd5b6000818484111561251e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124e35781810151838201526020016124cb565b50505050905090810190601f1680156125105780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805163615db6e160e11b81526001600160a01b03871660048201529051600091739424b1412450d0f8fc2255faf6046b98213b76bd9163c2bb6dc291602480820192602092909190829003018186803b15801561258457600080fd5b505afa158015612598573d6000803e3d6000fd5b505050506040513d60208110156125ae57600080fd5b50516125f9576040805162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590818985b185b98d95c881c1bdbdb605a1b604482015290519081900360640190fd5b6000869050806001600160a01b031663fde924f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561263757600080fd5b505afa15801561264b573d6000803e3d6000fd5b505050506040513d602081101561266157600080fd5b50516126b4576040805162461bcd60e51b815260206004820152601e60248201527f53776170206e6f7420616c6c6f77656420666f72207468697320706f6f6c0000604482015290519081900360640190fd5b846001600160a01b0387166127475773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2965061276c565b6001600160a01b03861661276c575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b816001600160a01b0316632f37b624886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156127c257600080fd5b505afa1580156127d6573d6000803e3d6000fd5b505050506040513d60208110156127ec57600080fd5b5051612836576040805162461bcd60e51b8152602060048201526014602482015273119c9bdb48151bdad95b881b9bdd08189bdd5b9960621b604482015290519081900360640190fd5b816001600160a01b0316632f37b624826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561288c57600080fd5b505afa1580156128a0573d6000803e3d6000fd5b505050506040513d60208110156128b657600080fd5b50516128fe576040805162461bcd60e51b8152602060048201526012602482015271151bc8151bdad95b881b9bdd08189bdd5b9960721b604482015290519081900360640190fd5b6129186001600160a01b038816898763ffffffff611f0116565b60408051638201aa3f60e01b81526001600160a01b038981166004830152602482018890528381166044830152606482018790526000196084830152825190851692638201aa3f9260a480820193918290030181600087803b15801561297d57600080fd5b505af1158015612991573d6000803e3d6000fd5b505050506040513d60408110156129a757600080fd5b505192506001600160a01b038616612a2c5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612a1357600080fd5b505af1158015612a27573d6000803e3d6000fd5b505050505b505095945050505050565b600082866001600160a01b03811615612a8757612a548886611166565b9092509050612a876001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d8463ffffffff611f0116565b6001600160a01b038816612c2b57604051637ff36ab560e01b8152600481018581523060448301819052600f60fc1b606484018190526080602485019081528a5160848601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d95637ff36ab59589958c958f959194909360a401906020808801910280838360005b83811015612b1e578181015183820152602001612b06565b50505050905001955050505050506000604051808303818588803b158015612b4557600080fd5b505af1158015612b59573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526020811015612b8357600080fd5b8101908080516040519392919084600160201b821115612ba257600080fd5b908301906020820185811115612bb757600080fd5b82518660208202830111600160201b82111715612bd357600080fd5b82525081516020918201928201910280838360005b83811015612c00578181015183820152602001612be8565b50505050905001604052505050600187510381518110612c1c57fe5b60200260200101519250612a2c565b6001600160a01b038716612d2f576040516318cbafe560e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956318cbafe59589958c958f959194909360c401906020808801910280838360005b83811015612cc9578181015183820152602001612cb1565b505050509050019650505050505050600060405180830381600087803b158015612cf257600080fd5b505af1158015612d06573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612b8357600080fd5b6040516338ed173960e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956338ed17399589958c958f959194909360c401906020808801910280838360005b83811015612dbf578181015183820152602001612da7565b505050509050019650505050505050600060405180830381600087803b158015612de857600080fd5b505af1158015612dfc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612e2557600080fd5b8101908080516040519392919084600160201b821115612e4457600080fd5b908301906020820185811115612e5957600080fd5b82518660208202830111600160201b82111715612e7557600080fd5b82525081516020918201928201910280838360005b83811015612ea2578181015183820152602001612e8a565b50505050905001604052505050600187510381518110612ebe57fe5b60200260200101519250505095945050505050565b60006001600160a01b038616612f30576040805162461bcd60e51b815260206004820152601960248201527f4552525f496e766169645f63757276655f65786368616e676500000000000000604482015290519081900360640190fd5b85600080612f3e8887611166565b9092509050612f5d6001600160a01b0382168a8463ffffffff611f0116565b6000806001600160a01b038b167393054188d876f558f4a66b2ef1d97d16edf0895b1480612fa757506001600160a01b038b16737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156131a85760006001600160a01b038c167393054188d876f558f4a66b2ef1d97d16edf0895b14612fd9576003612fdc565b60025b60ff16905060005b81600f0b81600f0b121561312457846001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561304657600080fd5b505afa15801561305a573d6000803e3d6000fd5b505050506040513d602081101561307057600080fd5b50516001600160a01b031614156130895780935061311c565b8a6001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b1580156130dd57600080fd5b505afa1580156130f1573d6000803e3d6000fd5b505050506040513d602081101561310757600080fd5b50516001600160a01b0316141561311c578092505b600101612fe4565b5060408051630f7c084960e21b8152600f85810b810b600483015284810b900b602482015260448101879052606481018a905290516001600160a01b03881691633df0212491608480830192600092919082900301818387803b15801561318a57600080fd5b505af115801561319e573d6000803e3d6000fd5b50505050506133d0565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a567352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60046001600160a01b038e168314156131ed5750600261320b565b816001600160a01b03168e6001600160a01b0316141561320b575060035b60005b81600f0b81600f0b121561334e57866001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561327057600080fd5b505afa158015613284573d6000803e3d6000fd5b505050506040513d602081101561329a57600080fd5b50516001600160a01b031614156132b357809550613346565b8c6001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561330757600080fd5b505afa15801561331b573d6000803e3d6000fd5b505050506040513d602081101561333157600080fd5b50516001600160a01b03161415613346578094505b60010161320e565b5060408051635320bf6b60e11b8152600f87810b810b600483015286810b900b602482015260448101899052606481018c905290516001600160a01b038a169163a6417ed691608480830192600092919082900301818387803b1580156133b457600080fd5b505af11580156133c8573d6000803e3d6000fd5b505050505050505b6001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148061340257506001600160a01b038916155b1561340f57479550613484565b604080516370a0823160e01b815230600482015290516001600160a01b038b16916370a08231916024808301926020929190829003018186803b15801561345557600080fd5b505afa158015613469573d6000803e3d6000fd5b505050506040513d602081101561347f57600080fd5b505195505b505050505095945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611bb657505015159291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820fb175b11bd53853bf95e36ec0f13ff5b2f9d1d7c63904a9ce9b3514460b7a66864736f6c63430005110032
Deployed Bytecode
0x6080604052600436106100c25760003560e01c80638da5cb5b1161007f578063ace8a50911610059578063ace8a509146104da578063dcf48ca914610588578063e689eb97146105bb578063f2fde38b14610669576100c2565b80638da5cb5b146103225780638f32d59b146103375780639e4b38c014610360576100c2565b8063108d79fb1461011957806317ba3a31146101685780632b0417e8146101d25780633615fe4e1461022c578063661f799d1461025f578063715018a61461030d575b33321415610117576040805162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c790000000000000000604482015290519081900360640190fd5b005b34801561012557600080fd5b5061014c6004803603602081101561013c57600080fd5b50356001600160a01b031661069c565b604080516001600160a01b039092168252519081900360200190f35b34801561017457600080fd5b506101b16004803603608081101561018b57600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356106b7565b604080519283526001600160a01b0390911660208301528051918290030190f35b61021a600480360360c08110156101e857600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135610787565b60408051918252519081900360200190f35b34801561023857600080fd5b5061014c6004803603602081101561024f57600080fd5b50356001600160a01b031661089f565b34801561026b57600080fd5b506101176004803603602081101561028257600080fd5b810190602081018135600160201b81111561029c57600080fd5b8201836020820111156102ae57600080fd5b803590602001918460208302840111600160201b831117156102cf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506108ba945050505050565b34801561031957600080fd5b506101176109e3565b34801561032e57600080fd5b5061014c610a79565b34801561034357600080fd5b5061034c610a8d565b604080519115158252519081900360200190f35b61021a600480360360e081101561037657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103a057600080fd5b8201836020820111156103b257600080fd5b803590602001918460208302840111600160201b831117156103d357600080fd5b919390928235926020810135929190606081019060400135600160201b8111156103fc57600080fd5b82018360208201111561040e57600080fd5b803590602001918460208302840111600160201b8311171561042f57600080fd5b919390929091602081019035600160201b81111561044c57600080fd5b82018360208201111561045e57600080fd5b803590602001918460208302840111600160201b8311171561047f57600080fd5b919390929091602081019035600160201b81111561049c57600080fd5b8201836020820111156104ae57600080fd5b803590602001918460208302840111600160201b831117156104cf57600080fd5b509092509050610ab6565b3480156104e657600080fd5b50610117600480360360208110156104fd57600080fd5b810190602081018135600160201b81111561051757600080fd5b82018360208201111561052957600080fd5b803590602001918460208302840111600160201b8311171561054a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610d9d945050505050565b34801561059457600080fd5b5061014c600480360360208110156105ab57600080fd5b50356001600160a01b0316610ec2565b3480156105c757600080fd5b50610117600480360360208110156105de57600080fd5b810190602081018135600160201b8111156105f857600080fd5b82018360208201111561060a57600080fd5b803590602001918460208302840111600160201b8311171561062b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610edd945050505050565b34801561067557600080fd5b506101176004803603602081101561068c57600080fd5b50356001600160a01b0316611000565b6001602052600090815260409020546001600160a01b031681565b6000806001600160a01b038616610710576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b600061071c8686611053565b90506107288682611166565b909350915083831015610772576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b61077d87838561156e565b5094509492505050565b60006001600160a01b0387166107df576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b6003821115610828576040805162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103a37902a37b5b2b760811b604482015290519081900360640190fd5b60006108348786611053565b905061084287878386611600565b915083821015610889576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b61089488878461156e565b509695505050505050565b6003602052600090815260409020546001600160a01b031681565b6108c2610a8d565b610901576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b60005b81518110156109df5781818151811061091957fe5b60200260200101516001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561095b57600080fd5b505af115801561096f573d6000803e3d6000fd5b505050506040513d602081101561098557600080fd5b5051825160039060009085908590811061099b57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610904565b5050565b6109eb610a8d565b610a2a576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610aa7611bbe565b6001600160a01b031614905090565b6000805460ff16610b0e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690556001600160a01b038c16610b6e576040805162461bcd60e51b8152602060048201526018602482015277496e76616c6964207265636569766572206164647265737360401b604482015290519081900360640190fd5b8a8a6000198101818110610b7e57fe5b905060200201356001600160a01b03166001600160a01b03168b8b6000818110610ba457fe5b905060200201356001600160a01b03166001600160a01b03161415610c0a576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b610d108b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610c758d8d6000818110610c5f57fe5b905060200201356001600160a01b03168c611053565b89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a918291850190849080828437600092019190915250611bc292505050565b905087811015610d57576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b610d818c8c8c6000198101818110610d6b57fe5b905060200201356001600160a01b03168361156e565b6000805460ff191660011790559b9a5050505050505050505050565b610da5610a8d565b610de4576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b60005b81518110156109df57818181518110610dfc57fe5b60200260200101516001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b505050506040513d6020811015610e6857600080fd5b50518251600190600090859085908110610e7e57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610de7565b6002602052600090815260409020546001600160a01b031681565b610ee5610a8d565b610f24576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b60005b81518110156109df57818181518110610f3c57fe5b60200260200101516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7c57600080fd5b505afa158015610f90573d6000803e3d6000fd5b505050506040513d6020811015610fa657600080fd5b50518251600290600090859085908110610fbc57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101610f27565b611008610a8d565b611047576040805162461bcd60e51b815260206004820181905260248201526000805160206134f2833981519152604482015290519081900360640190fd5b61105081611d5b565b50565b60006001600160a01b0383166110ad57600034116110a6576040805162461bcd60e51b815260206004820152600b60248201526a139bc8195d1a081cd95b9d60aa1b604482015290519081900360640190fd5b5034611160565b600082116110f9576040805162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604482015290519081900360640190fd5b3415611142576040805162461bcd60e51b815260206004820152601360248201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604482015290519081900360640190fd5b61115d6001600160a01b03841633308563ffffffff611e0616565b50805b92915050565b6001600160a01b03828116600090815260016020526040812054909182914791161561131357846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b505050506040513d60208110156111fc57600080fd5b505115611246576040805162461bcd60e51b81526020600482015260136024820152724572726f7220696e20756e7772617070696e6760681b604482015290519081900360640190fd5b6001600160a01b0380861660009081526001602052604090205416915073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82141561129957479250611292838263ffffffff611e6616565b925061130e565b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156112df57600080fd5b505afa1580156112f3573d6000803e3d6000fd5b505050506040513d602081101561130957600080fd5b505192505b611566565b6001600160a01b03858116600090815260026020526040902054161561144057846001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561137957600080fd5b505af115801561138d573d6000803e3d6000fd5b50505050846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ca57600080fd5b505afa1580156113de573d6000803e3d6000fd5b505050506040513d60208110156113f457600080fd5b5051604080516370a0823160e01b815230600482015290519193506001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156112df57600080fd5b6001600160a01b03858116600090815260036020526040902054161561155f57846001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114a657600080fd5b505af11580156114ba573d6000803e3d6000fd5b50505050846001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114f957600080fd5b505af115801561150d573d6000803e3d6000fd5b505050506040513d602081101561152357600080fd5b505191506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561129957479250611292838263ffffffff611e6616565b8491508392505b509250929050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14806115a057506001600160a01b038216155b156115e1576040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156115db573d6000803e3d6000fd5b506115fb565b6115fb6001600160a01b038316848363ffffffff611eaf16565b505050565b60008161172e576001600160a01b0385161561165b576040805162461bcd60e51b8152602060048201526015602482015274086c2dcdcdee840eee4c2e040d2dce8de40ae8aa89605b1b604482015290519081900360640190fd5b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146116be576040805162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103a37aa37b5b2b760891b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b5050505050829050611bb6565b8160011415611830576001600160a01b03851661179e57836001600160a01b0316631249c58b846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561178057600080fd5b505af1158015611794573d6000803e3d6000fd5b505050505061182b565b6117b86001600160a01b038616858563ffffffff611f0116565b836001600160a01b031663a0712d68846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b505050506040513d602081101561182857600080fd5b50505b611b41565b81600214156118b6576118536001600160a01b038616858563ffffffff611f0116565b836001600160a01b031663b6b55f25846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b50505050611b41565b6001600160a01b0385166119c5577324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561191157600080fd5b505afa158015611925573d6000803e3d6000fd5b505050506040513d602081101561193b57600080fd5b505160408051636968703360e11b815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60048201526024810186905260006044820181905291516001600160a01b039093169263d2d0e0669287926064808201939182900301818588803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b5050505050611b41565b611a587324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1557600080fd5b505afa158015611a29573d6000803e3d6000fd5b505050506040513d6020811015611a3f57600080fd5b50516001600160a01b038716908563ffffffff611f0116565b7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611aa557600080fd5b505afa158015611ab9573d6000803e3d6000fd5b505050506040513d6020811015611acf57600080fd5b505160408051636968703360e11b81526001600160a01b03888116600483015260248201879052600060448301819052925193169263d2d0e0669260648084019391929182900301818387803b158015611b2857600080fd5b505af1158015611b3c573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611b8757600080fd5b505afa158015611b9b573d6000803e3d6000fd5b505050506040513d6020811015611bb157600080fd5b505190505b949350505050565b3390565b6000806000809050606060008988600081518110611bdc57fe5b602002602001015160ff1681518110611bf157fe5b6020026020010151905060008090505b8751811015611d49578751600090611c2090600163ffffffff611e6616565b8214611c4557898260010181518110611c3557fe5b602002602001015160ff16611c4b565b60018c51035b90508b8181518110611c5957fe5b60200260200101519550888281518110611c6f57fe5b602002602001015160ff1660021415611cad57611ca68c8b8481518110611c9257fe5b602002602001015160ff1683600101612014565b9350611d18565b6040805160018082528183019092529060208083019080388339019050509350878580600101965060ff1681518110611ce257fe5b602002602001015184600081518110611cf757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b611d3b83878d8c8681518110611d2a57fe5b602002602001015160ff16886121b7565b9a5085925050600101611c01565b50889450505050505b95945050505050565b6001600160a01b038116611da05760405162461bcd60e51b81526004018080602001828103825260268152602001806134cc6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611e609085906122d7565b50505050565b6000611ea883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061248f565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115fb9084906122d7565b801580611f87575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611f5957600080fd5b505afa158015611f6d573d6000803e3d6000fd5b505050506040513d6020811015611f8357600080fd5b5051155b611fc25760405162461bcd60e51b815260040180806020018281038252603681526020018061353c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526115fb9084906122d7565b60606000612028838563ffffffff611e6616565b905060018111612070576040805162461bcd60e51b815260206004820152600e60248201526d08aa4a4beaa9c92ac64bea082a8960931b604482015290519081900360640190fd5b8060405190808252806020026020018201604052801561209a578160200160208202803883390190505b50915060005b818110156121ae5760006001600160a01b031686828701815181106120c157fe5b60200260200101516001600160a01b03161480612118575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316868287018151811061210557fe5b60200260200101516001600160a01b0316145b156121635773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc283828151811061213e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506121a6565b858186018151811061217157fe5b602002602001015183828151811061218557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016120a0565b50509392505050565b6000846001600160a01b0316866001600160a01b0316141561221a576040805162461bcd60e51b815260206004820152601760248201527643616e6e6f7420737761702073616d6520746f6b656e7360481b604482015290519081900360640190fd5b6003831115612263576040805162461bcd60e51b815260206004820152601060248201526f496e76616c69642045786368616e676560801b604482015290519081900360640190fd5b82600114156122955761228e8260008151811061227c57fe5b60200260200101518787876001612526565b9050611d52565b82600214156122ac5761228e868684876001612a37565b8260031415611d525761228e826000815181106122c557fe5b60200260200101518787876001612ed3565b6122e9826001600160a01b0316613492565b61233a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106123785780518252601f199092019160209182019101612359565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123da576040519150601f19603f3d011682016040523d82523d6000602084013e6123df565b606091505b509150915081612436576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611e605780806020019051602081101561245257600080fd5b5051611e605760405162461bcd60e51b815260040180806020018281038252602a815260200180613512602a913960400191505060405180910390fd5b6000818484111561251e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124e35781810151838201526020016124cb565b50505050905090810190601f1680156125105780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805163615db6e160e11b81526001600160a01b03871660048201529051600091739424b1412450d0f8fc2255faf6046b98213b76bd9163c2bb6dc291602480820192602092909190829003018186803b15801561258457600080fd5b505afa158015612598573d6000803e3d6000fd5b505050506040513d60208110156125ae57600080fd5b50516125f9576040805162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590818985b185b98d95c881c1bdbdb605a1b604482015290519081900360640190fd5b6000869050806001600160a01b031663fde924f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561263757600080fd5b505afa15801561264b573d6000803e3d6000fd5b505050506040513d602081101561266157600080fd5b50516126b4576040805162461bcd60e51b815260206004820152601e60248201527f53776170206e6f7420616c6c6f77656420666f72207468697320706f6f6c0000604482015290519081900360640190fd5b846001600160a01b0387166127475773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2965061276c565b6001600160a01b03861661276c575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b816001600160a01b0316632f37b624886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156127c257600080fd5b505afa1580156127d6573d6000803e3d6000fd5b505050506040513d60208110156127ec57600080fd5b5051612836576040805162461bcd60e51b8152602060048201526014602482015273119c9bdb48151bdad95b881b9bdd08189bdd5b9960621b604482015290519081900360640190fd5b816001600160a01b0316632f37b624826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561288c57600080fd5b505afa1580156128a0573d6000803e3d6000fd5b505050506040513d60208110156128b657600080fd5b50516128fe576040805162461bcd60e51b8152602060048201526012602482015271151bc8151bdad95b881b9bdd08189bdd5b9960721b604482015290519081900360640190fd5b6129186001600160a01b038816898763ffffffff611f0116565b60408051638201aa3f60e01b81526001600160a01b038981166004830152602482018890528381166044830152606482018790526000196084830152825190851692638201aa3f9260a480820193918290030181600087803b15801561297d57600080fd5b505af1158015612991573d6000803e3d6000fd5b505050506040513d60408110156129a757600080fd5b505192506001600160a01b038616612a2c5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612a1357600080fd5b505af1158015612a27573d6000803e3d6000fd5b505050505b505095945050505050565b600082866001600160a01b03811615612a8757612a548886611166565b9092509050612a876001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d8463ffffffff611f0116565b6001600160a01b038816612c2b57604051637ff36ab560e01b8152600481018581523060448301819052600f60fc1b606484018190526080602485019081528a5160848601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d95637ff36ab59589958c958f959194909360a401906020808801910280838360005b83811015612b1e578181015183820152602001612b06565b50505050905001955050505050506000604051808303818588803b158015612b4557600080fd5b505af1158015612b59573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526020811015612b8357600080fd5b8101908080516040519392919084600160201b821115612ba257600080fd5b908301906020820185811115612bb757600080fd5b82518660208202830111600160201b82111715612bd357600080fd5b82525081516020918201928201910280838360005b83811015612c00578181015183820152602001612be8565b50505050905001604052505050600187510381518110612c1c57fe5b60200260200101519250612a2c565b6001600160a01b038716612d2f576040516318cbafe560e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956318cbafe59589958c958f959194909360c401906020808801910280838360005b83811015612cc9578181015183820152602001612cb1565b505050509050019650505050505050600060405180830381600087803b158015612cf257600080fd5b505af1158015612d06573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612b8357600080fd5b6040516338ed173960e01b815260048101838152602482018690523060648301819052600f60fc1b6084840181905260a0604485019081528a5160a48601528a51737a250d5630b4cf539739df2c5dacb4c659f2488d956338ed17399589958c958f959194909360c401906020808801910280838360005b83811015612dbf578181015183820152602001612da7565b505050509050019650505050505050600060405180830381600087803b158015612de857600080fd5b505af1158015612dfc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612e2557600080fd5b8101908080516040519392919084600160201b821115612e4457600080fd5b908301906020820185811115612e5957600080fd5b82518660208202830111600160201b82111715612e7557600080fd5b82525081516020918201928201910280838360005b83811015612ea2578181015183820152602001612e8a565b50505050905001604052505050600187510381518110612ebe57fe5b60200260200101519250505095945050505050565b60006001600160a01b038616612f30576040805162461bcd60e51b815260206004820152601960248201527f4552525f496e766169645f63757276655f65786368616e676500000000000000604482015290519081900360640190fd5b85600080612f3e8887611166565b9092509050612f5d6001600160a01b0382168a8463ffffffff611f0116565b6000806001600160a01b038b167393054188d876f558f4a66b2ef1d97d16edf0895b1480612fa757506001600160a01b038b16737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156131a85760006001600160a01b038c167393054188d876f558f4a66b2ef1d97d16edf0895b14612fd9576003612fdc565b60025b60ff16905060005b81600f0b81600f0b121561312457846001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561304657600080fd5b505afa15801561305a573d6000803e3d6000fd5b505050506040513d602081101561307057600080fd5b50516001600160a01b031614156130895780935061311c565b8a6001600160a01b0316876001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b1580156130dd57600080fd5b505afa1580156130f1573d6000803e3d6000fd5b505050506040513d602081101561310757600080fd5b50516001600160a01b0316141561311c578092505b600101612fe4565b5060408051630f7c084960e21b8152600f85810b810b600483015284810b900b602482015260448101879052606481018a905290516001600160a01b03881691633df0212491608480830192600092919082900301818387803b15801561318a57600080fd5b505af115801561319e573d6000803e3d6000fd5b50505050506133d0565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a567352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60046001600160a01b038e168314156131ed5750600261320b565b816001600160a01b03168e6001600160a01b0316141561320b575060035b60005b81600f0b81600f0b121561334e57866001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561327057600080fd5b505afa158015613284573d6000803e3d6000fd5b505050506040513d602081101561329a57600080fd5b50516001600160a01b031614156132b357809550613346565b8c6001600160a01b0316896001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561330757600080fd5b505afa15801561331b573d6000803e3d6000fd5b505050506040513d602081101561333157600080fd5b50516001600160a01b03161415613346578094505b60010161320e565b5060408051635320bf6b60e11b8152600f87810b810b600483015286810b900b602482015260448101899052606481018c905290516001600160a01b038a169163a6417ed691608480830192600092919082900301818387803b1580156133b457600080fd5b505af11580156133c8573d6000803e3d6000fd5b505050505050505b6001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148061340257506001600160a01b038916155b1561340f57479550613484565b604080516370a0823160e01b815230600482015290516001600160a01b038b16916370a08231916024808301926020929190829003018186803b15801561345557600080fd5b505afa158015613469573d6000803e3d6000fd5b505050506040513d602081101561347f57600080fd5b505195505b505050505095945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611bb657505015159291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820fb175b11bd53853bf95e36ec0f13ff5b2f9d1d7c63904a9ce9b3514460b7a66864736f6c63430005110032
Deployed Bytecode Sourcemap
29028:19375:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48340:10;48354:9;48340:23;;48332:60;;;;;-1:-1:-1;;;48332:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29028:19375;30244:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30244:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30244:41:0;-1:-1:-1;;;;;30244:41:0;;:::i;:::-;;;;-1:-1:-1;;;;;30244:41:0;;;;;;;;;;;;;;42063:711;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42063:711:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;42063:711:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;42063:711:0;;;;;;;;;;;;;;;;44566:888;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;44566:888:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30340:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30340:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30340:41:0;-1:-1:-1;;;;;30340:41:0;;:::i;31467:217::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31467:217:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31467:217:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;31467:217:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31467:217:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31467:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31467:217:0;;-1:-1:-1;31467:217:0;;-1:-1:-1;;;;;31467:217:0:i;8063:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8063:140:0;;;:::i;7252:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7252:79:0;;;:::i;7618:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7618:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;32317:810;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;32317:810:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32317:810:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32317:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32317:810:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32317:810:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32317:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32317:810:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32317:810:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32317:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32317:810:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32317:810:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32317:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;32317:810:0;;-1:-1:-1;32317:810:0;-1:-1:-1;32317:810:0;:::i;30775:207::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30775:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30775:207:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30775:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30775:207:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30775:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30775:207:0;;-1:-1:-1;30775:207:0;;-1:-1:-1;;;;;30775:207:0:i;30292:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30292:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30292:41:0;-1:-1:-1;;;;;30292:41:0;;:::i;31111:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31111:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31111:199:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;31111:199:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31111:199:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31111:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31111:199:0;;-1:-1:-1;31111:199:0;;-1:-1:-1;;;;;31111:199:0:i;8358:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8358:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8358:109:0;-1:-1:-1;;;;;8358:109:0;;:::i;30244:41::-;;;;;;;;;;;;-1:-1:-1;;;;;30244:41:0;;:::o;42063:711::-;42246:23;;-1:-1:-1;;;;;42307:28:0;;42299:65;;;;;-1:-1:-1;;;42299:65:0;;;;;;;;;;;;-1:-1:-1;;;42299:65:0;;;;;;;;;;;;;;;42375:20;42398:88;42423:25;42463:12;42398:10;:88::i;:::-;42375:111;;42528:85;42550:25;42590:12;42528:7;:85::i;:::-;42499:114;;-1:-1:-1;42499:114:0;-1:-1:-1;42634:28:0;;;;42626:54;;;;;-1:-1:-1;;;42626:54:0;;;;;;;;;;;;-1:-1:-1;;;42626:54:0;;;;;;;;;;;;;;;42713:53;42725:14;42741:7;42750:15;42713:11;:53::i;:::-;42063:711;;;;;;;;:::o;44566:888::-;44825:21;-1:-1:-1;;;;;44867:28:0;;44859:65;;;;;-1:-1:-1;;;44859:65:0;;;;;;;;;;;;-1:-1:-1;;;44859:65:0;;;;;;;;;;;;;;;44956:1;44943:9;:14;;44935:43;;;;;-1:-1:-1;;;44935:43:0;;;;;;;;;;;;-1:-1:-1;;;44935:43:0;;;;;;;;;;;;;;;44989:20;45012:88;45037:25;45077:12;45012:10;:88::i;:::-;44989:111;;45129:145;45149:25;45189:23;45227:12;45254:9;45129:5;:145::i;:::-;45113:161;;45312:9;45295:13;:26;;45287:52;;;;;-1:-1:-1;;;45287:52:0;;;;;;;;;;;;-1:-1:-1;;;45287:52:0;;;;;;;;;;;;;;;45379:67;45391:14;45407:23;45432:13;45379:11;:67::i;:::-;44566:888;;;;;;;;;:::o;30340:41::-;;;;;;;;;;;;-1:-1:-1;;;;;30340:41:0;;:::o;31467:217::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;31545:9;31540:137;31564:7;:14;31560:1;:18;31540:137;;;31629:7;31637:1;31629:10;;;;;;;;;;;;;;-1:-1:-1;;;;;31621:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31621:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31621:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31621:44:0;31607:10;;31600:6;;:18;;31607:7;;31615:1;;31607:10;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31600:18:0;;;;;;;;;;;;;;-1:-1:-1;31600:18:0;:65;;-1:-1:-1;;;;;;31600:65:0;;;;;;;;;;;-1:-1:-1;31580:3:0;31540:137;;;;31467:217;:::o;8063:140::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;8162:1;8146:6;;8125:40;;8146:6;;;;-1:-1:-1;;;;;8146:6:0;;8125:40;;8162:1;;8125:40;8193:1;8176:19;;-1:-1:-1;;;;;;8176:19:0;;;8063:140::o;7252:79::-;7290:7;7317:6;;;;-1:-1:-1;;;;;7317:6:0;;7252:79::o;7618:94::-;7658:4;7698:6;;;;;-1:-1:-1;;;;;7698:6:0;7682:12;:10;:12::i;:::-;-1:-1:-1;;;;;7682:22:0;;7675:29;;7618:94;:::o;32317:810::-;32629:20;10884:11;;;;10876:55;;;;;-1:-1:-1;;;10876:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11023:5;11009:19;;-1:-1:-1;;11009:19:0;;;-1:-1:-1;;;;;32670:27:0;;32662:64;;;;;-1:-1:-1;;;32662:64:0;;;;;;;;;;;;-1:-1:-1;;;32662:64:0;;;;;;;;;;;;;;;32756:4;;-1:-1:-1;;32761:15:0;;32756:21;;;;;;;;;;;;;-1:-1:-1;;;;;32756:21:0;-1:-1:-1;;;;;32745:32:0;:4;;32750:1;32745:7;;;;;;;;;;;;;-1:-1:-1;;;;;32745:7:0;-1:-1:-1;;;;;32745:32:0;;;32737:68;;;;;-1:-1:-1;;;32737:68:0;;;;;;;;;;;;-1:-1:-1;;;32737:68:0;;;;;;;;;;;;;;;32833:146;32853:4;;32833:146;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;32833:146:0;;;;;;32872:29;32883:4;;32888:1;32883:7;;;;;;;;;;;;;-1:-1:-1;;;;;32883:7:0;32892:8;32872:10;:29::i;:::-;32916:6;;32833:146;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;32833:146:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32937:8:0;;-1:-1:-1;32937:8:0;;;;32833:146;;;32937:8;;32833:146;32937:8;32833:146;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;32833:146:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32960:8:0;;-1:-1:-1;32960:8:0;;;;32833:146;;;32960:8;;32833:146;32960:8;32833:146;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;32833:5:0;;-1:-1:-1;;;32833:146:0:i;:::-;32818:161;;33016:11;33000:12;:27;;32992:53;;;;;-1:-1:-1;;;32992:53:0;;;;;;;;;;;;-1:-1:-1;;;32992:53:0;;;;;;;;;;;;;;;33056:63;33068:13;33083:4;;-1:-1:-1;;33088:15:0;;33083:21;;;;;;;;;;;;;-1:-1:-1;;;;;33083:21:0;33106:12;33056:11;:63::i;:::-;11189:11;:18;;-1:-1:-1;;11189:18:0;11203:4;11189:18;;;32317:810;;-1:-1:-1;;;;;;;;;;;32317:810:0:o;30775:207::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;30853:9;30848:127;30872:7;:14;30868:1;:18;30848:127;;;30939:7;30947:1;30939:10;;;;;;;;;;;;;;-1:-1:-1;;;;;30929:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30929:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30929:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30929:34:0;30915:10;;30908:6;;:18;;30915:7;;30923:1;;30915:10;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30908:18:0;;;;;;;;;;;;;;-1:-1:-1;30908:18:0;:55;;-1:-1:-1;;;;;;30908:55:0;;;;;;;;;;;-1:-1:-1;30888:3:0;30848:127;;30292:41;;;;;;;;;;;;-1:-1:-1;;;;;30292:41:0;;:::o;31111:199::-;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;31189:9;31184:119;31208:7;:14;31204:1;:18;31184:119;;;31272:7;31280:1;31272:10;;;;;;;;;;;;;;-1:-1:-1;;;;;31265:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31265:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31265:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31265:26:0;31251:10;;31244:6;;:18;;31251:7;;31259:1;;31251:10;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31244:18:0;;;;;;;;;;;;;;-1:-1:-1;31244:18:0;:47;;-1:-1:-1;;;;;;31244:47:0;;;;;;;;;;;-1:-1:-1;31224:3:0;31184:119;;8358:109;7464:9;:7;:9::i;:::-;7456:54;;;;;-1:-1:-1;;;7456:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7456:54:0;;;;;;;;;;;;;;;8431:28;8450:8;8431:18;:28::i;:::-;8358:109;:::o;47807:478::-;47894:7;-1:-1:-1;;;;;47923:19:0;;47919:120;;47979:1;47967:9;:13;47959:37;;;;;-1:-1:-1;;;47959:37:0;;;;;;;;;;;;-1:-1:-1;;;47959:37:0;;;;;;;;;;;;;;;-1:-1:-1;48018:9:0;48011:16;;47919:120;48066:1;48057:6;:10;48049:43;;;;;-1:-1:-1;;;48049:43:0;;;;;;;;;;;;-1:-1:-1;;;48049:43:0;;;;;;;;;;;;;;;48111:9;:14;48103:46;;;;;-1:-1:-1;;;48103:46:0;;;;;;;;;;;;-1:-1:-1;;;48103:46:0;;;;;;;;;;;;;;;48188:65;-1:-1:-1;;;;;48188:30:0;;48219:10;48239:4;48246:6;48188:65;:30;:65;:::i;:::-;-1:-1:-1;48271:6:0;47807:478;;;;;:::o;42782:1776::-;-1:-1:-1;;;;;43014:33:0;;;42892:23;43014:33;;;:6;:33;;;;;;42892:23;;;;42978:21;;43014:33;:47;43010:1541;;43119:25;-1:-1:-1;;;;;43104:48:0;;43175:12;43104:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43104:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43104:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43104:102:0;:107;43078:188;;;;;-1:-1:-1;;;43078:188:0;;;;;;;;;;;;-1:-1:-1;;;43078:188:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43291:33:0;;;;;;;:6;:33;;;;;;;;-1:-1:-1;30066:42:0;43343:21;;43339:275;;;43403:21;;-1:-1:-1;43461:38:0;43403:21;43481:17;43461:38;:19;:38;:::i;:::-;43443:56;;43339:275;;;43558:40;;;-1:-1:-1;;;43558:40:0;;43592:4;43558:40;;;;;;-1:-1:-1;;;;;43558:25:0;;;;;:40;;;;;;;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;43558:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43558:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43558:40:0;;-1:-1:-1;43339:275:0;43010:1541;;;-1:-1:-1;;;;;43635:33:0;;;43680:1;43635:33;;;:6;:33;;;;;;;:47;43631:920;;43706:25;-1:-1:-1;;;;;43699:42:0;;43742:12;43699:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43699:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43699:56:0;;;;43787:25;-1:-1:-1;;;;;43780:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43780:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43780:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43780:41:0;43854:40;;;-1:-1:-1;;;43854:40:0;;43888:4;43854:40;;;;;;43780:41;;-1:-1:-1;;;;;;43854:25:0;;;;;:40;;;;;43780:41;;43854:40;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;43631:920:0;-1:-1:-1;;;;;43916:33:0;;;43961:1;43916:33;;;:6;:33;;;;;;;:47;43912:639;;43988:25;-1:-1:-1;;;;;43980:41:0;;44022:12;43980:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43980:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43980:55:0;;;;44068:25;-1:-1:-1;;;;;44060:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44060:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44060:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44060:77:0;;-1:-1:-1;;;;;;44156:21:0;;30066:42;44156:21;44152:275;;;44216:21;;-1:-1:-1;44274:38:0;44216:21;44294:17;44274:38;:19;:38;:::i;43912:639::-;44469:25;44459:35;;44527:12;44509:30;;43912:639;42782:1776;;;;;;:::o;36413:331::-;-1:-1:-1;;;;;36554:19:0;;30066:42;36554:19;;:42;;-1:-1:-1;;;;;;36577:19:0;;;36554:42;36550:187;;;36613:30;;-1:-1:-1;;;;;36613:22:0;;;:30;;;;;36636:6;;36613:30;;;;36636:6;36613:22;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36613:30:0;36550:187;;;36676:49;-1:-1:-1;;;;;36676:26:0;;36703:13;36718:6;36676:49;:26;:49;:::i;:::-;36413:331;;;:::o;45462:2337::-;45647:21;45701:14;45697:1988;;-1:-1:-1;;;;;45758:39:0;;;45732:122;;;;;-1:-1:-1;;;45732:122:0;;;;;;;;;;;;-1:-1:-1;;;45732:122:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45895:48:0;;29952:42;45895:48;45869:125;;;;;-1:-1:-1;;;45869:125:0;;;;;;;;;;;;-1:-1:-1;;;45869:125:0;;;;;;;;;;;;;;;29952:42;-1:-1:-1;;;;;46011:20:0;;46038:12;46011:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46011:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46011:42:0;;;;;46075:12;46068:19;;;;45697:1988;46109:9;46122:1;46109:14;46105:1580;;;-1:-1:-1;;;;;46168:39:0;;46164:458;;46243:23;-1:-1:-1;;;;;46228:44:0;;46301:12;46228:106;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46228:106:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46228:106:0;;;;;46164:458;;;46375:154;-1:-1:-1;;;;;46375:45:0;;46451:23;46498:12;46375:154;:45;:154;:::i;:::-;46563:23;-1:-1:-1;;;;;46548:44:0;;46593:12;46548:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46548:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46548:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;46164:458:0;46105:1580;;;46643:9;46656:1;46643:14;46639:1046;;;46695:142;-1:-1:-1;;;;;46695:45:0;;46767:23;46810:12;46695:142;:45;:142;:::i;:::-;46859:23;-1:-1:-1;;;;;46852:39:0;;46892:12;46852:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46852:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46852:53:0;;;;46639:1046;;;-1:-1:-1;;;;;46963:39:0;;46959:715;;29465:42;-1:-1:-1;;;;;47040:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47040:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47040:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47040:43:0;47023:162;;;-1:-1:-1;;;47023:162:0;;30066:42;47023:162;;;;;;;;;;47183:1;47023:162;;;;;;;;-1:-1:-1;;;;;47023:91:0;;;;;;47143:12;;47023:162;;;;;;;;;;;47143:12;47023:91;:162;;;5:2:-1;;;;30:1;27;20:12;5:2;47023:162:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47023:162:0;;;;;46959:715;;;47271:178;29465:42;-1:-1:-1;;;;;47347:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47347:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47347:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47347:47:0;-1:-1:-1;;;;;47271:45:0;;;47418:12;47271:178;:45;:178;:::i;:::-;29465:42;-1:-1:-1;;;;;47540:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47540:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47540:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47540:43:0;47523:135;;;-1:-1:-1;;;47523:135:0;;-1:-1:-1;;;;;47523:135:0;;;;;;;;;;;;;47656:1;47523:135;;;;;;;;:91;;;;;:135;;;;;47656:1;;47523:135;;;;;;47656:1;47523:91;:135;;;5:2:-1;;;;30:1;27;20:12;5:2;47523:135:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47523:135:0;;;;46959:715;47711:80;;;-1:-1:-1;;;47711:80:0;;47775:4;47711:80;;;;;;-1:-1:-1;;;;;47711:41:0;;;;;:80;;;;;;;;;;;;;;:41;:80;;;5:2:-1;;;;30:1;27;20:12;5:2;47711:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47711:80:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47711:80:0;;-1:-1:-1;45462:2337:0;;;;;;;:::o;5934:98::-;6014:10;5934:98;:::o;33156:1176::-;33361:7;33381:11;33403:15;33421:1;33403:19;;33433:26;33470:13;33486:4;33491:6;33498:1;33491:9;;;;;;;;;;;;;;33486:15;;;;;;;;;;;;;;;;33470:31;;33519:13;33535:1;33519:17;;33514:781;33546:8;:15;33538:5;:23;33514:781;;;33615:15;;33587:16;;33615:22;;33635:1;33615:22;:19;:22;:::i;:::-;33606:5;:31;:103;;33692:6;33699:5;33707:1;33699:9;33692:17;;;;;;;;;;;;;;33606:103;;;;;33671:1;33657:4;:11;:15;33606:103;33587:122;;33732:4;33737:8;33732:14;;;;;;;;;;;;;;33726:20;;33786:8;33795:5;33786:15;;;;;;;;;;;;;;:20;;33805:1;33786:20;33782:260;;;33843:43;33852:4;33858:6;33865:5;33858:13;;;;;;;;;;;;;;33843:43;;33873:8;33884:1;33873:12;33843:8;:43::i;:::-;33831:55;;33782:260;;;33947:16;;;33961:1;33947:16;;;;;;;;;;;;;;;;105:10:-1;33947:16:0;88:34:-1;136:17;;-1:-1;33947:16:0;33935:28;;34001:8;34010:11;;;;;;34001:21;;;;;;;;;;;;;;;;33986:9;33996:1;33986:12;;;;;;;;;;;;;:36;-1:-1:-1;;;;;33986:36:0;;;-1:-1:-1;;;;;33986:36:0;;;;;33782:260;34088:167;34120:5;34144:3;34166:12;34197:8;34206:5;34197:15;;;;;;;;;;;;;;34088:167;;34231:9;34088:13;:167::i;:::-;34073:182;-1:-1:-1;34280:3:0;;-1:-1:-1;;33563:7:0;;33514:781;;;;34312:12;34305:19;;;;;;33156:1176;;;;;;;;:::o;8573:266::-;-1:-1:-1;;;;;8661:22:0;;8639:110;;;;-1:-1:-1;;;8639:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8786:6;;;8765:38;;-1:-1:-1;;;;;8765:38:0;;;;8786:6;;;;;;8765:38;;;8814:6;:17;;-1:-1:-1;;;;;8814:17:0;;;;;-1:-1:-1;;;;;;8814:17:0;;;;;;;;;8573:266::o;20729:284::-;20926:68;;;-1:-1:-1;;;;;20926:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20926:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20873:132:0;;20906:5;;20873:18;:132::i;:::-;20729:284;;;;:::o;12591:136::-;12649:7;12676:43;12680:1;12683;12676:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;12669:50;12591:136;-1:-1:-1;;;12591:136:0:o;20474:247::-;20644:58;;;-1:-1:-1;;;;;20644:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20644:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20591:122:0;;20624:5;;20591:18;:122::i;21021:706::-;21439:10;;;21438:62;;-1:-1:-1;21455:39:0;;;-1:-1:-1;;;21455:39:0;;21479:4;21455:39;;;;-1:-1:-1;;;;;21455:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;21455:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21455:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21455:39:0;:44;21438:62;21416:166;;;;-1:-1:-1;;;21416:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21646:62;;;-1:-1:-1;;;;;21646:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21646:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;21593:126:0;;21626:5;;21593:18;:126::i;35748:657::-;35881:29;35923:11;35937:16;:4;35946:6;35937:16;:8;:16;:::i;:::-;35923:30;;35978:1;35972:3;:7;35964:34;;;;;-1:-1:-1;;;35964:34:0;;;;;;;;;;;;-1:-1:-1;;;35964:34:0;;;;;;;;;;;;;;;36038:3;36024:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36024:18:0;-1:-1:-1;36009:33:0;-1:-1:-1;36060:9:0;36055:343;36079:3;36075:1;:7;36055:343;;;36159:1;-1:-1:-1;;;;;36126:35:0;:9;36145:1;36136:6;:10;36126:21;;;;;;;;;;;;;;-1:-1:-1;;;;;36126:35:0;;:91;;;;30066:42;-1:-1:-1;;;;;36182:35:0;:9;36201:1;36192:6;:10;36182:21;;;;;;;;;;;;;;-1:-1:-1;;;;;36182:35:0;;36126:91;36104:283;;;29952:42;36252:12;36265:1;36252:15;;;;;;;;;;;;;:39;-1:-1:-1;;;;;36252:39:0;;;-1:-1:-1;;;;;36252:39:0;;;;;36104:283;;;36350:9;36369:1;36360:6;:10;36350:21;;;;;;;;;;;;;;36332:12;36345:1;36332:15;;;;;;;;;;;;;:39;-1:-1:-1;;;;;36332:39:0;;;-1:-1:-1;;;;;36332:39:0;;;;;36104:283;36084:3;;36055:343;;;;35748:657;;;;;;:::o;34783:730::-;34975:7;35016;-1:-1:-1;;;;;35003:20:0;:9;-1:-1:-1;;;;;35003:20:0;;;34995:56;;;;;-1:-1:-1;;;34995:56:0;;;;;;;;;;;;-1:-1:-1;;;34995:56:0;;;;;;;;;;;;;;;35082:1;35070:8;:13;;35062:42;;;;;-1:-1:-1;;;35062:42:0;;;;;;;;;;;;-1:-1:-1;;;35062:42:0;;;;;;;;;;;;;;;35121:8;35133:1;35121:13;35117:389;;;35175:63;35193:8;35202:1;35193:11;;;;;;;;;;;;;;35206:9;35217:7;35226:8;35236:1;35175:17;:63::i;:::-;35151:87;;;;35117:389;35260:8;35272:1;35260:13;35256:250;;;35314:61;35333:9;35344:7;35353:8;35363;35373:1;35314:18;:61::i;35256:250::-;35397:8;35409:1;35397:13;35393:113;;;35434:60;35449:8;35458:1;35449:11;;;;;;;;;;;;;;35462:9;35473:7;35482:8;35492:1;35434:14;:60::i;23084:1176::-;23688:27;23696:5;-1:-1:-1;;;;;23688:25:0;;:27::i;:::-;23680:71;;;;;-1:-1:-1;;;23680:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23825:12;23839:23;23874:5;-1:-1:-1;;;;;23866:19:0;23886:4;23866:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23866:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23824:67:0;;;;23910:7;23902:52;;;;;-1:-1:-1;;;23902:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23971:17;;:21;23967:286;;24144:10;24133:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24133:30:0;24107:134;;;;-1:-1:-1;;;24107:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13064:226;13184:7;13220:12;13212:6;;;;13204:29;;;;-1:-1:-1;;;13204:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13204:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13256:5:0;;;13064:226::o;36752:1241::-;36986:37;;;-1:-1:-1;;;36986:37:0;;-1:-1:-1;;;;;36986:37:0;;;;;;;;36946:19;;29588:42;;36986:23;;:37;;;;;;;;;;;;;;;29588:42;36986:37;;;5:2:-1;;;;30:1;27;20:12;5:2;36986:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36986:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36986:37:0;36978:71;;;;;-1:-1:-1;;;36978:71:0;;;;;;;;;;;;-1:-1:-1;;;36978:71:0;;;;;;;;;;;;;;;37062:12;37084;37062:35;;37116:5;-1:-1:-1;;;;;37116:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37116:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37116:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37116:20:0;37108:63;;;;;-1:-1:-1;;;37108:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37198:7;-1:-1:-1;;;;;37220:23:0;;37216:229;;29952:42;-1:-1:-1;;;;;37260:20:0;;37287:8;37260:38;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37260:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37260:38:0;;;;;29952:42;37313:33;;37216:229;;;-1:-1:-1;;;;;37368:21:0;;37364:81;;-1:-1:-1;29952:42:0;37364:81;37463:5;-1:-1:-1;;;;;37463:13:0;;37477:9;37463:24;;;;;;;;;;;;;-1:-1:-1;;;;;37463:24:0;-1:-1:-1;;;;;37463:24:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37463:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37463:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37463:24:0;37455:57;;;;;-1:-1:-1;;;37455:57:0;;;;;;;;;;;;-1:-1:-1;;;37455:57:0;;;;;;;;;;;;;;;37531:5;-1:-1:-1;;;;;37531:13:0;;37545:3;37531:18;;;;;;;;;;;;;-1:-1:-1;;;;;37531:18:0;-1:-1:-1;;;;;37531:18:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37531:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37531:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37531:18:0;37523:49;;;;;-1:-1:-1;;;37523:49:0;;;;;;;;;;;;-1:-1:-1;;;37523:49:0;;;;;;;;;;;;;;;37627:53;-1:-1:-1;;;;;37627:29:0;;37657:12;37671:8;37627:53;:29;:53;:::i;:::-;37734:151;;;-1:-1:-1;;;37734:151:0;;-1:-1:-1;;;;;37734:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37734:151:0;;;;;;:23;;;;;;:151;;;;;;;;;;;-1:-1:-1;37734:23:0;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;37734:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37734:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37734:151:0;;-1:-1:-1;;;;;;37902:21:0;;37898:88;;29952:42;-1:-1:-1;;;;;37940:21:0;;37962:11;37940:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37940:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37940:34:0;;;;37898:88;36752:1241;;;;;;;;;:::o;38001:1441::-;38197:19;38305:8;38345:9;-1:-1:-1;;;;;38369:23:0;;;38365:251;;38441:28;38449:9;38460:8;38441:7;:28::i;:::-;38409:60;;-1:-1:-1;38409:60:0;-1:-1:-1;38484:120:0;-1:-1:-1;;;;;38484:30:0;;29274:42;38409:60;38484:120;:30;:120;:::i;:::-;-1:-1:-1;;;;;38668:23:0;;38664:771;;38722:134;;-1:-1:-1;;;38722:134:0;;;;;;;;38840:4;38722:134;;;;;;-1:-1:-1;;;38722:134:0;;;;;;;;;;;;;;;;;;;;;29274:42;;38722:35;;38782:15;;38813:11;;38826:4;;38840;;30169:66;;38722:134;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38722:134:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38722:134:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38722:134:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;38722:134:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;38722:134:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;38722:134:0;;421:4:-1;412:14;;;;38722:134:0;;;;;412:14:-1;38722:134:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38722:134:0;;;;;;;;;;;38871:1;38857:4;:11;:15;38722:151;;;;;;;;;;;;;;38708:165;;38664:771;;;-1:-1:-1;;;;;38895:21:0;;38891:544;;38947:196;;-1:-1:-1;;;38947:196:0;;;;;;;;;;;;;;39096:4;38947:196;;;;;;-1:-1:-1;;;38947:196:0;;;;;;;;;;;;;;;;;;;;;29274:42;;38947:35;;39001:15;;39035:11;;39065:4;;39096;;30169:66;;38947:196;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38947:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38947:196:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38947:196:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;38947:196:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;38891:544:0;39207:199;;-1:-1:-1;;;39207:199:0;;;;;;;;;;;;;;39359:4;39207:199;;;;;;-1:-1:-1;;;39207:199:0;;;;;;;;;;;;;;;;;;;;;29274:42;;39207:38;;39264:15;;39298:11;;39328:4;;39359;;30169:66;;39207:199;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39207:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39207:199:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39207:199:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;39207:199:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;39207:199:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;39207:199:0;;421:4:-1;412:14;;;;39207:199:0;;;;;412:14:-1;39207:199:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39207:199:0;;;;;;;;;;;39421:1;39407:4;:11;:15;39207:216;;;;;;;;;;;;;;39193:230;;38001:1441;;;;;;;;;:::o;39450:2605::-;39649:19;-1:-1:-1;;;;;39703:34:0;;39681:109;;;;;-1:-1:-1;;;39681:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39831:20;39801;;39913:65;39935:9;39959:8;39913:7;:65::i;:::-;39865:113;;-1:-1:-1;39865:113:0;-1:-1:-1;40033:69:0;-1:-1:-1;;;;;40033:30:0;;40064:20;39865:113;40033:69;:30;:69;:::i;:::-;40115:8;;-1:-1:-1;;;;;40196:47:0;;29715:42;40196:47;;:109;;-1:-1:-1;;;;;;40260:45:0;;29840:42;40260:45;40196:109;40178:1657;;;40332:13;-1:-1:-1;;;;;40349:47:0;;29715:42;40349:47;40348:91;;40438:1;40348:91;;;40417:1;40348:91;40332:107;;;-1:-1:-1;40461:12:0;40456:281;40487:6;40479:14;;:5;:14;;;40456:281;;;40557:10;-1:-1:-1;;;;;40527:40:0;:13;-1:-1:-1;;;;;40527:19:0;;40547:5;40527:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40527:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40527:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40527:26:0;-1:-1:-1;;;;;40527:40:0;;40523:199;;;40596:5;40592:9;;40523:199;;;40661:7;-1:-1:-1;;;;;40631:37:0;:13;-1:-1:-1;;;;;40631:19:0;;40651:5;40631:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40631:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40631:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40631:26:0;-1:-1:-1;;;;;40631:37:0;;40627:95;;;40697:5;40693:9;;40627:95;40495:7;;40456:281;;;-1:-1:-1;40753:58:0;;;-1:-1:-1;;;40753:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40753:22:0;;;;;:58;;;;;-1:-1:-1;;40753:58:0;;;;;;;-1:-1:-1;40753:22:0;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;40753:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40753:58:0;;;;40178:1657;;;;40902:42;41032;41122:1;-1:-1:-1;;;;;41142:45:0;;;;41138:198;;;-1:-1:-1;41217:1:0;41138:198;;;41268:21;-1:-1:-1;;;;;41244:45:0;:20;-1:-1:-1;;;;;41244:45:0;;41240:96;;;-1:-1:-1;41319:1:0;41240:96;41357:12;41352:303;41383:6;41375:14;;:5;:14;;;41352:303;;;41464:10;-1:-1:-1;;;;;41423:51:0;:13;-1:-1:-1;;;;;41423:30:0;;41454:5;41423:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41423:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41423:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41423:37:0;-1:-1:-1;;;;;41423:51:0;;41419:221;;;41503:5;41499:9;;41419:221;;;41579:7;-1:-1:-1;;;;;41538:48:0;:13;-1:-1:-1;;;;;41538:30:0;;41569:5;41538:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41538:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41538:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41538:37:0;-1:-1:-1;;;;;41538:48:0;;41534:106;;;41615:5;41611:9;;41534:106;41391:7;;41352:303;;;-1:-1:-1;41671:152:0;;;-1:-1:-1;;;41671:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41671:33:0;;;;;:152;;;;;-1:-1:-1;;41671:152:0;;;;;;;-1:-1:-1;41671:33:0;:152;;;5:2:-1;;;;30:1;27;20:12;5:2;41671:152:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41671:152:0;;;;40178:1657;;;;-1:-1:-1;;;;;41851:21:0;;30066:42;41851:21;;:46;;-1:-1:-1;;;;;;41876:21:0;;;41851:46;41847:201;;;41928:21;41914:35;;41847:201;;;41996:40;;;-1:-1:-1;;;41996:40:0;;42030:4;41996:40;;;;;;-1:-1:-1;;;;;41996:25:0;;;;;:40;;;;;;;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;41996:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41996:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41996:40:0;;-1:-1:-1;41847:201:0;39450:2605;;;;;;;;;;;;:::o;2612:659::-;2672:4;3171:20;;3001:66;3220:23;;;;;;:42;;-1:-1:-1;;3247:15:0;;;3212:51;-1:-1:-1;;2612:659:0:o
Swarm Source
bzzr://fb175b11bd53853bf95e36ec0f13ff5b2f9d1d7c63904a9ce9b3514460b7a668
Loading...
Loading
Loading...
Loading
OVERVIEW
Swap assets on Uniswap, Balancer, CurveMultichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.