Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x7349774822c9e0fc6872aaef3d6d06e03e5fef5094a25c756ac106cb8b381586 | Simple Swap | (pending) | 9 days ago | IN | 0.0025 ETH | (Pending) | |||
Swap On Uniswap | 20453460 | 308 days ago | IN | 0 ETH | 0.0002108 | ||||
Swap On Uniswap | 20453460 | 308 days ago | IN | 0 ETH | 0.00018268 | ||||
Swap On Uniswap ... | 20452722 | 308 days ago | IN | 0.01196964 ETH | 0.0001432 | ||||
Swap On Uniswap ... | 20251980 | 336 days ago | IN | 0.004 ETH | 0.00013172 | ||||
Swap On Uniswap | 20228330 | 339 days ago | IN | 0 ETH | 0.00092456 | ||||
Swap On Uniswap ... | 20202016 | 343 days ago | IN | 0.03 ETH | 0.0088641 | ||||
Swap On Uniswap | 19358807 | 461 days ago | IN | 0.001 ETH | 0.01537558 | ||||
Simple Swap | 16030319 | 928 days ago | IN | 1 wei | 0.00247802 | ||||
Simple Swap | 15559339 | 994 days ago | IN | 0 ETH | 0.00037777 | ||||
Simple Swap | 15291922 | 1036 days ago | IN | 0.1 ETH | 0.00038453 | ||||
Swap On Uniswap | 15256504 | 1042 days ago | IN | 0 ETH | 0.00029212 | ||||
Simple Swap | 15247122 | 1043 days ago | IN | 0 ETH | 0.00061863 | ||||
Swap On Uniswap ... | 15246598 | 1043 days ago | IN | 0.003 ETH | 0.00082786 | ||||
Swap On Uniswap | 15243418 | 1044 days ago | IN | 0 ETH | 0.00058397 | ||||
Swap On Uniswap ... | 15106938 | 1065 days ago | IN | 0.01 ETH | 0.00063359 | ||||
Swap On Uniswap | 15066917 | 1071 days ago | IN | 0.05 ETH | 0.00061299 | ||||
Transfer | 15066571 | 1071 days ago | IN | 0.001 ETH | 0.00158754 | ||||
Swap On Uniswap | 15066569 | 1071 days ago | IN | 0.01 ETH | 0.00062812 | ||||
Simple Swap | 14863694 | 1106 days ago | IN | 0.000005 ETH | 0.00064233 | ||||
Simple Swap | 14863603 | 1106 days ago | IN | 0.0000087 ETH | 0.00064233 | ||||
Simple Swap | 14863540 | 1106 days ago | IN | 0.0000007 ETH | 0.00064198 | ||||
Simple Swap | 14863506 | 1106 days ago | IN | 0.000003 ETH | 0.00077771 | ||||
Simple Swap | 14863503 | 1106 days ago | IN | 0.000008 ETH | 0.00077771 | ||||
Simple Swap | 14863503 | 1106 days ago | IN | 0.000006 ETH | 0.00064233 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Deposit | 20452722 | 308 days ago | 0.01196964 ETH | ||||
Deposit | 20251980 | 336 days ago | 0.004 ETH | ||||
Deposit | 20251084 | 336 days ago | 0.15 ETH | ||||
Simple Swap | 20251084 | 336 days ago | 0.15 ETH | ||||
Deposit | 20202016 | 343 days ago | 0.03 ETH | ||||
Deposit | 19358807 | 461 days ago | 0.001 ETH | ||||
Transfer | 17129340 | 774 days ago | 0.06967896 ETH | ||||
Simple Swap | 17129340 | 774 days ago | 0.06967896 ETH | ||||
Deposit | 16030319 | 928 days ago | 1 wei | ||||
Deposit | 15567098 | 993 days ago | 0.0085 ETH | ||||
Simple Swap | 15567098 | 993 days ago | 0.0085 ETH | ||||
Deposit | 15559611 | 994 days ago | 0.005 ETH | ||||
Simple Swap | 15559611 | 994 days ago | 0.005 ETH | ||||
Transfer | 15559339 | 994 days ago | 0.01374287 ETH | ||||
Deposit | 15427807 | 1014 days ago | 0.002 ETH | ||||
Simple Swap | 15427807 | 1014 days ago | 0.002 ETH | ||||
Swap | 15291922 | 1036 days ago | 0.1 ETH | ||||
Transfer | 15247122 | 1043 days ago | 0.00857955 ETH | ||||
Transfer | 15247122 | 1043 days ago | 0.00004114 ETH | ||||
Transfer | 15247122 | 1043 days ago | 0.00004114 ETH | ||||
Transfer | 15247122 | 1043 days ago | 0.00766183 ETH | ||||
Deposit | 15246598 | 1043 days ago | 0.003 ETH | ||||
Deposit | 15196793 | 1051 days ago | 0.00015 ETH | ||||
Simple Swap | 15196793 | 1051 days ago | 0.00015 ETH | ||||
Deposit | 15196793 | 1051 days ago | 0.00015 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
AugustusSwapper
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-02 */ // File: original_contracts/IWhitelisted.sol pragma solidity 0.7.5; interface IWhitelisted { function hasRole( bytes32 role, address account ) external view returns (bool); function WHITELISTED_ROLE() external view returns(bytes32); } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: original_contracts/lib/IExchange.sol pragma solidity 0.7.5; /** * @dev This interface should be implemented by all exchanges which needs to integrate with the paraswap protocol */ interface IExchange { /** * @dev The function which performs the swap on an exchange. * Exchange needs to implement this method in order to support swapping of tokens through it * @param fromToken Address of the source token * @param toToken Address of the destination token * @param fromAmount Amount of source tokens to be swapped * @param toAmount Minimum destination token amount expected out of this swap * @param exchange Internal exchange or factory contract address for the exchange. For example Registry address for the Uniswap * @param payload Any exchange specific data which is required can be passed in this argument in encoded format which * will be decoded by the exchange. Each exchange will publish it's own decoding/encoding mechanism */ //TODO: REMOVE RETURN STATEMENT function swap( IERC20 fromToken, IERC20 toToken, uint256 fromAmount, uint256 toAmount, address exchange, bytes calldata payload) external payable; /** * @dev The function which performs the swap on an exchange. * Exchange needs to implement this method in order to support swapping of tokens through it * @param fromToken Address of the source token * @param toToken Address of the destination token * @param fromAmount Max Amount of source tokens to be swapped * @param toAmount Destination token amount expected out of this swap * @param exchange Internal exchange or factory contract address for the exchange. For example Registry address for the Uniswap * @param payload Any exchange specific data which is required can be passed in this argument in encoded format which * will be decoded by the exchange. Each exchange will publish it's own decoding/encoding mechanism */ function buy( IERC20 fromToken, IERC20 toToken, uint256 fromAmount, uint256 toAmount, address exchange, bytes calldata payload) external payable; /** * @dev This function is used to perform onChainSwap. It build all the parameters onchain. Basically the information * encoded in payload param of swap will calculated in this case * Exchange needs to implement this method in order to support swapping of tokens through it * @param fromToken Address of the source token * @param toToken Address of the destination token * @param fromAmount Amount of source tokens to be swapped * @param toAmount Minimum destination token amount expected out of this swap */ function onChainSwap( IERC20 fromToken, IERC20 toToken, uint256 fromAmount, uint256 toAmount ) external payable returns (uint256); /** * @dev Certain adapters/exchanges needs to be initialized. * This method will be called from Augustus */ function initialize(bytes calldata data) external; /** * @dev Returns unique identifier for the adapter */ function getKey() external pure returns(bytes32); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: original_contracts/lib/SafeERC20.sol pragma solidity 0.7.5; library Address { function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // 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)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: original_contracts/ITokenTransferProxy.sol pragma solidity 0.7.5; interface ITokenTransferProxy { function transferFrom( address token, address from, address to, uint256 amount ) external; function freeReduxTokens(address user, uint256 tokensToFree) external; } // File: original_contracts/lib/Utils.sol pragma solidity 0.7.5; library Utils { using SafeMath for uint256; using SafeERC20 for IERC20; address constant ETH_ADDRESS = address( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); address constant WETH_ADDRESS = address( 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 ); uint256 constant MAX_UINT = 2 ** 256 - 1; /** * @param fromToken Address of the source token * @param toToken Address of the destination token * @param fromAmount Amount of source tokens to be swapped * @param toAmount Minimum destination token amount expected out of this swap * @param expectedAmount Expected amount of destination tokens without slippage * @param beneficiary Beneficiary address * 0 then 100% will be transferred to beneficiary. Pass 10000 for 100% * @param referrer referral id * @param path Route to be taken for this swap to take place */ struct SellData { address fromToken; uint256 fromAmount; uint256 toAmount; uint256 expectedAmount; address payable beneficiary; string referrer; bool useReduxToken; Utils.Path[] path; } struct MegaSwapSellData { address fromToken; uint256 fromAmount; uint256 toAmount; uint256 expectedAmount; address payable beneficiary; string referrer; bool useReduxToken; Utils.MegaSwapPath[] path; } struct BuyData { address fromToken; address toToken; uint256 fromAmount; uint256 toAmount; address payable beneficiary; string referrer; bool useReduxToken; Utils.BuyRoute[] route; } struct Route { address payable exchange; address targetExchange; uint percent; bytes payload; uint256 networkFee;//Network fee is associated with 0xv3 trades } struct MegaSwapPath { uint256 fromAmountPercent; Path[] path; } struct Path { address to; uint256 totalNetworkFee;//Network fee is associated with 0xv3 trades Route[] routes; } struct BuyRoute { address payable exchange; address targetExchange; uint256 fromAmount; uint256 toAmount; bytes payload; uint256 networkFee;//Network fee is associated with 0xv3 trades } function ethAddress() internal pure returns (address) {return ETH_ADDRESS;} function wethAddress() internal pure returns (address) {return WETH_ADDRESS;} function maxUint() internal pure returns (uint256) {return MAX_UINT;} function approve( address addressToApprove, address token, uint256 amount ) internal { if (token != ETH_ADDRESS) { IERC20 _token = IERC20(token); uint allowance = _token.allowance(address(this), addressToApprove); if (allowance < amount) { _token.safeApprove(addressToApprove, 0); _token.safeIncreaseAllowance(addressToApprove, MAX_UINT); } } } function transferTokens( address token, address payable destination, uint256 amount ) internal { if (amount > 0) { if (token == ETH_ADDRESS) { (bool result, ) = destination.call{value: amount, gas: 4000}(""); require(result, "Failed to transfer Ether"); } else { IERC20(token).safeTransfer(destination, amount); } } } function tokenBalance( address token, address account ) internal view returns (uint256) { if (token == ETH_ADDRESS) { return account.balance; } else { return IERC20(token).balanceOf(account); } } /** * @dev Helper method to refund gas using gas tokens */ function refundGas( address account, address tokenTransferProxy, uint256 initialGas ) internal { uint256 freeBase = 14154; uint256 freeToken = 6870; uint256 reimburse = 24000; uint256 tokens = initialGas.sub( gasleft()).add(freeBase).div(reimburse.mul(2).sub(freeToken) ); freeGasTokens(account, tokenTransferProxy, tokens); } /** * @dev Helper method to free gas tokens */ function freeGasTokens(address account, address tokenTransferProxy, uint256 tokens) internal { uint256 tokensToFree = tokens; uint256 safeNumTokens = 0; uint256 gas = gasleft(); if (gas >= 27710) { safeNumTokens = gas.sub(27710).div(1148 + 5722 + 150); } if (tokensToFree > safeNumTokens) { tokensToFree = safeNumTokens; } ITokenTransferProxy(tokenTransferProxy).freeReduxTokens(account, tokensToFree); } } // File: openzeppelin-solidity/contracts/GSN/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: openzeppelin-solidity/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: original_contracts/IReduxToken.sol pragma solidity 0.7.5; interface IReduxToken { function freeUpTo(uint256 value) external returns (uint256 freed); function freeFromUpTo(address from, uint256 value) external returns (uint256 freed); function mint(uint256 value) external; } // File: original_contracts/TokenTransferProxy.sol pragma solidity 0.7.5; /** * @dev Allows owner of the contract to transfer tokens on behalf of user. * User will need to approve this contract to spend tokens on his/her behalf * on Paraswap platform */ contract TokenTransferProxy is Ownable, ITokenTransferProxy { using SafeERC20 for IERC20; IReduxToken public reduxToken; constructor(address _reduxToken) public { reduxToken = IReduxToken(_reduxToken); } /** * @dev Allows owner of the contract to transfer tokens on user's behalf * @dev Swapper contract will be the owner of this contract * @param token Address of the token * @param from Address from which tokens will be transferred * @param to Receipent address of the tokens * @param amount Amount of tokens to transfer */ function transferFrom( address token, address from, address to, uint256 amount ) external override onlyOwner { IERC20(token).safeTransferFrom(from, to, amount); } function freeReduxTokens(address user, uint256 tokensToFree) external override onlyOwner { reduxToken.freeFromUpTo(user, tokensToFree); } } // File: original_contracts/IPartnerRegistry.sol pragma solidity 0.7.5; interface IPartnerRegistry { function getPartnerContract(string calldata referralId) external view returns(address); } // File: original_contracts/IPartner.sol pragma solidity 0.7.5; interface IPartner { function getPartnerInfo() external view returns( address payable feeWallet, uint256 fee, uint256 partnerShare, uint256 paraswapShare, bool positiveSlippageToUser, bool noPositiveSlippage ); } // File: original_contracts/lib/TokenFetcherAugustus.sol pragma solidity 0.7.5; contract TokenFetcherAugustus { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } /** * @dev Allows owner of the contract to transfer any tokens which are assigned to the contract * This method is for safety if by any chance tokens or ETHs are assigned to the contract by mistake * @dev token Address of the token to be transferred * @dev destination Recepient of the token * @dev amount Amount of tokens to be transferred */ function transferTokens( address token, address payable destination, uint256 amount ) external onlyOwner { Utils.transferTokens(token, destination, amount); } } // File: original_contracts/IWETH.sol pragma solidity 0.7.5; abstract contract IWETH is IERC20 { function deposit() external virtual payable; function withdraw(uint256 amount) external virtual; } // File: original_contracts/IUniswapProxy.sol pragma solidity 0.7.5; interface IUniswapProxy { function swapOnUniswap( uint256 amountIn, uint256 amountOutMin, address[] calldata path ) external returns (uint256); function swapOnUniswapFork( address factory, bytes32 initCode, uint256 amountIn, uint256 amountOutMin, address[] calldata path ) external returns (uint256); function buyOnUniswap( uint256 amountInMax, uint256 amountOut, address[] calldata path ) external returns (uint256 tokensSold); function buyOnUniswapFork( address factory, bytes32 initCode, uint256 amountInMax, uint256 amountOut, address[] calldata path ) external returns (uint256 tokensSold); function setupTokenSpender(address tokenSpender) external; } // File: original_contracts/AdapterStorage.sol pragma solidity 0.7.5; contract AdapterStorage { mapping (bytes32 => bool) internal adapterInitialized; mapping (bytes32 => bytes) internal adapterVsData; ITokenTransferProxy internal _tokenTransferProxy; function isInitialized(bytes32 key) public view returns(bool) { return adapterInitialized[key]; } function getData(bytes32 key) public view returns(bytes memory) { return adapterVsData[key]; } function getTokenTransferProxy() public view returns (address) { return address(_tokenTransferProxy); } } // File: original_contracts/AugustusSwapper.sol pragma solidity 0.7.5; pragma experimental ABIEncoderV2; contract AugustusSwapper is AdapterStorage, TokenFetcherAugustus { using SafeMath for uint256; IWhitelisted private _whitelisted; IPartnerRegistry private _partnerRegistry; address payable private _feeWallet; address private _uniswapProxy; address private _pendingUniswapProxy; uint256 private _changeRequestedBlock; //Number of blocks after which UniswapProxy change can be confirmed uint256 private _timelock; event Swapped( address initiator, address indexed beneficiary, address indexed srcToken, address indexed destToken, uint256 srcAmount, uint256 receivedAmount, uint256 expectedAmount, string referrer ); event Bought( address initiator, address indexed beneficiary, address indexed srcToken, address indexed destToken, uint256 srcAmount, uint256 receivedAmount, string referrer ); event FeeTaken( uint256 fee, uint256 partnerShare, uint256 paraswapShare ); event AdapterInitialized(address indexed adapter); modifier onlySelf() { require( msg.sender == address(this), "AugustusSwapper: Invalid access" ); _; } receive () payable external { } function getTimeLock() external view returns(uint256) { return _timelock; } function initialize( address whitelist, address reduxToken, address partnerRegistry, address payable feeWallet, address uniswapProxy, uint256 timelock ) external { require(address(_tokenTransferProxy) == address(0), "Contract already initialized!!"); _partnerRegistry = IPartnerRegistry(partnerRegistry); TokenTransferProxy lTokenTransferProxy = new TokenTransferProxy(reduxToken); _tokenTransferProxy = ITokenTransferProxy(lTokenTransferProxy); _whitelisted = IWhitelisted(whitelist); _feeWallet = feeWallet; _uniswapProxy = uniswapProxy; _owner = msg.sender; _timelock = timelock; } function initializeAdapter(address adapter, bytes calldata data) external onlyOwner { require( _whitelisted.hasRole(_whitelisted.WHITELISTED_ROLE(), adapter), "Exchange not whitelisted" ); (bool success,) = adapter.delegatecall(abi.encodeWithSelector(IExchange.initialize.selector, data)); require(success, "Failed to initialize adapter"); emit AdapterInitialized(adapter); } function getPendingUniswapProxy() external view returns(address) { return _pendingUniswapProxy; } function getChangeRequestedBlock() external view returns(uint256) { return _changeRequestedBlock; } function getUniswapProxy() external view returns(address) { return _uniswapProxy; } function getVersion() external view returns(string memory) { return "4.0.0"; } function getPartnerRegistry() external view returns(address) { return address(_partnerRegistry); } function getWhitelistAddress() external view returns(address) { return address(_whitelisted); } function getFeeWallet() external view returns(address) { return _feeWallet; } function changeUniswapProxy(address uniswapProxy) external onlyOwner { require(uniswapProxy != address(0), "Invalid address"); _changeRequestedBlock = block.number; _pendingUniswapProxy = uniswapProxy; } function confirmUniswapProxyChange() external onlyOwner { require( block.number >= _changeRequestedBlock.add(_timelock), "Time lock check failed" ); require(_pendingUniswapProxy != address(0), "No pending request"); _changeRequestedBlock = 0; _uniswapProxy = _pendingUniswapProxy; _pendingUniswapProxy = address(0); } function setFeeWallet(address payable feeWallet) external onlyOwner { require(feeWallet != address(0), "Invalid address"); _feeWallet = feeWallet; } function setPartnerRegistry(address partnerRegistry) external onlyOwner { require(partnerRegistry != address(0), "Invalid address"); _partnerRegistry = IPartnerRegistry(partnerRegistry); } function setWhitelistAddress(address whitelisted) external onlyOwner { require(whitelisted != address(0), "Invalid whitelist address"); _whitelisted = IWhitelisted(whitelisted); } function swapOnUniswap( uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8 referrer ) external payable { //DELEGATING CALL TO THE ADAPTER (bool success, bytes memory result) = _uniswapProxy.delegatecall( abi.encodeWithSelector( IUniswapProxy.swapOnUniswap.selector, amountIn, amountOutMin, path ) ); require(success, "Call to uniswap proxy failed"); } function buyOnUniswap( uint256 amountInMax, uint256 amountOut, address[] calldata path, uint8 referrer ) external payable { //DELEGATING CALL TO THE ADAPTER (bool success, bytes memory result) = _uniswapProxy.delegatecall( abi.encodeWithSelector( IUniswapProxy.buyOnUniswap.selector, amountInMax, amountOut, path ) ); require(success, "Call to uniswap proxy failed"); } function buyOnUniswapFork( address factory, bytes32 initCode, uint256 amountInMax, uint256 amountOut, address[] calldata path, uint8 referrer ) external payable { //DELEGATING CALL TO THE ADAPTER (bool success, bytes memory result) = _uniswapProxy.delegatecall( abi.encodeWithSelector( IUniswapProxy.buyOnUniswapFork.selector, factory, initCode, amountInMax, amountOut, path ) ); require(success, "Call to uniswap proxy failed"); } function swapOnUniswapFork( address factory, bytes32 initCode, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8 referrer ) external payable { //DELEGATING CALL TO THE ADAPTER (bool success, bytes memory result) = _uniswapProxy.delegatecall( abi.encodeWithSelector( IUniswapProxy.swapOnUniswapFork.selector, factory, initCode, amountIn, amountOutMin, path ) ); require(success, "Call to uniswap proxy failed"); } function simplBuy( address fromToken, address toToken, uint256 fromAmount, uint256 toAmount, address[] memory callees, bytes memory exchangeData, uint256[] memory startIndexes, uint256[] memory values, address payable beneficiary, string memory referrer, bool useReduxToken ) external payable { beneficiary = beneficiary == address(0) ? msg.sender : beneficiary; uint receivedAmount = performSimpleSwap( fromToken, toToken, fromAmount, toAmount, toAmount,//expected amount and to amount are same in case of buy callees, exchangeData, startIndexes, values, beneficiary, referrer, useReduxToken ); uint256 remainingAmount = Utils.tokenBalance( fromToken, address(this) ); if (remainingAmount > 0) { Utils.transferTokens(address(fromToken), msg.sender, remainingAmount); } emit Bought( msg.sender, beneficiary, fromToken, toToken, fromAmount, receivedAmount, referrer ); } function approve( address token, address to, uint256 amount ) external onlySelf { Utils.approve(to, token, amount); } function simpleSwap( address fromToken, address toToken, uint256 fromAmount, uint256 toAmount, uint256 expectedAmount, address[] memory callees, bytes memory exchangeData, uint256[] memory startIndexes, uint256[] memory values, address payable beneficiary, string memory referrer, bool useReduxToken ) public payable returns (uint256 receivedAmount) { beneficiary = beneficiary == address(0) ? msg.sender : beneficiary; receivedAmount = performSimpleSwap( fromToken, toToken, fromAmount, toAmount, expectedAmount, callees, exchangeData, startIndexes, values, beneficiary, referrer, useReduxToken ); emit Swapped( msg.sender, beneficiary, fromToken, toToken, fromAmount, receivedAmount, expectedAmount, referrer ); return receivedAmount; } function transferTokensFromProxy( address token, uint256 amount ) private { if (token != Utils.ethAddress()) { _tokenTransferProxy.transferFrom( token, msg.sender, address(this), amount ); } } function performSimpleSwap( address fromToken, address toToken, uint256 fromAmount, uint256 toAmount, uint256 expectedAmount, address[] memory callees, bytes memory exchangeData, uint256[] memory startIndexes, uint256[] memory values, address payable beneficiary, string memory referrer, bool useReduxToken ) private returns (uint256 receivedAmount) { require(toAmount > 0, "toAmount is too low"); require( callees.length + 1 == startIndexes.length, "Start indexes must be 1 greater then number of callees" ); uint initialGas = gasleft(); //If source token is not ETH than transfer required amount of tokens //from sender to this contract transferTokensFromProxy(fromToken, fromAmount); for (uint256 i = 0; i < callees.length; i++) { require( callees[i] != address(_tokenTransferProxy), "Can not call TokenTransferProxy Contract" ); bool result = externalCall( callees[i], //destination values[i], //value to send startIndexes[i], // start index of call data startIndexes[i + 1].sub(startIndexes[i]), // length of calldata exchangeData// total calldata ); require(result, "External call failed"); } receivedAmount = Utils.tokenBalance( toToken, address(this) ); require( receivedAmount >= toAmount, "Received amount of tokens are less then expected" ); takeFeeAndTransferTokens( toToken, expectedAmount, receivedAmount, beneficiary, referrer ); if (useReduxToken) { Utils.refundGas(msg.sender, address(_tokenTransferProxy), initialGas); } return receivedAmount; } /** * @dev This function sends the WETH returned during the exchange to the user. * @param token: The WETH Address */ function withdrawAllWETH(IWETH token) external onlySelf { uint256 amount = token.balanceOf(address(this)); token.withdraw(amount); } /** * @dev The function which performs the multi path swap. * @param data Data required to perform swap. */ function multiSwap( Utils.SellData memory data ) public payable returns (uint256) { uint initialGas = gasleft(); address fromToken = data.fromToken; uint256 fromAmount = data.fromAmount; uint256 toAmount = data.toAmount; uint256 expectedAmount = data.expectedAmount; address payable beneficiary = data.beneficiary == address(0) ? msg.sender : data.beneficiary; string memory referrer = data.referrer; Utils.Path[] memory path = data.path; address toToken = path[path.length - 1].to; bool useReduxToken = data.useReduxToken; //Referral can never be empty require(bytes(referrer).length > 0, "Invalid referrer"); require(toAmount > 0, "To amount can not be 0"); //if fromToken is not ETH then transfer tokens from user to this contract if (fromToken != Utils.ethAddress()) { _tokenTransferProxy.transferFrom( fromToken, msg.sender, address(this), fromAmount ); } performSwap( fromToken, fromAmount, path ); uint256 receivedAmount = Utils.tokenBalance( toToken, address(this) ); require( receivedAmount >= toAmount, "Received amount of tokens are less then expected" ); takeFeeAndTransferTokens( toToken, expectedAmount, receivedAmount, beneficiary, referrer ); if (useReduxToken) { Utils.refundGas(msg.sender, address(_tokenTransferProxy), initialGas); } emit Swapped( msg.sender, beneficiary, fromToken, toToken, fromAmount, receivedAmount, expectedAmount, referrer ); return receivedAmount; } /** * @dev The function which performs the mega path swap. * @param data Data required to perform swap. */ function megaSwap( Utils.MegaSwapSellData memory data ) public payable returns (uint256) { uint initialGas = gasleft(); address fromToken = data.fromToken; uint256 fromAmount = data.fromAmount; uint256 toAmount = data.toAmount; uint256 expectedAmount = data.expectedAmount; address payable beneficiary = data.beneficiary == address(0) ? msg.sender : data.beneficiary; string memory referrer = data.referrer; Utils.MegaSwapPath[] memory path = data.path; address toToken = path[0].path[path[0].path.length - 1].to; bool useReduxToken = data.useReduxToken; //Referral can never be empty require(bytes(referrer).length > 0, "Invalid referrer"); require(toAmount > 0, "To amount can not be 0"); //if fromToken is not ETH then transfer tokens from user to this contract if (fromToken != Utils.ethAddress()) { _tokenTransferProxy.transferFrom( fromToken, msg.sender, address(this), fromAmount ); } for (uint8 i = 0; i < uint8(path.length); i++) { uint256 _fromAmount = fromAmount.mul(path[i].fromAmountPercent).div(10000); if (i == path.length - 1) { _fromAmount = Utils.tokenBalance(address(fromToken), address(this)); } performSwap( fromToken, _fromAmount, path[i].path ); } uint256 receivedAmount = Utils.tokenBalance( toToken, address(this) ); require( receivedAmount >= toAmount, "Received amount of tokens are less then expected" ); takeFeeAndTransferTokens( toToken, expectedAmount, receivedAmount, beneficiary, referrer ); if (useReduxToken) { Utils.refundGas(msg.sender, address(_tokenTransferProxy), initialGas); } emit Swapped( msg.sender, beneficiary, fromToken, toToken, fromAmount, receivedAmount, expectedAmount, referrer ); return receivedAmount; } /** * @dev The function which performs the single path buy. * @param data Data required to perform swap. */ function buy( Utils.BuyData memory data ) public payable returns (uint256) { address fromToken = data.fromToken; uint256 fromAmount = data.fromAmount; uint256 toAmount = data.toAmount; address payable beneficiary = data.beneficiary == address(0) ? msg.sender : data.beneficiary; string memory referrer = data.referrer; Utils.BuyRoute[] memory route = data.route; address toToken = data.toToken; bool useReduxToken = data.useReduxToken; //Referral id can never be empty require(bytes(referrer).length > 0, "Invalid referrer"); require(toAmount > 0, "To amount can not be 0"); uint256 receivedAmount = performBuy( fromToken, toToken, fromAmount, toAmount, route, useReduxToken ); takeFeeAndTransferTokens( toToken, toAmount, receivedAmount, beneficiary, referrer ); uint256 remainingAmount = Utils.tokenBalance( fromToken, address(this) ); if (remainingAmount > 0) { Utils.transferTokens(fromToken, msg.sender, remainingAmount); } emit Bought( msg.sender, beneficiary, fromToken, toToken, fromAmount, receivedAmount, referrer ); return receivedAmount; } //Helper function to transfer final amount to the beneficiaries function takeFeeAndTransferTokens( address toToken, uint256 expectedAmount, uint256 receivedAmount, address payable beneficiary, string memory referrer ) private { uint256 remainingAmount = receivedAmount; address partnerContract = _partnerRegistry.getPartnerContract(referrer); //Take partner fee ( uint256 fee ) = _takeFee( toToken, receivedAmount, expectedAmount, partnerContract ); remainingAmount = receivedAmount.sub(fee); //If there is a positive slippage after taking partner fee then 50% goes to paraswap and 50% to the user if ((remainingAmount > expectedAmount) && fee == 0) { uint256 positiveSlippageShare = remainingAmount.sub(expectedAmount).div(2); remainingAmount = remainingAmount.sub(positiveSlippageShare); Utils.transferTokens(toToken, _feeWallet, positiveSlippageShare); } Utils.transferTokens(toToken, beneficiary, remainingAmount); } /** * @dev Source take from GNOSIS MultiSigWallet * @dev https://github.com/gnosis/MultiSigWallet/blob/master/contracts/MultiSigWallet.sol */ function externalCall( address destination, uint256 value, uint256 dataOffset, uint dataLength, bytes memory data ) private returns (bool) { bool result = false; assembly { let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that result := call( sub(gas(), 34710), // 34710 is the value that solidity is currently emitting // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) + // callNewAccountGas (25000, in case the destination address does not exist and needs creating) destination, value, add(d, dataOffset), dataLength, // Size of the input (in bytes) - this is what fixes the padding problem x, 0 // Output is ignored, therefore the output size is zero ) } return result; } //Helper function to perform swap function performSwap( address fromToken, uint256 fromAmount, Utils.Path[] memory path ) private { require(path.length > 0, "Path not provided for swap"); //Assuming path will not be too long to reach out of gas exception for (uint i = 0; i < path.length; i++) { //_fromToken will be either fromToken or toToken of the previous path address _fromToken = i > 0 ? path[i - 1].to : fromToken; address _toToken = path[i].to; uint256 _fromAmount = i > 0 ? Utils.tokenBalance(_fromToken, address(this)) : fromAmount; if (i > 0 && _fromToken == Utils.ethAddress()) { _fromAmount = _fromAmount.sub(path[i].totalNetworkFee); } for (uint j = 0; j < path[i].routes.length; j++) { Utils.Route memory route = path[i].routes[j]; //Check if exchange is supported require( _whitelisted.hasRole(_whitelisted.WHITELISTED_ROLE(), route.exchange), "Exchange not whitelisted" ); //Calculating tokens to be passed to the relevant exchange //percentage should be 200 for 2% uint fromAmountSlice = _fromAmount.mul(route.percent).div(10000); uint256 value = route.networkFee; if (i > 0 && j == path[i].routes.length.sub(1)) { uint256 remBal = Utils.tokenBalance(address(_fromToken), address(this)); fromAmountSlice = remBal; if (address(_fromToken) == Utils.ethAddress()) { //subtract network fee fromAmountSlice = fromAmountSlice.sub(value); } } //DELEGATING CALL TO THE ADAPTER (bool success,) = route.exchange.delegatecall( abi.encodeWithSelector( IExchange.swap.selector, _fromToken, _toToken, fromAmountSlice, 1, route.targetExchange, route.payload ) ); require(success, "Call to adapter failed"); } } } //Helper function to perform swap function performBuy( address fromToken, address toToken, uint256 fromAmount, uint256 toAmount, Utils.BuyRoute[] memory routes, bool useReduxToken ) private returns(uint256) { uint initialGas = gasleft(); //if fromToken is not ETH then transfer tokens from user to this contract if (fromToken != Utils.ethAddress()) { _tokenTransferProxy.transferFrom( fromToken, msg.sender, address(this), fromAmount ); } for (uint j = 0; j < routes.length; j++) { Utils.BuyRoute memory route = routes[j]; //Check if exchange is supported require( _whitelisted.hasRole(_whitelisted.WHITELISTED_ROLE(), route.exchange), "Exchange not whitelisted" ); //delegate Call to the exchange (bool success,) = route.exchange.delegatecall( abi.encodeWithSelector( IExchange.buy.selector, fromToken, toToken, route.fromAmount, route.toAmount, route.targetExchange, route.payload ) ); require(success, "Call to adapter failed"); } uint256 receivedAmount = Utils.tokenBalance( toToken, address(this) ); require( receivedAmount >= toAmount, "Received amount of tokens are less then expected tokens" ); if (useReduxToken) { Utils.refundGas(msg.sender, address(_tokenTransferProxy), initialGas); } return receivedAmount; } function _takeFee( address toToken, uint256 receivedAmount, uint256 expectedAmount, address partnerContract ) private returns(uint256 fee) { //If there is no partner associated with the referral id then no fee will be taken if (partnerContract == address(0)) { return (0); } ( address payable partnerFeeWallet, uint256 feePercent, uint256 partnerSharePercent, , bool positiveSlippageToUser, bool noPositiveSlippage ) = IPartner(partnerContract).getPartnerInfo(); uint256 partnerShare = 0; uint256 paraswapShare = 0; if (!noPositiveSlippage && feePercent <= 50 && receivedAmount > expectedAmount) { uint256 halfPositiveSlippage = receivedAmount.sub(expectedAmount).div(2); //Calculate total fee to be taken fee = expectedAmount.mul(feePercent).div(10000); //Calculate partner's share partnerShare = fee.mul(partnerSharePercent).div(10000); //All remaining fee is paraswap's share paraswapShare = fee.sub(partnerShare); paraswapShare = paraswapShare.add(halfPositiveSlippage); fee = fee.add(halfPositiveSlippage); if (!positiveSlippageToUser) { partnerShare = partnerShare.add(halfPositiveSlippage); fee = fee.add(halfPositiveSlippage); } } else { //Calculate total fee to be taken fee = receivedAmount.mul(feePercent).div(10000); //Calculate partner's share partnerShare = fee.mul(partnerSharePercent).div(10000); //All remaining fee is paraswap's share paraswapShare = fee.sub(partnerShare); } Utils.transferTokens(toToken, partnerFeeWallet, partnerShare); Utils.transferTokens(toToken, _feeWallet, paraswapShare); emit FeeTaken(fee, partnerShare, paraswapShare); return (fee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"adapter","type":"address"}],"name":"AdapterInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"srcToken","type":"address"},{"indexed":true,"internalType":"address","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"referrer","type":"string"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"partnerShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paraswapShare","type":"uint256"}],"name":"FeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"srcToken","type":"address"},{"indexed":true,"internalType":"address","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"referrer","type":"string"}],"name":"Swapped","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"string","name":"referrer","type":"string"},{"internalType":"bool","name":"useReduxToken","type":"bool"},{"components":[{"internalType":"address payable","name":"exchange","type":"address"},{"internalType":"address","name":"targetExchange","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"networkFee","type":"uint256"}],"internalType":"struct Utils.BuyRoute[]","name":"route","type":"tuple[]"}],"internalType":"struct Utils.BuyData","name":"data","type":"tuple"}],"name":"buy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8","name":"referrer","type":"uint8"}],"name":"buyOnUniswap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes32","name":"initCode","type":"bytes32"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8","name":"referrer","type":"uint8"}],"name":"buyOnUniswapFork","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"uniswapProxy","type":"address"}],"name":"changeUniswapProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmUniswapProxyChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChangeRequestedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPartnerRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingUniswapProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenTransferProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"whitelist","type":"address"},{"internalType":"address","name":"reduxToken","type":"address"},{"internalType":"address","name":"partnerRegistry","type":"address"},{"internalType":"address payable","name":"feeWallet","type":"address"},{"internalType":"address","name":"uniswapProxy","type":"address"},{"internalType":"uint256","name":"timelock","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initializeAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"string","name":"referrer","type":"string"},{"internalType":"bool","name":"useReduxToken","type":"bool"},{"components":[{"internalType":"uint256","name":"fromAmountPercent","type":"uint256"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"totalNetworkFee","type":"uint256"},{"components":[{"internalType":"address payable","name":"exchange","type":"address"},{"internalType":"address","name":"targetExchange","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"networkFee","type":"uint256"}],"internalType":"struct Utils.Route[]","name":"routes","type":"tuple[]"}],"internalType":"struct Utils.Path[]","name":"path","type":"tuple[]"}],"internalType":"struct Utils.MegaSwapPath[]","name":"path","type":"tuple[]"}],"internalType":"struct Utils.MegaSwapSellData","name":"data","type":"tuple"}],"name":"megaSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"string","name":"referrer","type":"string"},{"internalType":"bool","name":"useReduxToken","type":"bool"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"totalNetworkFee","type":"uint256"},{"components":[{"internalType":"address payable","name":"exchange","type":"address"},{"internalType":"address","name":"targetExchange","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"networkFee","type":"uint256"}],"internalType":"struct Utils.Route[]","name":"routes","type":"tuple[]"}],"internalType":"struct Utils.Path[]","name":"path","type":"tuple[]"}],"internalType":"struct Utils.SellData","name":"data","type":"tuple"}],"name":"multiSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"feeWallet","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"partnerRegistry","type":"address"}],"name":"setPartnerRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whitelisted","type":"address"}],"name":"setWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"address[]","name":"callees","type":"address[]"},{"internalType":"bytes","name":"exchangeData","type":"bytes"},{"internalType":"uint256[]","name":"startIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"string","name":"referrer","type":"string"},{"internalType":"bool","name":"useReduxToken","type":"bool"}],"name":"simplBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"internalType":"address[]","name":"callees","type":"address[]"},{"internalType":"bytes","name":"exchangeData","type":"bytes"},{"internalType":"uint256[]","name":"startIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"string","name":"referrer","type":"string"},{"internalType":"bool","name":"useReduxToken","type":"bool"}],"name":"simpleSwap","outputs":[{"internalType":"uint256","name":"receivedAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8","name":"referrer","type":"uint8"}],"name":"swapOnUniswap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes32","name":"initCode","type":"bytes32"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8","name":"referrer","type":"uint8"}],"name":"swapOnUniswapFork","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWETH","name":"token","type":"address"}],"name":"withdrawAllWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50615a2f806100206000396000f3fe608060405260043610620002355760003560e01c806395b6ef0c1162000139578063d2c4b59811620000c1578063ec1d21dd116200008b578063f7b637bb116200006d578063f7b637bb14620005d2578063f9355f721462000606578063f95a49eb146200061d576200023d565b8063ec1d21dd1462000596578063f2fde38b14620005ad576200023d565b8063d2c4b598146200050f578063db21e48d1462000527578063e1829cfe146200054c578063e1f21c671462000571576200023d565b8063a64b6e5f1162000103578063a64b6e5f14620004a3578063a745d5bd14620004c8578063b69bd7aa14620004e0578063cfc0afeb14620004f8576200023d565b806395b6ef0c146200042a578063a224c745146200044f578063a27e8b6b1462000474578063a4a6c336146200048b576200023d565b806354f6127f11620001bd5780638da5cb5b11620001875780638da5cb5b14620003be5780638f00eccb14620003d657806390d49b9d14620003ed578063915eb9731462000412576200023d565b806354f6127f146200034557806358b9d179146200036a578063715018a614620003815780638c3e9f461462000399576200023d565b80631880021911620001ff5780631880021914620002d95780632af3feb014620002fe5780633363522614620003165780635459060d146200032d576200023d565b80630863b7ac146200024257806308defdee146200025b5780630d8e6e2c146200028b578063119a5e9614620002b2576200023d565b366200023d57005b600080fd5b620002596200025336600462003e94565b62000634565b005b3480156200026857600080fd5b50620002736200078e565b604051620002829190620043e2565b60405180910390f35b3480156200029857600080fd5b50620002a36200079d565b604051620002829190620045f0565b348015620002bf57600080fd5b50620002ca620007d4565b60405162000282919062004d00565b348015620002e657600080fd5b5062000259620002f836600462003f1e565b620007da565b3480156200030b57600080fd5b506200027362000a8f565b620002596200032736600462003e94565b62000a9e565b3480156200033a57600080fd5b506200027362000af2565b3480156200035257600080fd5b50620002a36200036436600462003fc4565b62000b01565b620002596200037b366004620042bd565b62000bc4565b3480156200038e57600080fd5b506200025962000d0f565b348015620003a657600080fd5b5062000259620003b836600462003a6e565b62000d9e565b348015620003cb57600080fd5b506200027362000e2e565b620002ca620003e7366004620041d8565b62000e3d565b348015620003fa57600080fd5b50620002596200040c36600462003a6e565b620010a8565b3480156200041f57600080fd5b506200027362001138565b3480156200043757600080fd5b50620002596200044936600462003b61565b62001147565b3480156200045c57600080fd5b50620002596200046e36600462003a6e565b62001261565b620002596200048536600462003be4565b620012f1565b3480156200049857600080fd5b5062000259620013b6565b348015620004b057600080fd5b5062000259620004c236600462003b1c565b62001485565b348015620004d557600080fd5b50620002ca620014c4565b348015620004ed57600080fd5b5062000273620014ca565b620002ca6200050936600462003d28565b620014d9565b3480156200051c57600080fd5b506200027362001565565b3480156200053457600080fd5b50620002596200054636600462003a6e565b62001574565b3480156200055957600080fd5b50620002596200056b36600462003a6e565b62001608565b3480156200057e57600080fd5b50620002596200059036600462003b1c565b6200174a565b620002ca620005a7366004620040f3565b62001779565b348015620005ba57600080fd5b5062000259620005cc36600462003a6e565b620019d0565b348015620005df57600080fd5b50620005f7620005f136600462003fc4565b62001a9a565b60405162000282919062004581565b6200025962000617366004620042bd565b62001aaf565b620002ca6200062e36600462003ff6565b62001aff565b6007546040516000916060916001600160a01b03909116907ff5661034000000000000000000000000000000000000000000000000000000009062000688908c908c908c908c908c908c9060240162004531565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051620007139190620043c1565b600060405180830381855af49150503d806000811462000750576040519150601f19603f3d011682016040523d82523d6000602084013e62000755565b606091505b509150915081620007835760405162461bcd60e51b81526004016200077a90620048fa565b60405180910390fd5b505050505050505050565b6007546001600160a01b031690565b60408051808201909152600581527f342e302e30000000000000000000000000000000000000000000000000000000602082015290565b600a5490565b6003546001600160a01b03163314620008075760405162461bcd60e51b81526004016200077a9062004ad8565b60048054604080517f7a3226ec00000000000000000000000000000000000000000000000000000000815290516001600160a01b03909216926391d14854928492637a3226ec9281810192602092909190829003018186803b1580156200086d57600080fd5b505afa15801562000882573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008a8919062003fdd565b856040518363ffffffff1660e01b8152600401620008c89291906200458c565b60206040518083038186803b158015620008e157600080fd5b505afa158015620008f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200091c919062003fa5565b6200093b5760405162461bcd60e51b81526004016200077a906200499f565b6000836001600160a01b031663439fab9160e01b848460405160240162000964929190620045a3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051620009ef9190620043c1565b600060405180830381855af49150503d806000811462000a2c576040519150601f19603f3d011682016040523d82523d6000602084013e62000a31565b606091505b505090508062000a555760405162461bcd60e51b81526004016200077a9062004855565b6040516001600160a01b038516907f4aa65286df310c4e8390d962c75f50380b8260d96ea27cf14847cd683e22d9db90600090a250505050565b6008546001600160a01b031690565b6007546040516000916060916001600160a01b03909116907fc03786b0000000000000000000000000000000000000000000000000000000009062000688908c908c908c908c908c908c9060240162004531565b6006546001600160a01b031690565b60008181526001602081815260409283902080548451600294821615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911693909304601f8101839004830284018301909452838352606093909183018282801562000bb75780601f1062000b8b5761010080835404028352916020019162000bb7565b820191906000526020600020905b81548152906001019060200180831162000b9957829003601f168201915b505050505090505b919050565b6007546040516000916060916001600160a01b03909116907f54840d1a000000000000000000000000000000000000000000000000000000009062000c14908a908a908a908a9060240162004d09565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162000c9f9190620043c1565b600060405180830381855af49150503d806000811462000cdc576040519150601f19603f3d011682016040523d82523d6000602084013e62000ce1565b606091505b50915091508162000d065760405162461bcd60e51b81526004016200077a90620048fa565b50505050505050565b6003546001600160a01b0316331462000d3c5760405162461bcd60e51b81526004016200077a9062004ad8565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6003546001600160a01b0316331462000dcb5760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b03811662000df45760405162461bcd60e51b81526004016200077a906200463c565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6003546001600160a01b031690565b6000805a835160208501516040860151606087015160808801519495509293919290916000906001600160a01b03161562000e7d57876080015162000e7f565b335b60a089015160e08a01518051929350909160009082907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811062000ec257fe5b602002602001015160000151905060008b60c001519050600084511162000efd5760405162461bcd60e51b81526004016200077a906200488c565b6000871162000f205760405162461bcd60e51b81526004016200077a9062004cc9565b62000f2a62001c48565b6001600160a01b0316896001600160a01b03161462000fc9576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea9062000f94908c90339030908e9060040162004480565b600060405180830381600087803b15801562000faf57600080fd5b505af115801562000fc4573d6000803e3d6000fd5b505050505b62000fd689898562001c60565b600062000fe4833062002135565b905087811015620010095760405162461bcd60e51b81526004016200077a9062004b7b565b62001018838883898962002213565b81156200103957600254620010399033906001600160a01b03168d62002345565b826001600160a01b03168a6001600160a01b0316876001600160a01b03167f9cc2048b8af5eadff75759a3169b369efc538fb79c760fd396a4b355410b41b7338d868d8c6040516200109095949392919062004430565b60405180910390a49c9b505050505050505050505050565b6003546001600160a01b03163314620010d55760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b038116620010fe5760405162461bcd60e51b81526004016200077a906200463c565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6004546001600160a01b031690565b6002546001600160a01b031615620011735760405162461bcd60e51b81526004016200077a9062004968565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386161790556040516000908690620011b990620033d3565b620011c59190620043e2565b604051809103906000f080158015620011e2573d6000803e3d6000fd5b50600280547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617909155600480548216998316999099179098556006805489169582169590951790945550600780548716929093169190911790915560038054339516949094179093555050600a55565b6003546001600160a01b031633146200128e5760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b038116620012b75760405162461bcd60e51b81526004016200077a9062004764565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6001600160a01b038316156200130857826200130a565b335b92506000620013248c8c8c8c8d8d8d8d8d8d8d8d62002395565b90506000620013348d3062002135565b905080156200134a576200134a8d338362002579565b8b6001600160a01b03168d6001600160a01b0316866001600160a01b03167ff0be17aaae5a3633105aafe0689d8beb04dc66d5c51babf7086efebbb4e7ba82338f878a6040516200139f9493929190620043f6565b60405180910390a450505050505050505050505050565b6003546001600160a01b03163314620013e35760405162461bcd60e51b81526004016200077a9062004ad8565b600a54600954620013f4916200264b565b431015620014165760405162461bcd60e51b81526004016200077a9062004931565b6008546001600160a01b0316620014415760405162461bcd60e51b81526004016200077a90620049d6565b600060095560088054600780547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b6003546001600160a01b03163314620014b25760405162461bcd60e51b81526004016200077a9062004ad8565b620014bf83838362002579565b505050565b60095490565b6005546001600160a01b031690565b60006001600160a01b03841615620014f25783620014f4565b335b93506200150c8d8d8d8d8d8d8d8d8d8d8d8d62002395565b90508b6001600160a01b03168d6001600160a01b0316856001600160a01b03167f9cc2048b8af5eadff75759a3169b369efc538fb79c760fd396a4b355410b41b7338f868f8a6040516200109095949392919062004430565b6002546001600160a01b031690565b6003546001600160a01b03163314620015a15760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b038116620015ca5760405162461bcd60e51b81526004016200077a906200463c565b43600955600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b3330146200162a5760405162461bcd60e51b81526004016200077a9062004b0d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a082319062001674903090600401620043e2565b60206040518083038186803b1580156200168d57600080fd5b505afa158015620016a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016c8919062003fdd565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690632e1a7d4d906200171290849060040162004d00565b600060405180830381600087803b1580156200172d57600080fd5b505af115801562001742573d6000803e3d6000fd5b505050505050565b3330146200176c5760405162461bcd60e51b81526004016200077a9062004b0d565b620014bf82848362002673565b6000805a835160208501516040860151606087015160808801519495509293919290916000906001600160a01b031615620017b9578760800151620017bb565b335b905060608860a00151905060608960e001519050600081600081518110620017df57fe5b602002602001015160200151600183600081518110620017fb57fe5b6020026020010151602001515103815181106200181457fe5b602002602001015160000151905060008b60c00151905060008451116200184f5760405162461bcd60e51b81526004016200077a906200488c565b60008711620018725760405162461bcd60e51b81526004016200077a9062004cc9565b6200187c62001c48565b6001600160a01b0316896001600160a01b0316146200191b576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea90620018e6908c90339030908e9060040162004480565b600060405180830381600087803b1580156200190157600080fd5b505af115801562001916573d6000803e3d6000fd5b505050505b60005b835160ff168160ff161015620019c15760006200196e61271062001967878560ff16815181106200194b57fe5b6020026020010151600001518d6200279990919063ffffffff16565b90620027d9565b905060018551038260ff1614156200198f576200198c8b3062002135565b90505b620019b78b82878560ff1681518110620019a557fe5b60200260200101516020015162001c60565b506001016200191e565b50600062000fe4833062002135565b6003546001600160a01b03163314620019fd5760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b03811662001a265760405162461bcd60e51b81526004016200077a90620046d0565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60009081526020819052604090205460ff1690565b6007546040516000916060916001600160a01b03909116907f935fb84b000000000000000000000000000000000000000000000000000000009062000c14908a908a908a908a9060240162004d09565b805160408201516060830151608084015160009392919084906001600160a01b03161562001b3257856080015162001b34565b335b60a087015160e0880151602089015160c08a0151835194955092939192909162001b725760405162461bcd60e51b81526004016200077a906200488c565b6000861162001b955760405162461bcd60e51b81526004016200077a9062004cc9565b600062001ba789848a8a88876200281d565b905062001bb8838883898962002213565b600062001bc68a3062002135565b9050801562001bdc5762001bdc8a338362002579565b836001600160a01b03168a6001600160a01b0316886001600160a01b03167ff0be17aaae5a3633105aafe0689d8beb04dc66d5c51babf7086efebbb4e7ba82338d878c60405162001c319493929190620043f6565b60405180910390a4509a9950505050505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b600081511162001c845760405162461bcd60e51b81526004016200077a90620048c3565b60005b81518110156200212f57600080821162001ca2578462001cbf565b82600183038151811062001cb257fe5b6020026020010151600001515b9050600083838151811062001cd057fe5b6020026020010151600001519050600080841162001cef578562001cfb565b62001cfb833062002135565b905060008411801562001d28575062001d1362001c48565b6001600160a01b0316836001600160a01b0316145b1562001d5e5762001d5b85858151811062001d3f57fe5b6020026020010151602001518262002bf090919063ffffffff16565b90505b60005b85858151811062001d6e57fe5b602002602001015160400151518110156200211e5762001d8d620033e1565b86868151811062001d9a57fe5b602002602001015160400151828151811062001db257fe5b60209081029190910181015160048054604080517f7a3226ec00000000000000000000000000000000000000000000000000000000815290519395506001600160a01b03909116936391d14854938593637a3226ec9380820193929190829003018186803b15801562001e2457600080fd5b505afa15801562001e39573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e5f919062003fdd565b83516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815262001e9d9291906004016200458c565b60206040518083038186803b15801562001eb657600080fd5b505afa15801562001ecb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ef1919062003fa5565b62001f105760405162461bcd60e51b81526004016200077a906200499f565b600062001f32612710620019678460400151876200279990919063ffffffff16565b6080830151909150871580159062001f77575062001f7460018a8a8151811062001f5857fe5b6020026020010151604001515162002bf090919063ffffffff16565b84145b1562001fc557600062001f8b883062002135565b905080925062001f9a62001c48565b6001600160a01b0316886001600160a01b0316141562001fc35762001fc0838362002bf0565b92505b505b8251602084015160608501516040516000936001600160a01b0316927fb69cbf9f00000000000000000000000000000000000000000000000000000000926200201c928d928d928a926001929190602401620044aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051620020a79190620043c1565b600060405180830381855af49150503d8060008114620020e4576040519150601f19603f3d011682016040523d82523d6000602084013e620020e9565b606091505b50509050806200210d5760405162461bcd60e51b81526004016200077a9062004aa1565b50506001909201915062001d619050565b50506001909201915062001c879050565b50505050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156200216f57506001600160a01b038116316200220d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038416906370a0823190620021b6908590600401620043e2565b60206040518083038186803b158015620021cf57600080fd5b505afa158015620021e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200220a919062003fdd565b90505b92915050565b6005546040517fa38aa34600000000000000000000000000000000000000000000000000000000815284916000916001600160a01b039091169063a38aa3469062002263908690600401620045f0565b60206040518083038186803b1580156200227c57600080fd5b505afa15801562002291573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b7919062003a8d565b90506000620022c98887898562002c34565b9050620022d7868262002bf0565b92508683118015620022e7575080155b156200232e57600062002301600262001967868b62002bf0565b90506200230f848262002bf0565b6006549094506200232c908a906001600160a01b03168362002579565b505b6200233b88868562002579565b5050505050505050565b61374a611ad6615dc06000620023866200236d846200236685600262002799565b9062002bf0565b62001967866200237f5a8a9062002bf0565b906200264b565b905062000d0687878362002e3c565b6000808a11620023b95760405162461bcd60e51b81526004016200077a9062004a6a565b8551885160010114620023e05760405162461bcd60e51b81526004016200077a9062004673565b60005a9050620023f18e8d62002ef7565b60005b895181101562002506576002548a516001600160a01b03909116908b90839081106200241c57fe5b60200260200101516001600160a01b031614156200244e5760405162461bcd60e51b81526004016200077a906200479b565b6000620024da8b83815181106200246157fe5b60200260200101518984815181106200247657fe5b60200260200101518b85815181106200248b57fe5b6020026020010151620024d38d8781518110620024a457fe5b60200260200101518e8860010181518110620024bc57fe5b602002602001015162002bf090919063ffffffff16565b8e62002f6f565b905080620024fc5760405162461bcd60e51b81526004016200077a9062004b44565b50600101620023f4565b50620025138d3062002135565b91508a821015620025385760405162461bcd60e51b81526004016200077a9062004b7b565b620025478d8b84888862002213565b82156200256857600254620025689033906001600160a01b03168362002345565b509c9b505050505050505050505050565b8015620014bf576001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141562002635576000826001600160a01b031682610fa090604051620025c590620043df565b600060405180830381858888f193505050503d806000811462002605576040519150601f19603f3d011682016040523d82523d6000602084013e6200260a565b606091505b50509050806200262e5760405162461bcd60e51b81526004016200077a9062004605565b50620014bf565b620014bf6001600160a01b038416838362002f99565b6000828201838110156200220a5760405162461bcd60e51b81526004016200077a906200472d565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14620014bf576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815282906000906001600160a01b0383169063dd62ed3e90620026e6903090899060040162004466565b60206040518083038186803b158015620026ff57600080fd5b505afa15801562002714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200273a919062003fdd565b90508281101562002792576200275c6001600160a01b0383168660006200303e565b620027926001600160a01b038316867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62003127565b5050505050565b600082620027aa575060006200220d565b82820282848281620027b857fe5b04146200220a5760405162461bcd60e51b81526004016200077a9062004a0d565b60006200220a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620031d6565b6000805a90506200282d62001c48565b6001600160a01b0316886001600160a01b031614620028cc576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea9062002897908b90339030908c9060040162004480565b600060405180830381600087803b158015620028b257600080fd5b505af1158015620028c7573d6000803e3d6000fd5b505050505b60005b845181101562002b8f57620028e362003422565b858281518110620028f057fe5b60209081029190910181015160048054604080517f7a3226ec00000000000000000000000000000000000000000000000000000000815290519395506001600160a01b03909116936391d14854938593637a3226ec9380820193929190829003018186803b1580156200296257600080fd5b505afa15801562002977573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200299d919062003fdd565b83516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152620029db9291906004016200458c565b60206040518083038186803b158015620029f457600080fd5b505afa15801562002a09573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002a2f919062003fa5565b62002a4e5760405162461bcd60e51b81526004016200077a906200499f565b600081600001516001600160a01b0316635f0a186260e01b8c8c856040015186606001518760200151886080015160405160240162002a9396959493929190620044ef565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162002b1e9190620043c1565b600060405180830381855af49150503d806000811462002b5b576040519150601f19603f3d011682016040523d82523d6000602084013e62002b60565b606091505b505090508062002b845760405162461bcd60e51b81526004016200077a9062004aa1565b5050600101620028cf565b50600062002b9e883062002135565b90508581101562002bc35760405162461bcd60e51b81526004016200077a90620047f8565b831562002be45760025462002be49033906001600160a01b03168462002345565b98975050505050505050565b60006200220a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062003213565b60006001600160a01b03821662002c4e5750600062002e34565b6000806000806000866001600160a01b0316630c51ff046040518163ffffffff1660e01b815260040160c06040518083038186803b15801562002c9057600080fd5b505afa15801562002ca5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002ccb919062003aac565b95509550509450945094506000808215801562002ce9575060328611155b801562002cf55750898b115b1562002d8f57600062002d0f6002620019678e8e62002bf0565b905062002d24612710620019678d8a62002799565b985062002d39612710620019678b8962002799565b925062002d47898462002bf0565b915062002d5582826200264b565b915062002d6389826200264b565b98508462002d885762002d7783826200264b565b925062002d8589826200264b565b98505b5062002dc8565b62002da2612710620019678d8962002799565b975062002db7612710620019678a8862002799565b915062002dc5888362002bf0565b90505b62002dd58c888462002579565b60065462002def908d906001600160a01b03168362002579565b7fb9f46e095476339db7821812d7e8ca40dad9d9b08ba10b54eb67faacc2aa558288838360405162002e249392919062004d2b565b60405180910390a1505050505050505b949350505050565b806000805a9050616c3e811062002e655762002e62611b6c6200196783616c3e62002bf0565b91505b8183111562002e72578192505b6040517fdd1fe62c0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063dd1fe62c9062002ebb908990879060040162004568565b600060405180830381600087803b15801562002ed657600080fd5b505af115801562002eeb573d6000803e3d6000fd5b50505050505050505050565b62002f0162001c48565b6001600160a01b0316826001600160a01b03161462002f6b576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea906200171290859033903090879060040162004480565b5050565b6000806000905060405160208401600082878984018b8d6187965a03f19998505050505050505050565b620014bf8363a9059cbb60e01b848460405160240162002fbb92919062004568565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003242565b801580620030e657506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e9062003090903090869060040162004466565b60206040518083038186803b158015620030a957600080fd5b505afa158015620030be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620030e4919062003fdd565b155b620031055760405162461bcd60e51b81526004016200077a9062004c6c565b620014bf8363095ea7b360e01b848460405160240162002fbb92919062004568565b6000620031b282856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b81526004016200315e92919062004466565b60206040518083038186803b1580156200317757600080fd5b505afa1580156200318c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200237f919062003fdd565b90506200212f8463095ea7b360e01b858460405160240162002fbb92919062004568565b60008183620031fa5760405162461bcd60e51b81526004016200077a9190620045f0565b5060008385816200320757fe5b049150505b9392505050565b600081848411156200323a5760405162461bcd60e51b81526004016200077a9190620045f0565b505050900390565b606062003299826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620032d99092919063ffffffff16565b805190915015620014bf5780806020019051810190620032ba919062003fa5565b620014bf5760405162461bcd60e51b81526004016200077a9062004c0f565b606062002e34848460008585620032f0856200338f565b6200330f5760405162461bcd60e51b81526004016200077a9062004bd8565b60006060866001600160a01b031685876040516200332e9190620043c1565b60006040518083038185875af1925050503d80600081146200336d576040519150601f19603f3d011682016040523d82523d6000602084013e62003372565b606091505b50915091506200338482828662003395565b979650505050505050565b3b151590565b60608315620033a65750816200320c565b825115620033b75782518084602001fd5b8160405162461bcd60e51b81526004016200077a9190620045f0565b610c1d8062004ddd83390190565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160608152602001600081525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160608152602001600081525090565b803562000bbf8162004db4565b60008083601f84011262003489578182fd5b50813567ffffffffffffffff811115620034a1578182fd5b6020830191508360208083028501011115620034bc57600080fd5b9250929050565b600082601f830112620034d4578081fd5b8135620034eb620034e58262004d66565b62004d41565b8181529150602080830190848101818402860182018710156200350d57600080fd5b60005b8481101562003539578135620035268162004db4565b8452928201929082019060010162003510565b505050505092915050565b600082601f83011262003555578081fd5b813562003566620034e58262004d66565b818152915060208083019084810160005b8481101562003539578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c03011215620035b857600080fd5b6040805182810167ffffffffffffffff8282108183111715620035d757fe5b818452620035e78987016200346a565b8352620035f68487016200346a565b8984015260609150818601358484015260809350838601358284015260a0915081860135818111156200362857600080fd5b620036388f8b838a0101620039d2565b9484019490945250939092013592820192909252855250928201929082019060010162003577565b600082601f83011262003671578081fd5b813562003682620034e58262004d66565b818152915060208083019084810160005b848110156200353957813587016040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c03011215620036d457600080fd5b805181810167ffffffffffffffff8282108183111715620036f157fe5b8184528488013583529284013592808411156200370d57600080fd5b50506200371f8b878486010162003738565b8187015286525050928201929082019060010162003693565b600082601f83011262003749578081fd5b62003759620034e5833562004d66565b823581529050602080820190830160005b843581101562003957578135850160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828903011215620037ab57600080fd5b60405180606082011067ffffffffffffffff60608301111715620037cb57fe5b60608101604052620037e1602083013562004db4565b602082013581526040820135602082015267ffffffffffffffff606083013511156200380c57600080fd5b60608201358201915087603f8301126200382557600080fd5b62003838620034e5602084013562004d66565b60208381013582528101906040840160005b602086013581101562003938578135860160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0828f030112156200388e57600080fd5b6040518060a082011067ffffffffffffffff60a08301111715620038ae57fe5b60a08101604052620038c3604083016200346a565b8152620038d3606083016200346a565b60208201526080820135604082015267ffffffffffffffff60a08301351115620038fc57600080fd5b620039118e604060a0850135850101620039d2565b606082015260c091909101356080820152845260209384019391909101906001016200384a565b505060408301525084525060209283019291909101906001016200376a565b50505092915050565b600082601f83011262003971578081fd5b813562003982620034e58262004d66565b818152915060208083019084810181840286018201871015620039a457600080fd5b60005b848110156200353957813584529282019290820190600101620039a7565b803562000bbf8162004dcd565b600082601f830112620039e3578081fd5b813567ffffffffffffffff811115620039f857fe5b62003a2b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162004d41565b915080825283602082850101111562003a4357600080fd5b8060208401602084013760009082016020015292915050565b803560ff8116811462000bbf57600080fd5b60006020828403121562003a80578081fd5b81356200220a8162004db4565b60006020828403121562003a9f578081fd5b81516200220a8162004db4565b60008060008060008060c0878903121562003ac5578182fd5b865162003ad28162004db4565b80965050602087015194506040870151935060608701519250608087015162003afb8162004dcd565b60a088015190925062003b0e8162004dcd565b809150509295509295509295565b60008060006060848603121562003b31578081fd5b833562003b3e8162004db4565b9250602084013562003b508162004db4565b929592945050506040919091013590565b60008060008060008060c0878903121562003b7a578384fd5b863562003b878162004db4565b9550602087013562003b998162004db4565b9450604087013562003bab8162004db4565b9350606087013562003bbd8162004db4565b9250608087013562003bcf8162004db4565b8092505060a087013590509295509295509295565b60008060008060008060008060008060006101608c8e03121562003c06578889fd5b62003c118c6200346a565b9a5062003c2160208d016200346a565b995060408c0135985060608c0135975067ffffffffffffffff8060808e0135111562003c4b578586fd5b62003c5d8e60808f01358f01620034c3565b97508060a08e0135111562003c70578586fd5b62003c828e60a08f01358f01620039d2565b96508060c08e0135111562003c95578586fd5b62003ca78e60c08f01358f0162003960565b95508060e08e0135111562003cba578485fd5b62003ccc8e60e08f01358f0162003960565b945062003cdd6101008e016200346a565b9350806101208e0135111562003cf1578283fd5b5062003d058d6101208e01358e01620039d2565b915062003d166101408d01620039c5565b90509295989b509295989b9093969950565b6000806000806000806000806000806000806101808d8f03121562003d4b578586fd5b62003d568d6200346a565b9b5062003d6660208e016200346a565b9a5060408d0135995060608d0135985060808d0135975067ffffffffffffffff60a08e0135111562003d96578586fd5b62003da88e60a08f01358f01620034c3565b965067ffffffffffffffff60c08e0135111562003dc3578586fd5b62003dd58e60c08f01358f01620039d2565b955067ffffffffffffffff60e08e0135111562003df0578081fd5b62003e028e60e08f01358f0162003960565b945067ffffffffffffffff6101008e0135111562003e1e578081fd5b62003e318e6101008f01358f0162003960565b935062003e426101208e016200346a565b925067ffffffffffffffff6101408e0135111562003e5e578081fd5b62003e718e6101408f01358f01620039d2565b915062003e826101608e01620039c5565b90509295989b509295989b509295989b565b600080600080600080600060c0888a03121562003eaf578081fd5b873562003ebc8162004db4565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff81111562003eed578182fd5b62003efb8a828b0162003477565b909450925062003f10905060a0890162003a5c565b905092959891949750929550565b60008060006040848603121562003f33578081fd5b833562003f408162004db4565b9250602084013567ffffffffffffffff8082111562003f5d578283fd5b818601915086601f83011262003f71578283fd5b81358181111562003f80578384fd5b87602082850101111562003f92578384fd5b6020830194508093505050509250925092565b60006020828403121562003fb7578081fd5b81516200220a8162004dcd565b60006020828403121562003fd6578081fd5b5035919050565b60006020828403121562003fef578081fd5b5051919050565b60006020828403121562004008578081fd5b813567ffffffffffffffff8082111562004020578283fd5b818401915061010080838703121562004037578384fd5b620040428162004d41565b90506200404f836200346a565b81526200405f602084016200346a565b6020820152604083013560408201526060830135606082015262004086608084016200346a565b608082015260a0830135828111156200409d578485fd5b620040ab87828601620039d2565b60a083015250620040bf60c08401620039c5565b60c082015260e083013582811115620040d6578485fd5b620040e48782860162003544565b60e08301525095945050505050565b60006020828403121562004105578081fd5b813567ffffffffffffffff808211156200411d578283fd5b818401915061010080838703121562004134578384fd5b6200413f8162004d41565b90506200414c836200346a565b81526020830135602082015260408301356040820152606083013560608201526200417a608084016200346a565b608082015260a08301358281111562004191578485fd5b6200419f87828601620039d2565b60a083015250620041b360c08401620039c5565b60c082015260e083013582811115620041ca578485fd5b620040e48782860162003660565b600060208284031215620041ea578081fd5b813567ffffffffffffffff8082111562004202578283fd5b818401915061010080838703121562004219578384fd5b620042248162004d41565b905062004231836200346a565b81526020830135602082015260408301356040820152606083013560608201526200425f608084016200346a565b608082015260a08301358281111562004276578485fd5b6200428487828601620039d2565b60a0830152506200429860c08401620039c5565b60c082015260e083013582811115620042af578485fd5b620040e48782860162003738565b600080600080600060808688031215620042d5578283fd5b8535945060208601359350604086013567ffffffffffffffff811115620042fa578384fd5b620043088882890162003477565b90945092506200431d90506060870162003a5c565b90509295509295909350565b60008284526020808501945082825b858110156200436a5781356200434e8162004db4565b6001600160a01b03168752958201959082019060010162004338565b509495945050505050565b600081518084526200438f81602086016020860162004d85565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251620043d581846020870162004d85565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b60006001600160a01b03861682528460208301528360408301526080606083015262004426608083018462004375565b9695505050505050565b60006001600160a01b038716825285602083015284604083015283606083015260a060808301526200338460a083018462004375565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b60006001600160a01b038089168352808816602084015286604084015260ff8616606084015280851660808401525060c060a083015262002be460c083018462004375565b60006001600160a01b038089168352808816602084015286604084015285606084015280851660808401525060c060a083015262002be460c083018462004375565b60006001600160a01b038816825286602083015285604083015284606083015260a0608083015262002be460a08301848662004329565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b9182526001600160a01b0316602082015260400190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6000602082526200220a602083018462004375565b60208082526018908201527f4661696c656420746f207472616e736665722045746865720000000000000000604082015260600190565b6020808252600f908201527f496e76616c696420616464726573730000000000000000000000000000000000604082015260600190565b60208082526036908201527f537461727420696e6465786573206d757374206265203120677265617465722060408201527f7468656e206e756d626572206f662063616c6c65657300000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526019908201527f496e76616c69642077686974656c697374206164647265737300000000000000604082015260600190565b60208082526028908201527f43616e206e6f742063616c6c20546f6b656e5472616e7366657250726f78792060408201527f436f6e7472616374000000000000000000000000000000000000000000000000606082015260800190565b60208082526037908201527f526563656976656420616d6f756e74206f6620746f6b656e7320617265206c6560408201527f7373207468656e20657870656374656420746f6b656e73000000000000000000606082015260800190565b6020808252601c908201527f4661696c656420746f20696e697469616c697a65206164617074657200000000604082015260600190565b60208082526010908201527f496e76616c696420726566657272657200000000000000000000000000000000604082015260600190565b6020808252601a908201527f50617468206e6f742070726f766964656420666f722073776170000000000000604082015260600190565b6020808252601c908201527f43616c6c20746f20756e69737761702070726f7879206661696c656400000000604082015260600190565b60208082526016908201527f54696d65206c6f636b20636865636b206661696c656400000000000000000000604082015260600190565b6020808252601e908201527f436f6e747261637420616c726561647920696e697469616c697a656421210000604082015260600190565b60208082526018908201527f45786368616e6765206e6f742077686974656c69737465640000000000000000604082015260600190565b60208082526012908201527f4e6f2070656e64696e6720726571756573740000000000000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f746f416d6f756e7420697320746f6f206c6f7700000000000000000000000000604082015260600190565b60208082526016908201527f43616c6c20746f2061646170746572206661696c656400000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f4175677573747573537761707065723a20496e76616c69642061636365737300604082015260600190565b60208082526014908201527f45787465726e616c2063616c6c206661696c6564000000000000000000000000604082015260600190565b60208082526030908201527f526563656976656420616d6f756e74206f6620746f6b656e7320617265206c6560408201527f7373207468656e20657870656374656400000000000000000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60208082526016908201527f546f20616d6f756e742063616e206e6f74206265203000000000000000000000604082015260600190565b90815260200190565b6000858252846020830152606060408301526200442660608301848662004329565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171562004d5e57fe5b604052919050565b600067ffffffffffffffff82111562004d7b57fe5b5060209081020190565b60005b8381101562004da257818101518382015260200162004d88565b838111156200212f5750506000910152565b6001600160a01b038116811462004dca57600080fd5b50565b801515811462004dca57600080fdfe608060405234801561001057600080fd5b50604051610c1d380380610c1d83398101604081905261002f916100ac565b60006100396100a8565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b03929092169190911790556100da565b3390565b6000602082840312156100bd578081fd5b81516001600160a01b03811681146100d3578182fd5b9392505050565b610b34806100e96000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80638da5cb5b116100505780638da5cb5b146100b2578063dd1fe62c146100ba578063f2fde38b146100cd57610072565b806315dacbea14610077578063715018a61461008c5780637fb9312714610094575b600080fd5b61008a6100853660046107bf565b6100e0565b005b61008a61016d565b61009c610238565b6040516100a99190610886565b60405180910390f35b61009c610254565b61008a6100c8366004610809565b610270565b61008a6100db3660046107a5565b61037b565b6100e86104b1565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b60405180910390fd5b61016773ffffffffffffffffffffffffffffffffffffffff85168484846104b5565b50505050565b6101756104b1565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146101c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6102786104b1565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146102cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b6001546040517f079d229f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063079d229f9061032490859085906004016108d8565b602060405180830381600087803b15801561033e57600080fd5b505af1158015610352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103769190610852565b505050565b6103836104b1565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146103d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b73ffffffffffffffffffffffffffffffffffffffff8116610424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c9061094f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b610167846323b872dd60e01b8585856040516024016104d6939291906108a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915260606105b5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166106099092919063ffffffff16565b80519091501561037657808060200190518101906105d39190610832565b610376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a75565b60606106188484600085610622565b90505b9392505050565b60608247101561065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c906109ac565b61066785610724565b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a3e565b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516106c7919061086a565b60006040518083038185875af1925050503d8060008114610704576040519150601f19603f3d011682016040523d82523d6000602084013e610709565b606091505b509150915061071982828661072e565b979650505050505050565b803b15155b919050565b6060831561073d57508161061b565b82511561074d5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c91906108fe565b803573ffffffffffffffffffffffffffffffffffffffff8116811461072957600080fd5b6000602082840312156107b6578081fd5b61061b82610781565b600080600080608085870312156107d4578283fd5b6107dd85610781565b93506107eb60208601610781565b92506107f960408601610781565b9396929550929360600135925050565b6000806040838503121561081b578182fd5b61082483610781565b946020939093013593505050565b600060208284031215610843578081fd5b8151801515811461061b578182fd5b600060208284031215610863578081fd5b5051919050565b6000825161087c818460208701610ad2565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600060208252825180602084015261091d816040850160208701610ad2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60005b83811015610aed578181015183820152602001610ad5565b83811115610167575050600091015256fea2646970667358221220ab62661474abad01a8ead0fb0a1c72f0b0032e0f272241e9e47d63d3fc96b43164736f6c63430007050033a26469706673582212209fcc3942e20e131e2169fad7f00d16b3902bcb8c8acdc96018b0ad3ab019b2ce64736f6c63430007050033
Deployed Bytecode
0x608060405260043610620002355760003560e01c806395b6ef0c1162000139578063d2c4b59811620000c1578063ec1d21dd116200008b578063f7b637bb116200006d578063f7b637bb14620005d2578063f9355f721462000606578063f95a49eb146200061d576200023d565b8063ec1d21dd1462000596578063f2fde38b14620005ad576200023d565b8063d2c4b598146200050f578063db21e48d1462000527578063e1829cfe146200054c578063e1f21c671462000571576200023d565b8063a64b6e5f1162000103578063a64b6e5f14620004a3578063a745d5bd14620004c8578063b69bd7aa14620004e0578063cfc0afeb14620004f8576200023d565b806395b6ef0c146200042a578063a224c745146200044f578063a27e8b6b1462000474578063a4a6c336146200048b576200023d565b806354f6127f11620001bd5780638da5cb5b11620001875780638da5cb5b14620003be5780638f00eccb14620003d657806390d49b9d14620003ed578063915eb9731462000412576200023d565b806354f6127f146200034557806358b9d179146200036a578063715018a614620003815780638c3e9f461462000399576200023d565b80631880021911620001ff5780631880021914620002d95780632af3feb014620002fe5780633363522614620003165780635459060d146200032d576200023d565b80630863b7ac146200024257806308defdee146200025b5780630d8e6e2c146200028b578063119a5e9614620002b2576200023d565b366200023d57005b600080fd5b620002596200025336600462003e94565b62000634565b005b3480156200026857600080fd5b50620002736200078e565b604051620002829190620043e2565b60405180910390f35b3480156200029857600080fd5b50620002a36200079d565b604051620002829190620045f0565b348015620002bf57600080fd5b50620002ca620007d4565b60405162000282919062004d00565b348015620002e657600080fd5b5062000259620002f836600462003f1e565b620007da565b3480156200030b57600080fd5b506200027362000a8f565b620002596200032736600462003e94565b62000a9e565b3480156200033a57600080fd5b506200027362000af2565b3480156200035257600080fd5b50620002a36200036436600462003fc4565b62000b01565b620002596200037b366004620042bd565b62000bc4565b3480156200038e57600080fd5b506200025962000d0f565b348015620003a657600080fd5b5062000259620003b836600462003a6e565b62000d9e565b348015620003cb57600080fd5b506200027362000e2e565b620002ca620003e7366004620041d8565b62000e3d565b348015620003fa57600080fd5b50620002596200040c36600462003a6e565b620010a8565b3480156200041f57600080fd5b506200027362001138565b3480156200043757600080fd5b50620002596200044936600462003b61565b62001147565b3480156200045c57600080fd5b50620002596200046e36600462003a6e565b62001261565b620002596200048536600462003be4565b620012f1565b3480156200049857600080fd5b5062000259620013b6565b348015620004b057600080fd5b5062000259620004c236600462003b1c565b62001485565b348015620004d557600080fd5b50620002ca620014c4565b348015620004ed57600080fd5b5062000273620014ca565b620002ca6200050936600462003d28565b620014d9565b3480156200051c57600080fd5b506200027362001565565b3480156200053457600080fd5b50620002596200054636600462003a6e565b62001574565b3480156200055957600080fd5b50620002596200056b36600462003a6e565b62001608565b3480156200057e57600080fd5b50620002596200059036600462003b1c565b6200174a565b620002ca620005a7366004620040f3565b62001779565b348015620005ba57600080fd5b5062000259620005cc36600462003a6e565b620019d0565b348015620005df57600080fd5b50620005f7620005f136600462003fc4565b62001a9a565b60405162000282919062004581565b6200025962000617366004620042bd565b62001aaf565b620002ca6200062e36600462003ff6565b62001aff565b6007546040516000916060916001600160a01b03909116907ff5661034000000000000000000000000000000000000000000000000000000009062000688908c908c908c908c908c908c9060240162004531565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051620007139190620043c1565b600060405180830381855af49150503d806000811462000750576040519150601f19603f3d011682016040523d82523d6000602084013e62000755565b606091505b509150915081620007835760405162461bcd60e51b81526004016200077a90620048fa565b60405180910390fd5b505050505050505050565b6007546001600160a01b031690565b60408051808201909152600581527f342e302e30000000000000000000000000000000000000000000000000000000602082015290565b600a5490565b6003546001600160a01b03163314620008075760405162461bcd60e51b81526004016200077a9062004ad8565b60048054604080517f7a3226ec00000000000000000000000000000000000000000000000000000000815290516001600160a01b03909216926391d14854928492637a3226ec9281810192602092909190829003018186803b1580156200086d57600080fd5b505afa15801562000882573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008a8919062003fdd565b856040518363ffffffff1660e01b8152600401620008c89291906200458c565b60206040518083038186803b158015620008e157600080fd5b505afa158015620008f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200091c919062003fa5565b6200093b5760405162461bcd60e51b81526004016200077a906200499f565b6000836001600160a01b031663439fab9160e01b848460405160240162000964929190620045a3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051620009ef9190620043c1565b600060405180830381855af49150503d806000811462000a2c576040519150601f19603f3d011682016040523d82523d6000602084013e62000a31565b606091505b505090508062000a555760405162461bcd60e51b81526004016200077a9062004855565b6040516001600160a01b038516907f4aa65286df310c4e8390d962c75f50380b8260d96ea27cf14847cd683e22d9db90600090a250505050565b6008546001600160a01b031690565b6007546040516000916060916001600160a01b03909116907fc03786b0000000000000000000000000000000000000000000000000000000009062000688908c908c908c908c908c908c9060240162004531565b6006546001600160a01b031690565b60008181526001602081815260409283902080548451600294821615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911693909304601f8101839004830284018301909452838352606093909183018282801562000bb75780601f1062000b8b5761010080835404028352916020019162000bb7565b820191906000526020600020905b81548152906001019060200180831162000b9957829003601f168201915b505050505090505b919050565b6007546040516000916060916001600160a01b03909116907f54840d1a000000000000000000000000000000000000000000000000000000009062000c14908a908a908a908a9060240162004d09565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162000c9f9190620043c1565b600060405180830381855af49150503d806000811462000cdc576040519150601f19603f3d011682016040523d82523d6000602084013e62000ce1565b606091505b50915091508162000d065760405162461bcd60e51b81526004016200077a90620048fa565b50505050505050565b6003546001600160a01b0316331462000d3c5760405162461bcd60e51b81526004016200077a9062004ad8565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6003546001600160a01b0316331462000dcb5760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b03811662000df45760405162461bcd60e51b81526004016200077a906200463c565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6003546001600160a01b031690565b6000805a835160208501516040860151606087015160808801519495509293919290916000906001600160a01b03161562000e7d57876080015162000e7f565b335b60a089015160e08a01518051929350909160009082907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811062000ec257fe5b602002602001015160000151905060008b60c001519050600084511162000efd5760405162461bcd60e51b81526004016200077a906200488c565b6000871162000f205760405162461bcd60e51b81526004016200077a9062004cc9565b62000f2a62001c48565b6001600160a01b0316896001600160a01b03161462000fc9576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea9062000f94908c90339030908e9060040162004480565b600060405180830381600087803b15801562000faf57600080fd5b505af115801562000fc4573d6000803e3d6000fd5b505050505b62000fd689898562001c60565b600062000fe4833062002135565b905087811015620010095760405162461bcd60e51b81526004016200077a9062004b7b565b62001018838883898962002213565b81156200103957600254620010399033906001600160a01b03168d62002345565b826001600160a01b03168a6001600160a01b0316876001600160a01b03167f9cc2048b8af5eadff75759a3169b369efc538fb79c760fd396a4b355410b41b7338d868d8c6040516200109095949392919062004430565b60405180910390a49c9b505050505050505050505050565b6003546001600160a01b03163314620010d55760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b038116620010fe5760405162461bcd60e51b81526004016200077a906200463c565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6004546001600160a01b031690565b6002546001600160a01b031615620011735760405162461bcd60e51b81526004016200077a9062004968565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386161790556040516000908690620011b990620033d3565b620011c59190620043e2565b604051809103906000f080158015620011e2573d6000803e3d6000fd5b50600280547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617909155600480548216998316999099179098556006805489169582169590951790945550600780548716929093169190911790915560038054339516949094179093555050600a55565b6003546001600160a01b031633146200128e5760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b038116620012b75760405162461bcd60e51b81526004016200077a9062004764565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6001600160a01b038316156200130857826200130a565b335b92506000620013248c8c8c8c8d8d8d8d8d8d8d8d62002395565b90506000620013348d3062002135565b905080156200134a576200134a8d338362002579565b8b6001600160a01b03168d6001600160a01b0316866001600160a01b03167ff0be17aaae5a3633105aafe0689d8beb04dc66d5c51babf7086efebbb4e7ba82338f878a6040516200139f9493929190620043f6565b60405180910390a450505050505050505050505050565b6003546001600160a01b03163314620013e35760405162461bcd60e51b81526004016200077a9062004ad8565b600a54600954620013f4916200264b565b431015620014165760405162461bcd60e51b81526004016200077a9062004931565b6008546001600160a01b0316620014415760405162461bcd60e51b81526004016200077a90620049d6565b600060095560088054600780547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b6003546001600160a01b03163314620014b25760405162461bcd60e51b81526004016200077a9062004ad8565b620014bf83838362002579565b505050565b60095490565b6005546001600160a01b031690565b60006001600160a01b03841615620014f25783620014f4565b335b93506200150c8d8d8d8d8d8d8d8d8d8d8d8d62002395565b90508b6001600160a01b03168d6001600160a01b0316856001600160a01b03167f9cc2048b8af5eadff75759a3169b369efc538fb79c760fd396a4b355410b41b7338f868f8a6040516200109095949392919062004430565b6002546001600160a01b031690565b6003546001600160a01b03163314620015a15760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b038116620015ca5760405162461bcd60e51b81526004016200077a906200463c565b43600955600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b3330146200162a5760405162461bcd60e51b81526004016200077a9062004b0d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a082319062001674903090600401620043e2565b60206040518083038186803b1580156200168d57600080fd5b505afa158015620016a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016c8919062003fdd565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690632e1a7d4d906200171290849060040162004d00565b600060405180830381600087803b1580156200172d57600080fd5b505af115801562001742573d6000803e3d6000fd5b505050505050565b3330146200176c5760405162461bcd60e51b81526004016200077a9062004b0d565b620014bf82848362002673565b6000805a835160208501516040860151606087015160808801519495509293919290916000906001600160a01b031615620017b9578760800151620017bb565b335b905060608860a00151905060608960e001519050600081600081518110620017df57fe5b602002602001015160200151600183600081518110620017fb57fe5b6020026020010151602001515103815181106200181457fe5b602002602001015160000151905060008b60c00151905060008451116200184f5760405162461bcd60e51b81526004016200077a906200488c565b60008711620018725760405162461bcd60e51b81526004016200077a9062004cc9565b6200187c62001c48565b6001600160a01b0316896001600160a01b0316146200191b576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea90620018e6908c90339030908e9060040162004480565b600060405180830381600087803b1580156200190157600080fd5b505af115801562001916573d6000803e3d6000fd5b505050505b60005b835160ff168160ff161015620019c15760006200196e61271062001967878560ff16815181106200194b57fe5b6020026020010151600001518d6200279990919063ffffffff16565b90620027d9565b905060018551038260ff1614156200198f576200198c8b3062002135565b90505b620019b78b82878560ff1681518110620019a557fe5b60200260200101516020015162001c60565b506001016200191e565b50600062000fe4833062002135565b6003546001600160a01b03163314620019fd5760405162461bcd60e51b81526004016200077a9062004ad8565b6001600160a01b03811662001a265760405162461bcd60e51b81526004016200077a90620046d0565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60009081526020819052604090205460ff1690565b6007546040516000916060916001600160a01b03909116907f935fb84b000000000000000000000000000000000000000000000000000000009062000c14908a908a908a908a9060240162004d09565b805160408201516060830151608084015160009392919084906001600160a01b03161562001b3257856080015162001b34565b335b60a087015160e0880151602089015160c08a0151835194955092939192909162001b725760405162461bcd60e51b81526004016200077a906200488c565b6000861162001b955760405162461bcd60e51b81526004016200077a9062004cc9565b600062001ba789848a8a88876200281d565b905062001bb8838883898962002213565b600062001bc68a3062002135565b9050801562001bdc5762001bdc8a338362002579565b836001600160a01b03168a6001600160a01b0316886001600160a01b03167ff0be17aaae5a3633105aafe0689d8beb04dc66d5c51babf7086efebbb4e7ba82338d878c60405162001c319493929190620043f6565b60405180910390a4509a9950505050505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b600081511162001c845760405162461bcd60e51b81526004016200077a90620048c3565b60005b81518110156200212f57600080821162001ca2578462001cbf565b82600183038151811062001cb257fe5b6020026020010151600001515b9050600083838151811062001cd057fe5b6020026020010151600001519050600080841162001cef578562001cfb565b62001cfb833062002135565b905060008411801562001d28575062001d1362001c48565b6001600160a01b0316836001600160a01b0316145b1562001d5e5762001d5b85858151811062001d3f57fe5b6020026020010151602001518262002bf090919063ffffffff16565b90505b60005b85858151811062001d6e57fe5b602002602001015160400151518110156200211e5762001d8d620033e1565b86868151811062001d9a57fe5b602002602001015160400151828151811062001db257fe5b60209081029190910181015160048054604080517f7a3226ec00000000000000000000000000000000000000000000000000000000815290519395506001600160a01b03909116936391d14854938593637a3226ec9380820193929190829003018186803b15801562001e2457600080fd5b505afa15801562001e39573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e5f919062003fdd565b83516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815262001e9d9291906004016200458c565b60206040518083038186803b15801562001eb657600080fd5b505afa15801562001ecb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ef1919062003fa5565b62001f105760405162461bcd60e51b81526004016200077a906200499f565b600062001f32612710620019678460400151876200279990919063ffffffff16565b6080830151909150871580159062001f77575062001f7460018a8a8151811062001f5857fe5b6020026020010151604001515162002bf090919063ffffffff16565b84145b1562001fc557600062001f8b883062002135565b905080925062001f9a62001c48565b6001600160a01b0316886001600160a01b0316141562001fc35762001fc0838362002bf0565b92505b505b8251602084015160608501516040516000936001600160a01b0316927fb69cbf9f00000000000000000000000000000000000000000000000000000000926200201c928d928d928a926001929190602401620044aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051620020a79190620043c1565b600060405180830381855af49150503d8060008114620020e4576040519150601f19603f3d011682016040523d82523d6000602084013e620020e9565b606091505b50509050806200210d5760405162461bcd60e51b81526004016200077a9062004aa1565b50506001909201915062001d619050565b50506001909201915062001c879050565b50505050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156200216f57506001600160a01b038116316200220d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038416906370a0823190620021b6908590600401620043e2565b60206040518083038186803b158015620021cf57600080fd5b505afa158015620021e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200220a919062003fdd565b90505b92915050565b6005546040517fa38aa34600000000000000000000000000000000000000000000000000000000815284916000916001600160a01b039091169063a38aa3469062002263908690600401620045f0565b60206040518083038186803b1580156200227c57600080fd5b505afa15801562002291573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b7919062003a8d565b90506000620022c98887898562002c34565b9050620022d7868262002bf0565b92508683118015620022e7575080155b156200232e57600062002301600262001967868b62002bf0565b90506200230f848262002bf0565b6006549094506200232c908a906001600160a01b03168362002579565b505b6200233b88868562002579565b5050505050505050565b61374a611ad6615dc06000620023866200236d846200236685600262002799565b9062002bf0565b62001967866200237f5a8a9062002bf0565b906200264b565b905062000d0687878362002e3c565b6000808a11620023b95760405162461bcd60e51b81526004016200077a9062004a6a565b8551885160010114620023e05760405162461bcd60e51b81526004016200077a9062004673565b60005a9050620023f18e8d62002ef7565b60005b895181101562002506576002548a516001600160a01b03909116908b90839081106200241c57fe5b60200260200101516001600160a01b031614156200244e5760405162461bcd60e51b81526004016200077a906200479b565b6000620024da8b83815181106200246157fe5b60200260200101518984815181106200247657fe5b60200260200101518b85815181106200248b57fe5b6020026020010151620024d38d8781518110620024a457fe5b60200260200101518e8860010181518110620024bc57fe5b602002602001015162002bf090919063ffffffff16565b8e62002f6f565b905080620024fc5760405162461bcd60e51b81526004016200077a9062004b44565b50600101620023f4565b50620025138d3062002135565b91508a821015620025385760405162461bcd60e51b81526004016200077a9062004b7b565b620025478d8b84888862002213565b82156200256857600254620025689033906001600160a01b03168362002345565b509c9b505050505050505050505050565b8015620014bf576001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141562002635576000826001600160a01b031682610fa090604051620025c590620043df565b600060405180830381858888f193505050503d806000811462002605576040519150601f19603f3d011682016040523d82523d6000602084013e6200260a565b606091505b50509050806200262e5760405162461bcd60e51b81526004016200077a9062004605565b50620014bf565b620014bf6001600160a01b038416838362002f99565b6000828201838110156200220a5760405162461bcd60e51b81526004016200077a906200472d565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14620014bf576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815282906000906001600160a01b0383169063dd62ed3e90620026e6903090899060040162004466565b60206040518083038186803b158015620026ff57600080fd5b505afa15801562002714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200273a919062003fdd565b90508281101562002792576200275c6001600160a01b0383168660006200303e565b620027926001600160a01b038316867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62003127565b5050505050565b600082620027aa575060006200220d565b82820282848281620027b857fe5b04146200220a5760405162461bcd60e51b81526004016200077a9062004a0d565b60006200220a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620031d6565b6000805a90506200282d62001c48565b6001600160a01b0316886001600160a01b031614620028cc576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea9062002897908b90339030908c9060040162004480565b600060405180830381600087803b158015620028b257600080fd5b505af1158015620028c7573d6000803e3d6000fd5b505050505b60005b845181101562002b8f57620028e362003422565b858281518110620028f057fe5b60209081029190910181015160048054604080517f7a3226ec00000000000000000000000000000000000000000000000000000000815290519395506001600160a01b03909116936391d14854938593637a3226ec9380820193929190829003018186803b1580156200296257600080fd5b505afa15801562002977573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200299d919062003fdd565b83516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152620029db9291906004016200458c565b60206040518083038186803b158015620029f457600080fd5b505afa15801562002a09573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002a2f919062003fa5565b62002a4e5760405162461bcd60e51b81526004016200077a906200499f565b600081600001516001600160a01b0316635f0a186260e01b8c8c856040015186606001518760200151886080015160405160240162002a9396959493929190620044ef565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162002b1e9190620043c1565b600060405180830381855af49150503d806000811462002b5b576040519150601f19603f3d011682016040523d82523d6000602084013e62002b60565b606091505b505090508062002b845760405162461bcd60e51b81526004016200077a9062004aa1565b5050600101620028cf565b50600062002b9e883062002135565b90508581101562002bc35760405162461bcd60e51b81526004016200077a90620047f8565b831562002be45760025462002be49033906001600160a01b03168462002345565b98975050505050505050565b60006200220a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062003213565b60006001600160a01b03821662002c4e5750600062002e34565b6000806000806000866001600160a01b0316630c51ff046040518163ffffffff1660e01b815260040160c06040518083038186803b15801562002c9057600080fd5b505afa15801562002ca5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002ccb919062003aac565b95509550509450945094506000808215801562002ce9575060328611155b801562002cf55750898b115b1562002d8f57600062002d0f6002620019678e8e62002bf0565b905062002d24612710620019678d8a62002799565b985062002d39612710620019678b8962002799565b925062002d47898462002bf0565b915062002d5582826200264b565b915062002d6389826200264b565b98508462002d885762002d7783826200264b565b925062002d8589826200264b565b98505b5062002dc8565b62002da2612710620019678d8962002799565b975062002db7612710620019678a8862002799565b915062002dc5888362002bf0565b90505b62002dd58c888462002579565b60065462002def908d906001600160a01b03168362002579565b7fb9f46e095476339db7821812d7e8ca40dad9d9b08ba10b54eb67faacc2aa558288838360405162002e249392919062004d2b565b60405180910390a1505050505050505b949350505050565b806000805a9050616c3e811062002e655762002e62611b6c6200196783616c3e62002bf0565b91505b8183111562002e72578192505b6040517fdd1fe62c0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063dd1fe62c9062002ebb908990879060040162004568565b600060405180830381600087803b15801562002ed657600080fd5b505af115801562002eeb573d6000803e3d6000fd5b50505050505050505050565b62002f0162001c48565b6001600160a01b0316826001600160a01b03161462002f6b576002546040517f15dacbea0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906315dacbea906200171290859033903090879060040162004480565b5050565b6000806000905060405160208401600082878984018b8d6187965a03f19998505050505050505050565b620014bf8363a9059cbb60e01b848460405160240162002fbb92919062004568565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003242565b801580620030e657506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e9062003090903090869060040162004466565b60206040518083038186803b158015620030a957600080fd5b505afa158015620030be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620030e4919062003fdd565b155b620031055760405162461bcd60e51b81526004016200077a9062004c6c565b620014bf8363095ea7b360e01b848460405160240162002fbb92919062004568565b6000620031b282856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b81526004016200315e92919062004466565b60206040518083038186803b1580156200317757600080fd5b505afa1580156200318c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200237f919062003fdd565b90506200212f8463095ea7b360e01b858460405160240162002fbb92919062004568565b60008183620031fa5760405162461bcd60e51b81526004016200077a9190620045f0565b5060008385816200320757fe5b049150505b9392505050565b600081848411156200323a5760405162461bcd60e51b81526004016200077a9190620045f0565b505050900390565b606062003299826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620032d99092919063ffffffff16565b805190915015620014bf5780806020019051810190620032ba919062003fa5565b620014bf5760405162461bcd60e51b81526004016200077a9062004c0f565b606062002e34848460008585620032f0856200338f565b6200330f5760405162461bcd60e51b81526004016200077a9062004bd8565b60006060866001600160a01b031685876040516200332e9190620043c1565b60006040518083038185875af1925050503d80600081146200336d576040519150601f19603f3d011682016040523d82523d6000602084013e62003372565b606091505b50915091506200338482828662003395565b979650505050505050565b3b151590565b60608315620033a65750816200320c565b825115620033b75782518084602001fd5b8160405162461bcd60e51b81526004016200077a9190620045f0565b610c1d8062004ddd83390190565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160608152602001600081525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160608152602001600081525090565b803562000bbf8162004db4565b60008083601f84011262003489578182fd5b50813567ffffffffffffffff811115620034a1578182fd5b6020830191508360208083028501011115620034bc57600080fd5b9250929050565b600082601f830112620034d4578081fd5b8135620034eb620034e58262004d66565b62004d41565b8181529150602080830190848101818402860182018710156200350d57600080fd5b60005b8481101562003539578135620035268162004db4565b8452928201929082019060010162003510565b505050505092915050565b600082601f83011262003555578081fd5b813562003566620034e58262004d66565b818152915060208083019084810160005b8481101562003539578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c03011215620035b857600080fd5b6040805182810167ffffffffffffffff8282108183111715620035d757fe5b818452620035e78987016200346a565b8352620035f68487016200346a565b8984015260609150818601358484015260809350838601358284015260a0915081860135818111156200362857600080fd5b620036388f8b838a0101620039d2565b9484019490945250939092013592820192909252855250928201929082019060010162003577565b600082601f83011262003671578081fd5b813562003682620034e58262004d66565b818152915060208083019084810160005b848110156200353957813587016040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c03011215620036d457600080fd5b805181810167ffffffffffffffff8282108183111715620036f157fe5b8184528488013583529284013592808411156200370d57600080fd5b50506200371f8b878486010162003738565b8187015286525050928201929082019060010162003693565b600082601f83011262003749578081fd5b62003759620034e5833562004d66565b823581529050602080820190830160005b843581101562003957578135850160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828903011215620037ab57600080fd5b60405180606082011067ffffffffffffffff60608301111715620037cb57fe5b60608101604052620037e1602083013562004db4565b602082013581526040820135602082015267ffffffffffffffff606083013511156200380c57600080fd5b60608201358201915087603f8301126200382557600080fd5b62003838620034e5602084013562004d66565b60208381013582528101906040840160005b602086013581101562003938578135860160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0828f030112156200388e57600080fd5b6040518060a082011067ffffffffffffffff60a08301111715620038ae57fe5b60a08101604052620038c3604083016200346a565b8152620038d3606083016200346a565b60208201526080820135604082015267ffffffffffffffff60a08301351115620038fc57600080fd5b620039118e604060a0850135850101620039d2565b606082015260c091909101356080820152845260209384019391909101906001016200384a565b505060408301525084525060209283019291909101906001016200376a565b50505092915050565b600082601f83011262003971578081fd5b813562003982620034e58262004d66565b818152915060208083019084810181840286018201871015620039a457600080fd5b60005b848110156200353957813584529282019290820190600101620039a7565b803562000bbf8162004dcd565b600082601f830112620039e3578081fd5b813567ffffffffffffffff811115620039f857fe5b62003a2b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162004d41565b915080825283602082850101111562003a4357600080fd5b8060208401602084013760009082016020015292915050565b803560ff8116811462000bbf57600080fd5b60006020828403121562003a80578081fd5b81356200220a8162004db4565b60006020828403121562003a9f578081fd5b81516200220a8162004db4565b60008060008060008060c0878903121562003ac5578182fd5b865162003ad28162004db4565b80965050602087015194506040870151935060608701519250608087015162003afb8162004dcd565b60a088015190925062003b0e8162004dcd565b809150509295509295509295565b60008060006060848603121562003b31578081fd5b833562003b3e8162004db4565b9250602084013562003b508162004db4565b929592945050506040919091013590565b60008060008060008060c0878903121562003b7a578384fd5b863562003b878162004db4565b9550602087013562003b998162004db4565b9450604087013562003bab8162004db4565b9350606087013562003bbd8162004db4565b9250608087013562003bcf8162004db4565b8092505060a087013590509295509295509295565b60008060008060008060008060008060006101608c8e03121562003c06578889fd5b62003c118c6200346a565b9a5062003c2160208d016200346a565b995060408c0135985060608c0135975067ffffffffffffffff8060808e0135111562003c4b578586fd5b62003c5d8e60808f01358f01620034c3565b97508060a08e0135111562003c70578586fd5b62003c828e60a08f01358f01620039d2565b96508060c08e0135111562003c95578586fd5b62003ca78e60c08f01358f0162003960565b95508060e08e0135111562003cba578485fd5b62003ccc8e60e08f01358f0162003960565b945062003cdd6101008e016200346a565b9350806101208e0135111562003cf1578283fd5b5062003d058d6101208e01358e01620039d2565b915062003d166101408d01620039c5565b90509295989b509295989b9093969950565b6000806000806000806000806000806000806101808d8f03121562003d4b578586fd5b62003d568d6200346a565b9b5062003d6660208e016200346a565b9a5060408d0135995060608d0135985060808d0135975067ffffffffffffffff60a08e0135111562003d96578586fd5b62003da88e60a08f01358f01620034c3565b965067ffffffffffffffff60c08e0135111562003dc3578586fd5b62003dd58e60c08f01358f01620039d2565b955067ffffffffffffffff60e08e0135111562003df0578081fd5b62003e028e60e08f01358f0162003960565b945067ffffffffffffffff6101008e0135111562003e1e578081fd5b62003e318e6101008f01358f0162003960565b935062003e426101208e016200346a565b925067ffffffffffffffff6101408e0135111562003e5e578081fd5b62003e718e6101408f01358f01620039d2565b915062003e826101608e01620039c5565b90509295989b509295989b509295989b565b600080600080600080600060c0888a03121562003eaf578081fd5b873562003ebc8162004db4565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff81111562003eed578182fd5b62003efb8a828b0162003477565b909450925062003f10905060a0890162003a5c565b905092959891949750929550565b60008060006040848603121562003f33578081fd5b833562003f408162004db4565b9250602084013567ffffffffffffffff8082111562003f5d578283fd5b818601915086601f83011262003f71578283fd5b81358181111562003f80578384fd5b87602082850101111562003f92578384fd5b6020830194508093505050509250925092565b60006020828403121562003fb7578081fd5b81516200220a8162004dcd565b60006020828403121562003fd6578081fd5b5035919050565b60006020828403121562003fef578081fd5b5051919050565b60006020828403121562004008578081fd5b813567ffffffffffffffff8082111562004020578283fd5b818401915061010080838703121562004037578384fd5b620040428162004d41565b90506200404f836200346a565b81526200405f602084016200346a565b6020820152604083013560408201526060830135606082015262004086608084016200346a565b608082015260a0830135828111156200409d578485fd5b620040ab87828601620039d2565b60a083015250620040bf60c08401620039c5565b60c082015260e083013582811115620040d6578485fd5b620040e48782860162003544565b60e08301525095945050505050565b60006020828403121562004105578081fd5b813567ffffffffffffffff808211156200411d578283fd5b818401915061010080838703121562004134578384fd5b6200413f8162004d41565b90506200414c836200346a565b81526020830135602082015260408301356040820152606083013560608201526200417a608084016200346a565b608082015260a08301358281111562004191578485fd5b6200419f87828601620039d2565b60a083015250620041b360c08401620039c5565b60c082015260e083013582811115620041ca578485fd5b620040e48782860162003660565b600060208284031215620041ea578081fd5b813567ffffffffffffffff8082111562004202578283fd5b818401915061010080838703121562004219578384fd5b620042248162004d41565b905062004231836200346a565b81526020830135602082015260408301356040820152606083013560608201526200425f608084016200346a565b608082015260a08301358281111562004276578485fd5b6200428487828601620039d2565b60a0830152506200429860c08401620039c5565b60c082015260e083013582811115620042af578485fd5b620040e48782860162003738565b600080600080600060808688031215620042d5578283fd5b8535945060208601359350604086013567ffffffffffffffff811115620042fa578384fd5b620043088882890162003477565b90945092506200431d90506060870162003a5c565b90509295509295909350565b60008284526020808501945082825b858110156200436a5781356200434e8162004db4565b6001600160a01b03168752958201959082019060010162004338565b509495945050505050565b600081518084526200438f81602086016020860162004d85565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251620043d581846020870162004d85565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b60006001600160a01b03861682528460208301528360408301526080606083015262004426608083018462004375565b9695505050505050565b60006001600160a01b038716825285602083015284604083015283606083015260a060808301526200338460a083018462004375565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b60006001600160a01b038089168352808816602084015286604084015260ff8616606084015280851660808401525060c060a083015262002be460c083018462004375565b60006001600160a01b038089168352808816602084015286604084015285606084015280851660808401525060c060a083015262002be460c083018462004375565b60006001600160a01b038816825286602083015285604083015284606083015260a0608083015262002be460a08301848662004329565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b9182526001600160a01b0316602082015260400190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6000602082526200220a602083018462004375565b60208082526018908201527f4661696c656420746f207472616e736665722045746865720000000000000000604082015260600190565b6020808252600f908201527f496e76616c696420616464726573730000000000000000000000000000000000604082015260600190565b60208082526036908201527f537461727420696e6465786573206d757374206265203120677265617465722060408201527f7468656e206e756d626572206f662063616c6c65657300000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526019908201527f496e76616c69642077686974656c697374206164647265737300000000000000604082015260600190565b60208082526028908201527f43616e206e6f742063616c6c20546f6b656e5472616e7366657250726f78792060408201527f436f6e7472616374000000000000000000000000000000000000000000000000606082015260800190565b60208082526037908201527f526563656976656420616d6f756e74206f6620746f6b656e7320617265206c6560408201527f7373207468656e20657870656374656420746f6b656e73000000000000000000606082015260800190565b6020808252601c908201527f4661696c656420746f20696e697469616c697a65206164617074657200000000604082015260600190565b60208082526010908201527f496e76616c696420726566657272657200000000000000000000000000000000604082015260600190565b6020808252601a908201527f50617468206e6f742070726f766964656420666f722073776170000000000000604082015260600190565b6020808252601c908201527f43616c6c20746f20756e69737761702070726f7879206661696c656400000000604082015260600190565b60208082526016908201527f54696d65206c6f636b20636865636b206661696c656400000000000000000000604082015260600190565b6020808252601e908201527f436f6e747261637420616c726561647920696e697469616c697a656421210000604082015260600190565b60208082526018908201527f45786368616e6765206e6f742077686974656c69737465640000000000000000604082015260600190565b60208082526012908201527f4e6f2070656e64696e6720726571756573740000000000000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f746f416d6f756e7420697320746f6f206c6f7700000000000000000000000000604082015260600190565b60208082526016908201527f43616c6c20746f2061646170746572206661696c656400000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f4175677573747573537761707065723a20496e76616c69642061636365737300604082015260600190565b60208082526014908201527f45787465726e616c2063616c6c206661696c6564000000000000000000000000604082015260600190565b60208082526030908201527f526563656976656420616d6f756e74206f6620746f6b656e7320617265206c6560408201527f7373207468656e20657870656374656400000000000000000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60208082526016908201527f546f20616d6f756e742063616e206e6f74206265203000000000000000000000604082015260600190565b90815260200190565b6000858252846020830152606060408301526200442660608301848662004329565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171562004d5e57fe5b604052919050565b600067ffffffffffffffff82111562004d7b57fe5b5060209081020190565b60005b8381101562004da257818101518382015260200162004d88565b838111156200212f5750506000910152565b6001600160a01b038116811462004dca57600080fd5b50565b801515811462004dca57600080fdfe608060405234801561001057600080fd5b50604051610c1d380380610c1d83398101604081905261002f916100ac565b60006100396100a8565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b03929092169190911790556100da565b3390565b6000602082840312156100bd578081fd5b81516001600160a01b03811681146100d3578182fd5b9392505050565b610b34806100e96000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80638da5cb5b116100505780638da5cb5b146100b2578063dd1fe62c146100ba578063f2fde38b146100cd57610072565b806315dacbea14610077578063715018a61461008c5780637fb9312714610094575b600080fd5b61008a6100853660046107bf565b6100e0565b005b61008a61016d565b61009c610238565b6040516100a99190610886565b60405180910390f35b61009c610254565b61008a6100c8366004610809565b610270565b61008a6100db3660046107a5565b61037b565b6100e86104b1565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b60405180910390fd5b61016773ffffffffffffffffffffffffffffffffffffffff85168484846104b5565b50505050565b6101756104b1565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146101c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6102786104b1565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146102cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b6001546040517f079d229f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063079d229f9061032490859085906004016108d8565b602060405180830381600087803b15801561033e57600080fd5b505af1158015610352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103769190610852565b505050565b6103836104b1565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146103d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a09565b73ffffffffffffffffffffffffffffffffffffffff8116610424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c9061094f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b610167846323b872dd60e01b8585856040516024016104d6939291906108a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915260606105b5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166106099092919063ffffffff16565b80519091501561037657808060200190518101906105d39190610832565b610376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a75565b60606106188484600085610622565b90505b9392505050565b60608247101561065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c906109ac565b61066785610724565b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c90610a3e565b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516106c7919061086a565b60006040518083038185875af1925050503d8060008114610704576040519150601f19603f3d011682016040523d82523d6000602084013e610709565b606091505b509150915061071982828661072e565b979650505050505050565b803b15155b919050565b6060831561073d57508161061b565b82511561074d5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013c91906108fe565b803573ffffffffffffffffffffffffffffffffffffffff8116811461072957600080fd5b6000602082840312156107b6578081fd5b61061b82610781565b600080600080608085870312156107d4578283fd5b6107dd85610781565b93506107eb60208601610781565b92506107f960408601610781565b9396929550929360600135925050565b6000806040838503121561081b578182fd5b61082483610781565b946020939093013593505050565b600060208284031215610843578081fd5b8151801515811461061b578182fd5b600060208284031215610863578081fd5b5051919050565b6000825161087c818460208701610ad2565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600060208252825180602084015261091d816040850160208701610ad2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60005b83811015610aed578181015183820152602001610ad5565b83811115610167575050600091015256fea2646970667358221220ab62661474abad01a8ead0fb0a1c72f0b0032e0f272241e9e47d63d3fc96b43164736f6c63430007050033a26469706673582212209fcc3942e20e131e2169fad7f00d16b3902bcb8c8acdc96018b0ad3ab019b2ce64736f6c63430007050033
Deployed Bytecode Sourcemap
31820:28542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38422:688;;;;;;:::i;:::-;;:::i;:::-;;34766:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34871:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33222:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34068:453::-;;;;;;;;;;-1:-1:-1;34068:453:0;;;;;:::i;:::-;;:::i;34529:110::-;;;;;;;;;;;;;:::i;37730:684::-;;;;;;:::i;:::-;;:::i;35208:91::-;;;;;;;;;;;;;:::i;31444:108::-;;;;;;;;;;-1:-1:-1;31444:108:0;;;;;:::i;:::-;;:::i;36572:572::-;;;;;;:::i;:::-;;:::i;28661:140::-;;;;;;;;;;;;;:::i;36143:211::-;;;;;;;;;;-1:-1:-1;36143:211:0;;;;;:::i;:::-;;:::i;28021:79::-;;;;;;;;;;;;;:::i;44817:2097::-;;;;;;:::i;:::-;;:::i;35964:171::-;;;;;;;;;;-1:-1:-1;35964:171:0;;;;;:::i;:::-;;:::i;35091:109::-;;;;;;;;;;;;;:::i;33317:743::-;;;;;;;;;;-1:-1:-1;33317:743:0;;;;;:::i;:::-;;:::i;36362:202::-;;;;;;;;;;-1:-1:-1;36362:202:0;;;;;:::i;:::-;;:::i;39118:1376::-;;;;;;:::i;:::-;;:::i;35550:406::-;;;;;;;;;;;;;:::i;29577:227::-;;;;;;;;;;-1:-1:-1;29577:227:0;;;;;:::i;:::-;;:::i;34647:111::-;;;;;;;;;;;;;:::i;34971:112::-;;;;;;;;;;;;;:::i;40696:1206::-;;;;;;:::i;:::-;;:::i;31560:117::-;;;;;;;;;;;;;:::i;35307:235::-;;;;;;;;;;-1:-1:-1;35307:235:0;;;;;:::i;:::-;;:::i;44529:155::-;;;;;;;;;;-1:-1:-1;44529:155:0;;;;;:::i;:::-;;:::i;40502:186::-;;;;;;;;;;-1:-1:-1;40502:186:0;;;;;:::i;:::-;;:::i;47046:2455::-;;;;;;:::i;:::-;;:::i;28956:236::-;;;;;;;;;;-1:-1:-1;28956:236:0;;;;;:::i;:::-;;:::i;31325:111::-;;;;;;;;;;-1:-1:-1;31325:111:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37152:570::-;;;;;;:::i;:::-;;:::i;49634:1591::-;;;;;;:::i;:::-;;:::i;38422:688::-;38759:13;;38800:230;;38722:12;;38736:19;;-1:-1:-1;;;;;38759:13:0;;;;38841:40;;38800:230;;38900:7;;38926:8;;38953;;38980:12;;39011:4;;;;38800:230;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38759:282;;;;38800:230;38759:282;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38721:320;;;;39060:7;39052:48;;;;-1:-1:-1;;;39052:48:0;;;;;;;:::i;:::-;;;;;;;;;38422:688;;;;;;;;;:::o;34766:97::-;34842:13;;-1:-1:-1;;;;;34842:13:0;34766:97;:::o;34871:92::-;34941:14;;;;;;;;;;;;;;;;;34871:92;:::o;33222:87::-;33292:9;;33222:87;:::o;34068:453::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;34187:12:::1;::::0;;34208:31:::1;::::0;;;;;;;-1:-1:-1;;;;;34187:12:0;;::::1;::::0;:20:::1;::::0;:12;;34208:29:::1;::::0;:31;;::::1;::::0;::::1;::::0;;;;;;;;;34187:12;34208:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34241:7;34187:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34165:136;;;;-1:-1:-1::0;;;34165:136:0::1;;;;;;;:::i;:::-;34313:12;34330:7;-1:-1:-1::0;;;;;34330:20:0::1;34374:29;;;34405:4;;34351:59;;;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;34330:81;;::::1;::::0;34351:59;34330:81:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34312:99;;;34430:7;34422:48;;;;-1:-1:-1::0;;;34422:48:0::1;;;;;;;:::i;:::-;34486:27;::::0;-1:-1:-1;;;;;34486:27:0;::::1;::::0;::::1;::::0;;;::::1;28301:1;34068:453:::0;;;:::o;34529:110::-;34611:20;;-1:-1:-1;;;;;34611:20:0;34529:110;:::o;37730:684::-;38064:13;;38105:229;;38027:12;;38041:19;;-1:-1:-1;;;;;38064:13:0;;;;38146:39;;38105:229;;38204:7;;38230:8;;38257:11;;38287:9;;38315:4;;;;38105:229;;;:::i;35208:91::-;35281:10;;-1:-1:-1;;;;;35281:10:0;35208:91;:::o;31444:108::-;31526:18;;;;:13;:18;;;;;;;;;31519:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31494:12;;31526:18;;31519:25;;31526:18;31519:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31444:108;;;;:::o;36572:572::-;36850:13;;36891:173;;36813:12;;36827:19;;-1:-1:-1;;;;;36850:13:0;;;;36932:36;;36891:173;;36987:8;;37014:12;;37045:4;;;;36891:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36850:225;;;;36891:173;36850:225;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36812:263;;;;37094:7;37086:48;;;;-1:-1:-1;;;37086:48:0;;;;;;;:::i;:::-;36572:572;;;;;;;:::o;28661:140::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;28744:6:::1;::::0;28723:40:::1;::::0;28760:1:::1;::::0;-1:-1:-1;;;;;28744:6:0::1;::::0;28723:40:::1;::::0;28760:1;;28723:40:::1;28774:6;:19:::0;;;::::1;::::0;;28661:140::o;36143:211::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36234:29:0;::::1;36226:57;;;;-1:-1:-1::0;;;36226:57:0::1;;;;;;;:::i;:::-;36294:16;:52:::0;;;::::1;-1:-1:-1::0;;;;;36294:52:0;;;::::1;::::0;;;::::1;::::0;;36143:211::o;28021:79::-;28086:6;;-1:-1:-1;;;;;28086:6:0;28021:79;:::o;44817:2097::-;44931:7;44956:15;44974:9;45016:14;;45062:15;;;;45107:13;;;;45156:19;;;;45216:16;;;;44956:27;;-1:-1:-1;45016:14:0;;45062:15;;45107:13;;44996:17;;-1:-1:-1;;;;;45216:30:0;;:62;;45262:4;:16;;;45216:62;;;45249:10;45216:62;45314:13;;;;45365:9;;;;45408:11;;45186:92;;-1:-1:-1;45314:13:0;;45385:15;;45365:9;;45408:15;;;;45403:21;;;;;;;;;;;;:24;;;45385:42;;45438:18;45459:4;:18;;;45438:39;;45562:1;45543:8;45537:22;:26;45529:55;;;;-1:-1:-1;;;45529:55:0;;;;;;;:::i;:::-;45616:1;45605:8;:12;45597:47;;;;-1:-1:-1;;;45597:47:0;;;;;;;:::i;:::-;45757:18;:16;:18::i;:::-;-1:-1:-1;;;;;45744:31:0;:9;-1:-1:-1;;;;;45744:31:0;;45740:229;;45792:19;;:165;;;;;-1:-1:-1;;;;;45792:19:0;;;;:32;;:165;;45843:9;;45871:10;;45908:4;;45932:10;;45792:165;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45740:229;45981:90;46007:9;46031:10;46056:4;45981:11;:90::i;:::-;46086:22;46111:79;46144:7;46174:4;46111:18;:79::i;:::-;46086:104;;46243:8;46225:14;:26;;46203:124;;;;-1:-1:-1;;;46203:124:0;;;;;;;:::i;:::-;46342:164;46381:7;46403:14;46432;46461:11;46487:8;46342:24;:164::i;:::-;46523:13;46519:115;;;46589:19;;46553:69;;46569:10;;-1:-1:-1;;;;;46589:19:0;46611:10;46553:15;:69::i;:::-;46748:7;-1:-1:-1;;;;;46651:221:0;46724:9;-1:-1:-1;;;;;46651:221:0;46698:11;-1:-1:-1;;;;;46651:221:0;;46673:10;46770;46795:14;46824;46853:8;46651:221;;;;;;;;;;:::i;:::-;;;;;;;;46892:14;44817:2097;-1:-1:-1;;;;;;;;;;;;44817:2097:0:o;35964:171::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36051:23:0;::::1;36043:51;;;;-1:-1:-1::0;;;36043:51:0::1;;;;;;;:::i;:::-;36105:10;:22:::0;;;::::1;-1:-1:-1::0;;;;;36105:22:0;;;::::1;::::0;;;::::1;::::0;;35964:171::o;35091:109::-;35179:12;;-1:-1:-1;;;;;35179:12:0;35091:109;:::o;33317:743::-;33579:19;;-1:-1:-1;;;;;33579:19:0;33571:42;33563:85;;;;-1:-1:-1;;;33563:85:0;;;;;;;:::i;:::-;33659:16;:52;;;;-1:-1:-1;;;;;33659:52:0;;;;;33763:34;;-1:-1:-1;;33786:10:0;;33763:34;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33808:19:0;:62;;;;;;-1:-1:-1;;;;;33808:62:0;;;;;;;33881:12;:38;;;;;;;;;;;;;;33930:10;:22;;;;;;;;;;;;;;-1:-1:-1;33963:13:0;:28;;;;;;;;;;;;;;;34002:6;:19;;34011:10;34002:19;;;;;;;;;-1:-1:-1;;34032:9:0;:20;33317:743::o;36362:202::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36450:25:0;::::1;36442:63;;;;-1:-1:-1::0;;;36442:63:0::1;;;;;;;:::i;:::-;36516:12;:40:::0;;;::::1;-1:-1:-1::0;;;;;36516:40:0;;;::::1;::::0;;;::::1;::::0;;36362:202::o;39118:1376::-;-1:-1:-1;;;;;39565:25:0;;;:52;;39606:11;39565:52;;;39593:10;39565:52;39551:66;;39628:19;39650:374;39682:9;39706:7;39728:10;39753:8;39776;39854:7;39876:12;39903;39930:6;39951:11;39977:8;40000:13;39650:17;:374::i;:::-;39628:396;;40037:23;40063:81;40096:9;40128:4;40063:18;:81::i;:::-;40037:107;-1:-1:-1;40161:19:0;;40157:121;;40197:69;40226:9;40238:10;40250:15;40197:20;:69::i;:::-;40391:7;-1:-1:-1;;;;;40295:191:0;40367:9;-1:-1:-1;;;;;40295:191:0;40341:11;-1:-1:-1;;;;;40295:191:0;;40316:10;40413;40438:14;40467:8;40295:191;;;;;;;;;:::i;:::-;;;;;;;;39118:1376;;;;;;;;;;;;;:::o;35550:406::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;35681:9:::1;::::0;35655:21:::1;::::0;:36:::1;::::0;:25:::1;:36::i;:::-;35639:12;:52;;35617:124;;;;-1:-1:-1::0;;;35617:124:0::1;;;;;;;:::i;:::-;35762:20;::::0;-1:-1:-1;;;;;35762:20:0::1;35754:65;;;;-1:-1:-1::0;;;35754:65:0::1;;;;;;;:::i;:::-;35856:1;35832:21;:25:::0;35884:20:::1;::::0;;35868:13:::1;:36:::0;;;;;::::1;-1:-1:-1::0;;;;;35884:20:0;::::1;35868:36;::::0;;;35915:33:::1;::::0;;35550:406::o;29577:227::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;29748:48:::1;29769:5;29776:11;29789:6;29748:20;:48::i;:::-;29577:227:::0;;;:::o;34647:111::-;34729:21;;34647:111;:::o;34971:112::-;35058:16;;-1:-1:-1;;;;;35058:16:0;34971:112;:::o;40696:1206::-;41162:22;-1:-1:-1;;;;;41216:25:0;;;:52;;41257:11;41216:52;;;41244:10;41216:52;41202:66;;41296:325;41328:9;41352:7;41374:10;41399:8;41422:14;41451:7;41473:12;41500;41527:6;41548:11;41574:8;41597:13;41296:17;:325::i;:::-;41279:342;;41736:7;-1:-1:-1;;;;;41639:221:0;41712:9;-1:-1:-1;;;;;41639:221:0;41686:11;-1:-1:-1;;;;;41639:221:0;;41661:10;41758;41783:14;41812;41841:8;41639:221;;;;;;;;;;:::i;31560:117::-;31649:19;;-1:-1:-1;;;;;31649:19:0;31560:117;:::o;35307:235::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35395:26:0;::::1;35387:54;;;;-1:-1:-1::0;;;35387:54:0::1;;;;;;;:::i;:::-;35476:12;35452:21;:36:::0;35499:20:::1;:35:::0;;;::::1;-1:-1:-1::0;;;;;35499:35:0;;;::::1;::::0;;;::::1;::::0;;35307:235::o;44529:155::-;33062:10;33084:4;33062:27;33040:108;;;;-1:-1:-1;;;33040:108:0;;;;;;;:::i;:::-;44613:30:::1;::::0;;;;44596:14:::1;::::0;-1:-1:-1;;;;;44613:15:0;::::1;::::0;::::1;::::0;:30:::1;::::0;44637:4:::1;::::0;44613:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44654:22;::::0;;;;44596:47;;-1:-1:-1;;;;;;44654:14:0;::::1;::::0;::::1;::::0;:22:::1;::::0;44596:47;;44654:22:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33159:1;44529:155:::0;:::o;40502:186::-;33062:10;33084:4;33062:27;33040:108;;;;-1:-1:-1;;;33040:108:0;;;;;;;:::i;:::-;40648:32:::1;40662:2;40666:5;40673:6;40648:13;:32::i;47046:2455::-:0;47167:7;47192:15;47210:9;47252:14;;47298:15;;;;47343:13;;;;47392:19;;;;47452:16;;;;47192:27;;-1:-1:-1;47252:14:0;;47298:15;;47343:13;;47232:17;;-1:-1:-1;;;;;47452:30:0;;:62;;47498:4;:16;;;47452:62;;;47485:10;47452:62;47422:92;;47525:22;47550:4;:13;;;47525:38;;47574:32;47609:4;:9;;;47574:44;;47629:15;47647:4;47652:1;47647:7;;;;;;;;;;;;;;:12;;;47682:1;47660:4;47665:1;47660:7;;;;;;;;;;;;;;:12;;;:19;:23;47647:37;;;;;;;;;;;;;;:40;;;47629:58;;47698:18;47719:4;:18;;;47698:39;;47822:1;47803:8;47797:22;:26;47789:55;;;;-1:-1:-1;;;47789:55:0;;;;;;;:::i;:::-;47876:1;47865:8;:12;47857:47;;;;-1:-1:-1;;;47857:47:0;;;;;;;:::i;:::-;48017:18;:16;:18::i;:::-;-1:-1:-1;;;;;48004:31:0;:9;-1:-1:-1;;;;;48004:31:0;;48000:229;;48052:19;;:165;;;;;-1:-1:-1;;;;;48052:19:0;;;;:32;;:165;;48103:9;;48131:10;;48168:4;;48192:10;;48052:165;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48000:229;48246:7;48241:420;48269:4;:11;48259:22;;:1;:22;;;48241:420;;;48303:19;48325:52;48371:5;48325:41;48340:4;48345:1;48340:7;;;;;;;;;;;;;;;;:25;;;48325:10;:14;;:41;;;;:::i;:::-;:45;;:52::i;:::-;48303:74;;48415:1;48401:4;:11;:15;48396:1;:20;;;48392:128;;;48451:53;48478:9;48498:4;48451:18;:53::i;:::-;48437:67;;48392:128;48534:115;48564:9;48592:11;48622:4;48627:1;48622:7;;;;;;;;;;;;;;;;:12;;;48534:11;:115::i;:::-;-1:-1:-1;48283:3:0;;48241:420;;;;48673:22;48698:79;48731:7;48761:4;48698:18;:79::i;28956:236::-;28233:6;;-1:-1:-1;;;;;28233:6:0;28243:10;28233:20;28225:65;;;;-1:-1:-1;;;28225:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29037:22:0;::::1;29029:73;;;;-1:-1:-1::0;;;29029:73:0::1;;;;;;;:::i;:::-;29139:6;::::0;29118:38:::1;::::0;-1:-1:-1;;;;;29118:38:0;;::::1;::::0;29139:6:::1;::::0;29118:38:::1;::::0;29139:6:::1;::::0;29118:38:::1;29167:6;:17:::0;;;::::1;-1:-1:-1::0;;;;;29167:17:0;;;::::1;::::0;;;::::1;::::0;;28956:236::o;31325:111::-;31381:4;31405:23;;;;;;;;;;;;;;31325:111::o;37152:570::-;37429:13;;37470:172;;37392:12;;37406:19;;-1:-1:-1;;;;;37429:13:0;;;;37511:35;;37470:172;;37565:11;;37595:9;;37623:4;;;;37470:172;;;:::i;49634:1591::-;49788:14;;49834:15;;;;49879:13;;;;49933:16;;;;49741:7;;49788:14;49834:15;49879:13;49741:7;;-1:-1:-1;;;;;49933:30:0;;:62;;49979:4;:16;;;49933:62;;;49966:10;49933:62;50031:13;;;;50087:10;;;;50126:12;;;;50170:18;;;;50251:22;;49903:92;;-1:-1:-1;50031:13:0;;50087:10;;50126:12;;50243:55;;;;-1:-1:-1;;;50243:55:0;;;;;;;:::i;:::-;50330:1;50319:8;:12;50311:47;;;;-1:-1:-1;;;50311:47:0;;;;;;;:::i;:::-;50371:22;50396:163;50421:9;50445:7;50467:10;50492:8;50515:5;50535:13;50396:10;:163::i;:::-;50371:188;;50572:158;50611:7;50633:8;50656:14;50685:11;50711:8;50572:24;:158::i;:::-;50743:23;50769:81;50802:9;50834:4;50769:18;:81::i;:::-;50743:107;-1:-1:-1;50867:19:0;;50863:112;;50903:60;50924:9;50935:10;50947:15;50903:20;:60::i;:::-;51088:7;-1:-1:-1;;;;;50992:191:0;51064:9;-1:-1:-1;;;;;50992:191:0;51038:11;-1:-1:-1;;;;;50992:191:0;;51013:10;51110;51135:14;51164:8;50992:191;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;51203:14:0;49634:1591;-1:-1:-1;;;;;;;;;;49634:1591:0:o;19548:75::-;17226:42;19548:75;:::o;53839:2443::-;54016:1;54002:4;:11;:15;53994:54;;;;-1:-1:-1;;;53994:54:0;;;;;;;:::i;:::-;54142:6;54137:2138;54158:4;:11;54154:1;:15;54137:2138;;;54274:18;54299:1;54295;:5;:34;;54320:9;54295:34;;;54303:4;54312:1;54308;:5;54303:11;;;;;;;;;;;;;;:14;;;54295:34;54274:55;;54344:16;54363:4;54368:1;54363:7;;;;;;;;;;;;;;:10;;;54344:29;;54390:19;54416:1;54412;:5;:66;;54468:10;54412:66;;;54420:45;54439:10;54459:4;54420:18;:45::i;:::-;54390:88;;54501:1;54497;:5;:41;;;;;54520:18;:16;:18::i;:::-;-1:-1:-1;;;;;54506:32:0;:10;-1:-1:-1;;;;;54506:32:0;;54497:41;54493:136;;;54573:40;54589:4;54594:1;54589:7;;;;;;;;;;;;;;:23;;;54573:11;:15;;:40;;;;:::i;:::-;54559:54;;54493:136;54650:6;54645:1619;54666:4;54671:1;54666:7;;;;;;;;;;;;;;:14;;;:21;54662:1;:25;54645:1619;;;54713:24;;:::i;:::-;54740:4;54745:1;54740:7;;;;;;;;;;;;;;:14;;;54755:1;54740:17;;;;;;;;;;;;;;;;;;;54858:12;;;54879:31;;;;;;;;54740:17;;-1:-1:-1;;;;;;54858:12:0;;;;:20;;:12;;54879:29;;:31;;;;54740:17;54879:31;;;;;;;54858:12;54879:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54912:14;;54858:69;;;;;;;;;;;;;54912:14;54858:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54828:167;;;;-1:-1:-1;;;54828:167:0;;;;;;;:::i;:::-;55143:20;55166:41;55201:5;55166:30;55182:5;:13;;;55166:11;:15;;:30;;;;:::i;:41::-;55242:16;;;;55143:64;;-1:-1:-1;55283:5:0;;;;;:42;;;55297:28;55323:1;55297:4;55302:1;55297:7;;;;;;;;;;;;;;:14;;;:21;:25;;:28;;;;:::i;:::-;55292:1;:33;55283:42;55279:425;;;55350:14;55367:54;55394:10;55415:4;55367:18;:54::i;:::-;55350:71;;55464:6;55446:24;;55522:18;:16;:18::i;:::-;-1:-1:-1;;;;;55499:41:0;55507:10;-1:-1:-1;;;;;55499:41:0;;55495:190;;;55635:26;:15;55655:5;55635:19;:26::i;:::-;55617:44;;55495:190;55279:425;;55792:14;;56083:20;;;;56130:13;;;;55842:324;;55775:12;;-1:-1:-1;;;;;55792:27:0;;55891:23;;55842:324;;55941:10;;55978:8;;56013:15;;56055:1;;56083:20;56130:13;55842:324;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55792:393;;;;55842:324;55792:393;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55774:411;;;56214:7;56206:42;;;;-1:-1:-1;;;56206:42:0;;;;;;;:::i;:::-;-1:-1:-1;;54689:3:0;;;;;-1:-1:-1;54645:1619:0;;-1:-1:-1;54645:1619:0;;-1:-1:-1;;54171:3:0;;;;;-1:-1:-1;54137:2138:0;;-1:-1:-1;54137:2138:0;;;53839:2443;;;:::o;20785:296::-;20902:7;-1:-1:-1;;;;;20931:20:0;;17226:42;20931:20;20927:147;;;-1:-1:-1;;;;;;20975:15:0;;;20968:22;;20927:147;21030:32;;;;;-1:-1:-1;;;;;21030:23:0;;;;;:32;;21054:7;;21030:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21023:39;;20927:147;20785:296;;;;:::o;51302:1120::-;51620:16;;:45;;;;;51567:14;;51541:23;;-1:-1:-1;;;;;51620:16:0;;;;:35;;:45;;51656:8;;51620:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51594:71;;51708:11;51724:129;51747:7;51769:14;51798;51827:15;51724:8;:129::i;:::-;51706:147;-1:-1:-1;51882:23:0;:14;51706:147;51882:18;:23::i;:::-;51864:41;;52055:14;52037:15;:32;52036:46;;;;-1:-1:-1;52074:8:0;;52036:46;52032:307;;;52099:29;52131:42;52171:1;52131:35;:15;52151:14;52131:19;:35::i;:42::-;52099:74;-1:-1:-1;52206:42:0;:15;52099:74;52206:19;:42::i;:::-;52293:10;;52188:60;;-1:-1:-1;52263:64:0;;52284:7;;-1:-1:-1;;;;;52293:10:0;52305:21;52263:20;:64::i;:::-;52032:307;;52351:59;52372:7;52381:11;52394:15;52351:20;:59::i;:::-;51302:1120;;;;;;;;:::o;21163:448::-;21334:5;21370:4;21405:5;21315:16;21440:100;21498:31;21370:4;21498:16;21405:5;21512:1;21498:13;:16::i;:::-;:20;;:31::i;:::-;21440:53;21484:8;21440:39;21469:9;21440:10;;:14;:39::i;:::-;:43;;:53::i;:100::-;21423:117;;21553:50;21567:7;21576:18;21596:6;21553:13;:50::i;42262:2124::-;42719:22;42778:1;42767:8;:12;42759:44;;;;-1:-1:-1;;;42759:44:0;;;;;;;:::i;:::-;42858:12;:19;42836:7;:14;42853:1;42836:18;:41;42814:145;;;;-1:-1:-1;;;42814:145:0;;;;;;;:::i;:::-;42972:15;42990:9;42972:27;;43130:46;43154:9;43165:10;43130:23;:46::i;:::-;43194:9;43189:606;43213:7;:14;43209:1;:18;43189:606;;;43297:19;;43275:10;;-1:-1:-1;;;;;43297:19:0;;;;43275:7;;43283:1;;43275:10;;;;;;;;;;;;-1:-1:-1;;;;;43275:42:0;;;43249:144;;;;-1:-1:-1;;;43249:144:0;;;;;;;:::i;:::-;43410:11;43424:305;43455:7;43463:1;43455:10;;;;;;;;;;;;;;43498:6;43505:1;43498:9;;;;;;;;;;;;;;43542:12;43555:1;43542:15;;;;;;;;;;;;;;43604:40;43628:12;43641:1;43628:15;;;;;;;;;;;;;;43604:12;43617:1;43621;43617:5;43604:19;;;;;;;;;;;;;;:23;;:40;;;;:::i;:::-;43685:12;43424;:305::i;:::-;43410:319;;43752:6;43744:39;;;;-1:-1:-1;;;43744:39:0;;;;;;;:::i;:::-;-1:-1:-1;43229:3:0;;43189:606;;;;43824:79;43857:7;43887:4;43824:18;:79::i;:::-;43807:96;;43956:8;43938:14;:26;;43916:124;;;;-1:-1:-1;;;43916:124:0;;;;;;;:::i;:::-;44053:164;44092:7;44114:14;44143;44172:11;44198:8;44053:24;:164::i;:::-;44234:13;44230:115;;;44300:19;;44264:69;;44280:10;;-1:-1:-1;;;;;44300:19:0;44322:10;44264:15;:69::i;:::-;44357:21;42262:2124;;;;;;;;;;;;;;:::o;20290:487::-;20442:10;;20438:330;;-1:-1:-1;;;;;20473:20:0;;17226:42;20473:20;20469:288;;;20515:11;20532;-1:-1:-1;;;;;20532:16:0;20556:6;20569:4;20532:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20514:64;;;20605:6;20597:43;;;;-1:-1:-1;;;20597:43:0;;;;;;;:::i;:::-;20469:288;;;;20694:47;-1:-1:-1;;;;;20694:26:0;;20721:11;20734:6;20694:26;:47::i;7346:181::-;7404:7;7436:5;;;7460:6;;;;7452:46;;;;-1:-1:-1;;;7452:46:0;;;;;;;:::i;19793:489::-;-1:-1:-1;;;;;19925:20:0;;17226:42;19925:20;19921:354;;20025:49;;;;;19985:5;;19962:13;;-1:-1:-1;;;;;20025:16:0;;;;;:49;;20050:4;;20057:16;;20025:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20008:66;;20107:6;20095:9;:18;20091:173;;;20134:39;-1:-1:-1;;;;;20134:18:0;;20153:16;20171:1;20134:18;:39::i;:::-;20192:56;-1:-1:-1;;;;;20192:28:0;;20221:16;17420:12;20192:28;:56::i;:::-;19921:354;;19793:489;;;:::o;8700:471::-;8758:7;9003:6;8999:47;;-1:-1:-1;9033:1:0;9026:8;;8999:47;9070:5;;;9074:1;9070;:5;:1;9094:5;;;;;:10;9086:56;;;;-1:-1:-1;;;9086:56:0;;;;;;;:::i;9647:132::-;9705:7;9732:39;9736:1;9739;9732:39;;;;;;;;;;;;;;;;;:3;:39::i;56329:1881::-;56570:7;56595:15;56613:9;56595:27;;56735:18;:16;:18::i;:::-;-1:-1:-1;;;;;56722:31:0;:9;-1:-1:-1;;;;;56722:31:0;;56718:229;;56770:19;;:165;;;;;-1:-1:-1;;;;;56770:19:0;;;;:32;;:165;;56821:9;;56849:10;;56886:4;;56910:10;;56770:165;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56718:229;56964:6;56959:826;56980:6;:13;56976:1;:17;56959:826;;;57015:27;;:::i;:::-;57045:6;57052:1;57045:9;;;;;;;;;;;;;;;;;;;57143:12;;;57164:31;;;;;;;;57045:9;;-1:-1:-1;;;;;;57143:12:0;;;;:20;;:12;;57164:29;;:31;;;;57045:9;57164:31;;;;;;;57143:12;57164:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57197:14;;57143:69;;;;;;;;;;;;;57197:14;57143:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57117:155;;;;-1:-1:-1;;;57117:155:0;;;;;;;:::i;:::-;57335:12;57352:5;:14;;;-1:-1:-1;;;;;57352:27:0;57443:22;;;57488:9;57520:7;57550:5;:16;;;57589:5;:14;;;57626:5;:20;;;57669:5;:13;;;57398:303;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57352:364;;;;57398:303;57352:364;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57334:382;;;57739:7;57731:42;;;;-1:-1:-1;;;57731:42:0;;;;;;;:::i;:::-;-1:-1:-1;;56995:3:0;;56959:826;;;;57797:22;57822:79;57855:7;57885:4;57822:18;:79::i;:::-;57797:104;;57952:8;57934:14;:26;;57912:131;;;;-1:-1:-1;;;57912:131:0;;;;;;;:::i;:::-;58060:13;58056:115;;;58126:19;;58090:69;;58106:10;;-1:-1:-1;;;;;58126:19:0;58148:10;58090:15;:69::i;:::-;58188:14;56329:1881;-1:-1:-1;;;;;;;;56329:1881:0:o;7810:136::-;7868:7;7895:43;7899:1;7902;7895:43;;;;;;;;;;;;;;;;;:3;:43::i;58218:2141::-;58403:11;-1:-1:-1;;;;;58528:29:0;;58524:72;;-1:-1:-1;58582:1:0;58574:10;;58524:72;58623:32;58670:18;58703:27;58760;58802:23;58848:15;-1:-1:-1;;;;;58839:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58608:273;;;;;;;;;;;58894:20;58929:21;58972:18;58971:19;:39;;;;;59008:2;58994:10;:16;;58971:39;:74;;;;;59031:14;59014;:31;58971:74;58967:1163;;;59062:28;59093:41;59132:1;59093:34;:14;59112;59093:18;:34::i;:41::-;59062:72;-1:-1:-1;59202:41:0;59237:5;59202:30;:14;59221:10;59202:18;:30::i;:41::-;59196:47;-1:-1:-1;59314:39:0;59347:5;59314:28;59196:47;59322:19;59314:7;:28::i;:39::-;59299:54;-1:-1:-1;59437:21:0;:3;59299:54;59437:7;:21::i;:::-;59421:37;-1:-1:-1;59489:39:0;59421:37;59507:20;59489:17;:39::i;:::-;59473:55;-1:-1:-1;59551:29:0;:3;59559:20;59551:7;:29::i;:::-;59545:35;;59602:22;59597:171;;59660:38;:12;59677:20;59660:16;:38::i;:::-;59645:53;-1:-1:-1;59723:29:0;:3;59731:20;59723:7;:29::i;:::-;59717:35;;59597:171;58967:1163;;;;59862:41;59897:5;59862:30;:14;59881:10;59862:18;:30::i;:41::-;59856:47;-1:-1:-1;59974:39:0;60007:5;59974:28;59856:47;59982:19;59974:7;:28::i;:39::-;59959:54;-1:-1:-1;60097:21:0;:3;59959:54;60097:7;:21::i;:::-;60081:37;;58967:1163;60140:61;60161:7;60170:16;60188:12;60140:20;:61::i;:::-;60242:10;;60212:56;;60233:7;;-1:-1:-1;;;;;60242:10:0;60254:13;60212:20;:56::i;:::-;60286:42;60295:3;60300:12;60314:13;60286:42;;;;;;;;:::i;:::-;;;;;;;;60339:12;;;;;;;58218:2141;;;;;;;:::o;21681:513::-;21810:6;21787:20;;21877:9;21863:23;;21910:5;21903:3;:12;21899:98;;21948:37;21967:17;21948:14;:3;21956:5;21948:7;:14::i;:37::-;21932:53;;21899:98;22028:13;22013:12;:28;22009:89;;;22073:13;22058:28;;22009:89;22108:78;;;;;-1:-1:-1;;;;;22108:55:0;;;;;:78;;22164:7;;22173:12;;22108:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21681:513;;;;;;:::o;41910:344::-;42043:18;:16;:18::i;:::-;-1:-1:-1;;;;;42034:27:0;:5;-1:-1:-1;;;;;42034:27:0;;42030:217;;42078:19;;:157;;;;;-1:-1:-1;;;;;42078:19:0;;;;:32;;:157;;42129:5;;42153:10;;42190:4;;42214:6;;42078:157;;;:::i;42030:217::-;41910:344;;:::o;52592:1200::-;52785:4;52807:11;52821:5;52807:19;;52878:4;52872:11;53014:2;53008:4;53004:13;53661:1;53641;53539:10;53509;53506:1;53502:18;53478:5;53448:11;53140:5;53133;53129:17;53106:644;53096:654;52592:1200;-1:-1:-1;;;;;;;;;52592:1200:0:o;13926:177::-;14009:86;14029:5;14059:23;;;14084:2;14088:5;14036:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14009:19;:86::i;14585:622::-;14955:10;;;14954:62;;-1:-1:-1;14971:39:0;;;;;-1:-1:-1;;;;;14971:15:0;;;;;:39;;14995:4;;15002:7;;14971:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;14954:62;14946:152;;;;-1:-1:-1;;;14946:152:0;;;;;;;:::i;:::-;15109:90;15129:5;15159:22;;;15183:7;15192:5;15136:62;;;;;;;;;:::i;15215:286::-;15312:20;15335:50;15379:5;15335;-1:-1:-1;;;;;15335:15:0;;15359:4;15366:7;15335:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:50::-;15312:73;;15396:97;15416:5;15446:22;;;15470:7;15479:12;15423:69;;;;;;;;;:::i;10275:278::-;10361:7;10396:12;10389:5;10381:28;;;;-1:-1:-1;;;10381:28:0;;;;;;;;:::i;:::-;;10420:9;10436:1;10432;:5;;;;;;;-1:-1:-1;;10275:278:0;;;;;;:::o;8249:192::-;8335:7;8371:12;8363:6;;;;8355:29;;;;-1:-1:-1;;;8355:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;8407:5:0;;;8249:192::o;15892:761::-;16316:23;16342:69;16370:4;16342:69;;;;;;;;;;;;;;;;;16350:5;-1:-1:-1;;;;;16342:27:0;;;:69;;;;;:::i;:::-;16426:17;;16316:95;;-1:-1:-1;16426:21:0;16422:224;;16568:10;16557:30;;;;;;;;;;;;:::i;:::-;16549:85;;;;-1:-1:-1;;;16549:85:0;;;;;;;:::i;12342:195::-;12445:12;12477:52;12499:6;12507:4;12513:1;12516:12;12445;12797:18;12808:6;12797:10;:18::i;:::-;12789:60;;;;-1:-1:-1;;;12789:60:0;;;;;;;:::i;:::-;12923:12;12937:23;12964:6;-1:-1:-1;;;;;12964:11:0;12984:5;12992:4;12964:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12922:75;;;;13015:52;13033:7;13042:10;13054:12;13015:17;:52::i;:::-;13008:59;12545:530;-1:-1:-1;;;;;;;12545:530:0:o;11912:422::-;12279:20;12318:8;;;11912:422::o;13083:742::-;13198:12;13227:7;13223:595;;;-1:-1:-1;13258:10:0;13251:17;;13223:595;13372:17;;:21;13368:439;;13635:10;13629:17;13696:15;13683:10;13679:2;13675:19;13668:44;13583:148;13778:12;13771:20;;-1:-1:-1;;;13771:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:404::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;315:8;305;298:26;257:2;-1:-1:-1;345:20:1;;388:18;377:30;;374:2;;;427:8;417;410:26;374:2;471:4;463:6;459:17;447:29;;534:3;527:4;519;511:6;507:17;499:6;495:30;491:41;488:50;485:2;;;551:1;548;541:12;485:2;247:314;;;;;:::o;566:769::-;;679:3;672:4;664:6;660:17;656:27;646:2;;701:5;694;687:20;646:2;745:6;732:20;770:69;785:53;831:6;785:53;:::i;:::-;770:69;:::i;:::-;873:21;;;761:78;-1:-1:-1;913:4:1;933:14;;;;967:15;;;1013;;;1001:28;;997:37;;994:46;-1:-1:-1;991:2:1;;;1053:1;1050;1043:12;991:2;1075:1;1085:244;1099:6;1096:1;1093:13;1085:244;;;1174:3;1161:17;1191:33;1218:5;1191:33;:::i;:::-;1237:18;;1275:12;;;;1307;;;;1121:1;1114:9;1085:244;;;1089:3;;;;;636:699;;;;:::o;1340:1672::-;;1462:3;1455:4;1447:6;1443:17;1439:27;1429:2;;1484:5;1477;1470:20;1429:2;1528:6;1515:20;1553:69;1568:53;1614:6;1568:53;:::i;1553:69::-;1656:21;;;1544:78;-1:-1:-1;1696:4:1;1716:14;;;;1750:15;;;1783:1;1793:1213;1807:6;1804:1;1801:13;1793:1213;;;1891:3;1878:17;1870:6;1866:30;1919:4;2030:2;1961:66;1956:2;1951:3;1947:12;1943:85;1939:94;1936:2;;;2046:1;2043;2036:12;1936:2;2073;2108;2102:9;2154:2;2146:6;2142:15;2180:18;2252:6;2240:10;2237:22;2232:2;2220:10;2217:18;2214:46;2211:2;;;2263:9;2211:2;2298:10;2294:2;2287:22;2337:33;2366:2;2362;2358:11;2337:33;:::i;:::-;2329:6;2322:49;2408:33;2437:2;2433;2429:11;2408:33;:::i;:::-;2403:2;2395:6;2391:15;2384:58;2465:2;2455:12;;2525:2;2521;2517:11;2504:25;2499:2;2491:6;2487:15;2480:50;2553:3;2543:13;;2614:2;2610;2606:11;2593:25;2588:2;2580:6;2576:15;2569:50;2642:3;2632:13;;2695:2;2691;2687:11;2674:25;2728:2;2718:8;2715:16;2712:2;;;2744:1;2741;2734:12;2712:2;2785:51;2832:3;2827:2;2816:8;2812:2;2808:17;2804:26;2785:51;:::i;:::-;2768:15;;;2761:76;;;;-1:-1:-1;2887:11:1;;;;2874:25;2857:15;;;2850:50;;;;2913:19;;-1:-1:-1;2952:12:1;;;;2984;;;;1829:1;1822:9;1793:1213;;3017:1327;;3143:3;3136:4;3128:6;3124:17;3120:27;3110:2;;3165:5;3158;3151:20;3110:2;3209:6;3196:20;3234:69;3249:53;3295:6;3249:53;:::i;3234:69::-;3337:21;;;3225:78;-1:-1:-1;3377:4:1;3397:14;;;;3431:15;;;3464:1;3474:864;3488:6;3485:1;3482:13;3474:864;;;3572:3;3559:17;3551:6;3547:30;3600:4;3711:2;3642:66;3637:2;3632:3;3628:12;3624:85;3620:94;3617:2;;;3727:1;3724;3717:12;3617:2;3764;3758:9;3810:2;3802:6;3798:15;3836:18;3908:6;3896:10;3893:22;3888:2;3876:10;3873:18;3870:46;3867:2;;;3919:9;3867:2;3943:22;;;4006:11;;;3993:25;3978:41;;4061:11;;;4048:25;;4089:16;;;4086:2;;;4118:1;4115;4108:12;4086:2;;;4159:72;4227:3;4222:2;4211:8;4207:2;4203:17;4199:26;4159:72;:::i;:::-;4142:15;;;4135:97;4245:19;;-1:-1:-1;;4284:12:1;;;;4316;;;;3510:1;3503:9;3474:864;;4349:2844;;4467:3;4460:4;4452:6;4448:17;4444:27;4434:2;;4489:5;4482;4475:20;4434:2;4515:83;4530:67;4589:6;4576:20;4530:67;:::i;4515:83::-;4646:20;;4632:35;;4506:92;-1:-1:-1;4694:4:1;4683:16;;;;4719:17;;4754:1;4764:2423;4791:6;4778:20;4775:1;4772:27;4764:2423;;;4876:3;4863:17;4855:6;4851:30;4988:4;4919:66;4914:2;4909:3;4905:12;4901:85;4897:96;4894:2;;;5006:1;5003;4996:12;4894:2;5043;5037:9;5130:6;5123:4;5115:6;5111:17;5108:29;5087:18;5080:4;5072:6;5068:17;5065:41;5062:76;5059:2;;;5141:9;5059:2;5188:4;5180:6;5176:17;5172:2;5165:29;5207:55;5255:4;5251:2;5247:13;5234:27;5207:55;:::i;:::-;5311:4;5307:2;5303:13;5290:27;5282:6;5275:43;5378:2;5374;5370:11;5357:25;5350:4;5342:6;5338:17;5331:52;5431:18;5423:4;5419:2;5415:13;5402:27;5399:51;5396:2;;;5463:1;5460;5453:12;5396:2;5519:4;5515:2;5511:13;5498:27;5494:2;5490:36;5480:46;;5566:3;5561:2;5557;5553:11;5549:21;5539:2;;5584:1;5581;5574:12;5539:2;5614:90;5629:74;5696:4;5692:2;5688:13;5675:27;5629:74;:::i;5614:90::-;5783:4;5775:13;;;5762:27;5748:42;;5812:16;;;5862:2;5854:11;;5889:1;5903:1131;5952:4;5948:2;5944:13;5931:27;5926:3;5923:36;5903:1131;;;6056:5;6043:19;6039:2;6035:28;6174:4;6105:66;6100:2;6095:3;6091:12;6087:85;6083:96;6080:2;;;6192:1;6189;6182:12;6080:2;6235;6229:9;6330:8;6323:4;6313:8;6309:19;6306:33;6285:18;6278:4;6268:8;6264:19;6261:43;6258:82;6255:2;;;6343:9;6255:2;6396:4;6386:8;6382:19;6378:2;6371:31;6436:33;6465:2;6461;6457:11;6436:33;:::i;:::-;6426:8;6419:51;6515:35;6544:4;6540:2;6536:13;6515:35;:::i;:::-;6508:4;6498:8;6494:19;6487:64;6615:3;6611:2;6607:12;6594:26;6589:2;6579:8;6575:17;6568:53;6673:18;6665:4;6661:2;6657:13;6644:27;6641:51;6638:2;;;6705:1;6702;6695:12;6638:2;6754:70;6820:3;6815:2;6806:4;6802:2;6798:13;6785:27;6781:2;6777:36;6773:45;6754:70;:::i;:::-;6747:4;6733:19;;6726:99;6890:3;6882:12;;;;6869:26;6863:3;6849:18;;6842:54;6913:23;;6973:4;6962:16;;;;7004;;;;;5990:1;5981:11;5903:1131;;;-1:-1:-1;;7066:2:1;7054:15;;7047:30;-1:-1:-1;7090:19:1;;-1:-1:-1;7138:4:1;7129:14;;;;7163;;;;;4814:1;4807:9;4764:2423;;;4768:3;;;4424:2769;;;;:::o;7198:692::-;;7311:3;7304:4;7296:6;7292:17;7288:27;7278:2;;7333:5;7326;7319:20;7278:2;7377:6;7364:20;7402:69;7417:53;7463:6;7417:53;:::i;7402:69::-;7505:21;;;7393:78;-1:-1:-1;7545:4:1;7565:14;;;;7599:15;;;7645;;;7633:28;;7629:37;;7626:46;-1:-1:-1;7623:2:1;;;7685:1;7682;7675:12;7623:2;7707:1;7717:167;7731:6;7728:1;7725:13;7717:167;;;7792:17;;7780:30;;7830:12;;;;7862;;;;7753:1;7746:9;7717:167;;7895:132;7962:20;;7991:30;7962:20;7991:30;:::i;8032:580::-;;8129:3;8122:4;8114:6;8110:17;8106:27;8096:2;;8151:5;8144;8137:20;8096:2;8195:6;8182:20;8225:18;8217:6;8214:30;8211:2;;;8247:9;8211:2;8276:117;8387:4;8318:66;8311:4;8303:6;8299:17;8295:90;8291:101;8276:117;:::i;:::-;8267:126;;8416:6;8409:5;8402:21;8470:3;8463:4;8454:6;8446;8442:19;8438:30;8435:39;8432:2;;;8487:1;8484;8477:12;8432:2;8550:6;8543:4;8535:6;8531:17;8524:4;8517:5;8513:16;8500:57;8604:1;8577:18;;;8597:4;8573:29;8566:40;8581:5;8086:526;-1:-1:-1;;8086:526:1:o;8617:158::-;8685:20;;8745:4;8734:16;;8724:27;;8714:2;;8765:1;8762;8755:12;8780:259;;8892:2;8880:9;8871:7;8867:23;8863:32;8860:2;;;8913:6;8905;8898:22;8860:2;8957:9;8944:23;8976:33;9003:5;8976:33;:::i;9044:263::-;;9167:2;9155:9;9146:7;9142:23;9138:32;9135:2;;;9188:6;9180;9173:22;9135:2;9225:9;9219:16;9244:33;9271:5;9244:33;:::i;9584:717::-;;;;;;;9794:3;9782:9;9773:7;9769:23;9765:33;9762:2;;;9816:6;9808;9801:22;9762:2;9853:9;9847:16;9872:33;9899:5;9872:33;:::i;:::-;9924:5;9914:15;;;9969:2;9958:9;9954:18;9948:25;9938:35;;10013:2;10002:9;9998:18;9992:25;9982:35;;10057:2;10046:9;10042:18;10036:25;10026:35;;10106:3;10095:9;10091:19;10085:26;10120:32;10144:7;10120:32;:::i;:::-;10223:3;10208:19;;10202:26;10171:7;;-1:-1:-1;10237:32:1;10202:26;10237:32;:::i;:::-;10288:7;10278:17;;;9752:549;;;;;;;;:::o;10306:478::-;;;;10460:2;10448:9;10439:7;10435:23;10431:32;10428:2;;;10481:6;10473;10466:22;10428:2;10525:9;10512:23;10544:33;10571:5;10544:33;:::i;:::-;10596:5;-1:-1:-1;10653:2:1;10638:18;;10625:32;10666:35;10625:32;10666:35;:::i;:::-;10418:366;;10720:7;;-1:-1:-1;;;10774:2:1;10759:18;;;;10746:32;;10418:366::o;10789:910::-;;;;;;;10994:3;10982:9;10973:7;10969:23;10965:33;10962:2;;;11016:6;11008;11001:22;10962:2;11060:9;11047:23;11079:33;11106:5;11079:33;:::i;:::-;11131:5;-1:-1:-1;11188:2:1;11173:18;;11160:32;11201:35;11160:32;11201:35;:::i;:::-;11255:7;-1:-1:-1;11314:2:1;11299:18;;11286:32;11327:35;11286:32;11327:35;:::i;:::-;11381:7;-1:-1:-1;11440:2:1;11425:18;;11412:32;11453:35;11412:32;11453:35;:::i;:::-;11507:7;-1:-1:-1;11566:3:1;11551:19;;11538:33;11580:35;11538:33;11580:35;:::i;:::-;11634:7;11624:17;;;11688:3;11677:9;11673:19;11660:33;11650:43;;10952:747;;;;;;;;:::o;12179:1718::-;;;;;;;;;;;;12561:3;12549:9;12540:7;12536:23;12532:33;12529:2;;;12583:6;12575;12568:22;12529:2;12611:31;12632:9;12611:31;:::i;:::-;12601:41;;12661:40;12697:2;12686:9;12682:18;12661:40;:::i;:::-;12651:50;;12748:2;12737:9;12733:18;12720:32;12710:42;;12799:2;12788:9;12784:18;12771:32;12761:42;;12822:18;12890:2;12883:3;12872:9;12868:19;12855:33;12852:41;12849:2;;;12911:6;12903;12896:22;12849:2;12939:94;13025:7;13017:3;13006:9;13002:19;12989:33;12978:9;12974:49;12939:94;:::i;:::-;12929:104;;13083:2;13076:3;13065:9;13061:19;13048:33;13045:41;13042:2;;;13104:6;13096;13089:22;13042:2;13132:78;13202:7;13194:3;13183:9;13179:19;13166:33;13155:9;13151:49;13132:78;:::i;:::-;13122:88;;13260:2;13253:3;13242:9;13238:19;13225:33;13222:41;13219:2;;;13281:6;13273;13266:22;13219:2;13309:94;13395:7;13387:3;13376:9;13372:19;13359:33;13348:9;13344:49;13309:94;:::i;:::-;13299:104;;13453:2;13446:3;13435:9;13431:19;13418:33;13415:41;13412:2;;;13474:6;13466;13459:22;13412:2;13502:94;13588:7;13580:3;13569:9;13565:19;13552:33;13541:9;13537:49;13502:94;:::i;:::-;13492:104;;13615:41;13651:3;13640:9;13636:19;13615:41;:::i;:::-;13605:51;;13706:2;13699:3;13688:9;13684:19;13671:33;13668:41;13665:2;;;13727:6;13719;13712:22;13665:2;;13755:78;13825:7;13817:3;13806:9;13802:19;13789:33;13778:9;13774:49;13755:78;:::i;:::-;13745:88;;13853:38;13886:3;13875:9;13871:19;13853:38;:::i;:::-;13842:49;;12519:1378;;;;;;;;;;;;;;:::o;13902:1838::-;;;;;;;;;;;;;14302:3;14290:9;14281:7;14277:23;14273:33;14270:2;;;14324:6;14316;14309:22;14270:2;14352:31;14373:9;14352:31;:::i;:::-;14342:41;;14402:40;14438:2;14427:9;14423:18;14402:40;:::i;:::-;14392:50;;14489:2;14478:9;14474:18;14461:32;14451:42;;14540:2;14529:9;14525:18;14512:32;14502:42;;14591:3;14580:9;14576:19;14563:33;14553:43;;14646:18;14639:3;14628:9;14624:19;14611:33;14608:57;14605:2;;;14683:6;14675;14668:22;14605:2;14711:94;14797:7;14789:3;14778:9;14774:19;14761:33;14750:9;14746:49;14711:94;:::i;:::-;14701:104;;14855:18;14848:3;14837:9;14833:19;14820:33;14817:57;14814:2;;;14892:6;14884;14877:22;14814:2;14920:78;14990:7;14982:3;14971:9;14967:19;14954:33;14943:9;14939:49;14920:78;:::i;:::-;14910:88;;15048:18;15041:3;15030:9;15026:19;15013:33;15010:57;15007:2;;;15086:7;15077;15070:24;15007:2;15115:94;15201:7;15193:3;15182:9;15178:19;15165:33;15154:9;15150:49;15115:94;:::i;:::-;15105:104;;15259:18;15252:3;15241:9;15237:19;15224:33;15221:57;15218:2;;;15297:7;15288;15281:24;15218:2;15326:94;15412:7;15404:3;15393:9;15389:19;15376:33;15365:9;15361:49;15326:94;:::i;:::-;15316:104;;15439:41;15475:3;15464:9;15460:19;15439:41;:::i;:::-;15429:51;;15530:18;15523:3;15512:9;15508:19;15495:33;15492:57;15489:2;;;15568:7;15559;15552:24;15489:2;15598:78;15668:7;15660:3;15649:9;15645:19;15632:33;15621:9;15617:49;15598:78;:::i;:::-;15587:89;;15696:38;15729:3;15718:9;15714:19;15696:38;:::i;:::-;15685:49;;14260:1480;;;;;;;;;;;;;;:::o;15745:879::-;;;;;;;;15975:3;15963:9;15954:7;15950:23;15946:33;15943:2;;;15997:6;15989;15982:22;15943:2;16041:9;16028:23;16060:33;16087:5;16060:33;:::i;:::-;16112:5;-1:-1:-1;16164:2:1;16149:18;;16136:32;;-1:-1:-1;16215:2:1;16200:18;;16187:32;;-1:-1:-1;16266:2:1;16251:18;;16238:32;;-1:-1:-1;16321:3:1;16306:19;;16293:33;16349:18;16338:30;;16335:2;;;16386:6;16378;16371:22;16335:2;16430:76;16498:7;16489:6;16478:9;16474:22;16430:76;:::i;:::-;16525:8;;-1:-1:-1;16404:102:1;-1:-1:-1;16579:39:1;;-1:-1:-1;16613:3:1;16598:19;;16579:39;:::i;:::-;16569:49;;15933:691;;;;;;;;;;:::o;16629:778::-;;;;16777:2;16765:9;16756:7;16752:23;16748:32;16745:2;;;16798:6;16790;16783:22;16745:2;16842:9;16829:23;16861:33;16888:5;16861:33;:::i;:::-;16913:5;-1:-1:-1;16969:2:1;16954:18;;16941:32;16992:18;17022:14;;;17019:2;;;17054:6;17046;17039:22;17019:2;17097:6;17086:9;17082:22;17072:32;;17142:7;17135:4;17131:2;17127:13;17123:27;17113:2;;17169:6;17161;17154:22;17113:2;17214;17201:16;17240:2;17232:6;17229:14;17226:2;;;17261:6;17253;17246:22;17226:2;17311:7;17306:2;17297:6;17293:2;17289:15;17285:24;17282:37;17279:2;;;17337:6;17329;17322:22;17279:2;17373;17369;17365:11;17355:21;;17395:6;17385:16;;;;;16735:672;;;;;:::o;17412:257::-;;17532:2;17520:9;17511:7;17507:23;17503:32;17500:2;;;17553:6;17545;17538:22;17500:2;17590:9;17584:16;17609:30;17633:5;17609:30;:::i;17674:190::-;;17786:2;17774:9;17765:7;17761:23;17757:32;17754:2;;;17807:6;17799;17792:22;17754:2;-1:-1:-1;17835:23:1;;17744:120;-1:-1:-1;17744:120:1:o;17869:194::-;;17992:2;17980:9;17971:7;17967:23;17963:32;17960:2;;;18013:6;18005;17998:22;17960:2;-1:-1:-1;18041:16:1;;17950:113;-1:-1:-1;17950:113:1:o;18346:1262::-;;18482:2;18470:9;18461:7;18457:23;18453:32;18450:2;;;18503:6;18495;18488:22;18450:2;18548:9;18535:23;18577:18;18618:2;18610:6;18607:14;18604:2;;;18639:6;18631;18624:22;18604:2;18682:6;18671:9;18667:22;18657:32;;18708:6;18748:2;18743;18734:7;18730:16;18726:25;18723:2;;;18769:6;18761;18754:22;18723:2;18800:18;18815:2;18800:18;:::i;:::-;18787:31;;18841:24;18862:2;18841:24;:::i;:::-;18834:5;18827:39;18898:33;18927:2;18923;18919:11;18898:33;:::i;:::-;18893:2;18886:5;18882:14;18875:57;18985:2;18981;18977:11;18964:25;18959:2;18952:5;18948:14;18941:49;19043:2;19039;19035:11;19022:25;19017:2;19010:5;19006:14;18999:49;19081:34;19110:3;19106:2;19102:12;19081:34;:::i;:::-;19075:3;19068:5;19064:15;19057:59;19162:3;19158:2;19154:12;19141:26;19192:2;19182:8;19179:16;19176:2;;;19213:6;19205;19198:22;19176:2;19255:46;19293:7;19282:8;19278:2;19274:17;19255:46;:::i;:::-;19249:3;19242:5;19238:15;19231:71;;19335:31;19361:3;19357:2;19353:12;19335:31;:::i;:::-;19329:3;19322:5;19318:15;19311:56;19413:3;19409:2;19405:12;19392:26;19443:2;19433:8;19430:16;19427:2;;;19464:6;19456;19449:22;19427:2;19506:71;19569:7;19558:8;19554:2;19550:17;19506:71;:::i;:::-;19500:3;19489:15;;19482:96;-1:-1:-1;19493:5:1;18440:1168;-1:-1:-1;;;;;18440:1168:1:o;19613:1267::-;;19758:2;19746:9;19737:7;19733:23;19729:32;19726:2;;;19779:6;19771;19764:22;19726:2;19824:9;19811:23;19853:18;19894:2;19886:6;19883:14;19880:2;;;19915:6;19907;19900:22;19880:2;19958:6;19947:9;19943:22;19933:32;;19984:6;20024:2;20019;20010:7;20006:16;20002:25;19999:2;;;20045:6;20037;20030:22;19999:2;20076:18;20091:2;20076:18;:::i;:::-;20063:31;;20117:24;20138:2;20117:24;:::i;:::-;20110:5;20103:39;20195:2;20191;20187:11;20174:25;20169:2;20162:5;20158:14;20151:49;20253:2;20249;20245:11;20232:25;20227:2;20220:5;20216:14;20209:49;20311:2;20307;20303:11;20290:25;20285:2;20278:5;20274:14;20267:49;20349:34;20378:3;20374:2;20370:12;20349:34;:::i;:::-;20343:3;20336:5;20332:15;20325:59;20430:3;20426:2;20422:12;20409:26;20460:2;20450:8;20447:16;20444:2;;;20481:6;20473;20466:22;20444:2;20523:46;20561:7;20550:8;20546:2;20542:17;20523:46;:::i;:::-;20517:3;20510:5;20506:15;20499:71;;20603:31;20629:3;20625:2;20621:12;20603:31;:::i;:::-;20597:3;20590:5;20586:15;20579:56;20681:3;20677:2;20673:12;20660:26;20711:2;20701:8;20698:16;20695:2;;;20732:6;20724;20717:22;20695:2;20774:75;20841:7;20830:8;20826:2;20822:17;20774:75;:::i;20885:1251::-;;21022:2;21010:9;21001:7;20997:23;20993:32;20990:2;;;21043:6;21035;21028:22;20990:2;21088:9;21075:23;21117:18;21158:2;21150:6;21147:14;21144:2;;;21179:6;21171;21164:22;21144:2;21222:6;21211:9;21207:22;21197:32;;21248:6;21288:2;21283;21274:7;21270:16;21266:25;21263:2;;;21309:6;21301;21294:22;21263:2;21340:18;21355:2;21340:18;:::i;:::-;21327:31;;21381:24;21402:2;21381:24;:::i;:::-;21374:5;21367:39;21459:2;21455;21451:11;21438:25;21433:2;21426:5;21422:14;21415:49;21517:2;21513;21509:11;21496:25;21491:2;21484:5;21480:14;21473:49;21575:2;21571;21567:11;21554:25;21549:2;21542:5;21538:14;21531:49;21613:34;21642:3;21638:2;21634:12;21613:34;:::i;:::-;21607:3;21600:5;21596:15;21589:59;21694:3;21690:2;21686:12;21673:26;21724:2;21714:8;21711:16;21708:2;;;21745:6;21737;21730:22;21708:2;21787:46;21825:7;21814:8;21810:2;21806:17;21787:46;:::i;:::-;21781:3;21774:5;21770:15;21763:71;;21867:31;21893:3;21889:2;21885:12;21867:31;:::i;:::-;21861:3;21854:5;21850:15;21843:56;21945:3;21941:2;21937:12;21924:26;21975:2;21965:8;21962:16;21959:2;;;21996:6;21988;21981:22;21959:2;22038:67;22097:7;22086:8;22082:2;22078:17;22038:67;:::i;22340:672::-;;;;;;22536:3;22524:9;22515:7;22511:23;22507:33;22504:2;;;22558:6;22550;22543:22;22504:2;22599:9;22586:23;22576:33;;22656:2;22645:9;22641:18;22628:32;22618:42;;22711:2;22700:9;22696:18;22683:32;22738:18;22730:6;22727:30;22724:2;;;22775:6;22767;22760:22;22724:2;22819:76;22887:7;22878:6;22867:9;22863:22;22819:76;:::i;:::-;22914:8;;-1:-1:-1;22793:102:1;-1:-1:-1;22968:38:1;;-1:-1:-1;23002:2:1;22987:18;;22968:38;:::i;:::-;22958:48;;22494:518;;;;;;;;:::o;23017:555::-;;23123:6;23118:3;23111:19;23149:4;23178:2;23173:3;23169:12;23162:19;;23204:5;23227:3;23239:308;23253:6;23250:1;23247:13;23239:308;;;23330:6;23317:20;23350:35;23377:7;23350:35;:::i;:::-;-1:-1:-1;;;;;23410:56:1;23398:69;;23487:12;;;;23522:15;;;;23275:1;23268:9;23239:308;;;-1:-1:-1;23563:3:1;;23101:471;-1:-1:-1;;;;;23101:471:1:o;23577:318::-;;23658:5;23652:12;23685:6;23680:3;23673:19;23701:63;23757:6;23750:4;23745:3;23741:14;23734:4;23727:5;23723:16;23701:63;:::i;:::-;23809:2;23797:15;23814:66;23793:88;23784:98;;;;23884:4;23780:109;;23628:267;-1:-1:-1;;23628:267:1:o;23900:274::-;;24067:6;24061:13;24083:53;24129:6;24124:3;24117:4;24109:6;24105:17;24083:53;:::i;:::-;24152:16;;;;;24037:137;-1:-1:-1;;24037:137:1:o;24179:205::-;24379:3;24370:14::o;24389:226::-;-1:-1:-1;;;;;24553:55:1;;;;24535:74;;24523:2;24508:18;;24490:125::o;24859:493::-;;-1:-1:-1;;;;;25104:6:1;25100:55;25089:9;25082:74;25192:6;25187:2;25176:9;25172:18;25165:34;25235:6;25230:2;25219:9;25215:18;25208:34;25278:3;25273:2;25262:9;25258:18;25251:31;25299:47;25341:3;25330:9;25326:19;25318:6;25299:47;:::i;:::-;25291:55;25072:280;-1:-1:-1;;;;;;25072:280:1:o;25357:565::-;;-1:-1:-1;;;;;25630:6:1;25626:55;25615:9;25608:74;25718:6;25713:2;25702:9;25698:18;25691:34;25761:6;25756:2;25745:9;25741:18;25734:34;25804:6;25799:2;25788:9;25784:18;25777:34;25848:3;25842;25831:9;25827:19;25820:32;25869:47;25911:3;25900:9;25896:19;25888:6;25869:47;:::i;25927:327::-;-1:-1:-1;;;;;26180:15:1;;;26162:34;;26232:15;;26227:2;26212:18;;26205:43;26089:2;26074:18;;26056:198::o;26259:495::-;-1:-1:-1;;;;;26585:15:1;;;26567:34;;26637:15;;;26632:2;26617:18;;26610:43;26689:15;;26684:2;26669:18;;26662:43;26736:2;26721:18;;26714:34;;;;26493:3;26478:19;;26460:294::o;26759:683::-;;-1:-1:-1;;;;;27125:2:1;27117:6;27113:15;27102:9;27095:34;27177:2;27169:6;27165:15;27160:2;27149:9;27145:18;27138:43;27217:6;27212:2;27201:9;27197:18;27190:34;27272:4;27264:6;27260:17;27255:2;27244:9;27240:18;27233:45;27327:2;27319:6;27315:15;27309:3;27298:9;27294:19;27287:44;;27368:3;27362;27351:9;27347:19;27340:32;27389:47;27431:3;27420:9;27416:19;27408:6;27389:47;:::i;27447:666::-;;-1:-1:-1;;;;;27807:2:1;27799:6;27795:15;27784:9;27777:34;27859:2;27851:6;27847:15;27842:2;27831:9;27827:18;27820:43;27899:6;27894:2;27883:9;27879:18;27872:34;27942:6;27937:2;27926:9;27922:18;27915:34;27998:2;27990:6;27986:15;27980:3;27969:9;27965:19;27958:44;;28039:3;28033;28022:9;28018:19;28011:32;28060:47;28102:3;28091:9;28087:19;28079:6;28060:47;:::i;28118:630::-;;-1:-1:-1;;;;;28423:6:1;28419:55;28408:9;28401:74;28511:6;28506:2;28495:9;28491:18;28484:34;28554:6;28549:2;28538:9;28534:18;28527:34;28597:6;28592:2;28581:9;28577:18;28570:34;28641:3;28635;28624:9;28620:19;28613:32;28662:80;28737:3;28726:9;28722:19;28714:6;28706;28662:80;:::i;28753:297::-;-1:-1:-1;;;;;28945:55:1;;;;28927:74;;29032:2;29017:18;;29010:34;28915:2;28900:18;;28882:168::o;29055:187::-;29220:14;;29213:22;29195:41;;29183:2;29168:18;;29150:92::o;29247:297::-;29421:25;;;-1:-1:-1;;;;;29482:55:1;29477:2;29462:18;;29455:83;29409:2;29394:18;;29376:168::o;29859:450::-;;30016:2;30005:9;29998:21;30055:6;30050:2;30039:9;30035:18;30028:34;30112:6;30104;30099:2;30088:9;30084:18;30071:48;30139:22;;;30163:2;30135:31;;;30128:45;;;;30225:2;30213:15;;;30230:66;30209:88;30194:104;30190:113;;29988:321;-1:-1:-1;29988:321:1:o;30314:219::-;;30461:2;30450:9;30443:21;30481:46;30523:2;30512:9;30508:18;30500:6;30481:46;:::i;30764:348::-;30966:2;30948:21;;;31005:2;30985:18;;;30978:30;31044:26;31039:2;31024:18;;31017:54;31103:2;31088:18;;30938:174::o;31117:339::-;31319:2;31301:21;;;31358:2;31338:18;;;31331:30;31397:17;31392:2;31377:18;;31370:45;31447:2;31432:18;;31291:165::o;31461:418::-;31663:2;31645:21;;;31702:2;31682:18;;;31675:30;31741:34;31736:2;31721:18;;31714:62;31812:24;31807:2;31792:18;;31785:52;31869:3;31854:19;;31635:244::o;31884:402::-;32086:2;32068:21;;;32125:2;32105:18;;;32098:30;32164:34;32159:2;32144:18;;32137:62;32235:8;32230:2;32215:18;;32208:36;32276:3;32261:19;;32058:228::o;32291:351::-;32493:2;32475:21;;;32532:2;32512:18;;;32505:30;32571:29;32566:2;32551:18;;32544:57;32633:2;32618:18;;32465:177::o;32647:349::-;32849:2;32831:21;;;32888:2;32868:18;;;32861:30;32927:27;32922:2;32907:18;;32900:55;32987:2;32972:18;;32821:175::o;33001:404::-;33203:2;33185:21;;;33242:2;33222:18;;;33215:30;33281:34;33276:2;33261:18;;33254:62;33352:10;33347:2;33332:18;;33325:38;33395:3;33380:19;;33175:230::o;33410:419::-;33612:2;33594:21;;;33651:2;33631:18;;;33624:30;33690:34;33685:2;33670:18;;33663:62;33761:25;33756:2;33741:18;;33734:53;33819:3;33804:19;;33584:245::o;33834:352::-;34036:2;34018:21;;;34075:2;34055:18;;;34048:30;34114;34109:2;34094:18;;34087:58;34177:2;34162:18;;34008:178::o;34598:340::-;34800:2;34782:21;;;34839:2;34819:18;;;34812:30;34878:18;34873:2;34858:18;;34851:46;34929:2;34914:18;;34772:166::o;34943:350::-;35145:2;35127:21;;;35184:2;35164:18;;;35157:30;35223:28;35218:2;35203:18;;35196:56;35284:2;35269:18;;35117:176::o;35298:352::-;35500:2;35482:21;;;35539:2;35519:18;;;35512:30;35578;35573:2;35558:18;;35551:58;35641:2;35626:18;;35472:178::o;35655:346::-;35857:2;35839:21;;;35896:2;35876:18;;;35869:30;35935:24;35930:2;35915:18;;35908:52;35992:2;35977:18;;35829:172::o;36006:354::-;36208:2;36190:21;;;36247:2;36227:18;;;36220:30;36286:32;36281:2;36266:18;;36259:60;36351:2;36336:18;;36180:180::o;36365:348::-;36567:2;36549:21;;;36606:2;36586:18;;;36579:30;36645:26;36640:2;36625:18;;36618:54;36704:2;36689:18;;36539:174::o;36718:342::-;36920:2;36902:21;;;36959:2;36939:18;;;36932:30;36998:20;36993:2;36978:18;;36971:48;37051:2;37036:18;;36892:168::o;37065:397::-;37267:2;37249:21;;;37306:2;37286:18;;;37279:30;37345:34;37340:2;37325:18;;37318:62;37416:3;37411:2;37396:18;;37389:31;37452:3;37437:19;;37239:223::o;37467:343::-;37669:2;37651:21;;;37708:2;37688:18;;;37681:30;37747:21;37742:2;37727:18;;37720:49;37801:2;37786:18;;37641:169::o;37815:346::-;38017:2;37999:21;;;38056:2;38036:18;;;38029:30;38095:24;38090:2;38075:18;;38068:52;38152:2;38137:18;;37989:172::o;38166:356::-;38368:2;38350:21;;;38387:18;;;38380:30;38446:34;38441:2;38426:18;;38419:62;38513:2;38498:18;;38340:182::o;38527:355::-;38729:2;38711:21;;;38768:2;38748:18;;;38741:30;38807:33;38802:2;38787:18;;38780:61;38873:2;38858:18;;38701:181::o;38887:344::-;39089:2;39071:21;;;39128:2;39108:18;;;39101:30;39167:22;39162:2;39147:18;;39140:50;39222:2;39207:18;;39061:170::o;39236:412::-;39438:2;39420:21;;;39477:2;39457:18;;;39450:30;39516:34;39511:2;39496:18;;39489:62;39587:18;39582:2;39567:18;;39560:46;39638:3;39623:19;;39410:238::o;39653:353::-;39855:2;39837:21;;;39894:2;39874:18;;;39867:30;39933:31;39928:2;39913:18;;39906:59;39997:2;39982:18;;39827:179::o;40011:406::-;40213:2;40195:21;;;40252:2;40232:18;;;40225:30;40291:34;40286:2;40271:18;;40264:62;40362:12;40357:2;40342:18;;40335:40;40407:3;40392:19;;40185:232::o;40422:418::-;40624:2;40606:21;;;40663:2;40643:18;;;40636:30;40702:34;40697:2;40682:18;;40675:62;40773:24;40768:2;40753:18;;40746:52;40830:3;40815:19;;40596:244::o;40845:346::-;41047:2;41029:21;;;41086:2;41066:18;;;41059:30;41125:24;41120:2;41105:18;;41098:52;41182:2;41167:18;;41019:172::o;41196:177::-;41342:25;;;41330:2;41315:18;;41297:76::o;41378:436::-;;41623:6;41612:9;41605:25;41666:6;41661:2;41650:9;41646:18;41639:34;41709:2;41704;41693:9;41689:18;41682:30;41729:79;41804:2;41793:9;41789:18;41781:6;41773;41729:79;:::i;41819:319::-;42021:25;;;42077:2;42062:18;;42055:34;;;;42120:2;42105:18;;42098:34;42009:2;41994:18;;41976:162::o;42143:242::-;42213:2;42207:9;42243:17;;;42290:18;42275:34;;42311:22;;;42272:62;42269:2;;;42337:9;42269:2;42364;42357:22;42187:198;;-1:-1:-1;42187:198:1:o;42390:183::-;;42489:18;42481:6;42478:30;42475:2;;;42511:9;42475:2;-1:-1:-1;42562:4:1;42543:17;;;42539:28;;42465:108::o;42578:258::-;42650:1;42660:113;42674:6;42671:1;42668:13;42660:113;;;42750:11;;;42744:18;42731:11;;;42724:39;42696:2;42689:10;42660:113;;;42791:6;42788:1;42785:13;42782:2;;;-1:-1:-1;;42826:1:1;42808:16;;42801:27;42631:205::o;42841:156::-;-1:-1:-1;;;;;42922:5:1;42918:54;42911:5;42908:65;42898:2;;42987:1;42984;42977:12;42898:2;42888:109;:::o;43002:120::-;43090:5;43083:13;43076:21;43069:5;43066:32;43056:2;;43112:1;43109;43102:12
Swarm Source
ipfs://9fcc3942e20e131e2169fad7f00d16b3902bcb8c8acdc96018b0ad3ab019b2ce
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.