Overview
Max Total Supply
300,000 MGB
Holders
206 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MagicBalancer
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-02 */ /** ____ .'* *.' __/_*_*(_ / _______ \ _\_)/___\(_/_ / _((\- -/))_ \ \ \())(-)(()/ / ' \(((()))/ ' / ' \)).))/ ' \ / _ \ - | - /_ \ ( ( .;''';. .' ) _\"__ / )\ __"/_ \/ \ ' / \/ .' '...' ' ) / / | \ \ / . . . \ / . . \ / / | \ \ .' / b '. '. _.-' / Bb '-. '-._ _.-' | BBb '-. '-. (___________\____.dBBBb.________)____) ╔╦╗┌─┐┌─┐┬┌─┐ ╔╗ ┌─┐┬ ┌─┐┌┐┌┌─┐┌─┐┬─┐ ║║║├─┤│ ┬││ ╠╩╗├─┤│ ├─┤││││ ├┤ ├┬┘ ╩ ╩┴ ┴└─┘┴└─┘ ╚═╝┴ ┴┴─┘┴ ┴┘└┘└─┘└─┘┴└─ https://magicbalancer.org/ */ // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; constructor (uint256 totalSupply) public { _mint(_msgSender(),totalSupply); } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public { _burn(_msgSender(), amount); } /** * @dev See {ERC20-_burnFrom}. */ function burnFrom(address account, uint256 amount) public { _burnFrom(account, amount); } } // File: @openzeppelin/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } } // File: @openzeppelin/contracts/access/roles/WhitelistAdminRole.sol pragma solidity ^0.5.0; /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole is Context { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () internal { _addWhitelistAdmin(_msgSender()); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role"); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(_msgSender()); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } } // File: contracts/ERC20/ERC20TransferLiquidityLock.sol pragma solidity ^0.5.17; contract ERC20TransferLiquidityLock is ERC20 { using SafeMath for uint256; event Rebalance(uint256 tokenBurnt); event RewardLiquidityProviders(uint256 liquidityRewards); address public uniswapV2Router; address public uniswapV2Pair; address payable public treasury; address public PresaleAddress; address public bounce = 0x73282A63F0e3D7e9604575420F777361ecA3C86A; mapping(address => bool) feelessAddr; mapping(address => bool) unlocked; // the amount of tokens to lock for liquidity during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5% uint256 public liquidityLockDivisor; uint256 public callerRewardDivisor; uint256 public rebalanceDivisor; uint256 public minRebalanceAmount; uint256 public lastRebalance; uint256 public rebalanceInterval; uint256 public lpUnlocked; bool public locked; Balancer balancer; constructor() public { lastRebalance = block.timestamp; liquidityLockDivisor = 100; callerRewardDivisor = 25; rebalanceDivisor = 50; rebalanceInterval = 1 hours; lpUnlocked = block.timestamp + 90 days; minRebalanceAmount = 30 ether; treasury = msg.sender; balancer = new Balancer(treasury); feelessAddr[address(this)] = true; feelessAddr[address(balancer)] = true; feelessAddr[bounce] = true; feelessAddr[PresaleAddress] = true; locked = true; unlocked[address(this)] = true; unlocked[address(uniswapV2Router)] = true; unlocked[address(PresaleAddress)] = true; unlocked[msg.sender] = true; unlocked[bounce] = true; unlocked[address(balancer)] = true; } function _transfer(address from, address to, uint256 amount) internal { // calculate liquidity lock amount // dont transfer burn from this contract // or can never lock full lockable amount if(locked && unlocked[from] != true && unlocked[to] != true) revert("Tokens locked until end of presale"); if (liquidityLockDivisor != 0 && feelessAddr[from] == false && feelessAddr[to] == false) { uint256 liquidityLockAmount = amount.div(liquidityLockDivisor); super._transfer(from, address(this), liquidityLockAmount); super._transfer(from, to, amount.sub(liquidityLockAmount)); } else { super._transfer(from, to, amount); } } function () external payable {} function rebalanceLiquidity() public { require(balanceOf(msg.sender) >= minRebalanceAmount, "You are not part of the MagicBalancer."); require(block.timestamp > lastRebalance + rebalanceInterval, 'Try again after 1 hour'); lastRebalance = block.timestamp; // lockable supply is the token balance of this contract uint256 _lockableSupply = balanceOf(address(this)); _rewardLiquidityProviders(_lockableSupply); uint256 amountToRemove = ERC20(uniswapV2Pair).balanceOf(address(this)).div(rebalanceDivisor); // needed in case contract already owns eth remLiquidity(amountToRemove); uint _locked = balancer.rebalance(callerRewardDivisor); emit Rebalance(_locked); } function _rewardLiquidityProviders(uint256 liquidityRewards) private { super._transfer(address(this), uniswapV2Pair, liquidityRewards); IUniswapV2Pair(uniswapV2Pair).sync(); emit RewardLiquidityProviders(liquidityRewards); } function remLiquidity(uint256 lpAmount) private returns(uint ETHAmount) { ERC20(uniswapV2Pair).approve(uniswapV2Router, lpAmount); (ETHAmount) = IUniswapV2Router02(uniswapV2Router) .removeLiquidityETHSupportingFeeOnTransferTokens( address(this), lpAmount, 0, 0, address(balancer), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { _approve(address(this), uniswapV2Router, tokenAmount); IUniswapV2Router02(uniswapV2Router) .addLiquidityETH .value(ethAmount)( address(this), tokenAmount, 0, 0, address(this), block.timestamp ); } // returns token amount function lockableSupply() external view returns (uint256) { return balanceOf(address(this)); } // returns token amount function lockedSupply() external view returns (uint256) { uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply(); uint256 lpBalance = lockedLiquidity(); uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply); uint256 uniswapBalance = balanceOf(uniswapV2Pair); uint256 _lockedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12); return _lockedSupply; } // returns token amount function burnedSupply() external view returns (uint256) { uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply(); uint256 lpBalance = burnedLiquidity(); uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply); uint256 uniswapBalance = balanceOf(uniswapV2Pair); uint256 _burnedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12); return _burnedSupply; } // returns LP amount, not token amount function burnableLiquidity() public view returns (uint256) { return ERC20(uniswapV2Pair).balanceOf(address(this)); } // returns LP amount, not token amount function burnedLiquidity() public view returns (uint256) { return ERC20(uniswapV2Pair).balanceOf(address(0)); } // returns LP amount, not token amount function lockedLiquidity() public view returns (uint256) { return burnableLiquidity().add(burnedLiquidity()); } } // File: contracts/ERC20/ERC20Governance.sol pragma solidity ^0.5.17; contract ERC20Governance is ERC20, ERC20Detailed { using SafeMath for uint256; function _transfer(address from, address to, uint256 amount) internal { _moveDelegates(_delegates[from], _delegates[to], amount); super._transfer(from, to, amount); } function _mint(address account, uint256 amount) internal { _moveDelegates(address(0), _delegates[account], amount); super._mint(account, amount); } function _burn(address account, uint256 amount) internal { _moveDelegates(_delegates[account], address(0), amount); super._burn(account, amount); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "ERC20Governance::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "ERC20Governance::delegateBySig: invalid nonce"); require(now <= expiry, "ERC20Governance::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "ERC20Governance::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying ERC20Governances (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "ERC20Governance::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } pragma solidity ^0.5.17; contract Balancer { using SafeMath for uint256; MagicBalancer token; address public burnAddr = 0x000000000000000000000000000000000000dEaD; address payable public treasury; constructor(address payable treasury_) public { token = MagicBalancer(msg.sender); treasury = treasury_; } function () external payable {} function rebalance(uint callerRewardDivisor) external returns (uint256) { require(msg.sender == address(token), "only token"); swapEthForTokens(address(this).balance, callerRewardDivisor); uint256 lockableBalance = token.balanceOf(address(this)); uint256 callerReward = lockableBalance.div(callerRewardDivisor); token.transfer(tx.origin, callerReward); token.transfer(burnAddr, lockableBalance.sub(callerReward)); return lockableBalance.sub(callerReward); } function swapEthForTokens(uint256 EthAmount, uint callerRewardDivisor) private { address[] memory uniswapPairPath = new address[](2); uniswapPairPath[0] = IUniswapV2Router02(token.uniswapV2Router()).WETH(); uniswapPairPath[1] = address(token); uint256 treasuryAmount = EthAmount.div(callerRewardDivisor); treasury.transfer(treasuryAmount); token.approve(token.uniswapV2Router(), EthAmount); IUniswapV2Router02(token.uniswapV2Router()) .swapExactETHForTokensSupportingFeeOnTransferTokens.value(EthAmount.sub(treasuryAmount))( 0, uniswapPairPath, address(this), block.timestamp ); } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } interface IUniswapV2Router02 { function WETH() external pure returns (address); function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } interface IUniswapV2Pair { function sync() external; } contract MagicBalancer is ERC20(300e3 ether), ERC20Detailed("Magic Balancer", "MGB", 18), ERC20Burnable, // governance must be before transfer liquidity lock // or delegates are not updated correctly ERC20Governance, ERC20TransferLiquidityLock, WhitelistAdminRole { function setUniswapV2Pair(address _uniswapV2Pair) public onlyWhitelistAdmin { require(uniswapV2Pair == address(0), "MGBToken::setUniswapV2Pair: already set"); uniswapV2Pair = _uniswapV2Pair; } function setUniswapV2Router(address _uniswapV2Router) public onlyWhitelistAdmin { require(uniswapV2Router == address(0), "MGBToken::setUniswapV2Router: already set"); uniswapV2Router = _uniswapV2Router; } function setLiquidityLockDivisor(uint256 _liquidityLockDivisor) public onlyWhitelistAdmin { if (_liquidityLockDivisor != 0) { require(_liquidityLockDivisor >= 10, "MGBToken::setLiquidityLockDivisor: too small"); } liquidityLockDivisor = _liquidityLockDivisor; } function setRebalanceDivisor(uint256 _rebalanceDivisor) public onlyWhitelistAdmin { if (_rebalanceDivisor != 0) { require(_rebalanceDivisor >= 10, "MGBToken::setRebalanceDivisor: too small"); } rebalanceDivisor = _rebalanceDivisor; } function setRebalanceInterval(uint256 _interval) public onlyWhitelistAdmin { rebalanceInterval = _interval; } function setCallerRewardDivisior(uint256 _rewardDivisor) public onlyWhitelistAdmin { if (_rewardDivisor != 0) { require(_rewardDivisor >= 10, "MGBToken::setCallerRewardDivisor: too small"); } callerRewardDivisor = _rewardDivisor; } function setMinRebalanceAmount(uint256 amount_) public onlyWhitelistAdmin { minRebalanceAmount = amount_; } function setPresaleAddress(address _PresaleAddress) public onlyWhitelistAdmin { require(PresaleAddress == address(0), "MGBToken::PresaleAddress: already set"); PresaleAddress = _PresaleAddress; unlocked[_PresaleAddress] = !unlocked[_PresaleAddress]; feelessAddr[_PresaleAddress] = !feelessAddr[_PresaleAddress]; uint256 presaleAmount = 235000 ether; _transfer(address(treasury), address(_PresaleAddress), presaleAmount); } function unlockLP() public onlyWhitelistAdmin { require(now > lpUnlocked, "Not unlocked yet"); uint256 amount = IERC20(uniswapV2Pair).balanceOf(address(this)); IERC20(uniswapV2Pair).transfer(msg.sender, amount); } function toggleFeeless(address _addr) public onlyWhitelistAdmin { feelessAddr[_addr] = !feelessAddr[_addr]; } function toggleUnlockable(address _addr) public onlyWhitelistAdmin { unlocked[_addr] = !unlocked[_addr]; } function activateTrading() public onlyWhitelistAdmin { locked = false; } function createUniswapPair() public onlyWhitelistAdmin { uint256 amountTokenDesired = IERC20(address(this)).balanceOf(address(this)); uint amountETH = address(this).balance; _approve(address(this),address(uniswapV2Router), amountTokenDesired); IUniswapV2Router01(uniswapV2Router).addLiquidityETH.value(amountETH)( address(this), amountTokenDesired, 0, 0, address(this), now); } function MGBBalanceInUniswap(address _user) public view returns (uint256) { uint256 uniswapPairMGBBalance = balanceOf(address(uniswapV2Pair)); if (uniswapPairMGBBalance == 0) { return 0; } uint256 userLpBalance = ERC20(uniswapV2Pair).balanceOf(_user); if (userLpBalance == 0) { return 0; } uint256 userPercentOfLpOwned = userLpBalance.mul(1e12).div(ERC20(uniswapV2Pair).totalSupply()); return uniswapPairMGBBalance.mul(userPercentOfLpOwned).div(1e12); } function MGBBalanceAll(address _user) public view returns (uint256) { return balanceOf(_user).add(MGBBalanceInUniswap(_user)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRewards","type":"uint256"}],"name":"RewardLiquidityProviders","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":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"MGBBalanceAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"MGBBalanceInUniswap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PresaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activateTrading","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bounce","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"burnableLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"callerRewardDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"createUniswapPair","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidityLockDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lpUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minRebalanceAmount","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":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalanceLiquidity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardDivisor","type":"uint256"}],"name":"setCallerRewardDivisior","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_liquidityLockDivisor","type":"uint256"}],"name":"setLiquidityLockDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMinRebalanceAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_PresaleAddress","type":"address"}],"name":"setPresaleAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rebalanceDivisor","type":"uint256"}],"name":"setRebalanceDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setRebalanceInterval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"}],"name":"setUniswapV2Router","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":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleUnlockable","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlockLP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600e80546001600160a01b0319167373282a63f0e3d7e9604575420f777361eca3c86a17815560809081526d26b0b3b4b1902130b630b731b2b960911b60a052610100604052600360c09081526226a3a160e91b60e0526012693f870857a3e0e38000006200008a6200007a6001600160e01b036200027616565b826001600160e01b036200027b16565b508251620000a0906003906020860190620009af565b508151620000b6906004906020850190620009af565b506005805460ff90921660ff199092169190911790555050426015819055606460115560196012556032601355610e106016556276a700016017556801a055690d9db80000601455600c80546001600160a01b0319163317908190556040516001600160a01b0391909116906200012d9062000a34565b6001600160a01b03909116815260405190819003602001906000f0801580156200015b573d6000803e3d6000fd5b5060188054610100600160a81b0319166101006001600160a01b039384168102919091178255306000818152600f60209081526040808320805460ff1990811660019081179092558754879004891685528285208054821683179055600e80548a1686528386208054831684179055600d80548b16875284872080548416851790558954831684178a5596865260109094528285208054821683179055600a5489168552828520805482168317905594548816845281842080548616821790553384528184208054861682179055915487168352808320805485168317905594549390930490941684529190922080549091169091179055620002706200026162000276565b6001600160e01b03620002c616565b62000a5f565b335b90565b6001600160a01b03808316600090815260066020526040812054620002ab9216836001600160e01b036200031816565b620002c282826200049c60201b620042f51760201c565b5050565b620002e18160196200059d60201b62003ddf1790919060201c565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b816001600160a01b0316836001600160a01b0316141580156200033b5750600081115b1562000497576001600160a01b03831615620003ec576001600160a01b03831660009081526008602052604081205463ffffffff1690816200037f576000620003b1565b6001600160a01b038516600090815260076020908152604080832063ffffffff60001987011684529091529020600101545b90506000620003cf84836200062a60201b6200393b1790919060201c565b9050620003e8868484846001600160e01b036200067b16565b5050505b6001600160a01b0382161562000497576001600160a01b03821660009081526008602052604081205463ffffffff1690816200042a5760006200045c565b6001600160a01b038416600090815260076020908152604080832063ffffffff60001987011684529091529020600101545b905060006200047a8483620007ef60201b620032c21790919060201c565b905062000493858484846001600160e01b036200067b16565b5050505b505050565b6001600160a01b038216620004f8576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200051481600254620007ef60201b620032c21790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000547918390620032c2620007ef821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b620005b282826001600160e01b036200084a16565b1562000605576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006200067483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250620008b360201b60201c565b9392505050565b6000620006ab436040518060600160405280603f815260200162005ebb603f91396001600160e01b036200094e16565b905060008463ffffffff16118015620006f557506001600160a01b038516600090815260076020908152604080832063ffffffff6000198901811685529252909120548282169116145b1562000734576001600160a01b038516600090815260076020908152604080832063ffffffff60001989011684529091529020600101829055620007a5565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600784528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260089092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008282018381101562000674576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006001600160a01b038216620008935760405162461bcd60e51b815260040180806020018281038252602281526020018062005efa6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b60008184841115620009465760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200090a578181015183820152602001620008f0565b50505050905090810190601f168015620009385780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000816401000000008410620009a75760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156200090a578181015183820152602001620008f0565b509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620009f257805160ff191683800117855562000a22565b8280016001018555821562000a22579182015b8281111562000a2257825182559160200191906001019062000a05565b5062000a3092915062000a42565b5090565b610b2c806200538f83390190565b6200027891905b8082111562000a30576000815560010162000a49565b6149208062000a6f6000396000f3fe6080604052600436106103a15760003560e01c8063782d6fe1116101e7578063b91f3f971161010d578063dd62ed3e116100a0578063e7a324dc1161006f578063e7a324dc14610dfb578063e84354c514610e10578063f1127ed814610e25578063f953797314610e91576103a1565b8063dd62ed3e14610d74578063e161eb5614610dbc578063e5ec1d8c14610dd1578063e660c7aa14610de6576103a1565b8063ca5c7b91116100dc578063ca5c7b9114610d20578063cafab28914610d35578063cf30901214610d4a578063dc654a7314610d5f576103a1565b8063b91f3f9714610c2a578063bb5f747b14610c3f578063bdb9f28d14610c7f578063c3cda52014610cbf576103a1565b806395d89b4111610185578063a9059cbb11610154578063a9059cbb14610b65578063b439824414610bab578063b4b5ea5714610bc0578063b6833c5914610c00576103a1565b806395d89b4114610ab5578063a29a608914610aca578063a457c2d714610b0a578063a8a5550e14610b50576103a1565b80637ecebe00116101c15780637ecebe0014610a0b5780637f4aeb1a14610a4b578063858750ab14610a6057806393e98e7d14610a75576103a1565b8063782d6fe11461095557806379cc67901461099b5780637e0d943e146109e1576103a1565b806342966c68116102cc5780635c19a95c1161026a5780636fcfff45116102395780636fcfff451461083c57806370709a7c1461089557806370a08231146108d55780637362d9c814610915576103a1565b80635c19a95c1461077d57806361d027b3146107bd57806364ba8a50146107d257806367a9fca614610812576103a1565b80634c5a628c116102a65780634c5a628c146106e957806355d0a1d0146106fe578063587cde1e146107135780635b7dcaed14610753576103a1565b806342966c681461069557806349bd5a5e146106bf5780634a131672146106d4576103a1565b80631694505e1161034457806323b872dd1161031357806323b872dd146105bf5780632898cafa1461060f578063313ce56714610624578063395093511461064f576103a1565b80631694505e1461054257806316d1d9161461058057806318160ddd1461059557806320606b70146105aa576103a1565b8063095ea7b311610380578063095ea7b31461047e5780630bd05b69146104d8578063106b9ca1146104ed5780631419841d14610502576103a1565b80629a8130146103a357806302dd19d9146103cd57806306fdde03146103f4575b005b3480156103af57600080fd5b506103a1600480360360208110156103c657600080fd5b5035610ed1565b3480156103d957600080fd5b506103e2610f9b565b60408051918252519081900360200190f35b34801561040057600080fd5b50610409610fa1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044357818101518382015260200161042b565b50505050905090810190601f1680156104705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048a57600080fd5b506104c4600480360360408110156104a157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611055565b604080519115158252519081900360200190f35b3480156104e457600080fd5b506103a1611073565b3480156104f957600080fd5b506103e26110fd565b34801561050e57600080fd5b506103a16004803603602081101561052557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611103565b34801561054e57600080fd5b50610557611219565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561058c57600080fd5b506103e2611235565b3480156105a157600080fd5b506103e261123b565b3480156105b657600080fd5b506103e2611241565b3480156105cb57600080fd5b506104c4600480360360608110156105e257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561125c565b34801561061b57600080fd5b506103e2611303565b34801561063057600080fd5b506106396113a8565b6040805160ff9092168252519081900360200190f35b34801561065b57600080fd5b506104c46004803603604081101561067257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356113b1565b3480156106a157600080fd5b506103a1600480360360208110156106b857600080fd5b5035611412565b3480156106cb57600080fd5b50610557611426565b3480156106e057600080fd5b506103a1611442565b3480156106f557600080fd5b506103a1611618565b34801561070a57600080fd5b506103e261162a565b34801561071f57600080fd5b506105576004803603602081101561073657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611745565b34801561075f57600080fd5b506103a16004803603602081101561077657600080fd5b5035611773565b34801561078957600080fd5b506103a1600480360360208110156107a057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117d8565b3480156107c957600080fd5b506105576117e2565b3480156107de57600080fd5b506103e2600480360360208110156107f557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117fe565b34801561081e57600080fd5b506103a16004803603602081101561083557600080fd5b5035611821565b34801561084857600080fd5b5061087c6004803603602081101561085f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118e6565b6040805163ffffffff9092168252519081900360200190f35b3480156108a157600080fd5b506103a1600480360360208110156108b857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118fe565b3480156108e157600080fd5b506103e2600480360360208110156108f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119b2565b34801561092157600080fd5b506103a16004803603602081101561093857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119da565b34801561096157600080fd5b506103e26004803603604081101561097857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a43565b3480156109a757600080fd5b506103a1600480360360408110156109be57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d0d565b3480156109ed57600080fd5b506103a160048036036020811015610a0457600080fd5b5035611d1b565b348015610a1757600080fd5b506103e260048036036020811015610a2e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611de0565b348015610a5757600080fd5b506103a1611df2565b348015610a6c57600080fd5b506103e2612087565b348015610a8157600080fd5b506103e260048036036020811015610a9857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166120f8565b348015610ac157600080fd5b506104096122b7565b348015610ad657600080fd5b506103a160048036036020811015610aed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612336565b348015610b1657600080fd5b506104c460048036036040811015610b2d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561244c565b348015610b5c57600080fd5b506103e26124c7565b348015610b7157600080fd5b506104c460048036036040811015610b8857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356124d7565b348015610bb757600080fd5b506103e26124eb565b348015610bcc57600080fd5b506103e260048036036020811015610be357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612500565b348015610c0c57600080fd5b506103a160048036036020811015610c2357600080fd5b503561259c565b348015610c3657600080fd5b506103a1612601565b348015610c4b57600080fd5b506104c460048036036020811015610c6257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661281a565b348015610c8b57600080fd5b506103a160048036036020811015610ca257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661282d565b348015610ccb57600080fd5b506103a1600480360360c0811015610ce257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060408101359060ff6060820135169060808101359060a001356129b3565b348015610d2c57600080fd5b506103e2612d0f565b348015610d4157600080fd5b506103e2612db2565b348015610d5657600080fd5b506104c4612db8565b348015610d6b57600080fd5b506103e2612dc1565b348015610d8057600080fd5b506103e260048036036040811015610d9757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612dc7565b348015610dc857600080fd5b506103e2612dff565b348015610ddd57600080fd5b50610557612e05565b348015610df257600080fd5b50610557612e21565b348015610e0757600080fd5b506103e2612e3d565b348015610e1c57600080fd5b506103e2612e58565b348015610e3157600080fd5b50610e7160048036036040811015610e4857600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff16612e5e565b6040805163ffffffff909316835260208301919091528051918290030190f35b348015610e9d57600080fd5b506103a160048036036020811015610eb457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e8b565b610ee1610edc612f3f565b61281a565b610f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015610f9657600a811015610f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061471d602b913960400191505060405180910390fd5b601255565b60125481565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b5050505050905090565b6000611069611062612f3f565b8484612f43565b5060015b92915050565b61107e610edc612f3f565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60155481565b61110e610edc612f3f565b611163576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff16156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806144e16029913960400191505060405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b60025490565b60405180604361460b82396043019050604051809103902081565b600061126984848461308a565b6112f984611275612f3f565b6112f48560405180606001604052806028815260200161466f6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600160205260408120906112c0612f3f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054919063ffffffff61321116565b612f43565b5060019392505050565b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081526000600482018190529151919273ffffffffffffffffffffffffffffffffffffffff16916370a0823191602480820192602092909190829003018186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d60208110156113a157600080fd5b5051905090565b60055460ff1690565b60006110696113be612f3f565b846112f485600160006113cf612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6132c216565b61142361141d612f3f565b82613336565b50565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b61144d610edc612f3f565b6114a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190529151600092916370a08231916024808301926020929190829003018186803b1580156114fc57600080fd5b505afa158015611510573d6000803e3d6000fd5b505050506040513d602081101561152657600080fd5b5051600a54909150479061155290309073ffffffffffffffffffffffffffffffffffffffff1684612f43565b600a54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b1580156115e757600080fd5b505af11580156115fb573d6000803e3d6000fd5b50505050506040513d606081101561161257600080fd5b50505050565b611628611623612f3f565b613373565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d60208110156116bf57600080fd5b5051905060006116cd611303565b905060006116f6836116ea8464e8d4a5100063ffffffff6133c816565b9063ffffffff61343b16565b600b5490915060009061171e9073ffffffffffffffffffffffffffffffffffffffff166119b2565b9050600061173b64e8d4a510006116ea848663ffffffff6133c816565b9550505050505090565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260066020526040902054165b919050565b61177e610edc612f3f565b6117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601655565b611423338261347d565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b600061106d61180c836120f8565b611815846119b2565b9063ffffffff6132c216565b61182c610edc612f3f565b611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b80156118e157600a8110156118e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061457f602c913960400191505060405180910390fd5b601155565b60086020526000908152604090205463ffffffff1681565b611909610edc612f3f565b61195e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6119e5610edc612f3f565b611a3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b6114238161353e565b6000438210611a9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147bf6032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205463ffffffff1680611ad857600091505061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310611b9d5773ffffffffffffffffffffffffffffffffffffffff841660009081526007602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff1683529290522060010154905061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832083805290915290205463ffffffff16831015611be557600091505061106d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff161115611cc957600282820363ffffffff16048103611c356142de565b5073ffffffffffffffffffffffffffffffffffffffff8716600090815260076020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415611ca45760200151945061106d9350505050565b805163ffffffff16871115611cbb57819350611cc2565b6001820392505b5050611c0b565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff9094168352929052206001015491505092915050565b611d178282613593565b5050565b611d26610edc612f3f565b611d7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015611ddb57600a811015611ddb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145306028913960400191505060405180910390fd5b601355565b60096020526000908152604090205481565b601454611dfe336119b2565b1015611e55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b601654601554014211611ec957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f54727920616761696e206166746572203120686f757200000000000000000000604482015290519081900360640190fd5b426015556000611ed8306119b2565b9050611ee3816135f4565b601354600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600093611f9893909273ffffffffffffffffffffffffffffffffffffffff909116916370a0823191602480820192602092909190829003018186803b158015611f6057600080fd5b505afa158015611f74573d6000803e3d6000fd5b505050506040513d6020811015611f8a57600080fd5b50519063ffffffff61343b16565b9050611fa3816136d2565b50601854601254604080517ff4993018000000000000000000000000000000000000000000000000000000008152600481019290925251600092610100900473ffffffffffffffffffffffffffffffffffffffff169163f499301891602480830192602092919082900301818787803b15801561201f57600080fd5b505af1158015612033573d6000803e3d6000fd5b505050506040513d602081101561204957600080fd5b50516040805182815290519192507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0919081900360200190a1505050565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561137757600080fd5b600b54600090819061211f9073ffffffffffffffffffffffffffffffffffffffff166119b2565b90508061213057600091505061176e565b600b54604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156121a757600080fd5b505afa1580156121bb573d6000803e3d6000fd5b505050506040513d60208110156121d157600080fd5b50519050806121e55760009250505061176e565b6000612293600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225257600080fd5b505afa158015612266573d6000803e3d6000fd5b505050506040513d602081101561227c57600080fd5b50516116ea8464e8d4a5100063ffffffff6133c816565b90506122ae64e8d4a510006116ea858463ffffffff6133c816565b95945050505050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b612341610edc612f3f565b612396576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600b5473ffffffffffffffffffffffffffffffffffffffff1615612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806145586027913960400191505060405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611069612459612f3f565b846112f4856040518060600160405280602581526020016148c76025913960016000612483612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61321116565b60006124d2306119b2565b905090565b60006110696124e4612f3f565b848461308a565b60006124d26124f8611303565b611815612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604081205463ffffffff1680612538576000612595565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86011684529091529020600101545b9392505050565b6125a7610edc612f3f565b6125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601455565b61260c610edc612f3f565b612661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b60175442116126d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d602081101561276c57600080fd5b5051600b54604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff9091169163a9059cbb916044808201926020929091908290030181600087803b1580156127eb57600080fd5b505af11580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b505050565b600061106d60198363ffffffff61385216565b612838610edc612f3f565b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600d5473ffffffffffffffffffffffffffffffffffffffff16156128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148426025913960400191505060405180910390fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092556000908152601060209081526040808320805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0092831617909255600f909352922080549283161592909116919091179055600c546931c3602284a35ce0000091611d179116838361308a565b6000604051808061460b60439139604301905060405180910390206129d6610fa1565b805190602001206129e56138ed565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019450505050506040516020818303038152906040528051906020012090506000604051808061488d603a91396040805191829003603a01822060208084019190915273ffffffffffffffffffffffffffffffffffffffff8c1683830152606083018b905260808084018b90528251808503909101815260a0840183528051908201207f190100000000000000000000000000000000000000000000000000000000000060c085015260c2840187905260e2808501829052835180860390910181526101028501808552815191840191909120600091829052610122860180865281905260ff8c1661014287015261016286018b905261018286018a9052935191965092945091926001926101a280830193927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301929081900390910190855afa158015612b83573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061448e6031913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090208054600181019091558914612c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614815602d913960400191505060405180910390fd5b87421115612cf8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806147486031913960400191505060405180910390fd5b612d02818b61347d565b505050505b505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7a57600080fd5b505afa158015612d8e573d6000803e3d6000fd5b505050506040513d6020811015612da457600080fd5b5051905060006116cd6124eb565b60175481565b60185460ff1681565b60115481565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60135481565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60405180603a61488d8239603a019050604051809103902081565b60145481565b60076020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b612e96610edc612f3f565b612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806147f16024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661301b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144bf6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60185460ff1680156130c7575073ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604090205460ff161515600114155b80156130fe575073ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604090205460ff161515600114155b15613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061446c6022913960400191505060405180910390fd5b6011541580159061318b575073ffffffffffffffffffffffffffffffffffffffff83166000908152600f602052604090205460ff16155b80156131bd575073ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604090205460ff16155b156132065760006131d96011548361343b90919063ffffffff16565b90506131e68430836138f1565b61320084846131fb858563ffffffff61393b16565b6138f1565b50612815565b6128158383836138f1565b600081848411156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561327f578181015183820152602001613267565b50505050905090810190601f1680156132ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561259557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660205260408120546133699216908361397d565b611d178282613b6a565b61338460198263ffffffff613cb416565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6000826133d75750600061106d565b828202828482816133e457fe5b0414612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061464e6021913960400191505060405180910390fd5b600061259583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d60565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260066020526040812054909116906134b1846119b2565b73ffffffffffffffffffffffffffffffffffffffff85811660008181526006602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461161282848361397d565b61354f60198263ffffffff613ddf16565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b61359d8282613336565b611d17826135a9612f3f565b6112f4846040518060600160405280602481526020016146f96024913973ffffffffffffffffffffffffffffffffffffffff88166000908152600160205260408120906112c0612f3f565b600b5461361990309073ffffffffffffffffffffffffffffffffffffffff16836138f1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b600b54600a54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561375457600080fd5b505af1158015613768573d6000803e3d6000fd5b505050506040513d602081101561377e57600080fd5b5050600a54601854604080517faf2979eb000000000000000000000000000000000000000000000000000000008152306004820152602481018690526000604482018190526064820181905273ffffffffffffffffffffffffffffffffffffffff610100909404841660848301524260a48301529151929093169263af2979eb9260c48083019360209383900390910190829087803b15801561382057600080fd5b505af1158015613834573d6000803e3d6000fd5b505050506040513d602081101561384a57600080fd5b505192915050565b600073ffffffffffffffffffffffffffffffffffffffff82166138c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806146976022913960400191505060405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b4690565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660205260408082205485841683529120546139309291821691168361397d565b612815838383613ea5565b600061259583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613211565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156139b95750600081115b156128155773ffffffffffffffffffffffffffffffffffffffff831615613a965773ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604081205463ffffffff169081613a13576000613a70565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613a84828563ffffffff61393b16565b9050613a9286848484614076565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156128155773ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205463ffffffff169081613aeb576000613b48565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613b5c828563ffffffff6132c216565b9050612d0785848484614076565b73ffffffffffffffffffffffffffffffffffffffff8216613bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147796021913960400191505060405180910390fd5b613c268160405180606001604052806022815260200161444a6022913973ffffffffffffffffffffffffffffffffffffffff8516600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902055600254613c5f908263ffffffff61393b16565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b613cbe8282613852565b613d13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806145ab6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60008183613dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b506000838581613dd557fe5b0495945050505050565b613de98282613852565b15613e5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8316613f11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061479a6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613f7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806144276023913960400191505060405180910390fd5b613fcd8160405180606001604052806026815260200161450a6026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220939093559084168152205461400f908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061409a436040518060600160405280603f81526020016145cc603f9139614266565b905060008463ffffffff1611801561410e575073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b156141765773ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901168452909152902060010182905561420f565b60408051808201825263ffffffff8084168252602080830186815273ffffffffffffffffffffffffffffffffffffffff8a166000818152600784528681208b861682528452868120955186549086167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000918216178755925160019687015590815260089092529390208054928801909116919092161790555b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff8816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b509192915050565b604080518082019091526000808252602082015290565b73ffffffffffffffffffffffffffffffffffffffff821661437757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461438a908263ffffffff6132c216565b60025573ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546143c3908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365546f6b656e73206c6f636b656420756e74696c20656e64206f662070726573616c654552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f20616464726573734d4742546f6b656e3a3a736574556e69737761705632526f757465723a20616c72656164792073657445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d4742546f6b656e3a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c4d4742546f6b656e3a3a736574556e69737761705632506169723a20616c7265616479207365744d4742546f6b656e3a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c654552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654d4742546f6b656e3a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c4552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e63654d4742546f6b656e3a3a50726573616c65416464726573733a20616c726561647920736574596f7520617265206e6f742070617274206f6620746865204d6167696342616c616e6365722e44656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e74323536206578706972792945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7f447ea7fa44adcb96a924f5f5f0fc97c5212181445f67f1a6ed49a96a50f0a64736f6c634300051100326080604052600180546001600160a01b03191661dead17905534801561002457600080fd5b50604051610b2c380380610b2c8339818101604052602081101561004757600080fd5b5051600080546001600160a01b03199081163317909155600280546001600160a01b0390931692909116919091179055610aa6806100866000396000f3fe6080604052600436106100345760003560e01c806361d027b314610036578063d246d41114610074578063f499301814610089575b005b34801561004257600080fd5b5061004b6100c5565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561008057600080fd5b5061004b6100e1565b34801561009557600080fd5b506100b3600480360360208110156100ac57600080fd5b50356100fd565b60408051918252519081900360200190f35b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461018457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c7920746f6b656e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b61018e47836103cf565b60008054604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561020057600080fd5b505afa158015610214573d6000803e3d6000fd5b505050506040513d602081101561022a57600080fd5b505190506000610240828563ffffffff6108b616565b60008054604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815232600482015260248101859052905193945073ffffffffffffffffffffffffffffffffffffffff9091169263a9059cbb92604480840193602093929083900390910190829087803b1580156102bf57600080fd5b505af11580156102d3573d6000803e3d6000fd5b505050506040513d60208110156102e957600080fd5b505060005460015473ffffffffffffffffffffffffffffffffffffffff9182169163a9059cbb9116610321858563ffffffff6108ff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561038a57600080fd5b505af115801561039e573d6000803e3d6000fd5b505050506040513d60208110156103b457600080fd5b506103c79050828263ffffffff6108ff16565b949350505050565b60408051600280825260608083018452926020830190803883395050600054604080517f1694505e000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff90911692631694505e92506004808301926020929190829003018186803b15801561045957600080fd5b505afa15801561046d573d6000803e3d6000fd5b505050506040513d602081101561048357600080fd5b5051604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163ad5c464891600480820192602092909190829003018186803b1580156104ed57600080fd5b505afa158015610501573d6000803e3d6000fd5b505050506040513d602081101561051757600080fd5b50518151829060009061052657fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260005482519116908290600190811061055e57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526000610595848463ffffffff6108b616565b60025460405191925073ffffffffffffffffffffffffffffffffffffffff169082156108fc029083906000818181858888f193505050501580156105dd573d6000803e3d6000fd5b50600054604080517f1694505e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163095ea7b3918391631694505e91600480820192602092909190829003018186803b15801561065157600080fd5b505afa158015610665573d6000803e3d6000fd5b505050506040513d602081101561067b57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9092166004830152602482018890525160448083019260209291908290030181600087803b1580156106f057600080fd5b505af1158015610704573d6000803e3d6000fd5b505050506040513d602081101561071a57600080fd5b5050600054604080517f1694505e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691631694505e91600480820192602092909190829003018186803b15801561078757600080fd5b505afa15801561079b573d6000803e3d6000fd5b505050506040513d60208110156107b157600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1663b6f9de956107de868463ffffffff6108ff16565b60008530426040518663ffffffff1660e01b815260040180858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610870578181015183820152602001610858565b50505050905001955050505050506000604051808303818588803b15801561089757600080fd5b505af11580156108ab573d6000803e3d6000fd5b505050505050505050565b60006108f883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610941565b9392505050565b60006108f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506109fd565b600081836109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109ac578181015183820152602001610994565b50505050905090810190601f1680156109d95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816109f357fe5b0495945050505050565b60008184841115610a69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156109ac578181015183820152602001610994565b50505090039056fea265627a7a723158200aeb11da21a81715086ddcfae7ce8d1948dfd031ebf68fbcaceb6ef13fbbe3aa64736f6c634300051100324552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373
Deployed Bytecode
0x6080604052600436106103a15760003560e01c8063782d6fe1116101e7578063b91f3f971161010d578063dd62ed3e116100a0578063e7a324dc1161006f578063e7a324dc14610dfb578063e84354c514610e10578063f1127ed814610e25578063f953797314610e91576103a1565b8063dd62ed3e14610d74578063e161eb5614610dbc578063e5ec1d8c14610dd1578063e660c7aa14610de6576103a1565b8063ca5c7b91116100dc578063ca5c7b9114610d20578063cafab28914610d35578063cf30901214610d4a578063dc654a7314610d5f576103a1565b8063b91f3f9714610c2a578063bb5f747b14610c3f578063bdb9f28d14610c7f578063c3cda52014610cbf576103a1565b806395d89b4111610185578063a9059cbb11610154578063a9059cbb14610b65578063b439824414610bab578063b4b5ea5714610bc0578063b6833c5914610c00576103a1565b806395d89b4114610ab5578063a29a608914610aca578063a457c2d714610b0a578063a8a5550e14610b50576103a1565b80637ecebe00116101c15780637ecebe0014610a0b5780637f4aeb1a14610a4b578063858750ab14610a6057806393e98e7d14610a75576103a1565b8063782d6fe11461095557806379cc67901461099b5780637e0d943e146109e1576103a1565b806342966c68116102cc5780635c19a95c1161026a5780636fcfff45116102395780636fcfff451461083c57806370709a7c1461089557806370a08231146108d55780637362d9c814610915576103a1565b80635c19a95c1461077d57806361d027b3146107bd57806364ba8a50146107d257806367a9fca614610812576103a1565b80634c5a628c116102a65780634c5a628c146106e957806355d0a1d0146106fe578063587cde1e146107135780635b7dcaed14610753576103a1565b806342966c681461069557806349bd5a5e146106bf5780634a131672146106d4576103a1565b80631694505e1161034457806323b872dd1161031357806323b872dd146105bf5780632898cafa1461060f578063313ce56714610624578063395093511461064f576103a1565b80631694505e1461054257806316d1d9161461058057806318160ddd1461059557806320606b70146105aa576103a1565b8063095ea7b311610380578063095ea7b31461047e5780630bd05b69146104d8578063106b9ca1146104ed5780631419841d14610502576103a1565b80629a8130146103a357806302dd19d9146103cd57806306fdde03146103f4575b005b3480156103af57600080fd5b506103a1600480360360208110156103c657600080fd5b5035610ed1565b3480156103d957600080fd5b506103e2610f9b565b60408051918252519081900360200190f35b34801561040057600080fd5b50610409610fa1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044357818101518382015260200161042b565b50505050905090810190601f1680156104705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048a57600080fd5b506104c4600480360360408110156104a157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611055565b604080519115158252519081900360200190f35b3480156104e457600080fd5b506103a1611073565b3480156104f957600080fd5b506103e26110fd565b34801561050e57600080fd5b506103a16004803603602081101561052557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611103565b34801561054e57600080fd5b50610557611219565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561058c57600080fd5b506103e2611235565b3480156105a157600080fd5b506103e261123b565b3480156105b657600080fd5b506103e2611241565b3480156105cb57600080fd5b506104c4600480360360608110156105e257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561125c565b34801561061b57600080fd5b506103e2611303565b34801561063057600080fd5b506106396113a8565b6040805160ff9092168252519081900360200190f35b34801561065b57600080fd5b506104c46004803603604081101561067257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356113b1565b3480156106a157600080fd5b506103a1600480360360208110156106b857600080fd5b5035611412565b3480156106cb57600080fd5b50610557611426565b3480156106e057600080fd5b506103a1611442565b3480156106f557600080fd5b506103a1611618565b34801561070a57600080fd5b506103e261162a565b34801561071f57600080fd5b506105576004803603602081101561073657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611745565b34801561075f57600080fd5b506103a16004803603602081101561077657600080fd5b5035611773565b34801561078957600080fd5b506103a1600480360360208110156107a057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117d8565b3480156107c957600080fd5b506105576117e2565b3480156107de57600080fd5b506103e2600480360360208110156107f557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117fe565b34801561081e57600080fd5b506103a16004803603602081101561083557600080fd5b5035611821565b34801561084857600080fd5b5061087c6004803603602081101561085f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118e6565b6040805163ffffffff9092168252519081900360200190f35b3480156108a157600080fd5b506103a1600480360360208110156108b857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118fe565b3480156108e157600080fd5b506103e2600480360360208110156108f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119b2565b34801561092157600080fd5b506103a16004803603602081101561093857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119da565b34801561096157600080fd5b506103e26004803603604081101561097857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a43565b3480156109a757600080fd5b506103a1600480360360408110156109be57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d0d565b3480156109ed57600080fd5b506103a160048036036020811015610a0457600080fd5b5035611d1b565b348015610a1757600080fd5b506103e260048036036020811015610a2e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611de0565b348015610a5757600080fd5b506103a1611df2565b348015610a6c57600080fd5b506103e2612087565b348015610a8157600080fd5b506103e260048036036020811015610a9857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166120f8565b348015610ac157600080fd5b506104096122b7565b348015610ad657600080fd5b506103a160048036036020811015610aed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612336565b348015610b1657600080fd5b506104c460048036036040811015610b2d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561244c565b348015610b5c57600080fd5b506103e26124c7565b348015610b7157600080fd5b506104c460048036036040811015610b8857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356124d7565b348015610bb757600080fd5b506103e26124eb565b348015610bcc57600080fd5b506103e260048036036020811015610be357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612500565b348015610c0c57600080fd5b506103a160048036036020811015610c2357600080fd5b503561259c565b348015610c3657600080fd5b506103a1612601565b348015610c4b57600080fd5b506104c460048036036020811015610c6257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661281a565b348015610c8b57600080fd5b506103a160048036036020811015610ca257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661282d565b348015610ccb57600080fd5b506103a1600480360360c0811015610ce257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060408101359060ff6060820135169060808101359060a001356129b3565b348015610d2c57600080fd5b506103e2612d0f565b348015610d4157600080fd5b506103e2612db2565b348015610d5657600080fd5b506104c4612db8565b348015610d6b57600080fd5b506103e2612dc1565b348015610d8057600080fd5b506103e260048036036040811015610d9757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612dc7565b348015610dc857600080fd5b506103e2612dff565b348015610ddd57600080fd5b50610557612e05565b348015610df257600080fd5b50610557612e21565b348015610e0757600080fd5b506103e2612e3d565b348015610e1c57600080fd5b506103e2612e58565b348015610e3157600080fd5b50610e7160048036036040811015610e4857600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff16612e5e565b6040805163ffffffff909316835260208301919091528051918290030190f35b348015610e9d57600080fd5b506103a160048036036020811015610eb457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e8b565b610ee1610edc612f3f565b61281a565b610f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015610f9657600a811015610f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061471d602b913960400191505060405180910390fd5b601255565b60125481565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b5050505050905090565b6000611069611062612f3f565b8484612f43565b5060015b92915050565b61107e610edc612f3f565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60155481565b61110e610edc612f3f565b611163576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff16156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806144e16029913960400191505060405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b60025490565b60405180604361460b82396043019050604051809103902081565b600061126984848461308a565b6112f984611275612f3f565b6112f48560405180606001604052806028815260200161466f6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600160205260408120906112c0612f3f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054919063ffffffff61321116565b612f43565b5060019392505050565b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081526000600482018190529151919273ffffffffffffffffffffffffffffffffffffffff16916370a0823191602480820192602092909190829003018186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d60208110156113a157600080fd5b5051905090565b60055460ff1690565b60006110696113be612f3f565b846112f485600160006113cf612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6132c216565b61142361141d612f3f565b82613336565b50565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b61144d610edc612f3f565b6114a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190529151600092916370a08231916024808301926020929190829003018186803b1580156114fc57600080fd5b505afa158015611510573d6000803e3d6000fd5b505050506040513d602081101561152657600080fd5b5051600a54909150479061155290309073ffffffffffffffffffffffffffffffffffffffff1684612f43565b600a54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b1580156115e757600080fd5b505af11580156115fb573d6000803e3d6000fd5b50505050506040513d606081101561161257600080fd5b50505050565b611628611623612f3f565b613373565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d60208110156116bf57600080fd5b5051905060006116cd611303565b905060006116f6836116ea8464e8d4a5100063ffffffff6133c816565b9063ffffffff61343b16565b600b5490915060009061171e9073ffffffffffffffffffffffffffffffffffffffff166119b2565b9050600061173b64e8d4a510006116ea848663ffffffff6133c816565b9550505050505090565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260066020526040902054165b919050565b61177e610edc612f3f565b6117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601655565b611423338261347d565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b600061106d61180c836120f8565b611815846119b2565b9063ffffffff6132c216565b61182c610edc612f3f565b611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b80156118e157600a8110156118e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061457f602c913960400191505060405180910390fd5b601155565b60086020526000908152604090205463ffffffff1681565b611909610edc612f3f565b61195e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6119e5610edc612f3f565b611a3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b6114238161353e565b6000438210611a9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147bf6032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205463ffffffff1680611ad857600091505061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310611b9d5773ffffffffffffffffffffffffffffffffffffffff841660009081526007602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff1683529290522060010154905061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832083805290915290205463ffffffff16831015611be557600091505061106d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff161115611cc957600282820363ffffffff16048103611c356142de565b5073ffffffffffffffffffffffffffffffffffffffff8716600090815260076020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415611ca45760200151945061106d9350505050565b805163ffffffff16871115611cbb57819350611cc2565b6001820392505b5050611c0b565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff9094168352929052206001015491505092915050565b611d178282613593565b5050565b611d26610edc612f3f565b611d7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015611ddb57600a811015611ddb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145306028913960400191505060405180910390fd5b601355565b60096020526000908152604090205481565b601454611dfe336119b2565b1015611e55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b601654601554014211611ec957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f54727920616761696e206166746572203120686f757200000000000000000000604482015290519081900360640190fd5b426015556000611ed8306119b2565b9050611ee3816135f4565b601354600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600093611f9893909273ffffffffffffffffffffffffffffffffffffffff909116916370a0823191602480820192602092909190829003018186803b158015611f6057600080fd5b505afa158015611f74573d6000803e3d6000fd5b505050506040513d6020811015611f8a57600080fd5b50519063ffffffff61343b16565b9050611fa3816136d2565b50601854601254604080517ff4993018000000000000000000000000000000000000000000000000000000008152600481019290925251600092610100900473ffffffffffffffffffffffffffffffffffffffff169163f499301891602480830192602092919082900301818787803b15801561201f57600080fd5b505af1158015612033573d6000803e3d6000fd5b505050506040513d602081101561204957600080fd5b50516040805182815290519192507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0919081900360200190a1505050565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561137757600080fd5b600b54600090819061211f9073ffffffffffffffffffffffffffffffffffffffff166119b2565b90508061213057600091505061176e565b600b54604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156121a757600080fd5b505afa1580156121bb573d6000803e3d6000fd5b505050506040513d60208110156121d157600080fd5b50519050806121e55760009250505061176e565b6000612293600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225257600080fd5b505afa158015612266573d6000803e3d6000fd5b505050506040513d602081101561227c57600080fd5b50516116ea8464e8d4a5100063ffffffff6133c816565b90506122ae64e8d4a510006116ea858463ffffffff6133c816565b95945050505050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b612341610edc612f3f565b612396576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600b5473ffffffffffffffffffffffffffffffffffffffff1615612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806145586027913960400191505060405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611069612459612f3f565b846112f4856040518060600160405280602581526020016148c76025913960016000612483612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61321116565b60006124d2306119b2565b905090565b60006110696124e4612f3f565b848461308a565b60006124d26124f8611303565b611815612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604081205463ffffffff1680612538576000612595565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86011684529091529020600101545b9392505050565b6125a7610edc612f3f565b6125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601455565b61260c610edc612f3f565b612661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b60175442116126d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d602081101561276c57600080fd5b5051600b54604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff9091169163a9059cbb916044808201926020929091908290030181600087803b1580156127eb57600080fd5b505af11580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b505050565b600061106d60198363ffffffff61385216565b612838610edc612f3f565b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600d5473ffffffffffffffffffffffffffffffffffffffff16156128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148426025913960400191505060405180910390fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092556000908152601060209081526040808320805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0092831617909255600f909352922080549283161592909116919091179055600c546931c3602284a35ce0000091611d179116838361308a565b6000604051808061460b60439139604301905060405180910390206129d6610fa1565b805190602001206129e56138ed565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019450505050506040516020818303038152906040528051906020012090506000604051808061488d603a91396040805191829003603a01822060208084019190915273ffffffffffffffffffffffffffffffffffffffff8c1683830152606083018b905260808084018b90528251808503909101815260a0840183528051908201207f190100000000000000000000000000000000000000000000000000000000000060c085015260c2840187905260e2808501829052835180860390910181526101028501808552815191840191909120600091829052610122860180865281905260ff8c1661014287015261016286018b905261018286018a9052935191965092945091926001926101a280830193927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301929081900390910190855afa158015612b83573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061448e6031913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090208054600181019091558914612c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614815602d913960400191505060405180910390fd5b87421115612cf8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806147486031913960400191505060405180910390fd5b612d02818b61347d565b505050505b505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7a57600080fd5b505afa158015612d8e573d6000803e3d6000fd5b505050506040513d6020811015612da457600080fd5b5051905060006116cd6124eb565b60175481565b60185460ff1681565b60115481565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60135481565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60405180603a61488d8239603a019050604051809103902081565b60145481565b60076020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b612e96610edc612f3f565b612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806147f16024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661301b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144bf6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60185460ff1680156130c7575073ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604090205460ff161515600114155b80156130fe575073ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604090205460ff161515600114155b15613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061446c6022913960400191505060405180910390fd5b6011541580159061318b575073ffffffffffffffffffffffffffffffffffffffff83166000908152600f602052604090205460ff16155b80156131bd575073ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604090205460ff16155b156132065760006131d96011548361343b90919063ffffffff16565b90506131e68430836138f1565b61320084846131fb858563ffffffff61393b16565b6138f1565b50612815565b6128158383836138f1565b600081848411156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561327f578181015183820152602001613267565b50505050905090810190601f1680156132ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561259557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660205260408120546133699216908361397d565b611d178282613b6a565b61338460198263ffffffff613cb416565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6000826133d75750600061106d565b828202828482816133e457fe5b0414612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061464e6021913960400191505060405180910390fd5b600061259583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d60565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260066020526040812054909116906134b1846119b2565b73ffffffffffffffffffffffffffffffffffffffff85811660008181526006602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461161282848361397d565b61354f60198263ffffffff613ddf16565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b61359d8282613336565b611d17826135a9612f3f565b6112f4846040518060600160405280602481526020016146f96024913973ffffffffffffffffffffffffffffffffffffffff88166000908152600160205260408120906112c0612f3f565b600b5461361990309073ffffffffffffffffffffffffffffffffffffffff16836138f1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b600b54600a54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561375457600080fd5b505af1158015613768573d6000803e3d6000fd5b505050506040513d602081101561377e57600080fd5b5050600a54601854604080517faf2979eb000000000000000000000000000000000000000000000000000000008152306004820152602481018690526000604482018190526064820181905273ffffffffffffffffffffffffffffffffffffffff610100909404841660848301524260a48301529151929093169263af2979eb9260c48083019360209383900390910190829087803b15801561382057600080fd5b505af1158015613834573d6000803e3d6000fd5b505050506040513d602081101561384a57600080fd5b505192915050565b600073ffffffffffffffffffffffffffffffffffffffff82166138c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806146976022913960400191505060405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b4690565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660205260408082205485841683529120546139309291821691168361397d565b612815838383613ea5565b600061259583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613211565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156139b95750600081115b156128155773ffffffffffffffffffffffffffffffffffffffff831615613a965773ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604081205463ffffffff169081613a13576000613a70565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613a84828563ffffffff61393b16565b9050613a9286848484614076565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156128155773ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205463ffffffff169081613aeb576000613b48565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613b5c828563ffffffff6132c216565b9050612d0785848484614076565b73ffffffffffffffffffffffffffffffffffffffff8216613bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147796021913960400191505060405180910390fd5b613c268160405180606001604052806022815260200161444a6022913973ffffffffffffffffffffffffffffffffffffffff8516600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902055600254613c5f908263ffffffff61393b16565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b613cbe8282613852565b613d13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806145ab6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60008183613dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b506000838581613dd557fe5b0495945050505050565b613de98282613852565b15613e5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8316613f11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061479a6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613f7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806144276023913960400191505060405180910390fd5b613fcd8160405180606001604052806026815260200161450a6026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220939093559084168152205461400f908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061409a436040518060600160405280603f81526020016145cc603f9139614266565b905060008463ffffffff1611801561410e575073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b156141765773ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901168452909152902060010182905561420f565b60408051808201825263ffffffff8084168252602080830186815273ffffffffffffffffffffffffffffffffffffffff8a166000818152600784528681208b861682528452868120955186549086167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000918216178755925160019687015590815260089092529390208054928801909116919092161790555b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff8816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b509192915050565b604080518082019091526000808252602082015290565b73ffffffffffffffffffffffffffffffffffffffff821661437757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461438a908263ffffffff6132c216565b60025573ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546143c3908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365546f6b656e73206c6f636b656420756e74696c20656e64206f662070726573616c654552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f20616464726573734d4742546f6b656e3a3a736574556e69737761705632526f757465723a20616c72656164792073657445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d4742546f6b656e3a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c4d4742546f6b656e3a3a736574556e69737761705632506169723a20616c7265616479207365744d4742546f6b656e3a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c654552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654d4742546f6b656e3a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c4552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e63654d4742546f6b656e3a3a50726573616c65416464726573733a20616c726561647920736574596f7520617265206e6f742070617274206f6620746865204d6167696342616c616e6365722e44656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e74323536206578706972792945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7f447ea7fa44adcb96a924f5f5f0fc97c5212181445f67f1a6ed49a96a50f0a64736f6c63430005110032
Deployed Bytecode Sourcemap
43562:4294:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45094:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45094:284:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45094:284:0;;:::i;24588:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24588:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;21495:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21495:83:0;;;:::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;21495:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13250:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13250:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13250:152:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46541:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46541:86:0;;;:::i;24707:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24707:28:0;;;:::i;44108:227::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44108:227:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44108:227:0;;;;:::i;24130:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24130:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24742:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24742:32:0;;;:::i;12271:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12271:91:0;;;:::i;31900:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31900:122:0;;;:::i;13874:304::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13874:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13874:304:0;;;;;;;;;;;;;;;;;;:::i;29861:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29861:125:0;;;:::i;22347:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22347:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14587:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14587:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14587:210:0;;;;;;;;;:::i;19457:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19457:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19457:83:0;;:::i;24167:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24167:28:0;;;:::i;46639:496::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46639:496:0;;;:::i;23425:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23425:95:0;;;:::i;29184:443::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29184:443:0;;;:::i;32883:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32883:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32883:149:0;;;;:::i;44959:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44959:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44959:123:0;;:::i;33176:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33176:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33176:104:0;;;;:::i;24202:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24202:31:0;;;:::i;47711:142::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47711:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47711:142:0;;;;:::i;44347:306::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44347:306:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44347:306:0;;:::i;31778:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31778:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31778:49:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46273:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46273:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46273:123:0;;;;:::i;12425:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12425:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12425:110:0;;;;:::i;23301:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23301:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23301:116:0;;;;:::i;35812:1264::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35812:1264:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35812:1264:0;;;;;;;;;:::i;19602:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19602:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19602:103:0;;;;;;;;;:::i;44661:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44661:286:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44661:286:0;;:::i;32314:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32314:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32314:39:0;;;;:::i;26543:785::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26543:785:0;;;:::i;29679:130::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29679:130:0;;;:::i;47147:556::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47147:556:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47147:556:0;;;;:::i;21697:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21697:87:0;;;:::i;43881:215::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43881:215:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43881:215:0;;;;:::i;15300:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15300:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15300:261:0;;;;;;;;;:::i;28559:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28559:108:0;;;:::i;12748:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12748:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12748:158:0;;;;;;;;;:::i;30038:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30038:125:0;;;:::i;35126:255::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35126:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35126:255:0;;;;:::i;45390:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45390:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45390:121:0;;:::i;46016:245::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46016:245:0;;;:::i;23168:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23168:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23168:125:0;;;;:::i;45523:481::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45523:481:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45523:481:0;;;;:::i;33714:1211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33714:1211:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;33714:1211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28704:443::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28704:443:0;;;:::i;24781:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24781:25:0;;;:::i;24813:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24813:18:0;;;:::i;24546:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24546:35:0;;;:::i;12969:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12969:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12969:134:0;;;;;;;;;;;:::i;24629:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24629:31:0;;;:::i;24276:66::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24276:66:0;;;:::i;24240:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24240:29:0;;;:::i;32116:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32116:117:0;;;:::i;24667:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24667:33:0;;;:::i;31639:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31639:70:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31639:70:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;46408:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46408:120:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46408:120:0;;;;:::i;45094:284::-;23041:30;23058:12;:10;:12::i;:::-;23041:16;:30::i;:::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45192:19;;45188:128;;45254:2;45236:14;:20;;45228:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45334:19;:36;45094:284::o;24588:34::-;;;;:::o;21495:83::-;21565:5;21558:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21532:13;;21558:12;;21565:5;;21558:12;;21565:5;21558:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21495:83;:::o;13250:152::-;13316:4;13333:39;13342:12;:10;:12::i;:::-;13356:7;13365:6;13333:8;:39::i;:::-;-1:-1:-1;13390:4:0;13250:152;;;;;:::o;46541:86::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46605:6;:14;;;;;;46541:86::o;24707:28::-;;;;:::o;44108:227::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44207:15;;:29;:15;:29;44199:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44293:15;:34;;;;;;;;;;;;;;;44108:227::o;24130:30::-;;;;;;:::o;24742:32::-;;;;:::o;12271:91::-;12342:12;;12271:91;:::o;31900:122::-;31942:80;;;;;;;;;;;;;;;;;;31900:122;:::o;13874:304::-;13963:4;13980:36;13990:6;13998:9;14009:6;13980:9;:36::i;:::-;14027:121;14036:6;14044:12;:10;:12::i;:::-;14058:89;14096:6;14058:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;14078:12;:10;:12::i;:::-;14058:33;;;;;;;;;;;;;-1:-1:-1;14058:33:0;;;:89;;:37;:89;:::i;:::-;14027:8;:121::i;:::-;-1:-1:-1;14166:4:0;13874:304;;;;;:::o;29861:125::-;29942:13;;29936:42;;;;;;29909:7;29936:42;;;;;;;;29909:7;;29942:13;;;29936:30;;:42;;;;;;;;;;;;;;;29942:13;29936:42;;;5:2:-1;;;;30:1;27;20:12;5:2;29936:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29936:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29936:42:0;;-1:-1:-1;29861:125:0;:::o;22347:83::-;22413:9;;;;22347:83;:::o;14587:210::-;14667:4;14684:83;14693:12;:10;:12::i;:::-;14707:7;14716:50;14755:10;14716:11;:25;14728:12;:10;:12::i;:::-;14716:25;;;;;;;;;;;;;;;;;;-1:-1:-1;14716:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;19457:83::-;19505:27;19511:12;:10;:12::i;:::-;19525:6;19505:5;:27::i;:::-;19457:83;:::o;24167:28::-;;;;;;:::o;46639:496::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46734:46;;;;;;46749:4;46734:46;;;;;;;;46705:26;;46749:4;46734:31;;:46;;;;;;;;;;;;;;46749:4;46734:46;;;5:2:-1;;;;30:1;27;20:12;5:2;46734:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46734:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46734:46:0;46871:15;;46734:46;;-1:-1:-1;46808:21:0;;46840:68;;46857:4;;46871:15;;46734:46;46840:8;:68::i;:::-;46938:15;;46919:208;;;;;;47010:4;46919:208;;;;;;;;;;;;46938:15;46919:208;;;;;;;;;;;;;;47123:3;46919:208;;;;;;46938:15;;;;;46919:51;;46977:9;;46919:208;;;;;;;;;;;;;;46977:9;46938:15;46919:208;;;5:2:-1;;;;30:1;27;20:12;5:2;46919:208:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46919:208:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;46639:496:0:o;23425:95::-;23477:35;23499:12;:10;:12::i;:::-;23477:21;:35::i;:::-;23425:95::o;29184:443::-;29231:7;29251:21;29281:13;;;;;;;;;;;29275:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29275:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29275:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29275:34:0;;-1:-1:-1;29320:17:0;29340;:15;:17::i;:::-;29320:37;-1:-1:-1;29368:30:0;29401:38;29425:13;29401:19;29320:37;29415:4;29401:19;:13;:19;:::i;:::-;:23;:38;:23;:38;:::i;:::-;29487:13;;29368:71;;-1:-1:-1;29452:22:0;;29477:24;;29487:13;;29477:9;:24::i;:::-;29452:49;-1:-1:-1;29512:21:0;29536:52;29583:4;29536:42;29452:49;29555:22;29536:42;:18;:42;:::i;:52::-;29512:76;-1:-1:-1;;;;;;29184:443:0;:::o;32883:149::-;33003:21;;;;32971:7;33003:21;;;:10;:21;;;;;;;32883:149;;;;:::o;44959:123::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45045:17;:29;44959:123::o;33176:104::-;33240:32;33250:10;33262:9;33240;:32::i;24202:31::-;;;;;;:::o;47711:142::-;47770:7;47797:48;47818:26;47838:5;47818:19;:26::i;:::-;47797:16;47807:5;47797:9;:16::i;:::-;:20;:48;:20;:48;:::i;44347:306::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44452:26;;44448:143;;44528:2;44503:21;:27;;44495:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44601:20;:44;44347:306::o;31778:49::-;;;;;;;;;;;;;;;:::o;46273:123::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46370:18;;;;;;:11;:18;;;;;;;46348:40;;;46370:18;;;;46369:19;46348:40;;;46273:123::o;12425:110::-;12509:18;;12482:7;12509:18;;;;;;;;;;;;12425:110::o;23301:116::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23382:27;23401:7;23382:18;:27::i;35812:1264::-;35920:7;35967:12;35953:11;:26;35945:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36069:23;;;36047:19;36069:23;;;:14;:23;;;;;;;;36107:17;36103:58;;36148:1;36141:8;;;;;36103:58;36221:20;;;;;;;:11;:20;;;;;;;;:38;36242:16;;;36221:38;;;;;;;;;:48;;:63;-1:-1:-1;36217:147:0;;36308:20;;;;;;;:11;:20;;;;;;;;36329:16;;;;;36308:38;;;;;;;;36344:1;36308:44;;;-1:-1:-1;36301:51:0;;36217:147;36425:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;36421:88:0;;;36496:1;36489:8;;;;;36421:88;36521:12;36563:16;;;36590:428;36605:5;36597:13;;:5;:13;;;36590:428;;;36669:1;36652:13;;;36651:19;;;36643:27;;36712:20;;:::i;:::-;-1:-1:-1;36735:20:0;;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;36712:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36782:27;;36778:229;;;36837:8;;;;-1:-1:-1;36830:15:0;;-1:-1:-1;;;;36830:15:0;36778:229;36871:12;;:26;;;-1:-1:-1;36867:140:0;;;36926:6;36918:14;;36867:140;;;36990:1;36981:6;:10;36973:18;;36867:140;36590:428;;;;;-1:-1:-1;37035:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;35812:1264:0;;;;:::o;19602:103::-;19671:26;19681:7;19690:6;19671:9;:26::i;:::-;19602:103;;:::o;44661:286::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44758:22;;44754:131;;44826:2;44805:17;:23;;44797:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44903:16;:36;44661:286::o;32314:39::-;;;;;;;;;;;;;:::o;26543:785::-;26624:18;;26599:21;26609:10;26599:9;:21::i;:::-;:43;;26591:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26738:17;;26722:13;;:33;26704:15;:51;26696:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26809:15;26793:13;:31;26901:23;26927:24;26945:4;26927:9;:24::i;:::-;26901:50;;26962:42;26988:15;26962:25;:42::i;:::-;27100:16;;27056:13;;27050:45;;;;;;27089:4;27050:45;;;;;;27025:22;;27050:67;;27100:16;;27056:13;;;;;27050:30;;:45;;;;;;;;;;;;;;;27056:13;27050:45;;;5:2:-1;;;;30:1;27;20:12;5:2;27050:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27050:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27050:45:0;;:67;:49;:67;:::i;:::-;27025:92;;27191:28;27204:14;27191:12;:28::i;:::-;-1:-1:-1;27245:8:0;;27264:19;;27245:39;;;;;;;;;;;;;;-1:-1:-1;;27245:8:0;;;;;;:18;;:39;;;;;;;;;;;;;;-1:-1:-1;27245:8:0;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;27245:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27245:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27245:39:0;27302:18;;;;;;;;27245:39;;-1:-1:-1;27302:18:0;;;;;;27245:39;27302:18;;;26543:785;;;:::o;29679:130::-;29762:13;;29756:45;;;;;;29795:4;29756:45;;;;;;29729:7;;29762:13;;;29756:30;;:45;;;;;;;;;;;;;;29762:13;29756:45;;;5:2:-1;;;;30:1;27;20:12;47147:556:0;47282:13;;47212:7;;;;47264:33;;47282:13;;47264:9;:33::i;:::-;47232:65;-1:-1:-1;47312:26:0;47308:67;;47362:1;47355:8;;;;;47308:67;47415:13;;47409:37;;;;;;47415:13;47409:37;;;;;;;;;47385:21;;47415:13;;;;;47409:30;;:37;;;;;;;;;;;;;;;47415:13;47409:37;;;5:2:-1;;;;30:1;27;20:12;5:2;47409:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47409:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47409:37:0;;-1:-1:-1;47461:18:0;47457:59;;47503:1;47496:8;;;;;;47457:59;47526:28;47557:63;47591:13;;;;;;;;;;;47585:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47585:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47585:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47585:34:0;47557:23;:13;47575:4;47557:23;:17;:23;:::i;:63::-;47526:94;-1:-1:-1;47638:57:0;47690:4;47638:47;:21;47526:94;47638:47;:25;:47;:::i;:57::-;47631:64;47147:556;-1:-1:-1;;;;;47147:556:0:o;21697:87::-;21769:7;21762:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21736:13;;21762:14;;21769:7;;21762:14;;21769:7;21762:14;;;;;;;;;;;;;;;;;;;;;;;;43881:215;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43976:13;;:27;:13;:27;43968:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44058:13;:30;;;;;;;;;;;;;;;43881:215::o;15300:261::-;15385:4;15402:129;15411:12;:10;:12::i;:::-;15425:7;15434:96;15473:15;15434:96;;;;;;;;;;;;;;;;;:11;:25;15446:12;:10;:12::i;:::-;15434:25;;;;;;;;;;;;;;;;;;-1:-1:-1;15434:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;28559:108::-;28608:7;28635:24;28653:4;28635:9;:24::i;:::-;28628:31;;28559:108;:::o;12748:158::-;12817:4;12834:42;12844:12;:10;:12::i;:::-;12858:9;12869:6;12834:9;:42::i;30038:125::-;30086:7;30113:42;30137:17;:15;:17::i;:::-;30113:19;:17;:19::i;35126:255::-;35265:23;;;35218:7;35265:23;;;:14;:23;;;;;;;;35306:16;:67;;35372:1;35306:67;;;35325:20;;;;;;;:11;:20;;;;;;;;:38;35346:16;;;35325:38;;;;;;;;35361:1;35325:44;;35306:67;35299:74;35126:255;-1:-1:-1;;;35126:255:0:o;45390:121::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45475:18;:28;45390:121::o;46016:245::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46087:10;;46081:3;:16;46073:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46153:13;;46146:46;;;;;;46186:4;46146:46;;;;;;46129:14;;46153:13;;;46146:31;;:46;;;;;;;;;;;;;;46153:13;46146:46;;;5:2:-1;;;;30:1;27;20:12;5:2;46146:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46146:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46146:46:0;46210:13;;46203:50;;;;;;46234:10;46203:50;;;;;;;;;;;;46146:46;;-1:-1:-1;46210:13:0;;;;;46203:30;;:50;;;;;46146:46;;46203:50;;;;;;;;46210:13;;46203:50;;;5:2:-1;;;;30:1;27;20:12;5:2;46203:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46203:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;46016:245:0:o;23168:125::-;23232:4;23256:29;:16;23277:7;23256:29;:20;:29;:::i;45523:481::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45620:14;;:28;:14;:28;45612:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45701:14;:32;;;;;;;;;;;;;;-1:-1:-1;45773:25:0;;;:8;:25;;;;;;;;;;;;;;45772:26;45744:54;;;;;;;;45841:11;:28;;;;;;;;;;45840:29;45809:60;;;;;;;;;;45945:8;;45904:12;;45927:69;;45945:8;45701:32;45904:12;45927:9;:69::i;33714:1211::-;33907:23;31942:80;;;;;;;;;;;;;;;;;;;34036:6;:4;:6::i;:::-;34020:24;;;;;;34063:12;:10;:12::i;:::-;34102:4;33957:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33957:165:0;;;33933:200;;;;;;33907:226;;34146:18;32162:71;;;;;;;;;;;;;;;;;;;34191:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;34191:140:0;;;;;34167:175;;;;;;34396:123;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;34396:123:0;;;;;;34372:158;;;;;;;;;-1:-1:-1;34563:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34167:175;;-1:-1:-1;34372:158:0;;-1:-1:-1;;;34563:26:0;;;;;;;34191:140;-1:-1:-1;34563:26:0;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;34563:26:0;;;;;;-1:-1:-1;;34608:23:0;;;34600:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34713:17;;;;;;;:6;:17;;;;;:19;;;;;;;;34704:28;;34696:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34808:6;34801:3;:13;;34793:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34886:31;34896:9;34907;34886;:31::i;:::-;34879:38;;;;33714:1211;;;;;;;:::o;28704:443::-;28751:7;28771:21;28801:13;;;;;;;;;;;28795:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28795:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28795:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28795:34:0;;-1:-1:-1;28840:17:0;28860;:15;:17::i;24781:25::-;;;;:::o;24813:18::-;;;;;;:::o;24546:35::-;;;;:::o;12969:134::-;13068:18;;;;13041:7;13068:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12969:134::o;24629:31::-;;;;:::o;24276:66::-;;;;;;:::o;24240:29::-;;;;;;:::o;32116:117::-;32162:71;;;;;;;;;;;;;;;;;;32116:117;:::o;24667:33::-;;;;:::o;31639:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46408:120::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46505:15;;;;;;:8;:15;;;;;;;46486:34;;;46505:15;;;;46504:16;46486:34;;;46408:120::o;1883:98::-;1963:10;1883:98;:::o;18231:338::-;18325:19;;;18317:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18404:21;;;18396:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18477:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18529:32;;;;;;;;;;;;;;;;;18231:338;;;:::o;25720:774::-;25949:6;;;;:32;;;;-1:-1:-1;25959:14:0;;;;;;;:8;:14;;;;;;;;:22;;:14;:22;;25949:32;:56;;;;-1:-1:-1;25985:12:0;;;;;;;:8;:12;;;;;;;;:20;;:12;:20;;25949:56;25946:118;;;26020:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25946:118;26093:20;;:25;;;;:55;;-1:-1:-1;26122:17:0;;;;;;;:11;:17;;;;;;;;:26;26093:55;:83;;;;-1:-1:-1;26152:15:0;;;;;;;:11;:15;;;;;;;;:24;26093:83;26089:398;;;26193:27;26223:32;26234:20;;26223:6;:10;;:32;;;;:::i;:::-;26193:62;;26270:57;26286:4;26300;26307:19;26270:15;:57::i;:::-;26342:58;26358:4;26364:2;26368:31;:6;26379:19;26368:31;:10;:31;:::i;:::-;26342:15;:58::i;:::-;26089:398;;;;26442:33;26458:4;26464:2;26468:6;26442:15;:33::i;6943:192::-;7029:7;7065:12;7057:6;;;;7049:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7049:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7101:5:0;;;6943:192::o;6014:181::-;6072:7;6104:5;;;6128:6;;;;6120:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30712:170;30795:19;;;;;;;;:10;:19;;;;;;30780:55;;30795:19;;30828:6;30780:14;:55::i;:::-;30846:28;30858:7;30867:6;30846:11;:28::i;23682:154::-;23750:32;:16;23774:7;23750:32;:23;:32;:::i;:::-;23798:30;;;;;;;;;;;23682:154;:::o;7386:471::-;7444:7;7689:6;7685:47;;-1:-1:-1;7719:1:0;7712:8;;7685:47;7756:5;;;7760:1;7756;:5;:1;7780:5;;;;;:10;7772:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8325:132;8383:7;8410:39;8414:1;8417;8410:39;;;;;;;;;;;;;;;;;:3;:39::i;37084:449::-;37201:21;;;;37175:23;37201:21;;;:10;:21;;;;;;;;;;37260:20;37212:9;37260;:20::i;:::-;37347:21;;;;;;;;:10;:21;;;;;;:33;;;;;;;;;;;;;37398:54;;37233:47;;-1:-1:-1;37347:33:0;37398:54;;;;;;37347:21;37398:54;37465:60;37480:15;37497:9;37508:16;37465:14;:60::i;23528:146::-;23593:29;:16;23614:7;23593:29;:20;:29;:::i;:::-;23638:28;;;;;;;;;;;23528:146;:::o;18755:232::-;18827:22;18833:7;18842:6;18827:5;:22::i;:::-;18860:119;18869:7;18878:12;:10;:12::i;:::-;18892:86;18931:6;18892:86;;;;;;;;;;;;;;;;;:20;;;;;;;:11;:20;;;;;;18913:12;:10;:12::i;27336:282::-;27455:13;;27424:63;;27448:4;;27455:13;;27470:16;27424:15;:63::i;:::-;27517:13;;;;;;;;;;;27502:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27502:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27558:42:0;;;;;;;;;;-1:-1:-1;27558:42:0;;;;;;;-1:-1:-1;27558:42:0;27336:282;:::o;27626:452::-;27715:13;;27738:15;;27709:55;;;;;;27715:13;27738:15;;;27709:55;;;;;;;;;;;;27682:14;;27715:13;;;;;27709:28;;:55;;;;;;;;;;;;;;;27682:14;27715:13;27709:55;;;5:2:-1;;;;30:1;27;20:12;5:2;27709:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27709:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;27808:15:0;;28012:8;;27789:281;;;;;;27913:4;27789:281;;;;;;;;;;-1:-1:-1;27789:281:0;;;;;;;;;;;;27808:15;;28012:8;;;;;27789:281;;;;28040:15;27789:281;;;;;;27808:15;;;;;27789:97;;:281;;;;;27709:55;;27789:281;;;;;;;;;27808:15;27789:281;;;5:2:-1;;;;30:1;27;20:12;5:2;27789:281:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27789:281:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27789:281:0;;27626:452;-1:-1:-1;;27626:452:0:o;20575:203::-;20647:4;20672:21;;;20664:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20750:20:0;;:11;:20;;;;;;;;;;;;;;;20575:203::o;39388:153::-;39498:9;39388:153;:::o;30337:189::-;30433:16;;;;;;;;:10;:16;;;;;;;30451:14;;;;;;;;30418:56;;30433:16;;;;30451:14;30467:6;30418:14;:56::i;:::-;30485:33;30501:4;30507:2;30511:6;30485:15;:33::i;6470:136::-;6528:7;6555:43;6559:1;6562;6555:43;;;;;;;;;;;;;;;;;:3;:43::i;37541:947::-;37647:6;37637:16;;:6;:16;;;;:30;;;;;37666:1;37657:6;:10;37637:30;37633:848;;;37688:20;;;;37684:385;;37796:22;;;37777:16;37796:22;;;:14;:22;;;;;;;;;37857:13;:60;;37916:1;37857:60;;;37873:19;;;;;;;:11;:19;;;;;;;;:34;37893:13;;;37873:34;;;;;;;;37905:1;37873:40;;37857:60;37837:80;-1:-1:-1;37936:17:0;37956:21;37837:80;37970:6;37956:21;:13;:21;:::i;:::-;37936:41;;37996:57;38013:6;38021:9;38032;38043;37996:16;:57::i;:::-;37684:385;;;;38089:20;;;;38085:385;;38197:22;;;38178:16;38197:22;;;:14;:22;;;;;;;;;38258:13;:60;;38317:1;38258:60;;;38274:19;;;;;;;:11;:19;;;;;;;;:34;38294:13;;;38274:34;;;;;;;;38306:1;38274:40;;38258:60;38238:80;-1:-1:-1;38337:17:0;38357:21;38238:80;38371:6;38357:21;:13;:21;:::i;:::-;38337:41;;38397:57;38414:6;38422:9;38433;38444;38397:16;:57::i;17443:348::-;17519:21;;;17511:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17612:68;17635:6;17612:68;;;;;;;;;;;;;;;;;:18;;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;17591:18;;;:9;:18;;;;;;;;;;:89;17706:12;;:24;;17723:6;17706:24;:16;:24;:::i;:::-;17691:12;:39;17746:37;;;;;;;;17772:1;;17746:37;;;;;;;;;;;;;17443:348;;:::o;20297:183::-;20377:18;20381:4;20387:7;20377:3;:18::i;:::-;20369:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20444:20;;20467:5;20444:20;;;;;;;;;;;:28;;;;;;20297:183::o;8987:345::-;9073:7;9175:12;9168:5;9160:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9160:28:0;;9199:9;9215:1;9211;:5;;;;;;;8987:345;-1:-1:-1;;;;;8987:345:0:o;20039:178::-;20117:18;20121:4;20127:7;20117:3;:18::i;:::-;20116:19;20108:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20182:20;;:11;:20;;;;;;;;;;;:27;;;;20205:4;20182:27;;;20039:178::o;16051:471::-;16149:20;;;16141:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16230:23;;;16222:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16326;16348:6;16326:71;;;;;;;;;;;;;;;;;:17;;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;16306:17;;;;:9;:17;;;;;;;;;;;:91;;;;16431:20;;;;;;;:32;;16456:6;16431:32;:24;:32;:::i;:::-;16408:20;;;;:9;:20;;;;;;;;;;;;:55;;;;16479:35;;;;;;;16408:20;;16479:35;;;;;;;;;;;;;16051:471;;;:::o;38496:715::-;38675:18;38696:87;38703:12;38696:87;;;;;;;;;;;;;;;;;:6;:87::i;:::-;38675:108;;38815:1;38800:12;:16;;;:85;;;;-1:-1:-1;38820:22:0;;;;;;;:11;:22;;;;;;;;:65;38843:16;;;38820:40;;;;;;;;;:50;:65;;;:50;;:65;38800:85;38796:339;;;38902:22;;;;;;;:11;:22;;;;;;;;:40;38925:16;;;38902:40;;;;;;;;38940:1;38902:46;:57;;;38796:339;;;39031:33;;;;;;;;;;;;;;;;;;;;;38992:22;;;-1:-1:-1;38992:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;39079:25;;;:14;:25;;;;;;:44;;39107:16;;;39079:44;;;;;;;;;;38796:339;39152:51;;;;;;;;;;;;;;;;;;;;;;;;;;38496:715;;;;;:::o;39219:161::-;39294:6;39332:12;39325:5;39321:9;;39313:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;39313:32:0;-1:-1:-1;39370:1:0;;39219:161;-1:-1:-1;;39219:161:0:o;43562:4294::-;;;;;;;;;;-1:-1:-1;43562:4294:0;;;;;;;;:::o;16803:308::-;16879:21;;;16871:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16964:12;;:24;;16981:6;16964:24;:16;:24;:::i;:::-;16949:12;:39;17020:18;;;:9;:18;;;;;;;;;;;:30;;17043:6;17020:30;:22;:30;:::i;:::-;16999:18;;;:9;:18;;;;;;;;;;;:51;;;;17066:37;;;;;;;16999:18;;:9;;17066:37;;;;;;;;;;16803:308;;:::o
Swarm Source
bzzr://0aeb11da21a81715086ddcfae7ce8d1948dfd031ebf68fbcaceb6ef13fbbe3aa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.