ERC-20
Overview
Max Total Supply
8.752077235901221228 eleWETH
Holders
36
Total Transfers
-
Market
Price
$0.00 @ 0.000000 MATIC
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
BankEth
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-07-28 */ // SPDX-License-Identifier: NONE // Eleven.finance bigfoot platform // Telegram: @ElevenFinance pragma solidity 0.5.17; // Part: BankConfig interface BankConfig { /// @dev Return minimum weth debt size per position. function minDebtSize() external view returns (uint); /// @dev Return the interest rate per second, using 1e18 as denom. function getInterestRate(uint debt, uint floating) external view returns (uint); /// @dev Return the bps rate for reserve pool. function getReservePoolBps() external view returns (uint); /// @dev Return the bps rate for Avada Kill caster. function getKillBps() external view returns (uint); /// @dev Return whether the given address is a bigfoot. function isBigfoot(address bigfoot) external view returns (bool); /// @dev Return whether the given bigfoot accepts more debt. Revert on non-bigfoot. function acceptDebt(address bigfoot) external view returns (bool); /// @dev Return the work factor for the bigfoot + weth debt, using 1e4 as denom. Revert on non-bigfoot. function workFactor(address bigfoot, uint debt) external view returns (uint); /// @dev Return the kill factor for the bigfoot + weth debt, using 1e4 as denom. Revert on non-bigfoot. function killFactor(address bigfoot, uint debt) external view returns (uint); } // Part: ERC20Interface interface ERC20Interface { function balanceOf(address user) external view returns (uint); } // Part: Bigfoot interface Bigfoot { /// @dev Work on a (potentially new) position. Optionally send weth back to Bank. function work( uint id, address user, uint debt, bytes calldata data ) external; /// @dev Return the amount of weth wei to get back if we are to liquidate the position. function health(uint id) external view returns (uint); /// @dev Liquidate the given position to weth. Send all weth back to Bank. function liquidate(uint id) external; } // Part: Initializable /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require( _initializing || _isConstructor() || !_initialized, 'Initializable: contract is already initialized' ); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint cs; // solhint-disable-next-line no-inline-assembly assembly { cs := extcodesize(self) } return cs == 0; } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @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. * * > 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); } // Part: OpenZeppelin/[email protected]/Math /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // Part: OpenZeppelin/[email protected]/SafeMath /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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-solidity/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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); 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) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // Part: Governable contract Governable is Initializable { address public governor; // The current governor. address public pendingGovernor; // The address pending to become the governor once accepted. modifier onlyGov() { require(msg.sender == governor, 'not the governor'); _; } /// @dev Initialize the bank smart contract, using msg.sender as the first governor. function __Governable__init() internal initializer { governor = msg.sender; pendingGovernor = address(0); } /// @dev Set the pending governor, which will be the governor once accepted. /// @param _pendingGovernor The address to become the pending governor. function setPendingGovernor(address _pendingGovernor) external onlyGov { pendingGovernor = _pendingGovernor; } /// @dev Accept to become the new governor. Must be called by the pending governor. function acceptGovernor() external { require(msg.sender == pendingGovernor, 'not the pending governor'); pendingGovernor = address(0); governor = msg.sender; } } // Part: OpenZeppelin/[email protected]/ERC20 /** * @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`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * 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 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(msg.sender, 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 value) public returns (bool) { _approve(msg.sender, spender, value); 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 `value`. * - 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, msg.sender, _allowances[sender][msg.sender].sub(amount)); 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(msg.sender, spender, _allowances[msg.sender][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(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); 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); _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 Destoys `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 value) internal { require(account != address(0), "ERC20: burn from the zero address"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @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 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Destoys `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, msg.sender, _allowances[account][msg.sender].sub(amount)); } } // Part: ReentrancyGuardUpgradeSafe /** * @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. */ contract ReentrancyGuardUpgradeSafe is Initializable { // counter to allow mutex lock with only one SSTORE operation uint private _guardCounter; function __ReentrancyGuardUpgradeSafe__init() internal initializer { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @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() { _guardCounter += 1; uint localCounter = _guardCounter; _; require(localCounter == _guardCounter, 'ReentrancyGuard: reentrant call'); } uint[50] private ______gap; } // Part: SafeToken library SafeToken { function myBalance(address token) internal view returns (uint) { return ERC20Interface(token).balanceOf(address(this)); } function balanceOf(address token, address user) internal view returns (uint) { return ERC20Interface(token).balanceOf(user); } function safeApprove( address token, address to, uint value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!safeApprove'); } function safeTransfer( address token, address to, uint value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!safeTransfer'); } function safeTransferFrom( address token, address from, address to, uint value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!safeTransferFrom'); } function safeTransferBNB(address to, uint value) internal { (bool success, ) = to.call.value(value)(new bytes(0)); require(success, '!safeTransferBNB'); } } interface IElevenVault{ function depositAll() external; function withdraw(uint amount) external; function withdrawAll() external; function getPricePerFullShare() external view returns(uint); } interface CurvePool{ function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns(uint256); } contract BankEth is Initializable, ERC20, ReentrancyGuardUpgradeSafe, Governable { /// @notice Libraries using SafeToken for address; using SafeMath for uint; /// @notice Events event AddDebt(uint indexed id, uint debtShare); event RemoveDebt(uint indexed id, uint debtShare); event Work(uint indexed id, uint loan); event Kill(uint indexed id, address indexed killer, uint prize, uint left); // @notice Graveyard struct Death{ uint height; uint id; uint debt; uint size; uint returned; } mapping(address=>Death[]) public graveyard; address constant public weth = address(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619); address constant public vault = address(0xe7e36EdDe5B93C2D041861D0c246740eBE8DE4B6); string public name; string public symbol; uint8 public decimals; struct Position { address bigfoot; address owner; uint debtShare; } BankConfig public config; mapping(uint => Position) public positions; uint public nextPositionID; uint public glbDebtShare; uint public glbDebtVal; uint public lastAccrueTime; uint public reservePool; /// @dev Require that the caller must be an EOA account to avoid flash loans. modifier onlyEOA() { require(msg.sender == tx.origin, 'not eoa'); _; } /// @dev Add more debt to the global debt pool. modifier accrue(uint msgValue) { if (now > lastAccrueTime) { uint interest = pendingInterest(msgValue); uint toReserve = interest.mul(config.getReservePoolBps()).div(10000); reservePool = reservePool.add(toReserve); glbDebtVal = glbDebtVal.add(interest); lastAccrueTime = now; } _; } function initialize(BankConfig _config) external initializer { __Governable__init(); __ReentrancyGuardUpgradeSafe__init(); config = _config; lastAccrueTime = now; nextPositionID = 1; name = 'eleven interest bearing WETH'; symbol = 'eleWETH'; decimals = 18; approve(); } // @dev approve tokens to be spent by contracts function approve() internal{ weth.safeApprove(vault, uint(-1)); } // @dev deposit unutilized funds to vault function depositToVault() internal{ IElevenVault(vault).depositAll(); } // @dev just in case dev forgot something or has to recover something function additionalApprove(address _token, address _spender) onlyGov external{ require(_token != weth && _token != vault, "no rugs allowed"); _token.safeApprove(_spender, uint(-1)); } // @dev WETH in vault function insideVaultBankCurrency() public view returns(uint){ uint bal = vault.myBalance(); uint pps = IElevenVault(vault).getPricePerFullShare(); return bal.mul(pps).div(1e18); } // @dev getpricepershare, used in front function getPricePerFullShare() public view returns(uint){ return uint(1 ether).mul(totalBankCurrency()).div(totalSupply()); } // @dev withdraws from vault with no errors function safeWithdrawFromFarm(uint _amount) internal{ if(_amount < insideVaultBankCurrency()) IElevenVault(vault).withdraw(_amount.mul(1e18).div(IElevenVault(vault).getPricePerFullShare().add(1))); else IElevenVault(vault).withdrawAll(); } // @dev transfer from weth and/or 11unusedweth with no errors function safeTransferBankCurrency(address _receiver, uint _amount) internal{ uint inside = weth.myBalance(); if(inside>=_amount) weth.safeTransfer(_receiver, _amount); else { safeWithdrawFromFarm(_amount.sub(inside)); weth.safeTransfer(_receiver, weth.myBalance()); } } // @dev Total weth inside the contract wether on the vault or not function wethBalance() public view returns (uint) { return weth.myBalance().add(insideVaultBankCurrency()); } /// @dev Return the pending interest that will be accrued in the next call. /// @param msgValue Balance value to subtract off pool3Balance() when called from payable functions. function pendingInterest(uint msgValue) public view returns (uint) { if (now > lastAccrueTime) { uint timePast = now.sub(lastAccrueTime); uint balance = wethBalance().sub(msgValue); uint ratePerSec = config.getInterestRate(glbDebtVal, balance); return ratePerSec.mul(glbDebtVal).mul(timePast).div(1e18); } else { return 0; } } /// @dev Return the weth debt value given the debt share. Be careful of unaccrued interests. /// @param debtShare The debt share to be converted. function debtShareToVal(uint debtShare) public view returns (uint) { if (glbDebtShare == 0) return debtShare; // When there's no share, 1 share = 1 val. return debtShare.mul(glbDebtVal).div(glbDebtShare); } /// @dev Return the debt share for the given debt value. Be careful of unaccrued interests. /// @param debtVal The debt value to be converted. function debtValToShare(uint debtVal) public view returns (uint) { if (glbDebtShare == 0) return debtVal; // When there's no share, 1 share = 1 val. return debtVal.mul(glbDebtShare).div(glbDebtVal).add(1); } /// @dev Return weth value and debt of the given position. Be careful of unaccrued interests. /// @param id The position ID to query. function positionInfo(uint id) public view returns (uint, uint) { Position storage pos = positions[id]; return (Bigfoot(pos.bigfoot).health(id), debtShareToVal(pos.debtShare)); } /// @dev Return the total weth entitled to the token holders. Be careful of unaccrued interests. function totalBankCurrency() public view returns (uint) { return wethBalance().add(glbDebtVal).sub(reservePool); } /// @dev Add more weth to the bank. Hope to get some good returns. function deposit(uint[] calldata amounts) external accrue(0) nonReentrant { uint total = totalBankCurrency(); uint diff = transferWeth(amounts); uint share = total == 0 ? diff : diff.mul(totalSupply()).div(total); _mint(msg.sender, share); require(totalSupply() >= 1e15, 'deposit: total supply too low'); depositToVault(); } /// @dev Withdraw weth from the bank by burning the share tokens. function withdraw(uint share, uint8) external accrue(0) nonReentrant { uint amount = share.mul(totalBankCurrency()).div(totalSupply()); require(amount <= wethBalance(), "Utilization too high, withdraw an smaller amount"); _burn(msg.sender, share); safeTransferBankCurrency(msg.sender, amount); uint supply = totalSupply(); require(supply == 0 || supply >= 1e15, 'withdraw: total supply too low'); } // @dev Don't do this unless you know what you're doing function emergencyWithdraw() external{ uint share = balanceOf(msg.sender); uint amount = share.mul(totalBankCurrency()).div(totalSupply()); _burn(msg.sender, share); safeTransferBankCurrency(msg.sender, amount); } // @dev Deposit dollars, convert to weth and stake in vault function transferWeth(uint[] memory amounts) internal returns(uint){ uint bfrweth = weth.myBalance(); if(amounts[0]>0) weth.safeTransferFrom(msg.sender, address(this), amounts[0]); uint aftrweth = weth.myBalance(); return (aftrweth.sub(bfrweth)); } /// @dev Create a new farming position to unlock your yield farming potential. /// @param id The ID of the position to unlock the earning. Use ZERO for new position. /// @param bigfoot The address of the authorized bigfoot to work for this position. /// @param loan The amount of weth to borrow from the pool. /// @param maxReturn The max amount of weth to return to the pool. /// @param data The calldata to pass along to the bigfoot for more working context. function work( uint id, address bigfoot, uint loan, uint maxReturn, uint[] calldata amounts, bytes calldata data ) external onlyEOA nonReentrant accrue(0){ // 1. Sanity check the input position, or add a new position of ID is 0. if (id == 0) { id = nextPositionID++; positions[id].bigfoot = bigfoot; positions[id].owner = msg.sender; } else { require(id < nextPositionID, 'bad position id'); require(positions[id].bigfoot == bigfoot, 'bad position bigfoot'); require(positions[id].owner == msg.sender, 'not position owner'); } emit Work(id, loan); // 2. Make sure the bigfoot can accept more debt and remove the existing debt. require(config.isBigfoot(bigfoot), 'not a bigfoot'); require(loan == 0 || config.acceptDebt(bigfoot), 'bigfoot not accept more debt'); uint debt = _removeDebt(id).add(loan); // 3. Perform the actual work, using a new scope to avoid stack-too-deep errors. uint back; { uint sendWeth = transferWeth(amounts).add(loan); require(sendWeth <= wethBalance(), 'insufficient WETH in the bank'); uint beforeWeth = wethBalance().sub(sendWeth); safeTransferBankCurrency(bigfoot, sendWeth); Bigfoot(bigfoot).work(id, msg.sender, debt, data); back = wethBalance().sub(beforeWeth); } // 4. Check and update position debt. uint lessDebt = Math.min(debt, Math.min(back, maxReturn)); debt = debt.sub(lessDebt); if (debt > 0) { require(debt >= config.minDebtSize(), 'too small debt size'); uint health = Bigfoot(bigfoot).health(id); uint workFactor = config.workFactor(bigfoot, debt); require(health.mul(workFactor) >= debt.mul(10000), 'bad work factor'); _addDebt(id, debt); } // 5. Return excess weth back. if (back > lessDebt) safeTransferBankCurrency(msg.sender, back - lessDebt); // 6. Deposit back unused to vault depositToVault(); // 7. Check total debt share/value not too small require(glbDebtShare >= 1e15, 'remaining global debt share too small'); require(glbDebtVal >= 1e15, 'remaining global debt value too small'); } /// @dev Kill the given to the position. Liquidate it immediately if killFactor condition is met. /// @param id The position ID to be killed. function kill(uint id) external onlyEOA accrue(0) nonReentrant { // 1. Verify that the position is eligible for liquidation. Position storage pos = positions[id]; require(pos.debtShare > 0, 'no debt'); uint debt = _removeDebt(id); uint health = Bigfoot(pos.bigfoot).health(id); uint killFactor = config.killFactor(pos.bigfoot, debt); require(health.mul(killFactor) < debt.mul(10000), "can't liquidate"); // 2. Perform liquidation and compute the amount of weth received. uint beforeWeth = wethBalance(); Bigfoot(pos.bigfoot).liquidate(id); uint back = wethBalance().sub(beforeWeth); uint prize = back.mul(config.getKillBps()).div(10000); uint rest = back.sub(prize); // 3. Clear position debt and return funds to liquidator and position owner. if (prize > 0) safeTransferBankCurrency(msg.sender, prize); uint left = rest > debt ? rest - debt : 0; if (left > 0) safeTransferBankCurrency(pos.owner, left); // 4. Deposit remaining to vault depositToVault(); emit Kill(id, msg.sender, prize, left); graveyard[pos.owner].push(Death(block.number, id, debt, health, left)); } /// @dev Internal function to add the given debt value to the given position. function _addDebt(uint id, uint debtVal) internal { Position storage pos = positions[id]; uint debtShare = debtValToShare(debtVal); pos.debtShare = pos.debtShare.add(debtShare); glbDebtShare = glbDebtShare.add(debtShare); glbDebtVal = glbDebtVal.add(debtVal); emit AddDebt(id, debtShare); } /// @dev Internal function to clear the debt of the given position. Return the debt value. function _removeDebt(uint id) internal returns (uint) { Position storage pos = positions[id]; uint debtShare = pos.debtShare; if (debtShare > 0) { uint debtVal = debtShareToVal(debtShare); pos.debtShare = 0; glbDebtShare = glbDebtShare.sub(debtShare); glbDebtVal = glbDebtVal.sub(debtVal); emit RemoveDebt(id, debtShare); return debtVal; } else { return 0; } } /// @dev Update bank configuration to a new address. Must only be called by owner. /// @param _config The new configurator address. function updateConfig(BankConfig _config) external onlyGov { config = _config; } /// @dev Withdraw weth reserve for underwater positions to the given address. /// @param to The address to transfer weth to. /// @param value The number of weth tokens to withdraw. Must not exceed `reservePool`. function withdrawReserve(address to, uint value) external onlyGov nonReentrant { reservePool = reservePool.sub(value); require(value<=wethBalance(), "not enough funds"); safeTransferBankCurrency(to, value); } /// @dev Reduce weth reserve, effectively giving them to the depositors. /// @param value The number of weth reserve to reduce. function reduceReserve(uint value) external onlyGov { reservePool = reservePool.sub(value); } /// @dev Recover ERC20 tokens that were accidentally sent to this smart contract. /// @param token The token contract. Can be anything. This contract should not hold ERC20 tokens. /// @param to The address to send the tokens to. /// @param value The number of tokens to transfer to `to`. function recover( address token, address to, uint value ) external onlyGov nonReentrant { token.safeTransfer(to, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtShare","type":"uint256"}],"name":"AddDebt","type":"event"},{"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":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"killer","type":"address"},{"indexed":false,"internalType":"uint256","name":"prize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"left","type":"uint256"}],"name":"Kill","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtShare","type":"uint256"}],"name":"RemoveDebt","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loan","type":"uint256"}],"name":"Work","type":"event"},{"constant":false,"inputs":[],"name":"acceptGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"additionalApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"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":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":true,"inputs":[],"name":"config","outputs":[{"internalType":"contract BankConfig","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"debtShare","type":"uint256"}],"name":"debtShareToVal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"debtVal","type":"uint256"}],"name":"debtValToShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":false,"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"glbDebtShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"glbDebtVal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"graveyard","outputs":[{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"returned","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":[{"internalType":"contract BankConfig","name":"_config","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"insideVaultBankCurrency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastAccrueTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextPositionID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"pendingInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"positionInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"positions","outputs":[{"internalType":"address","name":"bigfoot","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"debtShare","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"recover","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"reduceReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reservePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pendingGovernor","type":"address"}],"name":"setPendingGovernor","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":"totalBankCurrency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"constant":false,"inputs":[{"internalType":"contract BankConfig","name":"_config","type":"address"}],"name":"updateConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wethBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"share","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"bigfoot","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"maxReturn","type":"uint256"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"work","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613b3c806100206000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c806370a0823111610151578063c4d66de8116100c3578063e3056a3411610087578063e3056a341461088a578063e58bb63914610892578063ea7d530f1461089a578063f235757f146108b7578063f60290e4146108dd578063fbfa77cf146108fa57610274565b8063c4d66de81461072e578063c6f7a6eb14610754578063d29a002514610837578063db2e21bc14610854578063dd62ed3e1461085c57610274565b806395d89b411161011557806395d89b411461067757806399fbab881461067f5780639ffe7973146106c6578063a457c2d7146106ce578063a6cb8f7d146106fa578063a9059cbb1461070257610274565b806370a08231146105e557806377c7b8fc1461060b57806379502c551461061357806389097a6a1461061b578063903d42961461065157610274565b806329a1f362116101ea57806339509351116101ae57806339509351146104f65780633fc8cef314610522578063598b8e711461052a5780636b6216ad1461059a5780636b735cca146105b75780636cc919c8146105bf57610274565b806329a1f3621461047d5780632da7271b146104ab5780632f6b8143146104b35780632fc11c0f146104bb578063313ce567146104d857610274565b806315b994871161023c57806315b994871461037c57806318160ddd146103d35780631c58ce14146103db5780631c824905146104095780631ec82cb81461041157806323b872dd1461044757610274565b80630266f0441461027957806306fdde0314610293578063095ea7b3146103105780630c340a24146103505780630f82519914610374575b600080fd5b610281610902565b60408051918252519081900360200190f35b61029b610908565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d55781810151838201526020016102bd565b50505050905090810190601f1680156103025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033c6004803603604081101561032657600080fd5b506001600160a01b038135169060200135610996565b604080519115158252519081900360200190f35b6103586109ad565b604080516001600160a01b039092168252519081900360200190f35b6102816109bc565b6103a86004803603604081101561039257600080fd5b506001600160a01b0381351690602001356109c2565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b610281610a0d565b610407600480360360408110156103f157600080fd5b506001600160a01b038135169060200135610a14565b005b610281610b29565b6104076004803603606081101561042757600080fd5b506001600160a01b03813581169160208101359091169060400135610b2f565b61033c6004803603606081101561045d57600080fd5b506001600160a01b03813581169160208101359091169060400135610bf0565b6104076004803603604081101561049357600080fd5b506001600160a01b0381358116916020013516610c47565b610281610d46565b610281610e14565b610281600480360360208110156104d157600080fd5b5035610e4f565b6104e0610f6b565b6040805160ff9092168252519081900360200190f35b61033c6004803603604081101561050c57600080fd5b506001600160a01b038135169060200135610f74565b610358610fb0565b6104076004803603602081101561054057600080fd5b81019060208101813564010000000081111561055b57600080fd5b82018360208201111561056d57600080fd5b8035906020019184602083028401116401000000008311171561058f57600080fd5b509092509050610fc8565b610407600480360360208110156105b057600080fd5b50356111e9565b610281611254565b610407600480360360208110156105d557600080fd5b50356001600160a01b031661126a565b610281600480360360208110156105fb57600080fd5b50356001600160a01b03166112e4565b6102816112ff565b61035861132c565b6106386004803603602081101561063157600080fd5b5035611340565b6040805192835260208301919091528051918290030190f35b6104076004803603604081101561066757600080fd5b508035906020013560ff166113dd565b61029b6115c8565b61069c6004803603602081101561069557600080fd5b5035611623565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b610281611651565b61033c600480360360408110156106e457600080fd5b506001600160a01b038135169060200135611657565b610281611693565b61033c6004803603604081101561071857600080fd5b506001600160a01b038135169060200135611699565b6104076004803603602081101561074457600080fd5b50356001600160a01b03166116a6565b610407600480360360c081101561076a57600080fd5b8135916001600160a01b036020820135169160408201359160608101359181019060a0810160808201356401000000008111156107a657600080fd5b8201836020820111156107b857600080fd5b803590602001918460208302840111640100000000831117156107da57600080fd5b9193909290916020810190356401000000008111156107f857600080fd5b82018360208201111561080a57600080fd5b8035906020019184600183028401116401000000008311171561082c57600080fd5b50909250905061180a565b6104076004803603602081101561084d57600080fd5b5035612141565b610407612689565b6102816004803603604081101561087257600080fd5b506001600160a01b03813581169160200135166126c4565b6103586126ef565b6104076126fe565b610281600480360360208110156108b057600080fd5b503561277d565b610407600480360360208110156108cd57600080fd5b50356001600160a01b03166127ac565b610281600480360360208110156108f357600080fd5b5035612820565b610358612854565b60425481565b603a805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561098e5780601f106109635761010080835404028352916020019161098e565b820191906000526020600020905b81548152906001019060200180831161097157829003601f168201915b505050505081565b60006109a333848461286c565b5060015b92915050565b6037546001600160a01b031681565b603f5481565b603960205281600052604060002081815481106109db57fe5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b6003545b90565b6037546001600160a01b03163314610a66576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055604254610a84908363ffffffff61295816565b604255610a8f610e14565b821115610ad6576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b610ae083836129b5565b6004548114610b24576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b505050565b603e5481565b6037546001600160a01b03163314610b81576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055610ba66001600160a01b038516848463ffffffff612a6216565b6004548114610bea576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b50505050565b6000610bfd848484612bbc565b6001600160a01b038416600090815260026020908152604080832033808552925290912054610c3d918691610c38908663ffffffff61295816565b61286c565b5060019392505050565b6037546001600160a01b03163314610c99576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6001600160a01b038216737ceb23fd6bc0add59e62ac25578270cff1b9f61914801590610ce357506001600160a01b03821673e7e36edde5b93c2d041861d0c246740ebe8de4b614155b610d26576040805162461bcd60e51b815260206004820152600f60248201526e1b9bc81c9d59dcc8185b1b1bddd959608a1b604482015290519081900360640190fd5b610d426001600160a01b0383168260001963ffffffff612d0016565b5050565b600080610d6673e7e36edde5b93c2d041861d0c246740ebe8de4b6612e52565b9050600073e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db757600080fd5b505afa158015610dcb573d6000803e3d6000fd5b505050506040513d6020811015610de157600080fd5b50519050610e0d670de0b6b3a7640000610e01848463ffffffff612ece16565b9063ffffffff612f2e16565b9250505090565b6000610e4a610e21610d46565b610e3e737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b9063ffffffff612f9816565b905090565b6000604154421115610f62576000610e726041544261295890919063ffffffff16565b90506000610e8e84610e82610e14565b9063ffffffff61295816565b90506000603c60019054906101000a90046001600160a01b03166001600160a01b031663c6dfa13f604054846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610ef557600080fd5b505afa158015610f09573d6000803e3d6000fd5b505050506040513d6020811015610f1f57600080fd5b5051604054909150610f5890670de0b6b3a764000090610e01908690610f4c90869063ffffffff612ece16565b9063ffffffff612ece16565b9350505050610f66565b5060005b919050565b603c5460ff1681565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109a3918590610c38908663ffffffff612f9816565b737ceb23fd6bc0add59e62ac25578270cff1b9f61981565b60006041544211156110a9576000610fdf82610e4f565b90506000611073612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b505afa15801561104e573d6000803e3d6000fd5b505050506040513d602081101561106457600080fd5b5051859063ffffffff612ece16565b604254909150611089908263ffffffff612f9816565b60425560405461109f908363ffffffff612f9816565b6040555050426041555b600480546001019081905560006110be611254565b905060006110fe868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ff292505050565b9050600082156111295761112483610e01611117610a0d565b859063ffffffff612ece16565b61112b565b815b905061113733826130b2565b66038d7ea4c68000611147610a0d565b101561119a576040805162461bcd60e51b815260206004820152601d60248201527f6465706f7369743a20746f74616c20737570706c7920746f6f206c6f77000000604482015290519081900360640190fd5b6111a26131a4565b5050506004548114610bea576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b6037546001600160a01b0316331461123b576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b60425461124e908263ffffffff61295816565b60425550565b6000610e4a604254610e82604054610e3e610e14565b6037546001600160a01b031633146112bc576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b031660009081526001602052604090205490565b6000610e4a61130c610a0d565b610e01611317611254565b670de0b6b3a76400009063ffffffff612ece16565b603c5461010090046001600160a01b031681565b6000818152603d60209081526040808320805482516303c1db6b60e51b8152600481018790529251859492936001600160a01b039092169263783b6d609260248082019391829003018186803b15801561139957600080fd5b505afa1580156113ad573d6000803e3d6000fd5b505050506040513d60208110156113c357600080fd5b505160028201546113d39061277d565b9250925050915091565b60006041544211156114855760006113f482610e4f565b9050600061144f612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b604254909150611465908263ffffffff612f9816565b60425560405461147b908363ffffffff612f9816565b6040555050426041555b600480546001019081905560006114b561149d610a0d565b610e016114a8611254565b889063ffffffff612ece16565b90506114bf610e14565b8111156114fd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613ab46030913960400191505060405180910390fd5b6115073386613207565b61151133826129b5565b600061151b610a0d565b9050801580611531575066038d7ea4c680008110155b611582576040805162461bcd60e51b815260206004820152601e60248201527f77697468647261773a20746f74616c20737570706c7920746f6f206c6f770000604482015290519081900360640190fd5b50506004548114610bea576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b603b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561098e5780601f106109635761010080835404028352916020019161098e565b603d602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b60415481565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109a3918590610c38908663ffffffff61295816565b60405481565b60006109a3338484612bbc565b600054610100900460ff16806116bf57506116bf6132e2565b806116cd575060005460ff16155b6117085760405162461bcd60e51b815260040180806020018281038252602e8152602001806139d5602e913960400191505060405180910390fd5b600054610100900460ff16158015611733576000805460ff1961ff0019909116610100171660011790555b61173b6132e8565b6117436133a8565b603c8054610100600160a81b0319166101006001600160a01b03851602179055426041556001603e5560408051808201909152601c8082527f656c6576656e20696e7465726573742062656172696e6720574554480000000060209092019182526117b091603a916138d7565b50604080518082019091526007808252660cad8caae8aa8960cb1b60209092019182526117df91603b916138d7565b50603c805460ff191660121790556117f561344e565b8015610d42576000805461ff00191690555050565b333214611848576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b60048054600101908190556041546000904211156118fc57600061186b82610e4f565b905060006118c6612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b6042549091506118dc908263ffffffff612f9816565b6042556040546118f2908363ffffffff612f9816565b6040555050426041555b8961194957603e805460018082019092556000818152603d6020526040902080546001600160a01b038d166001600160a01b03199182161782559201805490921633179091559950611a59565b603e548a10611991576040805162461bcd60e51b815260206004820152600f60248201526e189859081c1bdcda5d1a5bdb881a59608a1b604482015290519081900360640190fd5b60008a8152603d60205260409020546001600160a01b038a81169116146119f6576040805162461bcd60e51b8152602060048201526014602482015273189859081c1bdcda5d1a5bdb88189a59d99bdbdd60621b604482015290519081900360640190fd5b60008a8152603d60205260409020600101546001600160a01b03163314611a59576040805162461bcd60e51b81526020600482015260126024820152713737ba103837b9b4ba34b7b71037bbb732b960711b604482015290519081900360640190fd5b6040805189815290518b917f73c4ef442856bea52a6b34a83f35484ee65828010254ec27766c5a8c13db6c84919081900360200190a2603c546040805163c530054960e01b81526001600160a01b038c8116600483015291516101009093049091169163c530054991602480820192602092909190829003018186803b158015611ae257600080fd5b505afa158015611af6573d6000803e3d6000fd5b505050506040513d6020811015611b0c57600080fd5b5051611b4f576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081848189a59d99bdbdd609a1b604482015290519081900360640190fd5b871580611bd45750603c546040805161237f60e41b81526001600160a01b038c81166004830152915161010090930490911691620237f091602480820192602092909190829003018186803b158015611ba757600080fd5b505afa158015611bbb573d6000803e3d6000fd5b505050506040513d6020811015611bd157600080fd5b50515b611c25576040805162461bcd60e51b815260206004820152601c60248201527f626967666f6f74206e6f7420616363657074206d6f7265206465627400000000604482015290519081900360640190fd5b6000611c3489610e3e8d61348b565b9050600080611c798b610e3e8b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ff292505050565b9050611c83610e14565b811115611cd7576040805162461bcd60e51b815260206004820152601d60248201527f696e73756666696369656e74205745544820696e207468652062616e6b000000604482015290519081900360640190fd5b6000611ce582610e82610e14565b9050611cf18d836129b5565b8c6001600160a01b03166348db8cc48f33878c8c6040518663ffffffff1660e01b815260040180868152602001856001600160a01b03166001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015611d8d57600080fd5b505af1158015611da1573d6000803e3d6000fd5b50505050611db181610e82610e14565b925050506000611dca83611dc5848d613530565b613530565b9050611ddc838263ffffffff61295816565b9250821561204257603c60019054906101000a90046001600160a01b03166001600160a01b031663e1ed42866040518163ffffffff1660e01b815260040160206040518083038186803b158015611e3257600080fd5b505afa158015611e46573d6000803e3d6000fd5b505050506040513d6020811015611e5c57600080fd5b5051831015611ea8576040805162461bcd60e51b8152602060048201526013602482015272746f6f20736d616c6c20646562742073697a6560681b604482015290519081900360640190fd5b60008c6001600160a01b031663783b6d608f6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611eee57600080fd5b505afa158015611f02573d6000803e3d6000fd5b505050506040513d6020811015611f1857600080fd5b810190808051906020019092919050505090506000603c60019054906101000a90046001600160a01b03166001600160a01b031663ad58e5738f876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d6020811015611fca57600080fd5b50519050611fe08561271063ffffffff612ece16565b611ff0838363ffffffff612ece16565b1015612035576040805162461bcd60e51b815260206004820152600f60248201526e3130b2103bb7b935903330b1ba37b960891b604482015290519081900360640190fd5b61203f8f86613546565b50505b8082111561205657612056338284036129b5565b61205e6131a4565b66038d7ea4c68000603f5410156120a65760405162461bcd60e51b8152600401808060200182810382526025815260200180613a036025913960400191505060405180910390fd5b66038d7ea4c6800060405410156120ee5760405162461bcd60e51b8152600401808060200182810382526025815260200180613a286025913960400191505060405180910390fd5b505050506004548114612136576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b505050505050505050565b33321461217f576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b600060415442111561222757600061219682610e4f565b905060006121f1612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b604254909150612207908263ffffffff612f9816565b60425560405461221d908363ffffffff612f9816565b6040555050426041555b60048054600101908190556000838152603d602052604090206002810154612280576040805162461bcd60e51b81526020600482015260076024820152661b9bc81919589d60ca1b604482015290519081900360640190fd5b600061228b8561348b565b8254604080516303c1db6b60e51b81526004810189905290519293506000926001600160a01b039092169163783b6d6091602480820192602092909190829003018186803b1580156122dc57600080fd5b505afa1580156122f0573d6000803e3d6000fd5b505050506040513d602081101561230657600080fd5b5051603c548454604080516313f6321b60e01b81526001600160a01b039283166004820152602481018790529051939450600093610100909304909116916313f6321b91604480820192602092909190829003018186803b15801561236a57600080fd5b505afa15801561237e573d6000803e3d6000fd5b505050506040513d602081101561239457600080fd5b505190506123aa8361271063ffffffff612ece16565b6123ba838363ffffffff612ece16565b106123fe576040805162461bcd60e51b815260206004820152600f60248201526e63616e2774206c697175696461746560881b604482015290519081900360640190fd5b6000612408610e14565b8554604080516301057c4960e61b8152600481018c905290519293506001600160a01b039091169163415f12409160248082019260009290919082900301818387803b15801561245757600080fd5b505af115801561246b573d6000803e3d6000fd5b50505050600061247d82610e82610e14565b905060006124d8612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166328ae433e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b905060006124ec838363ffffffff61295816565b905081156124fe576124fe33836129b5565b600087821161250e576000612512565b8782035b90508015612532576001890154612532906001600160a01b0316826129b5565b61253a6131a4565b6040805184815260208101839052815133928f927fa150a1ba7e1c4b72a15f8cb872406ce63950404709b67fbfe52b36792f483a39929081900390910190a3603960008a60010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052804381526020018e81526020018a8152602001898152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401555050505050505050505050506004548114610b24576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b6000612694336112e4565b905060006126ae6126a3610a0d565b610e01611117611254565b90506126ba3383613207565b610d4233826129b5565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6038546001600160a01b031681565b6038546001600160a01b0316331461275d576040805162461bcd60e51b815260206004820152601860248201527f6e6f74207468652070656e64696e6720676f7665726e6f720000000000000000604482015290519081900360640190fd5b603880546001600160a01b03199081169091556037805490911633179055565b6000603f5460001415612791575080610f66565b6109a7603f54610e0160405485612ece90919063ffffffff16565b6037546001600160a01b031633146127fe576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603880546001600160a01b0319166001600160a01b0392909216919091179055565b6000603f5460001415612834575080610f66565b6109a76001610e3e604054610e01603f5487612ece90919063ffffffff16565b73e7e36edde5b93c2d041861d0c246740ebe8de4b681565b6001600160a01b0383166128b15760405162461bcd60e51b8152600401808060200182810382526024815260200180613ae46024913960400191505060405180910390fd5b6001600160a01b0382166128f65760405162461bcd60e51b81526004018080602001828103825260228152602001806139b36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000828211156129af576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006129d4737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b9050818110612a0757612a02737ceb23fd6bc0add59e62ac25578270cff1b9f619848463ffffffff612a6216565b610b24565b612a1f612a1a838363ffffffff61295816565b6135e3565b610b2483612a40737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b737ceb23fd6bc0add59e62ac25578270cff1b9f619919063ffffffff612a6216565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612adf5780518252601f199092019160209182019101612ac0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b41576040519150601f19603f3d011682016040523d82523d6000602084013e612b46565b606091505b5091509150818015612b74575080511580612b745750808060200190516020811015612b7157600080fd5b50515b612bb5576040805162461bcd60e51b815260206004820152600d60248201526c10b9b0b332aa3930b739b332b960991b604482015290519081900360640190fd5b5050505050565b6001600160a01b038316612c015760405162461bcd60e51b8152600401808060200182810382526025815260200180613a8f6025913960400191505060405180910390fd5b6001600160a01b038216612c465760405162461bcd60e51b81526004018080602001828103825260238152602001806139706023913960400191505060405180910390fd5b6001600160a01b038316600090815260016020526040902054612c6f908263ffffffff61295816565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612ca4908263ffffffff612f9816565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310612d7d5780518252601f199092019160209182019101612d5e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ddf576040519150601f19603f3d011682016040523d82523d6000602084013e612de4565b606091505b5091509150818015612e12575080511580612e125750808060200190516020811015612e0f57600080fd5b50515b612bb5576040805162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015612e9c57600080fd5b505afa158015612eb0573d6000803e3d6000fd5b505050506040513d6020811015612ec657600080fd5b505192915050565b600082612edd575060006109a7565b82820282848281612eea57fe5b0414612f275760405162461bcd60e51b8152600401808060200182810382526021815260200180613a4d6021913960400191505060405180910390fd5b9392505050565b6000808211612f84576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481612f8f57fe5b04949350505050565b600082820183811015612f27576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613012737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b905060008360008151811061302357fe5b602002602001015111156130795761307933308560008151811061304357fe5b6020026020010151737ceb23fd6bc0add59e62ac25578270cff1b9f6196001600160a01b0316613770909392919063ffffffff16565b6000613098737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b90506130aa818363ffffffff61295816565b949350505050565b6001600160a01b03821661310d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600354613120908263ffffffff612f9816565b6003556001600160a01b03821660009081526001602052604090205461314c908263ffffffff612f9816565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b031663de5f62686040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156131f357600080fd5b505af1158015610bea573d6000803e3d6000fd5b6001600160a01b03821661324c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613a6e6021913960400191505060405180910390fd5b60035461325f908263ffffffff61295816565b6003556001600160a01b03821660009081526001602052604090205461328b908263ffffffff61295816565b6001600160a01b0383166000818152600160209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b303b1590565b600054610100900460ff168061330157506133016132e2565b8061330f575060005460ff16155b61334a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806139d5602e913960400191505060405180910390fd5b600054610100900460ff16158015613375576000805460ff1961ff0019909116610100171660011790555b603780546001600160a01b0319908116331790915560388054909116905580156133a5576000805461ff00191690555b50565b600054610100900460ff16806133c157506133c16132e2565b806133cf575060005460ff16155b61340a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806139d5602e913960400191505060405180910390fd5b600054610100900460ff16158015613435576000805460ff1961ff0019909116610100171660011790555b600160045580156133a5576000805461ff001916905550565b613489737ceb23fd6bc0add59e62ac25578270cff1b9f61973e7e36edde5b93c2d041861d0c246740ebe8de4b660001963ffffffff612d0016565b565b6000818152603d60205260408120600281015480156135255760006134af8261277d565b60006002850155603f549091506134cc908363ffffffff61295816565b603f556040546134e2908263ffffffff61295816565b60409081558051838152905186917fc141cd58846e97354928242dcc7ddd92a6a0ecf03bdb5d3a411d260b9abc3272919081900360200190a29250610f66915050565b600092505050610f66565b600081831061353f5781612f27565b5090919050565b6000828152603d602052604081209061355e83612820565b6002830154909150613576908263ffffffff612f9816565b6002830155603f5461358e908263ffffffff612f9816565b603f556040546135a4908463ffffffff612f9816565b60409081558051828152905185917f43b70d61bab6f8bfcf27c791452876c7da386b19652e19b8f21e8927aa6577ab919081900360200190a250505050565b6135eb610d46565b81101561370d5773e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b0316632e1a7d4d6136ba6136a2600173e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561366a57600080fd5b505afa15801561367e573d6000803e3d6000fd5b505050506040513d602081101561369457600080fd5b50519063ffffffff612f9816565b610e0185670de0b6b3a764000063ffffffff612ece16565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156136f057600080fd5b505af1158015613704573d6000803e3d6000fd5b505050506133a5565b73e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561375c57600080fd5b505af1158015612bb5573d6000803e3d6000fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106137f55780518252601f1990920191602091820191016137d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613857576040519150601f19603f3d011682016040523d82523d6000602084013e61385c565b606091505b509150915081801561388a57508051158061388a575080806020019051602081101561388757600080fd5b50515b6138cf576040805162461bcd60e51b815260206004820152601160248201527021736166655472616e7366657246726f6d60781b604482015290519081900360640190fd5b505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061391857805160ff1916838001178555613945565b82800160010185558215613945579182015b8281111561394557825182559160200191906001019061392a565b50613951929150613955565b5090565b610a1191905b80821115613951576000815560010161395b56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735265656e7472616e637947756172643a207265656e7472616e742063616c6c0045524332303a20617070726f766520746f20746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656472656d61696e696e6720676c6f62616c206465627420736861726520746f6f20736d616c6c72656d61696e696e6720676c6f62616c20646562742076616c756520746f6f20736d616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573735574696c697a6174696f6e20746f6f20686967682c20776974686472617720616e20736d616c6c657220616d6f756e7445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a7231582040aca99730f75dc40a267ef72e96ef7485a4a5784546d57840c3d57715a6888a64736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c806370a0823111610151578063c4d66de8116100c3578063e3056a3411610087578063e3056a341461088a578063e58bb63914610892578063ea7d530f1461089a578063f235757f146108b7578063f60290e4146108dd578063fbfa77cf146108fa57610274565b8063c4d66de81461072e578063c6f7a6eb14610754578063d29a002514610837578063db2e21bc14610854578063dd62ed3e1461085c57610274565b806395d89b411161011557806395d89b411461067757806399fbab881461067f5780639ffe7973146106c6578063a457c2d7146106ce578063a6cb8f7d146106fa578063a9059cbb1461070257610274565b806370a08231146105e557806377c7b8fc1461060b57806379502c551461061357806389097a6a1461061b578063903d42961461065157610274565b806329a1f362116101ea57806339509351116101ae57806339509351146104f65780633fc8cef314610522578063598b8e711461052a5780636b6216ad1461059a5780636b735cca146105b75780636cc919c8146105bf57610274565b806329a1f3621461047d5780632da7271b146104ab5780632f6b8143146104b35780632fc11c0f146104bb578063313ce567146104d857610274565b806315b994871161023c57806315b994871461037c57806318160ddd146103d35780631c58ce14146103db5780631c824905146104095780631ec82cb81461041157806323b872dd1461044757610274565b80630266f0441461027957806306fdde0314610293578063095ea7b3146103105780630c340a24146103505780630f82519914610374575b600080fd5b610281610902565b60408051918252519081900360200190f35b61029b610908565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d55781810151838201526020016102bd565b50505050905090810190601f1680156103025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033c6004803603604081101561032657600080fd5b506001600160a01b038135169060200135610996565b604080519115158252519081900360200190f35b6103586109ad565b604080516001600160a01b039092168252519081900360200190f35b6102816109bc565b6103a86004803603604081101561039257600080fd5b506001600160a01b0381351690602001356109c2565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b610281610a0d565b610407600480360360408110156103f157600080fd5b506001600160a01b038135169060200135610a14565b005b610281610b29565b6104076004803603606081101561042757600080fd5b506001600160a01b03813581169160208101359091169060400135610b2f565b61033c6004803603606081101561045d57600080fd5b506001600160a01b03813581169160208101359091169060400135610bf0565b6104076004803603604081101561049357600080fd5b506001600160a01b0381358116916020013516610c47565b610281610d46565b610281610e14565b610281600480360360208110156104d157600080fd5b5035610e4f565b6104e0610f6b565b6040805160ff9092168252519081900360200190f35b61033c6004803603604081101561050c57600080fd5b506001600160a01b038135169060200135610f74565b610358610fb0565b6104076004803603602081101561054057600080fd5b81019060208101813564010000000081111561055b57600080fd5b82018360208201111561056d57600080fd5b8035906020019184602083028401116401000000008311171561058f57600080fd5b509092509050610fc8565b610407600480360360208110156105b057600080fd5b50356111e9565b610281611254565b610407600480360360208110156105d557600080fd5b50356001600160a01b031661126a565b610281600480360360208110156105fb57600080fd5b50356001600160a01b03166112e4565b6102816112ff565b61035861132c565b6106386004803603602081101561063157600080fd5b5035611340565b6040805192835260208301919091528051918290030190f35b6104076004803603604081101561066757600080fd5b508035906020013560ff166113dd565b61029b6115c8565b61069c6004803603602081101561069557600080fd5b5035611623565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b610281611651565b61033c600480360360408110156106e457600080fd5b506001600160a01b038135169060200135611657565b610281611693565b61033c6004803603604081101561071857600080fd5b506001600160a01b038135169060200135611699565b6104076004803603602081101561074457600080fd5b50356001600160a01b03166116a6565b610407600480360360c081101561076a57600080fd5b8135916001600160a01b036020820135169160408201359160608101359181019060a0810160808201356401000000008111156107a657600080fd5b8201836020820111156107b857600080fd5b803590602001918460208302840111640100000000831117156107da57600080fd5b9193909290916020810190356401000000008111156107f857600080fd5b82018360208201111561080a57600080fd5b8035906020019184600183028401116401000000008311171561082c57600080fd5b50909250905061180a565b6104076004803603602081101561084d57600080fd5b5035612141565b610407612689565b6102816004803603604081101561087257600080fd5b506001600160a01b03813581169160200135166126c4565b6103586126ef565b6104076126fe565b610281600480360360208110156108b057600080fd5b503561277d565b610407600480360360208110156108cd57600080fd5b50356001600160a01b03166127ac565b610281600480360360208110156108f357600080fd5b5035612820565b610358612854565b60425481565b603a805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561098e5780601f106109635761010080835404028352916020019161098e565b820191906000526020600020905b81548152906001019060200180831161097157829003601f168201915b505050505081565b60006109a333848461286c565b5060015b92915050565b6037546001600160a01b031681565b603f5481565b603960205281600052604060002081815481106109db57fe5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b6003545b90565b6037546001600160a01b03163314610a66576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055604254610a84908363ffffffff61295816565b604255610a8f610e14565b821115610ad6576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b610ae083836129b5565b6004548114610b24576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b505050565b603e5481565b6037546001600160a01b03163314610b81576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055610ba66001600160a01b038516848463ffffffff612a6216565b6004548114610bea576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b50505050565b6000610bfd848484612bbc565b6001600160a01b038416600090815260026020908152604080832033808552925290912054610c3d918691610c38908663ffffffff61295816565b61286c565b5060019392505050565b6037546001600160a01b03163314610c99576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6001600160a01b038216737ceb23fd6bc0add59e62ac25578270cff1b9f61914801590610ce357506001600160a01b03821673e7e36edde5b93c2d041861d0c246740ebe8de4b614155b610d26576040805162461bcd60e51b815260206004820152600f60248201526e1b9bc81c9d59dcc8185b1b1bddd959608a1b604482015290519081900360640190fd5b610d426001600160a01b0383168260001963ffffffff612d0016565b5050565b600080610d6673e7e36edde5b93c2d041861d0c246740ebe8de4b6612e52565b9050600073e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db757600080fd5b505afa158015610dcb573d6000803e3d6000fd5b505050506040513d6020811015610de157600080fd5b50519050610e0d670de0b6b3a7640000610e01848463ffffffff612ece16565b9063ffffffff612f2e16565b9250505090565b6000610e4a610e21610d46565b610e3e737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b9063ffffffff612f9816565b905090565b6000604154421115610f62576000610e726041544261295890919063ffffffff16565b90506000610e8e84610e82610e14565b9063ffffffff61295816565b90506000603c60019054906101000a90046001600160a01b03166001600160a01b031663c6dfa13f604054846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610ef557600080fd5b505afa158015610f09573d6000803e3d6000fd5b505050506040513d6020811015610f1f57600080fd5b5051604054909150610f5890670de0b6b3a764000090610e01908690610f4c90869063ffffffff612ece16565b9063ffffffff612ece16565b9350505050610f66565b5060005b919050565b603c5460ff1681565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109a3918590610c38908663ffffffff612f9816565b737ceb23fd6bc0add59e62ac25578270cff1b9f61981565b60006041544211156110a9576000610fdf82610e4f565b90506000611073612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b505afa15801561104e573d6000803e3d6000fd5b505050506040513d602081101561106457600080fd5b5051859063ffffffff612ece16565b604254909150611089908263ffffffff612f9816565b60425560405461109f908363ffffffff612f9816565b6040555050426041555b600480546001019081905560006110be611254565b905060006110fe868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ff292505050565b9050600082156111295761112483610e01611117610a0d565b859063ffffffff612ece16565b61112b565b815b905061113733826130b2565b66038d7ea4c68000611147610a0d565b101561119a576040805162461bcd60e51b815260206004820152601d60248201527f6465706f7369743a20746f74616c20737570706c7920746f6f206c6f77000000604482015290519081900360640190fd5b6111a26131a4565b5050506004548114610bea576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b6037546001600160a01b0316331461123b576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b60425461124e908263ffffffff61295816565b60425550565b6000610e4a604254610e82604054610e3e610e14565b6037546001600160a01b031633146112bc576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b031660009081526001602052604090205490565b6000610e4a61130c610a0d565b610e01611317611254565b670de0b6b3a76400009063ffffffff612ece16565b603c5461010090046001600160a01b031681565b6000818152603d60209081526040808320805482516303c1db6b60e51b8152600481018790529251859492936001600160a01b039092169263783b6d609260248082019391829003018186803b15801561139957600080fd5b505afa1580156113ad573d6000803e3d6000fd5b505050506040513d60208110156113c357600080fd5b505160028201546113d39061277d565b9250925050915091565b60006041544211156114855760006113f482610e4f565b9050600061144f612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b604254909150611465908263ffffffff612f9816565b60425560405461147b908363ffffffff612f9816565b6040555050426041555b600480546001019081905560006114b561149d610a0d565b610e016114a8611254565b889063ffffffff612ece16565b90506114bf610e14565b8111156114fd5760405162461bcd60e51b8152600401808060200182810382526030815260200180613ab46030913960400191505060405180910390fd5b6115073386613207565b61151133826129b5565b600061151b610a0d565b9050801580611531575066038d7ea4c680008110155b611582576040805162461bcd60e51b815260206004820152601e60248201527f77697468647261773a20746f74616c20737570706c7920746f6f206c6f770000604482015290519081900360640190fd5b50506004548114610bea576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b603b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561098e5780601f106109635761010080835404028352916020019161098e565b603d602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b60415481565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916109a3918590610c38908663ffffffff61295816565b60405481565b60006109a3338484612bbc565b600054610100900460ff16806116bf57506116bf6132e2565b806116cd575060005460ff16155b6117085760405162461bcd60e51b815260040180806020018281038252602e8152602001806139d5602e913960400191505060405180910390fd5b600054610100900460ff16158015611733576000805460ff1961ff0019909116610100171660011790555b61173b6132e8565b6117436133a8565b603c8054610100600160a81b0319166101006001600160a01b03851602179055426041556001603e5560408051808201909152601c8082527f656c6576656e20696e7465726573742062656172696e6720574554480000000060209092019182526117b091603a916138d7565b50604080518082019091526007808252660cad8caae8aa8960cb1b60209092019182526117df91603b916138d7565b50603c805460ff191660121790556117f561344e565b8015610d42576000805461ff00191690555050565b333214611848576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b60048054600101908190556041546000904211156118fc57600061186b82610e4f565b905060006118c6612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b6042549091506118dc908263ffffffff612f9816565b6042556040546118f2908363ffffffff612f9816565b6040555050426041555b8961194957603e805460018082019092556000818152603d6020526040902080546001600160a01b038d166001600160a01b03199182161782559201805490921633179091559950611a59565b603e548a10611991576040805162461bcd60e51b815260206004820152600f60248201526e189859081c1bdcda5d1a5bdb881a59608a1b604482015290519081900360640190fd5b60008a8152603d60205260409020546001600160a01b038a81169116146119f6576040805162461bcd60e51b8152602060048201526014602482015273189859081c1bdcda5d1a5bdb88189a59d99bdbdd60621b604482015290519081900360640190fd5b60008a8152603d60205260409020600101546001600160a01b03163314611a59576040805162461bcd60e51b81526020600482015260126024820152713737ba103837b9b4ba34b7b71037bbb732b960711b604482015290519081900360640190fd5b6040805189815290518b917f73c4ef442856bea52a6b34a83f35484ee65828010254ec27766c5a8c13db6c84919081900360200190a2603c546040805163c530054960e01b81526001600160a01b038c8116600483015291516101009093049091169163c530054991602480820192602092909190829003018186803b158015611ae257600080fd5b505afa158015611af6573d6000803e3d6000fd5b505050506040513d6020811015611b0c57600080fd5b5051611b4f576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081848189a59d99bdbdd609a1b604482015290519081900360640190fd5b871580611bd45750603c546040805161237f60e41b81526001600160a01b038c81166004830152915161010090930490911691620237f091602480820192602092909190829003018186803b158015611ba757600080fd5b505afa158015611bbb573d6000803e3d6000fd5b505050506040513d6020811015611bd157600080fd5b50515b611c25576040805162461bcd60e51b815260206004820152601c60248201527f626967666f6f74206e6f7420616363657074206d6f7265206465627400000000604482015290519081900360640190fd5b6000611c3489610e3e8d61348b565b9050600080611c798b610e3e8b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ff292505050565b9050611c83610e14565b811115611cd7576040805162461bcd60e51b815260206004820152601d60248201527f696e73756666696369656e74205745544820696e207468652062616e6b000000604482015290519081900360640190fd5b6000611ce582610e82610e14565b9050611cf18d836129b5565b8c6001600160a01b03166348db8cc48f33878c8c6040518663ffffffff1660e01b815260040180868152602001856001600160a01b03166001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015611d8d57600080fd5b505af1158015611da1573d6000803e3d6000fd5b50505050611db181610e82610e14565b925050506000611dca83611dc5848d613530565b613530565b9050611ddc838263ffffffff61295816565b9250821561204257603c60019054906101000a90046001600160a01b03166001600160a01b031663e1ed42866040518163ffffffff1660e01b815260040160206040518083038186803b158015611e3257600080fd5b505afa158015611e46573d6000803e3d6000fd5b505050506040513d6020811015611e5c57600080fd5b5051831015611ea8576040805162461bcd60e51b8152602060048201526013602482015272746f6f20736d616c6c20646562742073697a6560681b604482015290519081900360640190fd5b60008c6001600160a01b031663783b6d608f6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611eee57600080fd5b505afa158015611f02573d6000803e3d6000fd5b505050506040513d6020811015611f1857600080fd5b810190808051906020019092919050505090506000603c60019054906101000a90046001600160a01b03166001600160a01b031663ad58e5738f876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d6020811015611fca57600080fd5b50519050611fe08561271063ffffffff612ece16565b611ff0838363ffffffff612ece16565b1015612035576040805162461bcd60e51b815260206004820152600f60248201526e3130b2103bb7b935903330b1ba37b960891b604482015290519081900360640190fd5b61203f8f86613546565b50505b8082111561205657612056338284036129b5565b61205e6131a4565b66038d7ea4c68000603f5410156120a65760405162461bcd60e51b8152600401808060200182810382526025815260200180613a036025913960400191505060405180910390fd5b66038d7ea4c6800060405410156120ee5760405162461bcd60e51b8152600401808060200182810382526025815260200180613a286025913960400191505060405180910390fd5b505050506004548114612136576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b505050505050505050565b33321461217f576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b600060415442111561222757600061219682610e4f565b905060006121f1612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b604254909150612207908263ffffffff612f9816565b60425560405461221d908363ffffffff612f9816565b6040555050426041555b60048054600101908190556000838152603d602052604090206002810154612280576040805162461bcd60e51b81526020600482015260076024820152661b9bc81919589d60ca1b604482015290519081900360640190fd5b600061228b8561348b565b8254604080516303c1db6b60e51b81526004810189905290519293506000926001600160a01b039092169163783b6d6091602480820192602092909190829003018186803b1580156122dc57600080fd5b505afa1580156122f0573d6000803e3d6000fd5b505050506040513d602081101561230657600080fd5b5051603c548454604080516313f6321b60e01b81526001600160a01b039283166004820152602481018790529051939450600093610100909304909116916313f6321b91604480820192602092909190829003018186803b15801561236a57600080fd5b505afa15801561237e573d6000803e3d6000fd5b505050506040513d602081101561239457600080fd5b505190506123aa8361271063ffffffff612ece16565b6123ba838363ffffffff612ece16565b106123fe576040805162461bcd60e51b815260206004820152600f60248201526e63616e2774206c697175696461746560881b604482015290519081900360640190fd5b6000612408610e14565b8554604080516301057c4960e61b8152600481018c905290519293506001600160a01b039091169163415f12409160248082019260009290919082900301818387803b15801561245757600080fd5b505af115801561246b573d6000803e3d6000fd5b50505050600061247d82610e82610e14565b905060006124d8612710610e01603c60019054906101000a90046001600160a01b03166001600160a01b03166328ae433e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561103a57600080fd5b905060006124ec838363ffffffff61295816565b905081156124fe576124fe33836129b5565b600087821161250e576000612512565b8782035b90508015612532576001890154612532906001600160a01b0316826129b5565b61253a6131a4565b6040805184815260208101839052815133928f927fa150a1ba7e1c4b72a15f8cb872406ce63950404709b67fbfe52b36792f483a39929081900390910190a3603960008a60010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052804381526020018e81526020018a8152602001898152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401555050505050505050505050506004548114610b24576040805162461bcd60e51b815260206004820152601f6024820152600080516020613993833981519152604482015290519081900360640190fd5b6000612694336112e4565b905060006126ae6126a3610a0d565b610e01611117611254565b90506126ba3383613207565b610d4233826129b5565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6038546001600160a01b031681565b6038546001600160a01b0316331461275d576040805162461bcd60e51b815260206004820152601860248201527f6e6f74207468652070656e64696e6720676f7665726e6f720000000000000000604482015290519081900360640190fd5b603880546001600160a01b03199081169091556037805490911633179055565b6000603f5460001415612791575080610f66565b6109a7603f54610e0160405485612ece90919063ffffffff16565b6037546001600160a01b031633146127fe576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603880546001600160a01b0319166001600160a01b0392909216919091179055565b6000603f5460001415612834575080610f66565b6109a76001610e3e604054610e01603f5487612ece90919063ffffffff16565b73e7e36edde5b93c2d041861d0c246740ebe8de4b681565b6001600160a01b0383166128b15760405162461bcd60e51b8152600401808060200182810382526024815260200180613ae46024913960400191505060405180910390fd5b6001600160a01b0382166128f65760405162461bcd60e51b81526004018080602001828103825260228152602001806139b36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000828211156129af576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006129d4737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b9050818110612a0757612a02737ceb23fd6bc0add59e62ac25578270cff1b9f619848463ffffffff612a6216565b610b24565b612a1f612a1a838363ffffffff61295816565b6135e3565b610b2483612a40737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b737ceb23fd6bc0add59e62ac25578270cff1b9f619919063ffffffff612a6216565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612adf5780518252601f199092019160209182019101612ac0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b41576040519150601f19603f3d011682016040523d82523d6000602084013e612b46565b606091505b5091509150818015612b74575080511580612b745750808060200190516020811015612b7157600080fd5b50515b612bb5576040805162461bcd60e51b815260206004820152600d60248201526c10b9b0b332aa3930b739b332b960991b604482015290519081900360640190fd5b5050505050565b6001600160a01b038316612c015760405162461bcd60e51b8152600401808060200182810382526025815260200180613a8f6025913960400191505060405180910390fd5b6001600160a01b038216612c465760405162461bcd60e51b81526004018080602001828103825260238152602001806139706023913960400191505060405180910390fd5b6001600160a01b038316600090815260016020526040902054612c6f908263ffffffff61295816565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612ca4908263ffffffff612f9816565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310612d7d5780518252601f199092019160209182019101612d5e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ddf576040519150601f19603f3d011682016040523d82523d6000602084013e612de4565b606091505b5091509150818015612e12575080511580612e125750808060200190516020811015612e0f57600080fd5b50515b612bb5576040805162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015612e9c57600080fd5b505afa158015612eb0573d6000803e3d6000fd5b505050506040513d6020811015612ec657600080fd5b505192915050565b600082612edd575060006109a7565b82820282848281612eea57fe5b0414612f275760405162461bcd60e51b8152600401808060200182810382526021815260200180613a4d6021913960400191505060405180910390fd5b9392505050565b6000808211612f84576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481612f8f57fe5b04949350505050565b600082820183811015612f27576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613012737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b905060008360008151811061302357fe5b602002602001015111156130795761307933308560008151811061304357fe5b6020026020010151737ceb23fd6bc0add59e62ac25578270cff1b9f6196001600160a01b0316613770909392919063ffffffff16565b6000613098737ceb23fd6bc0add59e62ac25578270cff1b9f619612e52565b90506130aa818363ffffffff61295816565b949350505050565b6001600160a01b03821661310d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600354613120908263ffffffff612f9816565b6003556001600160a01b03821660009081526001602052604090205461314c908263ffffffff612f9816565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b031663de5f62686040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156131f357600080fd5b505af1158015610bea573d6000803e3d6000fd5b6001600160a01b03821661324c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613a6e6021913960400191505060405180910390fd5b60035461325f908263ffffffff61295816565b6003556001600160a01b03821660009081526001602052604090205461328b908263ffffffff61295816565b6001600160a01b0383166000818152600160209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b303b1590565b600054610100900460ff168061330157506133016132e2565b8061330f575060005460ff16155b61334a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806139d5602e913960400191505060405180910390fd5b600054610100900460ff16158015613375576000805460ff1961ff0019909116610100171660011790555b603780546001600160a01b0319908116331790915560388054909116905580156133a5576000805461ff00191690555b50565b600054610100900460ff16806133c157506133c16132e2565b806133cf575060005460ff16155b61340a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806139d5602e913960400191505060405180910390fd5b600054610100900460ff16158015613435576000805460ff1961ff0019909116610100171660011790555b600160045580156133a5576000805461ff001916905550565b613489737ceb23fd6bc0add59e62ac25578270cff1b9f61973e7e36edde5b93c2d041861d0c246740ebe8de4b660001963ffffffff612d0016565b565b6000818152603d60205260408120600281015480156135255760006134af8261277d565b60006002850155603f549091506134cc908363ffffffff61295816565b603f556040546134e2908263ffffffff61295816565b60409081558051838152905186917fc141cd58846e97354928242dcc7ddd92a6a0ecf03bdb5d3a411d260b9abc3272919081900360200190a29250610f66915050565b600092505050610f66565b600081831061353f5781612f27565b5090919050565b6000828152603d602052604081209061355e83612820565b6002830154909150613576908263ffffffff612f9816565b6002830155603f5461358e908263ffffffff612f9816565b603f556040546135a4908463ffffffff612f9816565b60409081558051828152905185917f43b70d61bab6f8bfcf27c791452876c7da386b19652e19b8f21e8927aa6577ab919081900360200190a250505050565b6135eb610d46565b81101561370d5773e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b0316632e1a7d4d6136ba6136a2600173e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561366a57600080fd5b505afa15801561367e573d6000803e3d6000fd5b505050506040513d602081101561369457600080fd5b50519063ffffffff612f9816565b610e0185670de0b6b3a764000063ffffffff612ece16565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156136f057600080fd5b505af1158015613704573d6000803e3d6000fd5b505050506133a5565b73e7e36edde5b93c2d041861d0c246740ebe8de4b66001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561375c57600080fd5b505af1158015612bb5573d6000803e3d6000fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106137f55780518252601f1990920191602091820191016137d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613857576040519150601f19603f3d011682016040523d82523d6000602084013e61385c565b606091505b509150915081801561388a57508051158061388a575080806020019051602081101561388757600080fd5b50515b6138cf576040805162461bcd60e51b815260206004820152601160248201527021736166655472616e7366657246726f6d60781b604482015290519081900360640190fd5b505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061391857805160ff1916838001178555613945565b82800160010185558215613945579182015b8281111561394557825182559160200191906001019061392a565b50613951929150613955565b5090565b610a1191905b80821115613951576000815560010161395b56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735265656e7472616e637947756172643a207265656e7472616e742063616c6c0045524332303a20617070726f766520746f20746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656472656d61696e696e6720676c6f62616c206465627420736861726520746f6f20736d616c6c72656d61696e696e6720676c6f62616c20646562742076616c756520746f6f20736d616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573735574696c697a6174696f6e20746f6f20686967682c20776974686472617720616e20736d616c6c657220616d6f756e7445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a7231582040aca99730f75dc40a267ef72e96ef7485a4a5784546d57840c3d57715a6888a64736f6c63430005110032
Deployed Bytecode Sourcemap
24330:13775:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24330:13775:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25495:23;;;:::i;:::-;;;;;;;;;;;;;;;;25122:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25122:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15293:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15293:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11778:23;;;:::i;:::-;;;;-1:-1:-1;;;;;11778:23:0;;;;;;;;;;;;;;25408:24;;;:::i;24894:42::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24894:42:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14316:91;;;:::i;37177:226::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37177:226:0;;;;;;;;:::i;:::-;;25375:26;;;:::i;37954:148::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37954:148:0;;;;;;;;;;;;;;;;;:::i;15912:256::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15912:256:0;;;;;;;;;;;;;;;;;:::i;26752:196::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26752:196:0;;;;;;;;;;:::i;26981:197::-;;;:::i;28134:117::-;;;:::i;28440:379::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28440:379:0;;:::i;25170:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16577:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16577:206:0;;;;;;;;:::i;24945:82::-;;;:::i;30218:358::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30218:358:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30218:358:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30218:358:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;30218:358:0;;-1:-1:-1;30218:358:0;-1:-1:-1;30218:358:0;:::i;37547:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37547:101:0;;:::i;30014:122::-;;;:::i;36864:88::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36864:88:0;-1:-1:-1;;;;;36864:88:0;;:::i;14470:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14470:110:0;-1:-1:-1;;;;;14470:110:0;;:::i;27229:136::-;;;:::i;25291:24::-;;;:::i;29717:191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29717:191:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30651:431;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30651:431:0;;;;;;;;;:::i;25145:20::-;;;:::i;25324:42::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25324:42:0;;:::i;:::-;;;;-1:-1:-1;;;;;25324:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25464:26;;;:::i;17286:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17286:216:0;;;;;;;;:::i;25437:22::-;;;:::i;14793:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14793:156:0;;;;;;;;:::i;26092:317::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26092:317:0;-1:-1:-1;;;;;26092:317:0;;:::i;32214:2219::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;32214:2219:0;;;-1:-1:-1;;;;;32214:2219:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;32214:2219:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32214:2219:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32214:2219:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;32214:2219:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32214:2219:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;32214:2219:0;;-1:-1:-1;32214:2219:0;-1:-1:-1;32214:2219:0;:::i;34587:1182::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34587:1182:0;;:::i;31149:236::-;;;:::i;15012:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15012:134:0;;;;;;;;;;:::i;11831:30::-;;;:::i;12606:177::-;;;:::i;28977:219::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28977:219:0;;:::i;12395:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12395:118:0;-1:-1:-1;;;;;12395:118:0;;:::i;29351:220::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29351:220:0;;:::i;25032:83::-;;;:::i;25495:23::-;;;;:::o;25122:18::-;;;;;;;;;;;;;;;-1:-1:-1;;25122:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15293:148::-;15358:4;15375:36;15384:10;15396:7;15405:5;15375:8;:36::i;:::-;-1:-1:-1;15429:4:0;15293:148;;;;;:::o;11778:23::-;;;-1:-1:-1;;;;;11778:23:0;;:::o;25408:24::-;;;;:::o;24894:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24894:42:0;;-1:-1:-1;24894:42:0;;;:::o;14316:91::-;14387:12;;14316:91;;:::o;37177:226::-;11977:8;;-1:-1:-1;;;;;11977:8:0;11963:10;:22;11955:51;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;;;;22179:13;:18;;22196:1;22179:18;;;;;37277:11;;:22;;37293:5;37277:22;:15;:22;:::i;:::-;37263:11;:36;37321:13;:11;:13::i;:::-;37314:5;:20;;37306:49;;;;;-1:-1:-1;;;37306:49:0;;;;;;;;;;;;-1:-1:-1;;;37306:49:0;;;;;;;;;;;;;;;37362:35;37387:2;37391:5;37362:24;:35::i;:::-;22276:13;;22260:12;:29;22252:73;;;;;-1:-1:-1;;;22252:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22252:73:0;;;;;;;;;;;;;;;12013:1;37177:226;;:::o;25375:26::-;;;;:::o;37954:148::-;11977:8;;-1:-1:-1;;;;;11977:8:0;11963:10;:22;11955:51;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;;;;22179:13;:18;;22196:1;22179:18;;;;;38067:29;-1:-1:-1;;;;;38067:18:0;;38086:2;38090:5;38067:29;:18;:29;:::i;:::-;22276:13;;22260:12;:29;22252:73;;;;;-1:-1:-1;;;22252:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22252:73:0;;;;;;;;;;;;;;;12013:1;37954:148;;;:::o;15912:256::-;16001:4;16018:36;16028:6;16036:9;16047:6;16018:9;:36::i;:::-;-1:-1:-1;;;;;16094:19:0;;;;;;:11;:19;;;;;;;;16082:10;16094:31;;;;;;;;;16065:73;;16074:6;;16094:43;;16130:6;16094:43;:35;:43;:::i;:::-;16065:8;:73::i;:::-;-1:-1:-1;16156:4:0;15912:256;;;;;:::o;26752:196::-;11977:8;;-1:-1:-1;;;;;11977:8:0;11963:10;:22;11955:51;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26844:14:0;;24984:42;26844:14;;;;:33;;-1:-1:-1;;;;;;26862:15:0;;25072:42;26862:15;;26844:33;26836:61;;;;;-1:-1:-1;;;26836:61:0;;;;;;;;;;;;-1:-1:-1;;;26836:61:0;;;;;;;;;;;;;;;26904:38;-1:-1:-1;;;;;26904:18:0;;26923:8;-1:-1:-1;;26904:38:0;:18;:38;:::i;:::-;26752:196;;:::o;26981:197::-;27036:4;;27059:17;25072:42;27059:15;:17::i;:::-;27048:28;;27083:8;25072:42;-1:-1:-1;;;;;27094:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27094:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27094:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27094:42:0;;-1:-1:-1;27150:22:0;27167:4;27150:12;:3;27094:42;27150:12;:7;:12;:::i;:::-;:16;:22;:16;:22;:::i;:::-;27143:29;;;;26981:197;:::o;28134:117::-;28178:4;28198:47;28219:25;:23;:25::i;:::-;28198:16;24984:42;28198:14;:16::i;:::-;:20;:47;:20;:47;:::i;:::-;28191:54;;28134:117;:::o;28440:379::-;28501:4;28524:14;;28518:3;:20;28514:300;;;28549:13;28565:23;28573:14;;28565:3;:7;;:23;;;;:::i;:::-;28549:39;;28597:12;28612:27;28630:8;28612:13;:11;:13::i;:::-;:17;:27;:17;:27;:::i;:::-;28597:42;;28648:15;28666:6;;;;;;;;;-1:-1:-1;;;;;28666:6:0;-1:-1:-1;;;;;28666:22:0;;28689:10;;28701:7;28666:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28666:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28666:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28666:43:0;28740:10;;28666:43;;-1:-1:-1;28725:50:0;;28770:4;;28725:40;;28756:8;;28725:26;;28666:43;;28725:26;:14;:26;:::i;:::-;:30;:40;:30;:40;:::i;:50::-;28718:57;;;;;;;28514:300;-1:-1:-1;28805:1:0;28514:300;28440:379;;;:::o;25170:21::-;;;;;;:::o;16577:206::-;16683:10;16657:4;16704:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16704:32:0;;;;;;;;;;16657:4;;16674:79;;16695:7;;16704:48;;16741:10;16704:48;:36;:48;:::i;24945:82::-;24984:42;24945:82;:::o;30218:358::-;30276:1;25794:14;;25788:3;:20;25784:285;;;25819:13;25835:25;25851:8;25835:15;:25::i;:::-;25819:41;;25869:14;25886:51;25931:5;25886:40;25899:6;;;;;;;;;-1:-1:-1;;;;;25899:6:0;-1:-1:-1;;;;;25899:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25899:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25899:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25899:26:0;25886:8;;:40;:12;:40;:::i;:51::-;25960:11;;25869:68;;-1:-1:-1;25960:26:0;;25869:68;25960:26;:15;:26;:::i;:::-;25946:11;:40;26008:10;;:24;;26023:8;26008:24;:14;:24;:::i;:::-;25995:10;:37;-1:-1:-1;;26058:3:0;26041:14;:20;25784:285;22179:13;:18;;22196:1;22179:18;;;;;:13;30313:19;:17;:19::i;:::-;30300:32;;30339:9;30351:21;30364:7;;30351:21;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30351:12:0;;-1:-1:-1;;;30351:21:0:i;:::-;30339:33;-1:-1:-1;30379:10:0;30392;;:54;;30412:34;30440:5;30412:23;30421:13;:11;:13::i;:::-;30412:4;;:23;:8;:23;:::i;:34::-;30392:54;;;30405:4;30392:54;30379:67;;30453:24;30459:10;30471:5;30453;:24::i;:::-;30509:4;30492:13;:11;:13::i;:::-;:21;;30484:63;;;;;-1:-1:-1;;;30484:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30554:16;:14;:16::i;:::-;22244:1;;;22276:13;;22260:12;:29;22252:73;;;;;-1:-1:-1;;;22252:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22252:73:0;;;;;;;;;;;;;;37547:101;11977:8;;-1:-1:-1;;;;;11977:8:0;11963:10;:22;11955:51;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;;;;37620:11;;:22;;37636:5;37620:22;:15;:22;:::i;:::-;37606:11;:36;-1:-1:-1;37547:101:0:o;30014:122::-;30064:4;30084:46;30118:11;;30084:29;30102:10;;30084:13;:11;:13::i;36864:88::-;11977:8;;-1:-1:-1;;;;;11977:8:0;11963:10;:22;11955:51;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;;;;36930:6;:16;;-1:-1:-1;;;;;36930:16:0;;;;;-1:-1:-1;;;;;;36930:16:0;;;;;;;;;36864:88::o;14470:110::-;-1:-1:-1;;;;;14554:18:0;14527:7;14554:18;;;:9;:18;;;;;;;14470:110::o;27229:136::-;27281:4;27302:57;27345:13;:11;:13::i;:::-;27302:38;27320:19;:17;:19::i;:::-;27307:7;;27302:38;:17;:38;:::i;25291:24::-;;;;;;-1:-1:-1;;;;;25291:24:0;;:::o;29717:191::-;29769:4;29811:13;;;:9;:13;;;;;;;;29847:11;;29839:31;;-1:-1:-1;;;29839:31:0;;;;;;;;;;29769:4;;29811:13;;-1:-1:-1;;;;;29847:11:0;;;;29839:27;;:31;;;;;;;;;;;29847:11;29839:31;;;5:2:-1;;;;30:1;27;20:12;5:2;29839:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29839:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29839:31:0;29887:13;;;;29872:29;;:14;:29::i;:::-;29831:71;;;;;29717:191;;;:::o;30651:431::-;30704:1;25794:14;;25788:3;:20;25784:285;;;25819:13;25835:25;25851:8;25835:15;:25::i;:::-;25819:41;;25869:14;25886:51;25931:5;25886:40;25899:6;;;;;;;;;-1:-1:-1;;;;;25899:6:0;-1:-1:-1;;;;;25899:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;25886:51:0;25960:11;;25869:68;;-1:-1:-1;25960:26:0;;25869:68;25960:26;:15;:26;:::i;:::-;25946:11;:40;26008:10;;:24;;26023:8;26008:24;:14;:24;:::i;:::-;25995:10;:37;-1:-1:-1;;26058:3:0;26041:14;:20;25784:285;22179:13;:18;;22196:1;22179:18;;;;;:13;30741:49;30776:13;:11;:13::i;:::-;30741:30;30751:19;:17;:19::i;:::-;30741:5;;:30;:9;:30;:::i;:49::-;30727:63;;30815:13;:11;:13::i;:::-;30805:6;:23;;30797:84;;;;-1:-1:-1;;;30797:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30888:24;30894:10;30906:5;30888;:24::i;:::-;30919:44;30944:10;30956:6;30919:24;:44::i;:::-;30970:11;30984:13;:11;:13::i;:::-;30970:27;-1:-1:-1;31012:11:0;;;:29;;;31037:4;31027:6;:14;;31012:29;31004:72;;;;;-1:-1:-1;;;31004:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22244:1;;22276:13;;22260:12;:29;22252:73;;;;;-1:-1:-1;;;22252:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22252:73:0;;;;;;;;;;;;;;25145:20;;;;;;;;;;;;;;;-1:-1:-1;;25145:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25324:42;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25324:42:0;;;;;;;;;:::o;25464:26::-;;;;:::o;17286:216::-;17397:10;17371:4;17418:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;17418:32:0;;;;;;;;;;17371:4;;17388:84;;17409:7;;17418:53;;17455:15;17418:53;:36;:53;:::i;25437:22::-;;;;:::o;14793:156::-;14862:4;14879:40;14889:10;14901:9;14912:6;14879:9;:40::i;26092:317::-;3364:13;;;;;;;;:33;;;3381:16;:14;:16::i;:::-;3364:50;;;-1:-1:-1;3402:12:0;;;;3401:13;3364:50;3348:130;;;;-1:-1:-1;;;3348:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3487:19;3510:13;;;;;;3509:14;3530:85;;;;3559:13;:20;;-1:-1:-1;;;;3559:20:0;;;;;3588:19;3575:4;3588:19;;;3530:85;26160:20;:18;:20::i;:::-;26187:36;:34;:36::i;:::-;26230:6;:16;;-1:-1:-1;;;;;;26230:16:0;;-1:-1:-1;;;;;26230:16:0;;;;;;26270:3;26253:14;:20;-1:-1:-1;26280:14:0;:18;26305:37;;;;;;;;;;;;;;;;;;;;;;;:4;;:37;:::i;:::-;-1:-1:-1;26349:18:0;;;;;;;;;;;;;-1:-1:-1;;;26349:18:0;;;;;;;;;:6;;:18;:::i;:::-;-1:-1:-1;26374:8:0;:13;;-1:-1:-1;;26374:13:0;26385:2;26374:13;;;26394:9;:7;:9::i;:::-;3637:14;3633:58;;;3678:5;3662:21;;-1:-1:-1;;3662:21:0;;;26092:317;;:::o;32214:2219::-;25640:10;25654:9;25640:23;25632:43;;;;;-1:-1:-1;;;25632:43:0;;;;;;;;;;;;-1:-1:-1;;;25632:43:0;;;;;;;;;;;;;;;22179:13;:18;;22196:1;22179:18;;;;;25794:14;;22179:13;;25788:3;:20;25784:285;;;25819:13;25835:25;25851:8;25835:15;:25::i;:::-;25819:41;;25869:14;25886:51;25931:5;25886:40;25899:6;;;;;;;;;-1:-1:-1;;;;;25899:6:0;-1:-1:-1;;;;;25899:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;25886:51:0;25960:11;;25869:68;;-1:-1:-1;25960:26:0;;25869:68;25960:26;:15;:26;:::i;:::-;25946:11;:40;26008:10;;:24;;26023:8;26008:24;:14;:24;:::i;:::-;25995:10;:37;-1:-1:-1;;26058:3:0;26041:14;:20;25784:285;32491:7;32487:349;;32514:14;:16;;;;;;;;;:14;32539:13;;;:9;:13;;;;;:31;;-1:-1:-1;;;;;32539:31:0;;-1:-1:-1;;;;;;32539:31:0;;;;;;32579:19;;:32;;;;;32601:10;32579:32;;;;32514:16;-1:-1:-1;32487:349:0;;;32647:14;;32642:2;:19;32634:47;;;;;-1:-1:-1;;;32634:47:0;;;;;;;;;;;;-1:-1:-1;;;32634:47:0;;;;;;;;;;;;;;;32698:13;;;;:9;:13;;;;;:21;-1:-1:-1;;;;;32698:32:0;;;:21;;:32;32690:65;;;;;-1:-1:-1;;;32690:65:0;;;;;;;;;;;;-1:-1:-1;;;32690:65:0;;;;;;;;;;;;;;;32772:13;;;;:9;:13;;;;;:19;;;-1:-1:-1;;;;;32772:19:0;32795:10;32772:33;32764:64;;;;;-1:-1:-1;;;32764:64:0;;;;;;;;;;;;-1:-1:-1;;;32764:64:0;;;;;;;;;;;;;;;32847:14;;;;;;;;32852:2;;32847:14;;;;;;;;;;32960:6;;:25;;;-1:-1:-1;;;32960:25:0;;-1:-1:-1;;;;;32960:25:0;;;;;;;;;:6;;;;;;;;:16;;:25;;;;;;;;;;;;;;;:6;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;32960:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32960:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32960:25:0;32952:51;;;;;-1:-1:-1;;;32952:51:0;;;;;;;;;;;;-1:-1:-1;;;32952:51:0;;;;;;;;;;;;;;;33018:9;;;:39;;-1:-1:-1;33031:6:0;;:26;;;-1:-1:-1;;;33031:26:0;;-1:-1:-1;;;;;33031:26:0;;;;;;;;;:6;;;;;;;;:17;;:26;;;;;;;;;;;;;;;:6;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;33031:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33031:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33031:26:0;33018:39;33010:80;;;;;-1:-1:-1;;;33010:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33097:9;33109:25;33129:4;33109:15;33121:2;33109:11;:15::i;:25::-;33097:37;;33227:9;33252:13;33268:31;33294:4;33268:21;33281:7;;33268:21;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33268:12:0;;-1:-1:-1;;;33268:21:0:i;:31::-;33252:47;;33328:13;:11;:13::i;:::-;33316:8;:25;;33308:67;;;;;-1:-1:-1;;;33308:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33384:15;33402:27;33420:8;33402:13;:11;:13::i;:27::-;33384:45;;33438:43;33463:7;33472:8;33438:24;:43::i;:::-;33498:7;-1:-1:-1;;;;;33490:21:0;;33512:2;33516:10;33528:4;33534;;33490:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33490:49:0;-1:-1:-1;;;;;33490:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;33490:49:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33490:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33490:49:0;;;;33555:29;33573:10;33555:13;:11;:13::i;:29::-;33548:36;;26075:1;;33641:13;33657:41;33666:4;33672:25;33681:4;33687:9;33672:8;:25::i;:::-;33657:8;:41::i;:::-;33641:57;-1:-1:-1;33712:18:0;:4;33641:57;33712:18;:8;:18;:::i;:::-;33705:25;-1:-1:-1;33741:8:0;;33737:305;;33776:6;;;;;;;;;-1:-1:-1;;;;;33776:6:0;-1:-1:-1;;;;;33776:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33776:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33776:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33776:20:0;33768:28;;;33760:60;;;;;-1:-1:-1;;;33760:60:0;;;;;;;;;;;;-1:-1:-1;;;33760:60:0;;;;;;;;;;;;;;;33829:11;33851:7;-1:-1:-1;;;;;33843:23:0;;33867:2;33843:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33843:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33843:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33843:27:0;;;;;;;;;;;;;;;;33829:41;;33879:15;33897:6;;;;;;;;;-1:-1:-1;;;;;33897:6:0;-1:-1:-1;;;;;33897:17:0;;33915:7;33924:4;33897:32;;;;;;;;;;;;;-1:-1:-1;;;;;33897:32:0;-1:-1:-1;;;;;33897:32:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33897:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33897:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33897:32:0;;-1:-1:-1;33972:15:0;:4;33981:5;33972:15;:8;:15;:::i;:::-;33946:22;:6;33957:10;33946:22;:10;:22;:::i;:::-;:41;;33938:69;;;;;-1:-1:-1;;;33938:69:0;;;;;;;;;;;;-1:-1:-1;;;33938:69:0;;;;;;;;;;;;;;;34016:18;34025:2;34029:4;34016:8;:18::i;:::-;33737:305;;;34095:8;34088:4;:15;34084:74;;;34105:53;34130:10;34149:8;34142:4;:15;34105:24;:53::i;:::-;34205:16;:14;:16::i;:::-;34306:4;34290:12;;:20;;34282:70;;;;-1:-1:-1;;;34282:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34381:4;34367:10;;:18;;34359:68;;;;-1:-1:-1;;;34359:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26075:1;;;22244;22276:13;;22260:12;:29;22252:73;;;;;-1:-1:-1;;;22252:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22252:73:0;;;;;;;;;;;;;;;25682:1;32214:2219;;;;;;;;:::o;34587:1182::-;25640:10;25654:9;25640:23;25632:43;;;;;-1:-1:-1;;;25632:43:0;;;;;;;;;;;;-1:-1:-1;;;25632:43:0;;;;;;;;;;;;;;;34634:1;25794:14;;25788:3;:20;25784:285;;;25819:13;25835:25;25851:8;25835:15;:25::i;:::-;25819:41;;25869:14;25886:51;25931:5;25886:40;25899:6;;;;;;;;;-1:-1:-1;;;;;25899:6:0;-1:-1:-1;;;;;25899:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;25886:51:0;25960:11;;25869:68;;-1:-1:-1;25960:26:0;;25869:68;25960:26;:15;:26;:::i;:::-;25946:11;:40;26008:10;;:24;;26023:8;26008:24;:14;:24;:::i;:::-;25995:10;:37;-1:-1:-1;;26058:3:0;26041:14;:20;25784:285;22179:13;:18;;22196:1;22179:18;;;;;:13;34745;;;:9;:13;;;;;34773;;;;34765:37;;;;;-1:-1:-1;;;34765:37:0;;;;;;;;;;;;-1:-1:-1;;;34765:37:0;;;;;;;;;;;;;;;34809:9;34821:15;34833:2;34821:11;:15::i;:::-;34865:11;;34857:31;;;-1:-1:-1;;;34857:31:0;;;;;;;;;;34809:27;;-1:-1:-1;34843:11:0;;-1:-1:-1;;;;;34865:11:0;;;;34857:27;;:31;;;;;;;;;;;;;;;34865:11;34857:31;;;5:2:-1;;;;30:1;27;20:12;5:2;34857:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34857:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34857:31:0;34913:6;;34931:11;;34913:36;;;-1:-1:-1;;;34913:36:0;;-1:-1:-1;;;;;34931:11:0;;;34913:36;;;;;;;;;;;;34857:31;;-1:-1:-1;;;34913:6:0;;;;;;;;:17;;:36;;;;;34857:31;;34913:36;;;;;;;;:6;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;34913:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34913:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34913:36:0;;-1:-1:-1;34989:15:0;:4;34998:5;34989:15;:8;:15;:::i;:::-;34964:22;:6;34975:10;34964:22;:10;:22;:::i;:::-;:40;34956:68;;;;;-1:-1:-1;;;34956:68:0;;;;;;;;;;;;-1:-1:-1;;;34956:68:0;;;;;;;;;;;;;;;35109:15;35127:13;:11;:13::i;:::-;35155:11;;35147:34;;;-1:-1:-1;;;35147:34:0;;;;;;;;;;35109:31;;-1:-1:-1;;;;;;35155:11:0;;;;35147:30;;:34;;;;;35155:11;;35147:34;;;;;;;;35155:11;;35147:34;;;5:2:-1;;;;30:1;27;20:12;5:2;35147:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35147:34:0;;;;35188:9;35200:29;35218:10;35200:13;:11;:13::i;:29::-;35188:41;;35236:10;35249:40;35283:5;35249:29;35258:6;;;;;;;;;-1:-1:-1;;;;;35258:6:0;-1:-1:-1;;;;;35258:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;35249:40:0;35236:53;-1:-1:-1;35296:9:0;35308:15;:4;35236:53;35308:15;:8;:15;:::i;:::-;35296:27;-1:-1:-1;35416:9:0;;35412:58;;35427:43;35452:10;35464:5;35427:24;:43::i;:::-;35477:9;35496:4;35489;:11;:29;;35517:1;35489:29;;;35510:4;35503;:11;35489:29;35477:41;-1:-1:-1;35529:8:0;;35525:55;;35564:9;;;;35539:41;;-1:-1:-1;;;;;35564:9:0;35575:4;35539:24;:41::i;:::-;35625:16;:14;:16::i;:::-;35653:33;;;;;;;;;;;;;;35662:10;;35658:2;;35653:33;;;;;;;;;;;35693:9;:20;35703:3;:9;;;;;;;;;;-1:-1:-1;;;;;35703:9:0;-1:-1:-1;;;;;35693:20:0;-1:-1:-1;;;;;35693:20:0;;;;;;;;;;;;35719:43;;;;;;;;35725:12;35719:43;;;;35739:2;35719:43;;;;35743:4;35719:43;;;;35749:6;35719:43;;;;35757:4;35719:43;;;35693:70;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;35693:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22244:1;;;;;;;;;22276:13;;22260:12;:29;22252:73;;;;;-1:-1:-1;;;22252:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22252:73:0;;;;;;;;;;;;;;31149:236;31193:10;31206:21;31216:10;31206:9;:21::i;:::-;31193:34;;31234:11;31248:49;31283:13;:11;:13::i;:::-;31248:30;31258:19;:17;:19::i;31248:49::-;31234:63;;31304:24;31310:10;31322:5;31304;:24::i;:::-;31335:44;31360:10;31372:6;31335:24;:44::i;15012:134::-;-1:-1:-1;;;;;15111:18:0;;;15084:7;15111:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15012:134::o;11831:30::-;;;-1:-1:-1;;;;;11831:30:0;;:::o;12606:177::-;12670:15;;-1:-1:-1;;;;;12670:15:0;12656:10;:29;12648:66;;;;;-1:-1:-1;;;12648:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12721:15;:28;;-1:-1:-1;;;;;;12721:28:0;;;;;;12756:8;:21;;;;;12767:10;12756:21;;;12606:177::o;28977:219::-;29038:4;29055:12;;29071:1;29055:17;29051:39;;;-1:-1:-1;29081:9:0;29074:16;;29051:39;29147:43;29177:12;;29147:25;29161:10;;29147:9;:13;;:25;;;;:::i;12395:118::-;11977:8;;-1:-1:-1;;;;;11977:8:0;11963:10;:22;11955:51;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;-1:-1:-1;;;11955:51:0;;;;;;;;;;;;;;;12473:15;:34;;-1:-1:-1;;;;;;12473:34:0;-1:-1:-1;;;;;12473:34:0;;;;;;;;;;12395:118::o;29351:220::-;29410:4;29427:12;;29443:1;29427:17;29423:37;;;-1:-1:-1;29453:7:0;29446:14;;29423:37;29517:48;29563:1;29517:41;29547:10;;29517:25;29529:12;;29517:7;:11;;:25;;;;:::i;25032:83::-;25072:42;25032:83;:::o;20088:335::-;-1:-1:-1;;;;;20181:19:0;;20173:68;;;;-1:-1:-1;;;20173:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20260:21:0;;20252:68;;;;-1:-1:-1;;;20252:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20333:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;20384:31;;;;;;;;;;;;;;;;;20088:335;;;:::o;9391:184::-;9449:7;9482:1;9477;:6;;9469:49;;;;;-1:-1:-1;;;9469:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9541:5:0;;;9391:184::o;27749:306::-;27831:11;27845:16;24984:42;27845:14;:16::i;:::-;27831:30;;27879:7;27871:6;:15;27868:182;;27888:37;24984:42;27906:9;27917:7;27888:37;:17;:37;:::i;:::-;27868:182;;;27946:41;27967:19;:7;27979:6;27967:19;:11;:19;:::i;:::-;27946:20;:41::i;:::-;27996:46;28014:9;28025:16;24984:42;28025:14;:16::i;:::-;24984:42;;27996:46;;:17;:46;:::i;23043:349::-;23250:45;;;-1:-1:-1;;;;;23250:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23250:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23239:57:0;;;;23204:12;;23218:17;;23239:10;;;;23250:45;23239:57;;;25:18:-1;23239:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23239:57:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23203:93:0;;;;23311:7;:57;;;;-1:-1:-1;23323:11:0;;:16;;:44;;;23354:4;23343:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23343:24:0;23323:44;23303:83;;;;;-1:-1:-1;;;23303:83:0;;;;;;;;;;;;-1:-1:-1;;;23303:83:0;;;;;;;;;;;;;;;23043:349;;;;;:::o;17992:429::-;-1:-1:-1;;;;;18090:20:0;;18082:70;;;;-1:-1:-1;;;18082:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18171:23:0;;18163:71;;;;-1:-1:-1;;;18163:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18267:17:0;;;;;;:9;:17;;;;;;:29;;18289:6;18267:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;18247:17:0;;;;;;;:9;:17;;;;;;:49;;;;18330:20;;;;;;;:32;;18355:6;18330:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;18307:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;18378:35;;;;;;;18307:20;;18378:35;;;;;;;;;;;;;17992:429;;;:::o;22691:346::-;22896:45;;;-1:-1:-1;;;;;22896:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22896:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;22885:57:0;;;;22850:12;;22864:17;;22885:10;;;;22896:45;22885:57;;;25:18:-1;22885:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;22885:57:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;22849:93:0;;;;22957:7;:57;;;;-1:-1:-1;22969:11:0;;:16;;:44;;;23000:4;22989:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22989:24:0;22969:44;22949:82;;;;;-1:-1:-1;;;22949:82:0;;;;;;;;;;;;-1:-1:-1;;;22949:82:0;;;;;;;;;;;;;;22416:129;22493:46;;;-1:-1:-1;;;22493:46:0;;22533:4;22493:46;;;;;;22473:4;;-1:-1:-1;;;;;22493:31:0;;;;;:46;;;;;;;;;;;;;;;:31;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;22493:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22493:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22493:46:0;;22416:129;-1:-1:-1;;22416:129:0:o;9826:470::-;9884:7;10128:6;10124:47;;-1:-1:-1;10158:1:0;10151:8;;10124:47;10195:5;;;10199:1;10195;:5;:1;10219:5;;;;;:10;10211:56;;;;-1:-1:-1;;;10211:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10287:1;9826:470;-1:-1:-1;;;9826:470:0:o;10764:333::-;10822:7;10921:1;10917;:5;10909:44;;;;;-1:-1:-1;;;10909:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10964:9;10980:1;10976;:5;;;;;;;10764:333;-1:-1:-1;;;;10764:333:0:o;8935:181::-;8993:7;9025:5;;;9049:6;;;;9041:46;;;;;-1:-1:-1;;;9041:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;31456:271;31518:4;;31545:16;24984:42;31545:14;:16::i;:::-;31530:31;;31582:1;31571:7;31579:1;31571:10;;;;;;;;;;;;;;:12;31568:77;;;31585:60;31607:10;31627:4;31634:7;31642:1;31634:10;;;;;;;;;;;;;;24984:42;-1:-1:-1;;;;;31585:21:0;;;:60;;;;;;:::i;:::-;31652:13;31668:16;24984:42;31668:14;:16::i;:::-;31652:32;-1:-1:-1;31699:21:0;31652:32;31712:7;31699:21;:12;:21;:::i;:::-;31691:30;31456:271;-1:-1:-1;;;;31456:271:0:o;18702:308::-;-1:-1:-1;;;;;18778:21:0;;18770:65;;;;;-1:-1:-1;;;18770:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18863:12;;:24;;18880:6;18863:24;:16;:24;:::i;:::-;18848:12;:39;-1:-1:-1;;;;;18919:18:0;;;;;;:9;:18;;;;;;:30;;18942:6;18919:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18898:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18965:37;;;;;;;18898:18;;;;18965:37;;;;;;;;;;18702:308;;:::o;26594:79::-;25072:42;-1:-1:-1;;;;;26635:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26635:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;19342:306:0;-1:-1:-1;;;;;19417:21:0;;19409:67;;;;-1:-1:-1;;;19409:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19504:12;;:23;;19521:5;19504:23;:16;:23;:::i;:::-;19489:12;:38;-1:-1:-1;;;;;19559:18:0;;;;;;:9;:18;;;;;;:29;;19582:5;19559:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;19538:18:0;;;;;;:9;:18;;;;;;;;:50;;;;19604:36;;;;;;;19538:18;;19604:36;;;;;;;;;;;19342:306;;:::o;3785:571::-;4203:4;4306:17;4343:7;3785:571;:::o;12114:120::-;3364:13;;;;;;;;:33;;;3381:16;:14;:16::i;:::-;3364:50;;;-1:-1:-1;3402:12:0;;;;3401:13;3364:50;3348:130;;;;-1:-1:-1;;;3348:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3487:19;3510:13;;;;;;3509:14;3530:85;;;;3559:13;:20;;-1:-1:-1;;;;3559:20:0;;;;;3588:19;3575:4;3588:19;;;3530:85;12172:8;:21;;-1:-1:-1;;;;;;12172:21:0;;;12183:10;12172:21;;;;12200:15;:28;;;;;;;3633:58;;;;3678:5;3662:21;;-1:-1:-1;;3662:21:0;;;3633:58;12114:120;:::o;21550:230::-;3364:13;;;;;;;;:33;;;3381:16;:14;:16::i;:::-;3364:50;;;-1:-1:-1;3402:12:0;;;;3401:13;3364:50;3348:130;;;;-1:-1:-1;;;3348:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3487:19;3510:13;;;;;;3509:14;3530:85;;;;3559:13;:20;;-1:-1:-1;;;;3559:20:0;;;;;3588:19;3575:4;3588:19;;;3530:85;21773:1;21757:13;:17;3633:58;;;;3678:5;3662:21;;-1:-1:-1;;3662:21:0;;;21550:230;:::o;26468:73::-;26502:33;24984:42;25072;-1:-1:-1;;26502:33:0;:16;:33;:::i;:::-;26468:73::o;36279:437::-;36327:4;36363:13;;;:9;:13;;;;;36400;;;;36424;;36420:291;;36448:12;36463:25;36478:9;36463:14;:25::i;:::-;36513:1;36497:13;;;:17;36538:12;;36448:40;;-1:-1:-1;36538:27:0;;36555:9;36538:27;:16;:27;:::i;:::-;36523:12;:42;36587:10;;:23;;36602:7;36587:23;:14;:23;:::i;:::-;36574:10;:36;;;36624:25;;;;;;;36635:2;;36624:25;;;;;;;;;;36665:7;-1:-1:-1;36658:14:0;;-1:-1:-1;;36658:14:0;36420:291;36702:1;36695:8;;;;;;7615:106;7673:7;7704:1;7700;:5;:13;;7712:1;7700:13;;;-1:-1:-1;7708:1:0;;7693:20;-1:-1:-1;7615:106:0:o;35856:323::-;35913:20;35936:13;;;:9;:13;;;;;;35973:23;35988:7;35973:14;:23::i;:::-;36019:13;;;;35956:40;;-1:-1:-1;36019:28:0;;35956:40;36019:28;:17;:28;:::i;:::-;36003:13;;;:44;36069:12;;:27;;36086:9;36069:27;:16;:27;:::i;:::-;36054:12;:42;36116:10;;:23;;36131:7;36116:23;:14;:23;:::i;:::-;36103:10;:36;;;36151:22;;;;;;;36159:2;;36151:22;;;;;;;;;;35856:323;;;;:::o;27420:252::-;27492:25;:23;:25::i;:::-;27482:7;:35;27479:187;;;25072:42;-1:-1:-1;;;;;27519:28:0;;27548:72;27570:49;27617:1;25072:42;-1:-1:-1;;;;;27570:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27570:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27570:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27570:42:0;;:49;:46;:49;:::i;:::-;27548:17;:7;27560:4;27548:17;:11;:17;:::i;:72::-;27519:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27519:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27519:102:0;;;;27479:187;;;25072:42;-1:-1:-1;;;;;27633:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27633:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;23398:401:0;23647:51;;;-1:-1:-1;;;;;23647:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23647:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23636:63:0;;;;23594:12;;23608:17;;23636:10;;;;23647:51;23636:63;;;25:18:-1;23636:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23636:63:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23593:106:0;;;;23714:7;:57;;;;-1:-1:-1;23726:11:0;;:16;;:44;;;23757:4;23746:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23746:24:0;23726:44;23706:87;;;;;-1:-1:-1;;;23706:87:0;;;;;;;;;;;;-1:-1:-1;;;23706:87:0;;;;;;;;;;;;;;;23398:401;;;;;;:::o;24330:13775::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24330:13775:0;;;-1:-1:-1;24330:13775:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://40aca99730f75dc40a267ef72e96ef7485a4a5784546d57840c3d57715a6888a
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.