Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000 RAM
Holders
35
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
17,717,974.991642311881322242 RAMValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RAM
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-26 */ /** * * TG: https://t.me/RAMportal * Web: https://rugat1m.tech * Twitter: https://twitter.com/rugat1m * * Reward: USDC * Reward requirements: 1% holding (10,000,000 $RAM) * Reward address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 * * Lottery wallet to track grand prize: 0x469328e1B5E0226BE17907A290d6a2e19E7CCbeb */ //SPDX-License-Identifier: MIT pragma solidity 0.8.9; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } 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); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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. This is the value {ERC20} uses, unless this function is * overridden; * * 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 virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override 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 virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override 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 virtual override 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 virtual 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 virtual 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 virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _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: * * - `account` cannot be the zero address. */ function createInitialSupply(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _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 virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _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 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 virtual { 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 Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns(uint256); } interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns(uint256); /// @notice Distributes ether to token holders as dividends. /// @dev SHOULD distribute the paid ether to token holders as dividends. /// SHOULD NOT directly transfer ether to token holders in this function. /// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0. function distributeDividends() external payable; /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed( address indexed from, uint256 weiAmount ); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn( address indexed to, uint256 weiAmount ); } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); 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); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; address public constant token = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); // USDC // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping (address => uint256) public holderBalance; uint256 public totalBalance; uint256 public totalDividendsDistributed; /// @dev Distributes dividends whenever ether is paid to this contract. receive() external payable { distributeDividends(); } /// @notice Distributes ether to token holders as dividends. /// @dev It reverts if the total supply of tokens is 0. /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0. /// About undistributed ether: /// In each distribution, there is a small amount of ether not distributed, /// the magnified amount of which is /// `(msg.value * magnitude) % totalSupply()`. /// With a well-chosen `magnitude`, the amount of undistributed ether /// (de-magnified) in a distribution can be less than 1 wei. /// We can actually keep track of the undistributed ether in a distribution /// and try to distribute it in the next distribution, /// but keeping track of such data on-chain costs much more than /// the saved ether, so we don't do that. function distributeDividends() public override payable { require(false, "Cannot send BNB directly to tracker as it is unrecoverable"); // } function distributeTokenDividends(uint256 amount) public onlyOwner { require(totalBalance > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalBalance ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); bool success = IERC20(token).transfer(user, _withdrawableDividend); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns(uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns(uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns(uint256) { return magnifiedDividendPerShare.mul(holderBalance[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } /// @dev Internal function that increases tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _increase(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } /// @dev Internal function that reduces an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _reduce(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = holderBalance[account]; holderBalance[account] = newBalance; if(newBalance > currentBalance) { uint256 increaseAmount = newBalance.sub(currentBalance); _increase(account, increaseAmount); totalBalance += increaseAmount; } else if(newBalance < currentBalance) { uint256 reduceAmount = currentBalance.sub(newBalance); _reduce(account, reduceAmount); totalBalance -= reduceAmount; } } } contract RAM is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public immutable uniswapV2Pair; bool private swapping; DividendTracker public dividendTracker; address public marketingWallet; address public constant token = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); // USDC uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; uint256 public liquidityActiveBlock = 0; // 0 means liquidity is not active yet uint256 public tradingActiveBlock = 0; // 0 means trading is not active uint256 public earlyBuyPenaltyEnd; // determines when snipers/bots can sell without extra penalty bool public limitsInEffect = true; bool public tradingActive = true; bool public swapEnabled = true; // Anti-bot and anti-whale mappings and variables mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch bool public transferDelayEnabled = false; uint256 public totalSellFees; uint256 public rewardsSellFee; uint256 public marketingSellFee; uint256 public liquiditySellFee; uint256 public totalBuyFees; uint256 public rewardsBuyFee; uint256 public marketingBuyFee; uint256 public liquidityBuyFee; uint256 public tokensForRewards; uint256 public tokensFormarketing; uint256 public tokensForLiquidity; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 200000; /******************/ // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; mapping (address => bool) public _isExcludedMaxTransactionAmount; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) public automatedMarketMakerPairs; event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event marketingMultiplierActive(uint256 duration); event BoughtEarly(address indexed sniper); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends( uint256 tokensSwapped, uint256 amount ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() ERC20("Rug At 1 Million", "RAM") { address newOwner = address(0x7282755d74d9e7098A7770Cc06ABC57270A97784); uint256 totalSupply = 1_000_000_000 * 10**18; maxTransactionAmount = totalSupply * 2 / 100; // 2% max transaction swapTokensAtAmount = totalSupply * 1 / 10000; // 0.01% swap tokens amount maxWallet = totalSupply * 2 / 100; // 3% max wallet rewardsSellFee = 2; marketingSellFee = 9; //2% BuyBack&Burn + Marketing (Which splits as 50% DAO/Lottery , 50% marketing) liquiditySellFee = 1; totalSellFees = rewardsSellFee + marketingSellFee + liquiditySellFee; rewardsBuyFee = 2; marketingBuyFee = 9; //2% BuyBack&Burn + Marketing (Which splits as 50% DAO/Lottery , 50% marketing) liquidityBuyFee = 1; totalBuyFees = rewardsBuyFee + marketingBuyFee + liquidityBuyFee; dividendTracker = new DividendTracker(); marketingWallet = address(0x7282755d74d9e7098A7770Cc06ABC57270A97784); // set as marketing wallet IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // testnet PCS router: 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3 // mainnet PCS V2 router: 0x10ED43C718714eb63d5aA57B78B54704E256024E // ETH UNI Router: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(newOwner); dividendTracker.excludeFromDividends(address(_uniswapV2Router)); dividendTracker.excludeFromDividends(address(0xdead)); // exclude from paying fees or having max transaction amount excludeFromFees(newOwner, true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromMaxTransaction(newOwner, true); excludeFromMaxTransaction(address(this), true); excludeFromMaxTransaction(address(dividendTracker), true); excludeFromMaxTransaction(address(_uniswapV2Router), true); excludeFromMaxTransaction(address(0xdead), true); /* createInitialSupply is a function that is only called here, and CANNOT be called ever again */ createInitialSupply(newOwner, totalSupply); transferOwnership(newOwner); } receive() external payable { } // disable Transfer delay - cannot be reenabled function disableTransferDelay() external onlyOwner returns (bool){ transferDelayEnabled = false; return true; } // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.) function excludeFromDividends(address account) external onlyOwner { dividendTracker.excludeFromDividends(account); } // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.) function includeInDividends(address account) external onlyOwner { dividendTracker.includeInDividends(account); } function updateBuyFees(uint256 _marketingFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner { marketingBuyFee = _marketingFee; rewardsBuyFee = _rewardsFee; liquidityBuyFee = _liquidityFee; totalBuyFees = marketingBuyFee + rewardsBuyFee + liquidityBuyFee; require(totalBuyFees <= 20, "Must keep fees at 20% or less"); } function updateSellFees(uint256 _marketingFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner { marketingSellFee = _marketingFee; rewardsSellFee = _rewardsFee; liquiditySellFee = _liquidityFee; totalSellFees = marketingSellFee + rewardsSellFee + liquiditySellFee; require(totalSellFees <= 20, "Must keep fees at 20% or less"); } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; emit ExcludedMaxTransactionAmount(updAds, isEx); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; excludeFromMaxTransaction(pair, value); if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function updateGasForProcessing(uint256 newValue) external onlyOwner { require(newValue >= 200000 && newValue <= 500000, " gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value"); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } function updateClaimWait(uint256 claimWait) external onlyOwner { dividendTracker.updateClaimWait(claimWait); } function getClaimWait() external view returns(uint256) { return dividendTracker.claimWait(); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function withdrawableDividendOf(address account) public view returns(uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.holderBalance(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index); } function processDividendTracker(uint256 gas) external { (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas); emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin); } function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } function getNumberOfDividends() external view returns(uint256) { return dividendTracker.totalBalance(); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if(amount == 0) { super._transfer(from, to, 0); return; } if(!tradingActive){ require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active yet."); } if(limitsInEffect){ if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping ){ // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch. if (transferDelayEnabled){ if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){ require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed."); _holderLastTransferTimestamp[tx.origin] = block.number; } } //when buy if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) { require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount."); require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet"); } //when sell else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) { require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount."); } else if(!_isExcludedMaxTransactionAmount[to]) { require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet"); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; // no taxes on transfers (non buys/sells) if(takeFee){ // on sell if (automatedMarketMakerPairs[to] && totalSellFees > 0){ fees = amount.mul(totalSellFees).div(100); tokensForRewards += fees * rewardsSellFee / totalSellFees; tokensForLiquidity += fees * liquiditySellFee / totalSellFees; tokensFormarketing += fees * marketingSellFee / totalSellFees; } // on buy else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) { fees = amount.mul(totalBuyFees).div(100); tokensForRewards += fees * rewardsBuyFee / totalBuyFees; tokensForLiquidity += fees * liquidityBuyFee / totalBuyFees; tokensFormarketing += fees * marketingBuyFee / totalBuyFees; } if(fees > 0){ super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} if(!swapping) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch {} } } function swapBnbForRewardToken(uint256 bnbAmount) private { if(bnbAmount > 0){ address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = token; uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}( 0, path, address(this), block.timestamp ); } } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0x7282755d74d9e7098A7770Cc06ABC57270A97784), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); bool success; uint256 totalTokensToSwap = tokensForLiquidity + tokensFormarketing + tokensForRewards; if(contractBalance == 0 || totalTokensToSwap == 0) {return;} // Halve the amount of liquidity tokens uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2; uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); uint256 ethFormarketing = ethBalance.mul(tokensFormarketing).div(totalTokensToSwap); uint256 ethForRewards = ethBalance.mul(tokensForRewards).div(totalTokensToSwap); uint256 ethForLiquidity = ethBalance - ethFormarketing - ethForRewards; tokensForLiquidity = 0; tokensFormarketing = 0; tokensForRewards = 0; if(liquidityTokens > 0 && ethForLiquidity > 0){ addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity); } swapBnbForRewardToken(ethForRewards); uint256 tokenBalance = IERC20(token).balanceOf(address(this)); success = IERC20(token).transfer(address(dividendTracker), tokenBalance); if (success) { dividendTracker.distributeTokenDividends(tokenBalance); emit SendDividends(tokenBalance, ethForRewards); } // send remainder to marketingWallet (success,) = address(marketingWallet).call{value: address(this).balance}(""); } // useful for marketings or to reclaim any BNB on the contract in a way that helps holders. function marketingTokens(uint256 bnbAmountInWei) external onlyOwner { // generate the uniswap pair path of weth -> eth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}( 0, // accept any amount of Ethereum path, address(0xdead), block.timestamp ); } function withdrawStuckEth() external onlyOwner { (bool success,) = address(msg.sender).call{value: address(this).balance}(""); require(success, "failed to withdraw"); } function withdrawTokens(address tokenAddress, address to, uint256 value) external onlyOwner { require(IERC20(tokenAddress).balanceOf(address(this)) >= value, "Insufficient token balance"); try IERC20(token).transfer(to, value) {} catch { revert("Transfer failed"); } } } contract DividendTracker is DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public immutable minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event IncludeInDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() { claimWait = 1200; minimumTokenBalanceForDividends = 10000000 * (10**18); //must hold 10_000_000 (1%) tokens } function excludeFromDividends(address account) external onlyOwner { excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function includeInDividends(address account) external onlyOwner { require(excludedFromDividends[account]); excludedFromDividends[account] = false; emit IncludeInDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"marketingMultiplierActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bnbAmountInWei","type":"uint256"}],"name":"marketingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensFormarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526000600c819055600d55600f805462ffffff1916620101011790556011805460ff1916905562030d40601d553480156200003d57600080fd5b506040518060400160405280601081526020016f293ab39020ba10189026b4b63634b7b760811b8152506040518060400160405280600381526020016252414d60e81b81525081600390805190602001906200009b92919062000b23565b508051620000b190600490602084019062000b23565b5050506000620000c66200069560201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062006327833981519152908290a350737282755d74d9e7098a7770cc06abc57270a977846b033b2e3c9fd0803ce800000060646200013482600262000bed565b62000140919062000c0f565b6009556127106200015382600162000bed565b6200015f919062000c0f565b600a5560646200017182600262000bed565b6200017d919062000c0f565b600b5560026013819055600960148190556001601581905591620001a2919062000c32565b620001ae919062000c32565b60125560026017819055600960188190556001601981905591620001d3919062000c32565b620001df919062000c32565b601655604051620001f09062000bb2565b604051809103906000f0801580156200020d573d6000803e3d6000fd5b50600780546001600160a01b03929092166001600160a01b031992831617905560088054909116737282755d74d9e7098a7770cc06abc57270a977841790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a0155916004808301926020929190829003018186803b1580156200029d57600080fd5b505afa158015620002b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d8919062000c4d565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200032157600080fd5b505afa15801562000336573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035c919062000c4d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620003a557600080fd5b505af1158015620003ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e0919062000c4d565b600680546001600160a01b0319166001600160a01b0385811691909117909155811660805290506200041481600162000699565b60075460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200045b57600080fd5b505af115801562000470573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004ba57600080fd5b505af1158015620004cf573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03888116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200051b57600080fd5b505af115801562000530573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200057c57600080fd5b505af115801562000591573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620005dd57600080fd5b505af1158015620005f2573d6000803e3d6000fd5b50505050620006098460016200076d60201b60201c565b620006163060016200076d565b6200062561dead60016200076d565b620006328460016200081c565b6200063f3060016200081c565b60075462000658906001600160a01b031660016200081c565b620006658260016200081c565b6200067461dead60016200081c565b620006808484620008c0565b6200068b84620009bc565b5050505062000cb5565b3390565b6001600160a01b03821660009081526020805260409020805460ff1916821515179055620006c882826200081c565b8015620007315760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200071757600080fd5b505af11580156200072c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620007bc5760405162461bcd60e51b815260206004820181905260248201526000805160206200630783398151915260448201526064015b60405180910390fd5b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b03163314620008675760405162461bcd60e51b81526020600482018190526024820152600080516020620063078339815191526044820152606401620007b3565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910162000810565b6001600160a01b038216620009185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620007b3565b620009348160025462000ab960201b62001f241790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200096791839062001f2462000ab9821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6005546001600160a01b0316331462000a075760405162461bcd60e51b81526020600482018190526024820152600080516020620063078339815191526044820152606401620007b3565b6001600160a01b03811662000a6e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620007b3565b6005546040516001600160a01b038084169216906000805160206200632783398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b60008062000ac8838562000c32565b90508381101562000b1c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620007b3565b9392505050565b82805462000b319062000c78565b90600052602060002090601f01602090048101928262000b55576000855562000ba0565b82601f1062000b7057805160ff191683800117855562000ba0565b8280016001018555821562000ba0579182015b8281111562000ba057825182559160200191906001019062000b83565b5062000bae92915062000bc0565b5090565b611ac8806200483f83390190565b5b8082111562000bae576000815560010162000bc1565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000c0a5762000c0a62000bd7565b500290565b60008262000c2d57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000c485762000c4862000bd7565b500190565b60006020828403121562000c6057600080fd5b81516001600160a01b038116811462000b1c57600080fd5b600181811c9082168062000c8d57607f821691505b6020821081141562000caf57634e487b7160e01b600052602260045260246000fd5b50919050565b608051613b6062000cdf600039600081816106430152818161187d01526122630152613b606000f3fe6080604052600436106103fe5760003560e01c80638095d56411610213578063c492f04611610123578063e7f444b3116100ab578063f27fd2541161007a578063f27fd25414610bd8578063f2fde38b14610bf8578063f54afa7814610c18578063f8b45b0514610c2e578063fc0c546a14610c4457600080fd5b8063e7f444b314610b77578063e884f26014610b8d578063e98030c714610ba2578063ee40166e14610bc257600080fd5b8063ccd146b2116100f2578063ccd146b214610ada578063d0a3981414610af0578063dd62ed3e14610b06578063e2f4560514610b4c578063e7841ec014610b6257600080fd5b8063c492f04614610a74578063c876d0b914610a94578063c8c8ebe414610aae578063ccb6135814610ac457600080fd5b8063a8b9d240116101a6578063b9e9370011610175578063b9e93700146109df578063bbc0c742146109f5578063c024666814610a14578063c0f306ef14610a34578063c17b5b8c14610a5457600080fd5b8063a8b9d2401461090b578063a9059cbb1461092b578063ad56c13c1461094b578063b62496f5146109b057600080fd5b80639a7a23d6116101e25780639a7a23d6146108a05780639c1b8af5146108c0578063a26579ad146108d6578063a457c2d7146108eb57600080fd5b80638095d5641461082d578063871c128d1461084d5780638da5cb5b1461086d57806395d89b411461088b57600080fd5b806349bd5a5e1161030e5780636843cd84116102a1578063715018a611610270578063715018a6146107ae57806371778e7d146107c35780637571336a146107d857806375f0a874146107f85780637fa787ba1461081857600080fd5b80636843cd841461072e5780636ddd17131461074e578063700bb1911461076e57806370a082311461078e57600080fd5b80634fbee193116102dd5780634fbee193146106aa5780635e35359e146106e357806364b0f65314610703578063680789521461071857600080fd5b806349bd5a5e146106315780634a62bb65146106655780634af6f7ee1461067f5780634e71d92d1461069557600080fd5b80631a8145bb1161039157806330bb4cff1161036057806330bb4cff1461059e578063313ce567146105b357806331e79db0146105cf57806339509351146105f15780633f3539ef1461061157600080fd5b80631a8145bb146105325780631fc851bd1461054857806323b872dd1461055e5780632c1f52161461057e57600080fd5b806310d5de53116103cd57806310d5de531461049f5780631694505e146104cf57806318160ddd1461050757806319466ebe1461051c57600080fd5b806306fdde031461040a578063095ea7b314610435578063099d0d30146104655780630f4432e31461048957600080fd5b3661040557005b600080fd5b34801561041657600080fd5b5061041f610c6c565b60405161042c91906134db565b60405180910390f35b34801561044157600080fd5b50610455610450366004613545565b610cfe565b604051901515815260200161042c565b34801561047157600080fd5b5061047b60155481565b60405190815260200161042c565b34801561049557600080fd5b5061047b600c5481565b3480156104ab57600080fd5b506104556104ba366004613571565b601f6020526000908152604090205460ff1681565b3480156104db57600080fd5b506006546104ef906001600160a01b031681565b6040516001600160a01b03909116815260200161042c565b34801561051357600080fd5b5060025461047b565b34801561052857600080fd5b5061047b601b5481565b34801561053e57600080fd5b5061047b601c5481565b34801561055457600080fd5b5061047b600e5481565b34801561056a57600080fd5b5061045561057936600461358e565b610d15565b34801561058a57600080fd5b506007546104ef906001600160a01b031681565b3480156105aa57600080fd5b5061047b610d7e565b3480156105bf57600080fd5b506040516012815260200161042c565b3480156105db57600080fd5b506105ef6105ea366004613571565b610e00565b005b3480156105fd57600080fd5b5061045561060c366004613545565b610e96565b34801561061d57600080fd5b506105ef61062c3660046135cf565b610ecc565b34801561063d57600080fd5b506104ef7f000000000000000000000000000000000000000000000000000000000000000081565b34801561067157600080fd5b50600f546104559060ff1681565b34801561068b57600080fd5b5061047b60175481565b3480156106a157600080fd5b506105ef611058565b3480156106b657600080fd5b506104556106c5366004613571565b6001600160a01b03166000908152601e602052604090205460ff1690565b3480156106ef57600080fd5b506105ef6106fe36600461358e565b6110df565b34801561070f57600080fd5b5061047b6112a1565b34801561072457600080fd5b5061047b60185481565b34801561073a57600080fd5b5061047b610749366004613571565b6112e6565b34801561075a57600080fd5b50600f546104559062010000900460ff1681565b34801561077a57600080fd5b506105ef6107893660046135cf565b611365565b34801561079a57600080fd5b5061047b6107a9366004613571565b611446565b3480156107ba57600080fd5b506105ef611461565b3480156107cf57600080fd5b5061047b6114d5565b3480156107e457600080fd5b506105ef6107f33660046135f6565b61151a565b34801561080457600080fd5b506008546104ef906001600160a01b031681565b34801561082457600080fd5b506105ef6115a4565b34801561083957600080fd5b506105ef61084836600461362f565b61165b565b34801561085957600080fd5b506105ef6108683660046135cf565b6116fe565b34801561087957600080fd5b506005546001600160a01b03166104ef565b34801561089757600080fd5b5061041f611842565b3480156108ac57600080fd5b506105ef6108bb3660046135f6565b611851565b3480156108cc57600080fd5b5061047b601d5481565b3480156108e257600080fd5b5061047b61193f565b3480156108f757600080fd5b50610455610906366004613545565b611984565b34801561091757600080fd5b5061047b610926366004613571565b6119d3565b34801561093757600080fd5b50610455610946366004613545565b611a06565b34801561095757600080fd5b5061096b610966366004613571565b611a13565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161042c565b3480156109bc57600080fd5b506104556109cb366004613571565b602080526000908152604090205460ff1681565b3480156109eb57600080fd5b5061047b60165481565b348015610a0157600080fd5b50600f5461045590610100900460ff1681565b348015610a2057600080fd5b506105ef610a2f3660046135f6565b611abd565b348015610a4057600080fd5b506105ef610a4f366004613571565b611b3f565b348015610a6057600080fd5b506105ef610a6f36600461362f565b611b9b565b348015610a8057600080fd5b506105ef610a8f36600461365b565b611c3e565b348015610aa057600080fd5b506011546104559060ff1681565b348015610aba57600080fd5b5061047b60095481565b348015610ad057600080fd5b5061047b60195481565b348015610ae657600080fd5b5061047b60135481565b348015610afc57600080fd5b5061047b60125481565b348015610b1257600080fd5b5061047b610b213660046136e1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b5857600080fd5b5061047b600a5481565b348015610b6e57600080fd5b5061047b611d1a565b348015610b8357600080fd5b5061047b60145481565b348015610b9957600080fd5b50610455611d5f565b348015610bae57600080fd5b506105ef610bbd3660046135cf565b611d9c565b348015610bce57600080fd5b5061047b600d5481565b348015610be457600080fd5b5061096b610bf33660046135cf565b611df7565b348015610c0457600080fd5b506105ef610c13366004613571565b611e39565b348015610c2457600080fd5b5061047b601a5481565b348015610c3a57600080fd5b5061047b600b5481565b348015610c5057600080fd5b506104ef73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b606060038054610c7b9061370f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca79061370f565b8015610cf45780601f10610cc957610100808354040283529160200191610cf4565b820191906000526020600020905b815481529060010190602001808311610cd757829003601f168201915b5050505050905090565b6000610d0b338484611f8a565b5060015b92915050565b6000610d228484846120af565b610d748433610d6f85604051806060016040528060288152602001613ade602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612a9c565b611f8a565b5060019392505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610dc357600080fd5b505afa158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb919061374a565b905090565b6005546001600160a01b03163314610e335760405162461bcd60e51b8152600401610e2a90613763565b60405180910390fd5b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d0b918590610d6f9086611f24565b6005546001600160a01b03163314610ef65760405162461bcd60e51b8152600401610e2a90613763565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190613798565b81600081518110610fa657610fa66137b5565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610fda57610fda6137b5565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de9590849061102290600090869061dead90429060040161380f565b6000604051808303818588803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b50505050505050565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156110a457600080fd5b505af11580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc9190613844565b50565b6005546001600160a01b031633146111095760405162461bcd60e51b8152600401610e2a90613763565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b15801561114a57600080fd5b505afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611182919061374a565b10156111d05760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e63650000000000006044820152606401610e2a565b60405163a9059cbb60e01b81526001600160a01b03831660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063a9059cbb90604401602060405180830381600087803b15801561122c57600080fd5b505af192505050801561125c575060408051601f3d908101601f1916820190925261125991810190613844565b60015b61129a5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610e2a565b505b505050565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610dc357600080fd5b60075460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b60206040518083038186803b15801561132d57600080fd5b505afa158015611341573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0f919061374a565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113eb9190613861565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461148b5760405162461bcd60e51b8152600401610e2a90613763565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6007546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f916004808301926020929190829003018186803b158015610dc357600080fd5b6005546001600160a01b031633146115445760405162461bcd60e51b8152600401610e2a90613763565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b031633146115ce5760405162461bcd60e51b8152600401610e2a90613763565b604051600090339047908381818185875af1925050503d8060008114611610576040519150601f19603f3d011682016040523d82523d6000602084013e611615565b606091505b50509050806110dc5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610e2a565b6005546001600160a01b031633146116855760405162461bcd60e51b8152600401610e2a90613763565b6018839055601782905560198190558061169f83856138a5565b6116a991906138a5565b60168190556014101561129c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610e2a565b6005546001600160a01b031633146117285760405162461bcd60e51b8152600401610e2a90613763565b62030d40811015801561173e57506207a1208111155b6117a85760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610e2a565b601d5481141561180f5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610e2a565b601d5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601d55565b606060048054610c7b9061370f565b6005546001600160a01b0316331461187b5760405162461bcd60e51b8152600401610e2a90613763565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156119315760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610e2a565b61193b8282612ad6565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610dc357600080fd5b6000610d0b3384610d6f85604051806060016040528060258152602001613b06602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612a9c565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611315565b6000610d0b3384846120af565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa291906138bd565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611ae75760405162461bcd60e51b8152600401610e2a90613763565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611598565b6005546001600160a01b03163314611b695760405162461bcd60e51b8152600401610e2a90613763565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610e61565b6005546001600160a01b03163314611bc55760405162461bcd60e51b8152600401610e2a90613763565b60148390556013829055601581905580611bdf83856138a5565b611be991906138a5565b60128190556014101561129c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610e2a565b6005546001600160a01b03163314611c685760405162461bcd60e51b8152600401610e2a90613763565b60005b82811015611cd95781601e6000868685818110611c8a57611c8a6137b5565b9050602002016020810190611c9f9190613571565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611cd181613927565b915050611c6b565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611d0d93929190613942565b60405180910390a1505050565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610dc357600080fd5b6005546000906001600160a01b03163314611d8c5760405162461bcd60e51b8152600401610e2a90613763565b506011805460ff19169055600190565b6005546001600160a01b03163314611dc65760405162461bcd60e51b8152600401610e2a90613763565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610e61565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611a51565b6005546001600160a01b03163314611e635760405162461bcd60e51b8152600401610e2a90613763565b6001600160a01b038116611ec85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e2a565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080611f3183856138a5565b905083811015611f835760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e2a565b9392505050565b6001600160a01b038316611fec5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e2a565b6001600160a01b03821661204d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e2a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166120d55760405162461bcd60e51b8152600401610e2a9061399b565b6001600160a01b0382166120fb5760405162461bcd60e51b8152600401610e2a906139e0565b8061210c5761129c83836000612ba5565b600f54610100900460ff166121a6576001600160a01b0383166000908152601e602052604090205460ff168061215a57506001600160a01b0382166000908152601e602052604090205460ff165b6121a65760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610e2a565b600f5460ff161561259e576005546001600160a01b038481169116148015906121dd57506005546001600160a01b03838116911614155b80156121f157506001600160a01b03821615155b801561220857506001600160a01b03821661dead14155b801561221e5750600654600160a01b900460ff16155b1561259e5760115460ff1615612346576005546001600160a01b0383811691161480159061225a57506006546001600160a01b03838116911614155b801561229857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15612346573260009081526010602052604090205443116123335760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610e2a565b3260009081526010602052604090204390555b6001600160a01b038316600090815260208052604090205460ff16801561238657506001600160a01b0382166000908152601f602052604090205460ff16155b15612464576009548111156123fb5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610e2a565b600b5461240783611446565b61241190836138a5565b111561245f5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610e2a565b61259e565b6001600160a01b038216600090815260208052604090205460ff1680156124a457506001600160a01b0383166000908152601f602052604090205460ff16155b1561251a5760095481111561245f5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610e2a565b6001600160a01b0382166000908152601f602052604090205460ff1661259e57600b5461254683611446565b61255090836138a5565b111561259e5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610e2a565b60006125a930611446565b600a54909150811080159081906125c85750600f5462010000900460ff165b80156125de5750600654600160a01b900460ff16155b801561260257506001600160a01b038516600090815260208052604090205460ff16155b801561262757506001600160a01b0385166000908152601e602052604090205460ff16155b801561264c57506001600160a01b0384166000908152601e602052604090205460ff16155b1561267a576006805460ff60a01b1916600160a01b17905561266c612cae565b6006805460ff60a01b191690555b6006546001600160a01b0386166000908152601e602052604090205460ff600160a01b9092048216159116806126c857506001600160a01b0385166000908152601e602052604090205460ff165b156126d1575060005b600081156128ba576001600160a01b038616600090815260208052604090205460ff16801561270257506000601254115b156127c05761272760646127216012548861303190919063ffffffff16565b906130b0565b90506012546013548261273a9190613a23565b6127449190613a42565b601a600082825461275591906138a5565b909155505060125460155461276a9083613a23565b6127749190613a42565b601c600082825461278591906138a5565b909155505060125460145461279a9083613a23565b6127a49190613a42565b601b60008282546127b591906138a5565b9091555061289c9050565b6001600160a01b038716600090815260208052604090205460ff1680156127e957506000601654115b1561289c5761280860646127216016548861303190919063ffffffff16565b90506016546017548261281b9190613a23565b6128259190613a42565b601a600082825461283691906138a5565b909155505060165460195461284b9083613a23565b6128559190613a42565b601c600082825461286691906138a5565b909155505060165460185461287b9083613a23565b6128859190613a42565b601b600082825461289691906138a5565b90915550505b80156128ad576128ad873083612ba5565b6128b78186613a64565b94505b6128c5878787612ba5565b6007546001600160a01b031663e30443bc886128e081611446565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561292657600080fd5b505af1925050508015612937575060015b506007546001600160a01b031663e30443bc8761295381611446565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561299957600080fd5b505af19250505080156129aa575060015b50600654600160a01b900460ff1661104f57601d546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015612a0857600080fd5b505af1925050508015612a38575060408051601f3d908101601f19168201909252612a3591810190613861565b60015b612a4157612a92565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b5050505050505050565b60008184841115612ac05760405162461bcd60e51b8152600401610e2a91906134db565b506000612acd8486613a64565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff1916821515179055612b03828261151a565b8015612b695760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612b5057600080fd5b505af1158015612b64573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038316612bcb5760405162461bcd60e51b8152600401610e2a9061399b565b6001600160a01b038216612bf15760405162461bcd60e51b8152600401610e2a906139e0565b612c2e81604051806060016040528060268152602001613ab8602691396001600160a01b0386166000908152602081905260409020549190612a9c565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612c5d9082611f24565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016120a2565b6000612cb930611446565b9050600080601a54601b54601c54612cd191906138a5565b612cdb91906138a5565b9050821580612ce8575080155b15612cf257505050565b6000600282601c5486612d059190613a23565b612d0f9190613a42565b612d199190613a42565b90506000612d2785836130f2565b905047612d3382613134565b6000612d3f47836130f2565b90506000612d5c86612721601b548561303190919063ffffffff16565b90506000612d7987612721601a548661303190919063ffffffff16565b9050600081612d888486613a64565b612d929190613a64565b6000601c819055601b819055601a5590508615801590612db25750600081115b15612e0557612dc1878261329d565b601c54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b612e0e82613369565b6040516370a0823160e01b815230600482015260009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a082319060240160206040518083038186803b158015612e5b57600080fd5b505afa158015612e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e93919061374a565b60075460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063a9059cbb90604401602060405180830381600087803b158015612ef657600080fd5b505af1158015612f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2e9190613844565b99508915612fcf5760075460405163b0c7ce3760e01b8152600481018390526001600160a01b039091169063b0c7ce3790602401600060405180830381600087803b158015612f7c57600080fd5b505af1158015612f90573d6000803e3d6000fd5b505060408051848152602081018790527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b6008546040516001600160a01b03909116904790600081818185875af1925050503d806000811461301c576040519150601f19603f3d011682016040523d82523d6000602084013e613021565b606091505b5050505050505050505050505050565b60008261304057506000610d0f565b600061304c8385613a23565b9050826130598583613a42565b14611f835760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e2a565b6000611f8383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506134ad565b6000611f8383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a9c565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613169576131696137b5565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131bd57600080fd5b505afa1580156131d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f59190613798565b81600181518110613208576132086137b5565b6001600160a01b03928316602091820292909201015260065461322e9130911684611f8a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613267908590600090869030904290600401613a7b565b600060405180830381600087803b15801561328157600080fd5b505af1158015613295573d6000803e3d6000fd5b505050505050565b6006546132b59030906001600160a01b031684611f8a565b60065460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820152737282755d74d9e7098a7770cc06abc57270a9778460848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561333057600080fd5b505af1158015613344573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e8f9190613861565b80156110dc576040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b1580156133d457600080fd5b505afa1580156133e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340c9190613798565b8160008151811061341f5761341f6137b5565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881600181518110613467576134676137b5565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de959084906110229060009086903090429060040161380f565b600081836134ce5760405162461bcd60e51b8152600401610e2a91906134db565b506000612acd8486613a42565b600060208083528351808285015260005b81811015613508578581018301518582016040015282016134ec565b8181111561351a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146110dc57600080fd5b6000806040838503121561355857600080fd5b823561356381613530565b946020939093013593505050565b60006020828403121561358357600080fd5b8135611f8381613530565b6000806000606084860312156135a357600080fd5b83356135ae81613530565b925060208401356135be81613530565b929592945050506040919091013590565b6000602082840312156135e157600080fd5b5035919050565b80151581146110dc57600080fd5b6000806040838503121561360957600080fd5b823561361481613530565b91506020830135613624816135e8565b809150509250929050565b60008060006060848603121561364457600080fd5b505081359360208301359350604090920135919050565b60008060006040848603121561367057600080fd5b833567ffffffffffffffff8082111561368857600080fd5b818601915086601f83011261369c57600080fd5b8135818111156136ab57600080fd5b8760208260051b85010111156136c057600080fd5b602092830195509350508401356136d6816135e8565b809150509250925092565b600080604083850312156136f457600080fd5b82356136ff81613530565b9150602083013561362481613530565b600181811c9082168061372357607f821691505b6020821081141561374457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561375c57600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156137aa57600080fd5b8151611f8381613530565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156138045781516001600160a01b0316875295820195908201906001016137df565b509495945050505050565b84815260806020820152600061382860808301866137cb565b6001600160a01b03949094166040830152506060015292915050565b60006020828403121561385657600080fd5b8151611f83816135e8565b60008060006060848603121561387657600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b600082198211156138b8576138b861388f565b500190565b600080600080600080600080610100898b0312156138da57600080fd5b88516138e581613530565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600060001982141561393b5761393b61388f565b5060010190565b6040808252810183905260008460608301825b8681101561398557823561396881613530565b6001600160a01b0316825260209283019290910190600101613955565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615613a3d57613a3d61388f565b500290565b600082613a5f57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613a7657613a7661388f565b500390565b85815284602082015260a060408201526000613a9a60a08301866137cb565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220efd94dce88d44d3ac1db8cd99286bc727c56ba7271a63a842a74819d38204d3164736f6c6343000809003360a060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506104b0600e556a084595161401484a000000608052608051611a3f610089600039600081816104c10152610c3e0152611a3f6000f3fe6080604052600436106101c65760003560e01c8063a8b9d240116100f7578063c0f306ef11610095578063f2fde38b11610064578063f2fde38b14610558578063fbcbc0f114610578578063fc0c546a14610598578063ffb2c479146105c057600080fd5b8063c0f306ef146104e3578063e30443bc14610503578063e7841ec014610523578063e98030c71461053857600080fd5b8063ad7a672f116100d1578063ad7a672f14610459578063b0c7ce371461046f578063bc4c4b371461048f578063be10b614146104af57600080fd5b8063a8b9d240146103d6578063aafd847a146103f6578063ab6ddfa81461042c57600080fd5b80635183d6fd11610164578063715018a61161013e578063715018a61461035957806385a6b3ae1461036e5780638da5cb5b1461038457806391b89fba146103b657600080fd5b80635183d6fd146102c95780636a4740021461032e5780636f2789ec1461034357600080fd5b806327ce0147116101a057806327ce0147146102335780633009a6091461025357806331e79db0146102695780634e7b827f1461028957600080fd5b806303c83302146101da57806309bbedde146101e2578063226cfa3d1461020657600080fd5b366101d5576101d36105fb565b005b600080fd5b6101d36105fb565b3480156101ee57600080fd5b506007545b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f361022136600461174c565b600d6020526000908152604090205481565b34801561023f57600080fd5b506101f361024e36600461174c565b61066e565b34801561025f57600080fd5b506101f3600b5481565b34801561027557600080fd5b506101d361028436600461174c565b6106d1565b34801561029557600080fd5b506102b96102a436600461174c565b600c6020526000908152604090205460ff1681565b60405190151581526020016101fd565b3480156102d557600080fd5b506102e96102e4366004611769565b6107d2565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101fd565b34801561033a57600080fd5b506101d3610944565b34801561034f57600080fd5b506101f3600e5481565b34801561036557600080fd5b506101d3610950565b34801561037a57600080fd5b506101f360065481565b34801561039057600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101fd565b3480156103c257600080fd5b506101f36103d136600461174c565b6109c4565b3480156103e257600080fd5b506101f36103f136600461174c565b6109cb565b34801561040257600080fd5b506101f361041136600461174c565b6001600160a01b031660009081526003602052604090205490565b34801561043857600080fd5b506101f361044736600461174c565b60046020526000908152604090205481565b34801561046557600080fd5b506101f360055481565b34801561047b57600080fd5b506101d361048a366004611769565b6109f7565b34801561049b57600080fd5b506102b96104aa366004611790565b610aa9565b3480156104bb57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ef57600080fd5b506101d36104fe36600461174c565b610b55565b34801561050f57600080fd5b506101d361051e3660046117c9565b610bed565b34801561052f57600080fd5b50600b546101f3565b34801561054457600080fd5b506101d3610553366004611769565b610d79565b34801561056457600080fd5b506101d361057336600461174c565b610ee3565b34801561058457600080fd5b506102e961059336600461174c565b610fcd565b3480156105a457600080fd5b5061039e73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b3480156105cc57600080fd5b506105e06105db366004611769565b611145565b604080519384526020840192909252908201526060016101fd565b60405162461bcd60e51b815260206004820152603a60248201527f43616e6e6f742073656e6420424e42206469726563746c7920746f207472616360448201527f6b657220617320697420697320756e7265636f76657261626c6500000000000060648201526084015b60405180910390fd5b6001600160a01b0381166000908152600260209081526040808320546004909252822054600154600160801b926106c1926106bc926106b6916106b19190611260565b6112e6565b906112f6565b611334565b6106cb919061180b565b92915050565b6000546001600160a01b031633146106fb5760405162461bcd60e51b81526004016106659061182d565b6001600160a01b0381166000908152600c60205260408120805460ff19166001179055610729908290611347565b60405163131836e760e21b8152600760048201526001600160a01b038216602482015273953be4534878cc81b5e2190d7b741269b78243e090634c60db9c9060440160006040518083038186803b15801561078357600080fd5b505af4158015610797573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b600080600080600080600080600773953be4534878cc81b5e2190d7b741269b78243e063deb3d89690916040518263ffffffff1660e01b815260040161081a91815260200190565b60206040518083038186803b15801561083257600080fd5b505af4158015610846573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086a9190611862565b891061088f575060009650600019955085945086935083925082915081905080610939565b6040516368d54f3f60e11b815260076004820152602481018a905260009073953be4534878cc81b5e2190d7b741269b78243e09063d1aa9e7e9060440160206040518083038186803b1580156108e457600080fd5b505af41580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c919061187b565b905061092781610fcd565b98509850985098509850985098509850505b919395975091939597565b61094d336113e0565b50565b6000546001600160a01b0316331461097a5760405162461bcd60e51b81526004016106659061182d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006106cb825b6001600160a01b0381166000908152600360205260408120546106cb906109f18461066e565b90611564565b6000546001600160a01b03163314610a215760405162461bcd60e51b81526004016106659061182d565b600060055411610a3057600080fd5b801561094d57600554610a5e90610a4b83600160801b611260565b610a55919061180b565b600154906115a6565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600654610aa390826115a6565b60065550565b600080546001600160a01b03163314610ad45760405162461bcd60e51b81526004016106659061182d565b6000610adf846113e0565b90508015610b4b576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610b399085815260200190565b60405180910390a360019150506106cb565b5060009392505050565b6000546001600160a01b03163314610b7f5760405162461bcd60e51b81526004016106659061182d565b6001600160a01b0381166000908152600c602052604090205460ff16610ba457600080fd5b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b03163314610c175760405162461bcd60e51b81526004016106659061182d565b6001600160a01b0382166000908152600c602052604090205460ff1615610c3c575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610ceb57610c6d8282611347565b604051632f0ad01760e21b8152600760048201526001600160a01b03831660248201526044810182905273953be4534878cc81b5e2190d7b741269b78243e09063bc2b405c9060640160006040518083038186803b158015610cce57600080fd5b505af4158015610ce2573d6000803e3d6000fd5b50505050610d69565b610cf6826000611347565b60405163131836e760e21b8152600760048201526001600160a01b038316602482015273953be4534878cc81b5e2190d7b741269b78243e090634c60db9c9060440160006040518083038186803b158015610d5057600080fd5b505af4158015610d64573d6000803e3d6000fd5b505050505b610d74826001610aa9565b505050565b6000546001600160a01b03163314610da35760405162461bcd60e51b81526004016106659061182d565b6104b08110158015610db85750620151808111155b610e385760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610665565b600e54811415610eb05760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610665565b600e5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600e55565b6000546001600160a01b03163314610f0d5760405162461bcd60e51b81526004016106659061182d565b6001600160a01b038116610f725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610665565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600760048201526001600160a01b0382166024820152819060009081908190819081908190819073953be4534878cc81b5e2190d7b741269b78243e0906317e142d19060440160206040518083038186803b15801561103857600080fd5b505af415801561104c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110709190611862565b96506000199550600087126110d257600b5487111561109e57600b54611097908890611605565b95506110d2565b600b54600754600091106110b35760006110c2565b600b546007546110c291611564565b90506110ce88826112f6565b9650505b6110db886109cb565b94506110e68861066e565b6001600160a01b0389166000908152600d602052604090205490945092508261111057600061111e565b600e5461111e9084906115a6565b915042821161112e576000611138565b6111388242611564565b9050919395975091939597565b6007546000908190819080611165575050600b5460009250829150611259565b600b546000805a90506000805b898410801561118057508582105b15611248578461118f81611898565b600754909650861090506111a257600094505b6000600760000186815481106111ba576111ba6118b3565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506111eb90611642565b1561120e576111fb816001610aa9565b1561120e578161120a81611898565b9250505b8261121881611898565b93505060005a90508085111561123f5761123c6112358683611564565b87906115a6565b95505b93506111729050565b600b85905590975095509193505050505b9193909250565b60008261126f575060006106cb565b600061127b83856118c9565b905082611288858361180b565b146112df5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610665565b9392505050565b600081818112156106cb57600080fd5b60008061130383856118e8565b9050600083121580156113165750838112155b8061132b575060008312801561132b57508381125b6112df57600080fd5b60008082121561134357600080fd5b5090565b6001600160a01b0382166000908152600460205260409020805490829055808211156113a35760006113798383611564565b90506113858482611669565b80600560008282546113979190611929565b90915550610d74915050565b80821015610d745760006113b78284611564565b90506113c384826116c3565b80600560008282546113d59190611941565b909155505050505050565b6000806113ec836109cb565b9050801561155b576001600160a01b03831660009081526003602052604090205461141790826115a6565b6001600160a01b038416600081815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906114669084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b03841660048201526024810182905260009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063a9059cbb90604401602060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115059190611958565b905080611554576001600160a01b03841660009081526003602052604090205461152f9083611564565b6001600160a01b03909416600090815260036020526040812094909455509192915050565b5092915050565b50600092915050565b60006112df83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506116fd565b6000806115b38385611929565b9050838110156112df5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610665565b6000806116128385611975565b9050600083121580156116255750838113155b8061132b575060008312801561132b57508381136112df57600080fd5b60004282111561165457506000919050565b600e546116614284611564565b101592915050565b6116a36116846106b18360015461126090919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490611605565b6001600160a01b0390921660009081526002602052604090209190915550565b6116a36116de6106b18360015461126090919063ffffffff16565b6001600160a01b038416600090815260026020526040902054906112f6565b600081848411156117215760405162461bcd60e51b815260040161066591906119b4565b50600061172e8486611941565b95945050505050565b6001600160a01b038116811461094d57600080fd5b60006020828403121561175e57600080fd5b81356112df81611737565b60006020828403121561177b57600080fd5b5035919050565b801515811461094d57600080fd5b600080604083850312156117a357600080fd5b82356117ae81611737565b915060208301356117be81611782565b809150509250929050565b600080604083850312156117dc57600080fd5b82356117e781611737565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008261182857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561187457600080fd5b5051919050565b60006020828403121561188d57600080fd5b81516112df81611737565b60006000198214156118ac576118ac6117f5565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156118e3576118e36117f5565b500290565b600080821280156001600160ff1b038490038513161561190a5761190a6117f5565b600160ff1b8390038412811615611923576119236117f5565b50500190565b6000821982111561193c5761193c6117f5565b500190565b600082821015611953576119536117f5565b500390565b60006020828403121561196a57600080fd5b81516112df81611782565b60008083128015600160ff1b850184121615611993576119936117f5565b6001600160ff1b03840183138116156119ae576119ae6117f5565b50500390565b600060208083528351808285015260005b818110156119e1578581018301518582016040015282016119c5565b818111156119f3576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212208684221e353ebfdc57107f4b25a0edcddbb7795e2579be304a30235eb0a870e864736f6c634300080900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0
Deployed Bytecode
0x6080604052600436106103fe5760003560e01c80638095d56411610213578063c492f04611610123578063e7f444b3116100ab578063f27fd2541161007a578063f27fd25414610bd8578063f2fde38b14610bf8578063f54afa7814610c18578063f8b45b0514610c2e578063fc0c546a14610c4457600080fd5b8063e7f444b314610b77578063e884f26014610b8d578063e98030c714610ba2578063ee40166e14610bc257600080fd5b8063ccd146b2116100f2578063ccd146b214610ada578063d0a3981414610af0578063dd62ed3e14610b06578063e2f4560514610b4c578063e7841ec014610b6257600080fd5b8063c492f04614610a74578063c876d0b914610a94578063c8c8ebe414610aae578063ccb6135814610ac457600080fd5b8063a8b9d240116101a6578063b9e9370011610175578063b9e93700146109df578063bbc0c742146109f5578063c024666814610a14578063c0f306ef14610a34578063c17b5b8c14610a5457600080fd5b8063a8b9d2401461090b578063a9059cbb1461092b578063ad56c13c1461094b578063b62496f5146109b057600080fd5b80639a7a23d6116101e25780639a7a23d6146108a05780639c1b8af5146108c0578063a26579ad146108d6578063a457c2d7146108eb57600080fd5b80638095d5641461082d578063871c128d1461084d5780638da5cb5b1461086d57806395d89b411461088b57600080fd5b806349bd5a5e1161030e5780636843cd84116102a1578063715018a611610270578063715018a6146107ae57806371778e7d146107c35780637571336a146107d857806375f0a874146107f85780637fa787ba1461081857600080fd5b80636843cd841461072e5780636ddd17131461074e578063700bb1911461076e57806370a082311461078e57600080fd5b80634fbee193116102dd5780634fbee193146106aa5780635e35359e146106e357806364b0f65314610703578063680789521461071857600080fd5b806349bd5a5e146106315780634a62bb65146106655780634af6f7ee1461067f5780634e71d92d1461069557600080fd5b80631a8145bb1161039157806330bb4cff1161036057806330bb4cff1461059e578063313ce567146105b357806331e79db0146105cf57806339509351146105f15780633f3539ef1461061157600080fd5b80631a8145bb146105325780631fc851bd1461054857806323b872dd1461055e5780632c1f52161461057e57600080fd5b806310d5de53116103cd57806310d5de531461049f5780631694505e146104cf57806318160ddd1461050757806319466ebe1461051c57600080fd5b806306fdde031461040a578063095ea7b314610435578063099d0d30146104655780630f4432e31461048957600080fd5b3661040557005b600080fd5b34801561041657600080fd5b5061041f610c6c565b60405161042c91906134db565b60405180910390f35b34801561044157600080fd5b50610455610450366004613545565b610cfe565b604051901515815260200161042c565b34801561047157600080fd5b5061047b60155481565b60405190815260200161042c565b34801561049557600080fd5b5061047b600c5481565b3480156104ab57600080fd5b506104556104ba366004613571565b601f6020526000908152604090205460ff1681565b3480156104db57600080fd5b506006546104ef906001600160a01b031681565b6040516001600160a01b03909116815260200161042c565b34801561051357600080fd5b5060025461047b565b34801561052857600080fd5b5061047b601b5481565b34801561053e57600080fd5b5061047b601c5481565b34801561055457600080fd5b5061047b600e5481565b34801561056a57600080fd5b5061045561057936600461358e565b610d15565b34801561058a57600080fd5b506007546104ef906001600160a01b031681565b3480156105aa57600080fd5b5061047b610d7e565b3480156105bf57600080fd5b506040516012815260200161042c565b3480156105db57600080fd5b506105ef6105ea366004613571565b610e00565b005b3480156105fd57600080fd5b5061045561060c366004613545565b610e96565b34801561061d57600080fd5b506105ef61062c3660046135cf565b610ecc565b34801561063d57600080fd5b506104ef7f000000000000000000000000e215e87542ed147d5abd6249eacfd9d0036a5d7f81565b34801561067157600080fd5b50600f546104559060ff1681565b34801561068b57600080fd5b5061047b60175481565b3480156106a157600080fd5b506105ef611058565b3480156106b657600080fd5b506104556106c5366004613571565b6001600160a01b03166000908152601e602052604090205460ff1690565b3480156106ef57600080fd5b506105ef6106fe36600461358e565b6110df565b34801561070f57600080fd5b5061047b6112a1565b34801561072457600080fd5b5061047b60185481565b34801561073a57600080fd5b5061047b610749366004613571565b6112e6565b34801561075a57600080fd5b50600f546104559062010000900460ff1681565b34801561077a57600080fd5b506105ef6107893660046135cf565b611365565b34801561079a57600080fd5b5061047b6107a9366004613571565b611446565b3480156107ba57600080fd5b506105ef611461565b3480156107cf57600080fd5b5061047b6114d5565b3480156107e457600080fd5b506105ef6107f33660046135f6565b61151a565b34801561080457600080fd5b506008546104ef906001600160a01b031681565b34801561082457600080fd5b506105ef6115a4565b34801561083957600080fd5b506105ef61084836600461362f565b61165b565b34801561085957600080fd5b506105ef6108683660046135cf565b6116fe565b34801561087957600080fd5b506005546001600160a01b03166104ef565b34801561089757600080fd5b5061041f611842565b3480156108ac57600080fd5b506105ef6108bb3660046135f6565b611851565b3480156108cc57600080fd5b5061047b601d5481565b3480156108e257600080fd5b5061047b61193f565b3480156108f757600080fd5b50610455610906366004613545565b611984565b34801561091757600080fd5b5061047b610926366004613571565b6119d3565b34801561093757600080fd5b50610455610946366004613545565b611a06565b34801561095757600080fd5b5061096b610966366004613571565b611a13565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161042c565b3480156109bc57600080fd5b506104556109cb366004613571565b602080526000908152604090205460ff1681565b3480156109eb57600080fd5b5061047b60165481565b348015610a0157600080fd5b50600f5461045590610100900460ff1681565b348015610a2057600080fd5b506105ef610a2f3660046135f6565b611abd565b348015610a4057600080fd5b506105ef610a4f366004613571565b611b3f565b348015610a6057600080fd5b506105ef610a6f36600461362f565b611b9b565b348015610a8057600080fd5b506105ef610a8f36600461365b565b611c3e565b348015610aa057600080fd5b506011546104559060ff1681565b348015610aba57600080fd5b5061047b60095481565b348015610ad057600080fd5b5061047b60195481565b348015610ae657600080fd5b5061047b60135481565b348015610afc57600080fd5b5061047b60125481565b348015610b1257600080fd5b5061047b610b213660046136e1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b5857600080fd5b5061047b600a5481565b348015610b6e57600080fd5b5061047b611d1a565b348015610b8357600080fd5b5061047b60145481565b348015610b9957600080fd5b50610455611d5f565b348015610bae57600080fd5b506105ef610bbd3660046135cf565b611d9c565b348015610bce57600080fd5b5061047b600d5481565b348015610be457600080fd5b5061096b610bf33660046135cf565b611df7565b348015610c0457600080fd5b506105ef610c13366004613571565b611e39565b348015610c2457600080fd5b5061047b601a5481565b348015610c3a57600080fd5b5061047b600b5481565b348015610c5057600080fd5b506104ef73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b606060038054610c7b9061370f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca79061370f565b8015610cf45780601f10610cc957610100808354040283529160200191610cf4565b820191906000526020600020905b815481529060010190602001808311610cd757829003601f168201915b5050505050905090565b6000610d0b338484611f8a565b5060015b92915050565b6000610d228484846120af565b610d748433610d6f85604051806060016040528060288152602001613ade602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612a9c565b611f8a565b5060019392505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610dc357600080fd5b505afa158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb919061374a565b905090565b6005546001600160a01b03163314610e335760405162461bcd60e51b8152600401610e2a90613763565b60405180910390fd5b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d0b918590610d6f9086611f24565b6005546001600160a01b03163314610ef65760405162461bcd60e51b8152600401610e2a90613763565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190613798565b81600081518110610fa657610fa66137b5565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610fda57610fda6137b5565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de9590849061102290600090869061dead90429060040161380f565b6000604051808303818588803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b50505050505050565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156110a457600080fd5b505af11580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc9190613844565b50565b6005546001600160a01b031633146111095760405162461bcd60e51b8152600401610e2a90613763565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b15801561114a57600080fd5b505afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611182919061374a565b10156111d05760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e63650000000000006044820152606401610e2a565b60405163a9059cbb60e01b81526001600160a01b03831660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063a9059cbb90604401602060405180830381600087803b15801561122c57600080fd5b505af192505050801561125c575060408051601f3d908101601f1916820190925261125991810190613844565b60015b61129a5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610e2a565b505b505050565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610dc357600080fd5b60075460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b60206040518083038186803b15801561132d57600080fd5b505afa158015611341573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0f919061374a565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113eb9190613861565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461148b5760405162461bcd60e51b8152600401610e2a90613763565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6007546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f916004808301926020929190829003018186803b158015610dc357600080fd5b6005546001600160a01b031633146115445760405162461bcd60e51b8152600401610e2a90613763565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b031633146115ce5760405162461bcd60e51b8152600401610e2a90613763565b604051600090339047908381818185875af1925050503d8060008114611610576040519150601f19603f3d011682016040523d82523d6000602084013e611615565b606091505b50509050806110dc5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610e2a565b6005546001600160a01b031633146116855760405162461bcd60e51b8152600401610e2a90613763565b6018839055601782905560198190558061169f83856138a5565b6116a991906138a5565b60168190556014101561129c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610e2a565b6005546001600160a01b031633146117285760405162461bcd60e51b8152600401610e2a90613763565b62030d40811015801561173e57506207a1208111155b6117a85760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610e2a565b601d5481141561180f5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610e2a565b601d5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601d55565b606060048054610c7b9061370f565b6005546001600160a01b0316331461187b5760405162461bcd60e51b8152600401610e2a90613763565b7f000000000000000000000000e215e87542ed147d5abd6249eacfd9d0036a5d7f6001600160a01b0316826001600160a01b031614156119315760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610e2a565b61193b8282612ad6565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610dc357600080fd5b6000610d0b3384610d6f85604051806060016040528060258152602001613b06602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612a9c565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611315565b6000610d0b3384846120af565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa291906138bd565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611ae75760405162461bcd60e51b8152600401610e2a90613763565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611598565b6005546001600160a01b03163314611b695760405162461bcd60e51b8152600401610e2a90613763565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610e61565b6005546001600160a01b03163314611bc55760405162461bcd60e51b8152600401610e2a90613763565b60148390556013829055601581905580611bdf83856138a5565b611be991906138a5565b60128190556014101561129c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610e2a565b6005546001600160a01b03163314611c685760405162461bcd60e51b8152600401610e2a90613763565b60005b82811015611cd95781601e6000868685818110611c8a57611c8a6137b5565b9050602002016020810190611c9f9190613571565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611cd181613927565b915050611c6b565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611d0d93929190613942565b60405180910390a1505050565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610dc357600080fd5b6005546000906001600160a01b03163314611d8c5760405162461bcd60e51b8152600401610e2a90613763565b506011805460ff19169055600190565b6005546001600160a01b03163314611dc65760405162461bcd60e51b8152600401610e2a90613763565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610e61565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611a51565b6005546001600160a01b03163314611e635760405162461bcd60e51b8152600401610e2a90613763565b6001600160a01b038116611ec85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e2a565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080611f3183856138a5565b905083811015611f835760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e2a565b9392505050565b6001600160a01b038316611fec5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e2a565b6001600160a01b03821661204d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e2a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166120d55760405162461bcd60e51b8152600401610e2a9061399b565b6001600160a01b0382166120fb5760405162461bcd60e51b8152600401610e2a906139e0565b8061210c5761129c83836000612ba5565b600f54610100900460ff166121a6576001600160a01b0383166000908152601e602052604090205460ff168061215a57506001600160a01b0382166000908152601e602052604090205460ff165b6121a65760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610e2a565b600f5460ff161561259e576005546001600160a01b038481169116148015906121dd57506005546001600160a01b03838116911614155b80156121f157506001600160a01b03821615155b801561220857506001600160a01b03821661dead14155b801561221e5750600654600160a01b900460ff16155b1561259e5760115460ff1615612346576005546001600160a01b0383811691161480159061225a57506006546001600160a01b03838116911614155b801561229857507f000000000000000000000000e215e87542ed147d5abd6249eacfd9d0036a5d7f6001600160a01b0316826001600160a01b031614155b15612346573260009081526010602052604090205443116123335760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610e2a565b3260009081526010602052604090204390555b6001600160a01b038316600090815260208052604090205460ff16801561238657506001600160a01b0382166000908152601f602052604090205460ff16155b15612464576009548111156123fb5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610e2a565b600b5461240783611446565b61241190836138a5565b111561245f5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610e2a565b61259e565b6001600160a01b038216600090815260208052604090205460ff1680156124a457506001600160a01b0383166000908152601f602052604090205460ff16155b1561251a5760095481111561245f5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610e2a565b6001600160a01b0382166000908152601f602052604090205460ff1661259e57600b5461254683611446565b61255090836138a5565b111561259e5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610e2a565b60006125a930611446565b600a54909150811080159081906125c85750600f5462010000900460ff165b80156125de5750600654600160a01b900460ff16155b801561260257506001600160a01b038516600090815260208052604090205460ff16155b801561262757506001600160a01b0385166000908152601e602052604090205460ff16155b801561264c57506001600160a01b0384166000908152601e602052604090205460ff16155b1561267a576006805460ff60a01b1916600160a01b17905561266c612cae565b6006805460ff60a01b191690555b6006546001600160a01b0386166000908152601e602052604090205460ff600160a01b9092048216159116806126c857506001600160a01b0385166000908152601e602052604090205460ff165b156126d1575060005b600081156128ba576001600160a01b038616600090815260208052604090205460ff16801561270257506000601254115b156127c05761272760646127216012548861303190919063ffffffff16565b906130b0565b90506012546013548261273a9190613a23565b6127449190613a42565b601a600082825461275591906138a5565b909155505060125460155461276a9083613a23565b6127749190613a42565b601c600082825461278591906138a5565b909155505060125460145461279a9083613a23565b6127a49190613a42565b601b60008282546127b591906138a5565b9091555061289c9050565b6001600160a01b038716600090815260208052604090205460ff1680156127e957506000601654115b1561289c5761280860646127216016548861303190919063ffffffff16565b90506016546017548261281b9190613a23565b6128259190613a42565b601a600082825461283691906138a5565b909155505060165460195461284b9083613a23565b6128559190613a42565b601c600082825461286691906138a5565b909155505060165460185461287b9083613a23565b6128859190613a42565b601b600082825461289691906138a5565b90915550505b80156128ad576128ad873083612ba5565b6128b78186613a64565b94505b6128c5878787612ba5565b6007546001600160a01b031663e30443bc886128e081611446565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561292657600080fd5b505af1925050508015612937575060015b506007546001600160a01b031663e30443bc8761295381611446565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561299957600080fd5b505af19250505080156129aa575060015b50600654600160a01b900460ff1661104f57601d546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015612a0857600080fd5b505af1925050508015612a38575060408051601f3d908101601f19168201909252612a3591810190613861565b60015b612a4157612a92565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b5050505050505050565b60008184841115612ac05760405162461bcd60e51b8152600401610e2a91906134db565b506000612acd8486613a64565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff1916821515179055612b03828261151a565b8015612b695760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612b5057600080fd5b505af1158015612b64573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038316612bcb5760405162461bcd60e51b8152600401610e2a9061399b565b6001600160a01b038216612bf15760405162461bcd60e51b8152600401610e2a906139e0565b612c2e81604051806060016040528060268152602001613ab8602691396001600160a01b0386166000908152602081905260409020549190612a9c565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612c5d9082611f24565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016120a2565b6000612cb930611446565b9050600080601a54601b54601c54612cd191906138a5565b612cdb91906138a5565b9050821580612ce8575080155b15612cf257505050565b6000600282601c5486612d059190613a23565b612d0f9190613a42565b612d199190613a42565b90506000612d2785836130f2565b905047612d3382613134565b6000612d3f47836130f2565b90506000612d5c86612721601b548561303190919063ffffffff16565b90506000612d7987612721601a548661303190919063ffffffff16565b9050600081612d888486613a64565b612d929190613a64565b6000601c819055601b819055601a5590508615801590612db25750600081115b15612e0557612dc1878261329d565b601c54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b612e0e82613369565b6040516370a0823160e01b815230600482015260009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a082319060240160206040518083038186803b158015612e5b57600080fd5b505afa158015612e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e93919061374a565b60075460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063a9059cbb90604401602060405180830381600087803b158015612ef657600080fd5b505af1158015612f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2e9190613844565b99508915612fcf5760075460405163b0c7ce3760e01b8152600481018390526001600160a01b039091169063b0c7ce3790602401600060405180830381600087803b158015612f7c57600080fd5b505af1158015612f90573d6000803e3d6000fd5b505060408051848152602081018790527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b6008546040516001600160a01b03909116904790600081818185875af1925050503d806000811461301c576040519150601f19603f3d011682016040523d82523d6000602084013e613021565b606091505b5050505050505050505050505050565b60008261304057506000610d0f565b600061304c8385613a23565b9050826130598583613a42565b14611f835760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e2a565b6000611f8383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506134ad565b6000611f8383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a9c565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613169576131696137b5565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131bd57600080fd5b505afa1580156131d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f59190613798565b81600181518110613208576132086137b5565b6001600160a01b03928316602091820292909201015260065461322e9130911684611f8a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613267908590600090869030904290600401613a7b565b600060405180830381600087803b15801561328157600080fd5b505af1158015613295573d6000803e3d6000fd5b505050505050565b6006546132b59030906001600160a01b031684611f8a565b60065460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820152737282755d74d9e7098a7770cc06abc57270a9778460848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561333057600080fd5b505af1158015613344573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e8f9190613861565b80156110dc576040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b1580156133d457600080fd5b505afa1580156133e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340c9190613798565b8160008151811061341f5761341f6137b5565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881600181518110613467576134676137b5565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de959084906110229060009086903090429060040161380f565b600081836134ce5760405162461bcd60e51b8152600401610e2a91906134db565b506000612acd8486613a42565b600060208083528351808285015260005b81811015613508578581018301518582016040015282016134ec565b8181111561351a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146110dc57600080fd5b6000806040838503121561355857600080fd5b823561356381613530565b946020939093013593505050565b60006020828403121561358357600080fd5b8135611f8381613530565b6000806000606084860312156135a357600080fd5b83356135ae81613530565b925060208401356135be81613530565b929592945050506040919091013590565b6000602082840312156135e157600080fd5b5035919050565b80151581146110dc57600080fd5b6000806040838503121561360957600080fd5b823561361481613530565b91506020830135613624816135e8565b809150509250929050565b60008060006060848603121561364457600080fd5b505081359360208301359350604090920135919050565b60008060006040848603121561367057600080fd5b833567ffffffffffffffff8082111561368857600080fd5b818601915086601f83011261369c57600080fd5b8135818111156136ab57600080fd5b8760208260051b85010111156136c057600080fd5b602092830195509350508401356136d6816135e8565b809150509250925092565b600080604083850312156136f457600080fd5b82356136ff81613530565b9150602083013561362481613530565b600181811c9082168061372357607f821691505b6020821081141561374457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561375c57600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156137aa57600080fd5b8151611f8381613530565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156138045781516001600160a01b0316875295820195908201906001016137df565b509495945050505050565b84815260806020820152600061382860808301866137cb565b6001600160a01b03949094166040830152506060015292915050565b60006020828403121561385657600080fd5b8151611f83816135e8565b60008060006060848603121561387657600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b600082198211156138b8576138b861388f565b500190565b600080600080600080600080610100898b0312156138da57600080fd5b88516138e581613530565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600060001982141561393b5761393b61388f565b5060010190565b6040808252810183905260008460608301825b8681101561398557823561396881613530565b6001600160a01b0316825260209283019290910190600101613955565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615613a3d57613a3d61388f565b500290565b600082613a5f57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613a7657613a7661388f565b500390565b85815284602082015260a060408201526000613a9a60a08301866137cb565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220efd94dce88d44d3ac1db8cd99286bc727c56ba7271a63a842a74819d38204d3164736f6c63430008090033
Deployed Bytecode Sourcemap
41789:21136:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9525:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11692:169;;;;;;;;;;-1:-1:-1;11692:169:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;11692:169:0;1072:187:1;43040:31:0;;;;;;;;;;;;;;;;;;;1410:25:1;;;1398:2;1383:18;43040:31:0;1264:177:1;42300:39:0;;;;;;;;;;;;;;;;43615:64;;;;;;;;;;-1:-1:-1;43615:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41862:41;;;;;;;;;;-1:-1:-1;41862:41:0;;;;-1:-1:-1;;;;;41862:41:0;;;;;;-1:-1:-1;;;;;1889:32:1;;;1871:51;;1859:2;1844:18;41862:41:0;1698:230:1;10645:108:0;;;;;;;;;;-1:-1:-1;10733:12:0;;10645:108;;43271:33;;;;;;;;;;;;;;;;43311;;;;;;;;;;;;;;;;42462;;;;;;;;;;;;;;;;12343:355;;;;;;;;;;-1:-1:-1;12343:355:0;;;;;:::i;:::-;;:::i;41987:38::-;;;;;;;;;;-1:-1:-1;41987:38:0;;;;-1:-1:-1;;;;;41987:38:0;;;51584:141;;;;;;;;;;;;;:::i;10487:93::-;;;;;;;;;;-1:-1:-1;10487:93:0;;10570:2;2776:36:1;;2764:2;2749:18;10487:93:0;2634:184:1;48426:130:0;;;;;;;;;;-1:-1:-1;48426:130:0;;;;;:::i;:::-;;:::i;:::-;;13107:218;;;;;;;;;;-1:-1:-1;13107:218:0;;;;;:::i;:::-;;:::i;61866:529::-;;;;;;;;;;-1:-1:-1;61866:529:0;;;;;:::i;:::-;;:::i;41910:38::-;;;;;;;;;;;;;;;42571:33;;;;;;;;;;-1:-1:-1;42571:33:0;;;;;;;;43118:28;;;;;;;;;;;;;;;;53080:97;;;;;;;;;;;;;:::i;51733:125::-;;;;;;;;;;-1:-1:-1;51733:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;51822:28:0;51798:4;51822:28;;;:19;:28;;;;;;;;;51733:125;62606:315;;;;;;;;;;-1:-1:-1;62606:315:0;;;;;:::i;:::-;;:::i;53319:141::-;;;;;;;;;;;;;:::i;43153:30::-;;;;;;;;;;;;;;;;52018:134;;;;;;;;;;-1:-1:-1;52018:134:0;;;;;:::i;:::-;;:::i;42650:30::-;;;;;;;;;;-1:-1:-1;42650:30:0;;;;;;;;;;;52813:259;;;;;;;;;;-1:-1:-1;52813:259:0;;;;;:::i;:::-;;:::i;10816:127::-;;;;;;;;;;-1:-1:-1;10816:127:0;;;;;:::i;:::-;;:::i;26675:148::-;;;;;;;;;;;;;:::i;53472:119::-;;;;;;;;;;;;;:::i;49603:202::-;;;;;;;;;;-1:-1:-1;49603:202:0;;;;;:::i;:::-;;:::i;42034:30::-;;;;;;;;;;-1:-1:-1;42034:30:0;;;;-1:-1:-1;;;;;42034:30:0;;;62407:191;;;;;;;;;;;;;:::i;48795:385::-;;;;;;;;;;-1:-1:-1;48795:385:0;;;;;:::i;:::-;;:::i;50933:395::-;;;;;;;;;;-1:-1:-1;50933:395:0;;;;;:::i;:::-;;:::i;26033:79::-;;;;;;;;;;-1:-1:-1;26098:6:0;;-1:-1:-1;;;;;26098:6:0;26033:79;;9744:104;;;;;;;;;;;;;:::i;50319:256::-;;;;;;;;;;-1:-1:-1;50319:256:0;;;;;:::i;:::-;;:::i;43423:40::-;;;;;;;;;;;;;;;;51468:108;;;;;;;;;;;;;:::i;13828:269::-;;;;;;;;;;-1:-1:-1;13828:269:0;;;;;:::i;:::-;;:::i;51866:147::-;;;;;;;;;;-1:-1:-1;51866:147:0;;;;;:::i;:::-;;:::i;11156:175::-;;;;;;;;;;-1:-1:-1;11156:175:0;;;;;:::i;:::-;;:::i;52160:318::-;;;;;;;;;;-1:-1:-1;52160:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4404:32:1;;;4386:51;;4468:2;4453:18;;4446:34;;;;4496:18;;;4489:34;;;;4554:2;4539:18;;4532:34;;;;4597:3;4582:19;;4575:35;4424:3;4626:19;;4619:35;4685:3;4670:19;;4663:35;4729:3;4714:19;;4707:35;4373:3;4358:19;52160:318:0;4047:701:1;43837:58:0;;;;;;;;;;-1:-1:-1;43837:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43084:27;;;;;;;;;;;;;;;;42611:32;;;;;;;;;;-1:-1:-1;42611:32:0;;;;;;;;;;;49813:184;;;;;;;;;;-1:-1:-1;49813:184:0;;;;;:::i;:::-;;:::i;48661:126::-;;;;;;;;;;-1:-1:-1;48661:126:0;;;;;:::i;:::-;;:::i;49192:394::-;;;;;;;;;;-1:-1:-1;49192:394:0;;;;;:::i;:::-;;:::i;50005:306::-;;;;;;;;;;-1:-1:-1;50005:306:0;;;;;:::i;:::-;;:::i;42872:40::-;;;;;;;;;;-1:-1:-1;42872:40:0;;;;;;;;42181:35;;;;;;;;;;;;;;;;43190:30;;;;;;;;;;;;;;;;42966:29;;;;;;;;;;;;;;;;42931:28;;;;;;;;;;;;;;;;11394:151;;;;;;;;;;-1:-1:-1;11394:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11510:18:0;;;11483:7;11510:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11394:151;42223:33;;;;;;;;;;;;;;;;53185:126;;;;;;;;;;;;;:::i;43002:31::-;;;;;;;;;;;;;;;;48199:134;;;;;;;;;;;;;:::i;51336:124::-;;;;;;;;;;-1:-1:-1;51336:124:0;;;;;:::i;:::-;;:::i;42385:37::-;;;;;;;;;;;;;;;;52483:325;;;;;;;;;;-1:-1:-1;52483:325:0;;;;;:::i;:::-;;:::i;26978:244::-;;;;;;;;;;-1:-1:-1;26978:244:0;;;;;:::i;:::-;;:::i;43233:31::-;;;;;;;;;;;;;;;;42263:24;;;;;;;;;;;;;;;;42077:83;;;;;;;;;;;;42117:42;42077:83;;9525:100;9579:13;9612:5;9605:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9525:100;:::o;11692:169::-;11775:4;11792:39;606:10;11815:7;11824:6;11792:8;:39::i;:::-;-1:-1:-1;11849:4:0;11692:169;;;;;:::o;12343:355::-;12483:4;12500:36;12510:6;12518:9;12529:6;12500:9;:36::i;:::-;12547:121;12556:6;606:10;12578:89;12616:6;12578:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12578:19:0;;;;;;:11;:19;;;;;;;;606:10;12578:33;;;;;;;;;;:37;:89::i;:::-;12547:8;:121::i;:::-;-1:-1:-1;12686:4:0;12343:355;;;;;:::o;51584:141::-;51674:15;;:43;;;-1:-1:-1;;;51674:43:0;;;;51647:7;;-1:-1:-1;;;;;51674:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51667:50;;51584:141;:::o;48426:130::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;;;;;;;;;48503:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;48503:45:0;;-1:-1:-1;;;;;1889:32:1;;;48503:45:0::1;::::0;::::1;1871:51:1::0;48503:15:0;;::::1;::::0;:36:::1;::::0;1844:18:1;;48503:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48426:130:::0;:::o;13107:218::-;606:10;13195:4;13244:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13244:34:0;;;;;;;;;;13195:4;;13212:83;;13235:7;;13244:50;;13283:10;13244:38;:50::i;61866:529::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;62027:16:::1;::::0;;62041:1:::1;62027:16:::0;;;;;::::1;::::0;;62003:21:::1;::::0;62027:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;62064:15:0::1;::::0;:22:::1;::::0;;-1:-1:-1;;;62064:22:0;;;;62003:40;;-1:-1:-1;;;;;;62064:15:0;;::::1;::::0;:20:::1;::::0;-1:-1:-1;62064:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62054:4;62059:1;62054:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;62054:32:0::1;;;-1:-1:-1::0;;;;;62054:32:0::1;;;::::0;::::1;62115:4;62097;62102:1;62097:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62097:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;62159:15:::1;::::0;:228:::1;::::0;-1:-1:-1;;;62159:228:0;;:15;::::1;::::0;:66:::1;::::0;62233:14;;62159:228:::1;::::0;:15:::1;::::0;62312:4;;62339:6:::1;::::0;62361:15:::1;::::0;62159:228:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;61934:461;61866:529:::0;:::o;53080:97::-;53111:15;;:58;;-1:-1:-1;;;53111:58:0;;53150:10;53111:58;;;8521:51:1;53111:15:0;8588:18:1;;;8581:50;-1:-1:-1;;;;;53111:15:0;;;;:30;;8494:18:1;;53111:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53080:97::o;62606:315::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;62717:45:::1;::::0;-1:-1:-1;;;62717:45:0;;62756:4:::1;62717:45;::::0;::::1;1871:51:1::0;62766:5:0;;-1:-1:-1;;;;;62717:30:0;::::1;::::0;::::1;::::0;1844:18:1;;62717:45:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;62709:93;;;::::0;-1:-1:-1;;;62709:93:0;;9094:2:1;62709:93:0::1;::::0;::::1;9076:21:1::0;9133:2;9113:18;;;9106:30;9172:28;9152:18;;;9145:56;9218:18;;62709:93:0::1;8892:350:1::0;62709:93:0::1;62819:33;::::0;-1:-1:-1;;;62819:33:0;;-1:-1:-1;;;;;9439:32:1;;62819:33:0::1;::::0;::::1;9421:51:1::0;9488:18;;;9481:34;;;42117:42:0::1;::::0;62819:22:::1;::::0;9394:18:1;;62819:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;62819:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;62819:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;62815:99;;62877:25;::::0;-1:-1:-1;;;62877:25:0;;9728:2:1;62877:25:0::1;::::0;::::1;9710:21:1::0;9767:2;9747:18;;;9740:30;-1:-1:-1;;;9786:18:1;;;9779:45;9841:18;;62877:25:0::1;9526:339:1::0;62815:99:0::1;;;62606:315:::0;;;:::o;53319:141::-;53411:15;;:41;;;-1:-1:-1;;;53411:41:0;;;;53384:7;;-1:-1:-1;;;;;53411:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;52018:134;52109:15;;:38;;-1:-1:-1;;;52109:38:0;;-1:-1:-1;;;;;1889:32:1;;;52109:38:0;;;1871:51:1;52088:7:0;;52109:15;;:29;;1844:18:1;;52109:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;52813:259::-;52939:15;;:28;;-1:-1:-1;;;;;;52939:28:0;;;;;1410:25:1;;;52873:18:0;;;;;;-1:-1:-1;;;;;52939:15:0;;:23;;1383:18:1;;52939:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52977:87;;;10412:25:1;;;10468:2;10453:18;;10446:34;;;10496:18;;;10489:34;;;10554:2;10539:18;;10532:34;;;52872:95:0;;-1:-1:-1;52872:95:0;;-1:-1:-1;52872:95:0;-1:-1:-1;53054:9:0;;53042:5;;52977:87;;10399:3:1;10384:19;52977:87:0;;;;;;;52867:205;;;52813:259;:::o;10816:127::-;-1:-1:-1;;;;;10917:18:0;10890:7;10917:18;;;;;;;;;;;;10816:127::o;26675:148::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;26766:6:::1;::::0;26745:40:::1;::::0;26782:1:::1;::::0;-1:-1:-1;;;;;26766:6:0::1;::::0;26745:40:::1;::::0;26782:1;;26745:40:::1;26796:6;:19:::0;;-1:-1:-1;;;;;;26796:19:0::1;::::0;;26675:148::o;53472:119::-;53553:15;;:30;;;-1:-1:-1;;;53553:30:0;;;;53526:7;;-1:-1:-1;;;;;53553:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;49603:202;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49693:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;49693:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49755:42;;1212:41:1;;;49755:42:0::1;::::0;1185:18:1;49755:42:0::1;;;;;;;;49603:202:::0;;:::o;62407:191::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;62483:58:::1;::::0;62466:12:::1;::::0;62491:10:::1;::::0;62515:21:::1;::::0;62466:12;62483:58;62466:12;62483:58;62515:21;62491:10;62483:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62465:76;;;62560:7;62552:38;;;::::0;-1:-1:-1;;;62552:38:0;;10989:2:1;62552:38:0::1;::::0;::::1;10971:21:1::0;11028:2;11008:18;;;11001:30;-1:-1:-1;;;11047:18:1;;;11040:48;11105:18;;62552:38:0::1;10787:342:1::0;48795:385:0;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;48915:15:::1;:31:::0;;;48957:13:::1;:27:::0;;;48995:15:::1;:31:::0;;;49013:13;49052:31:::1;48973:11:::0;48933:13;49052:31:::1;:::i;:::-;:49;;;;:::i;:::-;49037:12;:64:::0;;;49136:2:::1;-1:-1:-1::0;49120:18:0::1;49112:60;;;::::0;-1:-1:-1;;;49112:60:0;;11601:2:1;49112:60:0::1;::::0;::::1;11583:21:1::0;11640:2;11620:18;;;11613:30;11679:31;11659:18;;;11652:59;11728:18;;49112:60:0::1;11399:353:1::0;50933:395:0;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;51033:6:::1;51021:8;:18;;:40;;;;;51055:6;51043:8;:18;;51021:40;51013:106;;;::::0;-1:-1:-1;;;51013:106:0;;11959:2:1;51013:106:0::1;::::0;::::1;11941:21:1::0;11998:2;11978:18;;;11971:30;12037:34;12017:18;;;12010:62;-1:-1:-1;;;12088:18:1;;;12081:51;12149:19;;51013:106:0::1;11757:417:1::0;51013:106:0::1;51150:16;;51138:8;:28;;51130:85;;;::::0;-1:-1:-1;;;51130:85:0;;12381:2:1;51130:85:0::1;::::0;::::1;12363:21:1::0;12420:2;12400:18;;;12393:30;12459:34;12439:18;;;12432:62;-1:-1:-1;;;12510:18:1;;;12503:42;12562:19;;51130:85:0::1;12179:408:1::0;51130:85:0::1;51265:16;::::0;51231:51:::1;::::0;51255:8;;51231:51:::1;::::0;;;::::1;51293:16;:27:::0;50933:395::o;9744:104::-;9800:13;9833:7;9826:14;;;;;:::i;50319:256::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;50426:13:::1;-1:-1:-1::0;;;;;50418:21:0::1;:4;-1:-1:-1::0;;;;;50418:21:0::1;;;50410:103;;;::::0;-1:-1:-1;;;50410:103:0;;12794:2:1;50410:103:0::1;::::0;::::1;12776:21:1::0;12833:2;12813:18;;;12806:30;12872:34;12852:18;;;12845:62;12943:34;12923:18;;;12916:62;-1:-1:-1;;;12994:19:1;;;12987:36;13040:19;;50410:103:0::1;12592:473:1::0;50410:103:0::1;50526:41;50555:4;50561:5;50526:28;:41::i;:::-;50319:256:::0;;:::o;51468:108::-;51541:15;;:27;;;-1:-1:-1;;;51541:27:0;;;;51514:7;;-1:-1:-1;;;;;51541:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;13828:269;13921:4;13938:129;606:10;13961:7;13970:96;14009:15;13970:96;;;;;;;;;;;;;;;;;606:10;13970:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13970:34:0;;;;;;;;;;;;:38;:96::i;51866:147::-;51959:15;;:47;;-1:-1:-1;;;51959:47:0;;-1:-1:-1;;;;;1889:32:1;;;51959:47:0;;;1871:51:1;51935:7:0;;51959:15;;:38;;1844:18:1;;51959:47:0;1698:230:1;11156:175:0;11242:4;11259:42;606:10;11283:9;11294:6;11259:9;:42::i;52160:318::-;52435:15;;:35;;-1:-1:-1;;;52435:35:0;;-1:-1:-1;;;;;1889:32:1;;;52435:35:0;;;1871:51:1;52256:7:0;;;;;;;;;;;;;;;;52435:15;;;:26;;1844:18:1;;52435:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52428:42;;;;;;;;;;;;;;;;52160:318;;;;;;;;;:::o;49813:184::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49898:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;49898:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49955:34;;1212:41:1;;;49955:34:0::1;::::0;1185:18:1;49955:34:0::1;1072:187:1::0;48661:126:0;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;48736:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;48736:43:0;;-1:-1:-1;;;;;1889:32:1;;;48736:43:0::1;::::0;::::1;1871:51:1::0;48736:15:0;;::::1;::::0;:34:::1;::::0;1844:18:1;;48736:43:0::1;1698:230:1::0;49192:394:0;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;49313:16:::1;:32:::0;;;49356:14:::1;:28:::0;;;49395:16:::1;:32:::0;;;49414:13;49454:33:::1;49373:11:::0;49332:13;49454:33:::1;:::i;:::-;:52;;;;:::i;:::-;49438:13;:68:::0;;;49542:2:::1;-1:-1:-1::0;49525:19:0::1;49517:61;;;::::0;-1:-1:-1;;;49517:61:0;;11601:2:1;49517:61:0::1;::::0;::::1;11583:21:1::0;11640:2;11620:18;;;11613:30;11679:31;11659:18;;;11652:59;11728:18;;49517:61:0::1;11399:353:1::0;50005:306:0;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;50124:9:::1;50120:115;50139:19:::0;;::::1;50120:115;;;50215:8;50180:19;:32;50200:8;;50209:1;50200:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50180:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50180:32:0;:43;;-1:-1:-1;;50180:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50160:3;::::1;::::0;::::1;:::i;:::-;;;;50120:115;;;;50252:51;50284:8;;50294;50252:51;;;;;;;;:::i;:::-;;;;;;;;50005:306:::0;;;:::o;53185:126::-;53264:15;;:39;;;-1:-1:-1;;;53264:39:0;;;;53240:7;;-1:-1:-1;;;;;53264:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;48199:134;26245:6;;48259:4;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;-1:-1:-1;48275:20:0::1;:28:::0;;-1:-1:-1;;48275:28:0::1;::::0;;;48199:134;:::o;51336:124::-;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;51410:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;51410:42:0;;::::1;::::0;::::1;1410:25:1::0;;;-1:-1:-1;;;;;51410:15:0;;::::1;::::0;:31:::1;::::0;1383:18:1;;51410:42:0::1;1264:177:1::0;52483:325:0;52760:15;;:40;;-1:-1:-1;;;52760:40:0;;;;;1410:25:1;;;52584:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52760:15:0;;;;:33;;1383:18:1;;52760:40:0;1264:177:1;26978:244:0;26245:6;;-1:-1:-1;;;;;26245:6:0;606:10;26245:22;26237:67;;;;-1:-1:-1;;;26237:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27067:22:0;::::1;27059:73;;;::::0;-1:-1:-1;;;27059:73:0;;14897:2:1;27059:73:0::1;::::0;::::1;14879:21:1::0;14936:2;14916:18;;;14909:30;14975:34;14955:18;;;14948:62;-1:-1:-1;;;15026:18:1;;;15019:36;15072:19;;27059:73:0::1;14695:402:1::0;27059:73:0::1;27169:6;::::0;27148:38:::1;::::0;-1:-1:-1;;;;;27148:38:0;;::::1;::::0;27169:6:::1;::::0;27148:38:::1;::::0;27169:6:::1;::::0;27148:38:::1;27197:6;:17:::0;;-1:-1:-1;;;;;;27197:17:0::1;-1:-1:-1::0;;;;;27197:17:0;;;::::1;::::0;;;::::1;::::0;;26978:244::o;21077:181::-;21135:7;;21167:5;21171:1;21167;:5;:::i;:::-;21155:17;;21196:1;21191;:6;;21183:46;;;;-1:-1:-1;;;21183:46:0;;15304:2:1;21183:46:0;;;15286:21:1;15343:2;15323:18;;;15316:30;15382:29;15362:18;;;15355:57;15429:18;;21183:46:0;15102:351:1;21183:46:0;21249:1;21077:181;-1:-1:-1;;;21077:181:0:o;17028:380::-;-1:-1:-1;;;;;17164:19:0;;17156:68;;;;-1:-1:-1;;;17156:68:0;;15660:2:1;17156:68:0;;;15642:21:1;15699:2;15679:18;;;15672:30;15738:34;15718:18;;;15711:62;-1:-1:-1;;;15789:18:1;;;15782:34;15833:19;;17156:68:0;15458:400:1;17156:68:0;-1:-1:-1;;;;;17243:21:0;;17235:68;;;;-1:-1:-1;;;17235:68:0;;16065:2:1;17235:68:0;;;16047:21:1;16104:2;16084:18;;;16077:30;16143:34;16123:18;;;16116:62;-1:-1:-1;;;16194:18:1;;;16187:32;16236:19;;17235:68:0;15863:398:1;17235:68:0;-1:-1:-1;;;;;17316:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17368:32;;1410:25:1;;;17368:32:0;;1383:18:1;17368:32:0;;;;;;;;17028:380;;;:::o;53609:4544::-;-1:-1:-1;;;;;53741:18:0;;53733:68;;;;-1:-1:-1;;;53733:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53820:16:0;;53812:64;;;;-1:-1:-1;;;53812:64:0;;;;;;;:::i;:::-;53901:11;53898:92;;53929:28;53945:4;53951:2;53955:1;53929:15;:28::i;53898:92::-;54014:13;;;;;;;54010:136;;-1:-1:-1;;;;;54051:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;54080:23:0;;;;;;:19;:23;;;;;;;;54051:52;54043:91;;;;-1:-1:-1;;;54043:91:0;;17278:2:1;54043:91:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:28;17336:18;;;17329:56;17402:18;;54043:91:0;17076:350:1;54043:91:0;54169:14;;;;54166:1662;;;26098:6;;-1:-1:-1;;;;;54221:15:0;;;26098:6;;54221:15;;;;:49;;-1:-1:-1;26098:6:0;;-1:-1:-1;;;;;54257:13:0;;;26098:6;;54257:13;;54221:49;:86;;;;-1:-1:-1;;;;;;54291:16:0;;;;54221:86;:128;;;;-1:-1:-1;;;;;;54328:21:0;;54342:6;54328:21;;54221:128;:158;;;;-1:-1:-1;54371:8:0;;-1:-1:-1;;;54371:8:0;;;;54370:9;54221:158;54199:1618;;;54553:20;;;;54549:423;;;26098:6;;-1:-1:-1;;;;;54601:13:0;;;26098:6;;54601:13;;;;:47;;-1:-1:-1;54632:15:0;;-1:-1:-1;;;;;54618:30:0;;;54632:15;;54618:30;;54601:47;:79;;;;;54666:13;-1:-1:-1;;;;;54652:28:0;:2;-1:-1:-1;;;;;54652:28:0;;;54601:79;54597:356;;;54745:9;54716:39;;;;:28;:39;;;;;;54758:12;-1:-1:-1;54708:140:0;;;;-1:-1:-1;;;54708:140:0;;17633:2:1;54708:140:0;;;17615:21:1;17672:2;17652:18;;;17645:30;17711:34;17691:18;;;17684:62;17782:34;17762:18;;;17755:62;-1:-1:-1;;;17833:19:1;;;17826:40;17883:19;;54708:140:0;17431:477:1;54708:140:0;54904:9;54875:39;;;;:28;:39;;;;;54917:12;54875:54;;54597:356;-1:-1:-1;;;;;55040:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;55076:35:0;;;;;;:31;:35;;;;;;;;55075:36;55040:71;55036:766;;;55154:20;;55144:6;:30;;55136:96;;;;-1:-1:-1;;;55136:96:0;;18115:2:1;55136:96:0;;;18097:21:1;18154:2;18134:18;;;18127:30;18193:34;18173:18;;;18166:62;-1:-1:-1;;;18244:18:1;;;18237:51;18305:19;;55136:96:0;17913:417:1;55136:96:0;55289:9;;55272:13;55282:2;55272:9;:13::i;:::-;55263:22;;:6;:22;:::i;:::-;:35;;55255:75;;;;-1:-1:-1;;;55255:75:0;;18537:2:1;55255:75:0;;;18519:21:1;18576:2;18556:18;;;18549:30;18615:29;18595:18;;;18588:57;18662:18;;55255:75:0;18335:351:1;55255:75:0;55036:766;;;-1:-1:-1;;;;;55407:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;55441:37:0;;;;;;:31;:37;;;;;;;;55440:38;55407:71;55403:399;;;55521:20;;55511:6;:30;;55503:97;;;;-1:-1:-1;;;55503:97:0;;18893:2:1;55503:97:0;;;18875:21:1;18932:2;18912:18;;;18905:30;18971:34;18951:18;;;18944:62;-1:-1:-1;;;19022:18:1;;;19015:52;19084:19;;55503:97:0;18691:418:1;55403:399:0;-1:-1:-1;;;;;55647:35:0;;;;;;:31;:35;;;;;;;;55643:159;;55741:9;;55724:13;55734:2;55724:9;:13::i;:::-;55715:22;;:6;:22;:::i;:::-;:35;;55707:75;;;;-1:-1:-1;;;55707:75:0;;18537:2:1;55707:75:0;;;18519:21:1;18576:2;18556:18;;;18549:30;18615:29;18595:18;;;18588:57;18662:18;;55707:75:0;18335:351:1;55707:75:0;55834:28;55865:24;55883:4;55865:9;:24::i;:::-;55949:18;;55834:55;;-1:-1:-1;55925:42:0;;;;;;;55998:35;;-1:-1:-1;56022:11:0;;;;;;;55998:35;:61;;;;-1:-1:-1;56051:8:0;;-1:-1:-1;;;56051:8:0;;;;56050:9;55998:61;:110;;;;-1:-1:-1;;;;;;56077:31:0;;;;;;:25;:31;;;;;;;;56076:32;55998:110;:153;;;;-1:-1:-1;;;;;;56126:25:0;;;;;;:19;:25;;;;;;;;56125:26;55998:153;:194;;;;-1:-1:-1;;;;;;56169:23:0;;;;;;:19;:23;;;;;;;;56168:24;55998:194;55980:322;;;56219:8;:15;;-1:-1:-1;;;;56219:15:0;-1:-1:-1;;;56219:15:0;;;56249:10;:8;:10::i;:::-;56274:8;:16;;-1:-1:-1;;;;56274:16:0;;;55980:322;56330:8;;-1:-1:-1;;;;;56439:25:0;;56314:12;56439:25;;;:19;:25;;;;;;56330:8;-1:-1:-1;;;56330:8:0;;;;;56329:9;;56439:25;;:52;;-1:-1:-1;;;;;;56468:23:0;;;;;;:19;:23;;;;;;;;56439:52;56436:99;;;-1:-1:-1;56518:5:0;56436:99;56555:12;56646:7;56643:971;;;-1:-1:-1;;;;;56697:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;56746:1;56730:13;;:17;56697:50;56693:764;;;56774:34;56804:3;56774:25;56785:13;;56774:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;56767:41;;56871:13;;56854:14;;56847:4;:21;;;;:::i;:::-;:37;;;;:::i;:::-;56827:16;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;56951:13:0;;56932:16;;56925:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;56903:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;57031:13:0;;57012:16;;57005:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;56983:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;56693:764:0;;-1:-1:-1;56693:764:0;;-1:-1:-1;;;;;57105:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;57155:1;57140:12;;:16;57105:51;57102:355;;;57181:33;57210:3;57181:24;57192:12;;57181:6;:10;;:24;;;;:::i;:33::-;57174:40;;57273:12;;57257:13;;57250:4;:20;;;;:::i;:::-;:35;;;;:::i;:::-;57230:16;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;57351:12:0;;57333:15;;57326:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;57304:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;57429:12:0;;57411:15;;57404:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;57382:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;57102:355:0;57476:8;;57473:93;;57508:42;57524:4;57538;57545;57508:15;:42::i;:::-;57588:14;57598:4;57588:14;;:::i;:::-;;;56643:971;57626:33;57642:4;57648:2;57652:6;57626:15;:33::i;:::-;57676:15;;-1:-1:-1;;;;;57676:15:0;:26;57711:4;57718:15;57711:4;57718:9;:15::i;:::-;57676:58;;-1:-1:-1;;;;;;57676:58:0;;;;;;;-1:-1:-1;;;;;9439:32:1;;;57676:58:0;;;9421:51:1;9488:18;;;9481:34;9394:18;;57676:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57672:74;57760:15;;-1:-1:-1;;;;;57760:15:0;:26;57795:2;57800:13;57795:2;57800:9;:13::i;:::-;57760:54;;-1:-1:-1;;;;;;57760:54:0;;;;;;;-1:-1:-1;;;;;9439:32:1;;;57760:54:0;;;9421:51:1;9488:18;;;9481:34;9394:18;;57760:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57756:70;57842:8;;-1:-1:-1;;;57842:8:0;;;;57838:308;;57875:16;;57906:15;;:28;;-1:-1:-1;;;;;;57906:28:0;;;;;1410:25:1;;;-1:-1:-1;;;;;57906:15:0;;;;:23;;1383:18:1;;57906:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57906:28:0;;;;;;;;-1:-1:-1;;57906:28:0;;;;;;;;;;;;:::i;:::-;;;57902:233;;;;;58023:86;;;10412:25:1;;;10468:2;10453:18;;10446:34;;;10496:18;;;10489:34;;;10554:2;10539:18;;10532:34;;;58099:9:0;;58088:4;;58023:86;;10399:3:1;10384:19;58023:86:0;;;;;;;57935:184;;;57902:233;57852:294;53722:4431;;;;53609:4544;;;:::o;21980:192::-;22066:7;22102:12;22094:6;;;;22086:29;;;;-1:-1:-1;;;22086:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22126:9:0;22138:5;22142:1;22138;:5;:::i;:::-;22126:17;21980:192;-1:-1:-1;;;;;21980:192:0:o;50583:338::-;-1:-1:-1;;;;;50666:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;50666:39:0;;;;;;;50718:38;50666:31;:39;50718:25;:38::i;:::-;50780:5;50777:79;;;50802:15;;:42;;-1:-1:-1;;;50802:42:0;;-1:-1:-1;;;;;1889:32:1;;;50802:42:0;;;1871:51:1;50802:15:0;;;;:36;;1844:18:1;;50802:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50777:79;50873:40;;;;;;-1:-1:-1;;;;;50873:40:0;;;;;;;;50583:338;;:::o;14587:573::-;-1:-1:-1;;;;;14727:20:0;;14719:70;;;;-1:-1:-1;;;14719:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14808:23:0;;14800:71;;;;-1:-1:-1;;;14800:71:0;;;;;;;:::i;:::-;14964;14986:6;14964:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14964:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;14944:17:0;;;:9;:17;;;;;;;;;;;:91;;;;15069:20;;;;;;;:32;;15094:6;15069:24;:32::i;:::-;-1:-1:-1;;;;;15046:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;15117:35;1410:25:1;;;15046:20:0;;15117:35;;;;;;1383:18:1;15117:35:0;1264:177:1;59831:1926:0;59870:23;59896:24;59914:4;59896:9;:24::i;:::-;59870:50;;59931:12;59954:25;60024:16;;60003:18;;59982;;:39;;;;:::i;:::-;:58;;;;:::i;:::-;59954:86;-1:-1:-1;60064:20:0;;;:46;;-1:-1:-1;60088:22:0;;60064:46;60061:60;;;60113:7;;;59831:1926::o;60061:60::-;60190:23;60275:1;60255:17;60234:18;;60216:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;60190:86;-1:-1:-1;60287:26:0;60316:36;:15;60190:86;60316:19;:36::i;:::-;60287:65;-1:-1:-1;60401:21:0;60435:36;60287:65;60435:16;:36::i;:::-;60493:18;60514:44;:21;60540:17;60514:25;:44::i;:::-;60493:65;;60579:23;60605:57;60644:17;60605:34;60620:18;;60605:10;:14;;:34;;;;:::i;:57::-;60579:83;;60673:21;60697:55;60734:17;60697:32;60712:16;;60697:10;:14;;:32;;;;:::i;:55::-;60673:79;-1:-1:-1;60773:23:0;60673:79;60799:28;60812:15;60799:10;:28;:::i;:::-;:44;;;;:::i;:::-;60885:1;60864:18;:22;;;60897:18;:22;;;60930:16;:20;60773:70;-1:-1:-1;60974:19:0;;;;;:42;;;61015:1;60997:15;:19;60974:42;60971:210;;;61032:46;61045:15;61062;61032:12;:46::i;:::-;61150:18;;61098:71;;;20136:25:1;;;20192:2;20177:18;;20170:34;;;20220:18;;;20213:34;;;;61098:71:0;;;;;;20124:2:1;61098:71:0;;;60971:210;61209:36;61231:13;61209:21;:36::i;:::-;61289:38;;-1:-1:-1;;;61289:38:0;;61321:4;61289:38;;;1871:51:1;61266:20:0;;42117:42;;61289:23;;1844:18:1;;61289:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61379:15;;61348:62;;-1:-1:-1;;;61348:62:0;;-1:-1:-1;;;;;61379:15:0;;;61348:62;;;9421:51:1;9488:18;;;9481:34;;;61266:61:0;;-1:-1:-1;42117:42:0;;61348:22;;9394:18:1;;61348:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61338:72;;61435:7;61431:156;;;61459:15;;:54;;-1:-1:-1;;;61459:54:0;;;;;1410:25:1;;;-1:-1:-1;;;;;61459:15:0;;;;:40;;1383:18:1;;61459:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61533:42:0;;;20432:25:1;;;20488:2;20473:18;;20466:34;;;61533:42:0;;-1:-1:-1;20405:18:1;;-1:-1:-1;61533:42:0;;;;;;;61431:156;61674:15;;61666:63;;-1:-1:-1;;;;;61674:15:0;;;;61703:21;;61666:63;;;;61703:21;61674:15;61666:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;59831:1926:0:o;22431:471::-;22489:7;22734:6;22730:47;;-1:-1:-1;22764:1:0;22757:8;;22730:47;22789:9;22801:5;22805:1;22801;:5;:::i;:::-;22789:17;-1:-1:-1;22834:1:0;22825:5;22829:1;22789:17;22825:5;:::i;:::-;:10;22817:56;;;;-1:-1:-1;;;22817:56:0;;20713:2:1;22817:56:0;;;20695:21:1;20752:2;20732:18;;;20725:30;20791:34;20771:18;;;20764:62;-1:-1:-1;;;20842:18:1;;;20835:31;20883:19;;22817:56:0;20511:397:1;23378:132:0;23436:7;23463:39;23467:1;23470;23463:39;;;;;;;;;;;;;;;;;:3;:39::i;21541:136::-;21599:7;21626:43;21630:1;21633;21626:43;;;;;;;;;;;;;;;;;:3;:43::i;58647:601::-;58799:16;;;58813:1;58799:16;;;;;;;;58775:21;;58799:16;;;;;;;;;;-1:-1:-1;58799:16:0;58775:40;;58844:4;58826;58831:1;58826:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58826:23:0;;;:7;;;;;;;;;;:23;;;;58870:15;;:22;;;-1:-1:-1;;;58870:22:0;;;;:15;;;;;:20;;:22;;;;;58826:7;;58870:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58860:4;58865:1;58860:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58860:32:0;;;:7;;;;;;;;;:32;58937:15;;58905:62;;58922:4;;58937:15;58955:11;58905:8;:62::i;:::-;59006:15;;:224;;-1:-1:-1;;;59006:224:0;;-1:-1:-1;;;;;59006:15:0;;;;:66;;:224;;59087:11;;59006:15;;59157:4;;59184;;59204:15;;59006:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58702:546;58647:601;:::o;59260:559::-;59440:15;;59408:62;;59425:4;;-1:-1:-1;;;;;59440:15:0;59458:11;59408:8;:62::i;:::-;59513:15;;:296;;-1:-1:-1;;;59513:296:0;;59585:4;59513:296;;;21841:34:1;21891:18;;;21884:34;;;59513:15:0;21934:18:1;;;21927:34;;;21977:18;;;21970:34;59725:42:0;22020:19:1;;;22013:44;59783:15:0;22073:19:1;;;22066:35;-1:-1:-1;;;;;59513:15:0;;;;:31;;59552:9;;21775:19:1;;59513:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58161:474::-;58233:13;;58230:398;;58286:16;;;58300:1;58286:16;;;;;;;;58262:21;;58286:16;;;;;;;;-1:-1:-1;;58327:15:0;;:22;;;-1:-1:-1;;;58327:22:0;;;;58262:40;;-1:-1:-1;;;;;;58327:15:0;;;;:20;;-1:-1:-1;58327:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58317:4;58322:1;58317:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;58317:32:0;;;-1:-1:-1;;;;;58317:32:0;;;;;42117:42;58364:4;58369:1;58364:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58364:15:0;;;:7;;;;;;;;;:15;58408;;:208;;-1:-1:-1;;;58408:208:0;;:15;;;:66;;58482:9;;58408:208;;:15;;58531:4;;58562;;58586:15;;58408:208;;;:::i;24006:278::-;24092:7;24127:12;24120:5;24112:28;;;;-1:-1:-1;;;24112:28:0;;;;;;;;:::i;:::-;-1:-1:-1;24151:9:0;24163:5;24167:1;24163;:5;:::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1446:247::-;1505:6;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;1613:9;1600:23;1632:31;1657:5;1632:31;:::i;1933:456::-;2010:6;2018;2026;2079:2;2067:9;2058:7;2054:23;2050:32;2047:52;;;2095:1;2092;2085:12;2047:52;2134:9;2121:23;2153:31;2178:5;2153:31;:::i;:::-;2203:5;-1:-1:-1;2260:2:1;2245:18;;2232:32;2273:33;2232:32;2273:33;:::i;:::-;1933:456;;2325:7;;-1:-1:-1;;;2379:2:1;2364:18;;;;2351:32;;1933:456::o;2823:180::-;2882:6;2935:2;2923:9;2914:7;2910:23;2906:32;2903:52;;;2951:1;2948;2941:12;2903:52;-1:-1:-1;2974:23:1;;2823:180;-1:-1:-1;2823:180:1:o;3216:118::-;3302:5;3295:13;3288:21;3281:5;3278:32;3268:60;;3324:1;3321;3314:12;3339:382;3404:6;3412;3465:2;3453:9;3444:7;3440:23;3436:32;3433:52;;;3481:1;3478;3471:12;3433:52;3520:9;3507:23;3539:31;3564:5;3539:31;:::i;:::-;3589:5;-1:-1:-1;3646:2:1;3631:18;;3618:32;3659:30;3618:32;3659:30;:::i;:::-;3708:7;3698:17;;;3339:382;;;;;:::o;3726:316::-;3803:6;3811;3819;3872:2;3860:9;3851:7;3847:23;3843:32;3840:52;;;3888:1;3885;3878:12;3840:52;-1:-1:-1;;3911:23:1;;;3981:2;3966:18;;3953:32;;-1:-1:-1;4032:2:1;4017:18;;;4004:32;;3726:316;-1:-1:-1;3726:316:1:o;4753:750::-;4845:6;4853;4861;4914:2;4902:9;4893:7;4889:23;4885:32;4882:52;;;4930:1;4927;4920:12;4882:52;4970:9;4957:23;4999:18;5040:2;5032:6;5029:14;5026:34;;;5056:1;5053;5046:12;5026:34;5094:6;5083:9;5079:22;5069:32;;5139:7;5132:4;5128:2;5124:13;5120:27;5110:55;;5161:1;5158;5151:12;5110:55;5201:2;5188:16;5227:2;5219:6;5216:14;5213:34;;;5243:1;5240;5233:12;5213:34;5298:7;5291:4;5281:6;5278:1;5274:14;5270:2;5266:23;5262:34;5259:47;5256:67;;;5319:1;5316;5309:12;5256:67;5350:4;5342:13;;;;-1:-1:-1;5374:6:1;-1:-1:-1;;5415:20:1;;5402:34;5445:28;5402:34;5445:28;:::i;:::-;5492:5;5482:15;;;4753:750;;;;;:::o;5508:388::-;5576:6;5584;5637:2;5625:9;5616:7;5612:23;5608:32;5605:52;;;5653:1;5650;5643:12;5605:52;5692:9;5679:23;5711:31;5736:5;5711:31;:::i;:::-;5761:5;-1:-1:-1;5818:2:1;5803:18;;5790:32;5831:33;5790:32;5831:33;:::i;5901:380::-;5980:1;5976:12;;;;6023;;;6044:61;;6098:4;6090:6;6086:17;6076:27;;6044:61;6151:2;6143:6;6140:14;6120:18;6117:38;6114:161;;;6197:10;6192:3;6188:20;6185:1;6178:31;6232:4;6229:1;6222:15;6260:4;6257:1;6250:15;6114:161;;5901:380;;;:::o;6286:184::-;6356:6;6409:2;6397:9;6388:7;6384:23;6380:32;6377:52;;;6425:1;6422;6415:12;6377:52;-1:-1:-1;6448:16:1;;6286:184;-1:-1:-1;6286:184:1:o;6475:356::-;6677:2;6659:21;;;6696:18;;;6689:30;6755:34;6750:2;6735:18;;6728:62;6822:2;6807:18;;6475:356::o;6968:251::-;7038:6;7091:2;7079:9;7070:7;7066:23;7062:32;7059:52;;;7107:1;7104;7097:12;7059:52;7139:9;7133:16;7158:31;7183:5;7158:31;:::i;7224:127::-;7285:10;7280:3;7276:20;7273:1;7266:31;7316:4;7313:1;7306:15;7340:4;7337:1;7330:15;7356:461;7409:3;7447:5;7441:12;7474:6;7469:3;7462:19;7500:4;7529:2;7524:3;7520:12;7513:19;;7566:2;7559:5;7555:14;7587:1;7597:195;7611:6;7608:1;7605:13;7597:195;;;7676:13;;-1:-1:-1;;;;;7672:39:1;7660:52;;7732:12;;;;7767:15;;;;7708:1;7626:9;7597:195;;;-1:-1:-1;7808:3:1;;7356:461;-1:-1:-1;;;;;7356:461:1:o;7822:510::-;8093:6;8082:9;8075:25;8136:3;8131:2;8120:9;8116:18;8109:31;8056:4;8157:57;8209:3;8198:9;8194:19;8186:6;8157:57;:::i;:::-;-1:-1:-1;;;;;8250:32:1;;;;8245:2;8230:18;;8223:60;-1:-1:-1;8314:2:1;8299:18;8292:34;8149:65;7822:510;-1:-1:-1;;7822:510:1:o;8642:245::-;8709:6;8762:2;8750:9;8741:7;8737:23;8733:32;8730:52;;;8778:1;8775;8768:12;8730:52;8810:9;8804:16;8829:28;8851:5;8829:28;:::i;9870:306::-;9958:6;9966;9974;10027:2;10015:9;10006:7;10002:23;9998:32;9995:52;;;10043:1;10040;10033:12;9995:52;10072:9;10066:16;10056:26;;10122:2;10111:9;10107:18;10101:25;10091:35;;10166:2;10155:9;10151:18;10145:25;10135:35;;9870:306;;;;;:::o;11134:127::-;11195:10;11190:3;11186:20;11183:1;11176:31;11226:4;11223:1;11216:15;11250:4;11247:1;11240:15;11266:128;11306:3;11337:1;11333:6;11330:1;11327:13;11324:39;;;11343:18;;:::i;:::-;-1:-1:-1;11379:9:1;;11266:128::o;13070:681::-;13201:6;13209;13217;13225;13233;13241;13249;13257;13310:3;13298:9;13289:7;13285:23;13281:33;13278:53;;;13327:1;13324;13317:12;13278:53;13359:9;13353:16;13378:31;13403:5;13378:31;:::i;:::-;13428:5;13418:15;;;13473:2;13462:9;13458:18;13452:25;13442:35;;13517:2;13506:9;13502:18;13496:25;13486:35;;13561:2;13550:9;13546:18;13540:25;13530:35;;13605:3;13594:9;13590:19;13584:26;13574:36;;13650:3;13639:9;13635:19;13629:26;13619:36;;13695:3;13684:9;13680:19;13674:26;13664:36;;13740:3;13729:9;13725:19;13719:26;13709:36;;13070:681;;;;;;;;;;;:::o;13756:135::-;13795:3;-1:-1:-1;;13816:17:1;;13813:43;;;13836:18;;:::i;:::-;-1:-1:-1;13883:1:1;13872:13;;13756:135::o;13896:794::-;14118:2;14130:21;;;14103:18;;14186:22;;;14070:4;14265:6;14239:2;14224:18;;14070:4;14299:304;14313:6;14310:1;14307:13;14299:304;;;14388:6;14375:20;14408:31;14433:5;14408:31;:::i;:::-;-1:-1:-1;;;;;14464:31:1;14452:44;;14519:4;14578:15;;;;14543:12;;;;14492:1;14328:9;14299:304;;;14303:3;14620;14612:11;;;;14675:6;14668:14;14661:22;14654:4;14643:9;14639:20;14632:52;13896:794;;;;;;:::o;16266:401::-;16468:2;16450:21;;;16507:2;16487:18;;;16480:30;16546:34;16541:2;16526:18;;16519:62;-1:-1:-1;;;16612:2:1;16597:18;;16590:35;16657:3;16642:19;;16266:401::o;16672:399::-;16874:2;16856:21;;;16913:2;16893:18;;;16886:30;16952:34;16947:2;16932:18;;16925:62;-1:-1:-1;;;17018:2:1;17003:18;;16996:33;17061:3;17046:19;;16672:399::o;19114:168::-;19154:7;19220:1;19216;19212:6;19208:14;19205:1;19202:21;19197:1;19190:9;19183:17;19179:45;19176:71;;;19227:18;;:::i;:::-;-1:-1:-1;19267:9:1;;19114:168::o;19287:217::-;19327:1;19353;19343:132;;19397:10;19392:3;19388:20;19385:1;19378:31;19432:4;19429:1;19422:15;19460:4;19457:1;19450:15;19343:132;-1:-1:-1;19489:9:1;;19287:217::o;19509:125::-;19549:4;19577:1;19574;19571:8;19568:34;;;19582:18;;:::i;:::-;-1:-1:-1;19619:9:1;;19509:125::o;20913:582::-;21212:6;21201:9;21194:25;21255:6;21250:2;21239:9;21235:18;21228:34;21298:3;21293:2;21282:9;21278:18;21271:31;21175:4;21319:57;21371:3;21360:9;21356:19;21348:6;21319:57;:::i;:::-;-1:-1:-1;;;;;21412:32:1;;;;21407:2;21392:18;;21385:60;-1:-1:-1;21476:3:1;21461:19;21454:35;21311:65;20913:582;-1:-1:-1;;;20913:582:1:o
Swarm Source
ipfs://8684221e353ebfdc57107f4b25a0edcddbb7795e2579be304a30235eb0a870e8
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.