ERC-20
Overview
Max Total Supply
333,333,333 🥚
Holders
12
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Tamago
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-09 */ // 🥚 🏆 🐦 // SPDX-License-Identifier: MIT pragma solidity 0.8.13; 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 IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } 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 { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } 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"); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } function _createInitialSupply(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } 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); } } 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, address _rewardToken) 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, address _rewardToken) 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, address _rewardToken) 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, address _rewardToken) 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(address _rewardToken) 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; mapping(address => uint256) internal magnifiedDividendPerShare; address[] public rewardTokens; address public nextRewardToken; uint256 public rewardTokenCounter; IUniswapV2Router02 public immutable uniswapV2Router; // 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 => mapping(address => int256)) internal magnifiedDividendCorrections; mapping(address => mapping(address => uint256)) internal withdrawnDividends; mapping (address => uint256) public holderBalance; uint256 public totalBalance; mapping(address => uint256) public totalDividendsDistributed; constructor(){ IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D uniswapV2Router = _uniswapV2Router; // Mainnet rewardTokens.push(address(0x676495371D5107f870E0e7d5aFb6fed91f236f21)); // 🐦 - 0x676495371D5107f870E0e7d5aFb6fed91f236f21 nextRewardToken = rewardTokens[0]; } /// @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(totalBalance > 0); uint256 initialBalance = IERC20(nextRewardToken).balanceOf(address(this)); buyTokens(msg.value, nextRewardToken); uint256 newBalance = IERC20(nextRewardToken).balanceOf(address(this)).sub(initialBalance); if (newBalance > 0) { magnifiedDividendPerShare[nextRewardToken] = magnifiedDividendPerShare[nextRewardToken].add( (newBalance).mul(magnitude) / totalBalance ); emit DividendsDistributed(msg.sender, newBalance); totalDividendsDistributed[nextRewardToken] = totalDividendsDistributed[nextRewardToken].add(newBalance); } rewardTokenCounter = rewardTokenCounter == rewardTokens.length - 1 ? 0 : rewardTokenCounter + 1; nextRewardToken = rewardTokens[rewardTokenCounter]; } // useful for buybacks or to reclaim any ETH on the contract in a way that helps holders. function buyTokens(uint256 bnbAmountInWei, address rewardToken) internal { // generate the uniswap pair path of weth -> eth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = rewardToken; // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}( 0, // accept any amount of Ethereum path, address(this), block.timestamp ); } /// @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(address _rewardToken) external virtual override { _withdrawDividendOfUser(payable(msg.sender), _rewardToken); } /// @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, address _rewardToken) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user, _rewardToken); if (_withdrawableDividend > 0) { withdrawnDividends[user][_rewardToken] = withdrawnDividends[user][_rewardToken].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); IERC20(_rewardToken).transfer(user, _withdrawableDividend); 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, address _rewardToken) external view override returns(uint256) { return withdrawableDividendOf(_owner, _rewardToken); } /// @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, address _rewardToken) public view override returns(uint256) { return accumulativeDividendOf(_owner,_rewardToken).sub(withdrawnDividends[_owner][_rewardToken]); } /// @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, address _rewardToken) external view override returns(uint256) { return withdrawnDividends[_owner][_rewardToken]; } /// @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, address _rewardToken) public view override returns(uint256) { return magnifiedDividendPerShare[_rewardToken].mul(holderBalance[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_rewardToken][_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 { for (uint256 i; i < rewardTokens.length; i++){ magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account] .sub((magnifiedDividendPerShare[rewardTokens[i]].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 { for (uint256 i; i < rewardTokens.length; i++){ magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account] .add( (magnifiedDividendPerShare[rewardTokens[i]].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 DividendTracker is DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(address key) private view returns (uint) { return tokenHoldersMap.values[key]; } function getIndexOfKey(address key) private view returns (int) { if(!tokenHoldersMap.inserted[key]) { return -1; } return int(tokenHoldersMap.indexOf[key]); } function getKeyAtIndex(uint index) private view returns (address) { return tokenHoldersMap.keys[index]; } function size() private view returns (uint) { return tokenHoldersMap.keys.length; } function set(address key, uint val) private { if (tokenHoldersMap.inserted[key]) { tokenHoldersMap.values[key] = val; } else { tokenHoldersMap.inserted[key] = true; tokenHoldersMap.values[key] = val; tokenHoldersMap.indexOf[key] = tokenHoldersMap.keys.length; tokenHoldersMap.keys.push(key); } } function remove(address key) private { if (!tokenHoldersMap.inserted[key]) { return; } delete tokenHoldersMap.inserted[key]; delete tokenHoldersMap.values[key]; uint index = tokenHoldersMap.indexOf[key]; uint lastIndex = tokenHoldersMap.keys.length - 1; address lastKey = tokenHoldersMap.keys[lastIndex]; tokenHoldersMap.indexOf[lastKey] = index; delete tokenHoldersMap.indexOf[key]; tokenHoldersMap.keys[index] = lastKey; tokenHoldersMap.keys.pop(); } 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 = 1000 * (10**18); } function excludeFromDividends(address account) external onlyOwner { excludedFromDividends[account] = true; _setBalance(account, 0); 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; } // Check to see if I really made this contract or if it is a clone! function getAccount(address _account, address _rewardToken) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = 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, _rewardToken); totalDividends = accumulativeDividendOf(account, _rewardToken); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index, address _rewardToken) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = getKeyAtIndex(index); return getAccount(account, _rewardToken); } 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); set(account, newBalance); } else { _setBalance(account, 0); remove(account); } processAccount(account, true); } function process(uint256 gas) external 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; bool paid; for (uint256 i; i < rewardTokens.length; i++){ amount = _withdrawDividendOfUser(account, rewardTokens[i]); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); paid = true; } } return paid; } } contract Tamago is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public immutable uniswapV2Router; address public immutable uniswapV2Pair; bool private swapping; DividendTracker public dividendTracker; address public operationsWallet; 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 = false; bool public swapEnabled = false; // Anti-bot and anti-whale mappings and variables mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch mapping (address => bool) private _blacklist; bool public transferDelayEnabled = true; uint256 public constant feeDivisor = 1000; uint256 public totalSellFees; uint256 public rewardsSellFee; uint256 public operationsSellFee; uint256 public liquiditySellFee; uint256 public totalBuyFees; uint256 public rewardsBuyFee; uint256 public operationsBuyFee; uint256 public liquidityBuyFee; uint256 public tokensForRewards; uint256 public tokensForOperations; uint256 public tokensForLiquidity; uint256 public gasForProcessing = 0; uint256 public lpWithdrawRequestTimestamp; uint256 public lpWithdrawRequestDuration = 3 days; bool public lpWithdrawRequestPending; uint256 public lpPercToWithDraw; /******************/ // 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 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 OperationsWalletUpdated(address indexed newWallet, address indexed oldWallet); event DevWalletUpdated(address indexed newWallet, address indexed oldWallet); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); 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 ); event RequestedLPWithdraw(); event WithdrewLPForMigration(); event CanceledLpWithdrawRequest(); constructor() ERC20("Tamago", unicode"🥚") { uint256 totalSupply = 333333333 * 1e18; maxTransactionAmount = totalSupply * 10 / 1000; // 0.5% maxTransactionAmountTxn swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap tokens amount maxWallet = totalSupply * 10 / 1000; // 0.5% Max wallet rewardsBuyFee = 0; operationsBuyFee = 0; liquidityBuyFee = 0; totalBuyFees = rewardsBuyFee + operationsBuyFee + liquidityBuyFee; rewardsSellFee = 0; operationsSellFee = 0; liquiditySellFee = 0; totalSellFees = rewardsSellFee + operationsSellFee + liquiditySellFee; dividendTracker = new DividendTracker(); operationsWallet = address(msg.sender); // set as operations wallet IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);//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(owner()); dividendTracker.excludeFromDividends(address(_uniswapV2Router)); dividendTracker.excludeFromDividends(address(0xdead)); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromMaxTransaction(owner(), true); excludeFromMaxTransaction(address(this), true); excludeFromMaxTransaction(address(dividendTracker), true); excludeFromMaxTransaction(address(_uniswapV2Router), true); excludeFromMaxTransaction(address(0xdead), true); _createInitialSupply(address(owner()), totalSupply); } 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); } // once enabled, can never be turned off function enableTrading() external onlyOwner { require(!tradingActive, "Cannot re-enable trading"); tradingActive = true; swapEnabled = true; tradingActiveBlock = block.number; } function blacklistAccount (address account, bool isBlacklisted) public onlyOwner { _blacklist[account] = isBlacklisted; } // only use to disable contract sales if absolutely necessary (emergency use only) function updateSwapEnabled(bool enabled) external onlyOwner(){ swapEnabled = enabled; } function updateMaxTxnAmount(uint256 newNum) external onlyOwner { require(newNum > (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%"); maxTransactionAmount = newNum * (10**18); } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require(newNum > (totalSupply() * 1 / 100)/1e18, "Cannot set maxWallet lower than 1%"); maxWallet = newNum * (10**18); } function updateBuyFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner { operationsBuyFee = _operationsFee; rewardsBuyFee = _rewardsFee; liquidityBuyFee = _liquidityFee; totalBuyFees = operationsBuyFee + rewardsBuyFee + liquidityBuyFee; require(totalBuyFees <= 100, "Must keep fees at 10% or less"); } function updateSellFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner { operationsSellFee = _operationsFee; rewardsSellFee = _rewardsFee; liquiditySellFee = _liquidityFee; totalSellFees = operationsSellFee + rewardsSellFee + liquiditySellFee; require(totalSellFees <= 100, "Must keep fees at 10% 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) external onlyOwner { require(pair != uniswapV2Pair, "The UniSwap 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 updateOperationsWallet(address newOperationsWallet) external onlyOwner { require(newOperationsWallet != address(0), "may not set to 0 address"); excludeFromFees(newOperationsWallet, true); emit OperationsWalletUpdated(newOperationsWallet, operationsWallet); operationsWallet = newOperationsWallet; } 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(address rewardToken) external view returns (uint256) { return dividendTracker.totalDividendsDistributed(rewardToken); } function isExcludedFromFees(address account) external view returns(bool) { return _isExcludedFromFees[account]; } function withdrawableDividendOf(address account, address rewardToken) external view returns(uint256) { return dividendTracker.withdrawableDividendOf(account, rewardToken); } function dividendTokenBalanceOf(address account) external view returns (uint256) { return dividendTracker.holderBalance(account); } function getAccountDividendsInfo(address account, address rewardToken) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account, rewardToken); } function getAccountDividendsInfoAtIndex(uint256 index, address rewardToken) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index, rewardToken); } 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(); } // remove limits after token is stable function removeLimits() external onlyOwner returns (bool){ limitsInEffect = false; transferDelayEnabled = false; return true; } 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"); require(!_blacklist[to] && !_blacklist[from], "You have been blacklisted from transfering tokens"); 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 != 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){ if(tradingActiveBlock + 1 >= block.number && (automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from])){ fees = amount.mul(99).div(100); tokensForLiquidity += fees * 33 / 99; tokensForRewards += fees * 33 / 99; tokensForOperations += fees * 33 / 99; } // on sell else if (automatedMarketMakerPairs[to] && totalSellFees > 0){ fees = amount.mul(totalSellFees).div(feeDivisor); tokensForRewards += fees * rewardsSellFee / totalSellFees; tokensForLiquidity += fees * liquiditySellFee / totalSellFees; tokensForOperations += fees * operationsSellFee / totalSellFees; } // on buy else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) { fees = amount.mul(totalBuyFees).div(feeDivisor); tokensForRewards += fees * rewardsBuyFee / totalBuyFees; tokensForLiquidity += fees * liquidityBuyFee / totalBuyFees; tokensForOperations += fees * operationsBuyFee / totalBuyFees; } if(fees > 0){ super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); dividendTracker.setBalance(payable(from), balanceOf(from)); dividendTracker.setBalance(payable(to), balanceOf(to)); if(!swapping && gasForProcessing > 0) { 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 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(0xdead), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + 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 ethForOperations = ethBalance.mul(tokensForOperations).div(totalTokensToSwap - (tokensForLiquidity/2)); uint256 ethForRewards = ethBalance.mul(tokensForRewards).div(totalTokensToSwap - (tokensForLiquidity/2)); uint256 ethForLiquidity = ethBalance - ethForOperations - ethForRewards; tokensForLiquidity = 0; tokensForOperations = 0; tokensForRewards = 0; if(liquidityTokens > 0 && ethForLiquidity > 0){ addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity); } // call twice to force buy of both reward tokens. (bool success,) = address(dividendTracker).call{value: ethForRewards}(""); (success,) = address(operationsWallet).call{value: address(this).balance}(""); } function withdrawStuckEth() external onlyOwner { (bool success,) = address(msg.sender).call{value: address(this).balance}(""); require(success, "failed to withdraw"); } function nextAvailableLpWithdrawDate() public view returns (uint256){ if(lpWithdrawRequestPending){ return lpWithdrawRequestTimestamp + lpWithdrawRequestDuration; } else { return 0; // 0 means no open requests } } function withdrawRequestedLP() external onlyOwner { require(block.timestamp >= nextAvailableLpWithdrawDate() && nextAvailableLpWithdrawDate() > 0, "Must request and wait."); lpWithdrawRequestTimestamp = 0; lpWithdrawRequestPending = false; uint256 amtToWithdraw = IERC20(address(uniswapV2Pair)).balanceOf(address(this)) * lpPercToWithDraw / 100; lpPercToWithDraw = 0; IERC20(uniswapV2Pair).transfer(msg.sender, amtToWithdraw); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":[],"name":"CanceledLpWithdrawRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"DevWalletUpdated","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":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"OperationsWalletUpdated","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":[],"name":"RequestedLPWithdraw","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":[],"name":"WithdrewLPForMigration","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","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":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","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":"feeDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","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"},{"internalType":"address","name":"rewardToken","type":"address"}],"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":[{"internalType":"address","name":"rewardToken","type":"address"}],"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":"lpPercToWithDraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"nextAvailableLpWithdrawDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","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":"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":"_operationsFee","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":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"updateOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRequestedLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040526000600b819055600c819055600e805462ffffff191660019081179091556011805460ff19169091179055601d556203f480601f553480156200004657600080fd5b50604080518082018252600681527f54616d61676f000000000000000000000000000000000000000000000000000060208083019182528351808501909452600484527ff09fa59a00000000000000000000000000000000000000000000000000000000908401528151919291620000c19160039162000b89565b508051620000d790600490602084019062000b89565b5050506000620000f5620007cd640100000000026401000000009004565b60058054600160a060020a031916600160a060020a038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506b0113ba1430a5432dc03400006103e86200016082600a62000c6c565b6200016c919062000c8e565b6008556127106200017f82600562000c6c565b6200018b919062000c8e565b6009556103e86200019e82600a62000c6c565b620001aa919062000c8e565b600a556000601781905560188190556019819055620001ca818062000cca565b620001d6919062000cca565b6016556000601381905560148190556015819055620001f6818062000cca565b62000202919062000cca565b601255604051620002139062000c18565b604051809103906000f08015801562000230573d6000803e3d6000fd5b5060068054600160a060020a0392909216600160a060020a03199283161790556007805490911633179055604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620002ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f0919062000ce5565b600160a060020a031663c9c653963084600160a060020a031663ad5c46486040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000ce5565b6040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a039283166004820152911660248201526044016020604051808303816000875af1158015620003e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040b919062000ce5565b600160a060020a03808416608052811660a052905062000436816001640100000000620007d1810204565b6006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200049657600080fd5b505af1158015620004ab573d6000803e3d6000fd5b50506006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0390911692506331e79db09150602401600060405180830381600087803b1580156200050e57600080fd5b505af115801562000523573d6000803e3d6000fd5b5050600654600160a060020a031691506331e79db090506200054d640100000000620008c8810204565b6040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b158015620005a657600080fd5b505af1158015620005bb573d6000803e3d6000fd5b50506006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200062057600080fd5b505af115801562000635573d6000803e3d6000fd5b50506006546040517f31e79db000000000000000000000000000000000000000000000000000000000815261dead6004820152600160a060020a0390911692506331e79db09150602401600060405180830381600087803b1580156200069a57600080fd5b505af1158015620006af573d6000803e3d6000fd5b50505050620006e1620006d0620008c8640100000000026401000000009004565b6001640100000000620008d7810204565b620006f7306001640100000000620008d7810204565b6200070f61dead6001640100000000620008d7810204565b6200073762000726640100000000620008c8810204565b6001640100000000620009b6810204565b6200074d306001640100000000620009b6810204565b6006546200076f90600160a060020a03166001640100000000620009b6810204565b62000785826001640100000000620009b6810204565b6200079d61dead6001640100000000620009b6810204565b620007c4620007b4640100000000620008c8810204565b8464010000000062000a8a810204565b50505062000d6c565b3390565b600160a060020a0382166000908152602460205260409020805460ff19168215151790556200080a8282640100000000620009b6810204565b80156200088c576006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200087257600080fd5b505af115801562000887573d6000803e3d6000fd5b505050505b60405181151590600160a060020a038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600554600160a060020a031690565b620008ea640100000000620007cd810204565b600554600160a060020a0390811691161462000956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201526000805160206200747d83398151915260448201526064015b60405180910390fd5b600160a060020a038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b620009c9640100000000620007cd810204565b600554600160a060020a0390811691161462000a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201526000805160206200747d83398151915260448201526064016200094d565b600160a060020a038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d959101620009aa565b600160a060020a03821662000afc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200094d565b806002600082825462000b10919062000cca565b9091555050600160a060020a0382166000908152602081905260408120805483929062000b3f90849062000cca565b9091555050604051818152600160a060020a038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b82805462000b979062000d17565b90600052602060002090601f01602090048101928262000bbb576000855562000c06565b82601f1062000bd657805160ff191683800117855562000c06565b8280016001018555821562000c06579182015b8281111562000c0657825182559160200191906001019062000be9565b5062000c1492915062000c26565b5090565b612321806200515c83390190565b5b8082111562000c14576000815560010162000c27565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600081600019048311821515161562000c895762000c8962000c3d565b500290565b60008262000cc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111562000ce05762000ce062000c3d565b500190565b60006020828403121562000cf857600080fd5b8151600160a060020a038116811462000d1057600080fd5b9392505050565b60028104600182168062000d2c57607f821691505b60208210810362000d66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60805160a05161438462000dd86000396000818161071b015281816119ad01528181611a7101528181611f4f0152612acd01526000818161057001528181612a9001528181613a5401528181613b1001528181613b6501528181613bdf0152613c5501526143846000f3fe60806040526004361061047b5760003560e060020a900480638095d5641161024e578063c492f0461161013d578063e98030c7116100ba578063f54afa781161007e578063f54afa7814610d87578063f8b45b0514610d9d578063fb002c9714610db3578063fd361d0e14610dc9578063fd72e22a14610de357600080fd5b8063e98030c714610d05578063ee40166e14610d25578063ee44b44e14610d3b578063efcc1b2f14610d51578063f2fde38b14610d6757600080fd5b8063d0a3981411610101578063d0a3981414610c69578063dd62ed3e14610c7f578063e2f4560514610cc5578063e7841ec014610cdb578063e884f26014610cf057600080fd5b8063c492f04614610bed578063c876d0b914610c0d578063c8c8ebe414610c27578063ccb6135814610c3d578063ccd146b214610c5357600080fd5b8063a26579ad116101cb578063bbc0c7421161018f578063bbc0c74214610b4e578063c024666814610b6d578063c0f306ef14610b8d578063c17b5b8c14610bad578063c18bc19514610bcd57600080fd5b8063a26579ad14610ab3578063a457c2d714610ac8578063a9059cbb14610ae8578063b62496f514610b08578063b9e9370014610b3857600080fd5b806392b596261161021257806392b5962614610a3257806395d89b4114610a525780639a36f93214610a675780639a7a23d614610a7d5780639c1b8af514610a9d57600080fd5b80638095d5641461099f578063871c128d146109bf5780638a8c523c146109df5780638da5cb5b146109f4578063924de9b714610a1257600080fd5b80634a62bb651161036a57806370a08231116102e7578063751039fc116102ab578063751039fc1461092a5780637571336a1461093f578063763cef491461095f578063783102eb146109745780637fa787ba1461098a57600080fd5b806370a08231146108b5578063712c2985146108d5578063715018a6146108ea57806371778e7d146108ff5780637506cbd81461091457600080fd5b8063632459f01161032e578063632459f0146107db57806364b0f653146108405780636843cd84146108555780636ddd171314610875578063700bb1911461089557600080fd5b80634a62bb651461073d5780634af6f7ee146107575780634e71d92d1461076d5780634fbee193146107825780635645cd86146107bb57600080fd5b8063203e727e116103f857806330d5d18d116103bc57806330d5d18d1461068d578063313ce567146106ad57806331e79db0146106c957806339509351146106e957806349bd5a5e1461070957600080fd5b8063203e727e146105eb578063204f11a81461060d57806323b872dd1461062d5780632c1f52161461064d5780632d5a5d341461066d57600080fd5b806310d5de531161043f57806310d5de531461052e5780631694505e1461055e57806318160ddd146105aa5780631a8145bb146105bf5780631fc851bd146105d557600080fd5b8063058054c91461048757806306fdde03146104b0578063095ea7b3146104d2578063099d0d30146105025780630f4432e31461051857600080fd5b3661048257005b600080fd5b34801561049357600080fd5b5061049d601e5481565b6040519081526020015b60405180910390f35b3480156104bc57600080fd5b506104c5610e03565b6040516104a79190613d3a565b3480156104de57600080fd5b506104f26104ed366004613da4565b610e95565b60405190151581526020016104a7565b34801561050e57600080fd5b5061049d60155481565b34801561052457600080fd5b5061049d600b5481565b34801561053a57600080fd5b506104f2610549366004613dd0565b60236020526000908152604090205460ff1681565b34801561056a57600080fd5b506105927f000000000000000000000000000000000000000000000000000000000000000081565b604051600160a060020a0390911681526020016104a7565b3480156105b657600080fd5b5060025461049d565b3480156105cb57600080fd5b5061049d601c5481565b3480156105e157600080fd5b5061049d600d5481565b3480156105f757600080fd5b5061060b610606366004613ded565b610eac565b005b34801561061957600080fd5b5061049d610628366004613e06565b610fa5565b34801561063957600080fd5b506104f2610648366004613e3f565b61103c565b34801561065957600080fd5b5060065461059290600160a060020a031681565b34801561067957600080fd5b5061060b610688366004613e8e565b6110fe565b34801561069957600080fd5b5061060b6106a8366004613dd0565b611156565b3480156106b957600080fd5b50604051601281526020016104a7565b3480156106d557600080fd5b5061060b6106e4366004613dd0565b611251565b3480156106f557600080fd5b506104f2610704366004613da4565b6112fa565b34801561071557600080fd5b506105927f000000000000000000000000000000000000000000000000000000000000000081565b34801561074957600080fd5b50600e546104f29060ff1681565b34801561076357600080fd5b5061049d60175481565b34801561077957600080fd5b5061060b611336565b34801561078e57600080fd5b506104f261079d366004613dd0565b600160a060020a031660009081526022602052604090205460ff1690565b3480156107c757600080fd5b5061049d6107d6366004613dd0565b6113c7565b3480156107e757600080fd5b506107fb6107f6366004613ebc565b611450565b60408051600160a060020a0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104a7565b34801561084c57600080fd5b5061049d61150d565b34801561086157600080fd5b5061049d610870366004613dd0565b611599565b34801561088157600080fd5b50600e546104f29062010000900460ff1681565b3480156108a157600080fd5b5061060b6108b0366004613ded565b6115e5565b3480156108c157600080fd5b5061049d6108d0366004613dd0565b6116ce565b3480156108e157600080fd5b5061049d6116e9565b3480156108f657600080fd5b5061060b61170d565b34801561090b57600080fd5b5061049d611791565b34801561092057600080fd5b5061049d60145481565b34801561093657600080fd5b506104f26117f4565b34801561094b57600080fd5b5061060b61095a366004613e8e565b611840565b34801561096b57600080fd5b5061060b6118cd565b34801561098057600080fd5b5061049d60215481565b34801561099657600080fd5b5061060b611aea565b3480156109ab57600080fd5b5061060b6109ba366004613ee1565b611bb3565b3480156109cb57600080fd5b5061060b6109da366004613ded565b611c61565b3480156109eb57600080fd5b5061060b611dc6565b348015610a0057600080fd5b50600554600160a060020a0316610592565b348015610a1e57600080fd5b5061060b610a2d366004613f0d565b611e65565b348015610a3e57600080fd5b506107fb610a4d366004613e06565b611eae565b348015610a5e57600080fd5b506104c5611f11565b348015610a7357600080fd5b5061049d6103e881565b348015610a8957600080fd5b5061060b610a98366004613e8e565b611f20565b348015610aa957600080fd5b5061049d601d5481565b348015610abf57600080fd5b5061049d612027565b348015610ad457600080fd5b506104f2610ae3366004613da4565b61208a565b348015610af457600080fd5b506104f2610b03366004613da4565b61213e565b348015610b1457600080fd5b506104f2610b23366004613dd0565b60246020526000908152604090205460ff1681565b348015610b4457600080fd5b5061049d60165481565b348015610b5a57600080fd5b50600e546104f290610100900460ff1681565b348015610b7957600080fd5b5061060b610b88366004613e8e565b61214b565b348015610b9957600080fd5b5061060b610ba8366004613dd0565b6121d0565b348015610bb957600080fd5b5061060b610bc8366004613ee1565b612248565b348015610bd957600080fd5b5061060b610be8366004613ded565b6122f1565b348015610bf957600080fd5b5061060b610c08366004613f2a565b6123e0565b348015610c1957600080fd5b506011546104f29060ff1681565b348015610c3357600080fd5b5061049d60085481565b348015610c4957600080fd5b5061049d60195481565b348015610c5f57600080fd5b5061049d60135481565b348015610c7557600080fd5b5061049d60125481565b348015610c8b57600080fd5b5061049d610c9a366004613e06565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b348015610cd157600080fd5b5061049d60095481565b348015610ce757600080fd5b5061049d6124bf565b348015610cfc57600080fd5b506104f2612522565b348015610d1157600080fd5b5061060b610d20366004613ded565b612562565b348015610d3157600080fd5b5061049d600c5481565b348015610d4757600080fd5b5061049d601f5481565b348015610d5d57600080fd5b5061049d60185481565b348015610d7357600080fd5b5061060b610d82366004613dd0565b6125d9565b348015610d9357600080fd5b5061049d601a5481565b348015610da957600080fd5b5061049d600a5481565b348015610dbf57600080fd5b5061049d601b5481565b348015610dd557600080fd5b506020546104f29060ff1681565b348015610def57600080fd5b5060075461059290600160a060020a031681565b606060038054610e1290613faf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e90613faf565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b5050505050905090565b6000610ea23384846126ee565b5060015b92915050565b600554600160a060020a03163314610ee25760405160e560020a62461bcd028152600401610ed990613fec565b60405180910390fd5b670de0b6b3a76400006103e8610ef760025490565b610f0290600161403a565b610f0c9190614059565b610f169190614059565b8111610f8d5760405160e560020a62461bcd02815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e312500000000000000000000000000000000006064820152608401610ed9565b610f9f81670de0b6b3a764000061403a565b60085550565b6006546040517f204f11a8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611035919061407e565b9392505050565b600061104984848461284c565b600160a060020a0384166000908152600160209081526040808320338452909152902054828110156110e65760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610ed9565b6110f385338584036126ee565b506001949350505050565b600554600160a060020a0316331461112b5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a03919091166000908152601060205260409020805460ff1916911515919091179055565b600554600160a060020a031633146111835760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166111dc5760405160e560020a62461bcd02815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610ed9565b6111e781600161214b565b600754604051600160a060020a03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a36007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554600160a060020a0316331461127e5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b5050505050565b336000818152600160209081526040808320600160a060020a03871684529091528120549091610ea2918590611331908690614097565b6126ee565b6006546040517fbc4c4b3700000000000000000000000000000000000000000000000000000000815233600482015260006024820152600160a060020a039091169063bc4c4b37906044016020604051808303816000875af11580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c491906140af565b50565b6006546040517f4d6e5e02000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea6919061407e565b6006546040517f8c503bf500000000000000000000000000000000000000000000000000000000815260048101849052600160a060020a0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156114cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f091906140cc565b975097509750975097509750975097509295985092959890939650565b600654604080517f09bbedde0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916309bbedde9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611594919061407e565b905090565b6006546040517fab6ddfa8000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152600092169063ab6ddfa89060240161140f565b6006546040517fffb2c4790000000000000000000000000000000000000000000000000000000081526004810183905260009182918291600160a060020a03169063ffb2c479906024016060604051808303816000875af115801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190614136565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b600160a060020a031660009081526020819052604090205490565b60205460009060ff161561170757601f54601e546115949190614097565b50600090565b600554600160a060020a0316331461173a5760405160e560020a62461bcd028152600401610ed990613fec565b600554604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36005805473ffffffffffffffffffffffffffffffffffffffff19169055565b600654604080517fad7a672f0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163ad7a672f9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146118245760405160e560020a62461bcd028152600401610ed990613fec565b50600e805460ff19908116909155601180549091169055600190565b600554600160a060020a0316331461186d5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b600554600160a060020a031633146118fa5760405160e560020a62461bcd028152600401610ed990613fec565b6119026116e9565b4210158015611918575060006119166116e9565b115b6119675760405160e560020a62461bcd02815260206004820152601660248201527f4d757374207265717565737420616e6420776169742e000000000000000000006044820152606401610ed9565b6000601e8190556020805460ff191690556021546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152606491907f0000000000000000000000000000000000000000000000000000000000000000600160a060020a0316906370a0823190602401602060405180830381865afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a20919061407e565b611a2a919061403a565b611a349190614059565b60006021556040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a03169063a9059cbb906044016020604051808303816000875af1158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae691906140af565b5050565b600554600160a060020a03163314611b175760405160e560020a62461bcd028152600401610ed990613fec565b60405160009033903031908381818185875af1925050503d8060008114611b5a576040519150601f19603f3d011682016040523d82523d6000602084013e611b5f565b606091505b50509050806113c45760405160e560020a62461bcd02815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152606401610ed9565b600554600160a060020a03163314611be05760405160e560020a62461bcd028152600401610ed990613fec565b60188390556017829055601981905580611bfa8385614097565b611c049190614097565b601681905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b505050565b600554600160a060020a03163314611c8e5760405160e560020a62461bcd028152600401610ed990613fec565b62030d408110158015611ca457506207a1208111155b611d195760405160e560020a62461bcd02815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527f6e203230302c30303020616e64203530302c30303000000000000000000000006064820152608401610ed9565b601d548103611d935760405160e560020a62461bcd02815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201527f6f2073616d652076616c756500000000000000000000000000000000000000006064820152608401610ed9565b601d5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601d55565b600554600160a060020a03163314611df35760405160e560020a62461bcd028152600401610ed990613fec565b600e54610100900460ff1615611e4e5760405160e560020a62461bcd02815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610ed9565b600e805462ffff0019166201010017905543600c55565b600554600160a060020a03163314611e925760405160e560020a62461bcd028152600401610ed990613fec565b600e8054911515620100000262ff000019909216919091179055565b6006546040517ffd590847000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016114ae565b606060048054610e1290613faf565b600554600160a060020a03163314611f4d5760405160e560020a62461bcd028152600401610ed990613fec565b7f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031682600160a060020a03160361201d5760405160e560020a62461bcd02815260206004820152604160248201527f54686520556e695377617020706169722063616e6e6f742062652072656d6f7660448201527f65642066726f6d206175746f6d617465644d61726b65744d616b65725061697260648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a401610ed9565b611ae68282613458565b600654604080517f6f2789ec0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691636f2789ec9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156121275760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610ed9565b61213433858584036126ee565b5060019392505050565b6000610ea233848461284c565b600554600160a060020a031633146121785760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016118c1565b600554600160a060020a031633146121fd5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fc0f306ef000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301529091169063c0f306ef906024016112c5565b600554600160a060020a031633146122755760405160e560020a62461bcd028152600401610ed990613fec565b6014839055601382905560158190558061228f8385614097565b6122999190614097565b601281905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b600554600160a060020a0316331461231e5760405160e560020a62461bcd028152600401610ed990613fec565b670de0b6b3a7640000606461233260025490565b61233d90600161403a565b6123479190614059565b6123519190614059565b81116123c85760405160e560020a62461bcd02815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f31250000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b6123da81670de0b6b3a764000061403a565b600a5550565b600554600160a060020a0316331461240d5760405160e560020a62461bcd028152600401610ed990613fec565b60005b8281101561247e57816022600086868581811061242f5761242f614164565b90506020020160208101906124449190613dd0565b600160a060020a031681526020810191909152604001600020805460ff1916911515919091179055806124768161417d565b915050612410565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516124b293929190614196565b60405180910390a1505050565b600654604080517fe7841ec00000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163e7841ec09160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146125525760405160e560020a62461bcd028152600401610ed990613fec565b506011805460ff19169055600190565b600554600160a060020a0316331461258f5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fe98030c700000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063e98030c7906024016112c5565b600554600160a060020a031633146126065760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166126855760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ed9565b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03831661276c5760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0382166127eb5760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a0383166128755760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a03821661289e5760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a03821660009081526010602052604090205460ff161580156128e05750600160a060020a03831660009081526010602052604090205460ff16155b6129555760405160e560020a62461bcd02815260206004820152603160248201527f596f752068617665206265656e20626c61636b6c69737465642066726f6d207460448201527f72616e73666572696e6720746f6b656e730000000000000000000000000000006064820152608401610ed9565b8060000361296957611c5c83836000613541565b600e54610100900460ff16612a0657600160a060020a03831660009081526022602052604090205460ff16806129b75750600160a060020a03821660009081526022602052604090205460ff165b612a065760405160e560020a62461bcd02815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ed9565b600e5460ff1615612e3c57600554600160a060020a03848116911614801590612a3d5750600554600160a060020a03838116911614155b8015612a515750600160a060020a03821615155b8015612a685750600160a060020a03821661dead14155b8015612a7e575060055460a060020a900460ff16155b15612e3c5760115460ff1615612bc7577f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031682600160a060020a031614158015612b0257507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031682600160a060020a031614155b15612bc757326000908152600f60205260409020544311612bb45760405160e560020a62461bcd02815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60648201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000608482015260a401610ed9565b326000908152600f602052604090204390555b600160a060020a03831660009081526024602052604090205460ff168015612c085750600160a060020a03821660009081526023602052604090205460ff16155b15612cf457600854811115612c885760405160e560020a62461bcd02815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e00000000000000000000006064820152608401610ed9565b600a54612c94836116ce565b612c9e9083614097565b1115612cef5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b612e3c565b600160a060020a03821660009081526024602052604090205460ff168015612d355750600160a060020a03831660009081526023602052604090205460ff16155b15612db557600854811115612cef5760405160e560020a62461bcd02815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e000000000000000000006064820152608401610ed9565b600160a060020a03821660009081526023602052604090205460ff16612e3c57600a54612de1836116ce565b612deb9083614097565b1115612e3c5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b6000612e47306116ce565b60095490915081108015908190612e665750600e5462010000900460ff165b8015612e7c575060055460a060020a900460ff16155b8015612ea15750600160a060020a03851660009081526024602052604090205460ff16155b8015612ec65750600160a060020a03851660009081526022602052604090205460ff16155b8015612eeb5750600160a060020a03841660009081526022602052604090205460ff16155b15612f3b576005805474ff0000000000000000000000000000000000000000191660a060020a179055612f1c6136a8565b6005805474ff0000000000000000000000000000000000000000191690555b600554600160a060020a03861660009081526022602052604090205460ff60a060020a909204821615911680612f895750600160a060020a03851660009081526022602052604090205460ff165b15612f92575060005b600081156132575743600c546001612faa9190614097565b10158015612ff25750600160a060020a03861660009081526024602052604090205460ff1680612ff25750600160a060020a03871660009081526024602052604090205460ff165b1561309e5761300d60646130078760636138d8565b90613979565b9050606361301c82602161403a565b6130269190614059565b601c60008282546130379190614097565b909155506063905061304a82602161403a565b6130549190614059565b601a60008282546130659190614097565b909155506063905061307882602161403a565b6130829190614059565b601b60008282546130939190614097565b909155506132399050565b600160a060020a03861660009081526024602052604090205460ff1680156130c857506000601254115b1561315b576130e86103e8613007601254886138d890919063ffffffff16565b9050601254601354826130fb919061403a565b6131059190614059565b601a60008282546131169190614097565b909155505060125460155461312b908361403a565b6131359190614059565b601c60008282546131469190614097565b9091555050601254601454613078908361403a565b600160a060020a03871660009081526024602052604090205460ff16801561318557506000601654115b15613239576131a56103e8613007601654886138d890919063ffffffff16565b9050601654601754826131b8919061403a565b6131c29190614059565b601a60008282546131d39190614097565b90915550506016546019546131e8908361403a565b6131f29190614059565b601c60008282546132039190614097565b9091555050601654601854613218908361403a565b6132229190614059565b601b60008282546132339190614097565b90915550505b801561324a5761324a873083613541565b61325481866142a9565b94505b613262878787613541565b600654600160a060020a031663e30443bc8861327d816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1580156132c157600080fd5b505af11580156132d5573d6000803e3d6000fd5b5050600654600160a060020a0316915063e30443bc9050876132f6816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561333a57600080fd5b505af115801561334e573d6000803e3d6000fd5b505060055460a060020a900460ff1615915050801561336f57506000601d54115b1561344f57601d546006546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063ffb2c479906024016060604051808303816000875af19250505080156133f7575060408051601f3d908101601f191682019092526133f491810190614136565b60015b1561344d5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600160a060020a0382166000908152602460205260409020805460ff19168215151790556134868282611840565b8015613505576006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152909116906331e79db090602401600060405180830381600087803b1580156134ec57600080fd5b505af1158015613500573d6000803e3d6000fd5b505050505b60405181151590600160a060020a038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600160a060020a03831661356a5760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a0382166135935760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a038316600090815260208190526040902054818110156136255760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0380851660009081526020819052604080822085850390559185168152908120805484929061365c908490614097565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116c091815260200190565b60006136b3306116ce565b90506000601a54601b54601c546136ca9190614097565b6136d49190614097565b90508115806136e1575080155b156136ea575050565b6000600282601c54856136fd919061403a565b6137079190614059565b6137119190614059565b9050600061371f84836139bb565b9050303161372c826139fd565b60006137393031836139bb565b905060006137676002601c5461374f9190614059565b61375990886142a9565b601b546130079085906138d8565b905060006137956002601c5461377d9190614059565b61378790896142a9565b601a546130079086906138d8565b90506000816137a484866142a9565b6137ae91906142a9565b6000601c819055601b819055601a55905086158015906137ce5750600081115b15613821576137dd8782613bd9565b601c54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b600654604051600091600160a060020a03169084908381818185875af1925050503d806000811461386e576040519150601f19603f3d011682016040523d82523d6000602084013e613873565b606091505b5050600754604051919250600160a060020a031690303190600081818185875af1925050503d80600081146138c4576040519150601f19603f3d011682016040523d82523d6000602084013e6138c9565b606091505b50505050505050505050505050565b6000826000036138ea57506000610ea6565b60006138f6838561403a565b9050826139038583614059565b146110355760405160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600061103583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ccc565b600061103583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d06565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a3257613a32614164565b6020026020010190600160a060020a03169081600160a060020a0316815250507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015613ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad791906142c0565b81600181518110613aea57613aea614164565b6020026020010190600160a060020a03169081600160a060020a031681525050613b35307f0000000000000000000000000000000000000000000000000000000000000000846126ee565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152600160a060020a037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790613ba39085906000908690309042906004016142dd565b600060405180830381600087803b158015613bbd57600080fd5b505af1158015613bd1573d6000803e3d6000fd5b505050505050565b613c04307f0000000000000000000000000000000000000000000000000000000000000000846126ee565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000000000000000000000000000000000000000000000600160a060020a03169063f305d71990839060c40160606040518083038185885af1158015613ca7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112f39190614136565b60008183613cf05760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd8486614059565b95945050505050565b60008184841115613d2d5760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd84866142a9565b600060208083528351808285015260005b81811015613d6757858101830151858201604001528201613d4b565b81811115613d79576000604083870101525b50601f01601f1916929092016040019392505050565b600160a060020a03811681146113c457600080fd5b60008060408385031215613db757600080fd5b8235613dc281613d8f565b946020939093013593505050565b600060208284031215613de257600080fd5b813561103581613d8f565b600060208284031215613dff57600080fd5b5035919050565b60008060408385031215613e1957600080fd5b8235613e2481613d8f565b91506020830135613e3481613d8f565b809150509250929050565b600080600060608486031215613e5457600080fd5b8335613e5f81613d8f565b92506020840135613e6f81613d8f565b929592945050506040919091013590565b80151581146113c457600080fd5b60008060408385031215613ea157600080fd5b8235613eac81613d8f565b91506020830135613e3481613e80565b60008060408385031215613ecf57600080fd5b823591506020830135613e3481613d8f565b600080600060608486031215613ef657600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f1f57600080fd5b813561103581613e80565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b8760208083028501011115613f8e57600080fd5b60209283019550935050840135613fa481613e80565b809150509250925092565b600281046001821680613fc357607f821691505b602082108103613fe65760e060020a634e487b7102600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60e060020a634e487b7102600052601160045260246000fd5b600081600019048311821515161561405457614054614021565b500290565b6000826140795760e060020a634e487b7102600052601260045260246000fd5b500490565b60006020828403121561409057600080fd5b5051919050565b600082198211156140aa576140aa614021565b500190565b6000602082840312156140c157600080fd5b815161103581613e80565b600080600080600080600080610100898b0312156140e957600080fd5b88516140f481613d8f565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060006060848603121561414b57600080fd5b8351925060208401519150604084015190509250925092565b60e060020a634e487b7102600052603260045260246000fd5b60006001820161418f5761418f614021565b5060010190565b6040808252810183905260008460608301825b868110156141d95782356141bc81613d8f565b600160a060020a03168252602092830192909101906001016141a9565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6000828210156142bb576142bb614021565b500390565b6000602082840312156142d257600080fd5b815161103581613d8f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561432d578451600160a060020a031683529383019391830191600101614308565b5050600160a060020a0396909616606085015250505060800152939250505056fea2646970667358221220850544e7686e09195b8d6725fee5b7d2d55e3001c4a7a20a8f42dc4eefd51aa564736f6c634300080d003360c06040523480156200001157600080fd5b5060006200002764010000000062000138810204565b60008054600160a060020a031916600160a060020a0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526002805460018101825560008281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091018054600160a060020a03191673676495371d5107f870e0e7d5afb6fed91f236f211790558154620000f357620000f36200013c565b60009182526020909120015460038054600160a060020a031916600160a060020a03909216919091179055506104b0601155683635c9adc5dea0000060a0526200016b565b3390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60805160a05161217b620001a6600039600081816104ee0152610dcb01526000818161024b015281816112f60152611417015261217b6000f3fe6080604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900480639c53c0ca1161011f578063e30443bc116100b2578063e98030c711610081578063e98030c71461060b578063f2fde38b1461062b578063fd5908471461064b578063ffb2c4791461066b57600080fd5b8063e30443bc14610570578063e6f083f414610590578063e7841ec0146105d6578063e7f4d2c3146105eb57600080fd5b8063be10b614116100ee578063be10b614146104dc578063c0f306ef14610510578063cb83bcd614610530578063cc5489df1461055057600080fd5b80639c53c0ca14610459578063ab6ddfa814610479578063ad7a672f146104a6578063bc4c4b37146104bc57600080fd5b80634d6e5e02116101975780637bb7bed1116101665780637bb7bed1146103a05780638c503bf5146103c05780638da5cb5b1461042557806393fcfe611461044357600080fd5b80634d6e5e02146103085780634e7b827f146103355780636f2789ec14610375578063715018a61461038b57600080fd5b8063204f11a8116101d3578063204f11a814610285578063226cfa3d146102a55780633009a609146102d257806331e79db0146102e857600080fd5b806303c833021461020d57806309bbedde146102155780631694505e1461023957600080fd5b36610208576102066106a6565b005b600080fd5b6102066106a6565b34801561022157600080fd5b50600a545b6040519081526020015b60405180910390f35b34801561024557600080fd5b5061026d7f000000000000000000000000000000000000000000000000000000000000000081565b604051600160a060020a039091168152602001610230565b34801561029157600080fd5b506102266102a0366004611d43565b610954565b3480156102b157600080fd5b506102266102c0366004611d7c565b60106020526000908152604090205481565b3480156102de57600080fd5b50610226600e5481565b3480156102f457600080fd5b50610206610303366004611d7c565b610993565b34801561031457600080fd5b50610226610323366004611d7c565b60096020526000908152604090205481565b34801561034157600080fd5b50610365610350366004611d7c565b600f6020526000908152604090205460ff1681565b6040519015158152602001610230565b34801561038157600080fd5b5061022660115481565b34801561039757600080fd5b50610206610a37565b3480156103ac57600080fd5b5061026d6103bb366004611d99565b610abb565b3480156103cc57600080fd5b506103e06103db366004611db2565b610ae5565b60408051600160a060020a0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610230565b34801561043157600080fd5b50600054600160a060020a031661026d565b34801561044f57600080fd5b5061022660045481565b34801561046557600080fd5b50610206610474366004611d7c565b610b55565b34801561048557600080fd5b50610226610494366004611d7c565b60076020526000908152604090205481565b3480156104b257600080fd5b5061022660085481565b3480156104c857600080fd5b506103656104d7366004611de5565b610b63565b3480156104e857600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561051c57600080fd5b5061020661052b366004611d7c565b610c54565b34801561053c57600080fd5b5061022661054b366004611d43565b610cef565b34801561055c57600080fd5b5061022661056b366004611d43565b610cfb565b34801561057c57600080fd5b5061020661058b366004611e13565b610d7c565b34801561059c57600080fd5b506102266105ab366004611d43565b600160a060020a03918216600090815260066020908152604080832093909416825291909152205490565b3480156105e257600080fd5b50600e54610226565b3480156105f757600080fd5b5060035461026d90600160a060020a031681565b34801561061757600080fd5b50610206610626366004611d99565b610e2d565b34801561063757600080fd5b50610206610646366004611d7c565b610fb7565b34801561065757600080fd5b506103e0610666366004611d43565b6110cb565b34801561067757600080fd5b5061068b610686366004611d99565b6111b6565b60408051938452602084019290925290820152606001610230565b6000600854116106b557600080fd5b6003546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091600160a060020a0316906370a0823190602401602060405180830381865afa158015610717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073b9190611e3f565b600354909150610755903490600160a060020a03166112d3565b6003546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916107e7918491600160a060020a0316906370a0823190602401602060405180830381865afa1580156107bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e19190611e3f565b9061148e565b905080156108d05760085461083c90610811837001000000000000000000000000000000006114d0565b61081b9190611e71565b600354600160a060020a031660009081526001602052604090205490611571565b600354600160a060020a0316600090815260016020908152604091829020929092555182815233917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a2600354600160a060020a03166000908152600960205260409020546108b49082611571565b600354600160a060020a03166000908152600960205260409020555b6002546108df90600190611e96565b600454146108fa576004546108f5906001611ead565b6108fd565b60005b60048190555060026004548154811061091857610918611ec5565b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555050565b600160a060020a03808316600090815260066020908152604080832093851683529290529081205461098a906107e18585610cfb565b90505b92915050565b600054600160a060020a031633146109c95760405160e560020a62461bcd0281526004016109c090611ede565b60405180910390fd5b600160a060020a0381166000908152600f60205260408120805460ff191660011790556109f79082906115d3565b610a008161166c565b604051600160a060020a038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b600054600160a060020a03163314610a645760405160e560020a62461bcd0281526004016109c090611ede565b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60028181548110610acb57600080fd5b600091825260209091200154600160a060020a0316905081565b600080600080600080600080610afa600a5490565b8a10610b1f575060009650600019955085945086935083925082915081905080610b48565b6000610b2a8b6117b9565b9050610b36818b6110cb565b98509850985098509850985098509850505b9295985092959890939650565b610b5f33826117ec565b5050565b60008054600160a060020a03163314610b915760405160e560020a62461bcd0281526004016109c090611ede565b60008060005b600254811015610c4b57610bd28660028381548110610bb857610bb8611ec5565b600091825260209091200154600160a060020a03166117ec565b92508215610c3957600160a060020a038616600081815260106020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610c2c9087815260200190565b60405180910390a3600191505b80610c4381611f13565b915050610b97565b50949350505050565b600054600160a060020a03163314610c815760405160e560020a62461bcd0281526004016109c090611ede565b600160a060020a0381166000908152600f602052604090205460ff16610ca657600080fd5b600160a060020a0381166000818152600f6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b600061098a8383610954565b600160a060020a0380821660008181526005602090815260408083209487168352938152838220546007825284832054938352600190915292812054909270010000000000000000000000000000000092610d7292610d6d9291610d6791610d62916114d0565b611932565b90611942565b611980565b61098a9190611e71565b600054600160a060020a03163314610da95760405160e560020a62461bcd0281526004016109c090611ede565b600160a060020a0382166000908152600f602052604090205460ff16610b5f577f00000000000000000000000000000000000000000000000000000000000000008110610e0957610dfa82826115d3565b610e048282611993565b610e1d565b610e148260006115d3565b610e1d8261166c565b610e28826001610b63565b505050565b600054600160a060020a03163314610e5a5760405160e560020a62461bcd0281526004016109c090611ede565b6104b08110158015610e6f5750620151808111155b610f0a5760405160e560020a62461bcd02815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e642032342060648201527f686f757273000000000000000000000000000000000000000000000000000000608482015260a4016109c0565b6011548103610f845760405160e560020a62461bcd02815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c756500000000000000000060648201526084016109c0565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b600054600160a060020a03163314610fe45760405160e560020a62461bcd0281526004016109c090611ede565b600160a060020a0381166110635760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c0565b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b8160008080808080806110dd88611a5e565b965060001995506000871261113f57600e5487111561110b57600e54611104908890611aa3565b955061113f565b600e54600a546000911061112057600061112f565b600e54600a5461112f9161148e565b905061113b8882611942565b9650505b611149888a610954565b9450611155888a610cfb565b600160a060020a03891660009081526010602052604090205490945092508261117f57600061118d565b60115461118d908490611571565b915042821161119d5760006111a7565b6111a7824261148e565b90509295985092959890939650565b600a54600090819081908082036111d8575050600e54600092508291506112cc565b600e546000805a90506000805b89841080156111f357508582105b156112bb578461120281611f13565b600a549096508610905061121557600094505b6000600a600001868154811061122d5761122d611ec5565b6000918252602080832090910154600160a060020a0316808352601090915260409091205490915061125e90611ae0565b156112815761126e816001610b63565b15611281578161127d81611f13565b9250505b8261128b81611f13565b93505060005a9050808511156112b2576112af6112a8868361148e565b8790611571565b95505b93506111e59050565b600e85905590975095509193505050505b9193909250565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031663ad5c46486040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190611f2c565b816000815181106113a5576113a5611ec5565b6020026020010190600160a060020a03169081600160a060020a03168152505081816001815181106113d9576113d9611ec5565b600160a060020a0392831660209182029290920101526040517fb6f9de950000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de9590859061145790600090869030904290600401611f49565b6000604051808303818588803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b5050505050505050565b600061098a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b07565b6000826000036114e25750600061098d565b60006114ee8385611fb3565b9050826114fb8583611e71565b1461098a5760405160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016109c0565b60008061157e8385611ead565b90508381101561098a5760405160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109c0565b600160a060020a03821660009081526007602052604090208054908290558082111561162f576000611605838361148e565b90506116118482611b44565b80600860008282546116239190611ead565b90915550610e28915050565b80821015610e28576000611643828461148e565b905061164f8482611c4d565b80600860008282546116619190611e96565b909155505050505050565b600160a060020a0381166000908152600d602052604090205460ff1661168f5750565b600160a060020a0381166000908152600d60209081526040808320805460ff19169055600b8252808320839055600c909152812054600a549091906116d690600190611e96565b90506000600a60000182815481106116f0576116f0611ec5565b6000918252602080832090910154600160a060020a03908116808452600c90925260408084208790559087168352822091909155600a805491925082918590811061173d5761173d611ec5565b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600a80548061178457611784611fd2565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff1916905501905550505050565b6000600a60000182815481106117d1576117d1611ec5565b600091825260209091200154600160a060020a031692915050565b6000806117f98484610954565b9050801561192857600160a060020a038085166000908152600660209081526040808320938716835292905220546118319082611571565b600160a060020a038086166000818152600660209081526040808320948916835293905282902092909255517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061188c9084815260200190565b60405180910390a26040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156118fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119209190611feb565b50905061098d565b5060009392505050565b6000818181121561098d57600080fd5b60008061194f8385612008565b9050600083121580156119625750838112155b80611977575060008312801561197757508381125b61098a57600080fd5b60008082121561198f57600080fd5b5090565b600160a060020a0382166000908152600d602052604090205460ff16156119d157600160a060020a03919091166000908152600b6020526040902055565b600160a060020a0382166000818152600d60209081526040808320805460ff19166001908117909155600b8352818420869055600a8054600c909452918420839055820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801805473ffffffffffffffffffffffffffffffffffffffff191690911790555050565b600160a060020a0381166000908152600d602052604081205460ff16611a875750600019919050565b50600160a060020a03166000908152600c602052604090205490565b600080611ab0838561207c565b905060008312158015611ac35750838113155b806119775750600083128015611977575083811361098a57600080fd5b600042821115611af257506000919050565b601154611aff428461148e565b101592915050565b60008184841115611b2e5760405160e560020a62461bcd0281526004016109c091906120f0565b506000611b3b8486611e96565b95945050505050565b60005b600254811015610e2857611bef611b9d610d62846001600060028781548110611b7257611b72611ec5565b6000918252602080832090910154600160a060020a03168352820192909252604001902054906114d0565b6005600060028581548110611bb457611bb4611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093891682529290925290205490611aa3565b6005600060028481548110611c0657611c06611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093881682529290925290205580611c4581611f13565b915050611b47565b60005b600254811015610e2857611ccd611c7b610d62846001600060028781548110611b7257611b72611ec5565b6005600060028581548110611c9257611c92611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093891682529290925290205490611942565b6005600060028481548110611ce457611ce4611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093881682529290925290205580611d2381611f13565b915050611c50565b600160a060020a0381168114611d4057600080fd5b50565b60008060408385031215611d5657600080fd5b8235611d6181611d2b565b91506020830135611d7181611d2b565b809150509250929050565b600060208284031215611d8e57600080fd5b813561098a81611d2b565b600060208284031215611dab57600080fd5b5035919050565b60008060408385031215611dc557600080fd5b823591506020830135611d7181611d2b565b8015158114611d4057600080fd5b60008060408385031215611df857600080fd5b8235611e0381611d2b565b91506020830135611d7181611dd7565b60008060408385031215611e2657600080fd5b8235611e3181611d2b565b946020939093013593505050565b600060208284031215611e5157600080fd5b5051919050565b60e060020a634e487b7102600052601160045260246000fd5b600082611e915760e060020a634e487b7102600052601260045260246000fd5b500490565b600082821015611ea857611ea8611e58565b500390565b60008219821115611ec057611ec0611e58565b500190565b60e060020a634e487b7102600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201611f2557611f25611e58565b5060010190565b600060208284031215611f3e57600080fd5b815161098a81611d2b565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611f93578451600160a060020a031683529383019391830191600101611f6e565b5050600160a060020a039690961660408501525050506060015292915050565b6000816000190483118215151615611fcd57611fcd611e58565b500290565b60e060020a634e487b7102600052603160045260246000fd5b600060208284031215611ffd57600080fd5b815161098a81611dd7565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561204257612042611e58565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561207657612076611e58565b50500190565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156120b6576120b6611e58565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156120ea576120ea611e58565b50500390565b600060208083528351808285015260005b8181101561211d57858101830151858201604001528201612101565b8181111561212f576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212208871d7b8a628308d4c21e59b32d2760723c81b07f52e669b73a11490b012dfc464736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x60806040526004361061047b5760003560e060020a900480638095d5641161024e578063c492f0461161013d578063e98030c7116100ba578063f54afa781161007e578063f54afa7814610d87578063f8b45b0514610d9d578063fb002c9714610db3578063fd361d0e14610dc9578063fd72e22a14610de357600080fd5b8063e98030c714610d05578063ee40166e14610d25578063ee44b44e14610d3b578063efcc1b2f14610d51578063f2fde38b14610d6757600080fd5b8063d0a3981411610101578063d0a3981414610c69578063dd62ed3e14610c7f578063e2f4560514610cc5578063e7841ec014610cdb578063e884f26014610cf057600080fd5b8063c492f04614610bed578063c876d0b914610c0d578063c8c8ebe414610c27578063ccb6135814610c3d578063ccd146b214610c5357600080fd5b8063a26579ad116101cb578063bbc0c7421161018f578063bbc0c74214610b4e578063c024666814610b6d578063c0f306ef14610b8d578063c17b5b8c14610bad578063c18bc19514610bcd57600080fd5b8063a26579ad14610ab3578063a457c2d714610ac8578063a9059cbb14610ae8578063b62496f514610b08578063b9e9370014610b3857600080fd5b806392b596261161021257806392b5962614610a3257806395d89b4114610a525780639a36f93214610a675780639a7a23d614610a7d5780639c1b8af514610a9d57600080fd5b80638095d5641461099f578063871c128d146109bf5780638a8c523c146109df5780638da5cb5b146109f4578063924de9b714610a1257600080fd5b80634a62bb651161036a57806370a08231116102e7578063751039fc116102ab578063751039fc1461092a5780637571336a1461093f578063763cef491461095f578063783102eb146109745780637fa787ba1461098a57600080fd5b806370a08231146108b5578063712c2985146108d5578063715018a6146108ea57806371778e7d146108ff5780637506cbd81461091457600080fd5b8063632459f01161032e578063632459f0146107db57806364b0f653146108405780636843cd84146108555780636ddd171314610875578063700bb1911461089557600080fd5b80634a62bb651461073d5780634af6f7ee146107575780634e71d92d1461076d5780634fbee193146107825780635645cd86146107bb57600080fd5b8063203e727e116103f857806330d5d18d116103bc57806330d5d18d1461068d578063313ce567146106ad57806331e79db0146106c957806339509351146106e957806349bd5a5e1461070957600080fd5b8063203e727e146105eb578063204f11a81461060d57806323b872dd1461062d5780632c1f52161461064d5780632d5a5d341461066d57600080fd5b806310d5de531161043f57806310d5de531461052e5780631694505e1461055e57806318160ddd146105aa5780631a8145bb146105bf5780631fc851bd146105d557600080fd5b8063058054c91461048757806306fdde03146104b0578063095ea7b3146104d2578063099d0d30146105025780630f4432e31461051857600080fd5b3661048257005b600080fd5b34801561049357600080fd5b5061049d601e5481565b6040519081526020015b60405180910390f35b3480156104bc57600080fd5b506104c5610e03565b6040516104a79190613d3a565b3480156104de57600080fd5b506104f26104ed366004613da4565b610e95565b60405190151581526020016104a7565b34801561050e57600080fd5b5061049d60155481565b34801561052457600080fd5b5061049d600b5481565b34801561053a57600080fd5b506104f2610549366004613dd0565b60236020526000908152604090205460ff1681565b34801561056a57600080fd5b506105927f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b604051600160a060020a0390911681526020016104a7565b3480156105b657600080fd5b5060025461049d565b3480156105cb57600080fd5b5061049d601c5481565b3480156105e157600080fd5b5061049d600d5481565b3480156105f757600080fd5b5061060b610606366004613ded565b610eac565b005b34801561061957600080fd5b5061049d610628366004613e06565b610fa5565b34801561063957600080fd5b506104f2610648366004613e3f565b61103c565b34801561065957600080fd5b5060065461059290600160a060020a031681565b34801561067957600080fd5b5061060b610688366004613e8e565b6110fe565b34801561069957600080fd5b5061060b6106a8366004613dd0565b611156565b3480156106b957600080fd5b50604051601281526020016104a7565b3480156106d557600080fd5b5061060b6106e4366004613dd0565b611251565b3480156106f557600080fd5b506104f2610704366004613da4565b6112fa565b34801561071557600080fd5b506105927f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee981565b34801561074957600080fd5b50600e546104f29060ff1681565b34801561076357600080fd5b5061049d60175481565b34801561077957600080fd5b5061060b611336565b34801561078e57600080fd5b506104f261079d366004613dd0565b600160a060020a031660009081526022602052604090205460ff1690565b3480156107c757600080fd5b5061049d6107d6366004613dd0565b6113c7565b3480156107e757600080fd5b506107fb6107f6366004613ebc565b611450565b60408051600160a060020a0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104a7565b34801561084c57600080fd5b5061049d61150d565b34801561086157600080fd5b5061049d610870366004613dd0565b611599565b34801561088157600080fd5b50600e546104f29062010000900460ff1681565b3480156108a157600080fd5b5061060b6108b0366004613ded565b6115e5565b3480156108c157600080fd5b5061049d6108d0366004613dd0565b6116ce565b3480156108e157600080fd5b5061049d6116e9565b3480156108f657600080fd5b5061060b61170d565b34801561090b57600080fd5b5061049d611791565b34801561092057600080fd5b5061049d60145481565b34801561093657600080fd5b506104f26117f4565b34801561094b57600080fd5b5061060b61095a366004613e8e565b611840565b34801561096b57600080fd5b5061060b6118cd565b34801561098057600080fd5b5061049d60215481565b34801561099657600080fd5b5061060b611aea565b3480156109ab57600080fd5b5061060b6109ba366004613ee1565b611bb3565b3480156109cb57600080fd5b5061060b6109da366004613ded565b611c61565b3480156109eb57600080fd5b5061060b611dc6565b348015610a0057600080fd5b50600554600160a060020a0316610592565b348015610a1e57600080fd5b5061060b610a2d366004613f0d565b611e65565b348015610a3e57600080fd5b506107fb610a4d366004613e06565b611eae565b348015610a5e57600080fd5b506104c5611f11565b348015610a7357600080fd5b5061049d6103e881565b348015610a8957600080fd5b5061060b610a98366004613e8e565b611f20565b348015610aa957600080fd5b5061049d601d5481565b348015610abf57600080fd5b5061049d612027565b348015610ad457600080fd5b506104f2610ae3366004613da4565b61208a565b348015610af457600080fd5b506104f2610b03366004613da4565b61213e565b348015610b1457600080fd5b506104f2610b23366004613dd0565b60246020526000908152604090205460ff1681565b348015610b4457600080fd5b5061049d60165481565b348015610b5a57600080fd5b50600e546104f290610100900460ff1681565b348015610b7957600080fd5b5061060b610b88366004613e8e565b61214b565b348015610b9957600080fd5b5061060b610ba8366004613dd0565b6121d0565b348015610bb957600080fd5b5061060b610bc8366004613ee1565b612248565b348015610bd957600080fd5b5061060b610be8366004613ded565b6122f1565b348015610bf957600080fd5b5061060b610c08366004613f2a565b6123e0565b348015610c1957600080fd5b506011546104f29060ff1681565b348015610c3357600080fd5b5061049d60085481565b348015610c4957600080fd5b5061049d60195481565b348015610c5f57600080fd5b5061049d60135481565b348015610c7557600080fd5b5061049d60125481565b348015610c8b57600080fd5b5061049d610c9a366004613e06565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b348015610cd157600080fd5b5061049d60095481565b348015610ce757600080fd5b5061049d6124bf565b348015610cfc57600080fd5b506104f2612522565b348015610d1157600080fd5b5061060b610d20366004613ded565b612562565b348015610d3157600080fd5b5061049d600c5481565b348015610d4757600080fd5b5061049d601f5481565b348015610d5d57600080fd5b5061049d60185481565b348015610d7357600080fd5b5061060b610d82366004613dd0565b6125d9565b348015610d9357600080fd5b5061049d601a5481565b348015610da957600080fd5b5061049d600a5481565b348015610dbf57600080fd5b5061049d601b5481565b348015610dd557600080fd5b506020546104f29060ff1681565b348015610def57600080fd5b5060075461059290600160a060020a031681565b606060038054610e1290613faf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e90613faf565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b5050505050905090565b6000610ea23384846126ee565b5060015b92915050565b600554600160a060020a03163314610ee25760405160e560020a62461bcd028152600401610ed990613fec565b60405180910390fd5b670de0b6b3a76400006103e8610ef760025490565b610f0290600161403a565b610f0c9190614059565b610f169190614059565b8111610f8d5760405160e560020a62461bcd02815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e312500000000000000000000000000000000006064820152608401610ed9565b610f9f81670de0b6b3a764000061403a565b60085550565b6006546040517f204f11a8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611035919061407e565b9392505050565b600061104984848461284c565b600160a060020a0384166000908152600160209081526040808320338452909152902054828110156110e65760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610ed9565b6110f385338584036126ee565b506001949350505050565b600554600160a060020a0316331461112b5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a03919091166000908152601060205260409020805460ff1916911515919091179055565b600554600160a060020a031633146111835760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166111dc5760405160e560020a62461bcd02815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610ed9565b6111e781600161214b565b600754604051600160a060020a03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a36007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554600160a060020a0316331461127e5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b5050505050565b336000818152600160209081526040808320600160a060020a03871684529091528120549091610ea2918590611331908690614097565b6126ee565b6006546040517fbc4c4b3700000000000000000000000000000000000000000000000000000000815233600482015260006024820152600160a060020a039091169063bc4c4b37906044016020604051808303816000875af11580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c491906140af565b50565b6006546040517f4d6e5e02000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea6919061407e565b6006546040517f8c503bf500000000000000000000000000000000000000000000000000000000815260048101849052600160a060020a0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156114cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f091906140cc565b975097509750975097509750975097509295985092959890939650565b600654604080517f09bbedde0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916309bbedde9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611594919061407e565b905090565b6006546040517fab6ddfa8000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152600092169063ab6ddfa89060240161140f565b6006546040517fffb2c4790000000000000000000000000000000000000000000000000000000081526004810183905260009182918291600160a060020a03169063ffb2c479906024016060604051808303816000875af115801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190614136565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b600160a060020a031660009081526020819052604090205490565b60205460009060ff161561170757601f54601e546115949190614097565b50600090565b600554600160a060020a0316331461173a5760405160e560020a62461bcd028152600401610ed990613fec565b600554604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36005805473ffffffffffffffffffffffffffffffffffffffff19169055565b600654604080517fad7a672f0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163ad7a672f9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146118245760405160e560020a62461bcd028152600401610ed990613fec565b50600e805460ff19908116909155601180549091169055600190565b600554600160a060020a0316331461186d5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b600554600160a060020a031633146118fa5760405160e560020a62461bcd028152600401610ed990613fec565b6119026116e9565b4210158015611918575060006119166116e9565b115b6119675760405160e560020a62461bcd02815260206004820152601660248201527f4d757374207265717565737420616e6420776169742e000000000000000000006044820152606401610ed9565b6000601e8190556020805460ff191690556021546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152606491907f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a0316906370a0823190602401602060405180830381865afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a20919061407e565b611a2a919061403a565b611a349190614059565b60006021556040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a03169063a9059cbb906044016020604051808303816000875af1158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae691906140af565b5050565b600554600160a060020a03163314611b175760405160e560020a62461bcd028152600401610ed990613fec565b60405160009033903031908381818185875af1925050503d8060008114611b5a576040519150601f19603f3d011682016040523d82523d6000602084013e611b5f565b606091505b50509050806113c45760405160e560020a62461bcd02815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152606401610ed9565b600554600160a060020a03163314611be05760405160e560020a62461bcd028152600401610ed990613fec565b60188390556017829055601981905580611bfa8385614097565b611c049190614097565b601681905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b505050565b600554600160a060020a03163314611c8e5760405160e560020a62461bcd028152600401610ed990613fec565b62030d408110158015611ca457506207a1208111155b611d195760405160e560020a62461bcd02815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527f6e203230302c30303020616e64203530302c30303000000000000000000000006064820152608401610ed9565b601d548103611d935760405160e560020a62461bcd02815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201527f6f2073616d652076616c756500000000000000000000000000000000000000006064820152608401610ed9565b601d5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601d55565b600554600160a060020a03163314611df35760405160e560020a62461bcd028152600401610ed990613fec565b600e54610100900460ff1615611e4e5760405160e560020a62461bcd02815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610ed9565b600e805462ffff0019166201010017905543600c55565b600554600160a060020a03163314611e925760405160e560020a62461bcd028152600401610ed990613fec565b600e8054911515620100000262ff000019909216919091179055565b6006546040517ffd590847000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016114ae565b606060048054610e1290613faf565b600554600160a060020a03163314611f4d5760405160e560020a62461bcd028152600401610ed990613fec565b7f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a031682600160a060020a03160361201d5760405160e560020a62461bcd02815260206004820152604160248201527f54686520556e695377617020706169722063616e6e6f742062652072656d6f7660448201527f65642066726f6d206175746f6d617465644d61726b65744d616b65725061697260648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a401610ed9565b611ae68282613458565b600654604080517f6f2789ec0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691636f2789ec9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156121275760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610ed9565b61213433858584036126ee565b5060019392505050565b6000610ea233848461284c565b600554600160a060020a031633146121785760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016118c1565b600554600160a060020a031633146121fd5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fc0f306ef000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301529091169063c0f306ef906024016112c5565b600554600160a060020a031633146122755760405160e560020a62461bcd028152600401610ed990613fec565b6014839055601382905560158190558061228f8385614097565b6122999190614097565b601281905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b600554600160a060020a0316331461231e5760405160e560020a62461bcd028152600401610ed990613fec565b670de0b6b3a7640000606461233260025490565b61233d90600161403a565b6123479190614059565b6123519190614059565b81116123c85760405160e560020a62461bcd02815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f31250000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b6123da81670de0b6b3a764000061403a565b600a5550565b600554600160a060020a0316331461240d5760405160e560020a62461bcd028152600401610ed990613fec565b60005b8281101561247e57816022600086868581811061242f5761242f614164565b90506020020160208101906124449190613dd0565b600160a060020a031681526020810191909152604001600020805460ff1916911515919091179055806124768161417d565b915050612410565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516124b293929190614196565b60405180910390a1505050565b600654604080517fe7841ec00000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163e7841ec09160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146125525760405160e560020a62461bcd028152600401610ed990613fec565b506011805460ff19169055600190565b600554600160a060020a0316331461258f5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fe98030c700000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063e98030c7906024016112c5565b600554600160a060020a031633146126065760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166126855760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ed9565b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03831661276c5760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0382166127eb5760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a0383166128755760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a03821661289e5760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a03821660009081526010602052604090205460ff161580156128e05750600160a060020a03831660009081526010602052604090205460ff16155b6129555760405160e560020a62461bcd02815260206004820152603160248201527f596f752068617665206265656e20626c61636b6c69737465642066726f6d207460448201527f72616e73666572696e6720746f6b656e730000000000000000000000000000006064820152608401610ed9565b8060000361296957611c5c83836000613541565b600e54610100900460ff16612a0657600160a060020a03831660009081526022602052604090205460ff16806129b75750600160a060020a03821660009081526022602052604090205460ff165b612a065760405160e560020a62461bcd02815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ed9565b600e5460ff1615612e3c57600554600160a060020a03848116911614801590612a3d5750600554600160a060020a03838116911614155b8015612a515750600160a060020a03821615155b8015612a685750600160a060020a03821661dead14155b8015612a7e575060055460a060020a900460ff16155b15612e3c5760115460ff1615612bc7577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d600160a060020a031682600160a060020a031614158015612b0257507f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a031682600160a060020a031614155b15612bc757326000908152600f60205260409020544311612bb45760405160e560020a62461bcd02815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60648201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000608482015260a401610ed9565b326000908152600f602052604090204390555b600160a060020a03831660009081526024602052604090205460ff168015612c085750600160a060020a03821660009081526023602052604090205460ff16155b15612cf457600854811115612c885760405160e560020a62461bcd02815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e00000000000000000000006064820152608401610ed9565b600a54612c94836116ce565b612c9e9083614097565b1115612cef5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b612e3c565b600160a060020a03821660009081526024602052604090205460ff168015612d355750600160a060020a03831660009081526023602052604090205460ff16155b15612db557600854811115612cef5760405160e560020a62461bcd02815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e000000000000000000006064820152608401610ed9565b600160a060020a03821660009081526023602052604090205460ff16612e3c57600a54612de1836116ce565b612deb9083614097565b1115612e3c5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b6000612e47306116ce565b60095490915081108015908190612e665750600e5462010000900460ff165b8015612e7c575060055460a060020a900460ff16155b8015612ea15750600160a060020a03851660009081526024602052604090205460ff16155b8015612ec65750600160a060020a03851660009081526022602052604090205460ff16155b8015612eeb5750600160a060020a03841660009081526022602052604090205460ff16155b15612f3b576005805474ff0000000000000000000000000000000000000000191660a060020a179055612f1c6136a8565b6005805474ff0000000000000000000000000000000000000000191690555b600554600160a060020a03861660009081526022602052604090205460ff60a060020a909204821615911680612f895750600160a060020a03851660009081526022602052604090205460ff165b15612f92575060005b600081156132575743600c546001612faa9190614097565b10158015612ff25750600160a060020a03861660009081526024602052604090205460ff1680612ff25750600160a060020a03871660009081526024602052604090205460ff165b1561309e5761300d60646130078760636138d8565b90613979565b9050606361301c82602161403a565b6130269190614059565b601c60008282546130379190614097565b909155506063905061304a82602161403a565b6130549190614059565b601a60008282546130659190614097565b909155506063905061307882602161403a565b6130829190614059565b601b60008282546130939190614097565b909155506132399050565b600160a060020a03861660009081526024602052604090205460ff1680156130c857506000601254115b1561315b576130e86103e8613007601254886138d890919063ffffffff16565b9050601254601354826130fb919061403a565b6131059190614059565b601a60008282546131169190614097565b909155505060125460155461312b908361403a565b6131359190614059565b601c60008282546131469190614097565b9091555050601254601454613078908361403a565b600160a060020a03871660009081526024602052604090205460ff16801561318557506000601654115b15613239576131a56103e8613007601654886138d890919063ffffffff16565b9050601654601754826131b8919061403a565b6131c29190614059565b601a60008282546131d39190614097565b90915550506016546019546131e8908361403a565b6131f29190614059565b601c60008282546132039190614097565b9091555050601654601854613218908361403a565b6132229190614059565b601b60008282546132339190614097565b90915550505b801561324a5761324a873083613541565b61325481866142a9565b94505b613262878787613541565b600654600160a060020a031663e30443bc8861327d816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1580156132c157600080fd5b505af11580156132d5573d6000803e3d6000fd5b5050600654600160a060020a0316915063e30443bc9050876132f6816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561333a57600080fd5b505af115801561334e573d6000803e3d6000fd5b505060055460a060020a900460ff1615915050801561336f57506000601d54115b1561344f57601d546006546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063ffb2c479906024016060604051808303816000875af19250505080156133f7575060408051601f3d908101601f191682019092526133f491810190614136565b60015b1561344d5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600160a060020a0382166000908152602460205260409020805460ff19168215151790556134868282611840565b8015613505576006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152909116906331e79db090602401600060405180830381600087803b1580156134ec57600080fd5b505af1158015613500573d6000803e3d6000fd5b505050505b60405181151590600160a060020a038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600160a060020a03831661356a5760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a0382166135935760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a038316600090815260208190526040902054818110156136255760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0380851660009081526020819052604080822085850390559185168152908120805484929061365c908490614097565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116c091815260200190565b60006136b3306116ce565b90506000601a54601b54601c546136ca9190614097565b6136d49190614097565b90508115806136e1575080155b156136ea575050565b6000600282601c54856136fd919061403a565b6137079190614059565b6137119190614059565b9050600061371f84836139bb565b9050303161372c826139fd565b60006137393031836139bb565b905060006137676002601c5461374f9190614059565b61375990886142a9565b601b546130079085906138d8565b905060006137956002601c5461377d9190614059565b61378790896142a9565b601a546130079086906138d8565b90506000816137a484866142a9565b6137ae91906142a9565b6000601c819055601b819055601a55905086158015906137ce5750600081115b15613821576137dd8782613bd9565b601c54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b600654604051600091600160a060020a03169084908381818185875af1925050503d806000811461386e576040519150601f19603f3d011682016040523d82523d6000602084013e613873565b606091505b5050600754604051919250600160a060020a031690303190600081818185875af1925050503d80600081146138c4576040519150601f19603f3d011682016040523d82523d6000602084013e6138c9565b606091505b50505050505050505050505050565b6000826000036138ea57506000610ea6565b60006138f6838561403a565b9050826139038583614059565b146110355760405160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600061103583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ccc565b600061103583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d06565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a3257613a32614164565b6020026020010190600160a060020a03169081600160a060020a0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015613ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad791906142c0565b81600181518110613aea57613aea614164565b6020026020010190600160a060020a03169081600160a060020a031681525050613b35307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846126ee565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152600160a060020a037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790613ba39085906000908690309042906004016142dd565b600060405180830381600087803b158015613bbd57600080fd5b505af1158015613bd1573d6000803e3d6000fd5b505050505050565b613c04307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846126ee565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d600160a060020a03169063f305d71990839060c40160606040518083038185885af1158015613ca7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112f39190614136565b60008183613cf05760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd8486614059565b95945050505050565b60008184841115613d2d5760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd84866142a9565b600060208083528351808285015260005b81811015613d6757858101830151858201604001528201613d4b565b81811115613d79576000604083870101525b50601f01601f1916929092016040019392505050565b600160a060020a03811681146113c457600080fd5b60008060408385031215613db757600080fd5b8235613dc281613d8f565b946020939093013593505050565b600060208284031215613de257600080fd5b813561103581613d8f565b600060208284031215613dff57600080fd5b5035919050565b60008060408385031215613e1957600080fd5b8235613e2481613d8f565b91506020830135613e3481613d8f565b809150509250929050565b600080600060608486031215613e5457600080fd5b8335613e5f81613d8f565b92506020840135613e6f81613d8f565b929592945050506040919091013590565b80151581146113c457600080fd5b60008060408385031215613ea157600080fd5b8235613eac81613d8f565b91506020830135613e3481613e80565b60008060408385031215613ecf57600080fd5b823591506020830135613e3481613d8f565b600080600060608486031215613ef657600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f1f57600080fd5b813561103581613e80565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b8760208083028501011115613f8e57600080fd5b60209283019550935050840135613fa481613e80565b809150509250925092565b600281046001821680613fc357607f821691505b602082108103613fe65760e060020a634e487b7102600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60e060020a634e487b7102600052601160045260246000fd5b600081600019048311821515161561405457614054614021565b500290565b6000826140795760e060020a634e487b7102600052601260045260246000fd5b500490565b60006020828403121561409057600080fd5b5051919050565b600082198211156140aa576140aa614021565b500190565b6000602082840312156140c157600080fd5b815161103581613e80565b600080600080600080600080610100898b0312156140e957600080fd5b88516140f481613d8f565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060006060848603121561414b57600080fd5b8351925060208401519150604084015190509250925092565b60e060020a634e487b7102600052603260045260246000fd5b60006001820161418f5761418f614021565b5060010190565b6040808252810183905260008460608301825b868110156141d95782356141bc81613d8f565b600160a060020a03168252602092830192909101906001016141a9565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6000828210156142bb576142bb614021565b500390565b6000602082840312156142d257600080fd5b815161103581613d8f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561432d578451600160a060020a031683529383019391830191600101614308565b5050600160a060020a0396909616606085015250505060800152939250505056fea2646970667358221220850544e7686e09195b8d6725fee5b7d2d55e3001c4a7a20a8f42dc4eefd51aa564736f6c634300080d0033
Deployed Bytecode Sourcemap
41638:21846:0:-:0;;;;;;;;;;-1:-1:-1;;;41638:21846:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43259:41;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;43259:41:0;;;;;;;;4170:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5084:169::-;;;;;;;;;;-1:-1:-1;5084:169:0;;;;;:::i;:::-;;:::i;:::-;;;1442:14:1;;1435:22;1417:41;;1405:2;1390:18;5084:169:0;1277:187:1;42896:31:0;;;;;;;;;;;;;;;;42059:39;;;;;;;;;;;;;;;;43589:64;;;;;;;;;;-1:-1:-1;43589:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41714:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1912:55:1;;;1894:74;;1882:2;1867:18;41714:51:0;1721:253:1;4491:108:0;;;;;;;;;;-1:-1:-1;4579:12:0;;4491:108;;43169:33;;;;;;;;;;;;;;;;42221;;;;;;;;;;;;;;;;48653:233;;;;;;;;;;-1:-1:-1;48653:233:0;;;;;:::i;:::-;;:::i;:::-;;52576:183;;;;;;;;;;-1:-1:-1;52576:183:0;;;;;:::i;:::-;;:::i;5261:492::-;;;;;;;;;;-1:-1:-1;5261:492:0;;;;;:::i;:::-;;:::i;41849:38::-;;;;;;;;;;-1:-1:-1;41849:38:0;;;;-1:-1:-1;;;;;41849:38:0;;;48309:135;;;;;;;;;;-1:-1:-1;48309:135:0;;;;;:::i;:::-;;:::i;51254:349::-;;;;;;;;;;-1:-1:-1;51254:349:0;;;;;:::i;:::-;;:::i;4390:93::-;;;;;;;;;;-1:-1:-1;4390:93:0;;4473:2;3933:36:1;;3921:2;3906:18;4390:93:0;3791:184:1;47662:130:0;;;;;;;;;;-1:-1:-1;47662:130:0;;;;;:::i;:::-;;:::i;5761:215::-;;;;;;;;;;-1:-1:-1;5761:215:0;;;;;:::i;:::-;;:::i;41772:38::-;;;;;;;;;;;;;;;42330:33;;;;;;;;;;-1:-1:-1;42330:33:0;;;;;;;;42974:28;;;;;;;;;;;;;;;;53896:97;;;;;;;;;;;;;:::i;52441:127::-;;;;;;;;;;-1:-1:-1;52441:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;52532:28:0;52508:4;52532:28;;;:19;:28;;;;;;;;;52441:127;52262:171;;;;;;;;;;-1:-1:-1;52262:171:0;;;;;:::i;:::-;;:::i;53265:359::-;;;;;;;;;;-1:-1:-1;53265:359:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4888:55:1;;;4870:74;;4975:2;4960:18;;4953:34;;;;5003:18;;;4996:34;;;;5061:2;5046:18;;5039:34;;;;5104:3;5089:19;;5082:35;5148:3;5133:19;;5126:35;5192:3;5177:19;;5170:35;5236:3;5221:19;;5214:35;4857:3;4842:19;53265:359:0;4531:724:1;54135:141:0;;;;;;;;;;;;;:::i;52764:136::-;;;;;;;;;;-1:-1:-1;52764:136:0;;;;;:::i;:::-;;:::i;42410:31::-;;;;;;;;;;-1:-1:-1;42410:31:0;;;;;;;;;;;53629:259;;;;;;;;;;-1:-1:-1;53629:259:0;;;;;:::i;:::-;;:::i;4607:127::-;;;;;;;;;;-1:-1:-1;4607:127:0;;;;;:::i;:::-;;:::i;62684:281::-;;;;;;;;;;;;;:::i;16351:148::-;;;;;;;;;;;;;:::i;54288:119::-;;;;;;;;;;;;;:::i;42857:32::-;;;;;;;;;;;;;;;;54463:159;;;;;;;;;;;;;:::i;49930:202::-;;;;;;;;;;-1:-1:-1;49930:202:0;;;;;:::i;:::-;;:::i;62973:501::-;;;;;;;;;;;;;:::i;43406:31::-;;;;;;;;;;;;;;;;62479:191;;;;;;;;;;;;;:::i;49121:390::-;;;;;;;;;;-1:-1:-1;49121:390:0;;;;;:::i;:::-;;:::i;51611:395::-;;;;;;;;;;-1:-1:-1;51611:395:0;;;;;:::i;:::-;;:::i;48081:218::-;;;;;;;;;;;;;:::i;15709:79::-;;;;;;;;;;-1:-1:-1;15774:6:0;;-1:-1:-1;;;;;15774:6:0;15709:79;;48544:101;;;;;;;;;;-1:-1:-1;48544:101:0;;;;;:::i;:::-;;:::i;52908:352::-;;;;;;;;;;-1:-1:-1;52908:352:0;;;;;:::i;:::-;;:::i;4278:104::-;;;;;;;;;;;;;:::i;42736:41::-;;;;;;;;;;;;42773:4;42736:41;;50646:254;;;;;;;;;;-1:-1:-1;50646:254:0;;;;;:::i;:::-;;:::i;43215:35::-;;;;;;;;;;;;;;;;52146:108;;;;;;;;;;;;;:::i;5984:413::-;;;;;;;;;;-1:-1:-1;5984:413:0;;;;;:::i;:::-;;:::i;4742:175::-;;;;;;;;;;-1:-1:-1;4742:175:0;;;;;:::i;:::-;;:::i;43811:58::-;;;;;;;;;;-1:-1:-1;43811:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42940:27;;;;;;;;;;;;;;;;42370:33;;;;;;;;;;-1:-1:-1;42370:33:0;;;;;;;;;;;50140:184;;;;;;;;;;-1:-1:-1;50140:184:0;;;;;:::i;:::-;;:::i;47897:126::-;;;;;;;;;;-1:-1:-1;47897:126:0;;;;;:::i;:::-;;:::i;49523:399::-;;;;;;;;;;-1:-1:-1;49523:399:0;;;;;:::i;:::-;;:::i;48898:211::-;;;;;;;;;;-1:-1:-1;48898:211:0;;;;;:::i;:::-;;:::i;50332:306::-;;;;;;;;;;-1:-1:-1;50332:306:0;;;;;:::i;:::-;;:::i;42684:39::-;;;;;;;;;;-1:-1:-1;42684:39:0;;;;;;;;41940:35;;;;;;;;;;;;;;;;43047:30;;;;;;;;;;;;;;;;42821:29;;;;;;;;;;;;;;;;42786:28;;;;;;;;;;;;;;;;4925:151;;;;;;;;;;-1:-1:-1;4925:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5041:18:0;;;5014:7;5041:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4925:151;41982:33;;;;;;;;;;;;;;;;54001:126;;;;;;;;;;;;;:::i;47435:134::-;;;;;;;;;;;;;:::i;52014:124::-;;;;;;;;;;-1:-1:-1;52014:124:0;;;;;:::i;:::-;;:::i;42144:37::-;;;;;;;;;;;;;;;;43307:49;;;;;;;;;;;;;;;;43009:31;;;;;;;;;;;;;;;;16654:244;;;;;;;;;;-1:-1:-1;16654:244:0;;;;;:::i;:::-;;:::i;43090:31::-;;;;;;;;;;;;;;;;42022:24;;;;;;;;;;;;;;;;43128:34;;;;;;;;;;;;;;;;43363:36;;;;;;;;;;-1:-1:-1;43363:36:0;;;;;;;;41896:31;;;;;;;;;;-1:-1:-1;41896:31:0;;;;-1:-1:-1;;;;;41896:31:0;;;4170:100;4224:13;4257:5;4250:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4170:100;:::o;5084:169::-;5167:4;5184:39;271:10;5207:7;5216:6;5184:8;:39::i;:::-;-1:-1:-1;5241:4:0;5084:169;;;;;:::o;48653:233::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;;;;;;;;;48771:4:::1;48765;48745:13;4579:12:::0;;;4491:108;48745:13:::1;:17;::::0;48761:1:::1;48745:17;:::i;:::-;:24;;;;:::i;:::-;48744:31;;;;:::i;:::-;48735:6;:40;48727:100;;;::::0;-1:-1:-1;;;;;48727:100:0;;8231:2:1;48727:100:0::1;::::0;::::1;8213:21:1::0;8270:2;8250:18;;;8243:30;8309:34;8289:18;;;8282:62;8380:17;8360:18;;;8353:45;8415:19;;48727:100:0::1;8029:411:1::0;48727:100:0::1;48861:17;:6:::0;48871::::1;48861:17;:::i;:::-;48838:20;:40:::0;-1:-1:-1;48653:233:0:o;52576:183::-;52692:15;;:60;;;;;-1:-1:-1;;;;;8698:15:1;;;52692:60:0;;;8680:34:1;8750:15;;;8730:18;;;8723:43;52668:7:0;;52692:15;;:38;;8592:18:1;;52692:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52685:67;52576:183;-1:-1:-1;;;52576:183:0:o;5261:492::-;5401:4;5418:36;5428:6;5436:9;5447:6;5418:9;:36::i;:::-;-1:-1:-1;;;;;5494:19:0;;5467:24;5494:19;;;:11;:19;;;;;;;;271:10;5494:33;;;;;;;;5546:26;;;;5538:79;;;;-1:-1:-1;;;;;5538:79:0;;9168:2:1;5538:79:0;;;9150:21:1;9207:2;9187:18;;;9180:30;9246:34;9226:18;;;9219:62;9317:10;9297:18;;;9290:38;9345:19;;5538:79:0;8966:404:1;5538:79:0;5653:57;5662:6;271:10;5703:6;5684:16;:25;5653:8;:57::i;:::-;-1:-1:-1;5741:4:0;;5261:492;-1:-1:-1;;;;5261:492:0:o;48309:135::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48401:19:0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:35;;-1:-1:-1;;48401:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48309:135::o;51254:349::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51353:33:0;::::1;51345:70;;;::::0;-1:-1:-1;;;;;51345:70:0;;9577:2:1;51345:70:0::1;::::0;::::1;9559:21:1::0;9616:2;9596:18;;;9589:30;9655:26;9635:18;;;9628:54;9699:18;;51345:70:0::1;9375:348:1::0;51345:70:0::1;51426:42;51442:19;51463:4;51426:15;:42::i;:::-;51529:16;::::0;51484:62:::1;::::0;-1:-1:-1;;;;;51529:16:0;;::::1;::::0;51484:62;::::1;::::0;::::1;::::0;51529:16:::1;::::0;51484:62:::1;51557:16;:38:::0;;-1:-1:-1;;51557:38:0::1;-1:-1:-1::0;;;;;51557:38:0;;;::::1;::::0;;;::::1;::::0;;51254:349::o;47662:130::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;47739:15:::1;::::0;:45:::1;::::0;;;;-1:-1:-1;;;;;1912:55:1;;;47739:45:0::1;::::0;::::1;1894:74:1::0;47739:15:0;;::::1;::::0;:36:::1;::::0;1867:18:1;;47739:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47662:130:::0;:::o;5761:215::-;271:10;5849:4;5898:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5898:34:0;;;;;;;;;;5849:4;;5866:80;;5889:7;;5898:47;;5935:10;;5898:47;:::i;:::-;5866:8;:80::i;53896:97::-;53927:15;;:58;;;;;53966:10;53927:58;;;10045:74:1;53927:15:0;10135:18:1;;;10128:50;-1:-1:-1;;;;;53927:15:0;;;;:30;;10018:18:1;;53927:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53896:97::o;52262:171::-;52371:15;;:54;;;;;-1:-1:-1;;;;;1912:55:1;;;52371:54:0;;;1894:74:1;52344:7:0;;52371:15;;:41;;1867:18:1;;52371:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53265:359::-;53563:15;;:53;;;;;;;;10613:25:1;;;-1:-1:-1;;;;;10674:55:1;;;10654:18;;;10647:83;53387:7:0;;;;;;;;;;;;;;;;53563:15;;;:33;;10586:18:1;;53563:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53556:60;;;;;;;;;;;;;;;;53265:359;;;;;;;;;;;:::o;54135:141::-;54227:15;;:41;;;;;;;;54200:7;;-1:-1:-1;;;;;54227:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54220:48;;54135:141;:::o;52764:136::-;52857:15;;:38;;;;;-1:-1:-1;;;;;1912:55:1;;;52857:38:0;;;1894:74:1;52836:7:0;;52857:15;;:29;;1867:18:1;;52857:38:0;1721:253:1;53629:259:0;53755:15;;:28;;;;;;;;160:25:1;;;53689:18:0;;;;;;-1:-1:-1;;;;;53755:15:0;;:23;;133:18:1;;53755:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53793:87;;;11969:25:1;;;12025:2;12010:18;;12003:34;;;12053:18;;;12046:34;;;12111:2;12096:18;;12089:34;;;53688:95:0;;-1:-1:-1;53688:95:0;;-1:-1:-1;53688:95:0;-1:-1:-1;53870:9:0;;53858:5;;53793:87;;11956:3:1;11941:19;53793:87:0;;;;;;;;53683:205;;;53629:259;:::o;4607:127::-;-1:-1:-1;;;;;4708:18:0;4681:7;4708:18;;;;;;;;;;;;4607:127::o;62684:281::-;62766:24;;62744:7;;62766:24;;62763:195;;;62842:25;;62813:26;;:54;;;;:::i;62763:195::-;-1:-1:-1;62916:1:0;;62684:281::o;16351:148::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;16442:6:::1;::::0;16421:40:::1;::::0;16458:1:::1;::::0;-1:-1:-1;;;;;16442:6:0::1;::::0;16421:40:::1;::::0;16458:1;;16421:40:::1;16472:6;:19:::0;;-1:-1:-1;;16472:19:0::1;::::0;;16351:148::o;54288:119::-;54369:15;;:30;;;;;;;;54342:7;;-1:-1:-1;;;;;54369:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;54463:159;15921:6;;54515:4;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;54531:14:0::1;:22:::0;;-1:-1:-1;;54531:22:0;;::::1;::::0;;;54564:20:::1;:28:::0;;;;::::1;::::0;;54531:22;54463:159;:::o;49930:202::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50020:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;50020:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50082:42;;1417:41:1;;;50082:42:0::1;::::0;1390:18:1;50082:42:0::1;;;;;;;;49930:202:::0;;:::o;62973:501::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;63061:29:::1;:27;:29::i;:::-;63042:15;:48;;:85;;;;;63126:1;63094:29;:27;:29::i;:::-;:33;63042:85;63034:120;;;::::0;-1:-1:-1;;;;;63034:120:0;;12336:2:1;63034:120:0::1;::::0;::::1;12318:21:1::0;12375:2;12355:18;;;12348:30;12414:24;12394:18;;;12387:52;12456:18;;63034:120:0::1;12134:346:1::0;63034:120:0::1;63194:1;63165:26;:30:::0;;;63206:24:::1;:32:::0;;-1:-1:-1;;63206:32:0::1;::::0;;63333:16:::1;::::0;63275:55:::1;::::0;;;;63324:4:::1;63275:55;::::0;::::1;1894:74:1::0;63352:3:0::1;::::0;63333:16;63290:13:::1;-1:-1:-1::0;;;;;63275:40:0::1;::::0;::::1;::::0;1867:18:1;;63275:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;:::i;:::-;:80;;;;:::i;:::-;63395:1;63376:16;:20:::0;63409:57:::1;::::0;;;;63440:10:::1;63409:57;::::0;::::1;12659:74:1::0;12749:18;;;12742:34;;;63251:104:0;;-1:-1:-1;63416:13:0::1;-1:-1:-1::0;;;;;63409:30:0::1;::::0;::::1;::::0;12632:18:1;;63409:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63023:451;62973:501::o:0;62479:191::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;62555:58:::1;::::0;62538:12:::1;::::0;62563:10:::1;::::0;62595:4:::1;62587:21;::::0;62538:12;62555:58;62538:12;62555:58;62587:21;62563:10;62555:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62537:76;;;62632:7;62624:38;;;::::0;-1:-1:-1;;;;;62624:38:0;;13199:2:1;62624:38:0::1;::::0;::::1;13181:21:1::0;13238:2;13218:18;;;13211:30;13277:20;13257:18;;;13250:48;13315:18;;62624:38:0::1;12997:342:1::0;49121:390:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;49242:16:::1;:33:::0;;;49286:13:::1;:27:::0;;;49324:15:::1;:31:::0;;;49342:13;49381:32:::1;49302:11:::0;49261:14;49381:32:::1;:::i;:::-;:50;;;;:::i;:::-;49366:12;:65:::0;;;49466:3:::1;-1:-1:-1::0;49450:19:0::1;49442:61;;;::::0;-1:-1:-1;;;;;49442:61:0;;13546:2:1;49442:61:0::1;::::0;::::1;13528:21:1::0;13585:2;13565:18;;;13558:30;13624:31;13604:18;;;13597:59;13673:18;;49442:61:0::1;13344:353:1::0;49442:61:0::1;49121:390:::0;;;:::o;51611:395::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;51711:6:::1;51699:8;:18;;:40;;;;;51733:6;51721:8;:18;;51699:40;51691:106;;;::::0;-1:-1:-1;;;;;51691:106:0;;13904:2:1;51691:106:0::1;::::0;::::1;13886:21:1::0;13943:2;13923:18;;;13916:30;13982:34;13962:18;;;13955:62;14053:23;14033:18;;;14026:51;14094:19;;51691:106:0::1;13702:417:1::0;51691:106:0::1;51828:16;;51816:8;:28:::0;51808:85:::1;;;::::0;-1:-1:-1;;;;;51808:85:0;;14326:2:1;51808:85:0::1;::::0;::::1;14308:21:1::0;14365:2;14345:18;;;14338:30;14404:34;14384:18;;;14377:62;14475:14;14455:18;;;14448:42;14507:19;;51808:85:0::1;14124:408:1::0;51808:85:0::1;51943:16;::::0;51909:51:::1;::::0;51933:8;;51909:51:::1;::::0;;;::::1;51971:16;:27:::0;51611:395::o;48081:218::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;48145:13:::1;::::0;::::1;::::0;::::1;;;48144:14;48136:51;;;::::0;-1:-1:-1;;;;;48136:51:0;;14739:2:1;48136:51:0::1;::::0;::::1;14721:21:1::0;14778:2;14758:18;;;14751:30;14817:26;14797:18;;;14790:54;14861:18;;48136:51:0::1;14537:348:1::0;48136:51:0::1;48198:13;:20:::0;;-1:-1:-1;;48229:18:0;;;;;48279:12:::1;48258:18;:33:::0;48081:218::o;48544:101::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;48616:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;48616:21:0;;::::1;::::0;;;::::1;::::0;;48544:101::o;52908:352::-;53204:15;;:48;;;;;-1:-1:-1;;;;;8698:15:1;;;53204:48:0;;;8680:34:1;8750:15;;;8730:18;;;8723:43;53025:7:0;;;;;;;;;;;;;;;;53204:15;;;:26;;8592:18:1;;53204:48:0;8445:327:1;4278:104:0;4334:13;4367:7;4360:14;;;;;:::i;50646:254::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;50755:13:::1;-1:-1:-1::0;;;;;50747:21:0::1;:4;-1:-1:-1::0;;;;;50747:21:0::1;::::0;50739:99:::1;;;::::0;-1:-1:-1;;;;;50739:99:0;;15092:2:1;50739:99:0::1;::::0;::::1;15074:21:1::0;15131:2;15111:18;;;15104:30;15170:34;15150:18;;;15143:62;15241:34;15221:18;;;15214:62;15313:3;15292:19;;;15285:32;15334:19;;50739:99:0::1;14890:469:1::0;50739:99:0::1;50851:41;50880:4;50886:5;50851:28;:41::i;52146:108::-:0;52219:15;;:27;;;;;;;;52192:7;;-1:-1:-1;;;;;52219:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;5984:413;271:10;6077:4;6121:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6121:34:0;;;;;;;;;;6174:35;;;;6166:85;;;;-1:-1:-1;;;;;6166:85:0;;15566:2:1;6166:85:0;;;15548:21:1;15605:2;15585:18;;;15578:30;15644:34;15624:18;;;15617:62;15715:7;15695:18;;;15688:35;15740:19;;6166:85:0;15364:401:1;6166:85:0;6287:67;271:10;6310:7;6338:15;6319:16;:34;6287:8;:67::i;:::-;-1:-1:-1;6385:4:0;;5984:413;-1:-1:-1;;;5984:413:0:o;4742:175::-;4828:4;4845:42;271:10;4869:9;4880:6;4845:9;:42::i;50140:184::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50225:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50225:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50282:34;;1417:41:1;;;50282:34:0::1;::::0;1390:18:1;50282:34:0::1;1277:187:1::0;47897:126:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;47972:15:::1;::::0;:43:::1;::::0;;;;-1:-1:-1;;;;;1912:55:1;;;47972:43:0::1;::::0;::::1;1894:74:1::0;47972:15:0;;::::1;::::0;:34:::1;::::0;1867:18:1;;47972:43:0::1;1721:253:1::0;49523:399:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;49645:17:::1;:34:::0;;;49690:14:::1;:28:::0;;;49729:16:::1;:32:::0;;;49748:13;49788:34:::1;49707:11:::0;49665:14;49788:34:::1;:::i;:::-;:53;;;;:::i;:::-;49772:13;:69:::0;;;49877:3:::1;-1:-1:-1::0;49860:20:0::1;49852:62;;;::::0;-1:-1:-1;;;;;49852:62:0;;13546:2:1;49852:62:0::1;::::0;::::1;13528:21:1::0;13585:2;13565:18;;;13558:30;13624:31;13604:18;;;13597:59;13673:18;;49852:62:0::1;13344:353:1::0;48898:211:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;49018:4:::1;49013:3;48993:13;4579:12:::0;;;4491:108;48993:13:::1;:17;::::0;49009:1:::1;48993:17;:::i;:::-;:23;;;;:::i;:::-;48992:30;;;;:::i;:::-;48983:6;:39;48975:86;;;::::0;-1:-1:-1;;;;;48975:86:0;;15972:2:1;48975:86:0::1;::::0;::::1;15954:21:1::0;16011:2;15991:18;;;15984:30;16050:34;16030:18;;;16023:62;16121:4;16101:18;;;16094:32;16143:19;;48975:86:0::1;15770:398:1::0;48975:86:0::1;49084:17;:6:::0;49094::::1;49084:17;:::i;:::-;49072:9;:29:::0;-1:-1:-1;48898:211:0:o;50332:306::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;50451:9:::1;50447:115;50466:19:::0;;::::1;50447:115;;;50542:8;50507:19;:32;50527:8;;50536:1;50527:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50507:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50507:32:0;:43;;-1:-1:-1;;50507:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50487:3;::::1;::::0;::::1;:::i;:::-;;;;50447:115;;;;50579:51;50611:8;;50621;50579:51;;;;;;;;:::i;:::-;;;;;;;;50332:306:::0;;;:::o;54001:126::-;54080:15;;:39;;;;;;;;54056:7;;-1:-1:-1;;;;;54080:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;47435:134;15921:6;;47495:4;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;47511:20:0::1;:28:::0;;-1:-1:-1;;47511:28:0::1;::::0;;;47435:134;:::o;52014:124::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;52088:15:::1;::::0;:42:::1;::::0;;;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;52088:15:0;;::::1;::::0;:31:::1;::::0;133:18:1;;52088:42:0::1;14:177:1::0;16654:244:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16743:22:0;::::1;16735:73;;;::::0;-1:-1:-1;;;;;16735:73:0;;17526:2:1;16735:73:0::1;::::0;::::1;17508:21:1::0;17565:2;17545:18;;;17538:30;17604:34;17584:18;;;17577:62;17675:8;17655:18;;;17648:36;17701:19;;16735:73:0::1;17324:402:1::0;16735:73:0::1;16845:6;::::0;16824:38:::1;::::0;-1:-1:-1;;;;;16824:38:0;;::::1;::::0;16845:6:::1;::::0;16824:38:::1;::::0;16845:6:::1;::::0;16824:38:::1;16873:6;:17:::0;;-1:-1:-1;;16873:17:0::1;-1:-1:-1::0;;;;;16873:17:0;;;::::1;::::0;;;::::1;::::0;;16654:244::o;7324:380::-;-1:-1:-1;;;;;7460:19:0;;7452:68;;;;-1:-1:-1;;;;;7452:68:0;;17933:2:1;7452:68:0;;;17915:21:1;17972:2;17952:18;;;17945:30;18011:34;17991:18;;;17984:62;18082:6;18062:18;;;18055:34;18106:19;;7452:68:0;17731:400:1;7452:68:0;-1:-1:-1;;;;;7539:21:0;;7531:68;;;;-1:-1:-1;;;;;7531:68:0;;18338:2:1;7531:68:0;;;18320:21:1;18377:2;18357:18;;;18350:30;18416:34;18396:18;;;18389:62;18487:4;18467:18;;;18460:32;18509:19;;7531:68:0;18136:398:1;7531:68:0;-1:-1:-1;;;;;7612:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7664:32;;160:25:1;;;7664:32:0;;133:18:1;7664:32:0;;;;;;;7324:380;;;:::o;54634:5025::-;-1:-1:-1;;;;;54766:18:0;;54758:68;;;;-1:-1:-1;;;;;54758:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54845:16:0;;54837:64;;;;-1:-1:-1;;;;;54837:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54922:14:0;;;;;;:10;:14;;;;;;;;54921:15;:36;;;;-1:-1:-1;;;;;;54941:16:0;;;;;;:10;:16;;;;;;;;54940:17;54921:36;54913:98;;;;-1:-1:-1;;;;;54913:98:0;;19551:2:1;54913:98:0;;;19533:21:1;19590:2;19570:18;;;19563:30;19629:34;19609:18;;;19602:62;19700:19;19680:18;;;19673:47;19737:19;;54913:98:0;19349:413:1;54913:98:0;55036:6;55046:1;55036:11;55033:92;;55064:28;55080:4;55086:2;55090:1;55064:15;:28::i;55033:92::-;55149:13;;;;;;;55145:136;;-1:-1:-1;;;;;55186:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;55215:23:0;;;;;;:19;:23;;;;;;;;55186:52;55178:91;;;;-1:-1:-1;;;;;55178:91:0;;19969:2:1;55178:91:0;;;19951:21:1;20008:2;19988:18;;;19981:30;20047:28;20027:18;;;20020:56;20093:18;;55178:91:0;19767:350:1;55178:91:0;55304:14;;;;55301:1645;;;15774:6;;-1:-1:-1;;;;;55356:15:0;;;15774:6;;55356:15;;;;:49;;-1:-1:-1;15774:6:0;;-1:-1:-1;;;;;55392:13:0;;;15774:6;;55392:13;;55356:49;:86;;;;-1:-1:-1;;;;;;55426:16:0;;;;55356:86;:128;;;;-1:-1:-1;;;;;;55463:21:0;;55477:6;55463:21;;55356:128;:158;;;;-1:-1:-1;55506:8:0;;-1:-1:-1;;;55506:8:0;;;;55505:9;55356:158;55334:1601;;;55688:20;;;;55684:406;;;55750:15;-1:-1:-1;;;;;55736:30:0;:2;-1:-1:-1;;;;;55736:30:0;;;:62;;;;;55784:13;-1:-1:-1;;;;;55770:28:0;:2;-1:-1:-1;;;;;55770:28:0;;;55736:62;55732:339;;;55863:9;55834:39;;;;:28;:39;;;;;;55876:12;-1:-1:-1;55826:140:0;;;;-1:-1:-1;;;;;55826:140:0;;20324:2:1;55826:140:0;;;20306:21:1;20363:2;20343:18;;;20336:30;20402:34;20382:18;;;20375:62;20473:34;20453:18;;;20446:62;20545:11;20524:19;;;20517:40;20574:19;;55826:140:0;20122:477:1;55826:140:0;56022:9;55993:39;;;;:28;:39;;;;;56035:12;55993:54;;55732:339;-1:-1:-1;;;;;56158:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;56194:35:0;;;;;;:31;:35;;;;;;;;56193:36;56158:71;56154:766;;;56272:20;;56262:6;:30;;56254:96;;;;-1:-1:-1;;;;;56254:96:0;;20806:2:1;56254:96:0;;;20788:21:1;20845:2;20825:18;;;20818:30;20884:34;20864:18;;;20857:62;20955:23;20935:18;;;20928:51;20996:19;;56254:96:0;20604:417:1;56254:96:0;56407:9;;56390:13;56400:2;56390:9;:13::i;:::-;56381:22;;:6;:22;:::i;:::-;:35;;56373:75;;;;-1:-1:-1;;;;;56373:75:0;;21228:2:1;56373:75:0;;;21210:21:1;21267:2;21247:18;;;21240:30;21306:29;21286:18;;;21279:57;21353:18;;56373:75:0;21026:351:1;56373:75:0;56154:766;;;-1:-1:-1;;;;;56525:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;56559:37:0;;;;;;:31;:37;;;;;;;;56558:38;56525:71;56521:399;;;56639:20;;56629:6;:30;;56621:97;;;;-1:-1:-1;;;;;56621:97:0;;21584:2:1;56621:97:0;;;21566:21:1;21623:2;21603:18;;;21596:30;21662:34;21642:18;;;21635:62;21733:24;21713:18;;;21706:52;21775:19;;56621:97:0;21382:418:1;56521:399:0;-1:-1:-1;;;;;56765:35:0;;;;;;:31;:35;;;;;;;;56761:159;;56859:9;;56842:13;56852:2;56842:9;:13::i;:::-;56833:22;;:6;:22;:::i;:::-;:35;;56825:75;;;;-1:-1:-1;;;;;56825:75:0;;21228:2:1;56825:75:0;;;21210:21:1;21267:2;21247:18;;;21240:30;21306:29;21286:18;;;21279:57;21353:18;;56825:75:0;21026:351:1;56825:75:0;56952:28;56983:24;57001:4;56983:9;:24::i;:::-;57067:18;;56952:55;;-1:-1:-1;57043:42:0;;;;;;;57116:35;;-1:-1:-1;57140:11:0;;;;;;;57116:35;:61;;;;-1:-1:-1;57169:8:0;;-1:-1:-1;;;57169:8:0;;;;57168:9;57116:61;:110;;;;-1:-1:-1;;;;;;57195:31:0;;;;;;:25;:31;;;;;;;;57194:32;57116:110;:153;;;;-1:-1:-1;;;;;;57244:25:0;;;;;;:19;:25;;;;;;;;57243:26;57116:153;:194;;;;-1:-1:-1;;;;;;57287:23:0;;;;;;:19;:23;;;;;;;;57286:24;57116:194;57098:322;;;57337:8;:15;;-1:-1:-1;;57337:15:0;-1:-1:-1;;;57337:15:0;;;57367:10;:8;:10::i;:::-;57392:8;:16;;-1:-1:-1;;57392:16:0;;;57098:322;57448:8;;-1:-1:-1;;;;;57557:25:0;;57432:12;57557:25;;;:19;:25;;;;;;57448:8;-1:-1:-1;;;57448:8:0;;;;;57447:9;;57557:25;;:52;;-1:-1:-1;;;;;;57586:23:0;;;;;;:19;:23;;;;;;;;57557:52;57554:99;;;-1:-1:-1;57636:5:0;57554:99;57673:12;57764:7;57761:1365;;;57816:12;57790:18;;57811:1;57790:22;;;;:::i;:::-;:38;;:108;;;;-1:-1:-1;;;;;;57833:29:0;;;;;;:25;:29;;;;;;;;;:64;;-1:-1:-1;;;;;;57866:31:0;;;;;;:25;:31;;;;;;;;57833:64;57787:1182;;;57925:23;57944:3;57925:14;:6;57936:2;57925:10;:14::i;:::-;:18;;:23::i;:::-;57918:30;-1:-1:-1;58001:2:0;57989:9;57918:30;57996:2;57989:9;:::i;:::-;:14;;;;:::i;:::-;57967:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;58054:2:0;;-1:-1:-1;58042:9:0;:4;58049:2;58042:9;:::i;:::-;:14;;;;:::i;:::-;58022:16;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;58110:2:0;;-1:-1:-1;58098:9:0;:4;58105:2;58098:9;:::i;:::-;:14;;;;:::i;:::-;58075:19;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;57787:1182:0;;-1:-1:-1;57787:1182:0;;-1:-1:-1;;;;;58177:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;58226:1;58210:13;;:17;58177:50;58173:796;;;58254:41;42773:4;58254:25;58265:13;;58254:6;:10;;:25;;;;:::i;:41::-;58247:48;;58358:13;;58341:14;;58334:4;:21;;;;:::i;:::-;:37;;;;:::i;:::-;58314:16;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;58438:13:0;;58419:16;;58412:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;58390:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;58520:13:0;;58500:17;;58493:24;;:4;:24;:::i;58173:796::-;-1:-1:-1;;;;;58608:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;58658:1;58643:12;;:16;58608:51;58605:364;;;58684:40;42773:4;58684:24;58695:12;;58684:6;:10;;:24;;;;:::i;:40::-;58677:47;;58783:12;;58767:13;;58760:4;:20;;;;:::i;:::-;:35;;;;:::i;:::-;58740:16;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;58861:12:0;;58843:15;;58836:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;58814:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;58941:12:0;;58922:16;;58915:23;;:4;:23;:::i;:::-;:38;;;;:::i;:::-;58892:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;58605:364:0;58988:8;;58985:93;;59020:42;59036:4;59050;59057;59020:15;:42::i;:::-;59100:14;59110:4;59100:14;;:::i;:::-;;;57761:1365;59138:33;59154:4;59160:2;59164:6;59138:15;:33::i;:::-;59184:15;;-1:-1:-1;;;;;59184:15:0;:26;59219:4;59226:15;59219:4;59226:9;:15::i;:::-;59184:58;;-1:-1:-1;;;59184:58:0;;;;;;-1:-1:-1;;;;;12677:55:1;;;59184:58:0;;;12659:74:1;12749:18;;;12742:34;12632:18;;59184:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59253:15:0;;-1:-1:-1;;;;;59253:15:0;;-1:-1:-1;59253:26:0;;-1:-1:-1;59288:2:0;59293:13;59288:2;59293:9;:13::i;:::-;59253:54;;-1:-1:-1;;;59253:54:0;;;;;;-1:-1:-1;;;;;12677:55:1;;;59253:54:0;;;12659:74:1;12749:18;;;12742:34;12632:18;;59253:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59324:8:0;;-1:-1:-1;;;59324:8:0;;;;59323:9;;-1:-1:-1;;59323:33:0;;;;;59355:1;59336:16;;:20;59323:33;59320:332;;;59381:16;;59412:15;;:28;;;;;;;;160:25:1;;;-1:-1:-1;;;;;59412:15:0;;;;:23;;133:18:1;;59412:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;59412:28:0;;;;;;;;-1:-1:-1;;59412:28:0;;;;;;;;;;;;:::i;:::-;;;59408:233;;;59529:86;;;11969:25:1;;;12025:2;12010:18;;12003:34;;;12053:18;;;12046:34;;;12111:2;12096:18;;12089:34;;;59605:9:0;;59594:4;;59529:86;;11956:3:1;11941:19;59529:86:0;;;;;;;59441:184;;;59408:233;59358:294;59320:332;54747:4912;;;;54634:5025;;;:::o;50908:338::-;-1:-1:-1;;;;;50991:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;50991:39:0;;;;;;;51043:38;50991:31;:39;51043:25;:38::i;:::-;51105:5;51102:79;;;51127:15;;:42;;;;;-1:-1:-1;;;;;1912:55:1;;;51127:42:0;;;1894:74:1;51127:15:0;;;;:36;;1867:18:1;;51127:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51102:79;51198:40;;;;;;-1:-1:-1;;;;;51198:40:0;;;;;;;;50908:338;;:::o;6405:614::-;-1:-1:-1;;;;;6545:20:0;;6537:70;;;;-1:-1:-1;;;;;6537:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6626:23:0;;6618:71;;;;-1:-1:-1;;;;;6618:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6726:17:0;;6702:21;6726:17;;;;;;;;;;;6762:23;;;;6754:74;;;;-1:-1:-1;;;;;6754:74:0;;22455:2:1;6754:74:0;;;22437:21:1;22494:2;22474:18;;;22467:30;22533:34;22513:18;;;22506:62;22604:8;22584:18;;;22577:36;22630:19;;6754:74:0;22253:402:1;6754:74:0;-1:-1:-1;;;;;6864:17:0;;;:9;:17;;;;;;;;;;;6884:22;;;6864:42;;6928:20;;;;;;;;:30;;6900:6;;6864:9;6928:30;;6900:6;;6928:30;:::i;:::-;;;;;;;;6993:9;-1:-1:-1;;;;;6976:35:0;6985:6;-1:-1:-1;;;;;6976:35:0;;7004:6;6976:35;;;;160:25:1;;148:2;133:18;;14:177;60819:1652:0;60858:23;60884:24;60902:4;60884:9;:24::i;:::-;60858:50;;60919:25;60990:16;;60968:19;;60947:18;;:40;;;;:::i;:::-;:59;;;;:::i;:::-;60919:87;-1:-1:-1;61030:20:0;;;:46;;-1:-1:-1;61054:22:0;;61030:46;61027:60;;;61079:7;;60819:1652::o;61027:60::-;61156:23;61241:1;61221:17;61200:18;;61182:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;61156:86;-1:-1:-1;61253:26:0;61282:36;:15;61156:86;61282:19;:36::i;:::-;61253:65;-1:-1:-1;61375:4:0;61367:21;61401:36;61253:65;61401:16;:36::i;:::-;61459:18;61480:44;61488:4;61480:21;61506:17;61480:25;:44::i;:::-;61459:65;;61545:24;61572:83;61652:1;61633:18;;:20;;;;:::i;:::-;61612:42;;:17;:42;:::i;:::-;61587:19;;61572:35;;:10;;:14;:35::i;:83::-;61545:110;;61666:21;61690:80;61767:1;61748:18;;:20;;;;:::i;:::-;61727:42;;:17;:42;:::i;:::-;61705:16;;61690:32;;:10;;:14;:32::i;:80::-;61666:104;-1:-1:-1;61791:23:0;61666:104;61817:29;61830:16;61817:10;:29;:::i;:::-;:45;;;;:::i;:::-;61904:1;61883:18;:22;;;61916:19;:23;;;61950:16;:20;61791:71;-1:-1:-1;62014:19:0;;;;;:42;;;62055:1;62037:15;:19;62014:42;62011:210;;;62072:46;62085:15;62102;62072:12;:46::i;:::-;62190:18;;62138:71;;;22862:25:1;;;22918:2;22903:18;;22896:34;;;22946:18;;;22939:34;;;;62138:71:0;;;;;;22850:2:1;62138:71:0;;;62011:210;62326:15;;62318:55;;62301:12;;-1:-1:-1;;;;;62326:15:0;;62355:13;;62301:12;62318:55;62301:12;62318:55;62355:13;62326:15;62318:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62407:16:0;;62399:64;;62300:73;;-1:-1:-1;;;;;;62407:16:0;;62445:4;62437:21;;62399:64;;;;62437:21;62407:16;62399:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;60819:1652:0:o;12107:471::-;12165:7;12410:1;12415;12410:6;12406:47;;-1:-1:-1;12440:1:0;12433:8;;12406:47;12465:9;12477:5;12481:1;12477;:5;:::i;:::-;12465:17;-1:-1:-1;12510:1:0;12501:5;12505:1;12465:17;12501:5;:::i;:::-;:10;12493:56;;;;-1:-1:-1;;;;;12493:56:0;;23186:2:1;12493:56:0;;;23168:21:1;23225:2;23205:18;;;23198:30;23264:34;23244:18;;;23237:62;23335:3;23315:18;;;23308:31;23356:19;;12493:56:0;22984:397:1;13054:132:0;13112:7;13139:39;13143:1;13146;13139:39;;;;;;;;;;;;;;;;;:3;:39::i;11217:136::-;11275:7;11302:43;11306:1;11309;11302:43;;;;;;;;;;;;;;;;;:3;:43::i;59671:601::-;59823:16;;;59837:1;59823:16;;;;;;;;59799:21;;59823:16;;;;;;;;;;-1:-1:-1;59823:16:0;59799:40;;59868:4;59850;59855:1;59850:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;59850:23:0;;;-1:-1:-1;;;;;59850:23:0;;;;;59894:15;-1:-1:-1;;;;;59894:20:0;;:22;;;;;-1:-1:-1;;;59894:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59884:4;59889:1;59884:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;59884:32:0;;;-1:-1:-1;;;;;59884:32:0;;;;;59929:62;59946:4;59961:15;59979:11;59929:8;:62::i;:::-;60030:224;;;;;-1:-1:-1;;;;;60030:15:0;:66;;;;:224;;60111:11;;60137:1;;60181:4;;60208;;60228:15;;60030:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59726:546;59671:601;:::o;60284:523::-;60432:62;60449:4;60464:15;60482:11;60432:8;:62::i;:::-;60537:260;;;;;60609:4;60537:260;;;25226:34:1;25276:18;;;25269:34;;;60655:1:0;25319:18:1;;;25312:34;;;25362:18;;;25355:34;60749:6:0;25405:19:1;;;25398:44;60771:15:0;25458:19:1;;;25451:35;60537:15:0;-1:-1:-1;;;;;60537:31:0;;;;60576:9;;25137:19:1;;60537:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13682:278::-;13768:7;13803:12;13796:5;13788:28;;;;-1:-1:-1;;;;;13788:28:0;;;;;;;;:::i;:::-;-1:-1:-1;13827:9:0;13839:5;13843:1;13839;:5;:::i;:::-;13827:17;13682:278;-1:-1:-1;;;;;13682:278:0:o;11656:192::-;11742:7;11778:12;11770:6;;;;11762:29;;;;-1:-1:-1;;;;;11762:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11802:9:0;11814:5;11818:1;11814;:5;:::i;196:597:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;634:6;631:1;628:13;625:91;;;704:1;699:2;690:6;679:9;675:22;671:31;664:42;625:91;-1:-1:-1;777:2:1;756:15;-1:-1:-1;;752:29:1;737:45;;;;784:2;733:54;;196:597;-1:-1:-1;;;196:597:1:o;798:154::-;-1:-1:-1;;;;;877:5:1;873:54;866:5;863:65;853:93;;942:1;939;932:12;957:315;1025:6;1033;1086:2;1074:9;1065:7;1061:23;1057:32;1054:52;;;1102:1;1099;1092:12;1054:52;1141:9;1128:23;1160:31;1185:5;1160:31;:::i;:::-;1210:5;1262:2;1247:18;;;;1234:32;;-1:-1:-1;;;957:315:1:o;1469:247::-;1528:6;1581:2;1569:9;1560:7;1556:23;1552:32;1549:52;;;1597:1;1594;1587:12;1549:52;1636:9;1623:23;1655:31;1680:5;1655:31;:::i;1979:180::-;2038:6;2091:2;2079:9;2070:7;2066:23;2062:32;2059:52;;;2107:1;2104;2097:12;2059:52;-1:-1:-1;2130:23:1;;1979:180;-1:-1:-1;1979:180:1:o;2164:388::-;2232:6;2240;2293:2;2281:9;2272:7;2268:23;2264:32;2261:52;;;2309:1;2306;2299:12;2261:52;2348:9;2335:23;2367:31;2392:5;2367:31;:::i;:::-;2417:5;-1:-1:-1;2474:2:1;2459:18;;2446:32;2487:33;2446:32;2487:33;:::i;:::-;2539:7;2529:17;;;2164:388;;;;;:::o;2557:456::-;2634:6;2642;2650;2703:2;2691:9;2682:7;2678:23;2674:32;2671:52;;;2719:1;2716;2709:12;2671:52;2758:9;2745:23;2777:31;2802:5;2777:31;:::i;:::-;2827:5;-1:-1:-1;2884:2:1;2869:18;;2856:32;2897:33;2856:32;2897:33;:::i;:::-;2557:456;;2949:7;;-1:-1:-1;;;3003:2:1;2988:18;;;;2975:32;;2557:456::o;3281:118::-;3367:5;3360:13;3353:21;3346:5;3343:32;3333:60;;3389:1;3386;3379:12;3404:382;3469:6;3477;3530:2;3518:9;3509:7;3505:23;3501:32;3498:52;;;3546:1;3543;3536:12;3498:52;3585:9;3572:23;3604:31;3629:5;3604:31;:::i;:::-;3654:5;-1:-1:-1;3711:2:1;3696:18;;3683:32;3724:30;3683:32;3724:30;:::i;4211:315::-;4279:6;4287;4340:2;4328:9;4319:7;4315:23;4311:32;4308:52;;;4356:1;4353;4346:12;4308:52;4392:9;4379:23;4369:33;;4452:2;4441:9;4437:18;4424:32;4465:31;4490:5;4465:31;:::i;5260:316::-;5337:6;5345;5353;5406:2;5394:9;5385:7;5381:23;5377:32;5374:52;;;5422:1;5419;5412:12;5374:52;-1:-1:-1;;5445:23:1;;;5515:2;5500:18;;5487:32;;-1:-1:-1;5566:2:1;5551:18;;;5538:32;;5260:316;-1:-1:-1;5260:316:1:o;5581:241::-;5637:6;5690:2;5678:9;5669:7;5665:23;5661:32;5658:52;;;5706:1;5703;5696:12;5658:52;5745:9;5732:23;5764:28;5786:5;5764:28;:::i;5827:753::-;5919:6;5927;5935;5988:2;5976:9;5967:7;5963:23;5959:32;5956:52;;;6004:1;6001;5994:12;5956:52;6044:9;6031:23;6073:18;6114:2;6106:6;6103:14;6100:34;;;6130:1;6127;6120:12;6100:34;6168:6;6157:9;6153:22;6143:32;;6213:7;6206:4;6202:2;6198:13;6194:27;6184:55;;6235:1;6232;6225:12;6184:55;6275:2;6262:16;6301:2;6293:6;6290:14;6287:34;;;6317:1;6314;6307:12;6287:34;6375:7;6368:4;6360;6352:6;6348:17;6344:2;6340:26;6336:37;6333:50;6330:70;;;6396:1;6393;6386:12;6330:70;6427:4;6419:13;;;;-1:-1:-1;6451:6:1;-1:-1:-1;;6492:20:1;;6479:34;6522:28;6479:34;6522:28;:::i;:::-;6569:5;6559:15;;;5827:753;;;;;:::o;6585:437::-;6670:1;6660:12;;6717:1;6707:12;;;6728:61;;6782:4;6774:6;6770:17;6760:27;;6728:61;6835:2;6827:6;6824:14;6804:18;6801:38;6798:218;;-1:-1:-1;;;;;6869:1:1;6862:88;6973:4;6970:1;6963:15;7001:4;6998:1;6991:15;6798:218;;6585:437;;;:::o;7027:356::-;7229:2;7211:21;;;7248:18;;;7241:30;7307:34;7302:2;7287:18;;7280:62;7374:2;7359:18;;7027:356::o;7388:184::-;-1:-1:-1;;;;;7437:1:1;7430:88;7537:4;7534:1;7527:15;7561:4;7558:1;7551:15;7577:168;7617:7;7683:1;7679;7675:6;7671:14;7668:1;7665:21;7660:1;7653:9;7646:17;7642:45;7639:71;;;7690:18;;:::i;:::-;-1:-1:-1;7730:9:1;;7577:168::o;7750:274::-;7790:1;7816;7806:189;;-1:-1:-1;;;;;7848:1:1;7841:88;7952:4;7949:1;7942:15;7980:4;7977:1;7970:15;7806:189;-1:-1:-1;8009:9:1;;7750:274::o;8777:184::-;8847:6;8900:2;8888:9;8879:7;8875:23;8871:32;8868:52;;;8916:1;8913;8906:12;8868:52;-1:-1:-1;8939:16:1;;8777:184;-1:-1:-1;8777:184:1:o;9728:128::-;9768:3;9799:1;9795:6;9792:1;9789:13;9786:39;;;9805:18;;:::i;:::-;-1:-1:-1;9841:9:1;;9728:128::o;10189:245::-;10256:6;10309:2;10297:9;10288:7;10284:23;10280:32;10277:52;;;10325:1;10322;10315:12;10277:52;10357:9;10351:16;10376:28;10398:5;10376:28;:::i;10741:681::-;10872:6;10880;10888;10896;10904;10912;10920;10928;10981:3;10969:9;10960:7;10956:23;10952:33;10949:53;;;10998:1;10995;10988:12;10949:53;11030:9;11024:16;11049:31;11074:5;11049:31;:::i;:::-;11099:5;11089:15;;;11144:2;11133:9;11129:18;11123:25;11113:35;;11188:2;11177:9;11173:18;11167:25;11157:35;;11232:2;11221:9;11217:18;11211:25;11201:35;;11276:3;11265:9;11261:19;11255:26;11245:36;;11321:3;11310:9;11306:19;11300:26;11290:36;;11366:3;11355:9;11351:19;11345:26;11335:36;;11411:3;11400:9;11396:19;11390:26;11380:36;;10741:681;;;;;;;;;;;:::o;11427:306::-;11515:6;11523;11531;11584:2;11572:9;11563:7;11559:23;11555:32;11552:52;;;11600:1;11597;11590:12;11552:52;11629:9;11623:16;11613:26;;11679:2;11668:9;11664:18;11658:25;11648:35;;11723:2;11712:9;11708:18;11702:25;11692:35;;11427:306;;;;;:::o;16173:184::-;-1:-1:-1;;;;;16222:1:1;16215:88;16322:4;16319:1;16312:15;16346:4;16343:1;16336:15;16362:135;16401:3;16422:17;;;16419:43;;16442:18;;:::i;:::-;-1:-1:-1;16489:1:1;16478:13;;16362:135::o;16502:817::-;16724:2;16736:21;;;16709:18;;16792:22;;;16676:4;16871:6;16845:2;16830:18;;16676:4;16905:327;16919:6;16916:1;16913:13;16905:327;;;16994:6;16981:20;17014:31;17039:5;17014:31;:::i;:::-;-1:-1:-1;;;;;17070:54:1;17058:67;;17148:4;17207:15;;;;17172:12;;;;16941:1;16934:9;16905:327;;;16909:3;17249;17241:11;;;;17304:6;17297:14;17290:22;17283:4;17272:9;17268:20;17261:52;16502:817;;;;;;:::o;18539:401::-;18741:2;18723:21;;;18780:2;18760:18;;;18753:30;18819:34;18814:2;18799:18;;18792:62;18890:7;18885:2;18870:18;;18863:35;18930:3;18915:19;;18539:401::o;18945:399::-;19147:2;19129:21;;;19186:2;19166:18;;;19159:30;19225:34;19220:2;19205:18;;19198:62;19296:5;19291:2;19276:18;;19269:33;19334:3;19319:19;;18945:399::o;21805:125::-;21845:4;21873:1;21870;21867:8;21864:34;;;21878:18;;:::i;:::-;-1:-1:-1;21915:9:1;;21805:125::o;23575:251::-;23645:6;23698:2;23686:9;23677:7;23673:23;23669:32;23666:52;;;23714:1;23711;23704:12;23666:52;23746:9;23740:16;23765:31;23790:5;23765:31;:::i;23831:1026::-;24093:4;24141:3;24130:9;24126:19;24172:6;24161:9;24154:25;24198:2;24236:6;24231:2;24220:9;24216:18;24209:34;24279:3;24274:2;24263:9;24259:18;24252:31;24303:6;24338;24332:13;24369:6;24361;24354:22;24407:3;24396:9;24392:19;24385:26;;24446:2;24438:6;24434:15;24420:29;;24467:1;24477:218;24491:6;24488:1;24485:13;24477:218;;;24556:13;;-1:-1:-1;;;;;24552:62:1;24540:75;;24670:15;;;;24635:12;;;;24513:1;24506:9;24477:218;;;-1:-1:-1;;;;;;;24751:55:1;;;;24746:2;24731:18;;24724:83;-1:-1:-1;;;24838:3:1;24823:19;24816:35;24712:3;23831:1026;-1:-1:-1;;;23831:1026:1:o
Swarm Source
ipfs://8871d7b8a628308d4c21e59b32d2760723c81b07f52e669b73a11490b012dfc4
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.