ERC-20
DeFi
Overview
Max Total Supply
10,484,405,507.153977006972111037 ECL
Holders
351 (0.00%)
Market
Price
$0.00 @ 0.000000 ETH
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.264095524020132621 ECLValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Eclipseum
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-16 */ // File: node_modules\openzeppelin-solidity\contracts\GSN\Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC20\IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: node_modules\openzeppelin-solidity\contracts\math\SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC20\ERC20.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC20\ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } } // File: node_modules\openzeppelin-solidity\contracts\utils\ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // File: node_modules\openzeppelin-solidity\contracts\utils\Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: contracts\Eclipseum.sol pragma solidity =0.5.17; /// @title The Eclipseum ERC20 Smart Contract contract Eclipseum is ERC20, ERC20Detailed, ReentrancyGuard { using SafeMath for uint256; using Address for address payable; struct SoftSellEclAmountsToReceive { uint256 ethFromEclPool; uint256 ethFromDaiPool; uint256 daiFromDaiPool; } IERC20 public daiInterface; bool public launched; uint256 public ethBalanceOfEclPool; uint256 public ethVolumeOfEclPool; uint256 public ethVolumeOfDaiPool; event LogBuyEcl( address indexed userAddress, uint256 ethSpent, uint256 eclReceived ); event LogSellEcl( address indexed userAddress, uint256 eclSold, uint256 ethReceived ); event LogSoftSellEcl( address indexed userAddress, uint256 eclSold, uint256 ethReceived, uint256 daiReceived ); event LogBuyDai( address indexed userAddress, uint256 ethSpent, uint256 daiReceived ); event LogSellDai( address indexed userAddress, uint256 daiSold, uint256 ethReceived ); modifier requireLaunched() { require(launched, "Contract must be launched to invoke this function."); _; } /// @notice Must be called with at least 0.02 ETH. /// @notice Mints 100,000 ECL into the contract account constructor(address _daiAddress) public payable ERC20Detailed("Eclipseum", "ECL", 18) { require( msg.value >= 0.02 ether, "Must call constructor with at least 0.02 Ether." ); _mint(address(this), 1e5 * (10**18)); daiInterface = IERC20(_daiAddress); } /// @notice This function is called once after deployment to launch the contract. /// @notice Some amount of DAI must be transferred to the contract for launch to succeed. /// @notice Once launched, the transaction functions may be invoked. function launch() external { require(!launched, "Contract has already been launched."); require( daiInterface.balanceOf(address(this)) > 0, "DAI pool balance must be greater than zero to launch contract." ); ethBalanceOfEclPool = 0.01 ether; launched = true; } /// @notice Enables a user to buy ECL with ETH from the ECL liquidity pool. /// @param minEclToReceive The minimum amount of ECL the user is willing to receive. /// @param deadline Epoch time deadline that the transaction must complete before, otherwise reverts. function buyEcl(uint256 minEclToReceive, uint256 deadline) external payable nonReentrant requireLaunched { require( deadline >= block.timestamp, "Transaction deadline has elapsed." ); require(msg.value > 0, "Value of ETH sent must be greater than zero."); uint256 ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPool().sub(msg.value); uint256 eclBalanceOfEclPoolLocal = eclBalanceOfEclPool(); uint256 eclToReceive = applyTransactionFee( calcBOut(ethBalanceOfEclPool, eclBalanceOfEclPoolLocal, msg.value) ); uint256 eclToMint = eclToReceive.mul(7).div(6).add(1); uint256 ethTransferToDaiPool = calcEthTransferForBuyEcl( ethBalanceOfEclPool, ethBalanceOfDaiPoolLocal, msg.value ); require( eclToReceive >= minEclToReceive, "Unable to send the minimum quantity of ECL to receive." ); ethBalanceOfEclPool = ethBalanceOfEclPool.add(msg.value).sub( ethTransferToDaiPool ); ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPoolLocal.add( ethTransferToDaiPool ); eclBalanceOfEclPoolLocal = eclBalanceOfEclPoolLocal .sub(eclToReceive) .add(eclToMint); ethVolumeOfEclPool += msg.value; emit LogBuyEcl(msg.sender, msg.value, eclToReceive); _transfer(address(this), msg.sender, eclToReceive); _mint(address(this), eclToMint); assert(ethBalanceOfDaiPoolLocal == ethBalanceOfDaiPool()); assert(eclBalanceOfEclPoolLocal == eclBalanceOfEclPool()); assert(ethBalanceOfEclPool > 0); assert(ethBalanceOfDaiPool() > 0); assert(eclBalanceOfEclPool() > 0); assert(daiBalanceOfDaiPool() > 0); } /// @notice Enables a user to sell ECL for ETH to the ECL liquidity pool. /// @param eclSold The amount of ECL the user is selling. /// @param minEthToReceive The minimum amount of ETH the user is willing to receive. /// @param deadline Epoch time deadline that the transaction must complete before. function sellEcl( uint256 eclSold, uint256 minEthToReceive, uint256 deadline ) external nonReentrant requireLaunched { require( deadline >= block.timestamp, "Transaction deadline has elapsed." ); require(eclSold > 0, "Value of ECL sold must be greater than zero."); require( eclSold <= balanceOf(address(msg.sender)), "ECL sold must be less than or equal to ECL balance." ); uint256 ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPool(); uint256 eclBalanceOfEclPoolLocal = eclBalanceOfEclPool(); uint256 eclToBurn = eclSold.mul(7).div(6); uint256 ethToReceive = applyTransactionFee( calcBOut(eclBalanceOfEclPoolLocal, ethBalanceOfEclPool, eclSold) ); require( ethToReceive >= minEthToReceive, "Unable to send the minimum quantity of ETH to receive." ); ethBalanceOfEclPool = ethBalanceOfEclPool.sub(ethToReceive); eclBalanceOfEclPoolLocal = eclBalanceOfEclPoolLocal.add(eclSold).sub( eclToBurn ); ethVolumeOfEclPool += ethToReceive; emit LogSellEcl(msg.sender, eclSold, ethToReceive); _transfer(address(msg.sender), address(this), eclSold); _burn(address(this), eclToBurn); msg.sender.sendValue(ethToReceive); assert(ethBalanceOfDaiPoolLocal == ethBalanceOfDaiPool()); assert(eclBalanceOfEclPoolLocal == eclBalanceOfEclPool()); assert(ethBalanceOfEclPool > 0); assert(ethBalanceOfDaiPool() > 0); assert(eclBalanceOfEclPool() > 0); assert(daiBalanceOfDaiPool() > 0); } /// @notice Enables a user to sell ECL for ETH and DAI to the ECL liquidity pool. /// @param eclSold The amount of ECL the user is selling. /// @param minEthToReceive The minimum amount of ETH the user is willing to receive. /// @param minDaiToReceive The minimum amount of DAI the user is willing to receive. /// @param deadline Epoch time deadline that the transaction must complete before. function softSellEcl( uint256 eclSold, uint256 minEthToReceive, uint256 minDaiToReceive, uint256 deadline ) external nonReentrant requireLaunched { require( deadline >= block.timestamp, "Transaction deadline has elapsed." ); require(eclSold > 0, "Value of ECL sold must be greater than zero."); require( eclSold <= balanceOf(address(msg.sender)), "ECL sold must be less than or equal to ECL balance." ); uint256 ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPool(); uint256 circulatingSupplyLocal = circulatingSupply(); uint256 eclBalanceOfEclPoolLocal = eclBalanceOfEclPool(); uint256 daiBalanceOfDaiPoolLocal = daiBalanceOfDaiPool(); uint256 eclToBurn = applyTransactionFee( eclSold.mul(eclBalanceOfEclPoolLocal).div(circulatingSupplyLocal) ) .add(eclSold); SoftSellEclAmountsToReceive memory amountsToReceive; amountsToReceive.ethFromEclPool = applyTransactionFee( eclSold.mul(ethBalanceOfEclPool).div(circulatingSupplyLocal) ); amountsToReceive.ethFromDaiPool = applyTransactionFee( eclSold.mul(ethBalanceOfDaiPoolLocal).div(circulatingSupplyLocal) ); amountsToReceive.daiFromDaiPool = applyTransactionFee( eclSold.mul(daiBalanceOfDaiPoolLocal).div(circulatingSupplyLocal) ); require( amountsToReceive.ethFromEclPool.add( amountsToReceive.ethFromDaiPool ) >= minEthToReceive, "Unable to send the minimum quantity of ETH to receive." ); require( amountsToReceive.daiFromDaiPool >= minDaiToReceive, "Unable to send the minimum quantity of DAI to receive." ); ethBalanceOfEclPool = ethBalanceOfEclPool.sub( amountsToReceive.ethFromEclPool ); ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPoolLocal.sub( amountsToReceive.ethFromDaiPool ); daiBalanceOfDaiPoolLocal = daiBalanceOfDaiPoolLocal.sub( amountsToReceive.daiFromDaiPool ); eclBalanceOfEclPoolLocal = eclBalanceOfEclPoolLocal.add(eclSold).sub( eclToBurn ); ethVolumeOfEclPool += amountsToReceive.ethFromEclPool; ethVolumeOfDaiPool += amountsToReceive.ethFromDaiPool; emit LogSoftSellEcl( msg.sender, eclSold, amountsToReceive.ethFromEclPool.add( amountsToReceive.ethFromDaiPool ), amountsToReceive.daiFromDaiPool ); _transfer(address(msg.sender), address(this), eclSold); _burn(address(this), eclToBurn); require( daiInterface.transfer(msg.sender, amountsToReceive.daiFromDaiPool), "DAI Transfer failed." ); msg.sender.sendValue( amountsToReceive.ethFromEclPool.add(amountsToReceive.ethFromDaiPool) ); assert( ethBalanceOfEclPool.add(ethBalanceOfDaiPoolLocal) == address(this).balance ); assert(eclBalanceOfEclPoolLocal == eclBalanceOfEclPool()); assert(daiBalanceOfDaiPoolLocal == daiBalanceOfDaiPool()); assert(ethBalanceOfDaiPoolLocal == ethBalanceOfDaiPool()); assert(ethBalanceOfEclPool > 0); assert(ethBalanceOfDaiPool() > 0); assert(eclBalanceOfEclPool() > 0); assert(daiBalanceOfDaiPool() > 0); } /// @notice Enables a user to buy DAI with ETH from the DAI liquidity pool. /// @param minDaiToReceive The minimum amount of DAI the user is willing to receive. /// @param deadline Epoch time deadline that the transaction must complete before. function buyDai(uint256 minDaiToReceive, uint256 deadline) external payable nonReentrant requireLaunched { require( deadline >= block.timestamp, "Transaction deadline has elapsed." ); require(msg.value > 0, "Value of ETH sent must be greater than zero."); uint256 ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPool().sub(msg.value); uint256 daiBalanceOfDaiPoolLocal = daiBalanceOfDaiPool(); uint256 daiToReceive = applyTransactionFee( calcBOut( ethBalanceOfDaiPoolLocal, daiBalanceOfDaiPoolLocal, msg.value ) ); uint256 ethTransferToEclPool = msg.value.mul(15).div(10000); require( daiToReceive >= minDaiToReceive, "Unable to send the minimum quantity of DAI to receive." ); ethBalanceOfEclPool = ethBalanceOfEclPool.add(ethTransferToEclPool); ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPoolLocal.add(msg.value).sub( ethTransferToEclPool ); daiBalanceOfDaiPoolLocal = daiBalanceOfDaiPoolLocal.sub(daiToReceive); ethVolumeOfDaiPool += msg.value; emit LogBuyDai(msg.sender, msg.value, daiToReceive); require( daiInterface.transfer(address(msg.sender), daiToReceive), "DAI Transfer failed." ); assert(ethBalanceOfDaiPoolLocal == ethBalanceOfDaiPool()); assert(daiBalanceOfDaiPoolLocal == daiBalanceOfDaiPool()); assert(ethBalanceOfEclPool > 0); assert(ethBalanceOfDaiPool() > 0); assert(eclBalanceOfEclPool() > 0); assert(daiBalanceOfDaiPool() > 0); } /// @notice Enables a user to sell DAI for ETH to the DAI liquidity pool. /// @param daiSold The amount of DAI the user is selling. /// @param minEthToReceive The minimum amount of ETH the user is willing to receive. /// @param deadline Epoch time deadline that the transaction must complete before. function sellDai( uint256 daiSold, uint256 minEthToReceive, uint256 deadline ) external nonReentrant requireLaunched { require( deadline >= block.timestamp, "Transaction deadline has elapsed." ); require(daiSold > 0, "Value of DAI sold must be greater than zero."); require( daiSold <= daiInterface.balanceOf(address(msg.sender)), "DAI sold must be less than or equal to DAI balance." ); require( daiSold <= daiInterface.allowance(address(msg.sender), address(this)), "DAI sold exceeds allowance." ); uint256 ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPool(); uint256 daiBalanceOfDaiPoolLocal = daiBalanceOfDaiPool(); uint256 ethToReceiveBeforeFee = calcBOut( daiBalanceOfDaiPoolLocal, ethBalanceOfDaiPoolLocal, daiSold ); uint256 ethToReceive = applyTransactionFee(ethToReceiveBeforeFee); uint256 ethTransferToEclPool = ethToReceiveBeforeFee .sub(ethToReceive) .div(2); require( ethToReceive >= minEthToReceive, "Unable to send the minimum quantity of ETH to receive." ); ethBalanceOfEclPool = ethBalanceOfEclPool.add(ethTransferToEclPool); ethBalanceOfDaiPoolLocal = ethBalanceOfDaiPoolLocal .sub(ethToReceive) .sub(ethTransferToEclPool); daiBalanceOfDaiPoolLocal = daiBalanceOfDaiPoolLocal.add(daiSold); ethVolumeOfDaiPool += ethToReceive; emit LogSellDai(msg.sender, daiSold, ethToReceive); require( daiInterface.transferFrom( address(msg.sender), address(this), daiSold ), "DAI Transfer failed." ); msg.sender.sendValue(ethToReceive); assert(ethBalanceOfDaiPoolLocal == ethBalanceOfDaiPool()); assert(daiBalanceOfDaiPoolLocal == daiBalanceOfDaiPool()); assert(ethBalanceOfEclPool > 0); assert(ethBalanceOfDaiPool() > 0); assert(eclBalanceOfEclPool() > 0); assert(daiBalanceOfDaiPool() > 0); } /// @notice Calculates amount of asset B for user to receive using constant product market maker algorithm. /// @dev A value of one is subtracted in the _bToReceive calculation such that rounding /// @dev errors favour the pool over the user. /// @param aBalance The balance of asset A in the liquidity pool. /// @param bBalance The balance of asset B in the liquidity pool. /// @param aSent The quantity of asset A sent by the user to the liquidity pool. /// @return bToReceive The quantity of asset B the user would receive before transaction fee is applied. function calcBOut( uint256 aBalance, uint256 bBalance, uint256 aSent ) public pure returns (uint256) { uint256 denominator = aBalance.add(aSent); uint256 fraction = aBalance.mul(bBalance).div(denominator); uint256 bToReceive = bBalance.sub(fraction).sub(1); assert(bToReceive < bBalance); return bToReceive; } /// @notice Calculates the amount of ETH to transfer from the ECL pool to the DAI pool for the buyEcl function. /// @param ethBalanceOfEclPoolLocal The balance of ETH in the ECL liquidity pool. /// @param ethBalanceOfDaiPoolLocal The balance of ETH in the DAI liquidity pool. /// @param ethSent The quantity of ETH sent by the user in the buyEcl function. /// @return ethTransferToDaiPool The quantity of ETH to transfer from the ECL pool to the DAI pool. function calcEthTransferForBuyEcl( uint256 ethBalanceOfEclPoolLocal, uint256 ethBalanceOfDaiPoolLocal, uint256 ethSent ) public pure returns (uint256) { uint256 ethTransferToDaiPool; if ( ethBalanceOfEclPoolLocal >= ethSent.mul(4).div(6).add(ethBalanceOfDaiPoolLocal) ) { ethTransferToDaiPool = ethSent.mul(5).div(6); } else if ( ethSent.add(ethBalanceOfEclPoolLocal) <= ethBalanceOfDaiPoolLocal ) { ethTransferToDaiPool = 0; } else { ethTransferToDaiPool = ethSent .add(ethBalanceOfEclPoolLocal) .sub(ethBalanceOfDaiPoolLocal) .div(2); } assert(ethTransferToDaiPool <= ethSent.mul(5).div(6)); return ethTransferToDaiPool; } /// @notice Calculates the amount for the user to receive with a 0.3% transaction fee applied. /// @param amountBeforeFee The amount the user will receive before transaction fee is applied. /// @return amountAfterFee The amount the user will receive with transaction fee applied. function applyTransactionFee(uint256 amountBeforeFee) public pure returns (uint256) { uint256 amountAfterFee = amountBeforeFee.mul(997).div(1000); return amountAfterFee; } /// @notice Returns the ECL balance of the ECL pool. function eclBalanceOfEclPool() public view requireLaunched returns (uint256) { return balanceOf(address(this)); } /// @notice Returns the ETH balance of the DAI pool. function ethBalanceOfDaiPool() public view requireLaunched returns (uint256) { return address(this).balance.sub(ethBalanceOfEclPool); } /// @notice Returns the DAI balance of the DAI pool. function daiBalanceOfDaiPool() public view requireLaunched returns (uint256) { return daiInterface.balanceOf(address(this)); } /// @notice Returns the circulating supply of ECL. function circulatingSupply() public view requireLaunched returns (uint256) { return totalSupply().sub(eclBalanceOfEclPool()); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_daiAddress","type":"address"}],"payable":true,"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiReceived","type":"uint256"}],"name":"LogBuyDai","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eclReceived","type":"uint256"}],"name":"LogBuyEcl","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"daiSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"LogSellDai","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"eclSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"LogSellEcl","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"eclSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiReceived","type":"uint256"}],"name":"LogSoftSellEcl","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"amountBeforeFee","type":"uint256"}],"name":"applyTransactionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"minDaiToReceive","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"buyDai","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"minEclToReceive","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"buyEcl","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"aBalance","type":"uint256"},{"internalType":"uint256","name":"bBalance","type":"uint256"},{"internalType":"uint256","name":"aSent","type":"uint256"}],"name":"calcBOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"ethBalanceOfEclPoolLocal","type":"uint256"},{"internalType":"uint256","name":"ethBalanceOfDaiPoolLocal","type":"uint256"},{"internalType":"uint256","name":"ethSent","type":"uint256"}],"name":"calcEthTransferForBuyEcl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiBalanceOfDaiPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiInterface","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eclBalanceOfEclPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethBalanceOfDaiPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethBalanceOfEclPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethVolumeOfDaiPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethVolumeOfEclPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"launch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiSold","type":"uint256"},{"internalType":"uint256","name":"minEthToReceive","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"sellDai","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"eclSold","type":"uint256"},{"internalType":"uint256","name":"minEthToReceive","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"sellEcl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"eclSold","type":"uint256"},{"internalType":"uint256","name":"minEthToReceive","type":"uint256"},{"internalType":"uint256","name":"minDaiToReceive","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"softSellEcl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052604051620048ed380380620048ed833981810160405260208110156200002957600080fd5b81019080805190602001909291905050506040518060400160405280600981526020017f45636c69707365756d00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f45434c000000000000000000000000000000000000000000000000000000000081525060128260039080519060200190620000c09291906200042c565b508160049080519060200190620000d99291906200042c565b5080600560006101000a81548160ff021916908360ff1602179055505050506001600560016101000a81548160ff02191690831515021790555066470de4df82000034101562000175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180620048be602f913960400191505060405180910390fd5b620001913069152d02c7e14af6800000620001d960201b60201c565b80600560026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620004db565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200027d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6200029981600254620003a360201b620035131790919060201c565b600281905550620002f7816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620003a360201b620035131790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008082840190508381101562000422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200046f57805160ff1916838001178555620004a0565b82800160010185558215620004a0579182015b828111156200049f57825182559160200191906001019062000482565b5b509050620004af9190620004b3565b5090565b620004d891905b80821115620004d4576000816000905550600101620004ba565b5090565b90565b6143d380620004eb6000396000f3fe6080604052600436106101c25760003560e01c806371a2bf1f116100f7578063a72a9b8211610095578063dd62ed3e11610064578063dd62ed3e1461097a578063de52b28e146109ff578063e0d33fc114610a58578063efbf2d5a14610a83576101c2565b8063a72a9b8214610855578063a9059cbb146108a4578063b2e7b68614610917578063b7fdddbd14610942576101c2565b80638d16fd83116100d15780638d16fd83146106d85780639358928b1461072757806395d89b4114610752578063a457c2d7146107e2576101c2565b806371a2bf1f146106275780638091f3bf1461067e5780638994990d146106ad576101c2565b80632d56a4da116101645780635da271c51161013e5780635da271c5146104fc5780635ec5b53f1461052757806370a082311461055f57806370c4752a146105c4576101c2565b80632d56a4da1461042d578063313ce567146104585780633950935114610489576101c2565b80630c8fb8ee116101a05780630c8fb8ee146102e157806315506ea41461034457806318160ddd1461036f57806323b872dd1461039a576101c2565b806301339c21146101c757806306fdde03146101de578063095ea7b31461026e575b600080fd5b3480156101d357600080fd5b506101dc610ad2565b005b3480156101ea57600080fd5b506101f3610c95565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610233578082015181840152602081019050610218565b50505050905090810190601f1680156102605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561027a57600080fd5b506102c76004803603604081101561029157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d37565b604051808215151515815260200191505060405180910390f35b3480156102ed57600080fd5b5061032e6004803603606081101561030457600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610d55565b6040518082815260200191505060405180910390f35b34801561035057600080fd5b50610359610dd6565b6040518082815260200191505060405180910390f35b34801561037b57600080fd5b50610384610e4b565b6040518082815260200191505060405180910390f35b3480156103a657600080fd5b50610413600480360360608110156103bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e55565b604051808215151515815260200191505060405180910390f35b34801561043957600080fd5b50610442610f2e565b6040518082815260200191505060405180910390f35b34801561046457600080fd5b5061046d611074565b604051808260ff1660ff16815260200191505060405180910390f35b34801561049557600080fd5b506104e2600480360360408110156104ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061108b565b604051808215151515815260200191505060405180910390f35b34801561050857600080fd5b5061051161113e565b6040518082815260200191505060405180910390f35b61055d6004803603604081101561053d57600080fd5b8101908080359060200190929190803590602001909291905050506111bf565b005b34801561056b57600080fd5b506105ae6004803603602081101561058257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115c5565b6040518082815260200191505060405180910390f35b3480156105d057600080fd5b50610611600480360360608110156105e757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061160d565b6040518082815260200191505060405180910390f35b34801561063357600080fd5b5061063c611716565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561068a57600080fd5b5061069361173c565b604051808215151515815260200191505060405180910390f35b3480156106b957600080fd5b506106c261174f565b6040518082815260200191505060405180910390f35b3480156106e457600080fd5b50610725600480360360608110156106fb57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611755565b005b34801561073357600080fd5b5061073c611f69565b6040518082815260200191505060405180910390f35b34801561075e57600080fd5b50610767611ff6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107a757808201518184015260208101905061078c565b50505050905090810190601f1680156107d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156107ee57600080fd5b5061083b6004803603604081101561080557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612098565b604051808215151515815260200191505060405180910390f35b34801561086157600080fd5b506108a26004803603606081101561087857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612165565b005b3480156108b057600080fd5b506108fd600480360360408110156108c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612598565b604051808215151515815260200191505060405180910390f35b34801561092357600080fd5b5061092c6125b6565b6040518082815260200191505060405180910390f35b6109786004803603604081101561095857600080fd5b8101908080359060200190929190803590602001909291905050506125bc565b005b34801561098657600080fd5b506109e96004803603604081101561099d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612acb565b6040518082815260200191505060405180910390f35b348015610a0b57600080fd5b50610a5660048036036080811015610a2257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612b52565b005b348015610a6457600080fd5b50610a6d6132d7565b6040518082815260200191505060405180910390f35b348015610a8f57600080fd5b50610abc60048036036020811015610aa657600080fd5b81019080803590602001909291905050506132dd565b6040518082815260200191505060405180910390f35b600560169054906101000a900460ff1615610b38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806142216023913960400191505060405180910390fd5b6000600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610bd957600080fd5b505afa158015610bed573d6000803e3d6000fd5b505050506040513d6020811015610c0357600080fd5b810190808051906020019092919050505011610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806140e7603e913960400191505060405180910390fd5b662386f26fc100006006819055506001600560166101000a81548160ff021916908315150217905550565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d2d5780601f10610d0257610100808354040283529160200191610d2d565b820191906000526020600020905b815481529060010190602001808311610d1057829003601f168201915b5050505050905090565b6000610d4b610d44613314565b848461331c565b6001905092915050565b600080610d6b838661351390919063ffffffff16565b90506000610d9482610d86878961359b90919063ffffffff16565b61362190919063ffffffff16565b90506000610dbe6001610db0848961366b90919063ffffffff16565b61366b90919063ffffffff16565b9050858110610dc957fe5b8093505050509392505050565b6000600560169054906101000a900460ff16610e3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b610e46306115c5565b905090565b6000600254905090565b6000610e628484846136b5565b610f2384610e6e613314565b610f1e8560405180606001604052806028815260200161428660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ed4613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b61331c565b600190509392505050565b6000600560169054906101000a900460ff16610f95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d602081101561105e57600080fd5b8101908080519060200190929190505050905090565b6000600560009054906101000a900460ff16905090565b6000611134611098613314565b8461112f85600160006110a9613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351390919063ffffffff16565b61331c565b6001905092915050565b6000600560169054906101000a900460ff166111a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b6111ba6006544761366b90919063ffffffff16565b905090565b600560019054906101000a900460ff16611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff166112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b4281101561131a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60003411611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142ae602c913960400191505060405180910390fd5b600061138f3461138161113e565b61366b90919063ffffffff16565b9050600061139b610dd6565b905060006113b46113af6006548434610d55565b6132dd565b905060006113f260016113e460066113d660078761359b90919063ffffffff16565b61362190919063ffffffff16565b61351390919063ffffffff16565b90506000611403600654863461160d565b90508683101561145e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613fe36036913960400191505060405180910390fd5b611485816114773460065461351390919063ffffffff16565b61366b90919063ffffffff16565b60068190555061149e818661351390919063ffffffff16565b94506114c5826114b7858761366b90919063ffffffff16565b61351390919063ffffffff16565b9350346007600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f4e952d032e460bef7f0cd205df5b3372a7c451693b3709a22eaae359564970fd3485604051808381526020018281526020019250505060405180910390a26115383033856136b5565b6115423083613a2b565b61154a61113e565b851461155257fe5b61155a610dd6565b841461156257fe5b60006006541161156e57fe5b600061157861113e565b1161157f57fe5b6000611589610dd6565b1161159057fe5b600061159a610f2e565b116115a157fe5b50505050506001600560016101000a81548160ff0219169083151502179055505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806116498461163b600661162d60048861359b90919063ffffffff16565b61362190919063ffffffff16565b61351390919063ffffffff16565b851061167d57611676600661166860058661359b90919063ffffffff16565b61362190919063ffffffff16565b90506116db565b83611691868561351390919063ffffffff16565b1161169f57600090506116da565b6116d760026116c9866116bb898861351390919063ffffffff16565b61366b90919063ffffffff16565b61362190919063ffffffff16565b90505b5b61170260066116f460058661359b90919063ffffffff16565b61362190919063ffffffff16565b81111561170b57fe5b809150509392505050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560169054906101000a900460ff1681565b60065481565b600560019054906101000a900460ff166117d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff16611857576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b428110156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60008311611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614099602c913960400191505060405180910390fd5b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119a857600080fd5b505afa1580156119bc573d6000803e3d6000fd5b505050506040513d60208110156119d257600080fd5b8101908080519060200190929190505050831115611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061414b6033913960400191505060405180910390fd5b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611b0e57600080fd5b505afa158015611b22573d6000803e3d6000fd5b505050506040513d6020811015611b3857600080fd5b8101908080519060200190929190505050831115611bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f44414920736f6c64206578636565647320616c6c6f77616e63652e000000000081525060200191505060405180910390fd5b6000611bc861113e565b90506000611bd4610f2e565b90506000611be3828488610d55565b90506000611bf0826132dd565b90506000611c1a6002611c0c848661366b90919063ffffffff16565b61362190919063ffffffff16565b905086821015611c75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143446036913960400191505060405180910390fd5b611c8a8160065461351390919063ffffffff16565b600681905550611cb581611ca7848861366b90919063ffffffff16565b61366b90919063ffffffff16565b9450611cca888561351390919063ffffffff16565b9350816008600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fc92ee676c7d3543e3f165531791fdb8bfc912698dbdf5512ee22d5c7270e307d8984604051808381526020018281526020019250505060405180910390a2600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611e0f57600080fd5b505af1158015611e23573d6000803e3d6000fd5b505050506040513d6020811015611e3957600080fd5b8101908080519060200190929190505050611ebc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f444149205472616e73666572206661696c65642e00000000000000000000000081525060200191505060405180910390fd5b611ee5823373ffffffffffffffffffffffffffffffffffffffff16613be690919063ffffffff16565b611eed61113e565b8514611ef557fe5b611efd610f2e565b8414611f0557fe5b600060065411611f1157fe5b6000611f1b61113e565b11611f2257fe5b6000611f2c610dd6565b11611f3357fe5b6000611f3d610f2e565b11611f4457fe5b50505050506001600560016101000a81548160ff021916908315150217905550505050565b6000600560169054906101000a900460ff16611fd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b611ff1611fdb610dd6565b611fe3610e4b565b61366b90919063ffffffff16565b905090565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561208e5780601f106120635761010080835404028352916020019161208e565b820191906000526020600020905b81548152906001019060200180831161207157829003601f168201915b5050505050905090565b600061215b6120a5613314565b846121568560405180606001604052806025815260200161437a60259139600160006120cf613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b61331c565b6001905092915050565b600560019054906101000a900460ff166121e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff16612267576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b428110156122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60008311612319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614019602c913960400191505060405180910390fd5b612322336115c5565b83111561237a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141ee6033913960400191505060405180910390fd5b600061238461113e565b90506000612390610dd6565b905060006123bb60066123ad60078961359b90919063ffffffff16565b61362190919063ffffffff16565b905060006123d46123cf846006548a610d55565b6132dd565b90508581101561242f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143446036913960400191505060405180910390fd5b6124448160065461366b90919063ffffffff16565b60068190555061246f82612461898661351390919063ffffffff16565b61366b90919063ffffffff16565b9250806007600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f84f6901b5ec225d317e970c4bbac634752d8ad6120f8fd6cb54e36b991f6e4d48883604051808381526020018281526020019250505060405180910390a26124e23330896136b5565b6124ec3083613d20565b612515813373ffffffffffffffffffffffffffffffffffffffff16613be690919063ffffffff16565b61251d61113e565b841461252557fe5b61252d610dd6565b831461253557fe5b60006006541161254157fe5b600061254b61113e565b1161255257fe5b600061255c610dd6565b1161256357fe5b600061256d610f2e565b1161257457fe5b505050506001600560016101000a81548160ff021916908315150217905550505050565b60006125ac6125a5613314565b84846136b5565b6001905092915050565b60085481565b600560019054906101000a900460ff1661263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff166126be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b42811015612717576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60003411612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142ae602c913960400191505060405180910390fd5b600061278c3461277e61113e565b61366b90919063ffffffff16565b90506000612798610f2e565b905060006127af6127aa848434610d55565b6132dd565b905060006127db6127106127cd600f3461359b90919063ffffffff16565b61362190919063ffffffff16565b905085821015612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061417e6036913960400191505060405180910390fd5b61284b8160065461351390919063ffffffff16565b60068190555061287681612868348761351390919063ffffffff16565b61366b90919063ffffffff16565b935061288b828461366b90919063ffffffff16565b9250346008600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fd7f129755b0adfc490a800a8cbe4d30f6f64004f8ca96f66dfc52a153f2711793484604051808381526020018281526020019250505060405180910390a2600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b8101908080519060200190929190505050612a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f444149205472616e73666572206661696c65642e00000000000000000000000081525060200191505060405180910390fd5b612a5161113e565b8414612a5957fe5b612a61610f2e565b8314612a6957fe5b600060065411612a7557fe5b6000612a7f61113e565b11612a8657fe5b6000612a90610dd6565b11612a9757fe5b6000612aa1610f2e565b11612aa857fe5b505050506001600560016101000a81548160ff0219169083151502179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560019054906101000a900460ff16612bd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff16612c54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b42811015612cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60008411612d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614019602c913960400191505060405180910390fd5b612d0f336115c5565b841115612d67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141ee6033913960400191505060405180910390fd5b6000612d7161113e565b90506000612d7d611f69565b90506000612d89610dd6565b90506000612d95610f2e565b90506000612dd889612dca612dc587612db7888f61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b61351390919063ffffffff16565b9050612de2613f9e565b612e11612e0c86612dfe6006548e61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b816000018181525050612e47612e4286612e34898e61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b816020018181525050612e7d612e7886612e6a868e61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b81604001818152505088612ea28260200151836000015161351390919063ffffffff16565b1015612ef9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143446036913960400191505060405180910390fd5b8781604001511015612f56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061417e6036913960400191505060405180910390fd5b612f6f816000015160065461366b90919063ffffffff16565b600681905550612f8c81602001518761366b90919063ffffffff16565b9550612fa581604001518461366b90919063ffffffff16565b9250612fcc82612fbe8c8761351390919063ffffffff16565b61366b90919063ffffffff16565b9350806000015160076000828254019250508190555080602001516008600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcdf22f28ecc3956314db1390306bcf84c8747ac94c3a0e6d2385ba9f01b89c3b8b61304a8460200151856000015161351390919063ffffffff16565b846040015160405180848152602001838152602001828152602001935050505060405180910390a261307d33308c6136b5565b6130873083613d20565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383604001516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561313457600080fd5b505af1158015613148573d6000803e3d6000fd5b505050506040513d602081101561315e57600080fd5b81019080805190602001909291905050506131e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f444149205472616e73666572206661696c65642e00000000000000000000000081525060200191505060405180910390fd5b6132246131ff8260200151836000015161351390919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff16613be690919063ffffffff16565b4761323a8760065461351390919063ffffffff16565b1461324157fe5b613249610dd6565b841461325157fe5b613259610f2e565b831461326157fe5b61326961113e565b861461327157fe5b60006006541161327d57fe5b600061328761113e565b1161328e57fe5b6000613298610dd6565b1161329f57fe5b60006132a9610f2e565b116132b057fe5b5050505050506001600560016101000a81548160ff02191690831515021790555050505050565b60075481565b6000806133096103e86132fb6103e58661359b90919063ffffffff16565b61362190919063ffffffff16565b905080915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806143206024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613428576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140c56022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600080828401905083811015613591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156135ae576000905061361b565b60008284029050828482816135bf57fe5b0414613616576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142656021913960400191505060405180910390fd5b809150505b92915050565b600061366383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ed8565b905092915050565b60006136ad83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061396b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142fb6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613fc06023913960400191505060405180910390fd5b61382c81604051806060016040528060268152602001614125602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138bf816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613a18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139dd5780820151818401526020810190506139c2565b50505050905090810190601f168015613a0a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ace576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b613ae38160025461351390919063ffffffff16565b600281905550613b3a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b80471015613c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114613cbc576040519150601f19603f3d011682016040523d82523d6000602084013e613cc1565b606091505b5050905080613d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806141b4603a913960400191505060405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142da6021913960400191505060405180910390fd5b613e1181604051806060016040528060228152602001614045602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e688160025461366b90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008083118290613f84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f49578082015181840152602081019050613f2e565b50505050905090810190601f168015613f765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613f9057fe5b049050809150509392505050565b6040518060600160405280600081526020016000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373556e61626c6520746f2073656e6420746865206d696e696d756d207175616e74697479206f662045434c20746f20726563656976652e56616c7565206f662045434c20736f6c64206d7573742062652067726561746572207468616e207a65726f2e45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365436f6e7472616374206d757374206265206c61756e6368656420746f20696e766f6b6520746869732066756e6374696f6e2e56616c7565206f662044414920736f6c64206d7573742062652067726561746572207468616e207a65726f2e45524332303a20617070726f766520746f20746865207a65726f206164647265737344414920706f6f6c2062616c616e6365206d7573742062652067726561746572207468616e207a65726f20746f206c61756e636820636f6e74726163742e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636544414920736f6c64206d757374206265206c657373207468616e206f7220657175616c20746f204441492062616c616e63652e556e61626c6520746f2073656e6420746865206d696e696d756d207175616e74697479206f662044414920746f20726563656976652e416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d6179206861766520726576657274656445434c20736f6c64206d757374206265206c657373207468616e206f7220657175616c20746f2045434c2062616c616e63652e436f6e74726163742068617320616c7265616479206265656e206c61756e636865642e5472616e73616374696f6e20646561646c696e652068617320656c61707365642e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636556616c7565206f66204554482073656e74206d7573742062652067726561746572207468616e207a65726f2e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373556e61626c6520746f2073656e6420746865206d696e696d756d207175616e74697479206f662045544820746f20726563656976652e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820be7d5ab3d0c603e514f1a656cffc38c0a058a6cb7c4368ffcf1e3cfaa14cb20264736f6c634300051100324d7573742063616c6c20636f6e7374727563746f722077697468206174206c6561737420302e30322045746865722e0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806371a2bf1f116100f7578063a72a9b8211610095578063dd62ed3e11610064578063dd62ed3e1461097a578063de52b28e146109ff578063e0d33fc114610a58578063efbf2d5a14610a83576101c2565b8063a72a9b8214610855578063a9059cbb146108a4578063b2e7b68614610917578063b7fdddbd14610942576101c2565b80638d16fd83116100d15780638d16fd83146106d85780639358928b1461072757806395d89b4114610752578063a457c2d7146107e2576101c2565b806371a2bf1f146106275780638091f3bf1461067e5780638994990d146106ad576101c2565b80632d56a4da116101645780635da271c51161013e5780635da271c5146104fc5780635ec5b53f1461052757806370a082311461055f57806370c4752a146105c4576101c2565b80632d56a4da1461042d578063313ce567146104585780633950935114610489576101c2565b80630c8fb8ee116101a05780630c8fb8ee146102e157806315506ea41461034457806318160ddd1461036f57806323b872dd1461039a576101c2565b806301339c21146101c757806306fdde03146101de578063095ea7b31461026e575b600080fd5b3480156101d357600080fd5b506101dc610ad2565b005b3480156101ea57600080fd5b506101f3610c95565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610233578082015181840152602081019050610218565b50505050905090810190601f1680156102605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561027a57600080fd5b506102c76004803603604081101561029157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d37565b604051808215151515815260200191505060405180910390f35b3480156102ed57600080fd5b5061032e6004803603606081101561030457600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610d55565b6040518082815260200191505060405180910390f35b34801561035057600080fd5b50610359610dd6565b6040518082815260200191505060405180910390f35b34801561037b57600080fd5b50610384610e4b565b6040518082815260200191505060405180910390f35b3480156103a657600080fd5b50610413600480360360608110156103bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e55565b604051808215151515815260200191505060405180910390f35b34801561043957600080fd5b50610442610f2e565b6040518082815260200191505060405180910390f35b34801561046457600080fd5b5061046d611074565b604051808260ff1660ff16815260200191505060405180910390f35b34801561049557600080fd5b506104e2600480360360408110156104ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061108b565b604051808215151515815260200191505060405180910390f35b34801561050857600080fd5b5061051161113e565b6040518082815260200191505060405180910390f35b61055d6004803603604081101561053d57600080fd5b8101908080359060200190929190803590602001909291905050506111bf565b005b34801561056b57600080fd5b506105ae6004803603602081101561058257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115c5565b6040518082815260200191505060405180910390f35b3480156105d057600080fd5b50610611600480360360608110156105e757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061160d565b6040518082815260200191505060405180910390f35b34801561063357600080fd5b5061063c611716565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561068a57600080fd5b5061069361173c565b604051808215151515815260200191505060405180910390f35b3480156106b957600080fd5b506106c261174f565b6040518082815260200191505060405180910390f35b3480156106e457600080fd5b50610725600480360360608110156106fb57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611755565b005b34801561073357600080fd5b5061073c611f69565b6040518082815260200191505060405180910390f35b34801561075e57600080fd5b50610767611ff6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107a757808201518184015260208101905061078c565b50505050905090810190601f1680156107d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156107ee57600080fd5b5061083b6004803603604081101561080557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612098565b604051808215151515815260200191505060405180910390f35b34801561086157600080fd5b506108a26004803603606081101561087857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612165565b005b3480156108b057600080fd5b506108fd600480360360408110156108c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612598565b604051808215151515815260200191505060405180910390f35b34801561092357600080fd5b5061092c6125b6565b6040518082815260200191505060405180910390f35b6109786004803603604081101561095857600080fd5b8101908080359060200190929190803590602001909291905050506125bc565b005b34801561098657600080fd5b506109e96004803603604081101561099d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612acb565b6040518082815260200191505060405180910390f35b348015610a0b57600080fd5b50610a5660048036036080811015610a2257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612b52565b005b348015610a6457600080fd5b50610a6d6132d7565b6040518082815260200191505060405180910390f35b348015610a8f57600080fd5b50610abc60048036036020811015610aa657600080fd5b81019080803590602001909291905050506132dd565b6040518082815260200191505060405180910390f35b600560169054906101000a900460ff1615610b38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806142216023913960400191505060405180910390fd5b6000600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610bd957600080fd5b505afa158015610bed573d6000803e3d6000fd5b505050506040513d6020811015610c0357600080fd5b810190808051906020019092919050505011610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806140e7603e913960400191505060405180910390fd5b662386f26fc100006006819055506001600560166101000a81548160ff021916908315150217905550565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d2d5780601f10610d0257610100808354040283529160200191610d2d565b820191906000526020600020905b815481529060010190602001808311610d1057829003601f168201915b5050505050905090565b6000610d4b610d44613314565b848461331c565b6001905092915050565b600080610d6b838661351390919063ffffffff16565b90506000610d9482610d86878961359b90919063ffffffff16565b61362190919063ffffffff16565b90506000610dbe6001610db0848961366b90919063ffffffff16565b61366b90919063ffffffff16565b9050858110610dc957fe5b8093505050509392505050565b6000600560169054906101000a900460ff16610e3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b610e46306115c5565b905090565b6000600254905090565b6000610e628484846136b5565b610f2384610e6e613314565b610f1e8560405180606001604052806028815260200161428660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ed4613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b61331c565b600190509392505050565b6000600560169054906101000a900460ff16610f95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d602081101561105e57600080fd5b8101908080519060200190929190505050905090565b6000600560009054906101000a900460ff16905090565b6000611134611098613314565b8461112f85600160006110a9613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351390919063ffffffff16565b61331c565b6001905092915050565b6000600560169054906101000a900460ff166111a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b6111ba6006544761366b90919063ffffffff16565b905090565b600560019054906101000a900460ff16611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff166112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b4281101561131a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60003411611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142ae602c913960400191505060405180910390fd5b600061138f3461138161113e565b61366b90919063ffffffff16565b9050600061139b610dd6565b905060006113b46113af6006548434610d55565b6132dd565b905060006113f260016113e460066113d660078761359b90919063ffffffff16565b61362190919063ffffffff16565b61351390919063ffffffff16565b90506000611403600654863461160d565b90508683101561145e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613fe36036913960400191505060405180910390fd5b611485816114773460065461351390919063ffffffff16565b61366b90919063ffffffff16565b60068190555061149e818661351390919063ffffffff16565b94506114c5826114b7858761366b90919063ffffffff16565b61351390919063ffffffff16565b9350346007600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f4e952d032e460bef7f0cd205df5b3372a7c451693b3709a22eaae359564970fd3485604051808381526020018281526020019250505060405180910390a26115383033856136b5565b6115423083613a2b565b61154a61113e565b851461155257fe5b61155a610dd6565b841461156257fe5b60006006541161156e57fe5b600061157861113e565b1161157f57fe5b6000611589610dd6565b1161159057fe5b600061159a610f2e565b116115a157fe5b50505050506001600560016101000a81548160ff0219169083151502179055505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806116498461163b600661162d60048861359b90919063ffffffff16565b61362190919063ffffffff16565b61351390919063ffffffff16565b851061167d57611676600661166860058661359b90919063ffffffff16565b61362190919063ffffffff16565b90506116db565b83611691868561351390919063ffffffff16565b1161169f57600090506116da565b6116d760026116c9866116bb898861351390919063ffffffff16565b61366b90919063ffffffff16565b61362190919063ffffffff16565b90505b5b61170260066116f460058661359b90919063ffffffff16565b61362190919063ffffffff16565b81111561170b57fe5b809150509392505050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560169054906101000a900460ff1681565b60065481565b600560019054906101000a900460ff166117d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff16611857576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b428110156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60008311611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614099602c913960400191505060405180910390fd5b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119a857600080fd5b505afa1580156119bc573d6000803e3d6000fd5b505050506040513d60208110156119d257600080fd5b8101908080519060200190929190505050831115611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061414b6033913960400191505060405180910390fd5b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611b0e57600080fd5b505afa158015611b22573d6000803e3d6000fd5b505050506040513d6020811015611b3857600080fd5b8101908080519060200190929190505050831115611bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f44414920736f6c64206578636565647320616c6c6f77616e63652e000000000081525060200191505060405180910390fd5b6000611bc861113e565b90506000611bd4610f2e565b90506000611be3828488610d55565b90506000611bf0826132dd565b90506000611c1a6002611c0c848661366b90919063ffffffff16565b61362190919063ffffffff16565b905086821015611c75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143446036913960400191505060405180910390fd5b611c8a8160065461351390919063ffffffff16565b600681905550611cb581611ca7848861366b90919063ffffffff16565b61366b90919063ffffffff16565b9450611cca888561351390919063ffffffff16565b9350816008600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fc92ee676c7d3543e3f165531791fdb8bfc912698dbdf5512ee22d5c7270e307d8984604051808381526020018281526020019250505060405180910390a2600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611e0f57600080fd5b505af1158015611e23573d6000803e3d6000fd5b505050506040513d6020811015611e3957600080fd5b8101908080519060200190929190505050611ebc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f444149205472616e73666572206661696c65642e00000000000000000000000081525060200191505060405180910390fd5b611ee5823373ffffffffffffffffffffffffffffffffffffffff16613be690919063ffffffff16565b611eed61113e565b8514611ef557fe5b611efd610f2e565b8414611f0557fe5b600060065411611f1157fe5b6000611f1b61113e565b11611f2257fe5b6000611f2c610dd6565b11611f3357fe5b6000611f3d610f2e565b11611f4457fe5b50505050506001600560016101000a81548160ff021916908315150217905550505050565b6000600560169054906101000a900460ff16611fd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b611ff1611fdb610dd6565b611fe3610e4b565b61366b90919063ffffffff16565b905090565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561208e5780601f106120635761010080835404028352916020019161208e565b820191906000526020600020905b81548152906001019060200180831161207157829003601f168201915b5050505050905090565b600061215b6120a5613314565b846121568560405180606001604052806025815260200161437a60259139600160006120cf613314565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b61331c565b6001905092915050565b600560019054906101000a900460ff166121e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff16612267576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b428110156122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60008311612319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614019602c913960400191505060405180910390fd5b612322336115c5565b83111561237a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141ee6033913960400191505060405180910390fd5b600061238461113e565b90506000612390610dd6565b905060006123bb60066123ad60078961359b90919063ffffffff16565b61362190919063ffffffff16565b905060006123d46123cf846006548a610d55565b6132dd565b90508581101561242f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143446036913960400191505060405180910390fd5b6124448160065461366b90919063ffffffff16565b60068190555061246f82612461898661351390919063ffffffff16565b61366b90919063ffffffff16565b9250806007600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f84f6901b5ec225d317e970c4bbac634752d8ad6120f8fd6cb54e36b991f6e4d48883604051808381526020018281526020019250505060405180910390a26124e23330896136b5565b6124ec3083613d20565b612515813373ffffffffffffffffffffffffffffffffffffffff16613be690919063ffffffff16565b61251d61113e565b841461252557fe5b61252d610dd6565b831461253557fe5b60006006541161254157fe5b600061254b61113e565b1161255257fe5b600061255c610dd6565b1161256357fe5b600061256d610f2e565b1161257457fe5b505050506001600560016101000a81548160ff021916908315150217905550505050565b60006125ac6125a5613314565b84846136b5565b6001905092915050565b60085481565b600560019054906101000a900460ff1661263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff166126be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b42811015612717576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60003411612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142ae602c913960400191505060405180910390fd5b600061278c3461277e61113e565b61366b90919063ffffffff16565b90506000612798610f2e565b905060006127af6127aa848434610d55565b6132dd565b905060006127db6127106127cd600f3461359b90919063ffffffff16565b61362190919063ffffffff16565b905085821015612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061417e6036913960400191505060405180910390fd5b61284b8160065461351390919063ffffffff16565b60068190555061287681612868348761351390919063ffffffff16565b61366b90919063ffffffff16565b935061288b828461366b90919063ffffffff16565b9250346008600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fd7f129755b0adfc490a800a8cbe4d30f6f64004f8ca96f66dfc52a153f2711793484604051808381526020018281526020019250505060405180910390a2600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b8101908080519060200190929190505050612a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f444149205472616e73666572206661696c65642e00000000000000000000000081525060200191505060405180910390fd5b612a5161113e565b8414612a5957fe5b612a61610f2e565b8314612a6957fe5b600060065411612a7557fe5b6000612a7f61113e565b11612a8657fe5b6000612a90610dd6565b11612a9757fe5b6000612aa1610f2e565b11612aa857fe5b505050506001600560016101000a81548160ff0219169083151502179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560019054906101000a900460ff16612bd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6000600560016101000a81548160ff021916908315150217905550600560169054906101000a900460ff16612c54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140676032913960400191505060405180910390fd5b42811015612cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142446021913960400191505060405180910390fd5b60008411612d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614019602c913960400191505060405180910390fd5b612d0f336115c5565b841115612d67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141ee6033913960400191505060405180910390fd5b6000612d7161113e565b90506000612d7d611f69565b90506000612d89610dd6565b90506000612d95610f2e565b90506000612dd889612dca612dc587612db7888f61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b61351390919063ffffffff16565b9050612de2613f9e565b612e11612e0c86612dfe6006548e61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b816000018181525050612e47612e4286612e34898e61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b816020018181525050612e7d612e7886612e6a868e61359b90919063ffffffff16565b61362190919063ffffffff16565b6132dd565b81604001818152505088612ea28260200151836000015161351390919063ffffffff16565b1015612ef9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143446036913960400191505060405180910390fd5b8781604001511015612f56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061417e6036913960400191505060405180910390fd5b612f6f816000015160065461366b90919063ffffffff16565b600681905550612f8c81602001518761366b90919063ffffffff16565b9550612fa581604001518461366b90919063ffffffff16565b9250612fcc82612fbe8c8761351390919063ffffffff16565b61366b90919063ffffffff16565b9350806000015160076000828254019250508190555080602001516008600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcdf22f28ecc3956314db1390306bcf84c8747ac94c3a0e6d2385ba9f01b89c3b8b61304a8460200151856000015161351390919063ffffffff16565b846040015160405180848152602001838152602001828152602001935050505060405180910390a261307d33308c6136b5565b6130873083613d20565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383604001516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561313457600080fd5b505af1158015613148573d6000803e3d6000fd5b505050506040513d602081101561315e57600080fd5b81019080805190602001909291905050506131e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f444149205472616e73666572206661696c65642e00000000000000000000000081525060200191505060405180910390fd5b6132246131ff8260200151836000015161351390919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff16613be690919063ffffffff16565b4761323a8760065461351390919063ffffffff16565b1461324157fe5b613249610dd6565b841461325157fe5b613259610f2e565b831461326157fe5b61326961113e565b861461327157fe5b60006006541161327d57fe5b600061328761113e565b1161328e57fe5b6000613298610dd6565b1161329f57fe5b60006132a9610f2e565b116132b057fe5b5050505050506001600560016101000a81548160ff02191690831515021790555050505050565b60075481565b6000806133096103e86132fb6103e58661359b90919063ffffffff16565b61362190919063ffffffff16565b905080915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806143206024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613428576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140c56022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600080828401905083811015613591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156135ae576000905061361b565b60008284029050828482816135bf57fe5b0414613616576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142656021913960400191505060405180910390fd5b809150505b92915050565b600061366383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ed8565b905092915050565b60006136ad83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061396b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142fb6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613fc06023913960400191505060405180910390fd5b61382c81604051806060016040528060268152602001614125602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138bf816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613a18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139dd5780820151818401526020810190506139c2565b50505050905090810190601f168015613a0a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ace576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b613ae38160025461351390919063ffffffff16565b600281905550613b3a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b80471015613c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114613cbc576040519150601f19603f3d011682016040523d82523d6000602084013e613cc1565b606091505b5050905080613d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806141b4603a913960400191505060405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142da6021913960400191505060405180910390fd5b613e1181604051806060016040528060228152602001614045602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461396b9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e688160025461366b90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008083118290613f84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f49578082015181840152602081019050613f2e565b50505050905090810190601f168015613f765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613f9057fe5b049050809150509392505050565b6040518060600160405280600081526020016000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373556e61626c6520746f2073656e6420746865206d696e696d756d207175616e74697479206f662045434c20746f20726563656976652e56616c7565206f662045434c20736f6c64206d7573742062652067726561746572207468616e207a65726f2e45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365436f6e7472616374206d757374206265206c61756e6368656420746f20696e766f6b6520746869732066756e6374696f6e2e56616c7565206f662044414920736f6c64206d7573742062652067726561746572207468616e207a65726f2e45524332303a20617070726f766520746f20746865207a65726f206164647265737344414920706f6f6c2062616c616e6365206d7573742062652067726561746572207468616e207a65726f20746f206c61756e636820636f6e74726163742e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636544414920736f6c64206d757374206265206c657373207468616e206f7220657175616c20746f204441492062616c616e63652e556e61626c6520746f2073656e6420746865206d696e696d756d207175616e74697479206f662044414920746f20726563656976652e416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d6179206861766520726576657274656445434c20736f6c64206d757374206265206c657373207468616e206f7220657175616c20746f2045434c2062616c616e63652e436f6e74726163742068617320616c7265616479206265656e206c61756e636865642e5472616e73616374696f6e20646561646c696e652068617320656c61707365642e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636556616c7565206f66204554482073656e74206d7573742062652067726561746572207468616e207a65726f2e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373556e61626c6520746f2073656e6420746865206d696e696d756d207175616e74697479206f662045544820746f20726563656976652e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820be7d5ab3d0c603e514f1a656cffc38c0a058a6cb7c4368ffcf1e3cfaa14cb20264736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
-----Decoded View---------------
Arg [0] : _daiAddress (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Deployed Bytecode Sourcemap
25249:19223:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27249:338;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27249:338:0;;;:::i;:::-;;18697:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18697:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;18697:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12220:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12220:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12220:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41237:395;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41237:395:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41237:395:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43593:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43593:168:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11241:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11241:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12844:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12844:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12844:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;44083:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44083:181:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19549:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19549:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13557:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13557:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13557:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43827:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43827:190:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27873:1915;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27873:1915:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11395:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11395:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11395:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42121:877;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42121:877:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42121:877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25541:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25541:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25574:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25574:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25601:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25601:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38325:2308;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38325:2308:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38325:2308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44328:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44328:141:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18899:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18899:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;18899:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14270:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14270:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14270:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30116:1749;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30116:1749:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30116:1749:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11718:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11718:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11718:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25682:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25682:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36212:1785;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36212:1785:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11939:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11939:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11939:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32291:3654;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32291:3654:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;32291:3654:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25642:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25642:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43301:226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43301:226:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43301:226:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27249:338;27296:8;;;;;;;;;;;27295:9;27287:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27417:1;27377:12;;;;;;;;;;;:22;;;27408:4;27377:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27377:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27377:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27377:37:0;;;;;;;;;;;;;;;;:41;27355:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27543:10;27521:19;:32;;;;27575:4;27564:8;;:15;;;;;;;;;;;;;;;;;;27249:338::o;18697:83::-;18734:13;18767:5;18760:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18697:83;:::o;12220:152::-;12286:4;12303:39;12312:12;:10;:12::i;:::-;12326:7;12335:6;12303:8;:39::i;:::-;12360:4;12353:11;;12220:152;;;;:::o;41237:395::-;41361:7;41381:19;41403;41416:5;41403:8;:12;;:19;;;;:::i;:::-;41381:41;;41433:16;41452:39;41479:11;41452:22;41465:8;41452;:12;;:22;;;;:::i;:::-;:26;;:39;;;;:::i;:::-;41433:58;;41502:18;41523:29;41550:1;41523:22;41536:8;41523;:12;;:22;;;;:::i;:::-;:26;;:29;;;;:::i;:::-;41502:50;;41585:8;41572:10;:21;41565:29;;;;41614:10;41607:17;;;;;41237:395;;;;;:::o;43593:168::-;43697:7;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43729:24;43747:4;43729:9;:24::i;:::-;43722:31;;43593:168;:::o;11241:91::-;11285:7;11312:12;;11305:19;;11241:91;:::o;12844:304::-;12933:4;12950:36;12960:6;12968:9;12979:6;12950:9;:36::i;:::-;12997:121;13006:6;13014:12;:10;:12::i;:::-;13028:89;13066:6;13028:89;;;;;;;;;;;;;;;;;:11;:19;13040:6;13028:19;;;;;;;;;;;;;;;:33;13048:12;:10;:12::i;:::-;13028:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;12997:8;:121::i;:::-;13136:4;13129:11;;12844:304;;;;;:::o;44083:181::-;44187:7;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44219:12;;;;;;;;;;;:22;;;44250:4;44219:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44219:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44219:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44219:37:0;;;;;;;;;;;;;;;;44212:44;;44083:181;:::o;19549:83::-;19590:5;19615:9;;;;;;;;;;;19608:16;;19549:83;:::o;13557:210::-;13637:4;13654:83;13663:12;:10;:12::i;:::-;13677:7;13686:50;13725:10;13686:11;:25;13698:12;:10;:12::i;:::-;13686:25;;;;;;;;;;;;;;;:34;13712:7;13686:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;13654:8;:83::i;:::-;13755:4;13748:11;;13557:210;;;;:::o;43827:190::-;43931:7;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43963:46;43989:19;;43963:21;:25;;:46;;;;:::i;:::-;43956:53;;43827:190;:::o;27873:1915::-;21699:11;;;;;;;;;;;21691:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21838:5;21824:11;;:19;;;;;;;;;;;;;;;;;;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28064:15;28052:8;:27;;28030:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28171:1;28159:9;:13;28151:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28234:32;28269:36;28295:9;28269:21;:19;:21::i;:::-;:25;;:36;;;;:::i;:::-;28234:71;;28316:32;28351:21;:19;:21::i;:::-;28316:56;;28383:20;28406:111;28440:66;28449:19;;28470:24;28496:9;28440:8;:66::i;:::-;28406:19;:111::i;:::-;28383:134;;28528:17;28548:33;28579:1;28548:26;28572:1;28548:19;28565:1;28548:12;:16;;:19;;;;:::i;:::-;:23;;:26;;;;:::i;:::-;:30;;:33;;;;:::i;:::-;28528:53;;28592:28;28623:132;28662:19;;28696:24;28735:9;28623:24;:132::i;:::-;28592:163;;28806:15;28790:12;:31;;28768:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28938:84;28991:20;28938:34;28962:9;28938:19;;:23;;:34;;;;:::i;:::-;:38;;:84;;;;:::i;:::-;28916:19;:106;;;;29060:74;29103:20;29060:24;:28;;:74;;;;:::i;:::-;29033:101;;29172:85;29247:9;29172:56;29215:12;29172:24;:42;;:56;;;;:::i;:::-;:74;;:85;;;;:::i;:::-;29145:112;;29290:9;29268:18;;:31;;;;;;;;;;;29327:10;29317:46;;;29339:9;29350:12;29317:46;;;;;;;;;;;;;;;;;;;;;;;;29376:50;29394:4;29401:10;29413:12;29376:9;:50::i;:::-;29437:31;29451:4;29458:9;29437:5;:31::i;:::-;29516:21;:19;:21::i;:::-;29488:24;:49;29481:57;;;;29584:21;:19;:21::i;:::-;29556:24;:49;29549:57;;;;29646:1;29624:19;;:23;29617:31;;;;29690:1;29666:21;:19;:21::i;:::-;:25;29659:33;;;;29734:1;29710:21;:19;:21::i;:::-;:25;29703:33;;;;29778:1;29754:21;:19;:21::i;:::-;:25;29747:33;;;;26500:1;;;;;22018:4;22004:11;;:18;;;;;;;;;;;;;;;;;;27873:1915;;:::o;11395:110::-;11452:7;11479:9;:18;11489:7;11479:18;;;;;;;;;;;;;;;;11472:25;;11395:110;;;:::o;42121:877::-;42295:7;42315:28;42415:51;42441:24;42415:21;42434:1;42415:14;42427:1;42415:7;:11;;:14;;;;:::i;:::-;:18;;:21;;;;:::i;:::-;:25;;:51;;;;:::i;:::-;42374:24;:92;42356:529;;42516:21;42535:1;42516:14;42528:1;42516:7;:11;;:14;;;;:::i;:::-;:18;;:21;;;;:::i;:::-;42493:44;;42356:529;;;42614:24;42573:37;42585:24;42573:7;:11;;:37;;;;:::i;:::-;:65;42555:330;;42688:1;42665:24;;42555:330;;;42745:128;42871:1;42745:103;42823:24;42745:55;42775:24;42745:7;:29;;:55;;;;:::i;:::-;:77;;:103;;;;:::i;:::-;:125;;:128;;;;:::i;:::-;42722:151;;42555:330;42356:529;42928:21;42947:1;42928:14;42940:1;42928:7;:11;;:14;;;;:::i;:::-;:18;;:21;;;;:::i;:::-;42904:20;:45;;42897:53;;;;42970:20;42963:27;;;42121:877;;;;;:::o;25541:26::-;;;;;;;;;;;;;:::o;25574:20::-;;;;;;;;;;;;;:::o;25601:34::-;;;;:::o;38325:2308::-;21699:11;;;;;;;;;;;21691:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21838:5;21824:11;;:19;;;;;;;;;;;;;;;;;;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38519:15;38507:8;:27;;38485:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38624:1;38614:7;:11;38606:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38718:12;;;;;;;;;;;:22;;;38749:10;38718:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38718:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38718:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38718:43:0;;;;;;;;;;;;;;;;38707:7;:54;;38685:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38901:12;;;;;;;;;;;:22;;;38932:10;38953:4;38901:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38901:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38901:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38901:58:0;;;;;;;;;;;;;;;;38873:7;:86;;38851:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39027:32;39062:21;:19;:21::i;:::-;39027:56;;39094:32;39129:21;:19;:21::i;:::-;39094:56;;39161:29;39193:119;39216:24;39255;39294:7;39193:8;:119::i;:::-;39161:151;;39323:20;39346:42;39366:21;39346:19;:42::i;:::-;39323:65;;39399:28;39430:74;39502:1;39430:53;39470:12;39430:21;:39;;:53;;;;:::i;:::-;:71;;:74;;;;:::i;:::-;39399:105;;39555:15;39539:12;:31;;39517:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39687:45;39711:20;39687:19;;:23;;:45;;;;:::i;:::-;39665:19;:67;;;;39770:96;39845:20;39770:56;39813:12;39770:24;:42;;:56;;;;:::i;:::-;:74;;:96;;;;:::i;:::-;39743:123;;39904:37;39933:7;39904:24;:28;;:37;;;;:::i;:::-;39877:64;;39974:12;39952:18;;:34;;;;;;;;;;;40015:10;40004:45;;;40027:7;40036:12;40004:45;;;;;;;;;;;;;;;;;;;;;;;;40084:12;;;;;;;;;;;:25;;;40136:10;40174:4;40198:7;40084:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40084:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40084:136:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40084:136:0;;;;;;;;;;;;;;;;40062:206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40279:34;40300:12;40279:10;:20;;;;:34;;;;:::i;:::-;40361:21;:19;:21::i;:::-;40333:24;:49;40326:57;;;;40429:21;:19;:21::i;:::-;40401:24;:49;40394:57;;;;40491:1;40469:19;;:23;40462:31;;;;40535:1;40511:21;:19;:21::i;:::-;:25;40504:33;;;;40579:1;40555:21;:19;:21::i;:::-;:25;40548:33;;;;40623:1;40599:21;:19;:21::i;:::-;:25;40592:33;;;;26500:1;;;;;22018:4;22004:11;;:18;;;;;;;;;;;;;;;;;;38325:2308;;;:::o;44328:141::-;44394:7;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44421:40;44439:21;:19;:21::i;:::-;44421:13;:11;:13::i;:::-;:17;;:40;;;;:::i;:::-;44414:47;;44328:141;:::o;18899:87::-;18938:13;18971:7;18964:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18899:87;:::o;14270:261::-;14355:4;14372:129;14381:12;:10;:12::i;:::-;14395:7;14404:96;14443:15;14404:96;;;;;;;;;;;;;;;;;:11;:25;14416:12;:10;:12::i;:::-;14404:25;;;;;;;;;;;;;;;:34;14430:7;14404:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;14372:8;:129::i;:::-;14519:4;14512:11;;14270:261;;;;:::o;30116:1749::-;21699:11;;;;;;;;;;;21691:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21838:5;21824:11;;:19;;;;;;;;;;;;;;;;;;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30310:15;30298:8;:27;;30276:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30415:1;30405:7;:11;30397:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30509:30;30527:10;30509:9;:30::i;:::-;30498:7;:41;;30476:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30631:32;30666:21;:19;:21::i;:::-;30631:56;;30698:32;30733:21;:19;:21::i;:::-;30698:56;;30765:17;30785:21;30804:1;30785:14;30797:1;30785:7;:11;;:14;;;;:::i;:::-;:18;;:21;;;;:::i;:::-;30765:41;;30817:20;30840:109;30874:64;30883:24;30909:19;;30930:7;30874:8;:64::i;:::-;30840:19;:109::i;:::-;30817:132;;31000:15;30984:12;:31;;30962:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31132:37;31156:12;31132:19;;:23;;:37;;;;:::i;:::-;31110:19;:59;;;;31207:76;31263:9;31207:37;31236:7;31207:24;:28;;:37;;;;:::i;:::-;:41;;:76;;;;:::i;:::-;31180:103;;31316:12;31294:18;;:34;;;;;;;;;;;31357:10;31346:45;;;31369:7;31378:12;31346:45;;;;;;;;;;;;;;;;;;;;;;;;31404:54;31422:10;31443:4;31450:7;31404:9;:54::i;:::-;31469:31;31483:4;31490:9;31469:5;:31::i;:::-;31511:34;31532:12;31511:10;:20;;;;:34;;;;:::i;:::-;31593:21;:19;:21::i;:::-;31565:24;:49;31558:57;;;;31661:21;:19;:21::i;:::-;31633:24;:49;31626:57;;;;31723:1;31701:19;;:23;31694:31;;;;31767:1;31743:21;:19;:21::i;:::-;:25;31736:33;;;;31811:1;31787:21;:19;:21::i;:::-;:25;31780:33;;;;31855:1;31831:21;:19;:21::i;:::-;:25;31824:33;;;;26500:1;;;;22018:4;22004:11;;:18;;;;;;;;;;;;;;;;;;30116:1749;;;:::o;11718:158::-;11787:4;11804:42;11814:12;:10;:12::i;:::-;11828:9;11839:6;11804:9;:42::i;:::-;11864:4;11857:11;;11718:158;;;;:::o;25682:33::-;;;;:::o;36212:1785::-;21699:11;;;;;;;;;;;21691:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21838:5;21824:11;;:19;;;;;;;;;;;;;;;;;;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36403:15;36391:8;:27;;36369:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36510:1;36498:9;:13;36490:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36573:32;36608:36;36634:9;36608:21;:19;:21::i;:::-;:25;;:36;;;;:::i;:::-;36573:71;;36655:32;36690:21;:19;:21::i;:::-;36655:56;;36722:20;36745:182;36779:137;36806:24;36849;36892:9;36779:8;:137::i;:::-;36745:19;:182::i;:::-;36722:205;;36938:28;36969;36991:5;36969:17;36983:2;36969:9;:13;;:17;;;;:::i;:::-;:21;;:28;;;;:::i;:::-;36938:59;;37048:15;37032:12;:31;;37010:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37180:45;37204:20;37180:19;;:23;;:45;;;;:::i;:::-;37158:19;:67;;;;37263:89;37321:20;37263:39;37292:9;37263:24;:28;;:39;;;;:::i;:::-;:43;;:89;;;;:::i;:::-;37236:116;;37390:42;37419:12;37390:24;:28;;:42;;;;:::i;:::-;37363:69;;37465:9;37443:18;;:31;;;;;;;;;;;37502:10;37492:46;;;37514:9;37525:12;37492:46;;;;;;;;;;;;;;;;;;;;;;;;37573:12;;;;;;;;;;;:21;;;37603:10;37616:12;37573:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37573:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37573:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37573:56:0;;;;;;;;;;;;;;;;37551:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37725:21;:19;:21::i;:::-;37697:24;:49;37690:57;;;;37793:21;:19;:21::i;:::-;37765:24;:49;37758:57;;;;37855:1;37833:19;;:23;37826:31;;;;37899:1;37875:21;:19;:21::i;:::-;:25;37868:33;;;;37943:1;37919:21;:19;:21::i;:::-;:25;37912:33;;;;37987:1;37963:21;:19;:21::i;:::-;:25;37956:33;;;;26500:1;;;;22018:4;22004:11;;:18;;;;;;;;;;;;;;;;;;36212:1785;;:::o;11939:134::-;12011:7;12038:11;:18;12050:5;12038:18;;;;;;;;;;;;;;;:27;12057:7;12038:27;;;;;;;;;;;;;;;;12031:34;;11939:134;;;;:::o;32291:3654::-;21699:11;;;;;;;;;;;21691:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21838:5;21824:11;;:19;;;;;;;;;;;;;;;;;;26426:8;;;;;;;;;;;26418:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32523:15;32511:8;:27;;32489:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32628:1;32618:7;:11;32610:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32722:30;32740:10;32722:9;:30::i;:::-;32711:7;:41;;32689:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32844:32;32879:21;:19;:21::i;:::-;32844:56;;32911:30;32944:19;:17;:19::i;:::-;32911:52;;32974:32;33009:21;:19;:21::i;:::-;32974:56;;33041:32;33076:21;:19;:21::i;:::-;33041:56;;33108:17;33128:137;33257:7;33128:110;33162:65;33204:22;33162:37;33174:24;33162:7;:11;;:37;;;;:::i;:::-;:41;;:65;;;;:::i;:::-;33128:19;:110::i;:::-;:128;;:137;;;;:::i;:::-;33108:157;;33276:51;;:::i;:::-;33372:105;33406:60;33443:22;33406:32;33418:19;;33406:7;:11;;:32;;;;:::i;:::-;:36;;:60;;;;:::i;:::-;33372:19;:105::i;:::-;33338:16;:31;;:139;;;;;33522:110;33556:65;33598:22;33556:37;33568:24;33556:7;:11;;:37;;;;:::i;:::-;:41;;:65;;;;:::i;:::-;33522:19;:110::i;:::-;33488:16;:31;;:144;;;;;33677:110;33711:65;33753:22;33711:37;33723:24;33711:7;:11;;:37;;;;:::i;:::-;:41;;:65;;;;:::i;:::-;33677:19;:110::i;:::-;33643:16;:31;;:144;;;;;33926:15;33822:100;33876:16;:31;;;33822:16;:31;;;:35;;:100;;;;:::i;:::-;:119;;33800:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34091:15;34056:16;:31;;;:50;;34034:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34223:80;34261:16;:31;;;34223:19;;:23;;:80;;;;:::i;:::-;34201:19;:102;;;;34341:85;34384:16;:31;;;34341:24;:28;;:85;;;;:::i;:::-;34314:112;;34464:85;34507:16;:31;;;34464:24;:28;;:85;;;;:::i;:::-;34437:112;;34587:76;34643:9;34587:37;34616:7;34587:24;:28;;:37;;;;:::i;:::-;:41;;:76;;;;:::i;:::-;34560:103;;34696:16;:31;;;34674:18;;:53;;;;;;;;;;;34760:16;:31;;;34738:18;;:53;;;;;;;;;;;34838:10;34809:233;;;34863:7;34885:100;34939:16;:31;;;34885:16;:31;;;:35;;:100;;;;:::i;:::-;35000:16;:31;;;34809:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35055:54;35073:10;35094:4;35101:7;35055:9;:54::i;:::-;35120:31;35134:4;35141:9;35120:5;:31::i;:::-;35184:12;;;;;;;;;;;:21;;;35206:10;35218:16;:31;;;35184:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35184:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35184:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35184:66:0;;;;;;;;;;;;;;;;35162:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35309:114;35344:68;35380:16;:31;;;35344:16;:31;;;:35;;:68;;;;:::i;:::-;35309:10;:20;;;;:114;;;;:::i;:::-;35527:21;35457:49;35481:24;35457:19;;:23;;:49;;;;:::i;:::-;:91;35436:123;;;;35605:21;:19;:21::i;:::-;35577:24;:49;35570:57;;;;35673:21;:19;:21::i;:::-;35645:24;:49;35638:57;;;;35741:21;:19;:21::i;:::-;35713:24;:49;35706:57;;;;35803:1;35781:19;;:23;35774:31;;;;35847:1;35823:21;:19;:21::i;:::-;:25;35816:33;;;;35891:1;35867:21;:19;:21::i;:::-;:25;35860:33;;;;35935:1;35911:21;:19;:21::i;:::-;:25;35904:33;;;;26500:1;;;;;;22018:4;22004:11;;:18;;;;;;;;;;;;;;;;;;32291:3654;;;;:::o;25642:33::-;;;;:::o;43301:226::-;43403:7;43428:22;43453:34;43482:4;43453:24;43473:3;43453:15;:19;;:24;;;;:::i;:::-;:28;;:34;;;;:::i;:::-;43428:59;;43505:14;43498:21;;;43301:226;;;:::o;879:98::-;924:15;959:10;952:17;;879:98;:::o;17201:338::-;17312:1;17295:19;;:5;:19;;;;17287:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17393:1;17374:21;;:7;:21;;;;17366:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17477:6;17447:11;:18;17459:5;17447:18;;;;;;;;;;;;;;;:27;17466:7;17447:27;;;;;;;;;;;;;;;:36;;;;17515:7;17499:32;;17508:5;17499:32;;;17524:6;17499:32;;;;;;;;;;;;;;;;;;17201:338;;;:::o;5052:181::-;5110:7;5130:9;5146:1;5142;:5;5130:17;;5171:1;5166;:6;;5158:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5224:1;5217:8;;;5052:181;;;;:::o;6424:471::-;6482:7;6732:1;6727;:6;6723:47;;;6757:1;6750:8;;;;6723:47;6782:9;6798:1;6794;:5;6782:17;;6827:1;6822;6818;:5;;;;;;:10;6810:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6886:1;6879:8;;;6424:471;;;;;:::o;7363:132::-;7421:7;7448:39;7452:1;7455;7448:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7441:46;;7363:132;;;;:::o;5508:136::-;5566:7;5593:43;5597:1;5600;5593:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5586:50;;5508:136;;;;:::o;15021:471::-;15137:1;15119:20;;:6;:20;;;;15111:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15221:1;15200:23;;:9;:23;;;;15192:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15296;15318:6;15296:71;;;;;;;;;;;;;;;;;:9;:17;15306:6;15296:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;15276:9;:17;15286:6;15276:17;;;;;;;;;;;;;;;:91;;;;15401:32;15426:6;15401:9;:20;15411:9;15401:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;15378:9;:20;15388:9;15378:20;;;;;;;;;;;;;;;:55;;;;15466:9;15449:35;;15458:6;15449:35;;;15477:6;15449:35;;;;;;;;;;;;;;;;;;15021:471;;;:::o;5981:192::-;6067:7;6100:1;6095;:6;;6103:12;6087:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6087:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6127:9;6143:1;6139;:5;6127:17;;6164:1;6157:8;;;5981:192;;;;;:::o;15773:308::-;15868:1;15849:21;;:7;:21;;;;15841:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15934:24;15951:6;15934:12;;:16;;:24;;;;:::i;:::-;15919:12;:39;;;;15990:30;16013:6;15990:9;:18;16000:7;15990:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;15969:9;:18;15979:7;15969:18;;;;;;;;;;;;;;;:51;;;;16057:7;16036:37;;16053:1;16036:37;;;16066:6;16036:37;;;;;;;;;;;;;;;;;;15773:308;;:::o;24760:371::-;24875:6;24850:21;:31;;24842:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24984:12;25002:9;:14;;25023:6;25002:32;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;24983:51:0;;;25053:7;25045:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24760:371;;;:::o;16413:348::-;16508:1;16489:21;;:7;:21;;;;16481:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16582:68;16605:6;16582:68;;;;;;;;;;;;;;;;;:9;:18;16592:7;16582:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;16561:9;:18;16571:7;16561:18;;;;;;;;;;;;;;;:89;;;;16676:24;16693:6;16676:12;;:16;;:24;;;;:::i;:::-;16661:12;:39;;;;16742:1;16716:37;;16725:7;16716:37;;;16746:6;16716:37;;;;;;;;;;;;;;;;;;16413:348;;:::o;8025:345::-;8111:7;8210:1;8206;:5;8213:12;8198:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8198:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8237:9;8253:1;8249;:5;;;;;;8237:17;;8361:1;8354:8;;;8025:345;;;;;:::o;25249:19223::-;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://be7d5ab3d0c603e514f1a656cffc38c0a058a6cb7c4368ffcf1e3cfaa14cb202
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.